17db96d56Sopenharmony_ci#!/usr/bin/env python3 27db96d56Sopenharmony_ci# Copyright 2006 Google, Inc. All Rights Reserved. 37db96d56Sopenharmony_ci# Licensed to PSF under a Contributor Agreement. 47db96d56Sopenharmony_ci 57db96d56Sopenharmony_ci"""Main program for testing the infrastructure.""" 67db96d56Sopenharmony_ci 77db96d56Sopenharmony_cifrom __future__ import print_function 87db96d56Sopenharmony_ci 97db96d56Sopenharmony_ci__author__ = "Guido van Rossum <guido@python.org>" 107db96d56Sopenharmony_ci 117db96d56Sopenharmony_ci# Support imports (need to be imported first) 127db96d56Sopenharmony_cifrom . import support 137db96d56Sopenharmony_ci 147db96d56Sopenharmony_ci# Python imports 157db96d56Sopenharmony_ciimport os 167db96d56Sopenharmony_ciimport sys 177db96d56Sopenharmony_ciimport logging 187db96d56Sopenharmony_ci 197db96d56Sopenharmony_ci# Local imports 207db96d56Sopenharmony_cifrom .. import pytree 217db96d56Sopenharmony_cifrom .. import pgen2 227db96d56Sopenharmony_cifrom ..pgen2 import driver 237db96d56Sopenharmony_ci 247db96d56Sopenharmony_cilogging.basicConfig() 257db96d56Sopenharmony_ci 267db96d56Sopenharmony_cidef main(): 277db96d56Sopenharmony_ci gr = driver.load_grammar("Grammar.txt") 287db96d56Sopenharmony_ci dr = driver.Driver(gr, convert=pytree.convert) 297db96d56Sopenharmony_ci 307db96d56Sopenharmony_ci fn = "example.py" 317db96d56Sopenharmony_ci tree = dr.parse_file(fn, debug=True) 327db96d56Sopenharmony_ci if not diff(fn, tree): 337db96d56Sopenharmony_ci print("No diffs.") 347db96d56Sopenharmony_ci if not sys.argv[1:]: 357db96d56Sopenharmony_ci return # Pass a dummy argument to run the complete test suite below 367db96d56Sopenharmony_ci 377db96d56Sopenharmony_ci problems = [] 387db96d56Sopenharmony_ci 397db96d56Sopenharmony_ci # Process every imported module 407db96d56Sopenharmony_ci for name in sys.modules: 417db96d56Sopenharmony_ci mod = sys.modules[name] 427db96d56Sopenharmony_ci if mod is None or not hasattr(mod, "__file__"): 437db96d56Sopenharmony_ci continue 447db96d56Sopenharmony_ci fn = mod.__file__ 457db96d56Sopenharmony_ci if fn.endswith(".pyc"): 467db96d56Sopenharmony_ci fn = fn[:-1] 477db96d56Sopenharmony_ci if not fn.endswith(".py"): 487db96d56Sopenharmony_ci continue 497db96d56Sopenharmony_ci print("Parsing", fn, file=sys.stderr) 507db96d56Sopenharmony_ci tree = dr.parse_file(fn, debug=True) 517db96d56Sopenharmony_ci if diff(fn, tree): 527db96d56Sopenharmony_ci problems.append(fn) 537db96d56Sopenharmony_ci 547db96d56Sopenharmony_ci # Process every single module on sys.path (but not in packages) 557db96d56Sopenharmony_ci for dir in sys.path: 567db96d56Sopenharmony_ci try: 577db96d56Sopenharmony_ci names = os.listdir(dir) 587db96d56Sopenharmony_ci except OSError: 597db96d56Sopenharmony_ci continue 607db96d56Sopenharmony_ci print("Scanning", dir, "...", file=sys.stderr) 617db96d56Sopenharmony_ci for name in names: 627db96d56Sopenharmony_ci if not name.endswith(".py"): 637db96d56Sopenharmony_ci continue 647db96d56Sopenharmony_ci print("Parsing", name, file=sys.stderr) 657db96d56Sopenharmony_ci fn = os.path.join(dir, name) 667db96d56Sopenharmony_ci try: 677db96d56Sopenharmony_ci tree = dr.parse_file(fn, debug=True) 687db96d56Sopenharmony_ci except pgen2.parse.ParseError as err: 697db96d56Sopenharmony_ci print("ParseError:", err) 707db96d56Sopenharmony_ci else: 717db96d56Sopenharmony_ci if diff(fn, tree): 727db96d56Sopenharmony_ci problems.append(fn) 737db96d56Sopenharmony_ci 747db96d56Sopenharmony_ci # Show summary of problem files 757db96d56Sopenharmony_ci if not problems: 767db96d56Sopenharmony_ci print("No problems. Congratulations!") 777db96d56Sopenharmony_ci else: 787db96d56Sopenharmony_ci print("Problems in following files:") 797db96d56Sopenharmony_ci for fn in problems: 807db96d56Sopenharmony_ci print("***", fn) 817db96d56Sopenharmony_ci 827db96d56Sopenharmony_cidef diff(fn, tree): 837db96d56Sopenharmony_ci f = open("@", "w") 847db96d56Sopenharmony_ci try: 857db96d56Sopenharmony_ci f.write(str(tree)) 867db96d56Sopenharmony_ci finally: 877db96d56Sopenharmony_ci f.close() 887db96d56Sopenharmony_ci try: 897db96d56Sopenharmony_ci return os.system("diff -u %s @" % fn) 907db96d56Sopenharmony_ci finally: 917db96d56Sopenharmony_ci os.remove("@") 927db96d56Sopenharmony_ci 937db96d56Sopenharmony_ciif __name__ == "__main__": 947db96d56Sopenharmony_ci main() 95