tests/filterpyflakes.py
author Yuya Nishihara <yuya@tcha.org>
Tue, 29 Apr 2014 12:54:01 +0900
changeset 21232 0768cda8b579
parent 19872 681f7b9213a4
child 21271 4adc090fa2fb
permissions -rwxr-xr-x
test-pyflakes: detect undefined name error It should be able to catch the following mistakes at 2606e7f227f6: mercurial/exchange.py:590: undefined name 'UnknownPartError' mercurial/match.py:346: undefined name 'pat' mercurial/win32.py:365: undefined name '_ERROR_NO_MORE_FILES' tests/killdaemons.py:46: undefined name 'check'

#!/usr/bin/env python

# Filter output by pyflakes to control which warnings we check

import sys, re, os

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)
    pats = [
            r"imported but unused",
            r"local variable '.*' is assigned to but never used",
            r"unable to detect undefined names",
            r"undefined name '.*'",
           ]
    for msgtype, pat in enumerate(pats):
        if re.search(pat, line):
            break # pattern matches
    else:
        continue # no pattern matched, next line
    fn = line.split(':', 1)[0]
    f = open(os.path.join(os.path.dirname(os.path.dirname(__file__)), fn))
    data = f.read()
    f.close()
    if 'no-' 'check-code' in data:
        continue
    lines.append((msgtype, line))

for msgtype, line in sorted(lines, key=makekey):
    sys.stdout.write(line)
print