Source code for pyappconf.encoding.ext_toml

from enum import Enum
from pathlib import Path, PosixPath
from typing import Any, Callable, Dict, Type
from uuid import UUID

from toml.encoder import TomlEncoder, _dump_str  # type: ignore

from pyappconf.encoding.general import HasStr


def _dump_hasstr(obj: HasStr) -> str:
    return _dump_str(str(obj))


def _dump_enum(obj: Enum) -> str:
    return _dump_str(obj.value)


def _dump_uuid(obj: UUID) -> str:
    return _dump_str(str(obj))


[docs]class CustomTomlEncoder(TomlEncoder): multi_dump_funcs: Dict[Type, Callable[[Any], str]]
[docs] def __init__(self, _dict=dict, preserve=False): super().__init__(_dict=_dict, preserve=preserve) self.multi_dump_funcs = {Enum: _dump_enum, UUID: _dump_uuid} self.dump_funcs[Path] = _dump_hasstr self.dump_funcs[PosixPath] = _dump_hasstr
[docs] def dump_value(self, v): """ Overrides TomlEncoder.dump_value to adds support for putting a base class in multi_dump_funcs and have it be used for any subclass of that type """ # Lookup function corresponding to v's type dump_fn = self.dump_funcs.get(type(v)) if dump_fn is None: for base_cls, fn in self.multi_dump_funcs.items(): if isinstance(v, base_cls): dump_fn = fn if dump_fn is not None: # Got a multi dump function return dump_fn(v) return super().dump_value(v)