51 lines
1.6 KiB
Python
51 lines
1.6 KiB
Python
import typing
|
|
|
|
from typing_extensions import Unpack
|
|
from typing import TypedDict, Any
|
|
from pydantic import Field, AliasChoices, AliasPath
|
|
import camelcaser as cc
|
|
|
|
|
|
class FieldParams(TypedDict, total=False):
|
|
default: Any | None
|
|
default_factory: typing.Callable[[], Any] | None
|
|
alias: str | None
|
|
alias_priority: int | None
|
|
validation_alias: str | AliasPath | AliasChoices | None
|
|
serialization_alias: str | None
|
|
title: str | None
|
|
description: str | None
|
|
examples: list[Any] | None
|
|
exclude: bool | None
|
|
include: bool | None
|
|
discriminator: str | None
|
|
json_schema_extra: dict[str, Any] | None
|
|
frozen: bool | None
|
|
validate_default: bool | None
|
|
repr: bool
|
|
init_var: bool | None
|
|
kw_only: bool | None
|
|
pattern: str | None
|
|
strict: bool | None
|
|
gt: float | None
|
|
ge: float | None
|
|
lt: float | None
|
|
le: float | None
|
|
multiple_of: float | None
|
|
allow_inf_nan: bool | None
|
|
max_digits: int | None
|
|
decimal_places: int | None
|
|
min_length: int | None
|
|
max_length: int | None
|
|
additional_validation_aliases: list[str] | None
|
|
|
|
|
|
def build_pydantic_field(name: str,
|
|
**kwargs: Unpack[FieldParams]
|
|
) -> Field:
|
|
additional_validation_aliases = kwargs.pop('additional_validation_aliases', [])
|
|
if not isinstance(additional_validation_aliases, list):
|
|
raise TypeError('Argument additional_validation_aliases must be list of strings')
|
|
return Field(**kwargs, alias=cc.make_camel_case(name),
|
|
validation_alias=AliasChoices(name, cc.make_lower_camel_case(name), *additional_validation_aliases))
|