# HG changeset patch # User Augie Fackler # Date 1478814582 18000 # Node ID 21772a6a7861bc312b1ba862334d105e56b38d07 # Parent 270b077d434ba4888bf693c7230179150e9c2b6c filterpyflakes: dramatically simplify the entire thing by blacklisting We've only got one kind of pyflakes failure left in our codebase, so it's time to switch over to a blacklist-based checking scheme. I've left in the filtering of two undefined names for now out of paranoia, but those can probably go too. diff -r 270b077d434b -r 21772a6a7861 tests/filterpyflakes.py --- a/tests/filterpyflakes.py Thu Nov 10 16:07:24 2016 -0500 +++ b/tests/filterpyflakes.py Thu Nov 10 16:49:42 2016 -0500 @@ -7,56 +7,33 @@ import re import sys -def makekey(typeandline): - """ - for sorting lines by: msgtype, path/to/file, lineno, message - - typeandline is a sequence of a message type and the entire message line - the message line format is path/to/file:line: message - - >>> makekey((3, 'example.py:36: any message')) - (3, 'example.py', 36, ' any message') - >>> makekey((7, 'path/to/file.py:68: dummy message')) - (7, 'path/to/file.py', 68, ' dummy message') - >>> makekey((2, 'fn:88: m')) > makekey((2, 'fn:9: m')) - True - """ - - msgtype, line = typeandline - fname, line, message = line.split(":", 2) - # line as int for ordering 9 before 88 - return msgtype, fname, int(line), message - - lines = [] for line in sys.stdin: - # We whitelist tests (see more messages in pyflakes.messages) + # We blacklist tests that are too noisy for us pats = [ - (r"imported but unused", None), - (r"local variable '.*' is assigned to but never used", None), - (r"unable to detect undefined names", None), - (r"undefined name '.*'", - r"undefined name '(WindowsError|memoryview)'"), - ("list comprehension", None), - ] + r"undefined name '(WindowsError|memoryview)'", + r"redefinition of unused '[^']+' from line", + ] - for msgtype, (pat, excl) in enumerate(pats): - if re.search(pat, line) and (not excl or not re.search(excl, line)): + keep = True + for pat in pats: + if re.search(pat, line): + keep = False break # pattern matches - else: - continue # no pattern matched, next line - fn = line.split(':', 1)[0] - f = open(fn) - data = f.read() - f.close() - if 'no-' 'check-code' in data: - continue - lines.append((msgtype, line)) + if keep: + fn = line.split(':', 1)[0] + f = open(fn) + data = f.read() + f.close() + if 'no-' 'check-code' in data: + continue + lines.append(line) -for msgtype, line in sorted(lines, key=makekey): +for line in lines: sys.stdout.write(line) print() # self test of "undefined name" detection for other than 'memoryview' if False: + print(memoryview) print(undefinedname) diff -r 270b077d434b -r 21772a6a7861 tests/test-check-pyflakes.t --- a/tests/test-check-pyflakes.t Thu Nov 10 16:07:24 2016 -0500 +++ b/tests/test-check-pyflakes.t Thu Nov 10 16:49:42 2016 -0500 @@ -10,6 +10,6 @@ > -X mercurial/pycompat.py \ > 2>/dev/null \ > | xargs pyflakes 2>/dev/null | "$TESTDIR/filterpyflakes.py" - tests/filterpyflakes.py:62: undefined name 'undefinedname' + tests/filterpyflakes.py:39: undefined name 'undefinedname'