diff --git a/tests/filterpyflakes.py b/tests/filterpyflakes.py --- a/tests/filterpyflakes.py +++ b/tests/filterpyflakes.py @@ -4,35 +4,48 @@ import sys, re, os -def makekey(message): - # "path/file:line: message" - match = re.search(r"(line \d+)", message) - line = '' - if match: - line = match.group(0) - message = re.sub(r"(line \d+)", '', message) - return re.sub(r"([^:]*):([^:]+):([^']*)('[^']*')(.*)$", - r'\3:\5:\4:\1:\2:' + line, - message) +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 + # 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", ] - if not re.search('|'.join(pats), line): - continue + 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(line) + lines.append((msgtype, line)) -for line in sorted(lines, key = makekey): +for msgtype, line in sorted(lines, key = makekey): sys.stdout.write(line) print