diff --git a/tests/test_gitea_sync_wiki.py b/tests/test_gitea_sync_wiki.py new file mode 100644 index 0000000..a834601 --- /dev/null +++ b/tests/test_gitea_sync_wiki.py @@ -0,0 +1,49 @@ +from __future__ import annotations + +import importlib.util +import pathlib +import sys +import tempfile +import unittest + + +ROOT = pathlib.Path(__file__).resolve().parents[1] +SCRIPT = ROOT / "tools" / "gitea" / "gitea-sync-wiki.py" +TOOLS = SCRIPT.parent +if str(TOOLS) not in sys.path: + sys.path.insert(0, str(TOOLS)) +SPEC = importlib.util.spec_from_file_location("gitea_sync_wiki", SCRIPT) +assert SPEC and SPEC.loader +wiki_sync = importlib.util.module_from_spec(SPEC) +sys.modules[SPEC.name] = wiki_sync +SPEC.loader.exec_module(wiki_sync) + + +class WikiSourceDiscoveryTests(unittest.TestCase): + def test_generated_and_incidental_govoplan_files_are_not_docs(self) -> None: + with tempfile.TemporaryDirectory() as temporary: + root = pathlib.Path(temporary) + paths = { + "readme": root / "README.md", + "architecture": root / "docs" / "DATASOURCE_ARCHITECTURE.md", + "plan": root / "workflow-plan.md", + "audit": root / "audit-reports" / "full" / "manifest.json", + "runtime": root / "runtime" / "release" / "manifest.json", + "incidental": root / "tools" / "semgrep" / "govoplan.yml", + "manifest": root / "manifest.json", + } + for path in paths.values(): + path.parent.mkdir(parents=True, exist_ok=True) + path.write_text("content\n", encoding="utf-8") + + self.assertTrue(wiki_sync.is_repo_doc(root, paths["readme"])) + self.assertTrue(wiki_sync.is_repo_doc(root, paths["architecture"])) + self.assertTrue(wiki_sync.is_repo_doc(root, paths["plan"])) + self.assertFalse(wiki_sync.is_repo_doc(root, paths["audit"])) + self.assertFalse(wiki_sync.is_repo_doc(root, paths["runtime"])) + self.assertFalse(wiki_sync.is_repo_doc(root, paths["incidental"])) + self.assertFalse(wiki_sync.is_repo_doc(root, paths["manifest"])) + + +if __name__ == "__main__": + unittest.main() diff --git a/tools/gitea/gitea-sync-wiki.py b/tools/gitea/gitea-sync-wiki.py index ecab006..305b336 100644 --- a/tools/gitea/gitea-sync-wiki.py +++ b/tools/gitea/gitea-sync-wiki.py @@ -27,12 +27,17 @@ EXCLUDED_PARTS = { ".git", ".gitea", ".venv", + ".mypy_cache", + ".pytest_cache", + ".ruff_cache", "node_modules", "__pycache__", + "audit-reports", "dist", "build", ".cache", ".module-test-build", + "runtime", } EXCLUDED_NAMES = { "package-lock.json", @@ -40,6 +45,14 @@ EXCLUDED_NAMES = { "yarn.lock", "uv.lock", } +REPO_DOC_NAME_TOKENS = { + "architecture", + "backlog", + "plan", + "roadmap", + "todo", + "workflow", +} @dataclasses.dataclass(frozen=True) @@ -216,7 +229,8 @@ def is_repo_doc(repo_root_path: pathlib.Path, path: pathlib.Path) -> bool: return False if rel.parts[0] in {"docs", "doc", "codex"} and path.suffix.lower() in {".md", ".txt", ".csv"}: return True - if re.search(r"(backlog|todo|roadmap|plan|architecture|workflow|manifest)", path.name, re.IGNORECASE): + name_tokens = set(re.split(r"[^a-z0-9]+", path.stem.lower())) + if name_tokens & REPO_DOC_NAME_TOKENS: return True return False