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