Skip to content

Commit 6f10c8c

Browse files
authored
Delete global_domain_event_dispatcher (bump version to 22.0.0) (#303)
* Delete global_domain_event_dispatcher * Bump version to 22.0.0
1 parent 8660a25 commit 6f10c8c

File tree

16 files changed

+166
-82
lines changed

16 files changed

+166
-82
lines changed

CHANGELOG.md

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,14 @@ All notable changes to this project will be documented in this file.
44
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
55
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
66

7+
## [22.0.0] - 2024-05-07
8+
### Changed
9+
10+
- Delete `winter_ddd.global_domain_event_dispatcher`
11+
- It's now application responsibility to configure `DomainEventDispatcher`
12+
- For convenience there are a number of methods in `DomainEventDispatcher` class to add handlers
13+
- It's not a final form as it requires a lot of manual effort and configuration, so more changes to come
14+
715
## [21.0.0] - 2024-04-22
816
### Changed
917

pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[tool.poetry]
22
name = "winter"
3-
version = "21.0.0"
3+
version = "22.0.0"
44
homepage = "https://github.com/WinterFramework/winter"
55
description = "Web Framework with focus on python typing, dataclasses and modular design"
66
authors = ["Alexander Egorov <[email protected]>"]
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
from winter_ddd import DomainEventDispatcher
2+
from tests.winter_ddd.test_domain_event_dispatcher_fixture.events import DomainEvent1
3+
from tests.winter_ddd.test_domain_event_dispatcher_fixture.events import DomainEvent2
4+
5+
6+
def test_add_handlers_from_package():
7+
dispatcher = DomainEventDispatcher()
8+
dispatcher.add_handlers_from_package('tests.winter_ddd.test_domain_event_dispatcher_fixture')
9+
event1 = DomainEvent1()
10+
event2 = DomainEvent2()
11+
12+
# Act
13+
dispatcher.dispatch([event1, event2])
14+
15+
# Assert
16+
# Intentionally importing here to make sure that handlers are registered without explicit imports
17+
from tests.winter_ddd.test_domain_event_dispatcher_fixture.handler1 import Handler1
18+
from tests.winter_ddd.test_domain_event_dispatcher_fixture.subpackage.handler2 import Handler2
19+
assert len(Handler1.received_events) == 1
20+
assert len(Handler2.received_events) == 1
21+
assert Handler1.received_events[0] is event1
22+
assert Handler2.received_events[0] is event2

tests/winter_ddd/test_domain_event_dispatcher_fixture/__init__.py

Whitespace-only changes.
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
from winter_ddd import DomainEvent
2+
3+
4+
class DomainEvent1(DomainEvent):
5+
pass
6+
7+
8+
class DomainEvent2(DomainEvent):
9+
pass
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
from winter_ddd import domain_event_handler
2+
from .events import DomainEvent1
3+
4+
5+
class Handler1:
6+
received_events = []
7+
8+
@domain_event_handler
9+
def handle_event(self, event: DomainEvent1):
10+
self.received_events.append(event)

tests/winter_ddd/test_domain_event_dispatcher_fixture/subpackage/__init__.py

Whitespace-only changes.
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
from winter.core import annotate
2+
from winter_ddd import domain_event_handler
3+
from ..events import DomainEvent2
4+
5+
6+
class AnotherAnnotation:
7+
pass
8+
9+
10+
class Handler2:
11+
received_events = []
12+
13+
@domain_event_handler
14+
def handle_event(self, event: DomainEvent2):
15+
self.received_events.append(event)
16+
17+
def intentionally_without_annotation(self, event: DomainEvent2): # pragma: no cover
18+
# This shouldn't happen
19+
self.received_events.append(event)
20+
21+
@annotate(AnotherAnnotation())
22+
def intentionally_with_another_annotation(self, event: DomainEvent2): # pragma: no cover
23+
# This shouldn't happen
24+
self.received_events.append(event)

tests/winter_ddd/test_process_domain_events.py

Lines changed: 44 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,10 @@
33

44
import pytest
55

6+
from winter.core import ComponentMethod
67
from winter_ddd import DomainEvent
78
from winter_ddd import domain_event_handler
8-
from winter_ddd import global_domain_event_dispatcher
9+
from winter_ddd import DomainEventDispatcher
910

1011

1112
class CustomDomainEvent(DomainEvent):
@@ -20,41 +21,37 @@ class YetAnotherCustomEvent(DomainEvent):
2021
pass
2122

2223

23-
@pytest.fixture
24-
def empty_handler():
25-
class Handler:
26-
handled_domain_events = []
27-
handled_another_domain_events = []
28-
handled_many_domain_events = []
29-
handled_many_another_domain_events = []
30-
handled_union_domain_events = []
31-
handled_union_list_domain_events = []
32-
33-
@domain_event_handler
34-
def empty_handle(self, domain_event: CustomDomainEvent):
35-
self.handled_domain_events.append(domain_event)
24+
class _TestHandler:
25+
handled_domain_events = []
26+
handled_another_domain_events = []
27+
handled_many_domain_events = []
28+
handled_many_another_domain_events = []
29+
handled_union_domain_events = []
30+
handled_union_list_domain_events = []
3631

37-
@domain_event_handler
38-
def handle_many(self, domain_events: List[CustomDomainEvent]):
39-
self.handled_many_domain_events.append(domain_events)
32+
@domain_event_handler
33+
def empty_handle(self, domain_event: CustomDomainEvent):
34+
self.handled_domain_events.append(domain_event)
4035

41-
@domain_event_handler
42-
def handle_another(self, domain_event: AnotherCustomEvent):
43-
self.handled_another_domain_events.append(domain_event)
36+
@domain_event_handler
37+
def handle_many(self, domain_events: List[CustomDomainEvent]):
38+
self.handled_many_domain_events.append(domain_events)
4439

45-
@domain_event_handler
46-
def handle_many_another(self, domain_events: List[AnotherCustomEvent]):
47-
self.handled_many_another_domain_events.append(domain_events)
40+
@domain_event_handler
41+
def handle_another(self, domain_event: AnotherCustomEvent):
42+
self.handled_another_domain_events.append(domain_event)
4843

49-
@domain_event_handler
50-
def handle_union(self, domain_event: Union[CustomDomainEvent, AnotherCustomEvent]):
51-
self.handled_union_domain_events.append(domain_event)
44+
@domain_event_handler
45+
def handle_many_another(self, domain_events: List[AnotherCustomEvent]):
46+
self.handled_many_another_domain_events.append(domain_events)
5247

53-
@domain_event_handler
54-
def handle_union_list(self, domain_events: List[Union[CustomDomainEvent, AnotherCustomEvent]]):
55-
self.handled_union_list_domain_events.append(domain_events)
48+
@domain_event_handler
49+
def handle_union(self, domain_event: Union[CustomDomainEvent, AnotherCustomEvent]):
50+
self.handled_union_domain_events.append(domain_event)
5651

57-
yield Handler()
52+
@domain_event_handler
53+
def handle_union_list(self, domain_events: List[Union[CustomDomainEvent, AnotherCustomEvent]]):
54+
self.handled_union_list_domain_events.append(domain_events)
5855

5956

6057
class DomainEventForOrder(DomainEvent):
@@ -101,27 +98,30 @@ def handle_one(self, domain_event: DomainEventForOrder):
10198
self.handled_domain_events.append('handle_one_3')
10299

103100

104-
def test_process_domain_events(empty_handler):
101+
def test_process_domain_events():
105102
domain_event1 = CustomDomainEvent()
106103
domain_event2 = CustomDomainEvent()
107104
another_domain_event = AnotherCustomEvent()
108105
yet_another_domain_event = YetAnotherCustomEvent()
109106

107+
dispatcher = DomainEventDispatcher()
108+
dispatcher.add_handlers_from_class(_TestHandler)
109+
110110
# Act
111-
global_domain_event_dispatcher.dispatch([
111+
dispatcher.dispatch([
112112
domain_event1,
113113
another_domain_event,
114114
yet_another_domain_event,
115115
domain_event2,
116116
])
117117

118118
# Assert
119-
assert empty_handler.handled_domain_events == [domain_event1, domain_event2]
120-
assert empty_handler.handled_another_domain_events == [another_domain_event]
121-
assert empty_handler.handled_many_domain_events == [[domain_event1, domain_event2]]
122-
assert empty_handler.handled_many_another_domain_events == [[another_domain_event]]
123-
assert empty_handler.handled_union_domain_events == [domain_event1, another_domain_event, domain_event2]
124-
assert empty_handler.handled_union_list_domain_events == [[domain_event1, another_domain_event, domain_event2]]
119+
assert _TestHandler.handled_domain_events == [domain_event1, domain_event2]
120+
assert _TestHandler.handled_another_domain_events == [another_domain_event]
121+
assert _TestHandler.handled_many_domain_events == [[domain_event1, domain_event2]]
122+
assert _TestHandler.handled_many_another_domain_events == [[another_domain_event]]
123+
assert _TestHandler.handled_union_domain_events == [domain_event1, another_domain_event, domain_event2]
124+
assert _TestHandler.handled_union_list_domain_events == [[domain_event1, another_domain_event, domain_event2]]
125125

126126

127127
def test_order_process_domain_events():
@@ -132,9 +132,14 @@ def test_order_process_domain_events():
132132
OrderHandler2.handled_domain_events = handled_events
133133
OrderHandler3.handled_domain_events = handled_events
134134

135+
dispatcher = DomainEventDispatcher()
136+
dispatcher.add_handlers_from_class(OrderHandler1)
137+
dispatcher.add_handlers_from_class(OrderHandler2)
138+
dispatcher.add_handlers_from_class(OrderHandler3)
139+
135140
# Act
136141
for _ in range(5):
137-
global_domain_event_dispatcher.dispatch([
142+
dispatcher.dispatch([
138143
domain_event,
139144
])
140145

tests/winter_sqlalchemy/test_sqla_crud.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
from winter.data.exceptions import NotFoundException
2020
from winter_ddd import AggregateRoot
2121
from winter_ddd import DomainEvent
22+
from winter_ddd import DomainEventDispatcher
2223
from winter_ddd import domain_event_handler
2324
from winter_sqlalchemy import sqla_crud
2425

@@ -103,6 +104,9 @@ class Fixture:
103104
@inject
104105
def __init__(self, engine: Engine):
105106
injector = get_injector()
107+
domain_event_dispatcher = DomainEventDispatcher()
108+
domain_event_dispatcher.add_handlers_from_class(DomainEventHandlers)
109+
injector.binder.bind(DomainEventDispatcher, domain_event_dispatcher)
106110
injector.binder.bind(MyRepository, to=ClassProvider(sqla_crud(MyRepository)))
107111
self._engine = engine
108112
self.repository = injector.get(MyRepository)

0 commit comments

Comments
 (0)