glam/scripts/regenerate_manifest.py
kempersc 98c42bf272 Fix LinkML URI conflicts and generate RDF outputs
- Fix scope_note → finding_aid_scope_note in FindingAid.yaml
- Remove duplicate wikidata_entity slot from CustodianType.yaml (import instead)
- Remove duplicate rico_record_set_type from class_metadata_slots.yaml
- Fix range types for equals_string compatibility (uriorcurie → string)
- Move class names from close_mappings to see_also in 10 RecordSetTypes files
- Generate all RDF formats: OWL, N-Triples, RDF/XML, N3, JSON-LD context
- Sync schemas to frontend/public/schemas/

Files: 1,151 changed (includes prior CustodianType migration)
2026-01-07 12:32:59 +01:00

92 lines
2.7 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"
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")
# 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
]
}
]
}
# 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" - Total: {1 + len(class_files) + len(enum_files)} files")
if __name__ == "__main__":
main()