Skip to content

Commit

Permalink
jsonchecker: Get and parse temestamp if provided
Browse files Browse the repository at this point in the history
  • Loading branch information
gasinvein committed Mar 12, 2021
1 parent bdc733b commit d909e0f
Show file tree
Hide file tree
Showing 4 changed files with 43 additions and 3 deletions.
5 changes: 4 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -206,10 +206,13 @@ for git type sources, specify tag query and, optionaly, commit and version queri
"type": "json",
"url": "https://api.github.com/repos/stedolan/jq/releases/latest",
"tag-query": ".tag_name",
"version-query": "$tag | sub(\"^jq-\"; \"\")"
"version-query": "$tag | sub(\"^jq-\"; \"\")",
"timestamp-query": ".published_at"
}
```

`timestamp-query` is optional, but if provided - must return a string with timestamp in ISO format.

See the [jq manual](https://stedolan.github.io/jq/manual/) for complete information about writing queries.

### Debian repo checker
Expand Down
15 changes: 14 additions & 1 deletion src/checkers/jsonchecker.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
import logging
import os
import subprocess
import re
from datetime import datetime
import typing as t

import requests

Expand Down Expand Up @@ -45,6 +48,14 @@ def query_sequence(json_data, queries):
return results


def parse_timestamp(date_string: str) -> t.Optional[datetime]:
try:
return datetime.fromisoformat(re.sub(r"Z$", "+00:00", date_string))
except ValueError as err:
log.error("Failed to parse timestamp %s: %s", date_string, err)
return None


class JSONChecker(HTMLChecker):
CHECKER_DATA_TYPE = "json"
SUPPORTED_DATA_CLASSES = [ExternalData, ExternalGitRepo]
Expand Down Expand Up @@ -88,15 +99,17 @@ def _check_git(self, json_data: str, external_data: ExternalGitRepo):
("tag", checker_data["tag-query"]),
("commit", checker_data.get("commit-query")),
("version", checker_data.get("version-query")),
("timestamp", checker_data.get("timestamp-query")),
],
)
timestamp_str = results.get("timestamp")
new_version = ExternalGitRef(
external_data.current_version.url,
results.get("commit"),
results["tag"],
None,
results.get("version"),
None,
parse_timestamp(timestamp_str) if timestamp_str else None,
)

if new_version.commit is None:
Expand Down
15 changes: 15 additions & 0 deletions tests/io.github.stedolan.jq.yml
Original file line number Diff line number Diff line change
Expand Up @@ -24,3 +24,18 @@ modules:
url: https://api.github.com/repos/kkos/oniguruma/releases/latest
tag-query: '.tag_name'
version-query: '$tag | sub("^[vV]"; "")'
timestamp-query: '.published_at'

- name: tdesktop
sources:
- type: git
url: https://github.com/telegramdesktop/tdesktop.git
tag: v2.6.0
commit: 740ffb3c6426d62ac1a54e68d5a13f91479baf9a
x-checker-data:
type: json
url: https://api.github.com/repos/telegramdesktop/tdesktop/releases/latest
tag-query: '.tag_name'
version-query: '.tag_name | sub("^[vV]"; "")'
# This one should result in parse error
timestamp-query: '.target_commitish'
11 changes: 10 additions & 1 deletion tests/test_jsonchecker.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ def test_check(self):
checker = ManifestChecker(TEST_MANIFEST)
ext_data = checker.check()

self.assertEqual(len(ext_data), 2)
self.assertEqual(len(ext_data), 3)
for data in ext_data:
self.assertIsNotNone(data)
self.assertIsNotNone(data.new_version)
Expand Down Expand Up @@ -48,5 +48,14 @@ def test_check(self):
data.new_version.commit, "e03900b038a274ee2f1341039e9003875c11e47d"
)
self.assertIsNotNone(data.new_version.version)
self.assertIsNotNone(data.new_version.timestamp)
elif data.filename == "tdesktop.git":
self.assertIsInstance(data.new_version, ExternalGitRef)
self.assertEqual(data.current_version.url, data.new_version.url)
self.assertIsNotNone(data.new_version.tag)
self.assertIsNotNone(data.new_version.commit)
self.assertNotEqual(data.new_version.tag, data.current_version.tag)
self.assertIsNotNone(data.new_version.version)
self.assertIsNone(data.new_version.timestamp)
else:
self.fail(f"Unhandled data {data.filename}")

0 comments on commit d909e0f

Please sign in to comment.