Permalink
Browse files

ignore pyflakes errors via #pyflakes:ignore comment

  • Loading branch information...
jtriley committed May 16, 2012
1 parent 985a621 commit d823c67789cb4f5725d174c15bf889fc7b35c8a7
Showing with 69 additions and 2 deletions.
  1. +69 −2 check.py
View
@@ -1,12 +1,13 @@
#!/usr/bin/env python
import os
import re
+import ast
import sys
import glob
import subprocess
import pep8
-from pyflakes.scripts import pyflakes
+from pyflakes import checker
CHECKS = [
@@ -23,6 +24,72 @@
]
+def check(codeString, filename):
+ """
+ Check the Python source given by C{codeString} for flakes.
+
+ @param codeString: The Python source to check.
+ @type codeString: C{str}
+
+ @param filename: The name of the file the source came from, used to report
+ errors.
+ @type filename: C{str}
+
+ @return: The number of warnings emitted.
+ @rtype: C{int}
+ """
+ # First, compile into an AST and handle syntax errors.
+ try:
+ tree = compile(codeString, filename, "exec", ast.PyCF_ONLY_AST)
+ except SyntaxError, value:
+ msg = value.args[0]
+
+ (lineno, offset, text) = value.lineno, value.offset, value.text
+
+ # If there's an encoding problem with the file, the text is None.
+ if text is None:
+ # Avoid using msg, since for the only known case, it contains a
+ # bogus message that claims the encoding the file declared was
+ # unknown.
+ print >> sys.stderr, "%s: problem decoding source" % (filename, )
+ else:
+ line = text.splitlines()[-1]
+
+ if offset is not None:
+ offset = offset - (len(text) - len(line))
+
+ print >> sys.stderr, '%s:%d: %s' % (filename, lineno, msg)
+ print >> sys.stderr, line
+
+ if offset is not None:
+ print >> sys.stderr, " " * offset, "^"
+
+ return 1
+ else:
+ # Okay, it's syntactically valid. Now check it.
+ w = checker.Checker(tree, filename)
+ lines = codeString.split('\n')
+ messages = [message for message in w.messages
+ if lines[message.lineno - 1].find('pyflakes:ignore') < 0]
+ messages.sort(lambda a, b: cmp(a.lineno, b.lineno))
+ for warning in messages:
+ print warning
+ return len(messages)
+
+
+def checkPath(filename):
+ """
+ Check the given path, printing out any warnings detected.
+
+ @return: the number of warnings printed
+ """
+ try:
+ return check(file(filename, 'U').read() + '\n', filename)
+ except IOError, msg:
+ print >> sys.stderr, "%s: %s" % (filename, msg.args[1])
+ return 1
+
+
def matches_file(file_name, match_files):
return any(re.compile(match_file).match(file_name) for match_file in
match_files)
@@ -70,7 +137,7 @@ def check_pyflakes(files):
print(">>> Running pyflakes...")
clean = True
for pyfile in files:
- if pyflakes.checkPath(pyfile) != 0:
+ if checkPath(pyfile) != 0:
clean = False
if not clean:
raise Exception("ERROR: pyflakes failed on some source files")

0 comments on commit d823c67

Please sign in to comment.