From ebe5132576b9f84859e018b2430fa9a21e307716 Mon Sep 17 00:00:00 2001 From: Anthony Sottile Date: Sun, 14 Oct 2018 12:24:59 -0700 Subject: [PATCH] Replace pkg_resources.get_distribution with importlib-metadata --- pre_commit/constants.py | 5 ++--- pre_commit/repository.py | 8 ++++---- pre_commit/util.py | 5 +++++ setup.py | 2 ++ tests/util_test.py | 7 +++++++ 5 files changed, 20 insertions(+), 7 deletions(-) diff --git a/pre_commit/constants.py b/pre_commit/constants.py index 48ba2cb9..a8cdc2e5 100644 --- a/pre_commit/constants.py +++ b/pre_commit/constants.py @@ -1,7 +1,7 @@ from __future__ import absolute_import from __future__ import unicode_literals -import pkg_resources +import importlib_metadata # TODO: importlib.metadata py38? CONFIG_FILE = '.pre-commit-config.yaml' MANIFEST_FILE = '.pre-commit-hooks.yaml' @@ -18,8 +18,7 @@ INSTALLED_STATE_VERSION = '1' # Bump when modifying `empty_template` LOCAL_REPO_VERSION = '1' -VERSION = pkg_resources.get_distribution('pre-commit').version -VERSION_PARSED = pkg_resources.parse_version(VERSION) +VERSION = importlib_metadata.version('pre_commit') # `manual` is not invoked by any installed git hook. See #719 STAGES = ('commit', 'commit-msg', 'manual', 'push') diff --git a/pre_commit/repository.py b/pre_commit/repository.py index 278f31a2..d718c2ff 100644 --- a/pre_commit/repository.py +++ b/pre_commit/repository.py @@ -8,7 +8,6 @@ import pipes import shutil import sys -import pkg_resources from cached_property import cached_property from cfgv import apply_defaults from cfgv import validate @@ -23,6 +22,7 @@ from pre_commit.clientlib import MANIFEST_HOOK_DICT from pre_commit.languages.all import languages from pre_commit.languages.helpers import environment_dir from pre_commit.prefix import Prefix +from pre_commit.util import parse_version logger = logging.getLogger('pre_commit') @@ -110,13 +110,13 @@ def _hook(*hook_dicts): for dct in rest: ret.update(dct) - version = pkg_resources.parse_version(ret['minimum_pre_commit_version']) - if version > C.VERSION_PARSED: + version = ret['minimum_pre_commit_version'] + if parse_version(version) > parse_version(C.VERSION): logger.error( 'The hook `{}` requires pre-commit version {} but version {} ' 'is installed. ' 'Perhaps run `pip install --upgrade pre-commit`.'.format( - ret['id'], version, C.VERSION_PARSED, + ret['id'], version, C.VERSION, ), ) exit(1) diff --git a/pre_commit/util.py b/pre_commit/util.py index bcb47c3f..55210f10 100644 --- a/pre_commit/util.py +++ b/pre_commit/util.py @@ -211,3 +211,8 @@ def copy_tree_to_path(src_dir, dest_dir): shutil.copytree(srcname, destname) else: shutil.copy(srcname, destname) + + +def parse_version(s): + """poor man's version comparison""" + return tuple(int(p) for p in s.split('.')) diff --git a/setup.py b/setup.py index 3eb04d8a..82a70371 100644 --- a/setup.py +++ b/setup.py @@ -40,6 +40,8 @@ setup( 'cached-property', 'cfgv>=1.0.0', 'identify>=1.0.0', + # if this makes it into python3.8 move to extras_require + 'importlib-metadata', 'nodeenv>=0.11.1', 'pyyaml', 'six', diff --git a/tests/util_test.py b/tests/util_test.py index 967163e4..56eb5aaa 100644 --- a/tests/util_test.py +++ b/tests/util_test.py @@ -9,6 +9,7 @@ from pre_commit.util import CalledProcessError from pre_commit.util import clean_path_on_failure from pre_commit.util import cmd_output from pre_commit.util import memoize_by_cwd +from pre_commit.util import parse_version from pre_commit.util import tmpdir from testing.util import cwd @@ -117,3 +118,9 @@ def test_cmd_output_exe_not_found(): ret, out, _ = cmd_output('i-dont-exist', retcode=None) assert ret == 1 assert out == 'Executable `i-dont-exist` not found' + + +def test_parse_version(): + assert parse_version('0.0') == parse_version('0.0') + assert parse_version('0.1') > parse_version('0.0') + assert parse_version('2.1') >= parse_version('2')