Source code for chariots.versioning._versionable_meta

"""meta class that handles versioning in python"""
import operator
from typing import Mapping, Text

from ._version import Version
from ._versioned_field_dict import VersionedFieldDict
from ._versioned_field import VersionedField


[docs]class VersionableMeta(type): """ metaclass for all versioned objects in the library. When a new class using this metaclas is created, it will have a `__version__` class attribute that sets all the subversions of the class depending on the VersionedFields the class was created with """
[docs] def __init__(cls, clsname, superclasses, attributedict): super().__init__(clsname, superclasses, attributedict) intermediate_versions = {} for super_class in reversed(superclasses): if not isinstance(super_class, VersionableMeta): continue intermediate_versions.update(super_class._get_atomic_versions_dict()) intermediate_versions.update(cls._get_atomic_versions_dict()) # pylint: disable=no-value-for-parameter cls.__version__ = sum( map(operator.itemgetter(1), sorted(intermediate_versions.items(), key=operator.itemgetter(0))), Version() )
def _get_atomic_versions_dict(cls) -> Mapping[Text, 'Version']: version_dict = {} for attr_name, attr_value in cls.__dict__.items(): if isinstance(attr_value, VersionedField): version_dict[attr_name] = Version().update(attr_value.affected_version, attr_value.__chariots_hash__.encode('utf-8')) if isinstance(attr_value, VersionedFieldDict): version_dict.update(attr_value.version_dict) return version_dict