From b34a43cec74cdcd0df61e24bc481250a28ae2d07 Mon Sep 17 00:00:00 2001 From: Felix Yan Date: Thu, 6 May 2021 08:44:54 +0800 Subject: [PATCH] Use packaging.version instead of pkg_resources.parse_version by default packaging.version is the new standard and should be preferred now. It reduces startup time significantly too as pkg_resources is expensive to import. parse_version is only kept for compatibility here, perhaps consider removing it in the future. --- docs/usage.rst | 12 ++++++------ nvchecker/core.py | 4 ++-- nvchecker/sortversion.py | 25 +++++++++++++------------ nvchecker/tools.py | 6 +++--- nvchecker_source/bitbucket.py | 2 -- tests/test_sortversion.py | 14 +++++++++++--- 6 files changed, 35 insertions(+), 28 deletions(-) diff --git a/docs/usage.rst b/docs/usage.rst index f0af5dc4..9a5a1e99 100644 --- a/docs/usage.rst +++ b/docs/usage.rst @@ -203,9 +203,9 @@ exclude_regex sort_version_key Sort the version string using this key function. Choose between - ``parse_version`` and ``vercmp``. Default value is ``parse_version``. - ``parse_version`` use ``pkg_resources.parse_version``. ``vercmp`` use - ``pyalpm.vercmp``. + ``packaging``, ``parse_version`` and ``vercmp``. Default value is ``packaging``. + ``packaging`` use ``packaging.version``, ``parse_version`` use ``pkg_resources.parse_version``. + ``vercmp`` use ``pyalpm.vercmp``. ignored Version strings that are explicitly ignored, separated by whitespace. This @@ -368,7 +368,7 @@ branch use_max_tag Set this to ``true`` to check for the max tag on Gitea. Will return the biggest one - sorted by ``pkg_resources.parse_version``. Will return the tag name instead of date. + sorted by ``packaging.version``. Will return the tag name instead of date. host Hostname for self-hosted Gitea instance. @@ -400,7 +400,7 @@ branch use_max_tag Set this to ``true`` to check for the max tag on BitBucket. Will return the biggest one - sorted by ``pkg_resources.parse_version``. Will return the tag name instead of date. + sorted by ``packaging.version``. Will return the tag name instead of date. max_page How many pages do we search for the max tag? Default is 3. This works when @@ -425,7 +425,7 @@ branch use_max_tag Set this to ``true`` to check for the max tag on GitLab. Will return the biggest one - sorted by ``pkg_resources.parse_version``. Will return the tag name instead of date. + sorted by ``packaging.version``. Will return the tag name instead of date. host Hostname for self-hosted GitLab instance. diff --git a/nvchecker/core.py b/nvchecker/core.py index ae182e41..3b170d0a 100644 --- a/nvchecker/core.py +++ b/nvchecker/core.py @@ -305,8 +305,8 @@ def apply_list_options( if not versions: return None - sort_version_key = sort_version_keys[ - conf.get("sort_version_key", "parse_version")] + sort_version_key = sort_version_keys( + conf.get("sort_version_key", "packaging")) versions.sort(key=sort_version_key) return versions[-1] diff --git a/nvchecker/sortversion.py b/nvchecker/sortversion.py index a056c58c..e252cedd 100644 --- a/nvchecker/sortversion.py +++ b/nvchecker/sortversion.py @@ -2,21 +2,22 @@ # Copyright (c) 2013-2017 lilydjwg , et al. ''' -Sort versions using pkg_resource.parse_version or pyalpm.vercmp +Sort versions using packaging.version, pkg_resource.parse_version, or pyalpm.vercmp ''' __all__ = ["sort_version_keys"] from functools import cmp_to_key -from pkg_resources import parse_version -try: - import pyalpm - vercmp = cmp_to_key(pyalpm.vercmp) - vercmp_available = True -except ImportError: - def vercmp(k): - raise NotImplementedError("Using vercmp but pyalpm can not be imported!") - vercmp_available = False - -sort_version_keys = {"parse_version": parse_version, "vercmp": vercmp} +def sort_version_keys(method: str): + if method == "packaging": + from packaging import version + return version.parse + elif method == "parse_version": + from pkg_resources import parse_version + return parse_version + elif method == "vercmp": + import pyalpm + return cmp_to_key(pyalpm.vercmp) + else: + raise NotImplementedError(f"Unsupported method {method} specified!") diff --git a/nvchecker/tools.py b/nvchecker/tools.py index f4de1501..7991d1e4 100644 --- a/nvchecker/tools.py +++ b/nvchecker/tools.py @@ -72,9 +72,9 @@ def cmp() -> None: parser.add_argument('-q', '--quiet', action='store_true', help="Quiet mode, output only the names.") parser.add_argument('-s', '--sort', - choices=('parse_version', 'vercmp'), default='parse_version', + choices=('packaging', 'parse_version', 'vercmp'), default='packaging', help='Version compare method to backwards the arrow ' - '(default: parse_version)') + '(default: packaging)') parser.add_argument('-n', '--newer', action='store_true', help='Shows only the newer ones according to --sort.') args = parser.parse_args() @@ -106,7 +106,7 @@ def cmp() -> None: arrow = "->" if args.sort != "none" and oldver is not None and newver is not None: from .sortversion import sort_version_keys - version = sort_version_keys[args.sort] + version = sort_version_keys(args.sort) if version(oldver) > version(newver): arrow = f'{c.red}<-{c.normal}' if args.newer: diff --git a/nvchecker_source/bitbucket.py b/nvchecker_source/bitbucket.py index 5919709e..c522c87e 100644 --- a/nvchecker_source/bitbucket.py +++ b/nvchecker_source/bitbucket.py @@ -1,8 +1,6 @@ # MIT licensed # Copyright (c) 2013-2020 lilydjwg , et al. -from nvchecker.api import sort_version_keys - # doc: https://confluence.atlassian.com/display/BITBUCKET/commits+or+commit+Resource BITBUCKET_URL = 'https://bitbucket.org/api/2.0/repositories/%s/commits/%s' BITBUCKET_MAX_TAG = 'https://bitbucket.org/api/2.0/repositories/%s/refs/tags' diff --git a/tests/test_sortversion.py b/tests/test_sortversion.py index 5d5679de..c341be2f 100644 --- a/tests/test_sortversion.py +++ b/tests/test_sortversion.py @@ -1,12 +1,20 @@ import pytest -from nvchecker.sortversion import parse_version, vercmp, vercmp_available +from nvchecker.sortversion import sort_version_keys def test_parse_version(): + parse_version = sort_version_keys("parse_version") assert parse_version("v6.0") < parse_version("6.1") assert parse_version("v6.0") > parse_version("v6.1-stable") -@pytest.mark.skipif(not vercmp_available, - reason="needs pyalpm") +def test_packaging(): + packaging_version = sort_version_keys("packaging") + assert packaging_version("v6.0") < packaging_version("6.1") + assert packaging_version("v6.0") > packaging_version("v6.1-stable") + def test_vercmp(): + try: + vercmp = sort_version_keys("vercmp") + except ImportError: + pytest.skip("needs pyalpm") assert vercmp("v6.0") < vercmp("v6.1-stable")