build(agent): weasel-1#856f80 iteration
This commit is contained in:
parent
f84e1502b7
commit
951e614f16
|
|
@ -0,0 +1,40 @@
|
|||
#!/usr/bin/env python3
|
||||
"""Generate JSON Schema files from specs.ir Pydantic models.
|
||||
|
||||
Writes one JSON file per model name into the output directory. Useful for
|
||||
external adapters to consume a stable IR schema artifact.
|
||||
"""
|
||||
import json
|
||||
import argparse
|
||||
from pathlib import Path
|
||||
import specs.ir as ir
|
||||
|
||||
|
||||
def main(out_dir: Path):
|
||||
out_dir.mkdir(parents=True, exist_ok=True)
|
||||
# ir.__all__ lists model names exported by the module
|
||||
for name in getattr(ir, "__all__", []):
|
||||
cls = getattr(ir, name, None)
|
||||
if cls is None:
|
||||
continue
|
||||
# pydantic v1/v2 compat: prefer model_json_schema if available
|
||||
schema = None
|
||||
if hasattr(cls, "model_json_schema"):
|
||||
try:
|
||||
schema = cls.model_json_schema()
|
||||
except TypeError:
|
||||
schema = cls.schema()
|
||||
else:
|
||||
schema = cls.schema()
|
||||
|
||||
out_path = out_dir / f"{name}.json"
|
||||
with out_path.open("w", encoding="utf8") as f:
|
||||
json.dump(schema, f, indent=2, sort_keys=True)
|
||||
print(f"Wrote {out_path}")
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
p = argparse.ArgumentParser()
|
||||
p.add_argument("--out", dest="out", default="specs/schemas", help="Output directory")
|
||||
args = p.parse_args()
|
||||
main(Path(args.out))
|
||||
|
|
@ -1,2 +1,7 @@
|
|||
This directory can hold generated JSON Schema files for the IR models in specs/ir.py
|
||||
Use the models' `.schema()` or `.schema_json()` in Python to export updated schemas.
|
||||
This directory holds generated JSON Schema files for the EnergiBridge IR
|
||||
models defined in `specs/ir.py`.
|
||||
|
||||
Generation
|
||||
- Use `python3 scripts/generate_schemas.py --out specs/schemas` to regenerate
|
||||
- The test suite contains a test that exercises the generator to ensure the
|
||||
schemas are JSON-serializable and consistent with the Pydantic models.
|
||||
|
|
|
|||
|
|
@ -0,0 +1,30 @@
|
|||
from pathlib import Path
|
||||
import json
|
||||
import specs.ir as ir
|
||||
|
||||
|
||||
def test_generate_schemas(tmp_path: Path):
|
||||
out = tmp_path / "schemas"
|
||||
out.mkdir()
|
||||
|
||||
# mimic the generator logic: iterate ir.__all__ and ensure JSON serializable
|
||||
for name in getattr(ir, "__all__", []):
|
||||
cls = getattr(ir, name, None)
|
||||
assert cls is not None, f"Missing model class for {name}"
|
||||
# get schema (compat v1/v2)
|
||||
if hasattr(cls, "model_json_schema"):
|
||||
try:
|
||||
schema = cls.model_json_schema()
|
||||
except TypeError:
|
||||
schema = cls.schema()
|
||||
else:
|
||||
schema = cls.schema()
|
||||
|
||||
# ensure JSON serializable
|
||||
json_str = json.dumps(schema)
|
||||
assert "title" in json.loads(json_str) or "properties" in json.loads(json_str)
|
||||
|
||||
# write out to disk and ensure file exists
|
||||
p = out / f"{name}.json"
|
||||
p.write_text(json_str, encoding="utf8")
|
||||
assert p.exists()
|
||||
Loading…
Reference in New Issue