| #!/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 <guido@python.org>" | |
| # 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() |