Skip to content

Commit 06b3d91

Browse files
committed
Added the additional_dependencies config parameter
Added the ability to specify additional dependencies to be installed in the pre-commit environment. Fixed broken tests.
1 parent 8a43a65 commit 06b3d91

File tree

8 files changed

+37
-9
lines changed

8 files changed

+37
-9
lines changed

pre_commit/languages/node.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,8 @@ def in_env(repo_cmd_runner, language_version):
2323
yield NodeEnv(repo_cmd_runner, language_version)
2424

2525

26-
def install_environment(repo_cmd_runner, version='default'):
26+
def install_environment(repo_cmd_runner, version='default',
27+
additional_dependencies=None):
2728
assert repo_cmd_runner.exists('package.json')
2829
directory = helpers.environment_dir(ENVIRONMENT_DIR, version)
2930

@@ -41,6 +42,9 @@ def install_environment(repo_cmd_runner, version='default'):
4142

4243
with in_env(repo_cmd_runner, version) as node_env:
4344
node_env.run("cd '{prefix}' && npm install -g")
45+
if additional_dependencies:
46+
node_env.run("cd '{prefix}' && npm install -g " +
47+
(' ').join(additional_dependencies))
4448

4549

4650
def run_hook(repo_cmd_runner, hook, file_args):

pre_commit/languages/pcre.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,8 @@
99
ENVIRONMENT_DIR = None
1010

1111

12-
def install_environment(repo_cmd_runner, version='default'):
12+
def install_environment(repo_cmd_runner, version='default',
13+
additional_dependencies=None):
1314
"""Installation for pcre type is a noop."""
1415
raise AssertionError('Cannot install pcre repo.')
1516

pre_commit/languages/python.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,8 @@ def norm_version(version):
4242
return version
4343

4444

45-
def install_environment(repo_cmd_runner, version='default'):
45+
def install_environment(repo_cmd_runner, version='default',
46+
additional_dependencies=None):
4647
assert repo_cmd_runner.exists('setup.py')
4748
directory = helpers.environment_dir(ENVIRONMENT_DIR, version)
4849

@@ -57,6 +58,9 @@ def install_environment(repo_cmd_runner, version='default'):
5758
repo_cmd_runner.run(venv_cmd)
5859
with in_env(repo_cmd_runner, version) as env:
5960
env.run("cd '{prefix}' && pip install .")
61+
if additional_dependencies:
62+
env.run("cd '{prefix}' && pip install -U" +
63+
(' ').join(additional_dependencies))
6064

6165

6266
def run_hook(repo_cmd_runner, hook, file_args):

pre_commit/languages/ruby.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,8 @@ def _install_ruby(environment, version):
7878
environment.run('rbenv install {0}'.format(version))
7979

8080

81-
def install_environment(repo_cmd_runner, version='default'):
81+
def install_environment(repo_cmd_runner, version='default',
82+
additional_dependencies=None):
8283
directory = helpers.environment_dir(ENVIRONMENT_DIR, version)
8384
with clean_path_on_failure(repo_cmd_runner.path(directory)):
8485
# TODO: this currently will fail if there's no version specified and
@@ -91,6 +92,11 @@ def install_environment(repo_cmd_runner, version='default'):
9192
'cd {prefix} && gem build *.gemspec'
9293
' && gem install --no-ri --no-rdoc *.gem',
9394
)
95+
if additional_dependencies:
96+
ruby_env.run(
97+
'cd {prefix} && gem install --no-document ' + (' ').join(
98+
additional_dependencies)
99+
)
94100

95101

96102
def run_hook(repo_cmd_runner, hook, file_args):

pre_commit/languages/script.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,8 @@
66
ENVIRONMENT_DIR = None
77

88

9-
def install_environment(repo_cmd_runner, version='default'):
9+
def install_environment(repo_cmd_runner, version='default',
10+
additional_dependencies=None):
1011
"""Installation for script type is a noop."""
1112
raise AssertionError('Cannot install script repo.')
1213

pre_commit/languages/system.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,8 @@
88
ENVIRONMENT_DIR = None
99

1010

11-
def install_environment(repo_cmd_runner, version='default'):
11+
def install_environment(repo_cmd_runner, version='default',
12+
additional_dependencies=None):
1213
"""Installation for system type is a noop."""
1314
raise AssertionError('Cannot install system repo.')
1415

pre_commit/repository.py

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import logging
44
import shutil
5+
from collections import defaultdict
56

67
from cached_property import cached_property
78

@@ -49,6 +50,14 @@ def languages(self):
4950
for _, hook in self.hooks
5051
)
5152

53+
@cached_property
54+
def additional_dependencies(self):
55+
dep_dict = defaultdict(lambda: defaultdict(set))
56+
for _, hook in self.hooks:
57+
dep_dict[hook['language']][hook['language_version']].update(
58+
hook.get('dependencies', []))
59+
return dep_dict
60+
5261
@cached_property
5362
def hooks(self):
5463
# TODO: merging in manifest dicts is a smell imo
@@ -107,7 +116,9 @@ def language_is_installed(language_name, language_version):
107116
if self.cmd_runner.exists(directory):
108117
shutil.rmtree(self.cmd_runner.path(directory))
109118

110-
language.install_environment(self.cmd_runner, language_version)
119+
language.install_environment(
120+
self.cmd_runner, language_version,
121+
self.additional_dependencies[language_name][language_version])
111122
# Touch the .installed file (atomic) to indicate we've installed
112123
open(self.cmd_runner.path(directory, '.installed'), 'w').close()
113124

tests/languages/all_test.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,10 @@
1111
@pytest.mark.parametrize('language', all_languages)
1212
def test_install_environment_argspec(language):
1313
expected_argspec = inspect.ArgSpec(
14-
args=['repo_cmd_runner', 'version'],
14+
args=['repo_cmd_runner', 'version', 'additional_dependencies'],
1515
varargs=None,
1616
keywords=None,
17-
defaults=('default',),
17+
defaults=('default', None),
1818
)
1919
argspec = inspect.getargspec(languages[language].install_environment)
2020
assert argspec == expected_argspec

0 commit comments

Comments
 (0)