53 lines
1.3 KiB
Python
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
|