/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

  1. #!/usr/bin/env python2.5
  2. # Copyright 2006 Google, Inc. All Rights Reserved.
  3. # Licensed to PSF under a Contributor Agreement.
  4. """Main program for testing the infrastructure."""
  5. __author__ = "Guido van Rossum <guido@python.org>"
  6. # Support imports (need to be imported first)
  7. from . import support
  8. # Python imports
  9. import os
  10. import sys
  11. import logging
  12. # Local imports
  13. from .. import pytree
  14. import pgen2
  15. from pgen2 import driver
  16. logging.basicConfig()
  17. def main():
  18. gr = driver.load_grammar("Grammar.txt")
  19. dr = driver.Driver(gr, convert=pytree.convert)
  20. fn = "example.py"
  21. tree = dr.parse_file(fn, debug=True)
  22. if not diff(fn, tree):
  23. print "No diffs."
  24. if not sys.argv[1:]:
  25. return # Pass a dummy argument to run the complete test suite below
  26. problems = []
  27. # Process every imported module
  28. for name in sys.modules:
  29. mod = sys.modules[name]
  30. if mod is None or not hasattr(mod, "__file__"):
  31. continue
  32. fn = mod.__file__
  33. if fn.endswith(".pyc"):
  34. fn = fn[:-1]
  35. if not fn.endswith(".py"):
  36. continue
  37. print >>sys.stderr, "Parsing", fn
  38. tree = dr.parse_file(fn, debug=True)
  39. if diff(fn, tree):
  40. problems.append(fn)
  41. # Process every single module on sys.path (but not in packages)
  42. for dir in sys.path:
  43. try:
  44. names = os.listdir(dir)
  45. except os.error:
  46. continue
  47. print >>sys.stderr, "Scanning", dir, "..."
  48. for name in names:
  49. if not name.endswith(".py"):
  50. continue
  51. print >>sys.stderr, "Parsing", name
  52. fn = os.path.join(dir, name)
  53. try:
  54. tree = dr.parse_file(fn, debug=True)
  55. except pgen2.parse.ParseError, err:
  56. print "ParseError:", err
  57. else:
  58. if diff(fn, tree):
  59. problems.append(fn)
  60. # Show summary of problem files
  61. if not problems:
  62. print "No problems. Congratulations!"
  63. else:
  64. print "Problems in following files:"
  65. for fn in problems:
  66. print "***", fn
  67. def diff(fn, tree):
  68. f = open("@", "w")
  69. try:
  70. f.write(str(tree))
  71. finally:
  72. f.close()
  73. try:
  74. return os.system("diff -u %s @" % fn)
  75. finally:
  76. os.remove("@")
  77. if __name__ == "__main__":
  78. main()