mdmodels 0.2.10

A tool to generate models, code and schemas from markdown files
Documentation
"""
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 %}