diff --git a/docs/usage.rst b/docs/usage.rst index e64a478..5a85433 100644 --- a/docs/usage.rst +++ b/docs/usage.rst @@ -570,6 +570,8 @@ pypi use_pre_release Whether to accept pre release. Default is false. +This source supports :ref:`list options`. + .. note:: An additional dependency "packaging" is required. You can use ``pip install 'nvchecker[pypi]'``. diff --git a/nvchecker_source/pypi.py b/nvchecker_source/pypi.py index 993ec99..e565475 100644 --- a/nvchecker_source/pypi.py +++ b/nvchecker_source/pypi.py @@ -6,6 +6,8 @@ from packaging.version import Version from nvchecker.api import RichResult async def get_version(name, conf, *, cache, **kwargs): + ret = [] + package = conf.get('pypi') or name use_pre_release = conf.get('use_pre_release', False) @@ -13,14 +15,15 @@ async def get_version(name, conf, *, cache, **kwargs): data = await cache.get_json(url) - if use_pre_release: - version = sorted( - data['releases'].keys(), - key = Version, - )[-1] - else: - version = data['info']['version'] - return RichResult( - version = version, - url = f'https://pypi.org/project/{package}/{version}/', - ) + for version in data['releases'].keys(): + parsed_version = Version(version) + + if not use_pre_release and parsed_version.is_prerelease: + continue + + ret.append(RichResult( + version = version, + url = f'https://pypi.org/project/{package}/{version}/', + )) + + return ret diff --git a/tests/test_pypi.py b/tests/test_pypi.py index 7faa447..18f8b0b 100644 --- a/tests/test_pypi.py +++ b/tests/test_pypi.py @@ -20,3 +20,9 @@ async def test_pypi_pre_release(get_version): "source": "pypi", "use_pre_release": 1, }) == "1.0.1a1" + +async def test_pypi_list(get_version): + assert await get_version("urllib3", { + "source": "pypi", + "include_regex": "^1\\..*", + }) == "1.26.18" diff --git a/tests/test_ubuntupkg.py b/tests/test_ubuntupkg.py index 4f393db..9a0de7b 100644 --- a/tests/test_ubuntupkg.py +++ b/tests/test_ubuntupkg.py @@ -1,5 +1,5 @@ # MIT licensed -# Copyright (c) 2020 lilydjwg , et al. +# Copyright (c) 2020,2024 lilydjwg , et al. # Copyright (c) 2017 Felix Yan , et al. import pytest @@ -7,9 +7,10 @@ pytestmark = [pytest.mark.asyncio(scope="session"), pytest.mark.needs_net] @pytest.mark.flaky async def test_ubuntupkg(get_version): - assert await get_version("sigrok-firmware-fx2lafw", { + v = await get_version("sigrok-firmware-fx2lafw", { "source": "ubuntupkg", - }) == "0.1.7-1" + }) + assert v.startswith("0.1.7-") @pytest.mark.flaky async def test_ubuntupkg_strip_release(get_version):