| #!/usr/bin/env python |
| # Copyright 2006 Google, Inc. All Rights Reserved. |
| # Licensed to PSF under a Contributor Agreement. |
| |
| """Main program for testing the infrastructure.""" |
| |
| __author__ = "Guido van Rossum <[email protected]>" |
| |
| # Support imports (need to be imported first) |
| from . import support |
| |
| # Python imports |
| import os |
| import sys |
| import logging |
| |
| # Local imports |
| from .. import pytree |
| import pgen2 |
| from pgen2 import driver |
| |
| logging.basicConfig() |
| |
| def main(): |
| gr = driver.load_grammar("Grammar.txt") |
| dr = driver.Driver(gr, convert=pytree.convert) |
| |
| fn = "example.py" |
| tree = dr.parse_file(fn, debug=True) |
| if not diff(fn, tree): |
| print "No diffs." |
| if not sys.argv[1:]: |
| return # Pass a dummy argument to run the complete test suite below |
| |
| problems = [] |
| |
| # Process every imported module |
| for name in sys.modules: |
| mod = sys.modules[name] |
| if mod is None or not hasattr(mod, "__file__"): |
| continue |
| fn = mod.__file__ |
| if fn.endswith(".pyc"): |
| fn = fn[:-1] |
| if not fn.endswith(".py"): |
| continue |
| print >>sys.stderr, "Parsing", fn |
| tree = dr.parse_file(fn, debug=True) |
| if diff(fn, tree): |
| problems.append(fn) |
| |
| # Process every single module on sys.path (but not in packages) |
| for dir in sys.path: |
| try: |
| names = os.listdir(dir) |
| except os.error: |
| continue |
| print >>sys.stderr, "Scanning", dir, "..." |
| for name in names: |
| if not name.endswith(".py"): |
| continue |
| print >>sys.stderr, "Parsing", name |
| fn = os.path.join(dir, name) |
| try: |
| tree = dr.parse_file(fn, debug=True) |
| except pgen2.parse.ParseError, err: |
| print "ParseError:", err |
| else: |
| if diff(fn, tree): |
| problems.append(fn) |
| |
| # Show summary of problem files |
| if not problems: |
| print "No problems. Congratulations!" |
| else: |
| print "Problems in following files:" |
| for fn in problems: |
| print "***", fn |
| |
| def diff(fn, tree): |
| f = open("@", "w") |
| try: |
| f.write(str(tree)) |
| finally: |
| f.close() |
| try: |
| return os.system("diff -u %s @" % fn) |
| finally: |
| os.remove("@") |
| |
| if __name__ == "__main__": |
| main() |