/Lib/lib2to3/tests/pytree_idempotency.py
http://unladen-swallow.googlecode.com/ · Python · 92 lines · 68 code · 14 blank · 10 comment · 25 complexity · e986d49af7eaec7f1c3b4aad0eba7a5f MD5 · raw file
- #!/usr/bin/env python2.5
- # Copyright 2006 Google, Inc. All Rights Reserved.
- # Licensed to PSF under a Contributor Agreement.
- """Main program for testing the infrastructure."""
- __author__ = "Guido van Rossum <guido@python.org>"
- # Support imports (need to be imported first)
- from . import support
- # 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):
- print "No diffs."
- 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
- print >>sys.stderr, "Parsing", fn
- 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)
- except os.error:
- continue
- print >>sys.stderr, "Scanning", dir, "..."
- for name in names:
- if not name.endswith(".py"):
- continue
- print >>sys.stderr, "Parsing", name
- fn = os.path.join(dir, name)
- try:
- tree = dr.parse_file(fn, debug=True)
- except pgen2.parse.ParseError, err:
- print "ParseError:", err
- else:
- if diff(fn, tree):
- problems.append(fn)
- # Show summary of problem files
- if not problems:
- print "No problems. Congratulations!"
- else:
- print "Problems in following files:"
- for fn in problems:
- print "***", fn
- 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()