Source code for yaloader.representer

from __future__ import annotations

import datetime
from pathlib import PosixPath, WindowsPath
from typing import Type

from pydantic import BaseModel

from yaloader import YAMLConfigDumper, YAMLBaseConfig


[docs] def represent_posix_path(dumper: YAMLConfigDumper, data: PosixPath): return dumper.represent_str(str(data.absolute()))
[docs] def represent_windows_path(dumper: YAMLConfigDumper, data: WindowsPath): return dumper.represent_str(str(data.absolute()))
[docs] def represent_timedelta(dumper: YAMLConfigDumper, data: datetime.timedelta): return dumper.represent_str(str(data))
[docs] def represent_base_model(dumper: YAMLConfigDumper, data: BaseModel): return dumper.represent_dict(data.model_dump())
[docs] def get_representer_for_class(cls: Type[YAMLBaseConfig]): def represent_config(dumper: YAMLConfigDumper, data: YAMLBaseConfig): """Represent the config object as a mapping.""" # Get all keys which should be dumped keys = set( data.model_dump( exclude_unset=dumper.exclude_unset, exclude_defaults=dumper.exclude_defaults, ).keys() ) # Just for sorting the output: # Get keys of iteration types it_keys = set( filter(lambda k: isinstance(getattr(data, k), (list, tuple, dict)), keys) ) keys = keys.difference(it_keys) # Get keys of BaseConfig type config_objects_keys = set( filter(lambda key: isinstance(getattr(data, key), YAMLBaseConfig), keys) ) keys = keys.difference(config_objects_keys) dump_dict = { k: getattr(data, k) for k in sorted(keys) + sorted(it_keys) + sorted(config_objects_keys) } return dumper.represent_mapping(cls.get_yaml_tag(), dump_dict) return represent_config