Patchwork [2,of,2,v2] filterpyflakes: dramatically simplify the entire thing by blacklisting

login
register
mail settings
Submitter Augie Fackler
Date Nov. 16, 2016, 5:09 p.m.
Message ID <a183bab5ddff03c64f45.1479316194@augie-macbookair2.roam.corp.google.com>
Download mbox | patch
Permalink /patch/17601/
State Accepted
Headers show

Comments

Augie Fackler - Nov. 16, 2016, 5:09 p.m.
# HG changeset patch
# User Augie Fackler <augie@google.com>
# Date 1478814582 18000
#      Thu Nov 10 16:49:42 2016 -0500
# Node ID a183bab5ddff03c64f45b9785426e89cb8d3c8f2
# Parent  8aade97c1674716721a4b448385c56bb3b904a92
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.

Patch

diff --git a/tests/filterpyflakes.py b/tests/filterpyflakes.py
--- a/tests/filterpyflakes.py
+++ b/tests/filterpyflakes.py
@@ -7,56 +7,33 @@  from __future__ import absolute_import, 
 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 --git a/tests/test-check-pyflakes.t b/tests/test-check-pyflakes.t
--- a/tests/test-check-pyflakes.t
+++ b/tests/test-check-pyflakes.t
@@ -10,6 +10,6 @@  run pyflakes on all tracked files ending
   > -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'