From 06b3d91da07c3d895a68baedb9fd2f926a170ee6 Mon Sep 17 00:00:00 2001 From: Tobias Macey Date: Thu, 19 Nov 2015 12:29:41 -0500 Subject: [PATCH] Added the additional_dependencies config parameter Added the ability to specify additional dependencies to be installed in the pre-commit environment. Fixed broken tests. --- pre_commit/languages/node.py | 6 +++++- pre_commit/languages/pcre.py | 3 ++- pre_commit/languages/python.py | 6 +++++- pre_commit/languages/ruby.py | 8 +++++++- pre_commit/languages/script.py | 3 ++- pre_commit/languages/system.py | 3 ++- pre_commit/repository.py | 13 ++++++++++++- tests/languages/all_test.py | 4 ++-- 8 files changed, 37 insertions(+), 9 deletions(-) diff --git a/pre_commit/languages/node.py b/pre_commit/languages/node.py index 20fa8572..a57c0a10 100644 --- a/pre_commit/languages/node.py +++ b/pre_commit/languages/node.py @@ -23,7 +23,8 @@ def in_env(repo_cmd_runner, language_version): yield NodeEnv(repo_cmd_runner, language_version) -def install_environment(repo_cmd_runner, version='default'): +def install_environment(repo_cmd_runner, version='default', + additional_dependencies=None): assert repo_cmd_runner.exists('package.json') directory = helpers.environment_dir(ENVIRONMENT_DIR, version) @@ -41,6 +42,9 @@ def install_environment(repo_cmd_runner, version='default'): with in_env(repo_cmd_runner, version) as node_env: node_env.run("cd '{prefix}' && npm install -g") + if additional_dependencies: + node_env.run("cd '{prefix}' && npm install -g " + + (' ').join(additional_dependencies)) def run_hook(repo_cmd_runner, hook, file_args): diff --git a/pre_commit/languages/pcre.py b/pre_commit/languages/pcre.py index 8d73e095..9d8fa410 100644 --- a/pre_commit/languages/pcre.py +++ b/pre_commit/languages/pcre.py @@ -9,7 +9,8 @@ from pre_commit.util import shell_escape ENVIRONMENT_DIR = None -def install_environment(repo_cmd_runner, version='default'): +def install_environment(repo_cmd_runner, version='default', + additional_dependencies=None): """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 52b07bbd..ebfba1b7 100644 --- a/pre_commit/languages/python.py +++ b/pre_commit/languages/python.py @@ -42,7 +42,8 @@ def norm_version(version): return version -def install_environment(repo_cmd_runner, version='default'): +def install_environment(repo_cmd_runner, version='default', + additional_dependencies=None): assert repo_cmd_runner.exists('setup.py') directory = helpers.environment_dir(ENVIRONMENT_DIR, version) @@ -57,6 +58,9 @@ def install_environment(repo_cmd_runner, version='default'): repo_cmd_runner.run(venv_cmd) with in_env(repo_cmd_runner, version) as env: env.run("cd '{prefix}' && pip install .") + if additional_dependencies: + env.run("cd '{prefix}' && pip install -U" + + (' ').join(additional_dependencies)) def run_hook(repo_cmd_runner, hook, file_args): diff --git a/pre_commit/languages/ruby.py b/pre_commit/languages/ruby.py index 0931a588..55a18c69 100644 --- a/pre_commit/languages/ruby.py +++ b/pre_commit/languages/ruby.py @@ -78,7 +78,8 @@ def _install_ruby(environment, version): environment.run('rbenv install {0}'.format(version)) -def install_environment(repo_cmd_runner, version='default'): +def install_environment(repo_cmd_runner, version='default', + additional_dependencies=None): directory = helpers.environment_dir(ENVIRONMENT_DIR, version) with clean_path_on_failure(repo_cmd_runner.path(directory)): # TODO: this currently will fail if there's no version specified and @@ -91,6 +92,11 @@ def install_environment(repo_cmd_runner, version='default'): 'cd {prefix} && gem build *.gemspec' ' && gem install --no-ri --no-rdoc *.gem', ) + if additional_dependencies: + ruby_env.run( + 'cd {prefix} && gem install --no-document ' + (' ').join( + additional_dependencies) + ) def run_hook(repo_cmd_runner, hook, file_args): diff --git a/pre_commit/languages/script.py b/pre_commit/languages/script.py index 1b357e4d..5f6d97db 100644 --- a/pre_commit/languages/script.py +++ b/pre_commit/languages/script.py @@ -6,7 +6,8 @@ from pre_commit.languages.helpers import file_args_to_stdin ENVIRONMENT_DIR = None -def install_environment(repo_cmd_runner, version='default'): +def install_environment(repo_cmd_runner, version='default', + additional_dependencies=None): """Installation for script type is a noop.""" raise AssertionError('Cannot install script repo.') diff --git a/pre_commit/languages/system.py b/pre_commit/languages/system.py index 3de48aac..1b49a8ce 100644 --- a/pre_commit/languages/system.py +++ b/pre_commit/languages/system.py @@ -8,7 +8,8 @@ from pre_commit.languages.helpers import file_args_to_stdin ENVIRONMENT_DIR = None -def install_environment(repo_cmd_runner, version='default'): +def install_environment(repo_cmd_runner, version='default', + additional_dependencies=None): """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 83a3c01e..e64b78e1 100644 --- a/pre_commit/repository.py +++ b/pre_commit/repository.py @@ -2,6 +2,7 @@ from __future__ import unicode_literals import logging import shutil +from collections import defaultdict from cached_property import cached_property @@ -49,6 +50,14 @@ class Repository(object): for _, hook in self.hooks ) + @cached_property + def additional_dependencies(self): + dep_dict = defaultdict(lambda: defaultdict(set)) + for _, hook in self.hooks: + dep_dict[hook['language']][hook['language_version']].update( + hook.get('dependencies', [])) + return dep_dict + @cached_property def hooks(self): # TODO: merging in manifest dicts is a smell imo @@ -107,7 +116,9 @@ class Repository(object): if self.cmd_runner.exists(directory): shutil.rmtree(self.cmd_runner.path(directory)) - language.install_environment(self.cmd_runner, language_version) + language.install_environment( + self.cmd_runner, language_version, + self.additional_dependencies[language_name][language_version]) # Touch the .installed file (atomic) to indicate we've installed open(self.cmd_runner.path(directory, '.installed'), 'w').close() diff --git a/tests/languages/all_test.py b/tests/languages/all_test.py index 90db9ec7..2254e388 100644 --- a/tests/languages/all_test.py +++ b/tests/languages/all_test.py @@ -11,10 +11,10 @@ from pre_commit.languages.all import languages @pytest.mark.parametrize('language', all_languages) def test_install_environment_argspec(language): expected_argspec = inspect.ArgSpec( - args=['repo_cmd_runner', 'version'], + args=['repo_cmd_runner', 'version', 'additional_dependencies'], varargs=None, keywords=None, - defaults=('default',), + defaults=('default', None), ) argspec = inspect.getargspec(languages[language].install_environment) assert argspec == expected_argspec