(argv: Optional[List[str]] = None)
| 555 | |
| 556 | |
| 557 | def main(argv: Optional[List[str]] = None) -> int: |
| 558 | here = os.path.dirname(os.path.abspath(__file__)) |
| 559 | plugin_root = os.path.normpath(os.path.join(here, "..", "..")) |
| 560 | default_src = os.path.join( |
| 561 | plugin_root, "third_party", "MuJoCo", "src", "src", "xml", |
| 562 | "xml_native_reader.cc", |
| 563 | ) |
| 564 | default_output = os.path.join(plugin_root, "Scripts", "codegen", "snapshots", "mjcf_schema_snapshot.json") |
| 565 | |
| 566 | ap = argparse.ArgumentParser() |
| 567 | ap.add_argument("--src", default=default_src, |
| 568 | help=f"MuJoCo xml_native_reader.cc (default: {default_src})") |
| 569 | ap.add_argument("--output", default=default_output, |
| 570 | help=f"Output JSON path (default: {default_output})") |
| 571 | args = ap.parse_args(argv) |
| 572 | |
| 573 | if not os.path.exists(args.src): |
| 574 | print(f"error: schema source not found: {args.src}", file=sys.stderr) |
| 575 | return 2 |
| 576 | |
| 577 | with open(args.src, "r", encoding="utf-8") as f: |
| 578 | src_text = f.read() |
| 579 | body = _extract_mjcf_block(src_text) |
| 580 | blocks = _tokenise_blocks(body) |
| 581 | root = _parse_tree(blocks) |
| 582 | version = _detect_mujoco_version(args.src) |
| 583 | snapshot = _build_snapshot(root, mujoco_version=version, src_text=src_text) |
| 584 | |
| 585 | os.makedirs(os.path.dirname(args.output), exist_ok=True) |
| 586 | with open(args.output, "w", encoding="utf-8") as f: |
| 587 | json.dump(snapshot, f, indent=2) |
| 588 | f.write("\n") |
| 589 | print(f"wrote {args.output}: mujoco_version={version}, top-level keys={len(snapshot) - 1}") |
| 590 | return 0 |
| 591 | |
| 592 | |
| 593 | if __name__ == "__main__": |
no test coverage detected