summaryrefslogtreecommitdiff
path: root/pyflakes/scripts
diff options
context:
space:
mode:
authorexarkun <exarkun>2008-08-28 14:33:07 +0000
committerexarkun <exarkun>2008-08-28 14:33:07 +0000
commit0ccef85c950c91712e6126339ff7b0535f1d5708 (patch)
tree2180db36e01ba2c2e95765e4e36b549076e193ee /pyflakes/scripts
parent1cd653d38b521d1e8ea10410830cf29683a8c09f (diff)
downloadpyflakes-0ccef85c950c91712e6126339ff7b0535f1d5708.tar.gz
Merge pyflakes-trailing-whitespace-2663
Author: exarkun Reviewer: pjd Fixes: #2663 Work-around a strangeness in the Python compiler which caused failures on source with trailing whitespace but no trailing newline (by adding a trailing newline). Also, re-organize for the command line `pyflakes` tool into a real module so that it can be properly unit tested.
Diffstat (limited to 'pyflakes/scripts')
-rw-r--r--pyflakes/scripts/__init__.py0
-rw-r--r--pyflakes/scripts/pyflakes.py55
2 files changed, 55 insertions, 0 deletions
diff --git a/pyflakes/scripts/__init__.py b/pyflakes/scripts/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/pyflakes/scripts/__init__.py
diff --git a/pyflakes/scripts/pyflakes.py b/pyflakes/scripts/pyflakes.py
new file mode 100644
index 0000000..4d5c46c
--- /dev/null
+++ b/pyflakes/scripts/pyflakes.py
@@ -0,0 +1,55 @@
+
+"""
+Implementation of the command-line I{pyflakes} tool.
+"""
+
+import compiler, sys
+import os
+
+checker = __import__('pyflakes.checker').checker
+
+def check(codeString, filename):
+ try:
+ tree = compiler.parse(codeString)
+ except (SyntaxError, IndentationError):
+ value = sys.exc_info()[1]
+ try:
+ (lineno, offset, line) = value[1][1:]
+ except IndexError:
+ print >> sys.stderr, 'could not compile %r' % (filename,)
+ return 1
+ if line.endswith("\n"):
+ line = line[:-1]
+ print >> sys.stderr, '%s:%d: could not compile' % (filename, lineno)
+ print >> sys.stderr, line
+ print >> sys.stderr, " " * (offset-2), "^"
+ return 1
+ else:
+ w = checker.Checker(tree, filename)
+ w.messages.sort(lambda a, b: cmp(a.lineno, b.lineno))
+ for warning in w.messages:
+ print warning
+ return len(w.messages)
+
+
+def checkPath(filename):
+ if os.path.exists(filename):
+ return check(file(filename, 'U').read() + '\n', filename)
+
+
+def main():
+ warnings = 0
+ args = sys.argv[1:]
+ if args:
+ for arg in args:
+ if os.path.isdir(arg):
+ for dirpath, dirnames, filenames in os.walk(arg):
+ for filename in filenames:
+ if filename.endswith('.py'):
+ warnings += checkPath(os.path.join(dirpath, filename))
+ else:
+ warnings += checkPath(arg)
+ else:
+ warnings += check(sys.stdin.read(), '<stdin>')
+
+ raise SystemExit(warnings > 0)