Source code for ascetic_ddd.seedwork.domain.aggregate.versioned_aggregate

import typing
from abc import ABCMeta, abstractmethod

from ascetic_ddd.seedwork.domain.aggregate.interfaces import IVersionedAggregate

__all__ = (
    "VersionedAggregate",
    "IVersionedAggregateExporter",
    "IVersionedAggregateReconstitutor",
    "VersionedAggregateExporter",
    "VersionedAggregateReconstitutor",
)


[docs] class VersionedAggregate(IVersionedAggregate, metaclass=ABCMeta): __version: int def __init__(self, version: int = 0, **kwargs) -> None: self.__version = version super().__init__(**kwargs) @property def version(self) -> int: return self.__version @version.setter def version(self, value: int) -> None: self.__version = value
[docs] def next_version(self) -> int: self.__version += 1 return self.__version
[docs] def export(self, exporter: "IVersionedAggregateExporter") -> None: exporter.set_version(self.version)
def _import(self, provider: "IVersionedAggregateReconstitutor") -> None: self.version = provider.version() @classmethod def _make_empty(cls) -> typing.Self: agg = cls.__new__(cls) super(cls, agg).__init__() return agg
[docs] @classmethod def reconstitute(cls, reconstitutor: "IVersionedAggregateReconstitutor") -> typing.Self: """ For EventSourcedAggregate this method could be used to restore a snapshot. """ agg: typing.Self = cls._make_empty() agg._import(reconstitutor) return agg
[docs] class IVersionedAggregateExporter(metaclass=ABCMeta):
[docs] @abstractmethod def set_version(self, value: int) -> None: raise NotImplementedError
[docs] class IVersionedAggregateReconstitutor(typing.Protocol, metaclass=ABCMeta):
[docs] @abstractmethod def version(self) -> int: raise NotImplementedError
[docs] class VersionedAggregateExporter(IVersionedAggregateExporter): def __init__(self): self.data = dict()
[docs] def set_version(self, value: int) -> None: self.data['version'] = value
[docs] class VersionedAggregateReconstitutor(IVersionedAggregateReconstitutor): def __init__(self, version: int): self._data = locals()
[docs] def version(self) -> int: return self._data['version']