python-event-sourcery 0.4.0a15__tar.gz → 0.4.0a17__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (55) hide show
  1. {python_event_sourcery-0.4.0a15 → python_event_sourcery-0.4.0a17}/PKG-INFO +3 -3
  2. python_event_sourcery-0.4.0a17/event_sourcery/event_sourcing/__init__.py +7 -0
  3. {python_event_sourcery-0.4.0a15/event_sourcery/aggregate → python_event_sourcery-0.4.0a17/event_sourcery/event_sourcing}/repository.py +1 -1
  4. {python_event_sourcery-0.4.0a15 → python_event_sourcery-0.4.0a17}/event_sourcery/event_store/event/_registry.py +3 -1
  5. {python_event_sourcery-0.4.0a15/event_sourcery_esdb → python_event_sourcery-0.4.0a17/event_sourcery_kurrentdb}/__init__.py +13 -13
  6. {python_event_sourcery-0.4.0a15/event_sourcery_esdb → python_event_sourcery-0.4.0a17/event_sourcery_kurrentdb}/dto.py +2 -2
  7. {python_event_sourcery-0.4.0a15/event_sourcery_esdb → python_event_sourcery-0.4.0a17/event_sourcery_kurrentdb}/event_store.py +9 -9
  8. {python_event_sourcery-0.4.0a15/event_sourcery_esdb → python_event_sourcery-0.4.0a17/event_sourcery_kurrentdb}/outbox.py +8 -8
  9. {python_event_sourcery-0.4.0a15/event_sourcery_esdb → python_event_sourcery-0.4.0a17/event_sourcery_kurrentdb}/stream.py +4 -2
  10. {python_event_sourcery-0.4.0a15/event_sourcery_esdb → python_event_sourcery-0.4.0a17/event_sourcery_kurrentdb}/subscription.py +6 -6
  11. {python_event_sourcery-0.4.0a15 → python_event_sourcery-0.4.0a17}/pyproject.toml +5 -5
  12. python_event_sourcery-0.4.0a15/event_sourcery/aggregate/__init__.py +0 -7
  13. {python_event_sourcery-0.4.0a15 → python_event_sourcery-0.4.0a17}/LICENSE +0 -0
  14. {python_event_sourcery-0.4.0a15 → python_event_sourcery-0.4.0a17}/event_sourcery/__init__.py +0 -0
  15. {python_event_sourcery-0.4.0a15/event_sourcery/aggregate → python_event_sourcery-0.4.0a17/event_sourcery/event_sourcing}/aggregate.py +0 -0
  16. {python_event_sourcery-0.4.0a15 → python_event_sourcery-0.4.0a17}/event_sourcery/event_store/__init__.py +0 -0
  17. {python_event_sourcery-0.4.0a15 → python_event_sourcery-0.4.0a17}/event_sourcery/event_store/dispatcher.py +0 -0
  18. {python_event_sourcery-0.4.0a15 → python_event_sourcery-0.4.0a17}/event_sourcery/event_store/event/__init__.py +0 -0
  19. {python_event_sourcery-0.4.0a15 → python_event_sourcery-0.4.0a17}/event_sourcery/event_store/event/_dto.py +0 -0
  20. {python_event_sourcery-0.4.0a15 → python_event_sourcery-0.4.0a17}/event_sourcery/event_store/event/_encryption.py +0 -0
  21. {python_event_sourcery-0.4.0a15 → python_event_sourcery-0.4.0a17}/event_sourcery/event_store/event/_serde.py +0 -0
  22. {python_event_sourcery-0.4.0a15 → python_event_sourcery-0.4.0a17}/event_sourcery/event_store/event_store.py +0 -0
  23. {python_event_sourcery-0.4.0a15 → python_event_sourcery-0.4.0a17}/event_sourcery/event_store/exceptions.py +0 -0
  24. {python_event_sourcery-0.4.0a15 → python_event_sourcery-0.4.0a17}/event_sourcery/event_store/factory.py +0 -0
  25. {python_event_sourcery-0.4.0a15 → python_event_sourcery-0.4.0a17}/event_sourcery/event_store/in_memory.py +0 -0
  26. {python_event_sourcery-0.4.0a15 → python_event_sourcery-0.4.0a17}/event_sourcery/event_store/interfaces.py +0 -0
  27. {python_event_sourcery-0.4.0a15 → python_event_sourcery-0.4.0a17}/event_sourcery/event_store/outbox.py +0 -0
  28. {python_event_sourcery-0.4.0a15 → python_event_sourcery-0.4.0a17}/event_sourcery/event_store/stream_id.py +0 -0
  29. {python_event_sourcery-0.4.0a15 → python_event_sourcery-0.4.0a17}/event_sourcery/event_store/subscription.py +0 -0
  30. {python_event_sourcery-0.4.0a15 → python_event_sourcery-0.4.0a17}/event_sourcery/event_store/tenant_id.py +0 -0
  31. {python_event_sourcery-0.4.0a15 → python_event_sourcery-0.4.0a17}/event_sourcery/event_store/versioning.py +0 -0
  32. {python_event_sourcery-0.4.0a15 → python_event_sourcery-0.4.0a17}/event_sourcery/py.typed +0 -0
  33. {python_event_sourcery-0.4.0a15 → python_event_sourcery-0.4.0a17}/event_sourcery/read_model/__init__.py +0 -0
  34. {python_event_sourcery-0.4.0a15 → python_event_sourcery-0.4.0a17}/event_sourcery/read_model/cursors_dao.py +0 -0
  35. {python_event_sourcery-0.4.0a15 → python_event_sourcery-0.4.0a17}/event_sourcery/read_model/projector.py +0 -0
  36. {python_event_sourcery-0.4.0a15 → python_event_sourcery-0.4.0a17}/event_sourcery_django/__init__.py +0 -0
  37. {python_event_sourcery-0.4.0a15 → python_event_sourcery-0.4.0a17}/event_sourcery_django/dto.py +0 -0
  38. {python_event_sourcery-0.4.0a15 → python_event_sourcery-0.4.0a17}/event_sourcery_django/event_store.py +0 -0
  39. {python_event_sourcery-0.4.0a15 → python_event_sourcery-0.4.0a17}/event_sourcery_django/migrations/0001_initial.py +0 -0
  40. {python_event_sourcery-0.4.0a15 → python_event_sourcery-0.4.0a17}/event_sourcery_django/migrations/__init__.py +0 -0
  41. {python_event_sourcery-0.4.0a15 → python_event_sourcery-0.4.0a17}/event_sourcery_django/models.py +0 -0
  42. {python_event_sourcery-0.4.0a15 → python_event_sourcery-0.4.0a17}/event_sourcery_django/outbox.py +0 -0
  43. {python_event_sourcery-0.4.0a15 → python_event_sourcery-0.4.0a17}/event_sourcery_django/py.typed +0 -0
  44. {python_event_sourcery-0.4.0a15 → python_event_sourcery-0.4.0a17}/event_sourcery_django/subscription.py +0 -0
  45. {python_event_sourcery-0.4.0a15/event_sourcery_esdb → python_event_sourcery-0.4.0a17/event_sourcery_kurrentdb}/py.typed +0 -0
  46. {python_event_sourcery-0.4.0a15 → python_event_sourcery-0.4.0a17}/event_sourcery_sqlalchemy/__init__.py +0 -0
  47. {python_event_sourcery-0.4.0a15 → python_event_sourcery-0.4.0a17}/event_sourcery_sqlalchemy/cursors_dao.py +0 -0
  48. {python_event_sourcery-0.4.0a15 → python_event_sourcery-0.4.0a17}/event_sourcery_sqlalchemy/dto.py +0 -0
  49. {python_event_sourcery-0.4.0a15 → python_event_sourcery-0.4.0a17}/event_sourcery_sqlalchemy/event_store.py +0 -0
  50. {python_event_sourcery-0.4.0a15 → python_event_sourcery-0.4.0a17}/event_sourcery_sqlalchemy/guid.py +0 -0
  51. {python_event_sourcery-0.4.0a15 → python_event_sourcery-0.4.0a17}/event_sourcery_sqlalchemy/jsonb.py +0 -0
  52. {python_event_sourcery-0.4.0a15 → python_event_sourcery-0.4.0a17}/event_sourcery_sqlalchemy/models.py +0 -0
  53. {python_event_sourcery-0.4.0a15 → python_event_sourcery-0.4.0a17}/event_sourcery_sqlalchemy/outbox.py +0 -0
  54. {python_event_sourcery-0.4.0a15 → python_event_sourcery-0.4.0a17}/event_sourcery_sqlalchemy/py.typed +0 -0
  55. {python_event_sourcery-0.4.0a15 → python_event_sourcery-0.4.0a17}/event_sourcery_sqlalchemy/subscription.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: python-event-sourcery
