Path: blob/master/devel/summarize_site_validation.py
761 views
#!/usr/bin/env python1# This module summarizes the results of site validation tests queued by2# workflow validate_modified_targets for presentation in Issue comments.34from defusedxml import ElementTree as ET5import sys6from pathlib import Path78def summarize_junit_xml(xml_path: Path) -> str:9tree = ET.parse(xml_path)10root = tree.getroot()11suite = root.find('testsuite')1213pass_message: str = ":heavy_check_mark: Pass"14fail_message: str = ":x: Fail"1516if suite is None:17raise ValueError("Invalid JUnit XML: No testsuite found")1819summary_lines: list[str] = []20summary_lines.append("#### Automatic validation of changes\n")21summary_lines.append("| Target | F+ Check | F- Check |")22summary_lines.append("|---|---|---|")2324failures = int(suite.get('failures', 0))25errors_detected: bool = False2627results: dict[str, dict[str, str]] = {}2829for testcase in suite.findall('testcase'):30test_name = testcase.get('name').split('[')[0]31site_name = testcase.get('name').split('[')[1].rstrip(']')32failure = testcase.find('failure')33error = testcase.find('error')3435if site_name not in results:36results[site_name] = {}3738if test_name == "test_false_neg":39results[site_name]['F- Check'] = pass_message if failure is None and error is None else fail_message40elif test_name == "test_false_pos":41results[site_name]['F+ Check'] = pass_message if failure is None and error is None else fail_message4243if error is not None:44errors_detected = True4546for result in results:47summary_lines.append(f"| {result} | {results[result].get('F+ Check', 'Error!')} | {results[result].get('F- Check', 'Error!')} |")4849if failures > 0:50summary_lines.append("\n___\n" +51"\nFailures were detected on at least one updated target. Commits containing accuracy failures" +52" will often not be merged (unless a rationale is provided, such as false negatives due to regional differences).")5354if errors_detected:55summary_lines.append("\n___\n" +56"\n**Errors were detected during validation. Please review the workflow logs.**")5758return "\n".join(summary_lines)5960if __name__ == "__main__":61if len(sys.argv) != 2:62print("Usage: summarize_site_validation.py <junit-xml-file>")63sys.exit(1)6465xml_path: Path = Path(sys.argv[1])66if not xml_path.is_file():67print(f"Error: File '{xml_path}' does not exist.")68sys.exit(1)6970summary: str = summarize_junit_xml(xml_path)71print(summary)727374