python-event-sourcery 0.4.0a6__tar.gz → 0.4.0a8__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.
- {python_event_sourcery-0.4.0a6 → python_event_sourcery-0.4.0a8}/PKG-INFO +1 -1
- {python_event_sourcery-0.4.0a6 → python_event_sourcery-0.4.0a8}/event_sourcery/event_store/event/serde.py +9 -1
- {python_event_sourcery-0.4.0a6 → python_event_sourcery-0.4.0a8}/event_sourcery/event_store/event_store.py +13 -24
- {python_event_sourcery-0.4.0a6 → python_event_sourcery-0.4.0a8}/pyproject.toml +5 -3
- {python_event_sourcery-0.4.0a6 → python_event_sourcery-0.4.0a8}/LICENSE +0 -0
- {python_event_sourcery-0.4.0a6 → python_event_sourcery-0.4.0a8}/event_sourcery/__init__.py +0 -0
- {python_event_sourcery-0.4.0a6 → python_event_sourcery-0.4.0a8}/event_sourcery/aggregate/__init__.py +0 -0
- {python_event_sourcery-0.4.0a6 → python_event_sourcery-0.4.0a8}/event_sourcery/aggregate/aggregate.py +0 -0
- {python_event_sourcery-0.4.0a6 → python_event_sourcery-0.4.0a8}/event_sourcery/aggregate/repository.py +0 -0
- {python_event_sourcery-0.4.0a6 → python_event_sourcery-0.4.0a8}/event_sourcery/event_store/__init__.py +0 -0
- {python_event_sourcery-0.4.0a6 → python_event_sourcery-0.4.0a8}/event_sourcery/event_store/dispatcher.py +0 -0
- {python_event_sourcery-0.4.0a6 → python_event_sourcery-0.4.0a8}/event_sourcery/event_store/event/__init__.py +0 -0
- {python_event_sourcery-0.4.0a6 → python_event_sourcery-0.4.0a8}/event_sourcery/event_store/event/dto.py +0 -0
- {python_event_sourcery-0.4.0a6 → python_event_sourcery-0.4.0a8}/event_sourcery/event_store/event/registry.py +0 -0
- {python_event_sourcery-0.4.0a6 → python_event_sourcery-0.4.0a8}/event_sourcery/event_store/exceptions.py +0 -0
- {python_event_sourcery-0.4.0a6 → python_event_sourcery-0.4.0a8}/event_sourcery/event_store/factory.py +0 -0
- {python_event_sourcery-0.4.0a6 → python_event_sourcery-0.4.0a8}/event_sourcery/event_store/in_memory.py +0 -0
- {python_event_sourcery-0.4.0a6 → python_event_sourcery-0.4.0a8}/event_sourcery/event_store/interfaces.py +0 -0
- {python_event_sourcery-0.4.0a6 → python_event_sourcery-0.4.0a8}/event_sourcery/event_store/outbox.py +0 -0
- {python_event_sourcery-0.4.0a6 → python_event_sourcery-0.4.0a8}/event_sourcery/event_store/stream_id.py +0 -0
- {python_event_sourcery-0.4.0a6 → python_event_sourcery-0.4.0a8}/event_sourcery/event_store/subscription.py +0 -0
- {python_event_sourcery-0.4.0a6 → python_event_sourcery-0.4.0a8}/event_sourcery/event_store/versioning.py +0 -0
- {python_event_sourcery-0.4.0a6 → python_event_sourcery-0.4.0a8}/event_sourcery/py.typed +0 -0
- {python_event_sourcery-0.4.0a6 → python_event_sourcery-0.4.0a8}/event_sourcery/read_model/__init__.py +0 -0
- {python_event_sourcery-0.4.0a6 → python_event_sourcery-0.4.0a8}/event_sourcery/read_model/cursors_dao.py +0 -0
- {python_event_sourcery-0.4.0a6 → python_event_sourcery-0.4.0a8}/event_sourcery/read_model/projector.py +0 -0
- {python_event_sourcery-0.4.0a6 → python_event_sourcery-0.4.0a8}/event_sourcery_esdb/__init__.py +0 -0
- {python_event_sourcery-0.4.0a6 → python_event_sourcery-0.4.0a8}/event_sourcery_esdb/dto.py +0 -0
- {python_event_sourcery-0.4.0a6 → python_event_sourcery-0.4.0a8}/event_sourcery_esdb/event_store.py +0 -0
- {python_event_sourcery-0.4.0a6 → python_event_sourcery-0.4.0a8}/event_sourcery_esdb/outbox.py +0 -0
- {python_event_sourcery-0.4.0a6 → python_event_sourcery-0.4.0a8}/event_sourcery_esdb/py.typed +0 -0
- {python_event_sourcery-0.4.0a6 → python_event_sourcery-0.4.0a8}/event_sourcery_esdb/stream.py +0 -0
- {python_event_sourcery-0.4.0a6 → python_event_sourcery-0.4.0a8}/event_sourcery_esdb/subscription.py +0 -0
- {python_event_sourcery-0.4.0a6 → python_event_sourcery-0.4.0a8}/event_sourcery_sqlalchemy/__init__.py +0 -0
- {python_event_sourcery-0.4.0a6 → python_event_sourcery-0.4.0a8}/event_sourcery_sqlalchemy/cursors_dao.py +0 -0
- {python_event_sourcery-0.4.0a6 → python_event_sourcery-0.4.0a8}/event_sourcery_sqlalchemy/dto.py +0 -0
- {python_event_sourcery-0.4.0a6 → python_event_sourcery-0.4.0a8}/event_sourcery_sqlalchemy/event_store.py +0 -0
- {python_event_sourcery-0.4.0a6 → python_event_sourcery-0.4.0a8}/event_sourcery_sqlalchemy/guid.py +0 -0
- {python_event_sourcery-0.4.0a6 → python_event_sourcery-0.4.0a8}/event_sourcery_sqlalchemy/jsonb.py +0 -0
- {python_event_sourcery-0.4.0a6 → python_event_sourcery-0.4.0a8}/event_sourcery_sqlalchemy/models.py +0 -0
- {python_event_sourcery-0.4.0a6 → python_event_sourcery-0.4.0a8}/event_sourcery_sqlalchemy/outbox.py +0 -0
- {python_event_sourcery-0.4.0a6 → python_event_sourcery-0.4.0a8}/event_sourcery_sqlalchemy/py.typed +0 -0
- {python_event_sourcery-0.4.0a6 → python_event_sourcery-0.4.0a8}/event_sourcery_sqlalchemy/subscription.py +0 -0
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
from collections.abc import Mapping
|
|
1
|
+
from collections.abc import Mapping, Sequence
|
|
2
2
|
from dataclasses import dataclass
|
|
3
3
|
from typing import cast
|
|
4
4
|
|
|
@@ -28,6 +28,9 @@ class Serde:
|
|
|
28
28
|
event=event_type(**data),
|
|
29
29
|
)
|
|
30
30
|
|
|
31
|
+
def deserialize_many(self, events: Sequence[RawEvent]) -> list[WrappedEvent]:
|
|
32
|
+
return [self.deserialize(event) for event in events]
|
|
33
|
+
|
|
31
34
|
def deserialize_record(self, record: RecordedRaw) -> Recorded:
|
|
32
35
|
return Recorded(
|
|
33
36
|
wrapped_event=self.deserialize(record.entry),
|
|
@@ -50,3 +53,8 @@ class Serde:
|
|
|
50
53
|
data=model.model_dump(mode="json"),
|
|
51
54
|
context=event.context.model_dump(mode="json"),
|
|
52
55
|
)
|
|
56
|
+
|
|
57
|
+
def serialize_many(
|
|
58
|
+
self, events: Sequence[WrappedEvent], stream_id: StreamId
|
|
59
|
+
) -> list[RawEvent]:
|
|
60
|
+
return [self.serialize(event, stream_id) for event in events]
|
|
@@ -5,7 +5,6 @@ from typing import cast
|
|
|
5
5
|
from event_sourcery.event_store.event import (
|
|
6
6
|
Event,
|
|
7
7
|
Position,
|
|
8
|
-
RawEvent,
|
|
9
8
|
Serde,
|
|
10
9
|
WrappedEvent,
|
|
11
10
|
)
|
|
@@ -34,11 +33,11 @@ class EventStore:
|
|
|
34
33
|
"""Loads events from a given stream.
|
|
35
34
|
|
|
36
35
|
Examples:
|
|
37
|
-
>>> load_stream(stream_id=StreamId(name="not_existing_stream"))
|
|
36
|
+
>>> event_store.load_stream(stream_id=StreamId(name="not_existing_stream"))
|
|
38
37
|
[]
|
|
39
|
-
>>> load_stream(stream_id=StreamId(name="existing_stream"))
|
|
38
|
+
>>> event_store.load_stream(stream_id=StreamId(name="existing_stream"))
|
|
40
39
|
[WrappedEvent(..., version=1), ..., WrappedEvent(..., version=3)]
|
|
41
|
-
>>> load_stream(stream_id=StreamId(name="existing_stream"), start=2, stop=3)
|
|
40
|
+
>>> event_store.load_stream(stream_id=StreamId(name="existing_stream"), start=2, stop=3)
|
|
42
41
|
[WrappedEvent(..., version=2)]
|
|
43
42
|
|
|
44
43
|
Args:
|
|
@@ -50,7 +49,7 @@ class EventStore:
|
|
|
50
49
|
A sequence of events or empty list if the stream doesn't exist.
|
|
51
50
|
"""
|
|
52
51
|
events = self._storage_strategy.fetch_events(stream_id, start=start, stop=stop)
|
|
53
|
-
return self.
|
|
52
|
+
return self._serde.deserialize_many(events)
|
|
54
53
|
|
|
55
54
|
@singledispatchmethod
|
|
56
55
|
def append(
|
|
@@ -66,9 +65,9 @@ class EventStore:
|
|
|
66
65
|
To use it, pass the expected version of the stream.
|
|
67
66
|
|
|
68
67
|
Examples:
|
|
69
|
-
>>> append(WrappedEvent(...), stream_id=StreamId())
|
|
68
|
+
>>> event_store.append(WrappedEvent(...), stream_id=StreamId())
|
|
70
69
|
None
|
|
71
|
-
>>> append(WrappedEvent(...), stream_id=StreamId(), expected_version=1)
|
|
70
|
+
>>> event_store.append(WrappedEvent(...), stream_id=StreamId(), expected_version=1)
|
|
72
71
|
None
|
|
73
72
|
|
|
74
73
|
Args:
|
|
@@ -136,7 +135,7 @@ class EventStore:
|
|
|
136
135
|
self._storage_strategy.insert_events(
|
|
137
136
|
stream_id=stream_id,
|
|
138
137
|
versioning=versioning,
|
|
139
|
-
events=self.
|
|
138
|
+
events=self._serde.serialize_many(events, stream_id),
|
|
140
139
|
)
|
|
141
140
|
|
|
142
141
|
def delete_stream(self, stream_id: StreamId) -> None:
|
|
@@ -145,9 +144,9 @@ class EventStore:
|
|
|
145
144
|
If a stream does not exist, this method does nothing.
|
|
146
145
|
|
|
147
146
|
Examples:
|
|
148
|
-
>>> delete_stream(StreamId())
|
|
147
|
+
>>> event_store.delete_stream(StreamId())
|
|
149
148
|
None
|
|
150
|
-
>>> delete_stream(StreamId(name="not_existing_stream"))
|
|
149
|
+
>>> event_store.delete_stream(StreamId(name="not_existing_stream"))
|
|
151
150
|
None
|
|
152
151
|
|
|
153
152
|
Args:
|
|
@@ -162,9 +161,9 @@ class EventStore:
|
|
|
162
161
|
"""Saves a snapshot of the stream.
|
|
163
162
|
|
|
164
163
|
Examples:
|
|
165
|
-
>>> save_snapshot(StreamId(), WrappedEvent(...))
|
|
164
|
+
>>> event_store.save_snapshot(StreamId(), WrappedEvent(...))
|
|
166
165
|
None
|
|
167
|
-
>>> save_snapshot(StreamId(name="not_existing_stream"), WrappedEvent(...))
|
|
166
|
+
>>> event_store.save_snapshot(StreamId(name="not_existing_stream"), WrappedEvent(...))
|
|
168
167
|
None
|
|
169
168
|
|
|
170
169
|
Args:
|
|
@@ -178,24 +177,14 @@ class EventStore:
|
|
|
178
177
|
serialized = self._serde.serialize(event=snapshot, stream_id=stream_id)
|
|
179
178
|
self._storage_strategy.save_snapshot(serialized)
|
|
180
179
|
|
|
181
|
-
def _deserialize_events(self, events: list[RawEvent]) -> list[WrappedEvent]:
|
|
182
|
-
return [self._serde.deserialize(e) for e in events]
|
|
183
|
-
|
|
184
|
-
def _serialize_events(
|
|
185
|
-
self,
|
|
186
|
-
events: Sequence[WrappedEvent],
|
|
187
|
-
stream_id: StreamId,
|
|
188
|
-
) -> list[RawEvent]:
|
|
189
|
-
return [self._serde.serialize(event=e, stream_id=stream_id) for e in events]
|
|
190
|
-
|
|
191
180
|
@property
|
|
192
181
|
def position(self) -> Position | None:
|
|
193
182
|
"""Returns the current position of the event store.
|
|
194
183
|
|
|
195
184
|
Examples:
|
|
196
|
-
>>> position
|
|
185
|
+
>>> event_store.position
|
|
197
186
|
None # nothing was saved yet
|
|
198
|
-
>>> position
|
|
187
|
+
>>> event_store.position
|
|
199
188
|
Position(15) # Some events were saved
|
|
200
189
|
|
|
201
190
|
"""
|
|
@@ -1,6 +1,9 @@
|
|
|
1
|
+
[project]
|
|
2
|
+
requires-python = ">=3.10"
|
|
3
|
+
|
|
1
4
|
[tool.poetry]
|
|
2
5
|
name = "python-event-sourcery"
|
|
3
|
-
version = "0.4.
|
|
6
|
+
version = "0.4.0a8"
|
|
4
7
|
description = ""
|
|
5
8
|
authors = ["Your Name <you@example.com>"]
|
|
6
9
|
license = "MIT"
|
|
@@ -70,7 +73,6 @@ exclude_lines = [
|
|
|
70
73
|
]
|
|
71
74
|
|
|
72
75
|
[tool.mypy]
|
|
73
|
-
python_version = "3.10"
|
|
74
76
|
ignore_missing_imports = true
|
|
75
77
|
disallow_untyped_defs = true
|
|
76
78
|
no_implicit_optional = true
|
|
@@ -81,7 +83,6 @@ show_error_codes = true
|
|
|
81
83
|
|
|
82
84
|
[tool.ruff]
|
|
83
85
|
line-length = 88
|
|
84
|
-
target-version = "py310"
|
|
85
86
|
show-fixes = true
|
|
86
87
|
exclude = ["**/migrations"]
|
|
87
88
|
|
|
@@ -105,6 +106,7 @@ select = [
|
|
|
105
106
|
ignore = [
|
|
106
107
|
"N818", # error-suffix-on-exception-name
|
|
107
108
|
"PLR2004", # magic-value-comparison
|
|
109
|
+
"E501", # line-too-long, ruff format takes care about it
|
|
108
110
|
]
|
|
109
111
|
|
|
110
112
|
[tool.ruff.lint.per-file-ignores]
|
|
File without changes
|
|
File without changes
|
{python_event_sourcery-0.4.0a6 → python_event_sourcery-0.4.0a8}/event_sourcery/aggregate/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{python_event_sourcery-0.4.0a6 → python_event_sourcery-0.4.0a8}/event_sourcery/event_store/outbox.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{python_event_sourcery-0.4.0a6 → python_event_sourcery-0.4.0a8}/event_sourcery_esdb/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
{python_event_sourcery-0.4.0a6 → python_event_sourcery-0.4.0a8}/event_sourcery_esdb/event_store.py
RENAMED
|
File without changes
|
{python_event_sourcery-0.4.0a6 → python_event_sourcery-0.4.0a8}/event_sourcery_esdb/outbox.py
RENAMED
|
File without changes
|
{python_event_sourcery-0.4.0a6 → python_event_sourcery-0.4.0a8}/event_sourcery_esdb/py.typed
RENAMED
|
File without changes
|
{python_event_sourcery-0.4.0a6 → python_event_sourcery-0.4.0a8}/event_sourcery_esdb/stream.py
RENAMED
|
File without changes
|
{python_event_sourcery-0.4.0a6 → python_event_sourcery-0.4.0a8}/event_sourcery_esdb/subscription.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{python_event_sourcery-0.4.0a6 → python_event_sourcery-0.4.0a8}/event_sourcery_sqlalchemy/dto.py
RENAMED
|
File without changes
|
|
File without changes
|
{python_event_sourcery-0.4.0a6 → python_event_sourcery-0.4.0a8}/event_sourcery_sqlalchemy/guid.py
RENAMED
|
File without changes
|
{python_event_sourcery-0.4.0a6 → python_event_sourcery-0.4.0a8}/event_sourcery_sqlalchemy/jsonb.py
RENAMED
|
File without changes
|
{python_event_sourcery-0.4.0a6 → python_event_sourcery-0.4.0a8}/event_sourcery_sqlalchemy/models.py
RENAMED
|
File without changes
|
{python_event_sourcery-0.4.0a6 → python_event_sourcery-0.4.0a8}/event_sourcery_sqlalchemy/outbox.py
RENAMED
|
File without changes
|
{python_event_sourcery-0.4.0a6 → python_event_sourcery-0.4.0a8}/event_sourcery_sqlalchemy/py.typed
RENAMED
|
File without changes
|
|
File without changes
|