Skip to content

Commit 6e56737

Browse files
committed
Experimenting with using projected types in consistency boundary.
1 parent ef9da46 commit 6e56737

File tree

2 files changed

+26
-67
lines changed

2 files changed

+26
-67
lines changed

eventsourcing/dcb/domain.py

Lines changed: 7 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ def apply(self, obj: Perspective) -> None:
7373

7474
# Identify the function that was decorated.
7575
try:
76-
decorated_func = decorated_func_mapping[(type(obj), type(self))]
76+
decorated_func = decorated_funcs[(type(obj), type(self))]
7777
except KeyError:
7878
return
7979

@@ -112,6 +112,8 @@ def __init__(
112112

113113
topic_prefix = construct_topic(cls) + "."
114114

115+
cls.projected_types: list[type[Mutates]] = []
116+
115117
# Find the event decorators on this class.
116118
func_decorators = [
117119
decorator
@@ -153,7 +155,9 @@ def __init__(
153155
decorated_func_callers[decorator] = func_caller
154156

155157
# Remember which decorated func to call.
156-
decorated_func_mapping[(cls, func_caller)] = decorator.decorated_func
158+
decorated_funcs[(cls, func_caller)] = decorator.decorated_func
159+
160+
cls.projected_types.append(func_caller)
157161

158162
def _insert_decorator_func_caller(
159163
cls, given_event_class: type[Mutates], topic_prefix: str
@@ -220,7 +224,7 @@ def cb(self) -> list[Selector]:
220224

221225

222226
given_event_class_mapping: dict[type[Mutates], type[DecoratedFuncCaller]] = {}
223-
decorated_func_mapping: dict[tuple[MetaPerspective, type[Mutates]], CallableType] = {}
227+
decorated_funcs: dict[tuple[MetaPerspective, type[Mutates]], CallableType] = {}
224228

225229

226230
class MetaEnduringObject(SupportsEventDecorator):
@@ -366,58 +370,6 @@ class Selector:
366370

367371
class MetaSlice(SupportsEventDecorator):
368372
pass
369-
# def __init__(
370-
# cls, name: str, bases: tuple[type, ...], namespace: dict[str, Any]
371-
# ) -> None:
372-
# super().__init__(name, bases, namespace)
373-
#
374-
# # Find the event decorators.
375-
# topic_prefix = construct_topic(cls) + "."
376-
#
377-
# my_func_decorators = cls._filter_event_decorators(topic_prefix)
378-
#
379-
# for decorator in my_func_decorators:
380-
# given_event_class = decorator.given_event_cls
381-
# # Keep things simple by only supporting given classes (not names).
382-
# # TODO: Maybe support event name strings, maybe not....
383-
# assert given_event_class is not None, "Event class not given"
384-
# # Make sure event decorator has a Mutates class.
385-
# assert issubclass(given_event_class, Mutates)
386-
#
387-
# # Decorator never has an original event class that has been subclassed.
388-
# assert given_event_class not in given_event_subclasses
389-
# if issubclass(given_event_class, DecoratedFuncCaller):
390-
# # Decorator has a subclass of an original class.
391-
# assert given_event_class in given_event_subclasses.values()
392-
# event_subclass = given_event_class
393-
# else:
394-
# event_class_qual = given_event_class.__qualname__
395-
# assert (
396-
# "." not in event_class_qual
397-
# ), "Nested cross-cutting classes aren't supported"
398-
#
399-
# # Get the global namespace for the event class.
400-
# globalns = getattr(
401-
# sys.modules.get(given_event_class.__module__, None),
402-
# "__dict__",
403-
# {},
404-
# )
405-
# # Check the given event class is in the globalns.
406-
# assert given_event_class.__name__ in globalns
407-
# assert globalns[given_event_class.__name__] is given_event_class
408-
#
409-
# # Define a subclass of the given event class.
410-
# event_subclass = cls._define_decorator_func_caller(given_event_class)
411-
# # Remember which subclass for given event class.
412-
# given_event_subclasses[given_event_class] = event_subclass
413-
#
414-
# # Replace the given event class in its namespace.
415-
# globalns[event_class_qual] = event_subclass
416-
#
417-
# # Register decorated func for event class / enduring object class.
418-
# cross_cutting_decorated_funcs[(cls, event_subclass)] = (
419-
# decorator.decorated_func
420-
# )
421373

422374

423375
class Slice(Perspective, metaclass=MetaSlice):

examples/coursebookingdcbslices/application.py

Lines changed: 19 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -291,15 +291,19 @@ def __init__(self, student_id: StudentID, course_id: CourseID) -> None:
291291

292292
@property
293293
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+
# ]
294304
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-
),
305+
Selector(types=type(self).projected_types, tags=[tag])
306+
for tag in [self.student_id, self.course_id]
303307
]
304308

305309
@event(StudentRegistered)
@@ -346,7 +350,7 @@ def __init__(self, course_id: CourseID) -> None:
346350

347351
@property
348352
def cb(self) -> list[Selector]:
349-
return [Selector(types=[StudentJoinedCourse], tags=[self.course_id])]
353+
return [Selector(types=type(self).projected_types, tags=[self.course_id])]
350354

351355
@event(StudentJoinedCourse)
352356
def _(self, student_id: StudentID) -> None:
@@ -362,7 +366,8 @@ def __init__(self, student_ids: list[StudentID]) -> None:
362366
@property
363367
def cb(self) -> list[Selector]:
364368
return [
365-
Selector(types=[StudentRegistered, StudentNameUpdated], tags=[student_id])
369+
# Selector(types=[StudentRegistered, StudentNameUpdated], tags=[student_id])
370+
Selector(types=type(self).projected_types, tags=[student_id])
366371
for student_id in self.student_id_names
367372
]
368373

@@ -388,7 +393,8 @@ def __init__(self, student_id: StudentID) -> None:
388393

389394
@property
390395
def cb(self) -> list[Selector]:
391-
return [Selector(types=[StudentJoinedCourse], tags=[self.student_id])]
396+
# return [Selector(types=[StudentJoinedCourse], tags=[self.student_id])]
397+
return [Selector(types=type(self).projected_types, tags=[self.student_id])]
392398

393399
@event(StudentJoinedCourse)
394400
def _(self, course_id: CourseID) -> None:
@@ -404,7 +410,8 @@ def __init__(self, course_ids: list[CourseID]) -> None:
404410
@property
405411
def cb(self) -> list[Selector]:
406412
return [
407-
Selector(types=[CourseRegistered, CourseNameUpdated], tags=[student_id])
413+
# Selector(types=[CourseRegistered, CourseNameUpdated], tags=[student_id])
414+
Selector(types=type(self).projected_types, tags=[student_id])
408415
for student_id in self.course_id_names
409416
]
410417

0 commit comments

Comments
 (0)