Source code for chariots.versioning._versioned_field_dict

"""versioned field dict module"""
import collections
from typing import Any, Iterator, Mapping

from ._version_type import VersionType
from ._version import Version
from ._versioned_field import VersionedField


[docs]class VersionedFieldDict(collections.MutableMapping): """ a versioned field dict acts as a normal dictionary but the values as interpreted as versioned fields when it is a VersionedClass class attribute """
[docs] def __init__(self, default_version=VersionType.MAJOR, *args, **kwargs): # pylint: disable=keyword-arg-before-vararg self.default_version = default_version self.store = dict() self.update(dict(*args, **kwargs))
def __delitem__(self, key) -> None: del self.store[key] def __getitem__(self, key) -> Any: return self.store[key].value def __len__(self) -> int: return len(self.store) def __iter__(self) -> Iterator[str]: return iter(self.store) def __setitem__(self, key: str, value: Any) -> None: if not isinstance(value, VersionedField): value = VersionedField(value, self.default_version) if not isinstance(key, str): raise TypeError('`VersionedFieldDict` keys must be strings') self.store[key] = value @property def version_dict(self) -> Mapping[str, 'Version']: """ property to retrieve the name of the fields and the Versions associated to each of them :return: the mapping with the key and the version of the value """ return {attr_name: Version().update(attr_value.affected_version, attr_value.__chariots_hash__.encode('utf-8')) for attr_name, attr_value in self.store.items() if isinstance(attr_value, VersionedField)}