Merge pull request #821 from pre-commit/allow_language_fail_check_useless_excludes

Exempt `language: fail` hooks from check-hooks-apply
This commit is contained in:
Anthony Sottile
2018-09-02 19:49:01 -07:00
committed by GitHub
3 changed files with 140 additions and 117 deletions

View File

@@ -15,7 +15,7 @@ def check_all_hooks_match_files(config_file):
for repo in repositories(load_config(config_file), Store()):
for hook_id, hook in repo.hooks:
if hook['always_run']:
if hook['always_run'] or hook['language'] == 'fail':
continue
include, exclude = hook['files'], hook['exclude']
filtered = _filter_by_include_exclude(files, include, exclude)

View File

@@ -1,5 +1,3 @@
from collections import OrderedDict
from pre_commit.meta_hooks import check_hooks_apply
from testing.fixtures import add_config_to_repo
from testing.fixtures import git_dir
@@ -7,17 +5,19 @@ from testing.util import cwd
def test_hook_excludes_everything(capsys, tempdir_factory, mock_store_dir):
config = OrderedDict((
('repo', 'meta'),
(
'hooks', (
OrderedDict((
('id', 'check-useless-excludes'),
('exclude', '.pre-commit-config.yaml'),
)),
),
),
))
config = {
'repos': [
{
'repo': 'meta',
'hooks': [
{
'id': 'check-useless-excludes',
'exclude': '.pre-commit-config.yaml',
},
],
},
],
}
repo = git_dir(tempdir_factory)
add_config_to_repo(repo, config)
@@ -30,17 +30,19 @@ def test_hook_excludes_everything(capsys, tempdir_factory, mock_store_dir):
def test_hook_includes_nothing(capsys, tempdir_factory, mock_store_dir):
config = OrderedDict((
('repo', 'meta'),
(
'hooks', (
OrderedDict((
('id', 'check-useless-excludes'),
('files', 'foo'),
)),
),
),
))
config = {
'repos': [
{
'repo': 'meta',
'hooks': [
{
'id': 'check-useless-excludes',
'files': 'foo',
},
],
},
],
}
repo = git_dir(tempdir_factory)
add_config_to_repo(repo, config)
@@ -53,17 +55,19 @@ def test_hook_includes_nothing(capsys, tempdir_factory, mock_store_dir):
def test_hook_types_not_matched(capsys, tempdir_factory, mock_store_dir):
config = OrderedDict((
('repo', 'meta'),
(
'hooks', (
OrderedDict((
('id', 'check-useless-excludes'),
('types', ['python']),
)),
),
),
))
config = {
'repos': [
{
'repo': 'meta',
'hooks': [
{
'id': 'check-useless-excludes',
'types': ['python'],
},
],
},
],
}
repo = git_dir(tempdir_factory)
add_config_to_repo(repo, config)
@@ -78,17 +82,19 @@ def test_hook_types_not_matched(capsys, tempdir_factory, mock_store_dir):
def test_hook_types_excludes_everything(
capsys, tempdir_factory, mock_store_dir,
):
config = OrderedDict((
('repo', 'meta'),
(
'hooks', (
OrderedDict((
('id', 'check-useless-excludes'),
('exclude_types', ['yaml']),
)),
),
),
))
config = {
'repos': [
{
'repo': 'meta',
'hooks': [
{
'id': 'check-useless-excludes',
'exclude_types': ['yaml'],
},
],
},
],
}
repo = git_dir(tempdir_factory)
add_config_to_repo(repo, config)
@@ -100,23 +106,51 @@ def test_hook_types_excludes_everything(
assert 'check-useless-excludes does not apply to this repository' in out
def test_valid_includes(capsys, tempdir_factory, mock_store_dir):
config = OrderedDict((
('repo', 'meta'),
(
'hooks', (
OrderedDict((
('id', 'check-useless-excludes'),
)),
# Should not be reported as an error due to always_run
OrderedDict((
('id', 'check-useless-excludes'),
('files', '^$'),
('always_run', True),
)),
),
),
))
def test_valid_always_run(capsys, tempdir_factory, mock_store_dir):
config = {
'repos': [
{
'repo': 'meta',
'hooks': [
# Should not be reported as an error due to always_run
{
'id': 'check-useless-excludes',
'files': '^$',
'always_run': True,
},
],
},
],
}
repo = git_dir(tempdir_factory)
add_config_to_repo(repo, config)
with cwd(repo):
assert check_hooks_apply.main(()) == 0
out, _ = capsys.readouterr()
assert out == ''
def test_valid_language_fail(capsys, tempdir_factory, mock_store_dir):
config = {
'repos': [
{
'repo': 'local',
'hooks': [
# Should not be reported as an error due to language: fail
{
'id': 'changelogs-rst',
'name': 'changelogs must be rst',
'entry': 'changelog filenames must end in .rst',
'language': 'fail',
'files': r'changelog/.*(?<!\.rst)$',
},
],
},
],
}
repo = git_dir(tempdir_factory)
add_config_to_repo(repo, config)

View File

@@ -1,5 +1,3 @@
from collections import OrderedDict
from pre_commit.meta_hooks import check_useless_excludes
from testing.fixtures import add_config_to_repo
from testing.fixtures import git_dir
@@ -7,23 +5,15 @@ from testing.util import cwd
def test_useless_exclude_global(capsys, tempdir_factory):
config = OrderedDict((
('exclude', 'foo'),
(
'repos', [
OrderedDict((
('repo', 'meta'),
(
'hooks', (
OrderedDict((
('id', 'check-useless-excludes'),
)),
),
),
)),
],
),
))
config = {
'exclude': 'foo',
'repos': [
{
'repo': 'meta',
'hooks': [{'id': 'check-useless-excludes'}],
},
],
}
repo = git_dir(tempdir_factory)
add_config_to_repo(repo, config)
@@ -32,21 +22,19 @@ def test_useless_exclude_global(capsys, tempdir_factory):
assert check_useless_excludes.main(()) == 1
out, _ = capsys.readouterr()
assert "The global exclude pattern 'foo' does not match any files" in out
out = out.strip()
assert "The global exclude pattern 'foo' does not match any files" == out
def test_useless_exclude_for_hook(capsys, tempdir_factory):
config = OrderedDict((
('repo', 'meta'),
(
'hooks', (
OrderedDict((
('id', 'check-useless-excludes'),
('exclude', 'foo'),
)),
),
),
))
config = {
'repos': [
{
'repo': 'meta',
'hooks': [{'id': 'check-useless-excludes', 'exclude': 'foo'}],
},
],
}
repo = git_dir(tempdir_factory)
add_config_to_repo(repo, config)
@@ -55,24 +43,23 @@ def test_useless_exclude_for_hook(capsys, tempdir_factory):
assert check_useless_excludes.main(()) == 1
out, _ = capsys.readouterr()
out = out.strip()
expected = (
"The exclude pattern 'foo' for check-useless-excludes "
"does not match any files"
)
assert expected in out
assert expected == out
def test_no_excludes(capsys, tempdir_factory):
config = OrderedDict((
('repo', 'meta'),
(
'hooks', (
OrderedDict((
('id', 'check-useless-excludes'),
)),
),
),
))
config = {
'repos': [
{
'repo': 'meta',
'hooks': [{'id': 'check-useless-excludes'}],
},
],
}
repo = git_dir(tempdir_factory)
add_config_to_repo(repo, config)
@@ -85,17 +72,19 @@ def test_no_excludes(capsys, tempdir_factory):
def test_valid_exclude(capsys, tempdir_factory):
config = OrderedDict((
('repo', 'meta'),
(
'hooks', (
OrderedDict((
('id', 'check-useless-excludes'),
('exclude', '.pre-commit-config.yaml'),
)),
),
),
))
config = {
'repos': [
{
'repo': 'meta',
'hooks': [
{
'id': 'check-useless-excludes',
'exclude': '.pre-commit-config.yaml',
},
],
},
],
}
repo = git_dir(tempdir_factory)
add_config_to_repo(repo, config)