python (3.12.0)
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@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 lib2to3 import pytree
21 from lib2to3 import pgen2
22 from lib2to3.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()