#!/usr/bin/python

import compiler, sys
import os
import pyflakes


def check(codeString, filename):
    try:
        tree = compiler.parse(codeString)
    except (SyntaxError, IndentationError):
        value = sys.exc_info()[1]
        (lineno, offset, line) = value[1][1:]
        if line.endswith("\n"):
            line = line[:-1]
        print >> sys.stderr, 'could not compile %r:%d:' % (filename, lineno)
        print >> sys.stderr, line
        print >> sys.stderr, " " * (offset-2), "^"
    else:
        w = pyflakes.Checker(tree, filename)
        w.messages.sort(lambda a, b: cmp(a.lineno, b.lineno))
        for warning in w.messages:
            print warning


def checkPath(filename):
    return check(file(filename).read(), filename)

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'):
                        checkPath(os.path.join(dirpath, filename))
        else:
            checkPath(arg)
else:
    check(sys.stdin.read(), '<stdin>')


syntax highlighted by Code2HTML, v. 0.9.1