glam/scripts/regenerate_manifest.py
2026-01-08 15:56:28 +01:00

110 lines
3.3 KiB
Python

#!/usr/bin/env python3
"""
Regenerate manifest.json for LinkML schema frontend.
This script scans the LinkML schema directory and generates a complete manifest
of all class and enum files for the frontend to load.
"""
import json
import os
from datetime import datetime, timezone
from pathlib import Path
# Schema paths
SCHEMA_DIR = Path(__file__).parent.parent / "schemas" / "20251121" / "linkml"
CLASSES_DIR = SCHEMA_DIR / "modules" / "classes"
ENUMS_DIR = SCHEMA_DIR / "modules" / "enums"
SLOTS_DIR = SCHEMA_DIR / "modules" / "slots"
MANIFEST_PATH = SCHEMA_DIR / "manifest.json"
def get_yaml_files(directory: Path) -> list[str]:
"""Get all .yaml files in a directory, sorted alphabetically."""
if not directory.exists():
return []
return sorted([f.stem for f in directory.glob("*.yaml")])
def main():
# Get all class files
class_files = get_yaml_files(CLASSES_DIR)
print(f"Found {len(class_files)} class files")
# Get all enum files
enum_files = get_yaml_files(ENUMS_DIR)
print(f"Found {len(enum_files)} enum files")
# Get all slot files
slot_files = get_yaml_files(SLOTS_DIR)
print(f"Found {len(slot_files)} slot files")
# Build manifest structure
manifest = {
"generated": datetime.now(timezone.utc).strftime("%Y-%m-%dT%H:%M:%S.000Z"),
"version": "1.0.0",
"categories": [
{
"name": "main",
"displayName": "Main Schema",
"files": [
{
"name": "Heritage Custodian Ontology",
"path": "01_custodian_name_modular.yaml",
"category": "main"
}
]
},
{
"name": "class",
"displayName": "Classes",
"files": [
{
"name": name,
"path": f"modules/classes/{name}.yaml",
"category": "classes"
}
for name in class_files
]
},
{
"name": "enum",
"displayName": "Enumerations",
"files": [
{
"name": name,
"path": f"modules/enums/{name}.yaml",
"category": "enums"
}
for name in enum_files
]
},
{
"name": "slot",
"displayName": "Slots",
"files": [
{
"name": name,
"path": f"modules/slots/{name}.yaml",
"category": "slots"
}
for name in slot_files
]
}
]
}
# Write manifest
with open(MANIFEST_PATH, 'w', encoding='utf-8') as f:
json.dump(manifest, f, indent=2)
print(f"\n✅ Manifest written to {MANIFEST_PATH}")
print(f" - Main schema: 1 file")
print(f" - Classes: {len(class_files)} files")
print(f" - Enums: {len(enum_files)} files")
print(f" - Slots: {len(slot_files)} files")
print(f" - Total: {1 + len(class_files) + len(enum_files) + len(slot_files)} files")
if __name__ == "__main__":
main()