python-event-sourcery 0.5.1a4__tar.gz → 0.5.1a5__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 (65) hide show
  1. {python_event_sourcery-0.5.1a4 → python_event_sourcery-0.5.1a5}/PKG-INFO +1 -1
  2. {python_event_sourcery-0.5.1a4 → python_event_sourcery-0.5.1a5}/event_sourcery/_event_store/event/dto.py +13 -2
  3. {python_event_sourcery-0.5.1a4 → python_event_sourcery-0.5.1a5}/event_sourcery/event_sourcing/repository.py +6 -3
  4. {python_event_sourcery-0.5.1a4 → python_event_sourcery-0.5.1a5}/event_sourcery_sqlalchemy/models/__init__.py +2 -2
  5. {python_event_sourcery-0.5.1a4 → python_event_sourcery-0.5.1a5}/pyproject.toml +1 -1
  6. {python_event_sourcery-0.5.1a4 → python_event_sourcery-0.5.1a5}/LICENSE +0 -0
  7. {python_event_sourcery-0.5.1a4 → python_event_sourcery-0.5.1a5}/README.md +0 -0
  8. {python_event_sourcery-0.5.1a4 → python_event_sourcery-0.5.1a5}/event_sourcery/__init__.py +0 -0
  9. {python_event_sourcery-0.5.1a4 → python_event_sourcery-0.5.1a5}/event_sourcery/_event_store/__init__.py +0 -0
  10. {python_event_sourcery-0.5.1a4 → python_event_sourcery-0.5.1a5}/event_sourcery/_event_store/backend.py +0 -0
  11. {python_event_sourcery-0.5.1a4 → python_event_sourcery-0.5.1a5}/event_sourcery/_event_store/event/__init__.py +0 -0
  12. {python_event_sourcery-0.5.1a4 → python_event_sourcery-0.5.1a5}/event_sourcery/_event_store/event/encryption.py +0 -0
  13. {python_event_sourcery-0.5.1a4 → python_event_sourcery-0.5.1a5}/event_sourcery/_event_store/event/registry.py +0 -0
  14. {python_event_sourcery-0.5.1a4 → python_event_sourcery-0.5.1a5}/event_sourcery/_event_store/event/serde.py +0 -0
  15. {python_event_sourcery-0.5.1a4 → python_event_sourcery-0.5.1a5}/event_sourcery/_event_store/event_store.py +0 -0
  16. {python_event_sourcery-0.5.1a4 → python_event_sourcery-0.5.1a5}/event_sourcery/_event_store/in_memory.py +0 -0
  17. {python_event_sourcery-0.5.1a4 → python_event_sourcery-0.5.1a5}/event_sourcery/_event_store/outbox.py +0 -0
  18. {python_event_sourcery-0.5.1a4 → python_event_sourcery-0.5.1a5}/event_sourcery/_event_store/stream_id.py +0 -0
  19. {python_event_sourcery-0.5.1a4 → python_event_sourcery-0.5.1a5}/event_sourcery/_event_store/subscription/__init__.py +0 -0
  20. {python_event_sourcery-0.5.1a4 → python_event_sourcery-0.5.1a5}/event_sourcery/_event_store/subscription/builder.py +0 -0
  21. {python_event_sourcery-0.5.1a4 → python_event_sourcery-0.5.1a5}/event_sourcery/_event_store/subscription/in_transaction.py +0 -0
  22. {python_event_sourcery-0.5.1a4 → python_event_sourcery-0.5.1a5}/event_sourcery/_event_store/subscription/interfaces.py +0 -0
  23. {python_event_sourcery-0.5.1a4 → python_event_sourcery-0.5.1a5}/event_sourcery/_event_store/tenant_id.py +0 -0
  24. {python_event_sourcery-0.5.1a4 → python_event_sourcery-0.5.1a5}/event_sourcery/_event_store/versioning.py +0 -0
  25. {python_event_sourcery-0.5.1a4 → python_event_sourcery-0.5.1a5}/event_sourcery/backend.py +0 -0
  26. {python_event_sourcery-0.5.1a4 → python_event_sourcery-0.5.1a5}/event_sourcery/encryption.py +0 -0
  27. {python_event_sourcery-0.5.1a4 → python_event_sourcery-0.5.1a5}/event_sourcery/event.py +0 -0
  28. {python_event_sourcery-0.5.1a4 → python_event_sourcery-0.5.1a5}/event_sourcery/event_sourcing/__init__.py +0 -0
  29. {python_event_sourcery-0.5.1a4 → python_event_sourcery-0.5.1a5}/event_sourcery/event_sourcing/aggregate.py +0 -0
  30. {python_event_sourcery-0.5.1a4 → python_event_sourcery-0.5.1a5}/event_sourcery/exceptions.py +0 -0
  31. {python_event_sourcery-0.5.1a4 → python_event_sourcery-0.5.1a5}/event_sourcery/in_transaction.py +0 -0
  32. {python_event_sourcery-0.5.1a4 → python_event_sourcery-0.5.1a5}/event_sourcery/interfaces.py +0 -0
  33. {python_event_sourcery-0.5.1a4 → python_event_sourcery-0.5.1a5}/event_sourcery/outbox.py +0 -0
  34. {python_event_sourcery-0.5.1a4 → python_event_sourcery-0.5.1a5}/event_sourcery/py.typed +0 -0
  35. {python_event_sourcery-0.5.1a4 → python_event_sourcery-0.5.1a5}/event_sourcery/read_model/__init__.py +0 -0
  36. {python_event_sourcery-0.5.1a4 → python_event_sourcery-0.5.1a5}/event_sourcery/read_model/cursors_dao.py +0 -0
  37. {python_event_sourcery-0.5.1a4 → python_event_sourcery-0.5.1a5}/event_sourcery/read_model/projector.py +0 -0
  38. {python_event_sourcery-0.5.1a4 → python_event_sourcery-0.5.1a5}/event_sourcery/subscription.py +0 -0
  39. {python_event_sourcery-0.5.1a4 → python_event_sourcery-0.5.1a5}/event_sourcery_django/__init__.py +0 -0
  40. {python_event_sourcery-0.5.1a4 → python_event_sourcery-0.5.1a5}/event_sourcery_django/dto.py +0 -0
  41. {python_event_sourcery-0.5.1a4 → python_event_sourcery-0.5.1a5}/event_sourcery_django/event_store.py +0 -0
  42. {python_event_sourcery-0.5.1a4 → python_event_sourcery-0.5.1a5}/event_sourcery_django/migrations/0001_initial.py +0 -0
  43. {python_event_sourcery-0.5.1a4 → python_event_sourcery-0.5.1a5}/event_sourcery_django/migrations/__init__.py +0 -0
  44. {python_event_sourcery-0.5.1a4 → python_event_sourcery-0.5.1a5}/event_sourcery_django/models.py +0 -0
  45. {python_event_sourcery-0.5.1a4 → python_event_sourcery-0.5.1a5}/event_sourcery_django/outbox.py +0 -0
  46. {python_event_sourcery-0.5.1a4 → python_event_sourcery-0.5.1a5}/event_sourcery_django/py.typed +0 -0
  47. {python_event_sourcery-0.5.1a4 → python_event_sourcery-0.5.1a5}/event_sourcery_django/subscription.py +0 -0
  48. {python_event_sourcery-0.5.1a4 → python_event_sourcery-0.5.1a5}/event_sourcery_kurrentdb/__init__.py +0 -0
  49. {python_event_sourcery-0.5.1a4 → python_event_sourcery-0.5.1a5}/event_sourcery_kurrentdb/dto.py +0 -0
  50. {python_event_sourcery-0.5.1a4 → python_event_sourcery-0.5.1a5}/event_sourcery_kurrentdb/event_store.py +0 -0
  51. {python_event_sourcery-0.5.1a4 → python_event_sourcery-0.5.1a5}/event_sourcery_kurrentdb/outbox.py +0 -0
  52. {python_event_sourcery-0.5.1a4 → python_event_sourcery-0.5.1a5}/event_sourcery_kurrentdb/py.typed +0 -0
  53. {python_event_sourcery-0.5.1a4 → python_event_sourcery-0.5.1a5}/event_sourcery_kurrentdb/stream.py +0 -0
  54. {python_event_sourcery-0.5.1a4 → python_event_sourcery-0.5.1a5}/event_sourcery_kurrentdb/subscription.py +0 -0
  55. {python_event_sourcery-0.5.1a4 → python_event_sourcery-0.5.1a5}/event_sourcery_sqlalchemy/__init__.py +0 -0
  56. {python_event_sourcery-0.5.1a4 → python_event_sourcery-0.5.1a5}/event_sourcery_sqlalchemy/cursors_dao.py +0 -0
  57. {python_event_sourcery-0.5.1a4 → python_event_sourcery-0.5.1a5}/event_sourcery_sqlalchemy/dto.py +0 -0
  58. {python_event_sourcery-0.5.1a4 → python_event_sourcery-0.5.1a5}/event_sourcery_sqlalchemy/event_store.py +0 -0
  59. {python_event_sourcery-0.5.1a4 → python_event_sourcery-0.5.1a5}/event_sourcery_sqlalchemy/guid.py +0 -0
  60. {python_event_sourcery-0.5.1a4 → python_event_sourcery-0.5.1a5}/event_sourcery_sqlalchemy/jsonb.py +0 -0
  61. {python_event_sourcery-0.5.1a4 → python_event_sourcery-0.5.1a5}/event_sourcery_sqlalchemy/models/base.py +0 -0
  62. {python_event_sourcery-0.5.1a4 → python_event_sourcery-0.5.1a5}/event_sourcery_sqlalchemy/models/default.py +0 -0
  63. {python_event_sourcery-0.5.1a4 → python_event_sourcery-0.5.1a5}/event_sourcery_sqlalchemy/outbox.py +0 -0
  64. {python_event_sourcery-0.5.1a4 → python_event_sourcery-0.5.1a5}/event_sourcery_sqlalchemy/py.typed +0 -0
  65. {python_event_sourcery-0.5.1a4 → python_event_sourcery-0.5.1a5}/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.5.1a4
