glam/scripts/regenerate_manifest.py
kempersc 5178b24f99
All checks were successful
Deploy Frontend / build-and-deploy (push) Successful in 2m20s
fix: update manifest to only include slots from 20260202_matang directory
2026-02-04 00:59:38 +01:00

138 lines
4.4 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, enum, and slot files for the frontend to load.
The manifest structure matches what the frontend LinkMLSchemaService expects:
- schemaRoot: Base path for schema files
- totalFiles: Total count of all files
- categoryCounts: Per-category file counts
- categories: Array of category objects with files
"""
import json
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" / "20260202_matang"
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 get_main_yaml_files(directory: Path) -> list[str]:
"""Get top-level .yaml files in schema directory."""
if not directory.exists():
return []
return sorted([f.stem for f in directory.glob("*.yaml") if f.is_file()])
def main():
# Get all main schema files (top-level .yaml files)
main_files = get_main_yaml_files(SCHEMA_DIR)
print(f"Found {len(main_files)} main schema files")
# 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")
# Calculate totals
total_files = len(main_files) + len(class_files) + len(enum_files) + len(slot_files)
# Build manifest structure matching frontend expectations
manifest = {
"generated": datetime.now(timezone.utc).strftime("%Y-%m-%dT%H:%M:%S.%f")[:-3] + "Z",
"schemaRoot": "/schemas/20251121/linkml",
"totalFiles": total_files,
"categoryCounts": {
"main": len(main_files),
"class": len(class_files),
"enum": len(enum_files),
"slot": len(slot_files),
"module": 4 # Fixed count for module imports
},
"categories": [
{
"name": "main",
"displayName": "Main Schemas",
"files": [
{
"name": name,
"path": f"{name}.yaml",
"category": "main"
}
for name in main_files
]
},
{
"name": "class",
"displayName": "Classes",
"files": [
{
"name": name,
"path": f"modules/classes/{name}.yaml",
"category": "class"
}
for name in class_files
]
},
{
"name": "enum",
"displayName": "Enumerations",
"files": [
{
"name": name,
"path": f"modules/enums/{name}.yaml",
"category": "enum"
}
for name in enum_files
]
},
{
"name": "slot",
"displayName": "Slots",
"files": [
{
"name": name,
"path": f"modules/slots/20260202_matang/{name}.yaml",
"category": "slot"
}
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 schemas: {len(main_files)} files")
print(f" - Classes: {len(class_files)} files")
print(f" - Enums: {len(enum_files)} files")
print(f" - Slots: {len(slot_files)} files")
print(f" - Total: {total_files} files")
if __name__ == "__main__":
main()