diff --git a/src/flake8/utils.py b/src/flake8/utils.py index 502e1ca..bdd7a0d 100644 --- a/src/flake8/utils.py +++ b/src/flake8/utils.py @@ -51,7 +51,7 @@ _Token = collections.namedtuple("Token", ("tp", "src")) _CODE, _FILE, _COLON, _COMMA, _WS = "code", "file", "colon", "comma", "ws" _EOF = "eof" _FILE_LIST_TOKEN_TYPES = [ - (re.compile(r"[A-Z][0-9]*"), _CODE), + (re.compile(r"[A-Z][0-9]*(?=$|\s|,)"), _CODE), (re.compile(r"[^\s:,]+"), _FILE), (re.compile(r"\s*:\s*"), _COLON), (re.compile(r"\s*,\s*"), _COMMA), diff --git a/tests/unit/test_utils.py b/tests/unit/test_utils.py index afd1b43..b0eac9a 100644 --- a/tests/unit/test_utils.py +++ b/tests/unit/test_utils.py @@ -72,10 +72,18 @@ def test_parse_comma_separated_list(value, expected): 'f.py:\n E,F\ng.py:\n G,H', [('f.py', ['E', 'F']), ('g.py', ['G', 'H'])], ), + # capitalized filenames are ok too + ( + 'F.py,G.py: F,G', + [('F.py', ['F', 'G']), ('G.py', ['F', 'G'])], + ), # it's easier to allow zero filenames or zero codes than forbid it (':E', []), ('f.py:', []), (':E f.py:F', [('f.py', ['F'])]), ('f.py: g.py:F', [('g.py', ['F'])]), + ('f.py:E:', []), + ('f.py:E.py:', []), + ('f.py:Eg.py:F', [('Eg.py', ['F'])]), # sequences are also valid (?) ( ['f.py:E,F', 'g.py:G,H'], @@ -96,10 +104,9 @@ def test_parse_files_to_codes_mapping(value, expected): # eof while looking for filenames 'f.py', 'f.py:E,g.py' # colon while looking for codes - 'f.py::', 'f.py:E:', - + 'f.py::', # no separator between - 'f.py:Eg.py:F', 'f.py:E1F1', + 'f.py:E1F1', ), ) def test_invalid_file_list(value):