3
+ Version: 0.5.1a5
4
4
  Summary: A library for event-based systems in Python.
5
5
  License: MIT
6
6
  Author: Sebastian Buczyński
@@ -73,6 +73,7 @@ class Event(BaseModel, extra="forbid"):
73
73
 
74
74
 
75
75
  TEvent = TypeVar("TEvent", bound=Event)
76
+ TContext = TypeVar("TContext", bound=BaseModel)
76
77
 
77
78
 
78
79
  class Context(BaseModel, extra="allow"):
@@ -127,8 +128,18 @@ class WrappedEvent(Generic[TEvent]):
127
128
  context: Context = dataclasses.field(default_factory=Context)
128
129
 
129
130
  @classmethod
130
- def wrap(cls, event: TEvent, version: int | None) -> "WrappedEvent[TEvent]":
131
- return WrappedEvent[TEvent](event=event, version=version)
131
+ def wrap(
132
+ cls,
133
+ event: TEvent,
134
+ version: int | None,
135
+ context: Context | None = None,
136
+ ) -> "WrappedEvent[TEvent]":
137
+ return WrappedEvent[TEvent](
138
+ event=event, version=version, context=context or Context()
139
+ )
140
+
141
+ def get_context(self, context_type: type[TContext]) -> TContext:
142
+ return context_type.model_validate(self.context.model_dump())
132
143
 
