pytree_idempotency.py 2.4 KB

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