validate.py 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. #!/usr/bin/env python3
  2. """
  3. Command line tool to validate Office document XML files against XSD schemas and tracked changes.
  4. Usage:
  5. python validate.py <dir> --original <original_file>
  6. """
  7. import argparse
  8. import sys
  9. from pathlib import Path
  10. from validation import DOCXSchemaValidator, PPTXSchemaValidator, RedliningValidator
  11. def main():
  12. parser = argparse.ArgumentParser(description="Validate Office document XML files")
  13. parser.add_argument(
  14. "unpacked_dir",
  15. help="Path to unpacked Office document directory",
  16. )
  17. parser.add_argument(
  18. "--original",
  19. required=True,
  20. help="Path to original file (.docx/.pptx/.xlsx)",
  21. )
  22. parser.add_argument(
  23. "-v",
  24. "--verbose",
  25. action="store_true",
  26. help="Enable verbose output",
  27. )
  28. args = parser.parse_args()
  29. # Validate paths
  30. unpacked_dir = Path(args.unpacked_dir)
  31. original_file = Path(args.original)
  32. file_extension = original_file.suffix.lower()
  33. assert unpacked_dir.is_dir(), f"Error: {unpacked_dir} is not a directory"
  34. assert original_file.is_file(), f"Error: {original_file} is not a file"
  35. assert file_extension in [".docx", ".pptx", ".xlsx"], (
  36. f"Error: {original_file} must be a .docx, .pptx, or .xlsx file"
  37. )
  38. # Run validations
  39. match file_extension:
  40. case ".docx":
  41. validators = [DOCXSchemaValidator, RedliningValidator]
  42. case ".pptx":
  43. validators = [PPTXSchemaValidator]
  44. case _:
  45. print(f"Error: Validation not supported for file type {file_extension}")
  46. sys.exit(1)
  47. # Run validators
  48. success = True
  49. for V in validators:
  50. validator = V(unpacked_dir, original_file, verbose=args.verbose)
  51. if not validator.validate():
  52. success = False
  53. if success:
  54. print("All validations PASSED!")
  55. sys.exit(0 if success else 1)
  56. if __name__ == "__main__":
  57. main()