ChatDev/tools/validate_all_yamls.py
2026-02-07 10:45:19 +07:00

105 lines
3.0 KiB
Python

"""
Validate All YAML Workflow Configurations
This tool performs strict validation on all YAML workflow configuration files
in the yaml_instance/ directory. It ensures configuration integrity and prevents
runtime errors by catching issues early in the development process.
Purpose:
- Validates YAML syntax and schema compliance for all workflow configurations
- Prevents invalid configurations from causing runtime failures
- Essential for CI/CD pipelines to ensure code quality
- Provides detailed error reporting for debugging
Usage:
python tools/validate_all_yamls.py
# or via Makefile:
make validate-yamls
"""
import sys
import subprocess
from pathlib import Path
def validate_all():
base_dir = Path("yaml_instance")
if not base_dir.exists():
print(f"Directory {base_dir} not found.")
sys.exit(1)
# Recursive search for all .yaml files
files = sorted(list(base_dir.rglob("*.yaml")))
if not files:
print("No YAML files found.")
return
print(
f"Found {len(files)} YAML files. Running FULL validation via check.check...\n"
)
passed = 0
failed = 0
failed_files = []
for yaml_file in files:
# Use relative path for cleaner output
try:
rel_path = yaml_file.relative_to(Path.cwd())
except ValueError:
rel_path = yaml_file
# NOW we run check.check, which we just patched to have a main()
# This performs the stricter load_config() validation
cmd = [sys.executable, "-m", "check.check", "--path", str(yaml_file)]
try:
result = subprocess.run(cmd, capture_output=True, text=True)
if result.returncode == 0:
print(f"{rel_path}")
passed += 1
else:
print(f"{rel_path}")
# Indent error output
if result.stdout:
print(" stdout:", result.stdout.strip().replace("\n", "\n "))
# Validation errors usually print to stdout/stderr depending on impl
# Our new main prints to stdout for success/failure message
failed += 1
failed_files.append(str(rel_path))
except Exception as e:
print(f"{rel_path} (Execution Failed)")
print(f" Error: {e}")
failed += 1
failed_files.append(str(rel_path))
print("\n" + "=" * 40)
print(f"YAML Validation Summary")
print("=" * 40)
print(f"Total Files: {len(files)}")
print(f"Passed: {passed}")
print(f"Failed: {failed}")
if failed > 0:
print("\nFailed Files:")
for f in failed_files:
print(f"- {f}")
# Overall validation status
print("\n" + "=" * 40)
print("Overall Validation Status")
print("=" * 40)
if failed > 0:
print("YAML validation: FAILED")
sys.exit(1)
else:
print("All validations passed successfully.")
sys.exit(0)
if __name__ == "__main__":
validate_all()