3
- Version: 0.4.0a15
3
+ Version: 0.4.0a17
4
4
  Summary:
5
5
  License: MIT
6
6
  Author: Your Name
@@ -13,11 +13,11 @@ Classifier: Programming Language :: Python :: 3.11
13
13
  Classifier: Programming Language :: Python :: 3.12
14
14
  Classifier: Programming Language :: Python :: 3.13
15
15
  Provides-Extra: django
16
- Provides-Extra: esdb
16
+ Provides-Extra: kurrentdb
17
17
  Provides-Extra: sqlalchemy
18
18
  Requires-Dist: SQLAlchemy (>=2.0) ; extra == "sqlalchemy"
19
19
  Requires-Dist: django (>=4,<6) ; extra == "django"
20
- Requires-Dist: esdbclient (>=1.0b3) ; extra == "esdb"
20
+ Requires-Dist: kurrentdbclient (>=1.0.6) ; extra == "kurrentdb"
21
21
  Requires-Dist: more-itertools
22
22
  Requires-Dist: psycopg2-binary (>2,<3)
23
23
  Requires-Dist: pydantic (>=2.0,<3)
@@ -0,0 +1,7 @@
1
+ __all__ = [
2
+ "Aggregate",
3
+ "Repository",
4
+ ]
5
+
6
+ from event_sourcery.event_sourcing.aggregate import Aggregate
7
+ from event_sourcery.event_sourcing.repository import Repository
@@ -2,7 +2,7 @@ from collections.abc import Iterator
2
2
  from contextlib import contextmanager
