File tree 10 files changed +85
-7
lines changed
10 files changed +85
-7
lines changed Original file line number Diff line number Diff line change 1
1
FROM python:3.12.1-slim-bookworm
2
2
3
+ ENV PYTHONDONTWRITEBYTECODE 1
4
+ ENV PYTHONUNBUFFERED 1
5
+
3
6
WORKDIR /app
4
7
5
8
RUN apt update -y && \
Original file line number Diff line number Diff line change @@ -19,4 +19,8 @@ app-shell:
19
19
20
20
.PHONY : app-logs
21
21
app-logs :
22
- ${LOGS} ${APP_CONTAINER} -f
22
+ ${LOGS} ${APP_CONTAINER} -f
23
+
24
+ .PHONY : test
25
+ test :
26
+ ${EXEC} ${APP_CONTAINER} pytest tests
Original file line number Diff line number Diff line change 1
1
from abc import ABC
2
+ from copy import copy
2
3
from dataclasses import dataclass , field
3
4
from datetime import datetime
4
5
from uuid import uuid4
5
6
7
+ from domain .events .base import BaseEvent
6
8
7
- @dataclass (frozen = True )
9
+
10
+ @dataclass
8
11
class BaseEntity (ABC ):
9
12
oid : str = field (
10
13
default_factory = lambda : str (uuid4 ()),
@@ -16,8 +19,21 @@ class BaseEntity(ABC):
16
19
kw_only = True ,
17
20
)
18
21
22
+ _events : list [BaseEvent ] = field (
23
+ default_factory = list ,
24
+ kw_only = True ,
25
+ )
26
+
19
27
def __hash__ (self ) -> int :
20
28
return hash (self .oid )
21
29
22
- def __eq__ (self , __value : "BaseEntity " ) -> bool :
30
+ def __eq__ (self , __value : "BaseEvent " ) -> bool :
23
31
return self .oid == __value .oid
32
+
33
+ def register_event (self , event : BaseEvent ) -> None :
34
+ self ._events .append (event )
35
+
36
+ def pull_events (self ) -> list [BaseEvent ]:
37
+ registered_events = copy (self ._events )
38
+ self ._events .clear ()
39
+ return registered_events
Original file line number Diff line number Diff line change 1
1
from dataclasses import dataclass , field
2
2
3
3
from domain .entities .base import BaseEntity
4
+ from domain .events .messages import NewMessageReceivedEvent
4
5
from domain .values .messages import Text , Title
5
6
6
7
7
- @dataclass (frozen = True )
8
+ @dataclass (eq = False )
8
9
class Message (BaseEntity ):
9
10
text : Text
10
11
11
12
12
- @dataclass (frozen = True )
13
+ @dataclass (eq = False )
13
14
class Chat (BaseEntity ):
14
15
title : Title
15
16
messages : set [Message ] = field (
16
17
default_factory = set ,
17
18
kw_only = True ,
18
19
)
19
20
21
+ def __hash__ (self ) -> int :
22
+ return hash (self .oid )
23
+
24
+ def __eq__ (self , __value : "Chat" ) -> bool :
25
+ return self .oid == __value .oid
26
+
20
27
def add_message (self , message : Message ):
21
28
self .messages .add (message )
29
+ self .register_event (
30
+ NewMessageReceivedEvent (
31
+ message_text = message .text .as_generic_type (),
32
+ chat_oid = self .oid ,
33
+ message_oid = message .oid ,
34
+ )
35
+ )
Original file line number Diff line number Diff line change
1
+ from abc import ABC
2
+ from dataclasses import dataclass , field
3
+ from uuid import uuid4 , UUID
4
+
5
+
6
+ @dataclass
7
+ class BaseEvent (ABC ):
8
+ event_id : UUID = field (default_factory = uuid4 , kw_only = True )
Original file line number Diff line number Diff line change
1
+ from dataclasses import dataclass
2
+
3
+ from domain .events .base import BaseEvent
4
+
5
+
6
+ @dataclass
7
+ class NewMessageReceivedEvent (BaseEvent ):
8
+ message_oid : str
9
+ message_text : str
10
+ chat_oid : str
Original file line number Diff line number Diff line change @@ -16,4 +16,4 @@ def __post_init__(self):
16
16
def validate (self ): ...
17
17
18
18
@abstractmethod
19
- def as_generic_type (self ): ...
19
+ def as_generic_type (self ) -> VT : ...
Original file line number Diff line number Diff line change @@ -26,5 +26,5 @@ def validate(self):
26
26
if len (self .value ) > 255 :
27
27
raise TitleTooLongException (self .value )
28
28
29
- def as_generic_type (self ):
29
+ def as_generic_type (self ) -> str :
30
30
return str (self .value )
Original file line number Diff line number Diff line change 3
3
import pytest
4
4
5
5
from domain .entities .messages import Message , Chat
6
+ from domain .events .messages import NewMessageReceivedEvent
6
7
from domain .exceptions .messages import TitleTooLongException
7
8
from domain .values .messages import Text , Title
8
9
@@ -38,3 +39,25 @@ def test_add_message_to_chat():
38
39
39
40
chat .add_message (message )
40
41
assert message in chat .messages
42
+
43
+
44
+ def test_new_message_events ():
45
+ text = Text ("Hello word" )
46
+ message = Message (text = text )
47
+
48
+ title = Title ("title" )
49
+ chat = Chat (title = title )
50
+
51
+ chat .add_message (message )
52
+ events = chat .pull_events ()
53
+ pulled_events = chat .pull_events ()
54
+
55
+ assert not pulled_events , pulled_events
56
+ assert len (events ) == 1 , events
57
+
58
+ new_event = events [0 ]
59
+
60
+ assert isinstance (new_event , NewMessageReceivedEvent ), new_event
61
+ assert new_event .message_oid == message .oid
62
+ assert new_event .message_text == message .text .as_generic_type ()
63
+ assert new_event .chat_oid == chat .oid
You can’t perform that action at this time.
0 commit comments