Source code for eventsourcing.domain.model.collection

from typing import Any, Iterator, Optional, Set
from uuid import UUID

from eventsourcing.domain.model.entity import (
    TimestampedVersionedEntity,
    TTimestampedVersionedEntity,
)
from eventsourcing.domain.model.repository import AbstractEntityRepository


[docs]class Collection(TimestampedVersionedEntity):
[docs] class Event(TimestampedVersionedEntity.Event[TTimestampedVersionedEntity]): """Supertype for events of collection entities."""
[docs] class Created( Event[TTimestampedVersionedEntity], TimestampedVersionedEntity.Created[TTimestampedVersionedEntity], ): """Published when collection is created."""
[docs] class Discarded( Event[TTimestampedVersionedEntity], TimestampedVersionedEntity.Discarded[TTimestampedVersionedEntity], ): """Published when collection is discarded."""
[docs] class EventWithItem(Event[TTimestampedVersionedEntity]): @property def item(self) -> Any: return self.__dict__["item"]
[docs] def __init__(self, **kwargs: Any): super(Collection, self).__init__(**kwargs) self._items: Set = set()
def __iter__(self) -> Iterator: return self._items.__iter__() @property def items(self) -> Set: self.__assert_not_discarded__() return self._items def add_item(self, item: Any) -> None: self.__trigger_event__(self.ItemAdded, item=item)
[docs] class ItemAdded(EventWithItem):
[docs] def mutate(self, obj: "Collection") -> None: obj._items.add(self.item)
def remove_item(self, item: Any) -> None: self.__trigger_event__(self.ItemRemoved, item=item)
[docs] class ItemRemoved(EventWithItem):
[docs] def mutate(self, obj: "Collection") -> None: obj._items.remove(self.item)
def register_new_collection(collection_id: Optional[UUID] = None) -> Collection: return Collection.__create__(originator_id=collection_id)
[docs]class AbstractCollectionRepository(AbstractEntityRepository): pass