Skip to content

Commit 7cee8d0

Browse files
committed
Adjusted 'cb' properties in "slices".
1 parent a0b17d9 commit 7cee8d0

File tree

2 files changed

+102
-102
lines changed

2 files changed

+102
-102
lines changed

eventsourcing/dcb/domain.py

Lines changed: 32 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,36 @@ class MetaPerspective(type):
104104
pass
105105

106106

107-
class SupportsEventDecorator(MetaPerspective):
107+
class Perspective(metaclass=MetaPerspective):
108+
def __new__(cls, *_: Any, **__: Any) -> Self:
109+
perspective = super().__new__(cls)
110+
perspective.__base_init__()
111+
return perspective
112+
113+
def __base_init__(self) -> None:
114+
self.last_known_position: int | None = None
115+
self.new_decisions: list[Mutates] = []
116+
117+
def append(self, *new_decisions: Mutates) -> None:
118+
self.new_decisions.extend(new_decisions)
119+
120+
def collect_events(self) -> Sequence[Mutates]:
121+
collected, self.new_decisions = self.new_decisions, []
122+
return collected
123+
124+
@property
125+
def cb(self) -> Selector | Sequence[Selector]:
126+
raise NotImplementedError # pragma: no cover
127+
128+
129+
TPerspective = TypeVar("TPerspective", bound=Perspective)
130+
131+
132+
given_event_class_mapping: dict[type[Mutates], type[DecoratedFuncCaller]] = {}
133+
decorated_funcs: dict[tuple[MetaPerspective, type[Mutates]], CallableType] = {}
134+
135+
136+
class MetaSupportsEventDecorator(MetaPerspective):
108137
def __init__(
109138
cls, name: str, bases: tuple[type, ...], namespace: dict[str, Any]
110139
) -> None:
@@ -198,36 +227,7 @@ def _insert_decorator_func_caller(
198227
return func_caller
199228

200229

201-
class Perspective(metaclass=MetaPerspective):
202-
last_known_position: int | None
203-
new_decisions: tuple[Mutates, ...]
204-
205-
def __new__(cls, *_: Any, **__: Any) -> Self:
206-
perspective = super().__new__(cls)
207-
perspective.last_known_position = None
208-
perspective.new_decisions = ()
209-
return perspective
210-
211-
def append(self, *events: Mutates) -> None:
212-
self.new_decisions += (*events,)
213-
214-
def collect_events(self) -> Sequence[Mutates]:
215-
collected, self.new_decisions = self.new_decisions, ()
216-
return collected
217-
218-
@property
219-
def cb(self) -> list[Selector]:
220-
raise NotImplementedError # pragma: no cover
221-
222-
223-
TPerspective = TypeVar("TPerspective", bound=Perspective)
224-
225-
226-
given_event_class_mapping: dict[type[Mutates], type[DecoratedFuncCaller]] = {}
227-
decorated_funcs: dict[tuple[MetaPerspective, type[Mutates]], CallableType] = {}
228-
229-
230-
class MetaEnduringObject(SupportsEventDecorator):
230+
class MetaEnduringObject(MetaSupportsEventDecorator):
231231
def __init__(
232232
cls, name: str, bases: tuple[type, ...], namespace: dict[str, Any]
233233
) -> None:
@@ -368,7 +368,7 @@ class Selector:
368368
tags: Sequence[str] = ()
369369

370370

371-
class MetaSlice(SupportsEventDecorator):
371+
class MetaSlice(MetaSupportsEventDecorator):
372372
pass
373373

374374

examples/coursebookingdcbslices/application.py

Lines changed: 70 additions & 70 deletions
Original file line numberDiff line numberDiff line change
@@ -76,17 +76,18 @@ def __init__(self, name: str, max_courses: int):
7676
self.max_courses = max_courses
7777

7878
@property
79-
def cb(self) -> list[Selector]:
80-
return [Selector(types=[StudentRegistered], tags=[self.student_id])]
79+
def cb(self) -> Selector:
80+
return Selector(types=[StudentRegistered], tags=[self.student_id])
8181

8282
def execute(self) -> None:
83-
decision = StudentRegistered(
84-
student_id=self.student_id,
85-
name=self.name,
86-
max_courses=self.max_courses,
87-
tags=[self.student_id],
83+
self.append(
84+
StudentRegistered(
85+
student_id=self.student_id,
86+
name=self.name,
87+
max_courses=self.max_courses,
88+
tags=[self.student_id],
89+
)
8890
)
89-
self.append(decision)
9091

9192

9293
class UpdateStudentName(Slice):
@@ -96,17 +97,16 @@ def __init__(self, student_id: StudentID, name: str) -> None:
9697
self.student_was_registered: bool = False
9798

9899
@property
99-
def cb(self) -> list[Selector]:
100-
return [Selector(types=[StudentRegistered, StudentNameUpdated], tags=[self.id])]
100+
def cb(self) -> Selector:
101+
return Selector(types=[StudentRegistered, StudentNameUpdated], tags=[self.id])
101102

102103
@event(StudentRegistered)
103104
def _(self) -> None:
104105
self.student_was_registered = True
105106

106107
def execute(self) -> None:
107108
assert self.student_was_registered
108-
decision = StudentNameUpdated(tags=[self.id], name=self.name)
109-
self.append(decision)
109+
self.append(StudentNameUpdated(tags=[self.id], name=self.name))
110110

111111

112112
class UpdateMaxCourses(Slice):
@@ -116,23 +116,21 @@ def __init__(self, student_id: StudentID, max_courses: int) -> None:
116116
self.max_courses = max_courses
117117

118118
@property
119-
def cb(self) -> list[Selector]:
120-
return [
121-
Selector(
122-
types=[StudentRegistered, StudentMaxCoursesUpdated], tags=[self.id]
123-
)
124-
]
119+
def cb(self) -> Selector:
120+
return Selector(
121+
types=[StudentRegistered, StudentMaxCoursesUpdated],
122+
tags=[self.id],
123+
)
125124

126125
@event(StudentRegistered)
127126
def _(self) -> None:
128127
self.student_was_registered = True
129128

130129
def execute(self) -> None:
131130
assert self.student_was_registered
132-
decision = StudentMaxCoursesUpdated(
133-
tags=[self.id], max_courses=self.max_courses
131+
self.append(
132+
StudentMaxCoursesUpdated(tags=[self.id], max_courses=self.max_courses)
134133
)
135-
self.append(decision)
136134

137135

138136
class RegisterCourse(Slice):
@@ -142,17 +140,18 @@ def __init__(self, name: str, places: int):
142140
self.places = places
143141

144142
@property
145-
def cb(self) -> list[Selector]:
146-
return [Selector(types=[CourseRegistered], tags=[self.course_id])]
143+
def cb(self) -> Selector:
144+
return Selector(types=[CourseRegistered], tags=[self.course_id])
147145

148146
def execute(self) -> None:
149-
decision = CourseRegistered(
150-
course_id=self.course_id,
151-
name=self.name,
152-
places=self.places,
153-
tags=[self.course_id],
147+
self.append(
148+
CourseRegistered(
149+
course_id=self.course_id,
150+
name=self.name,
151+
places=self.places,
152+
tags=[self.course_id],
153+
)
154154
)
155-
self.append(decision)
156155

157156

158157
class UpdateCourseName(Slice):
@@ -162,17 +161,16 @@ def __init__(self, course_id: CourseID, name: str) -> None:
162161
self.course_was_registered: bool = False
163162

164163
@property
165-
def cb(self) -> list[Selector]:
166-
return [Selector(types=[CourseRegistered, CourseNameUpdated], tags=[self.id])]
164+
def cb(self) -> Selector:
165+
return Selector(types=[CourseRegistered, CourseNameUpdated], tags=[self.id])
167166

168167
@event(CourseRegistered)
169168
def _(self) -> None:
170169
self.course_was_registered = True
171170

172171
def execute(self) -> None:
173172
assert self.course_was_registered
174-
decision = CourseNameUpdated(tags=[self.id], name=self.name)
175-
self.append(decision)
173+
self.append(CourseNameUpdated(tags=[self.id], name=self.name))
176174

177175

178176
class UpdatePlaces(Slice):
@@ -182,17 +180,16 @@ def __init__(self, course_id: CourseID, places: int) -> None:
182180
self.course_was_registered: bool = False
183181

184182
@property
185-
def cb(self) -> list[Selector]:
186-
return [Selector(types=[CourseRegistered, CoursePlacesUpdated], tags=[self.id])]
183+
def cb(self) -> Selector:
184+
return Selector(types=[CourseRegistered, CoursePlacesUpdated], tags=[self.id])
187185

188186
@event(CourseRegistered)
189187
def _(self) -> None:
190188
self.course_was_registered = True
191189

192190
def execute(self) -> None:
193191
assert self.course_was_registered
194-
decision = CoursePlacesUpdated(tags=[self.id], places=self.places)
195-
self.append(decision)
192+
self.append(CoursePlacesUpdated(tags=[self.id], places=self.places))
196193

197194

198195
class StudentJoinsCourse(Slice):
@@ -272,12 +269,13 @@ def execute(self) -> None:
272269
raise TooManyCoursesError
273270
if self.student_id in self.students_on_course:
274271
raise AlreadyJoinedError
275-
decision = StudentJoinedCourse(
276-
tags=[self.student_id, self.course_id],
277-
student_id=self.student_id,
278-
course_id=self.course_id,
272+
self.append(
273+
StudentJoinedCourse(
274+
tags=[self.student_id, self.course_id],
275+
student_id=self.student_id,
276+
course_id=self.course_id,
277+
)
279278
)
280-
self.append(decision)
281279

282280

283281
class StudentLeavesCourse(Slice):
@@ -291,19 +289,15 @@ def __init__(self, student_id: StudentID, course_id: CourseID) -> None:
291289

292290
@property
293291
def cb(self) -> list[Selector]:
294-
# return [
295-
# Selector(
296-
# types=[StudentRegistered, StudentJoinedCourse, StudentLeftCourse],
297-
# tags=[self.student_id],
298-
# ),
299-
# Selector(
300-
# types=[CourseRegistered, StudentJoinedCourse, StudentLeftCourse],
301-
# tags=[self.course_id],
302-
# ),
303-
# ]
304292
return [
305-
Selector(types=type(self).projected_types, tags=[tag])
306-
for tag in [self.student_id, self.course_id]
293+
Selector(
294+
types=[StudentRegistered, StudentJoinedCourse, StudentLeftCourse],
295+
tags=[self.student_id],
296+
),
297+
Selector(
298+
types=[CourseRegistered, StudentJoinedCourse, StudentLeftCourse],
299+
tags=[self.course_id],
300+
),
307301
]
308302

309303
@event(StudentRegistered)
@@ -335,12 +329,13 @@ def execute(self) -> None:
335329
raise StudentNotFoundError
336330
if self.student_id not in self.students_on_course:
337331
raise NotAlreadyJoinedError
338-
decision = StudentLeftCourse(
339-
tags=[self.student_id, self.course_id],
340-
student_id=self.student_id,
341-
course_id=self.course_id,
332+
self.append(
333+
StudentLeftCourse(
334+
tags=[self.student_id, self.course_id],
335+
student_id=self.student_id,
336+
course_id=self.course_id,
337+
)
342338
)
343-
self.append(decision)
344339

345340

346341
class StudentsIDs(Slice):
@@ -349,13 +344,17 @@ def __init__(self, course_id: CourseID) -> None:
349344
self.student_ids: list[StudentID] = []
350345

351346
@property
352-
def cb(self) -> list[Selector]:
353-
return [Selector(types=type(self).projected_types, tags=[self.course_id])]
347+
def cb(self) -> Selector:
348+
return Selector(types=type(self).projected_types, tags=[self.course_id])
354349

355350
@event(StudentJoinedCourse)
356351
def _(self, student_id: StudentID) -> None:
357352
self.student_ids.append(student_id)
358353

354+
@event(StudentLeftCourse)
355+
def _(self, student_id: StudentID) -> None:
356+
self.student_ids.remove(student_id)
357+
359358

360359
class StudentNames(Slice):
361360
def __init__(self, student_ids: list[StudentID]) -> None:
@@ -366,7 +365,6 @@ def __init__(self, student_ids: list[StudentID]) -> None:
366365
@property
367366
def cb(self) -> list[Selector]:
368367
return [
369-
# Selector(types=[StudentRegistered, StudentNameUpdated], tags=[student_id])
370368
Selector(types=type(self).projected_types, tags=[student_id])
371369
for student_id in self.student_id_names
372370
]
@@ -392,14 +390,17 @@ def __init__(self, student_id: StudentID) -> None:
392390
self.course_ids: list[CourseID] = []
393391

394392
@property
395-
def cb(self) -> list[Selector]:
396-
# return [Selector(types=[StudentJoinedCourse], tags=[self.student_id])]
397-
return [Selector(types=type(self).projected_types, tags=[self.student_id])]
393+
def cb(self) -> Selector:
394+
return Selector(types=type(self).projected_types, tags=[self.student_id])
398395

399396
@event(StudentJoinedCourse)
400397
def _(self, course_id: CourseID) -> None:
401398
self.course_ids.append(course_id)
402399

400+
@event(StudentLeftCourse)
401+
def _(self, course_id: CourseID) -> None:
402+
self.course_ids.remove(course_id)
403+
403404

404405
class CourseNames(Slice):
405406
def __init__(self, course_ids: list[CourseID]) -> None:
@@ -410,7 +411,6 @@ def __init__(self, course_ids: list[CourseID]) -> None:
410411
@property
411412
def cb(self) -> list[Selector]:
412413
return [
413-
# Selector(types=[CourseRegistered, CourseNameUpdated], tags=[student_id])
414414
Selector(types=type(self).projected_types, tags=[student_id])
415415
for student_id in self.course_id_names
416416
]
@@ -439,8 +439,8 @@ def __init__(self, student_id: StudentID) -> None:
439439
self.course_ids: list[CourseID] = []
440440

441441
@property
442-
def cb(self) -> list[Selector]:
443-
return [Selector(tags=[self.id])]
442+
def cb(self) -> Selector:
443+
return Selector(tags=[self.id])
444444

445445
@event(StudentRegistered)
446446
def _(self, name: str, max_courses: int) -> None:
@@ -474,8 +474,8 @@ def __init__(self, course_id: CourseID) -> None:
474474
self.student_ids: list[StudentID] = []
475475

476476
@property
477-
def cb(self) -> list[Selector]:
478-
return [Selector(tags=[self.id])]
477+
def cb(self) -> Selector:
478+
return Selector(tags=[self.id])
479479

480480
@event(CourseRegistered)
481481
def _(self, name: str, places: int) -> None:

0 commit comments

Comments
 (0)