1#!/usr/bin/env python 2# Copyright 2006 Google, Inc. All Rights Reserved. 3# Licensed to PSF under a Contributor Agreement. 4 5"""Main program for testing the infrastructure.""" 6 7__author__ = "Guido van Rossum <guido@python.org>" 8 9# Support imports (need to be imported first) 10from . import support 11 12# Python imports 13import os 14import sys 15import logging 16 17# Local imports 18from .. import pytree 19import pgen2 20from pgen2 import driver 21 22logging.basicConfig() 23 24def main(): 25 gr = driver.load_grammar("Grammar.txt") 26 dr = driver.Driver(gr, convert=pytree.convert) 27 28 fn = "example.py" 29 tree = dr.parse_file(fn, debug=True) 30 if not diff(fn, tree): 31 print "No diffs." 32 if not sys.argv[1:]: 33 return # Pass a dummy argument to run the complete test suite below 34 35 problems = [] 36 37 # Process every imported module 38 for name in sys.modules: 39 mod = sys.modules[name] 40 if mod is None or not hasattr(mod, "__file__"): 41 continue 42 fn = mod.__file__ 43 if fn.endswith(".pyc"): 44 fn = fn[:-1] 45 if not fn.endswith(".py"): 46 continue 47 print >>sys.stderr, "Parsing", fn 48 tree = dr.parse_file(fn, debug=True) 49 if diff(fn, tree): 50 problems.append(fn) 51 52 # Process every single module on sys.path (but not in packages) 53 for dir in sys.path: 54 try: 55 names = os.listdir(dir) 56 except os.error: 57 continue 58 print >>sys.stderr, "Scanning", dir, "..." 59 for name in names: 60 if not name.endswith(".py"): 61 continue 62 print >>sys.stderr, "Parsing", name 63 fn = os.path.join(dir, name) 64 try: 65 tree = dr.parse_file(fn, debug=True) 66 except pgen2.parse.ParseError, err: 67 print "ParseError:", err 68 else: 69 if diff(fn, tree): 70 problems.append(fn) 71 72 # Show summary of problem files 73 if not problems: 74 print "No problems. Congratulations!" 75 else: 76 print "Problems in following files:" 77 for fn in problems: 78 print "***", fn 79 80def diff(fn, tree): 81 f = open("@", "w") 82 try: 83 f.write(str(tree)) 84 finally: 85 f.close() 86 try: 87 return os.system("diff -u %s @" % fn) 88 finally: 89 os.remove("@") 90 91if __name__ == "__main__": 92 main() 93