From b59d7197ff5eed28bf96a2034f7e9aacd03e8376 Mon Sep 17 00:00:00 2001 From: Anthony Sottile Date: Mon, 31 Dec 2018 13:16:48 -0800 Subject: [PATCH] Use Hook api in languages --- pre_commit/languages/all.py | 5 ++--- pre_commit/languages/docker.py | 6 +++--- pre_commit/languages/docker_image.py | 2 +- pre_commit/languages/fail.py | 4 ++-- pre_commit/languages/golang.py | 4 ++-- pre_commit/languages/helpers.py | 4 ++-- pre_commit/languages/node.py | 4 ++-- pre_commit/languages/pcre.py | 4 ++-- pre_commit/languages/pygrep.py | 5 ++--- pre_commit/languages/python.py | 4 ++-- pre_commit/languages/ruby.py | 4 ++-- pre_commit/languages/rust.py | 4 ++-- pre_commit/languages/script.py | 4 ++-- pre_commit/languages/swift.py | 4 ++-- pre_commit/languages/system.py | 2 +- pre_commit/repository.py | 2 +- tests/languages/all_test.py | 2 +- tests/languages/helpers_test.py | 15 ++++++++++----- 18 files changed, 41 insertions(+), 38 deletions(-) diff --git a/pre_commit/languages/all.py b/pre_commit/languages/all.py index a019ddff..fecce471 100644 --- a/pre_commit/languages/all.py +++ b/pre_commit/languages/all.py @@ -39,13 +39,12 @@ from pre_commit.languages import system # 'default'. # """ # -# def run_hook(prefix, hook, file_args): +# def run_hook(hook, file_args): # """Runs a hook and returns the returncode and output of running that # hook. # # Args: -# prefix - `Prefix` bound to the repository. -# hook - Hook dictionary +# hook - `Hook` # file_args - The files to be run # # Returns: diff --git a/pre_commit/languages/docker.py b/pre_commit/languages/docker.py index bfdd3585..35b2eda0 100644 --- a/pre_commit/languages/docker.py +++ b/pre_commit/languages/docker.py @@ -85,15 +85,15 @@ def docker_cmd(): ) -def run_hook(prefix, hook, file_args): # pragma: windows no cover +def run_hook(hook, file_args): # pragma: windows no cover assert_docker_available() # Rebuild the docker image in case it has gone missing, as many people do # automated cleanup of docker images. - build_docker_image(prefix, pull=False) + build_docker_image(hook.prefix, pull=False) hook_cmd = helpers.to_cmd(hook) entry_exe, cmd_rest = hook_cmd[0], hook_cmd[1:] - entry_tag = ('--entrypoint', entry_exe, docker_tag(prefix)) + entry_tag = ('--entrypoint', entry_exe, docker_tag(hook.prefix)) cmd = docker_cmd() + entry_tag + cmd_rest return helpers.run_xargs(hook, cmd, file_args) diff --git a/pre_commit/languages/docker_image.py b/pre_commit/languages/docker_image.py index e7ebad7f..ab2a8565 100644 --- a/pre_commit/languages/docker_image.py +++ b/pre_commit/languages/docker_image.py @@ -12,7 +12,7 @@ healthy = helpers.basic_healthy install_environment = helpers.no_install -def run_hook(prefix, hook, file_args): # pragma: windows no cover +def run_hook(hook, file_args): # pragma: windows no cover assert_docker_available() cmd = docker_cmd() + helpers.to_cmd(hook) return helpers.run_xargs(hook, cmd, file_args) diff --git a/pre_commit/languages/fail.py b/pre_commit/languages/fail.py index c69fcae0..f2ce09e1 100644 --- a/pre_commit/languages/fail.py +++ b/pre_commit/languages/fail.py @@ -9,7 +9,7 @@ healthy = helpers.basic_healthy install_environment = helpers.no_install -def run_hook(prefix, hook, file_args): - out = hook['entry'].encode('UTF-8') + b'\n\n' +def run_hook(hook, file_args): + out = hook.entry.encode('UTF-8') + b'\n\n' out += b'\n'.join(f.encode('UTF-8') for f in file_args) + b'\n' return 1, out, b'' diff --git a/pre_commit/languages/golang.py b/pre_commit/languages/golang.py index 09e3476c..92d5d36c 100644 --- a/pre_commit/languages/golang.py +++ b/pre_commit/languages/golang.py @@ -78,6 +78,6 @@ def install_environment(prefix, version, additional_dependencies): rmtree(pkgdir) -def run_hook(prefix, hook, file_args): - with in_env(prefix): +def run_hook(hook, file_args): + with in_env(hook.prefix): return helpers.run_xargs(hook, helpers.to_cmd(hook), file_args) diff --git a/pre_commit/languages/helpers.py b/pre_commit/languages/helpers.py index 28b9cb87..faff1437 100644 --- a/pre_commit/languages/helpers.py +++ b/pre_commit/languages/helpers.py @@ -26,7 +26,7 @@ def environment_dir(ENVIRONMENT_DIR, language_version): def to_cmd(hook): - return tuple(shlex.split(hook['entry'])) + tuple(hook['args']) + return tuple(shlex.split(hook.entry)) + tuple(hook.args) def assert_version_default(binary, version): @@ -57,7 +57,7 @@ def no_install(prefix, version, additional_dependencies): def target_concurrency(hook): - if hook['require_serial'] or 'PRE_COMMIT_NO_CONCURRENCY' in os.environ: + if hook.require_serial or 'PRE_COMMIT_NO_CONCURRENCY' in os.environ: return 1 else: # Travis appears to have a bunch of CPUs, but we can't use them all. diff --git a/pre_commit/languages/node.py b/pre_commit/languages/node.py index 2e9e60e4..07f785ea 100644 --- a/pre_commit/languages/node.py +++ b/pre_commit/languages/node.py @@ -68,6 +68,6 @@ def install_environment(prefix, version, additional_dependencies): ) -def run_hook(prefix, hook, file_args): - with in_env(prefix, hook['language_version']): +def run_hook(hook, file_args): + with in_env(hook.prefix, hook.language_version): return helpers.run_xargs(hook, helpers.to_cmd(hook), file_args) diff --git a/pre_commit/languages/pcre.py b/pre_commit/languages/pcre.py index fb078ab7..143adb23 100644 --- a/pre_commit/languages/pcre.py +++ b/pre_commit/languages/pcre.py @@ -13,9 +13,9 @@ healthy = helpers.basic_healthy install_environment = helpers.no_install -def run_hook(prefix, hook, file_args): +def run_hook(hook, file_args): # For PCRE the entry is the regular expression to match - cmd = (GREP, '-H', '-n', '-P') + tuple(hook['args']) + (hook['entry'],) + cmd = (GREP, '-H', '-n', '-P') + tuple(hook.args) + (hook.entry,) # Grep usually returns 0 for matches, and nonzero for non-matches so we # negate it here. diff --git a/pre_commit/languages/pygrep.py b/pre_commit/languages/pygrep.py index 7eead9e1..e0188a97 100644 --- a/pre_commit/languages/pygrep.py +++ b/pre_commit/languages/pygrep.py @@ -44,9 +44,8 @@ def _process_filename_at_once(pattern, filename): return retv -def run_hook(prefix, hook, file_args): - exe = (sys.executable, '-m', __name__) - exe += tuple(hook['args']) + (hook['entry'],) +def run_hook(hook, file_args): + exe = (sys.executable, '-m', __name__) + tuple(hook.args) + (hook.entry,) return xargs(exe, file_args) diff --git a/pre_commit/languages/python.py b/pre_commit/languages/python.py index 4b7580a4..fab5450a 100644 --- a/pre_commit/languages/python.py +++ b/pre_commit/languages/python.py @@ -124,8 +124,8 @@ def py_interface(_dir, _make_venv): ) return retcode == 0 - def run_hook(prefix, hook, file_args): - with in_env(prefix, hook['language_version']): + def run_hook(hook, file_args): + with in_env(hook.prefix, hook.language_version): return helpers.run_xargs(hook, helpers.to_cmd(hook), file_args) def install_environment(prefix, version, additional_dependencies): diff --git a/pre_commit/languages/ruby.py b/pre_commit/languages/ruby.py index 484df47c..04a74155 100644 --- a/pre_commit/languages/ruby.py +++ b/pre_commit/languages/ruby.py @@ -123,6 +123,6 @@ def install_environment( ) -def run_hook(prefix, hook, file_args): # pragma: windows no cover - with in_env(prefix, hook['language_version']): +def run_hook(hook, file_args): # pragma: windows no cover + with in_env(hook.prefix, hook.language_version): return helpers.run_xargs(hook, helpers.to_cmd(hook), file_args) diff --git a/pre_commit/languages/rust.py b/pre_commit/languages/rust.py index 8a5a0704..e81fbad2 100644 --- a/pre_commit/languages/rust.py +++ b/pre_commit/languages/rust.py @@ -88,6 +88,6 @@ def install_environment(prefix, version, additional_dependencies): ) -def run_hook(prefix, hook, file_args): - with in_env(prefix): +def run_hook(hook, file_args): + with in_env(hook.prefix): return helpers.run_xargs(hook, helpers.to_cmd(hook), file_args) diff --git a/pre_commit/languages/script.py b/pre_commit/languages/script.py index 809efb85..56d9d27e 100644 --- a/pre_commit/languages/script.py +++ b/pre_commit/languages/script.py @@ -9,7 +9,7 @@ healthy = helpers.basic_healthy install_environment = helpers.no_install -def run_hook(prefix, hook, file_args): +def run_hook(hook, file_args): cmd = helpers.to_cmd(hook) - cmd = (prefix.path(cmd[0]),) + cmd[1:] + cmd = (hook.prefix.path(cmd[0]),) + cmd[1:] return helpers.run_xargs(hook, cmd, file_args) diff --git a/pre_commit/languages/swift.py b/pre_commit/languages/swift.py index c282de5d..5841f25e 100644 --- a/pre_commit/languages/swift.py +++ b/pre_commit/languages/swift.py @@ -50,6 +50,6 @@ def install_environment( ) -def run_hook(prefix, hook, file_args): # pragma: windows no cover - with in_env(prefix): +def run_hook(hook, file_args): # pragma: windows no cover + with in_env(hook.prefix): return helpers.run_xargs(hook, helpers.to_cmd(hook), file_args) diff --git a/pre_commit/languages/system.py b/pre_commit/languages/system.py index e590d486..5a22670e 100644 --- a/pre_commit/languages/system.py +++ b/pre_commit/languages/system.py @@ -9,5 +9,5 @@ healthy = helpers.basic_healthy install_environment = helpers.no_install -def run_hook(prefix, hook, file_args): +def run_hook(hook, file_args): return helpers.run_xargs(hook, helpers.to_cmd(hook), file_args) diff --git a/pre_commit/repository.py b/pre_commit/repository.py index c9115dfd..7b980928 100644 --- a/pre_commit/repository.py +++ b/pre_commit/repository.py @@ -100,7 +100,7 @@ class Hook(collections.namedtuple('Hook', ('src', 'prefix') + _KEYS)): def run(self, file_args): lang = languages[self.language] - return lang.run_hook(self.prefix, self._asdict(), file_args) + return lang.run_hook(self, file_args) @classmethod def create(cls, src, prefix, dct): diff --git a/tests/languages/all_test.py b/tests/languages/all_test.py index 3d5d88c7..96754419 100644 --- a/tests/languages/all_test.py +++ b/tests/languages/all_test.py @@ -39,7 +39,7 @@ def test_ENVIRONMENT_DIR(language): @pytest.mark.parametrize('language', all_languages) def test_run_hook_argpsec(language): - expected_argspec = ArgSpec(args=['prefix', 'hook', 'file_args']) + expected_argspec = ArgSpec(args=['hook', 'file_args']) argspec = getargspec(languages[language].run_hook) assert argspec == expected_argspec diff --git a/tests/languages/helpers_test.py b/tests/languages/helpers_test.py index f77c3053..b3360820 100644 --- a/tests/languages/helpers_test.py +++ b/tests/languages/helpers_test.py @@ -11,6 +11,7 @@ import pytest from pre_commit.languages import helpers from pre_commit.prefix import Prefix from pre_commit.util import CalledProcessError +from testing.auto_namedtuple import auto_namedtuple def test_basic_get_default_version(): @@ -33,27 +34,31 @@ def test_failed_setup_command_does_not_unicode_error(): helpers.run_setup_cmd(Prefix('.'), (sys.executable, '-c', script)) +SERIAL_FALSE = auto_namedtuple(require_serial=False) +SERIAL_TRUE = auto_namedtuple(require_serial=True) + + def test_target_concurrency_normal(): with mock.patch.object(multiprocessing, 'cpu_count', return_value=123): with mock.patch.dict(os.environ, {}, clear=True): - assert helpers.target_concurrency({'require_serial': False}) == 123 + assert helpers.target_concurrency(SERIAL_FALSE) == 123 def test_target_concurrency_cpu_count_require_serial_true(): with mock.patch.dict(os.environ, {}, clear=True): - assert helpers.target_concurrency({'require_serial': True}) == 1 + assert helpers.target_concurrency(SERIAL_TRUE) == 1 def test_target_concurrency_testing_env_var(): with mock.patch.dict( os.environ, {'PRE_COMMIT_NO_CONCURRENCY': '1'}, clear=True, ): - assert helpers.target_concurrency({'require_serial': False}) == 1 + assert helpers.target_concurrency(SERIAL_FALSE) == 1 def test_target_concurrency_on_travis(): with mock.patch.dict(os.environ, {'TRAVIS': '1'}, clear=True): - assert helpers.target_concurrency({'require_serial': False}) == 2 + assert helpers.target_concurrency(SERIAL_FALSE) == 2 def test_target_concurrency_cpu_count_not_implemented(): @@ -61,7 +66,7 @@ def test_target_concurrency_cpu_count_not_implemented(): multiprocessing, 'cpu_count', side_effect=NotImplementedError, ): with mock.patch.dict(os.environ, {}, clear=True): - assert helpers.target_concurrency({'require_serial': False}) == 1 + assert helpers.target_concurrency(SERIAL_FALSE) == 1 def test_shuffled_is_deterministic():