3
3
  from typing import Generic, TypeVar, cast
4
4
 
5
- from event_sourcery.aggregate import Aggregate
5
+ from event_sourcery.event_sourcing import Aggregate
6
6
  from event_sourcery.event_store import (
7
7
  Event,
8
8
  EventStore,
@@ -67,7 +67,9 @@ class EventRegistry:
67
67
 
68
68
  def _register_defined_events(self) -> None:
69
69
  for event_type in Event.__subclasses__():
70
- event_type not in self._types_to_names and self.add(event_type)
70
+ not_registered_type = event_type not in self._types_to_names
71
+ not_registered_name = event_name(event_type) not in self._names_to_types
72
+ not_registered_type and not_registered_name and self.add(event_type)
71
73
 
72
74
  def add(self, event: type[TEvent]) -> type[TEvent]:
73
75
  """Add event subclass to the registry."""
@@ -1,13 +1,13 @@
1
1
  __all__ = [
2
2
  "Config",
3
- "ESDBBackendFactory",
4
- "ESDBStorageStrategy",
3
+ "KurrentDBBackendFactory",
4
+ "KurrentDBStorageStrategy",
5
5
  ]
6
6
 
7
7
  from dataclasses import dataclass, field
8
8
  from typing import TypeAlias
9
9
 
10
- from esdbclient import EventStoreDBClient
10
+ from kurrentdbclient import KurrentDBClient
11
11
  from pydantic import BaseModel, ConfigDict, PositiveFloat, PositiveInt
12
12
  from typing_extensions import Self
13
13
 
@@ -27,9 +27,9 @@ from event_sourcery.event_store.interfaces import (
27
27
  OutboxStorageStrategy,
28
28
  )
29
29
  from event_sourcery.event_store.outbox import Outbox
30
- from event_sourcery_esdb.event_store import ESDBStorageStrategy
31
- from event_sourcery_esdb.outbox import ESDBOutboxStorageStrategy
32
- from event_sourcery_esdb.subscription import ESDBSubscriptionStrategy
30
+ from event_sourcery_kurrentdb.event_store import KurrentDBStorageStrategy
31
+ from event_sourcery_kurrentdb.outbox import KurrentDBOutboxStorageStrategy
32
+ from event_sourcery_kurrentdb.subscription import KurrentDBSubscriptionStrategy
33
33
 
34
34
  Seconds: TypeAlias = PositiveFloat
35
35
 
@@ -43,8 +43,8 @@ class Config(BaseModel):
43
43
 
44
44
 
45
45
  @dataclass(repr=False)
46
- class ESDBBackendFactory(BackendFactory):
47
- esdb_client: EventStoreDBClient
46
+ class KurrentDBBackendFactory(BackendFactory):
47
+ kurrentdb_client: KurrentDBClient
48
48
  config: Config = field(default_factory=Config)
49
49
  _serde: Serde = field(default_factory=lambda: Serde(EventRegistry()))
50
50
  _outbox_strategy: OutboxStorageStrategy = field(
@@ -54,8 +54,8 @@ class ESDBBackendFactory(BackendFactory):
54
54
  def build(self) -> Backend:
55
55
  backend = Backend()
56
56
  backend.event_store = EventStore(
57
- storage_strategy=ESDBStorageStrategy(
58
- self.esdb_client,
57
+ storage_strategy=KurrentDBStorageStrategy(
58
+ self.kurrentdb_client,
59
59
  self.config.timeout,
60
60
  ),
61
61
  serde=self._serde,
@@ -63,7 +63,7 @@ class ESDBBackendFactory(BackendFactory):
63
63
  backend.outbox = Outbox(self._outbox_strategy, self._serde)
64
64
  backend.subscriber = es.subscription.SubscriptionBuilder(
65
65
  _serde=self._serde,
66
- _strategy=ESDBSubscriptionStrategy(self.esdb_client),
66
+ _strategy=KurrentDBSubscriptionStrategy(self.kurrentdb_client),
67
67
  )
68
68
  backend.serde = self._serde
69
69
  return backend
@@ -73,8 +73,8 @@ class ESDBBackendFactory(BackendFactory):
73
73
  return self
74
74
 
75
75
  def with_outbox(self, filterer: OutboxFiltererStrategy = no_filter) -> Self:
76
- strategy = ESDBOutboxStorageStrategy(
77
- self.esdb_client,
76
+ strategy = KurrentDBOutboxStorageStrategy(
77
+ self.kurrentdb_client,
78
78
  filterer,
79
79
  self.config.outbox_name,
80
80
  self.config.outbox_attempts,
@@ -2,10 +2,10 @@ import json
2
2
  from datetime import datetime
3
3
  from typing import Any, Literal, cast
4
4
 
5
- from esdbclient import NewEvent, RecordedEvent
5
+ from kurrentdbclient import NewEvent, RecordedEvent
6
6
 
7
7
  from event_sourcery.event_store import Position, RawEvent, RecordedRaw
8
- from event_sourcery_esdb import stream
8
+ from event_sourcery_kurrentdb import stream
9
9
 
10
10
  ES_PREFIX = "$es-"
11
11
 
@@ -1,8 +1,8 @@
1
1
  from dataclasses import dataclass, replace
2
2
  from typing import cast
3
3
 
4
- from esdbclient import EventStoreDBClient, StreamState
5
- from esdbclient.exceptions import NotFound
4
+ from kurrentdbclient import KurrentDBClient, StreamState
5
+ from kurrentdbclient.exceptions import NotFoundError
6
6
  from typing_extensions import Self
7
7
 
8
8
  from event_sourcery.event_store import (
@@ -16,12 +16,12 @@ from event_sourcery.event_store import (
16
16
  from event_sourcery.event_store.exceptions import ConcurrentStreamWriteError
17
17
  from event_sourcery.event_store.interfaces import StorageStrategy
18
18
  from event_sourcery.event_store.tenant_id import DEFAULT_TENANT
19
- from event_sourcery_esdb import dto, stream
19
+ from event_sourcery_kurrentdb import dto, stream
20
20
 
21
21
 
22
22
  @dataclass(repr=False)
23
- class ESDBStorageStrategy(StorageStrategy):
24
- _client: EventStoreDBClient
23
+ class KurrentDBStorageStrategy(StorageStrategy):
24
+ _client: KurrentDBClient
25
25
  _timeout: float | None
26
26
  _tenant_id: TenantId = DEFAULT_TENANT
27
27
 
@@ -48,7 +48,7 @@ class ESDBStorageStrategy(StorageStrategy):
48
48
  if snapshot:
49
49
  return [snapshot, *events]
50
50
  return events
51
- except NotFound:
51
+ except NotFoundError:
52
52
  return []
53
53
 
54
54
  def _read_snapshot(self, name: stream.Name) -> RawEvent | None:
@@ -61,7 +61,7 @@ class ESDBStorageStrategy(StorageStrategy):
61
61
  try:
62
62
  last = next(iter(snapshots))
63
63
  return dto.snapshot(last)
64
- except NotFound:
64
+ except NotFoundError:
65
65
  return None
66
66
 
67
67
  def insert_events(
@@ -115,7 +115,7 @@ class ESDBStorageStrategy(StorageStrategy):
115
115
  )
116
116
  )
117
117
  return stream.Position(last.stream_position)
118
- except NotFound:
118
+ except NotFoundError:
119
119
  return None
120
120
 
121
121
  def delete_stream(self, stream_id: StreamId) -> None:
@@ -126,7 +126,7 @@ class ESDBStorageStrategy(StorageStrategy):
126
126
  current_version=StreamState.ANY,
127
127
  timeout=self._timeout,
128
128
  )
129
- except NotFound:
129
+ except NotFoundError:
130
130
  pass
131
131
 
132
132
  @property
@@ -4,23 +4,23 @@ from contextlib import AbstractContextManager, contextmanager
4
4
  from dataclasses import dataclass, field
5
5
  from itertools import islice
6
6
 
7
- from esdbclient import EventStoreDBClient, RecordedEvent
8
- from esdbclient.exceptions import DeadlineExceeded, NotFound
9
- from esdbclient.persistent import AbstractPersistentSubscription
7
+ from kurrentdbclient import KurrentDBClient, RecordedEvent
8
+ from kurrentdbclient.exceptions import DeadlineExceededError, NotFoundError
9
+ from kurrentdbclient.persistent import AbstractPersistentSubscription
10
10
 
11
11
  from event_sourcery.event_store import RecordedRaw
12
12
  from event_sourcery.event_store.interfaces import (
13
13
  OutboxFiltererStrategy,
14
14
  OutboxStorageStrategy,
15
15
  )
16
- from event_sourcery_esdb import dto
16
+ from event_sourcery_kurrentdb import dto
17
17
 
18
18
  logger = logging.getLogger(__name__)
19
19
 
20
20
 
21
21
  @dataclass(repr=False)
22
- class ESDBOutboxStorageStrategy(OutboxStorageStrategy):
23
- _client: EventStoreDBClient
22
+ class KurrentDBOutboxStorageStrategy(OutboxStorageStrategy):
23
+ _client: KurrentDBClient
24
24
  _filterer: OutboxFiltererStrategy
25
25
  _outbox_name: str
26
26
  _max_publish_attempts: int
@@ -30,7 +30,7 @@ class ESDBOutboxStorageStrategy(OutboxStorageStrategy):
30
30
  def create_subscription(self) -> None:
31
31
  try:
32
32
  self._client.get_subscription_info(self._outbox_name, timeout=self._timeout)
33
- except NotFound:
33
+ except NotFoundError:
34
34
  self._client.create_subscription_to_all(
35
35
  self._outbox_name,
36
36
  from_end=True,
@@ -70,7 +70,7 @@ class ESDBOutboxStorageStrategy(OutboxStorageStrategy):
70
70
  record = dto.raw_record(entry)
71
71
  if self._filterer(record.entry):
72
72
  yield self._publish_context(entry, record)
73
- except DeadlineExceeded:
73
+ except DeadlineExceededError:
74
74
  pass
75
75
 
76
76
  @contextmanager
@@ -14,7 +14,7 @@ class Name(UserString):
14
14
 
15
15
  def __init__(self, tenant_id: TenantId, stream_id: StreamId) -> None:
16
16
  if "-" in tenant_id:
17
- raise IllegalTenantId("ESDB can't handle tenant id with '-'")
17
+ raise IllegalTenantId("KurrentDB can't handle tenant id with '-'")
18
18
  self.tenant_id = tenant_id
19
19
  self.uuid = stream_id
20
20
  super().__init__(self._as_string(self.uuid))
@@ -29,7 +29,9 @@ class Name(UserString):
29
29
 
30
30
  def _as_string(self, stream_id: StreamId) -> str:
31
31
  if stream_id.category and "-" in stream_id.category:
32
- raise IllegalCategoryName("ESDB storage can't handle category with '-'")
32
+ raise IllegalCategoryName(
33
+ "KurrentDB storage can't handle category with '-'"
34
+ )
33
35
  return f"{stream_id.category or ''}-{self.tenant_id}-{stream_id.hex}"
34
36
 
35
37
  @property
@@ -4,12 +4,12 @@ from datetime import timedelta
4
4
  from functools import partial
5
5
  from typing import Protocol
6
6
 
7
- import esdbclient.exceptions
8
- from esdbclient import EventStoreDBClient, RecordedEvent
7
+ import kurrentdbclient.exceptions
8
+ from kurrentdbclient import KurrentDBClient, RecordedEvent
9
9
 
10
10
  from event_sourcery.event_store import Position, RecordedRaw
11
11
  from event_sourcery.event_store.interfaces import SubscriptionStrategy
12
- from event_sourcery_esdb import dto
12
+ from event_sourcery_kurrentdb import dto
13
13
 
14
14
 
15
15
  class BuilderCallable(Protocol):
@@ -19,8 +19,8 @@ class BuilderCallable(Protocol):
19
19
 
20
20
 
21
21
  @dataclass(repr=False)
22
- class ESDBSubscriptionStrategy(SubscriptionStrategy):
23
- _client: EventStoreDBClient
22
+ class KurrentDBSubscriptionStrategy(SubscriptionStrategy):
23
+ _client: KurrentDBClient
24
24
 
25
25
  @staticmethod
26
26
  def _iterator(
@@ -37,7 +37,7 @@ class ESDBSubscriptionStrategy(SubscriptionStrategy):
37
37
  if len(batch) == size:
38
38
  yield batch
39
39
  batch = []
40
- except esdbclient.exceptions.DeadlineExceeded:
40
+ except kurrentdbclient.exceptions.DeadlineExceededError:
41
41
  yield batch
42
42
  batch = []
43
43
  subscription = builder()
@@ -3,14 +3,14 @@ name = "python-event-sourcery"
3
3
  requires-python = ">=3.10"
4
4
 
5
5
  [tool.poetry]
6
- version = "0.4.0a15"
6
+ version = "0.4.0a17"
7
7
  description = ""
8
8
  authors = ["Your Name <you@example.com>"]
9
9
  license = "MIT"
10
10
  packages = [
11
11
  { include = "event_sourcery" },
12
12
  { include = "event_sourcery_django" },
13
- { include = "event_sourcery_esdb" },
13
+ { include = "event_sourcery_kurrentdb" },
14
14
  { include = "event_sourcery_sqlalchemy" },
15
15
  ]
16
16
 
@@ -19,7 +19,7 @@ python = ">=3.10,<4.0"
19
19
  pydantic = ">=2.0,<3"
20
20
  more-itertools = "*"
21
21
  SQLAlchemy = {version = ">=2.0", optional = true}
22
- esdbclient = {version = ">=1.0b3", optional = true}
22
+ kurrentdbclient = {version = ">=1.0.6", optional = true}
23
23
  django = {version = ">=4,<6", optional = true}
24
24
  psycopg2-binary = ">2,<3"
25
25
 
@@ -39,7 +39,7 @@ deepdiff = "*"
39
39
 
40
40
  [tool.poetry.extras]
41
41
  sqlalchemy = ["SQLAlchemy"]
42
- esdb = ["esdbclient"]
42
+ kurrentdb = ["kurrentdbclient"]
43
43
  django = ["django"]
44
44
 
45
45
  [tool.pytest]
@@ -57,7 +57,7 @@ branch = true
57
57
  source = [
58
58
  "event_sourcery",
59
59
  "event_sourcery_django",
60
- "event_sourcery_esdb",
60
+ "event_sourcery_kurrentdb",
61
61
  "event_sourcery_sqlalchemy",
62
62
  ]
63
63
  omit = [
@@ -1,7 +0,0 @@
1
- __all__ = [
2
- "Aggregate",
3
- "Repository",
4
- ]
5
-
6
- from event_sourcery.aggregate.aggregate import Aggregate
7
- from event_sourcery.aggregate.repository import Repository