22 lines
1.6 KiB
Python
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))
|