Skip to content

Commit 108945e

Browse files
authored
async signals (#93)
* async signals with blinker async signals * version test * version test * version test * version
1 parent c75b088 commit 108945e

File tree

5 files changed

+61
-2
lines changed

5 files changed

+61
-2
lines changed

mongoengine_plus/aio/async_document.py

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
from mongoengine import Document
22

33
from .async_query_set import AsyncQuerySet
4+
from .async_signals import post_save, pre_save
45
from .utils import create_awaitable
56

67

@@ -11,7 +12,15 @@ class AsyncDocument(Document):
1112
)
1213

1314
async def async_save(self, *args, **kwargs):
14-
return await create_awaitable(self.save, *args, **kwargs)
15+
signal_kwargs = kwargs.pop("signal_kwargs", {})
16+
await pre_save.send_async(
17+
self.__class__, document=self, **signal_kwargs
18+
)
19+
result = await create_awaitable(self.save, *args, **kwargs)
20+
await post_save.send_async(
21+
self.__class__, document=self, **signal_kwargs
22+
)
23+
return result
1524

1625
async def async_reload(self, *fields, **kwargs):
1726
return await create_awaitable(self.reload, *fields, **kwargs)
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
from mongoengine.signals import Namespace
2+
3+
async_signals = Namespace()
4+
5+
pre_save = async_signals.signal("pre_save")
6+
post_save = async_signals.signal("post_save")

mongoengine_plus/version.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
__version__ = '1.1.0'
1+
__version__ = '1.2.0'

setup.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
'pymongo>=3.13.0,<4.0.0',
3131
'pymongocrypt>=1.12.2,<2.0.0',
3232
'boto3>=1.34.106,<2.0.0',
33+
'blinker>=1.9.0,<2.0.0',
3334
],
3435
classifiers=[
3536
'Programming Language :: Python :: 3.9',

tests/aio/test_async_signals.py

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
import pytest
2+
from mongoengine import StringField
3+
4+
from mongoengine_plus.aio.async_document import AsyncDocument
5+
from mongoengine_plus.aio.async_signals import post_save, pre_save
6+
from mongoengine_plus.models.event_handlers import handler
7+
8+
9+
@pytest.mark.asyncio
10+
async def test_async_signal_handler_on_asyncdocument():
11+
pre_calls = []
12+
post_calls = []
13+
14+
@handler(pre_save)
15+
async def my_async_pre_handler(cls, document, **kwargs):
16+
pre_calls.append((document.name, getattr(document, "updated", False)))
17+
18+
@handler(post_save)
19+
async def my_async_post_handler(cls, document, **kwargs):
20+
post_calls.append((document.name, getattr(document, "updated", False)))
21+
22+
@my_async_pre_handler.apply
23+
@my_async_post_handler.apply
24+
class User(AsyncDocument):
25+
name = StringField(required=True)
26+
updated = StringField()
27+
28+
user = User(name="Jane")
29+
await user.async_save()
30+
assert pre_calls[-1][0] == "Jane"
31+
assert post_calls[-1][0] == "Jane"
32+
33+
user.name = "John"
34+
user.updated = "yes"
35+
await user.async_save()
36+
37+
# The handlers should have been called again with updated data
38+
assert pre_calls[-1][0] == "John"
39+
assert pre_calls[-1][1] == "yes"
40+
assert post_calls[-1][0] == "John"
41+
assert post_calls[-1][1] == "yes"
42+
assert len(pre_calls) == 2
43+
assert len(post_calls) == 2

0 commit comments

Comments
 (0)