Files
FreeCADWasmDev/tools/generate_format_extension_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

22 lines
1.6 KiB
Python

#!/usr/bin/env python3
"""Generate unique extension candidates from the format inventory."""
from __future__ import annotations
import hashlib
import json
from collections import defaultdict
from pathlib import Path
ROOT = Path(__file__).resolve().parents[1]
source_path = ROOT / "docs/format-api-inventory.json"
rows = json.loads(source_path.read_text(encoding="utf-8"))["formats"]
groups = defaultdict(lambda: {"modules": set(), "directions": set(), "evidenceCount": 0})
for row in rows:
extension = str(row.get("extension") or "").lower()
if not extension: continue
group = groups[extension]; group["modules"].add(row["module"]); group["directions"].add(row["direction"]); group["evidenceCount"] += 1
records = [{"extension": extension, "modules": sorted(group["modules"]), "directions": sorted(group["directions"]), "evidenceCount": group["evidenceCount"]} for extension, group in sorted(groups.items())]
output = {"schema": "freecad-web-format-extension-manifest/v1", "source": {"inventory": "docs/format-api-inventory.json", "inventorySha256": hashlib.sha256(source_path.read_bytes()).hexdigest()}, "count": len(records), "records": records, "boundaries": ["candidate extension route is not import/export completion", "module/direction conflict must be resolved before native dispatch"]}
out = ROOT / "docs/p6/format-extension-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(records), "sha256": hashlib.sha256(out.read_bytes()).hexdigest()}, ensure_ascii=False))