Source code for loom.core.model.field

from __future__ import annotations

from dataclasses import dataclass
from dataclasses import field as dataclass_field
from typing import Any, cast

import msgspec

from loom.core.model.enums import OnDelete, ServerDefault, ServerOnUpdate


[docs] @dataclass(frozen=True, slots=True) class ColumnType: """Backend column type descriptor stored inside ``Annotated[...]``.""" type_name: str args: tuple[Any, ...] = () kwargs: dict[str, Any] = dataclass_field(default_factory=dict)
[docs] @dataclass(frozen=True, slots=True) class Field: """Column constraint metadata stored inside ``Annotated[...]``.""" primary_key: bool = False unique: bool = False index: bool = False nullable: bool = False autoincrement: bool = False server_default: ServerDefault | None = None server_onupdate: ServerOnUpdate | str | None = None foreign_key: str | None = None on_delete: OnDelete | None = None default: Any = msgspec.UNSET length: int | None = None
@dataclass(frozen=True, slots=True) class ColumnFieldSpec: """Column declaration object for ``BaseModel`` class attributes.""" column_type: ColumnType | None = None field: Field = dataclass_field(default_factory=Field)
[docs] def ColumnField( column_type: ColumnType | None = None, *, primary_key: bool = False, unique: bool = False, index: bool = False, nullable: bool = False, autoincrement: bool = False, server_default: ServerDefault | None = None, server_onupdate: ServerOnUpdate | str | None = None, foreign_key: str | None = None, on_delete: OnDelete | None = None, default: Any = msgspec.UNSET, length: int | None = None, db_type: ColumnType | None = None, ) -> Any: """Declare column metadata without using explicit ``Annotated`` syntax.""" selected_type = db_type or column_type return cast( Any, ColumnFieldSpec( column_type=selected_type, field=Field( primary_key=primary_key, unique=unique, index=index, nullable=nullable, autoincrement=autoincrement, server_default=server_default, server_onupdate=server_onupdate, foreign_key=foreign_key, on_delete=on_delete, default=default, length=length, ), ), )
# Convenience alias if users prefer the shorter name. column_field = ColumnField