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()