| 
									
										
										
										
											2010-03-11 22:53:45 +00:00
										 |  |  | #!/usr/bin/env python3 | 
					
						
							| 
									
										
										
										
											2008-03-19 05:04:44 +00:00
										 |  |  | # Copyright 2006 Google, Inc. All Rights Reserved. | 
					
						
							|  |  |  | # Licensed to PSF under a Contributor Agreement. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | """Main program for testing the infrastructure.""" | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-10-29 12:24:59 -05:00
										 |  |  | from __future__ import print_function | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-03-19 05:04:44 +00:00
										 |  |  | __author__ = "Guido van Rossum <guido@python.org>" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # Support imports (need to be imported first) | 
					
						
							| 
									
										
										
										
											2008-03-24 00:50:58 +00:00
										 |  |  | from . import support | 
					
						
							| 
									
										
										
										
											2008-03-19 05:04:44 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | # 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): | 
					
						
							| 
									
										
										
										
											2008-03-19 05:33:36 +00:00
										 |  |  |         print("No diffs.") | 
					
						
							| 
									
										
										
										
											2008-03-19 05:04:44 +00:00
										 |  |  |     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 | 
					
						
							| 
									
										
										
										
											2008-03-19 05:33:36 +00:00
										 |  |  |         print("Parsing", fn, file=sys.stderr) | 
					
						
							| 
									
										
										
										
											2008-03-19 05:04:44 +00:00
										 |  |  |         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) | 
					
						
							| 
									
										
										
										
											2012-12-18 22:02:39 +02:00
										 |  |  |         except OSError: | 
					
						
							| 
									
										
										
										
											2008-03-19 05:04:44 +00:00
										 |  |  |             continue | 
					
						
							| 
									
										
										
										
											2008-03-19 05:33:36 +00:00
										 |  |  |         print("Scanning", dir, "...", file=sys.stderr) | 
					
						
							| 
									
										
										
										
											2008-03-19 05:04:44 +00:00
										 |  |  |         for name in names: | 
					
						
							|  |  |  |             if not name.endswith(".py"): | 
					
						
							|  |  |  |                 continue | 
					
						
							| 
									
										
										
										
											2008-03-19 05:33:36 +00:00
										 |  |  |             print("Parsing", name, file=sys.stderr) | 
					
						
							| 
									
										
										
										
											2008-03-19 05:04:44 +00:00
										 |  |  |             fn = os.path.join(dir, name) | 
					
						
							|  |  |  |             try: | 
					
						
							|  |  |  |                 tree = dr.parse_file(fn, debug=True) | 
					
						
							| 
									
										
										
										
											2008-03-19 05:33:36 +00:00
										 |  |  |             except pgen2.parse.ParseError as err: | 
					
						
							|  |  |  |                 print("ParseError:", err) | 
					
						
							| 
									
										
										
										
											2008-03-19 05:04:44 +00:00
										 |  |  |             else: | 
					
						
							|  |  |  |                 if diff(fn, tree): | 
					
						
							|  |  |  |                     problems.append(fn) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     # Show summary of problem files | 
					
						
							|  |  |  |     if not problems: | 
					
						
							| 
									
										
										
										
											2008-03-19 05:33:36 +00:00
										 |  |  |         print("No problems.  Congratulations!") | 
					
						
							| 
									
										
										
										
											2008-03-19 05:04:44 +00:00
										 |  |  |     else: | 
					
						
							| 
									
										
										
										
											2008-03-19 05:33:36 +00:00
										 |  |  |         print("Problems in following files:") | 
					
						
							| 
									
										
										
										
											2008-03-19 05:04:44 +00:00
										 |  |  |         for fn in problems: | 
					
						
							| 
									
										
										
										
											2008-03-19 05:33:36 +00:00
										 |  |  |             print("***", fn) | 
					
						
							| 
									
										
										
										
											2008-03-19 05:04:44 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 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() |