From 377cffbd27339d101783bb58c74d533ad4e44642 Mon Sep 17 00:00:00 2001 From: Thierry Deo Date: Mon, 13 Feb 2017 14:37:03 +0100 Subject: [PATCH] Add support for python and ruby local hooks --- pre_commit/languages/docker.py | 1 + pre_commit/languages/golang.py | 1 + pre_commit/languages/node.py | 1 + pre_commit/languages/pcre.py | 1 + pre_commit/languages/python.py | 5 ++++- pre_commit/languages/ruby.py | 14 +++++++++----- pre_commit/languages/script.py | 1 + pre_commit/languages/swift.py | 1 + pre_commit/languages/system.py | 1 + pre_commit/repository.py | 1 + testing/fixtures.py | 10 +++++----- tests/repository_test.py | 28 ++++++++++++++++++++++++++++ 12 files changed, 54 insertions(+), 11 deletions(-) diff --git a/pre_commit/languages/docker.py b/pre_commit/languages/docker.py index 7d3f8d04..c4406648 100644 --- a/pre_commit/languages/docker.py +++ b/pre_commit/languages/docker.py @@ -58,6 +58,7 @@ def install_environment( repo_cmd_runner, version='default', additional_dependencies=(), + is_local_hook = False, ): # pragma: windows no cover assert repo_cmd_runner.exists('Dockerfile'), ( 'No Dockerfile was found in the hook repository' diff --git a/pre_commit/languages/golang.py b/pre_commit/languages/golang.py index c0bfbcbc..d5924536 100644 --- a/pre_commit/languages/golang.py +++ b/pre_commit/languages/golang.py @@ -48,6 +48,7 @@ def install_environment( repo_cmd_runner, version='default', additional_dependencies=(), + is_local_hook = False, ): helpers.assert_version_default('golang', version) directory = repo_cmd_runner.path( diff --git a/pre_commit/languages/node.py b/pre_commit/languages/node.py index ef557a16..6896b358 100644 --- a/pre_commit/languages/node.py +++ b/pre_commit/languages/node.py @@ -37,6 +37,7 @@ def install_environment( repo_cmd_runner, version='default', additional_dependencies=(), + is_local_hook = False, ): # pragma: windows no cover additional_dependencies = tuple(additional_dependencies) assert repo_cmd_runner.exists('package.json') diff --git a/pre_commit/languages/pcre.py b/pre_commit/languages/pcre.py index 314ea090..39741da0 100644 --- a/pre_commit/languages/pcre.py +++ b/pre_commit/languages/pcre.py @@ -13,6 +13,7 @@ def install_environment( repo_cmd_runner, version='default', additional_dependencies=(), + is_local_hook = False, ): """Installation for pcre type is a noop.""" raise AssertionError('Cannot install pcre repo.') diff --git a/pre_commit/languages/python.py b/pre_commit/languages/python.py index 1e60a3ed..d3215045 100644 --- a/pre_commit/languages/python.py +++ b/pre_commit/languages/python.py @@ -58,6 +58,7 @@ def install_environment( repo_cmd_runner, version='default', additional_dependencies=(), + is_local_hook = False, ): additional_dependencies = tuple(additional_dependencies) directory = helpers.environment_dir(ENVIRONMENT_DIR, version) @@ -73,10 +74,12 @@ def install_environment( else: venv_cmd.extend(['-p', os.path.realpath(sys.executable)]) repo_cmd_runner.run(venv_cmd, cwd='/') + to_install = () if is_local_hook else ('.') + to_install += additional_dependencies with in_env(repo_cmd_runner, version): helpers.run_setup_cmd( repo_cmd_runner, - ('pip', 'install', '.') + additional_dependencies, + ('pip', 'install') + to_install, ) diff --git a/pre_commit/languages/ruby.py b/pre_commit/languages/ruby.py index d3896d90..3c2b36ab 100644 --- a/pre_commit/languages/ruby.py +++ b/pre_commit/languages/ruby.py @@ -100,6 +100,7 @@ def install_environment( repo_cmd_runner, version='default', additional_dependencies=(), + is_local_hook = False, ): # pragma: windows no cover additional_dependencies = tuple(additional_dependencies) directory = helpers.environment_dir(ENVIRONMENT_DIR, version) @@ -115,15 +116,18 @@ def install_environment( _install_ruby(repo_cmd_runner, version) # Need to call this after installing to set up the shims helpers.run_setup_cmd(repo_cmd_runner, ('rbenv', 'rehash')) - helpers.run_setup_cmd( - repo_cmd_runner, - ('gem', 'build') + repo_cmd_runner.star('.gemspec'), - ) + if not is_local_hook: + helpers.run_setup_cmd( + repo_cmd_runner, + ('gem', 'build') + repo_cmd_runner.star('.gemspec'), + ) + to_install = () if is_local_hook else repo_cmd_runner.star('.gem') + to_install += additional_dependencies helpers.run_setup_cmd( repo_cmd_runner, ( ('gem', 'install', '--no-ri', '--no-rdoc') + - repo_cmd_runner.star('.gem') + additional_dependencies + to_install ), ) diff --git a/pre_commit/languages/script.py b/pre_commit/languages/script.py index 762ae763..151bf5df 100644 --- a/pre_commit/languages/script.py +++ b/pre_commit/languages/script.py @@ -11,6 +11,7 @@ def install_environment( repo_cmd_runner, version='default', additional_dependencies=(), + is_local_hook = False, ): """Installation for script type is a noop.""" raise AssertionError('Cannot install script repo.') diff --git a/pre_commit/languages/swift.py b/pre_commit/languages/swift.py index 4d171c5b..e418a5e6 100644 --- a/pre_commit/languages/swift.py +++ b/pre_commit/languages/swift.py @@ -32,6 +32,7 @@ def install_environment( repo_cmd_runner, version='default', additional_dependencies=(), + is_local_hook = False, ): # pragma: windows no cover helpers.assert_version_default('swift', version) helpers.assert_no_additional_deps('swift', additional_dependencies) diff --git a/pre_commit/languages/system.py b/pre_commit/languages/system.py index c9e1c5dc..424ba4b5 100644 --- a/pre_commit/languages/system.py +++ b/pre_commit/languages/system.py @@ -11,6 +11,7 @@ def install_environment( repo_cmd_runner, version='default', additional_dependencies=(), + is_local_hook = False, ): """Installation for system type is a noop.""" raise AssertionError('Cannot install system repo.') diff --git a/pre_commit/repository.py b/pre_commit/repository.py index 8ec6302b..56a53c86 100644 --- a/pre_commit/repository.py +++ b/pre_commit/repository.py @@ -179,6 +179,7 @@ class Repository(object): language.install_environment( self.cmd_runner, language_version, self.additional_dependencies[language_name][language_version], + is_local_hooks(self.repo_config), ) # Write our state to indicate we're installed write_state(venv, language_name, language_version) diff --git a/testing/fixtures.py b/testing/fixtures.py index aaa4203d..665c3c31 100644 --- a/testing/fixtures.py +++ b/testing/fixtures.py @@ -66,14 +66,14 @@ def modify_config(path='.', commit=True): cmd_output('git', 'commit', '-am', 'update config', cwd=path) -def config_with_local_hooks(): +def config_with_local_hooks(language='pcre'): return OrderedDict(( ('repo', 'local'), ('hooks', [OrderedDict(( - ('id', 'do_not_commit'), - ('name', 'Block if "DO NOT COMMIT" is found'), - ('entry', 'DO NOT COMMIT'), - ('language', 'pcre'), + ('id', language), + ('name', language), + ('entry', language), + ('language', language), ('files', '^(.*)$'), ))]) )) diff --git a/tests/repository_test.py b/tests/repository_test.py index 984973f5..663fca61 100644 --- a/tests/repository_test.py +++ b/tests/repository_test.py @@ -571,6 +571,34 @@ def test_additional_golang_dependencies_installed( assert 'hello' in binaries +@skipif_slowtests_false +@xfailif_windows_no_ruby +@pytest.mark.integration +def test_install_local_ruby_hook( + tempdir_factory, store, +): # pragma: no cover (non-windows) + config = config_with_local_hooks('ruby') + config['hooks'][0]['additional_dependencies'] = ['thread_safe'] + repo = Repository.create(config, store) + repo.require_installed() + with ruby.in_env(repo.cmd_runner, 'default'): + output = cmd_output('gem', 'list', '--local')[1] + assert 'thread_safe' in output + + +@pytest.mark.integration +def test_install_local_python_hook( + tempdir_factory, store, +): # pragma: no cover (non-windows) + config = config_with_local_hooks('python') + config['hooks'][0]['additional_dependencies'] = ['mccabe'] + repo = Repository.create(config, store) + repo.require_installed() + with python.in_env(repo.cmd_runner, 'default'): + output = cmd_output('pip', 'freeze', '-l')[1] + assert 'mccabe' in output + + def test_reinstall(tempdir_factory, store, log_info_mock): path = make_repo(tempdir_factory, 'python_hooks_repo') config = make_config_from_repo(path)