"""Common serialization utilities.""" from __future__ import annotations import dataclasses import logging logger = logging.getLogger(__name__) def safe_construct(cls, data: dict): """ Construct a dataclass from a dict, tolerant of schema changes. - Ignores keys not in the dataclass (field was removed) - Uses defaults for missing keys (field was added) - Logs at debug level for mismatches """ field_names = {f.name for f in dataclasses.fields(cls)} known = {} for k, v in data.items(): if k in field_names: known[k] = v else: logger.debug("Ignoring unknown field %s.%s", cls.__name__, k) return cls(**known) def serialize_dataclass(obj) -> dict: """Serialize any dataclass to dict via dataclasses.asdict().""" return dataclasses.asdict(obj) def serialize_dataclass_list(items) -> list[dict]: """Serialize a list of dataclasses.""" return [dataclasses.asdict(item) for item in items]