feat: add full supported API details for variants and enhance tests

This commit is contained in:
Patryk Gensch
2026-06-19 00:20:46 +02:00
parent 0666692198
commit ce44e30c60
3 changed files with 55 additions and 7 deletions

View File

@@ -58,6 +58,35 @@ def _surface_counts(snap: Snapshot) -> dict[str, int]:
return {axis: len(_keys(snap, axis)) for axis in _AXES}
def surface_api(snap: Snapshot) -> dict[str, Any]:
"""The full *supported* surface of one variant: every type, and per class the methods, events
and fields it exposes. This is the baseline — 'what is there' — so the diff against the
reference variant has a point of reference to read against."""
classes: dict[str, dict[str, list]] = {}
def cls(owner: str | None) -> dict[str, list]:
return classes.setdefault(owner or "?", {"methods": [], "events": [], "fields": []})
for m in snap.methods:
cls(m.get("owner"))["methods"].append({"name": m["name"], "id": m.get("id")})
for e in snap.events:
cls(e.get("owner"))["events"].append({"name": e["name"], "order": e.get("order")})
for f in snap.fields:
cls(f.get("owner"))["fields"].append({"name": f["name"], "type": f.get("type")})
for d in classes.values():
d["methods"].sort(key=lambda x: x["name"])
d["events"].sort(key=lambda x: (x["order"] if x["order"] is not None else 1 << 30, x["name"]))
d["fields"].sort(key=lambda x: x["name"])
types = sorted(
({"script_name": t["script_name"], "cpp_class": t.get("cpp_class"),
"object_size": t.get("object_size")} for t in snap.types),
key=lambda x: x["script_name"],
)
return {"types": types, "classes": dict(sorted(classes.items()))}
def _axis_counts(block: dict[str, Any]) -> dict[str, int]:
return {
"added": len(block["added"]),
@@ -182,6 +211,7 @@ def _build_library(name: str, entries: list[Entry]) -> dict[str, Any]:
"id": vid,
"reference": is_ref,
"surface": _surface_counts(sample),
"api": surface_api(sample),
"members": members,
"vs_reference": None if is_ref else _vs_reference(reference_snap, sample),
}
@@ -344,10 +374,13 @@ def render_markdown(table: dict[str, Any]) -> str:
m["game"], m["engine"] or "?", m["compiler"] or "?", _short(m["sha256"]))
for m in v["members"]
)
class_names = list(v["api"]["classes"])
out.append(
"- **{0}** ({1}) — typy {2} / metody {3} / eventy {4} / pola {5}".format(
v["id"], tag, s["types"], s["methods"], s["events"], s["fields"]))
"- **{0}** ({1}) — klasy {2} / typy {3} / metody {4} / eventy {5} / pola {6}".format(
v["id"], tag, len(class_names), s["types"], s["methods"], s["events"], s["fields"]))
out.append(" - gry: {0}".format(games_str))
if class_names:
out.append(" - klasy: {0}".format(_signed("", class_names, cap=30)))
vs = v["vs_reference"]
if vs:
ax = vs["axes"]