Source code for squadds.core.utils_schema

[docs] def get_type(value): if isinstance(value, dict): return "dict" if isinstance(value, list): return "list" if not value else get_type(value[0]) return type(value).__name__.lower()
[docs] def validate_types(data_part, schema_part): for key, expected_type in schema_part.items(): if isinstance(expected_type, dict): validate_types(data_part[key], expected_type) else: actual_type = get_type(data_part[key]) if actual_type != expected_type: raise TypeError(f"Invalid type for {key}. Expected {expected_type}, got {actual_type}.")
[docs] def get_config_schema(entry): schema = {} for key, value in entry.items(): if key == "sim_results": schema[key] = {field: get_type(field_value) for field, field_value in value.items()} elif key in ["sim_options", "design", "notes"] and isinstance(value, dict): schema[key] = {field: get_type(field_value) for field, field_value in value.items()} else: schema[key] = get_type(value) return schema
[docs] def get_schema(obj): if isinstance(obj, dict): return { key: "dict" if isinstance(value, dict) else get_schema(value) for key, value in obj.items() if key != "contributor" } if isinstance(obj, list): return "dict" if any(isinstance(elem, dict) for elem in obj) else type(obj[0]).__name__ return type(obj).__name__
[docs] def get_entire_schema(obj): if isinstance(obj, dict): return {key: get_entire_schema(value) for key, value in obj.items() if key != "contributor"} if isinstance(obj, list): return [get_entire_schema(item) for item in obj][0] if obj else [] return type(obj).__name__
[docs] def compare_schemas(data_schema, expected_schema, path=""): for key, data_type in data_schema.items(): if key not in expected_schema: raise ValueError(f"Unexpected key '{path}{key}' found in data schema.") expected_type = expected_schema[key] if isinstance(expected_type, dict): if not isinstance(data_type, dict): raise ValueError(f"Type mismatch for '{path}{key}'. Expected a dict, Got: {get_type(data_type)}") compare_schemas(data_type, expected_type, path + key + ".") elif get_type(data_type) != expected_type: if expected_type == "float" and get_type(data_type) == "str": continue raise ValueError(f"Type mismatch for '{path}{key}'. Expected: {expected_type}, Got: {get_type(data_type)}")