()
| 11 | ) |
| 12 | |
| 13 | def main() -> int: |
| 14 | valid_reqs = set() |
| 15 | req_pattern = re.compile(r"APTS-[A-Z]{2}-[A-Z0-9]{3}") |
| 16 | |
| 17 | md_files = git_ls_files("*.md") |
| 18 | standard_md_files = [f for f in md_files if Path(f).parts[0] == "standard"] |
| 19 | |
| 20 | for md_file in standard_md_files: |
| 21 | content = read_text(md_file) |
| 22 | |
| 23 | # Match definitions like "## APTS-RP-001: Title" |
| 24 | defs = re.findall(r"^#{2,4}\s+(APTS-[A-Z]{2}-[A-Z0-9]{3}):", content, re.MULTILINE) |
| 25 | valid_reqs.update(defs) |
| 26 | |
| 27 | # Match table definitions like "| APTS-RP-001 |" |
| 28 | table_defs = re.findall(r"\|\s*(APTS-[A-Z]{2}-[A-Z0-9]{3})\s*\|", content) |
| 29 | valid_reqs.update(table_defs) |
| 30 | |
| 31 | if not valid_reqs: |
| 32 | print("Error: No requirements found to validate against.", file=sys.stderr) |
| 33 | return 1 |
| 34 | |
| 35 | failed = False |
| 36 | for md_file in standard_md_files: |
| 37 | content = read_text(md_file) |
| 38 | lines = content.splitlines() |
| 39 | |
| 40 | for i, line in enumerate(lines): |
| 41 | refs = req_pattern.findall(line) |
| 42 | for ref in refs: |
| 43 | if ref not in valid_reqs: |
| 44 | print(f"Error in {display_path(md_file)}:{i+1}") |
| 45 | print(f" Invalid cross-reference: {ref} is not a known requirement.") |
| 46 | failed = True |
| 47 | |
| 48 | if failed: |
| 49 | print("Cross-reference validation failed.", file=sys.stderr) |
| 50 | return 1 |
| 51 | |
| 52 | print(f"Successfully validated cross-references against {len(valid_reqs)} known requirements.") |
| 53 | return 0 |
| 54 | |
| 55 | if __name__ == "__main__": |
| 56 | raise SystemExit(main()) |
no test coverage detected