Source code for typedpy.serialization.versioned_mapping
import copy
from typedpy.commons import Constant, deep_get
from typedpy.structures import Structure
from typedpy.structures.consts import VERSIONS_MAPPING
from typedpy.fields import FunctionCall, PositiveInt
from .mappers import Deleted
[docs]class Versioned(Structure):
"""
Marks a structure as can be deserialized from multiple versions.
The version is expected to start with 1 and increase by 1 in every update.
It is expected to have a class attribute of "_versions_mapping", with an ordered list
of the mappings. The first mapping maps version 1 to 2, the second 2 to 3, etc.
Arguments:
_versions_mapping: optional
An array of mappers that outlines how to convert older versions to the latest version.
"""
version: PositiveInt
def __init__(self, *args, **kwargs):
versions_mapping = getattr(self, VERSIONS_MAPPING, [])
default_version = len(versions_mapping) + 1
kwargs["version"] = default_version
super().__init__(*args, **kwargs)
def _convert(mapped_dict: dict, mapping):
out_dict = copy.deepcopy(mapped_dict)
for k, v in mapping.items():
if isinstance(v, Constant):
out_dict[k] = v()
elif k.endswith("._mapper"):
field_name = k[: -len("._mapper")]
content = mapped_dict.get(field_name, None)
if content is not None:
if isinstance(content, list):
out_dict[field_name] = [_convert(x, v) for x in content]
else:
out_dict[field_name] = _convert(content, v)
elif isinstance(v, FunctionCall):
args = [out_dict.get(x) for x in v.args] if v.args else [out_dict.get(k)]
out_dict[k] = v.func(*args)
for k, v in mapping.items():
if isinstance(v, str):
out_dict[k] = deep_get(out_dict, v)
for k, v in mapping.items():
if v == Deleted and k in out_dict:
del out_dict[k]
return out_dict
def convert_dict(the_dict: dict, versions_mapping):
start_version = the_dict.get("version", 1)
mapped_dict = copy.deepcopy(the_dict)
for mapping in versions_mapping[(start_version - 1) :]:
mapped_dict = _convert(mapped_dict, mapping)
mapped_dict["version"] = mapped_dict.get("version", 0) + 1
return mapped_dict