Source code for paidiverpy.utils.schema_json_handler
"""Schema JSON handler module."""
import argparse
import copy
import json
from pathlib import Path
from typing import Any
from paidiverpy.config.configuration import config_name_mapping
from paidiverpy.models.config_model import ConfigModel
from paidiverpy.utils.logging_functions import initialise_logging
logger = initialise_logging()
[docs]
def generate_schema(output_path: str) -> None:
"""Generate the schema for the configuration model.
Args:
output_path (str): The path to save the schema.
"""
schema = ConfigModel.model_json_schema()
for step_type in config_name_mapping:
target_ref = f"#/$defs/{step_type.capitalize()}Config"
schema = wrap_ref(schema, target_ref=target_ref, wrapper_key=step_type)
with Path(output_path).open("w") as f:
json.dump(schema, f, indent=4)
logger.info("Schema saved to %s", output_path)
[docs]
def wrap_ref(schema: dict[str, Any], target_ref: str, wrapper_key: str) -> dict[str, Any] | list[Any]:
"""Wrap a reference in the schema with a key.
Args:
schema (dict): The original schema.
target_ref (str): The reference to wrap.
wrapper_key (str): The key to wrap the reference with.
Returns:
dict: The modified schema with the reference wrapped.
"""
def _transform(obj: dict[str, Any] | list[Any], parent_key: str = "") -> dict[str, Any] | list[Any]:
"""Recursively transform the schema.
Args:
obj (dict | list | str | float | bool): The object to transform.
parent_key (str): The parent key in the schema.
Returns:
dict: The transformed object.
"""
if isinstance(obj, dict):
if obj.get("$ref") == target_ref and parent_key != "items":
return {"type": "object", "properties": {wrapper_key: {"$ref": target_ref}}, "required": [wrapper_key], "additionalProperties": False}
return {k: _transform(v, parent_key=k) for k, v in obj.items()}
if isinstance(obj, list):
return [_transform(i, parent_key=parent_key) for i in obj]
return obj
return _transform(copy.deepcopy(schema))
if __name__ == "__main__":
parser = argparse.ArgumentParser(description="Generate JSON schema for Paidiverpy configuration.")
parser.add_argument("output_path", help="Path to save the generated JSON schema file")
args = parser.parse_args()
generate_schema(args.output_path)