from typing import Any, Callable, Dict, Iterable, Tuple from server.utils.glom import delete from server.utils.mappers.core.getters import DEFAULT_NONE_VALUES, getter from server.utils.mappers.core.setters import setter def mapper( item: dict, key: str, key_to: str = None, none_values: Tuple[Any] = DEFAULT_NONE_VALUES, none_result: Any = None, f: Callable = None, remove_key: bool = False, getter=getter, setter=setter, ): if key is None: raise ValueError("'key' can not be None") if key_to is None: key_to = key setter(item, key=key_to, value=getter(item, key=key, none_values=none_values, none_result=none_result, f=f)) if key != key_to and remove_key: delete(item, key, ignore_missing=True) def mappers_by_keys( item: dict, keys: Iterable[str], none_values: Tuple[Any] = DEFAULT_NONE_VALUES, none_result: Any = None, f: Callable = None, remove_key: bool = False, getter=getter, setter=setter, ): _locals = locals().copy() _locals.pop("keys") for k in keys: mapper(key=k, **_locals) def mappers_by_map( item: dict, key_args_map: Dict[str, Dict[str, Any]], key_to: str = None, none_values: Tuple[Any] = DEFAULT_NONE_VALUES, none_result: Any = None, f: Callable = None, remove_key: bool = False, ): _locals = locals().copy() _locals.pop("key_args_map") for k, v in key_args_map.items(): mapper(key=k, **(_locals.copy() | v))