tokencrawler/.venv/lib/python3.9/site-packages/apischema/aliases.py
2022-03-17 22:16:30 +01:00

53 lines
1.3 KiB
Python

from typing import Callable, MutableMapping, TypeVar, overload
from apischema.cache import CacheAwareDict
from apischema.types import Metadata, MetadataImplem
Aliaser = Callable[[str], str]
Cls = TypeVar("Cls", bound=type)
_class_aliasers: MutableMapping[type, Aliaser] = CacheAwareDict({})
get_class_aliaser = _class_aliasers.get
@overload
def alias(alias_: str, *, override: bool = True) -> Metadata:
...
@overload
def alias(override: bool) -> Metadata:
...
@overload
def alias(aliaser: Aliaser) -> Callable[[Cls], Cls]:
...
def alias(arg=None, *, override: bool = True): # type: ignore
"""Field alias or class aliaser
:param alias_: alias of the field
:param override: alias can be overridden by a class aliaser
:param aliaser: compute alias for each (overridable) field of the class decorated
"""
from apischema.metadata.keys import ALIAS_METADATA, ALIAS_NO_OVERRIDE_METADATA
if callable(arg):
def aliaser(cls: Cls) -> Cls:
_class_aliasers[cls] = arg
return cls
return aliaser
else:
metadata = MetadataImplem()
if arg is not None:
metadata[ALIAS_METADATA] = arg
if not override:
metadata[ALIAS_NO_OVERRIDE_METADATA] = True
if not metadata:
raise NotImplementedError
return metadata