Skip to content

Commit 7c8272d

Browse files
committed
Merge pull request pre-commit#295 from blarghmatey/install_dependencies
Added the additional_dependencies config parameter
2 parents 3ac1041 + 0980887 commit 7c8272d

11 files changed

Lines changed: 132 additions & 17 deletions

File tree

pre_commit/clientlib/validate_config.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,10 @@ class InvalidConfigError(FatalError):
3939
'type': 'array',
4040
'items': {'type': 'string'},
4141
},
42+
'additional_dependencies': {
43+
'type': 'array',
44+
'items': {'type': 'string'}
45+
}
4246
},
4347
'required': ['id'],
4448
}

pre_commit/languages/all.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,11 @@
1212
# # Use None for no environment
1313
# ENVIRONMENT_DIR = 'foo_env'
1414
#
15-
# def install_environment(repo_cmd_runner, version='default'):
15+
# def install_environment(
16+
# repo_cmd_runner,
17+
# version='default',
18+
# additional_dependencies=None,
19+
# ):
1620
# """Installs a repository in the given repository. Note that the current
1721
# working directory will already be inside the repository.
1822
#

pre_commit/languages/node.py

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55

66
from pre_commit.languages import helpers
77
from pre_commit.util import clean_path_on_failure
8+
from pre_commit.util import shell_escape
89

910

1011
ENVIRONMENT_DIR = 'node_env'
@@ -23,7 +24,11 @@ def in_env(repo_cmd_runner, language_version):
2324
yield NodeEnv(repo_cmd_runner, language_version)
2425

2526

26-
def install_environment(repo_cmd_runner, version='default'):
27+
def install_environment(
28+
repo_cmd_runner,
29+
version='default',
30+
additional_dependencies=None,
31+
):
2732
assert repo_cmd_runner.exists('package.json')
2833
directory = helpers.environment_dir(ENVIRONMENT_DIR, version)
2934

@@ -41,6 +46,13 @@ def install_environment(repo_cmd_runner, version='default'):
4146

4247
with in_env(repo_cmd_runner, version) as node_env:
4348
node_env.run("cd '{prefix}' && npm install -g")
49+
if additional_dependencies:
50+
node_env.run(
51+
"cd '{prefix}' && npm install -g " +
52+
' '.join(
53+
shell_escape(dep) for dep in additional_dependencies
54+
)
55+
)
4456

4557

4658
def run_hook(repo_cmd_runner, hook, file_args):

pre_commit/languages/pcre.py

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

1111

12-
def install_environment(repo_cmd_runner, version='default'):
12+
def install_environment(
13+
repo_cmd_runner,
14+
version='default',
15+
additional_dependencies=None,
16+
):
1317
"""Installation for pcre type is a noop."""
1418
raise AssertionError('Cannot install pcre repo.')
1519

pre_commit/languages/python.py

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99

1010
from pre_commit.languages import helpers
1111
from pre_commit.util import clean_path_on_failure
12+
from pre_commit.util import shell_escape
1213

1314

1415
ENVIRONMENT_DIR = 'py_env'
@@ -42,7 +43,11 @@ def norm_version(version):
4243
return version
4344

4445

45-
def install_environment(repo_cmd_runner, version='default'):
46+
def install_environment(
47+
repo_cmd_runner,
48+
version='default',
49+
additional_dependencies=None,
50+
):
4651
assert repo_cmd_runner.exists('setup.py')
4752
directory = helpers.environment_dir(ENVIRONMENT_DIR, version)
4853

@@ -57,6 +62,13 @@ def install_environment(repo_cmd_runner, version='default'):
5762
repo_cmd_runner.run(venv_cmd)
5863
with in_env(repo_cmd_runner, version) as env:
5964
env.run("cd '{prefix}' && pip install .")
65+
if additional_dependencies:
66+
env.run(
67+
"cd '{prefix}' && pip install " +
68+
' '.join(
69+
shell_escape(dep) for dep in additional_dependencies
70+
)
71+
)
6072

6173

6274
def run_hook(repo_cmd_runner, hook, file_args):

pre_commit/languages/ruby.py

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
from pre_commit.util import CalledProcessError
99
from pre_commit.util import clean_path_on_failure
1010
from pre_commit.util import resource_filename
11+
from pre_commit.util import shell_escape
1112
from pre_commit.util import tarfile_open
1213

1314

@@ -78,7 +79,11 @@ def _install_ruby(environment, version):
7879
environment.run('rbenv install {0}'.format(version))
7980

8081

81-
def install_environment(repo_cmd_runner, version='default'):
82+
def install_environment(
83+
repo_cmd_runner,
84+
version='default',
85+
additional_dependencies=None,
86+
):
8287
directory = helpers.environment_dir(ENVIRONMENT_DIR, version)
8388
with clean_path_on_failure(repo_cmd_runner.path(directory)):
8489
# TODO: this currently will fail if there's no version specified and
@@ -88,9 +93,16 @@ def install_environment(repo_cmd_runner, version='default'):
8893
if version != 'default':
8994
_install_ruby(ruby_env, version)
9095
ruby_env.run(
91-
'cd {prefix} && gem build *.gemspec'
92-
' && gem install --no-ri --no-rdoc *.gem',
96+
'cd {prefix} && gem build *.gemspec && '
97+
'gem install --no-ri --no-rdoc *.gem',
9398
)
99+
if additional_dependencies:
100+
ruby_env.run(
101+
'cd {prefix} && gem install --no-ri --no-rdoc ' +
102+
' '.join(
103+
shell_escape(dep) for dep in additional_dependencies
104+
)
105+
)
94106

95107

96108
def run_hook(repo_cmd_runner, hook, file_args):

pre_commit/languages/script.py

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,15 +6,18 @@
66
ENVIRONMENT_DIR = None
77

88

9-
def install_environment(repo_cmd_runner, version='default'):
9+
def install_environment(
10+
repo_cmd_runner,
11+
version='default',
12+
additional_dependencies=None,
13+
):
1014
"""Installation for script type is a noop."""
1115
raise AssertionError('Cannot install script repo.')
1216

1317

1418
def run_hook(repo_cmd_runner, hook, file_args):
1519
return repo_cmd_runner.run(
1620
['xargs', '-0', '{{prefix}}{0}'.format(hook['entry'])] + hook['args'],
17-
# TODO: this is duplicated in pre_commit/languages/helpers.py
1821
stdin=file_args_to_stdin(file_args),
1922
retcode=None,
2023
encoding=None,

pre_commit/languages/system.py

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

1010

11-
def install_environment(repo_cmd_runner, version='default'):
11+
def install_environment(
12+
repo_cmd_runner,
13+
version='default',
14+
additional_dependencies=None,
15+
):
1216
"""Installation for system type is a noop."""
1317
raise AssertionError('Cannot install system repo.')
1418

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('additional_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)