Add tests for _filter_by_types

Adds a test for python and bash `types` using identify per interpreter
interpretation.

The python test succeeds with a false positive. The bash test identifies
the bug, where a comparison happens between `tags >= types`.

Tags is the tag list from identify, types is the value passed in from
configuration file as `acceptable types`.

The `tags(List) >= types(FrozenSet)` does a sort comparison of the two sequences
as evidenced by this code sample (which should return True):

```
>>> types = frozenset(['a'])
>>> tags = ['bash']
>>> tags >= types
True
```

Note: In 2.7, I cannot get this to return anything other than True.
Including the empty case:
```
>>> [] > frozenset()
True
```

Which means to me that a list is always >= a frozenset in Python 2.7.

In Python 3.5, I see errors when comparing a List to a FrozenSet. So
thankfully the interpreter is stricter in this case.

```
>>> [] >= frozenset()
TypeError: unorderable types: list() >= frozenset()
```
This commit is contained in:
Zander Hill 2018-05-03 11:46:07 +01:00
parent a9b3ff4d77
commit 29d66f470d
2 changed files with 20 additions and 2 deletions

View file

@ -48,11 +48,14 @@ def _filter_by_include_exclude(filenames, include, exclude):
} }
def _filter_by_types(filenames, types, exclude_types): def _filter_by_types(filenames,
types,
exclude_types,
get_tags=tags_from_path):
types, exclude_types = frozenset(types), frozenset(exclude_types) types, exclude_types = frozenset(types), frozenset(exclude_types)
ret = [] ret = []
for filename in filenames: for filename in filenames:
tags = tags_from_path(filename) tags = get_tags(filename)
if tags >= types and not tags & exclude_types: if tags >= types and not tags & exclude_types:
ret.append(filename) ret.append(filename)
return tuple(ret) return tuple(ret)

View file

@ -9,12 +9,14 @@ from collections import OrderedDict
import pytest import pytest
from identify.identify import tags_from_interpreter
import pre_commit.constants as C import pre_commit.constants as C
from pre_commit.commands.install_uninstall import install from pre_commit.commands.install_uninstall import install
from pre_commit.commands.run import _compute_cols from pre_commit.commands.run import _compute_cols
from pre_commit.commands.run import _filter_by_include_exclude from pre_commit.commands.run import _filter_by_include_exclude
from pre_commit.commands.run import _get_skips from pre_commit.commands.run import _get_skips
from pre_commit.commands.run import _has_unmerged_paths from pre_commit.commands.run import _has_unmerged_paths
from pre_commit.commands.run import _filter_by_types
from pre_commit.commands.run import run from pre_commit.commands.run import run
from pre_commit.runner import Runner from pre_commit.runner import Runner
from pre_commit.util import cmd_output from pre_commit.util import cmd_output
@ -831,3 +833,16 @@ def test_include_exclude_does_search_instead_of_match(some_filenames):
def test_include_exclude_exclude_removes_files(some_filenames): def test_include_exclude_exclude_removes_files(some_filenames):
ret = _filter_by_include_exclude(some_filenames, '', r'\.py$') ret = _filter_by_include_exclude(some_filenames, '', r'\.py$')
assert ret == {'.pre-commit-hooks.yaml'} assert ret == {'.pre-commit-hooks.yaml'}
def get_tags_stub(interpreter):
return lambda x: tags_from_interpreter(interpreter)
@pytest.mark.current
def test_filter_by_types_for_bash_by_interpreter():
ret = _filter_by_types(['bash_script'], ['shell', 'sh', 'bash'], [], get_tags=get_tags_stub('bash'))
assert ret == ('bash_script',)
@pytest.mark.current
def test_filter_by_types_for_python_by_interpreter():
ret = _filter_by_types(['script.py'], ['python'], [], get_tags=get_tags_stub('python'))
assert ret == ('script.py',)