58 lines
2.5 KiB
Python
58 lines
2.5 KiB
Python
from __future__ import annotations
|
|
|
|
import json
|
|
from pathlib import Path
|
|
|
|
import yaml
|
|
|
|
from refactor_master_helpers import ROOT, extract_formula_ids, extract_formula_outputs, load_yaml
|
|
|
|
|
|
def main() -> int:
|
|
formulas = load_yaml(ROOT / "spec" / "13_formula_registry.yaml").get("formula_registry", {}).get("formulas", {})
|
|
owners = load_yaml(ROOT / "spec" / "ownership_map.yaml").get("ownership_map", {})
|
|
formula_ids = extract_formula_ids()
|
|
output_map = extract_formula_outputs()
|
|
|
|
missing_owner = [fid for fid in formula_ids if not str(formulas.get(fid, {}).get("owner") or "").strip()]
|
|
missing_status = [fid for fid in formula_ids if not str(formulas.get(fid, {}).get("status") or "").strip()]
|
|
missing_outputs = [fid for fid, outs in output_map.items() if not outs]
|
|
|
|
normalized = {
|
|
"schema_version": "2026-06-06-formula-registry-normalized-v1",
|
|
"source": "spec/13_formula_registry.yaml",
|
|
"formula_count": len(formula_ids),
|
|
"formulas": [
|
|
{
|
|
"formula_id": fid,
|
|
"owner": formulas.get(fid, {}).get("owner"),
|
|
"status": formulas.get(fid, {}).get("status"),
|
|
"output_fields": output_map.get(fid, []),
|
|
}
|
|
for fid in formula_ids
|
|
],
|
|
}
|
|
norm_path = ROOT / "spec" / "03_formulas" / "formula_registry.normalized.yaml"
|
|
norm_path.parent.mkdir(parents=True, exist_ok=True)
|
|
norm_path.write_text(yaml.safe_dump(normalized, sort_keys=False, allow_unicode=True), encoding="utf-8")
|
|
|
|
result = {
|
|
"formula_id": "FORMULA_OWNER_COVERAGE_V1",
|
|
"formula_count": len(formula_ids),
|
|
"owner_coverage_pct": round((len(formula_ids) - len(missing_owner)) / len(formula_ids) * 100.0, 2) if formula_ids else 0.0,
|
|
"output_field_coverage_pct": round((len(formula_ids) - len(missing_outputs)) / len(formula_ids) * 100.0, 2) if formula_ids else 0.0,
|
|
"missing_owner_list": missing_owner[:200],
|
|
"missing_status_list": missing_status[:200],
|
|
"missing_output_field_list": missing_outputs[:200],
|
|
"owner_map_concepts": len(owners) if isinstance(owners, dict) else 0,
|
|
"gate": "FAIL" if missing_owner or missing_status or missing_outputs else "PASS",
|
|
}
|
|
out = ROOT / "Temp" / "formula_owner_coverage_v1.json"
|
|
out.write_text(json.dumps(result, ensure_ascii=False, indent=2), encoding="utf-8")
|
|
print(json.dumps(result, ensure_ascii=False, indent=2))
|
|
return 0
|
|
|
|
|
|
if __name__ == "__main__":
|
|
raise SystemExit(main())
|