Improve error message for malformed per-file-ignores

This commit is contained in:
Anthony Sottile 2019-01-30 19:33:27 -08:00
parent cfe9e92999
commit f955a98b71
3 changed files with 48 additions and 3 deletions

View file

@ -12,6 +12,8 @@ from typing import Callable, Dict, Generator # noqa: F401 (until flake8 3.7)
from typing import List, Pattern, Sequence # noqa: F401 (until flake8 3,7) from typing import List, Pattern, Sequence # noqa: F401 (until flake8 3,7)
from typing import Tuple, Union # noqa: F401 (until flake8 3.7) from typing import Tuple, Union # noqa: F401 (until flake8 3.7)
from flake8 import exceptions
if False: # `typing.TYPE_CHECKING` was introduced in 3.5.2 if False: # `typing.TYPE_CHECKING` was introduced in 3.5.2
from flake8.plugins.manager import Plugin # noqa: F401 (until flake8 3.7) from flake8.plugins.manager import Plugin # noqa: F401 (until flake8 3.7)
@ -109,6 +111,21 @@ def parse_files_to_codes_mapping(value): # noqa: C901
State.filenames = [] State.filenames = []
State.codes = [] State.codes = []
def _unexpected_token():
# type: () -> exceptions.ExecutionError
def _indent(s):
# type: (str) -> str
return " " + s.strip().replace("\n", "\n ")
return exceptions.ExecutionError(
"Expected `per-file-ignores` to be a mapping from file exclude "
"patterns to ignore codes.\n\n"
"Configured `per-file-ignores` setting:\n\n{}".format(
_indent(value)
)
)
for token in _tokenize_files_to_codes_mapping(value): for token in _tokenize_files_to_codes_mapping(value):
# legal in any state: separator sets the sep bit # legal in any state: separator sets the sep bit
if token.tp in {_COMMA, _WS}: if token.tp in {_COMMA, _WS}:
@ -122,7 +139,7 @@ def parse_files_to_codes_mapping(value): # noqa: C901
State.filenames.append(token.src) State.filenames.append(token.src)
State.seen_sep = False State.seen_sep = False
else: else:
raise ValueError("Unexpected token: {}".format(token)) raise _unexpected_token()
# looking for codes # looking for codes
else: else:
if token.tp == _EOF: if token.tp == _EOF:
@ -135,7 +152,7 @@ def parse_files_to_codes_mapping(value): # noqa: C901
State.filenames.append(token.src) State.filenames.append(token.src)
State.seen_sep = False State.seen_sep = False
else: else:
raise ValueError("Unexpected token: {}".format(token)) raise _unexpected_token()
return ret return ret

View file

@ -58,3 +58,30 @@ t.py:2:1: F401 'sys' imported but unused
2 F401 'os' imported but unused 2 F401 'os' imported but unused
''' '''
assert err == '' assert err == ''
def test_malformed_per_file_ignores_error(tmpdir, capsys):
"""Test the error message for malformed `per-file-ignores`."""
setup_cfg = '''\
[flake8]
per-file-ignores =
incorrect/*
values/*
'''
with tmpdir.as_cwd():
tmpdir.join('setup.cfg').write(setup_cfg)
app = application.Application()
app.run(['.'])
out, err = capsys.readouterr()
assert out == '''\
There was a critical error during execution of Flake8:
Expected `per-file-ignores` to be a mapping from file exclude patterns to ignore codes.
Configured `per-file-ignores` setting:
incorrect/*
values/*
''' # noqa: E501

View file

@ -4,6 +4,7 @@ import os
import mock import mock
import pytest import pytest
from flake8 import exceptions
from flake8 import utils from flake8 import utils
from flake8.plugins import manager as plugin_manager from flake8.plugins import manager as plugin_manager
@ -111,7 +112,7 @@ def test_parse_files_to_codes_mapping(value, expected):
) )
def test_invalid_file_list(value): def test_invalid_file_list(value):
"""Test parsing of invalid files-to-codes mappings.""" """Test parsing of invalid files-to-codes mappings."""
with pytest.raises(ValueError): with pytest.raises(exceptions.ExecutionError):
utils.parse_files_to_codes_mapping(value) utils.parse_files_to_codes_mapping(value)