From 397efa80802c0b84f1e573accb8406df5eea83b8 Mon Sep 17 00:00:00 2001 From: Thierry Deo Date: Thu, 9 Feb 2017 12:41:07 +0100 Subject: [PATCH] Keep additional_dependencies in the order in which they are specified --- pre_commit/repository.py | 13 ++++++++++++- tests/repository_test.py | 18 ++++++++++++++++-- 2 files changed, 28 insertions(+), 3 deletions(-) diff --git a/pre_commit/repository.py b/pre_commit/repository.py index 748d84b5..a8be521d 100644 --- a/pre_commit/repository.py +++ b/pre_commit/repository.py @@ -64,7 +64,7 @@ class Repository(object): @cached_property def additional_dependencies(self): - dep_dict = defaultdict(lambda: defaultdict(set)) + dep_dict = defaultdict(lambda: defaultdict(_UniqueList)) for _, hook in self.hooks: dep_dict[hook['language']][hook['language_version']].update( hook.get('additional_dependencies', []), @@ -222,3 +222,14 @@ class LocalRepository(Repository): @cached_property def manifest(self): raise NotImplementedError + + +class _UniqueList(list): + def __init__(self): + self._set = set() + + def update(self, obj): + for item in obj: + if item not in self._set: + self._set.add(item) + self.append(item) diff --git a/tests/repository_test.py b/tests/repository_test.py index 9df33448..c0cd572b 100644 --- a/tests/repository_test.py +++ b/tests/repository_test.py @@ -477,7 +477,20 @@ def test_additional_dependencies(tempdir_factory, store): config = make_config_from_repo(path) config['hooks'][0]['additional_dependencies'] = ['pep8'] repo = Repository.create(config, store) - assert repo.additional_dependencies['python']['default'] == {'pep8'} + assert repo.additional_dependencies['python']['default'] == ['pep8'] + + +@pytest.mark.integration +def test_additional_dependencies_duplicated( + tempdir_factory, store, log_warning_mock, +): + path = make_repo(tempdir_factory, 'ruby_hooks_repo') + config = make_config_from_repo(path) + config['hooks'][0]['additional_dependencies'] = [ + 'thread_safe', 'tins', 'thread_safe'] + repo = Repository.create(config, store) + assert repo.additional_dependencies['ruby']['default'] == [ + 'thread_safe', 'tins'] @pytest.mark.integration @@ -517,12 +530,13 @@ def test_additional_ruby_dependencies_installed( ): # pragma: no cover (non-windows) path = make_repo(tempdir_factory, 'ruby_hooks_repo') config = make_config_from_repo(path) - config['hooks'][0]['additional_dependencies'] = ['thread_safe'] + config['hooks'][0]['additional_dependencies'] = ['thread_safe', 'tins'] 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 + assert 'tins' in output @skipif_slowtests_false