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.
--- 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)
--- 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'