mirror of https://github.com/python/cpython
93 lines
2.3 KiB
Python
93 lines
2.3 KiB
Python
|
#!/usr/bin/env python
|
||
|
# 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()
|