#!/usr/bin/env python3 """Keep raw module page frames from growing while shared layouts are adopted.""" from __future__ import annotations import pathlib import re import sys META_ROOT = pathlib.Path(__file__).resolve().parents[2] REPOS_ROOT = META_ROOT.parent BASELINE_PATH = pathlib.Path(__file__).with_name("shared-webui-layout-baseline.txt") WORKSPACE_BASELINE_PATH = pathlib.Path(__file__).with_name( "shared-webui-workspace-baseline.txt" ) RAW_PAGE_FRAME = 'className="content-pad workspace-data-page' RAW_WORKSPACE = re.compile(r' set[pathlib.Path]: return { pathlib.Path(line.strip()) for line in path.read_text(encoding="utf-8").splitlines() if line.strip() and not line.lstrip().startswith("#") } def source_paths() -> list[pathlib.Path]: paths: list[pathlib.Path] = [] for repository in sorted(REPOS_ROOT.glob("govoplan*")): source_root = repository / "webui" / "src" if source_root.is_dir(): paths.extend(sorted(source_root.rglob("*.tsx"))) return paths def relative(path: pathlib.Path) -> pathlib.Path: return path.relative_to(REPOS_ROOT) def main() -> int: sources = source_paths() source_text = {relative(path): path.read_text(encoding="utf-8") for path in sources} raw_frames = {path for path, text in source_text.items() if RAW_PAGE_FRAME in text} baseline = baseline_paths(BASELINE_PATH) available_baseline = { path for path in baseline if (REPOS_ROOT / path.parts[0]).is_dir() } errors: list[str] = [] unexpected = sorted(raw_frames - available_baseline) if unexpected: errors.append("New raw page frames must use @govoplan/core-webui PageLayout:") errors.extend(f"- {path}" for path in unexpected) resolved = sorted(available_baseline - raw_frames) if resolved: errors.append("Remove migrated page frames from the shared-layout baseline:") errors.extend(f"- {path}" for path in resolved) raw_workspaces = { path for path, text in source_text.items() if RAW_WORKSPACE.search(text) } workspace_baseline = baseline_paths(WORKSPACE_BASELINE_PATH) available_workspace_baseline = { path for path in workspace_baseline if (REPOS_ROOT / path.parts[0]).is_dir() } unexpected_workspaces = sorted(raw_workspaces - available_workspace_baseline) if unexpected_workspaces: errors.append("New raw workspaces must use @govoplan/core-webui WorkspaceLayout:") errors.extend(f"- {path}" for path in unexpected_workspaces) resolved_workspaces = sorted(available_workspace_baseline - raw_workspaces) if resolved_workspaces: errors.append("Remove migrated workspaces from the shared-workspace baseline:") errors.extend(f"- {path}" for path in resolved_workspaces) for path, text in source_text.items(): if path != CENTRAL_LAYOUT and LOCAL_PAGE_LAYOUT.search(text): errors.append(f"Module-local PageLayout definition is not allowed: {path}") if path != CENTRAL_WORKSPACE_LAYOUT and LOCAL_WORKSPACE_LAYOUT.search(text): errors.append(f"Module-local WorkspaceLayout definition is not allowed: {path}") for path in REQUIRED_CONSUMERS: absolute_path = REPOS_ROOT / path if not absolute_path.exists(): continue text = absolute_path.read_text(encoding="utf-8") if "