Files
FreeCADWasmDev/tools/generate_tier1_readonly_adapter_manifest.py
wangdequan 9a7c4f0335 Save FreeCAD Web workspace sources and user validation evidence
IFC native binding remains incomplete; preserve accurate test results.
2026-09-15 22:01:58 +08:00

36 lines
2.6 KiB
Python

#!/usr/bin/env python3
"""Generate grouped implementation metadata for Tier-1 readonly APIs."""
from __future__ import annotations
import hashlib
import json
from collections import Counter, defaultdict
from pathlib import Path
ROOT = Path(__file__).resolve().parents[1]
source_path = ROOT / "docs/p6/python-api-manifest.json"
rows = json.loads(source_path.read_text(encoding="utf-8"))["records"]
selected = [row for row in rows if row["tier"] == "tier-1-readonly"]
routes = {
"Measure": ("measure.worker.ts", "measure.pythonApi", "src/Mod/Measure/App/AppMeasure.cpp"),
"OpenSCAD": ("openscad.worker.ts", "openscad.pythonApi", "src/Mod/OpenSCAD/OpenSCADUtils.py"),
"Mesh": ("mesh.worker.ts", "mesh.pythonApi", "src/Mod/Mesh/App/AppMesh.cpp"),
"Sketcher": ("sketcher-python.worker.ts", "sketcher.pythonApi", "src/Mod/Sketcher/App/AppSketcher.cpp"),
"Robot": ("robot-python.worker.ts", "robot.pythonApi", "src/Mod/Robot/App/AppRobot.cpp"),
"Points": ("points.worker.ts", "points.pythonApi", "src/Mod/Points/App/AppPointsPy.cpp"),
"Cloud": ("cloud.worker.ts", "cloud.pythonFamilyBatch", "src/WebAssembly/FreeCADCoreProbe/CloudKernelProbe.cpp:644"),
"Draft": ("draft.worker.ts", "draft.pythonFamilyBatch", "src/WebAssembly/FreeCADCoreProbe/DraftRuntimeProbe.cpp:285"),
}
groups: dict[str, dict[str, object]] = defaultdict(lambda: {"apiIds": [], "families": Counter()})
for row in selected:
groups[row["module"]]["apiIds"].append(row["id"])
groups[row["module"]]["families"][row["family"]] += 1
modules = []
for module, group in sorted(groups.items()):
route = routes.get(module, (None, None, None))
modules.append({"module": module, "count": len(group["apiIds"]), "families": dict(sorted(group["families"].items())), "route": {"worker": route[0], "command": route[1], "nativeSource": route[2]}, "apiIds": sorted(group["apiIds"])})
output = {"schema": "freecad-web-tier1-readonly-adapter-manifest/v1", "taskId": "FW-P6-FPA-IMPL-TIER1-READONLY", "source": {"manifest": "docs/p6/python-api-manifest.json", "manifestSha256": hashlib.sha256(source_path.read_bytes()).hexdigest()}, "tier": "tier-1-readonly", "count": len(selected), "modules": modules, "boundaries": ["grouped readonly route readiness is not method-level return evidence", "original disposition is preserved until F1 coverage"]}
out = ROOT / "docs/p6/tier1-readonly-adapter-manifest.json"
out.write_text(json.dumps(output, ensure_ascii=False, indent=2) + "\n", encoding="utf-8")
print(json.dumps({"output": str(out.relative_to(ROOT)), "count": len(selected), "modules": len(modules), "sha256": hashlib.sha256(out.read_bytes()).hexdigest()}, ensure_ascii=False))