"""
This file contains dataclass definitions for data validation.
Dataclasses are a built-in Python library that provides a way to define data models
with type hints and automatic serialization to JSON.
Usage example:
```python
from my_model import MyModel
# Validates data at runtime
my_model = MyModel(name="John", age=30)
# Type-safe - my_model has correct type hints
print(my_model.name)
```
For more information see:
https://docs.python.org/3/library/dataclasses.html
WARNING: This is an auto-generated file.
Do not edit directly - any changes will be overwritten.
"""
{% import "python-macros.jinja" as utils %}
## This is a generated file. Do not modify it manually!
from __future__ import annotations
from dataclasses import dataclass, field
from dataclasses_json import config, dataclass_json
from typing import List, Optional, Union
from enum import Enum
from uuid import uuid4
from datetime import date, datetime
{% for object in objects %}
@dataclass_json
@dataclass
class {{ object.name }}:
{%- for attribute in object.attributes %}
{%- set ident = attribute.name | to_identifier %}
{%- if attribute.name == "id" -%}
{%- elif attribute.multiple is true %}
{%- if ident != attribute.name %}
{{ ident }}: {{ utils.get_type(attribute) }} = field(default_factory=list, metadata=config(field_name="{{ attribute.name }}"))
{%- else %}
{{ ident }}: {{ utils.get_type(attribute) }} = field(default_factory=list)
{%- endif %}
{%- elif 'default' in attribute%}
{%- if ident != attribute.name %}
{{ ident }}: {{ utils.get_type(attribute) }} = field(default={{ utils.default_value_only(attribute) }}, metadata=config(field_name="{{ attribute.name }}"))
{%- else %}
{{ ident }}: {{ utils.get_type(attribute) }} {{ utils.get_default(attribute) }}
{%- endif %}
{%- elif attribute.required is true %}
{%- if ident != attribute.name %}
{{ ident }}: {{ utils.get_type(attribute) }} = field(metadata=config(field_name="{{ attribute.name }}"))
{%- else %}
{{ ident }}: {{ utils.get_type(attribute) }}
{%- endif %}
{%- else %}
{%- if ident != attribute.name %}
{{ ident }}: {{ utils.get_type(attribute) }} = field(default=None, metadata=config(field_name="{{ attribute.name }}", exclude=lambda x: x is None))
{%- else %}
{{ ident }}: {{ utils.get_type(attribute) }} = field(default=None, metadata=config(exclude=lambda x: x is None))
{%- endif %}
{%- endif %}
{%- endfor %}
# JSON-LD fields
id: str = field(
metadata=config(field_name="@id"),
default_factory=lambda: "{{ prefix }}:{{ object.name }}/" + str(uuid4())
)
__type__: list[str] = field(
metadata=config(field_name="@type"),
default_factory = lambda: [
"{{ prefix }}:{{ object.name }}",
{%- if object.term -%}"{{ object.term }}"{%- endif %}
],
)
__context__: dict[str, str | dict] = field(
metadata=config(field_name="@context"),
default_factory = lambda: {
"{{ prefix }}": "{{ repo }}",
{%- for prefix, address in prefixes %}
"{{ prefix }}": "{{ address }}",
{%- endfor %}
{%- for obj in objects %}
"{{ obj.name }}": "{{ repo }}{%- if repo[-1] != "/" -%}#{%- endif -%}{{ obj.name }}/",
{%- endfor %}
{%- for enum in enums %}
"{{ enum.name }}": "{{ repo }}{%- if repo[-1] != "/" -%}#{%- endif -%}{{ enum.name }}/",
{%- endfor %}
{%- for attribute in object.attributes %}
{%- if attribute.is_id %}
"{{ attribute.name }}": {
{%- if attribute.term %}
"@id": "{{ attribute.term }}",
{%- endif %}
"@type": "@id",
},
{%- elif attribute.term %}
"{{ attribute.name }}": "{{ attribute.term }}",
{%- endif -%}
{%- endfor %}
}
)
{% for attr in object.attributes %}
{% for dtype in attr.dtypes %}
{%- if dtype in object_names and attr.multiple is true %}
def add_to_{{ attr.name | to_identifier }}(
{{ utils.signature(objects, dtype) }}
):
params = { {{ utils.params(objects, dtype) }}
}
if "id" in kwargs:
params["id"] = kwargs["id"]
self.{{ attr.name | to_identifier }}.append(
{{ dtype }}(**params)
)
return self.{{ attr.name | to_identifier }}[-1]
{%- endif %}
{%- endfor %}
{% endfor %}
{%- endfor %}
{%- for enum in enums %}
class {{ enum.name }}(Enum):
{%- for key, value in enum.mappings | dictsort %}
{{ key }} = "{{ value }}"
{%- endfor %}
{% endfor %}