From d5f9089361541eb2a767e965d16a279dd0fbf02b Mon Sep 17 00:00:00 2001 From: kartik-mem0 Date: Fri, 14 Aug 2026 18:13:31 +0530 Subject: [PATCH] test(release): guard the CONTRIBUTING.md tag-prefix table against release.yml drift --- tests/test_release_tag_prefixes.py | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 tests/test_release_tag_prefixes.py diff --git a/tests/test_release_tag_prefixes.py b/tests/test_release_tag_prefixes.py new file mode 100644 index 000000000..90ca906d7 --- /dev/null +++ b/tests/test_release_tag_prefixes.py @@ -0,0 +1,27 @@ +"""Drift test: the tag prefixes in CONTRIBUTING.md must match the router in release.yml.""" + +import re +from pathlib import Path + +REPO_ROOT = Path(__file__).resolve().parents[1] +CONTRIBUTING_MD = REPO_ROOT / "CONTRIBUTING.md" +RELEASE_YML = REPO_ROOT / ".github" / "workflows" / "release.yml" + + +def _documented_prefixes(): + section = CONTRIBUTING_MD.read_text().split("### Tag Prefixes")[1].split("###")[0] + return set(re.findall(r"^\|[^|\n]+\|[^|\n]+\|\s*`([^`\n]+\*)`\s*\|", section, re.M)) + + +def _routed_prefixes(): + case_block = re.search(r'case "\$TAG" in\n(.*?)\n\s*esac', RELEASE_YML.read_text(), re.S).group(1) + return set(re.findall(r"^\s*([\w.-]+\*)\)", case_block, re.M)) + + +def test_documented_prefixes_match_release_router(): + documented, routed = _documented_prefixes(), _routed_prefixes() + assert documented, "CONTRIBUTING.md '### Tag Prefixes' table has no tag prefixes" + assert documented == routed, ( + f"CONTRIBUTING.md documents {sorted(documented - routed)} with no arm in release.yml, " + f"and release.yml routes {sorted(routed - documented)} with no row in CONTRIBUTING.md" + )