133
144
 
134
145
  @dataclasses.dataclass(frozen=True)
@@ -3,7 +3,7 @@ from contextlib import contextmanager
3
3
  from typing import Generic, TypeVar, cast
4
4
 
5
5
  from event_sourcery import EventStore, StreamId, StreamUUID
6
- from event_sourcery.event import Event, WrappedEvent
6
+ from event_sourcery.event import Context, Event, WrappedEvent
7
7
  from event_sourcery.event_sourcing import Aggregate
8
8
 
9
9
  TAggregate = TypeVar("TAggregate", bound=Aggregate)
@@ -27,6 +27,7 @@ class Repository(Generic[TAggregate]):
27
27
  self,
28
28
  uuid: StreamUUID,
29
29
  aggregate: TAggregate,
30
+ context: Context | None = None,
30
31
  ) -> Iterator[TAggregate]:
31
32
  """
32
33
  Context manager for loading an aggregate instance.
@@ -38,6 +39,7 @@ class Repository(Generic[TAggregate]):
38
39
  Args:
39
40
  uuid (StreamUUID): The unique identifier of the aggregate's stream.
40
41
  aggregate (TAggregate): The aggregate initial instance to load state into.
42
+ context (Context | None): Optional context to attach to all emitted events.
41
43
 
42
44
  Yields:
43
45
  TAggregate: The loaded and ready-to-use aggregate instance.
@@ -45,7 +47,7 @@ class Repository(Generic[TAggregate]):
45
47
  stream_id = StreamId(uuid=uuid, name=uuid.name, category=aggregate.category)
46
48
  old_version = self._load(stream_id, aggregate)
47
49
  yield aggregate
48
- self._save(aggregate, old_version, stream_id)
50
+ self._save(aggregate, old_version, stream_id, context)
49
51
 
50
52
  def _load(self, stream_id: StreamId, aggregate: TAggregate) -> int:
51
53
  stream = self._event_store.load_stream(stream_id)
@@ -61,11 +63,12 @@ class Repository(Generic[TAggregate]):
61
63
  aggregate: TAggregate,
62
64
  old_version: int,
63
65
  stream_id: StreamId,
66
+ context: Context | None = None,
64
67
  ) -> None:
65
68
  with aggregate.__persisting_changes__() as pending:
66
69
  start_from = old_version + 1
67
70
  events = [
68
- WrappedEvent.wrap(event, version)
71
+ WrappedEvent.wrap(event, version, context=context)
69
72
  for version, event in enumerate(pending, start=start_from)
70
73
  ]
71
74
 
@@ -1,7 +1,7 @@
1
1
  from typing import Protocol
2
2
 
3
3
  from sqlalchemy import MetaData
4
- from sqlalchemy.orm import registry
4
+ from sqlalchemy.orm import DeclarativeBase, registry
5
5
  from sqlalchemy.orm.clsregistry import ClsRegistryToken
6
6
 
7
7
  from event_sourcery_sqlalchemy.models.base import (
@@ -28,7 +28,7 @@ _class_registry: dict[str, type | ClsRegistryToken] = {}
28
28
 
29
29
 
30
30
  def configure_models(
31
- base: type[BaseProto],
31
+ base: type[BaseProto | DeclarativeBase],
32
32
  event_model: type[BaseEvent] = DefaultEvent,
33
33
  stream_model: type[BaseStream] = DefaultStream,
34
34
  snapshot_model: type[BaseSnapshot] = DefaultSnapshot,
@@ -3,7 +3,7 @@ name = "python-event-sourcery"
3
3
  requires-python = ">=3.10"
4
4
 
5
5
  [tool.poetry]
6
- version = "0.5.1a4"
6
+ version = "0.5.1a5"
7
7
  description = "A library for event-based systems in Python."
8
8
  readme = "README.md"
9
9
  authors = [