Benjamin Peterson | 90f5ba5 | 2010-03-11 22:53:45 +0000 | [diff] [blame] | 1 | #!/usr/bin/env python3 |
Martin v. Löwis | ef04c44 | 2008-03-19 05:04:44 +0000 | [diff] [blame] | 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 | |
Zachary Ware | 2acbae8 | 2014-10-29 12:24:59 -0500 | [diff] [blame] | 7 | from __future__ import print_function |
| 8 | |
Martin v. Löwis | ef04c44 | 2008-03-19 05:04:44 +0000 | [diff] [blame] | 9 | __author__ = "Guido van Rossum <guido@python.org>" |
| 10 | |
| 11 | # Support imports (need to be imported first) |
Martin v. Löwis | a675ef1 | 2008-03-24 00:50:58 +0000 | [diff] [blame] | 12 | from . import support |
Martin v. Löwis | ef04c44 | 2008-03-19 05:04:44 +0000 | [diff] [blame] | 13 | |
| 14 | # Python imports |
| 15 | import os |
| 16 | import sys |
| 17 | import logging |
| 18 | |
| 19 | # Local imports |
| 20 | from .. import pytree |
| 21 | 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): |
Martin v. Löwis | 8a5f8ca | 2008-03-19 05:33:36 +0000 | [diff] [blame] | 33 | print("No diffs.") |
Martin v. Löwis | ef04c44 | 2008-03-19 05:04:44 +0000 | [diff] [blame] | 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 |
Martin v. Löwis | 8a5f8ca | 2008-03-19 05:33:36 +0000 | [diff] [blame] | 49 | print("Parsing", fn, file=sys.stderr) |
Martin v. Löwis | ef04c44 | 2008-03-19 05:04:44 +0000 | [diff] [blame] | 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) |
Andrew Svetlov | ad28c7f | 2012-12-18 22:02:39 +0200 | [diff] [blame] | 58 | except OSError: |
Martin v. Löwis | ef04c44 | 2008-03-19 05:04:44 +0000 | [diff] [blame] | 59 | continue |
Martin v. Löwis | 8a5f8ca | 2008-03-19 05:33:36 +0000 | [diff] [blame] | 60 | print("Scanning", dir, "...", file=sys.stderr) |
Martin v. Löwis | ef04c44 | 2008-03-19 05:04:44 +0000 | [diff] [blame] | 61 | for name in names: |
| 62 | if not name.endswith(".py"): |
| 63 | continue |
Martin v. Löwis | 8a5f8ca | 2008-03-19 05:33:36 +0000 | [diff] [blame] | 64 | print("Parsing", name, file=sys.stderr) |
Martin v. Löwis | ef04c44 | 2008-03-19 05:04:44 +0000 | [diff] [blame] | 65 | fn = os.path.join(dir, name) |
| 66 | try: |
| 67 | tree = dr.parse_file(fn, debug=True) |
Martin v. Löwis | 8a5f8ca | 2008-03-19 05:33:36 +0000 | [diff] [blame] | 68 | except pgen2.parse.ParseError as err: |
| 69 | print("ParseError:", err) |
Martin v. Löwis | ef04c44 | 2008-03-19 05:04:44 +0000 | [diff] [blame] | 70 | else: |
| 71 | if diff(fn, tree): |
| 72 | problems.append(fn) |
| 73 | |
| 74 | # Show summary of problem files |
| 75 | if not problems: |
Martin v. Löwis | 8a5f8ca | 2008-03-19 05:33:36 +0000 | [diff] [blame] | 76 | print("No problems. Congratulations!") |
Martin v. Löwis | ef04c44 | 2008-03-19 05:04:44 +0000 | [diff] [blame] | 77 | else: |
Martin v. Löwis | 8a5f8ca | 2008-03-19 05:33:36 +0000 | [diff] [blame] | 78 | print("Problems in following files:") |
Martin v. Löwis | ef04c44 | 2008-03-19 05:04:44 +0000 | [diff] [blame] | 79 | for fn in problems: |
Martin v. Löwis | 8a5f8ca | 2008-03-19 05:33:36 +0000 | [diff] [blame] | 80 | print("***", fn) |
Martin v. Löwis | ef04c44 | 2008-03-19 05:04:44 +0000 | [diff] [blame] | 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() |