From 024849c24237e7de17957c842e850a9ed43593ee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20Ru=C5=BEi=C4=8Dka?= Date: Thu, 29 Oct 2020 15:14:29 +0100 Subject: [PATCH] repology: add support for subrepo Without this, querying latest Fedora packages is impossible because they reside in 'updates' subrepo but old 'release' versions are returned. Same thing for openSUSE. Example config to query Fedora 32 latest packages in updates subrepo: [somepackage] source = "repology" repo = "fedora_32" subrepo = "updates" --- docs/usage.rst | 5 +++++ nvchecker_source/repology.py | 12 ++++++++++-- tests/test_repology.py | 17 +++++++++++++++++ 3 files changed, 32 insertions(+), 2 deletions(-) diff --git a/docs/usage.rst b/docs/usage.rst index 6dcf18f..8ea8dc1 100644 --- a/docs/usage.rst +++ b/docs/usage.rst @@ -568,6 +568,11 @@ repology repo Check the version in this repo. This field is required. +subrepo + Check the version in this subrepo. This field is optional. + When ommited all subrepos are queried and first entry + (not the highest version) is returned. + Check Anitya ~~~~~~~~~~~~ :: diff --git a/nvchecker_source/repology.py b/nvchecker_source/repology.py index 3fe3dd1..a8a6e8f 100644 --- a/nvchecker_source/repology.py +++ b/nvchecker_source/repology.py @@ -8,14 +8,22 @@ API_URL = 'https://repology.org/api/v1/project/{}' async def get_version(name, conf, *, cache, **kwargs): project = conf.get('repology') or name repo = conf.get('repo') + subrepo = conf.get('subrepo') if not repo: raise GetVersionError('repo field is required for repology source') url = API_URL.format(project) data = await cache.get_json(url) - versions = [pkg['version'] for pkg in data if pkg['repo'] == repo] - if not versions: + pkgs = [pkg for pkg in data if pkg['repo'] == repo] + if not pkgs: raise GetVersionError('package is not found', repo=repo) + if subrepo: + pkgs = [pkg for pkg in pkgs if pkg.get('subrepo') == subrepo] + if not pkgs: + raise GetVersionError('package is not found in subrepo', + repo=repo, subrepo=subrepo) + + versions = [pkg['version'] for pkg in pkgs] return versions[0] diff --git a/tests/test_repology.py b/tests/test_repology.py index 7491ab1..44822f2 100644 --- a/tests/test_repology.py +++ b/tests/test_repology.py @@ -11,6 +11,23 @@ async def test_repology(get_version): "repo": "aur", }) == "3.62" +async def test_repology_subrepo(get_version): + assert await get_version("asciiquarium", { + "source": "repology", + "repo": "fedora_32", + "subrepo": "release" + }) == "1.1" + +async def test_repology_bad_subrepo(get_version): + try: + assert await get_version("asciiquarium", { + "source": "repology", + "repo": "fedora_32", + "subrepo": "badsubrepo" + }) is None + except RuntimeError as e: + assert "package is not found in subrepo" in str(e) + async def test_repology_no_repo(get_version): try: assert await get_version("ssed", {