| """ |
| This file should contain all relevant data-only information, it should contain minimal to no behavior. |
| """ |
|
|
| from typing import Dict, List, Optional |
|
|
| from pydantic import BaseModel, Field, model_validator |
|
|
|
|
| class Property(BaseModel): |
| name: Optional[str] = None |
| type: Optional[str] = None |
| description: Optional[str] = None |
| model_config = {"extra": "ignore"} |
|
|
|
|
| def upsert_dict(mapping, kvp): |
| k, v = kvp |
| mapping[k] = v |
| return mapping |
|
|
|
|
| class DataModel(BaseModel): |
| name: Optional[str] = None |
| description: Optional[str] = None |
| links: Optional[List[str]] = Field(default={}) |
| properties: Optional[Dict[str, Property]] = Field(default={}) |
| model_config = {"extra": "ignore"} |
|
|
| @model_validator(mode="before") |
| def _normalize_properties(cls, node_content): |
| props = node_content.get("properties", {}) |
| if not isinstance(props, list): |
| return node_content |
| props_to_use = [prop for prop in props if "name" in prop] |
| prop_items = [Property(**prop) for prop in props_to_use] |
| prop_dict = { |
| prop.name: Property(type=prop.type, description=prop.description) |
| for prop in prop_items |
| } |
| return upsert_dict(node_content, ("properties", prop_dict)) |
|
|