Mercurial > libervia-backend
annotate libervia/backend/tools/async_trigger.py @ 4149:c36295487082
core: introduce Pydantic based models in `libervia.backend.models.core`
author | Goffi <goffi@goffi.org> |
---|---|
date | Wed, 22 Nov 2023 14:31:05 +0100 |
parents | 4b842c1fb686 |
children | e11b13418ba6 |
rev | line source |
---|---|
3028 | 1 #!/usr/bin/env python3 |
3137 | 2 |
2645 | 3 |
4 # SAT: a jabber client | |
3479 | 5 # Copyright (C) 2009-2021 Jérôme Poisson (goffi@goffi.org) |
2645 | 6 |
7 # This program is free software: you can redistribute it and/or modify | |
8 # it under the terms of the GNU Affero General Public License as published by | |
9 # the Free Software Foundation, either version 3 of the License, or | |
10 # (at your option) any later version. | |
11 | |
12 # This program is distributed in the hope that it will be useful, | |
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of | |
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
15 # GNU Affero General Public License for more details. | |
16 | |
17 # You should have received a copy of the GNU Affero General Public License | |
18 # along with this program. If not, see <http://www.gnu.org/licenses/>. | |
19 | |
20 """Misc usefull classes""" | |
21 | |
3755
e14847bf65c0
tools (async_trigger): fix return value in `asyncReturnPoint` + typing hints
Goffi <goffi@goffi.org>
parents:
3525
diff
changeset
|
22 from typing import Tuple, Any |
3397
c069882f64cb
tools (async_trigger): use `utils.asDeferred` for async triggers:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
23 from . import trigger as sync_trigger |
c069882f64cb
tools (async_trigger): use `utils.asDeferred` for async triggers:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
24 from . import utils |
2645 | 25 from twisted.internet import defer |
26 | |
27 class TriggerManager(sync_trigger.TriggerManager): | |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3755
diff
changeset
|
28 """This is a TriggerManager with an new async_point method""" |
2645 | 29 |
30 @defer.inlineCallbacks | |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3755
diff
changeset
|
31 def async_point(self, point_name, *args, **kwargs): |
2645 | 32 """This put a trigger point with potentially async Deferred |
33 | |
34 All the triggers for that point will be run | |
35 @param point_name: name of the trigger point | |
2650
3a8e7ec4648a
tools (trigger, async_trigger): added no_cancel argument to point and asyncPoint when a trigger must not be cancellable
Goffi <goffi@goffi.org>
parents:
2645
diff
changeset
|
36 @param *args: args to transmit to trigger |
3a8e7ec4648a
tools (trigger, async_trigger): added no_cancel argument to point and asyncPoint when a trigger must not be cancellable
Goffi <goffi@goffi.org>
parents:
2645
diff
changeset
|
37 @param *kwargs: kwargs to transmit to trigger |
3a8e7ec4648a
tools (trigger, async_trigger): added no_cancel argument to point and asyncPoint when a trigger must not be cancellable
Goffi <goffi@goffi.org>
parents:
2645
diff
changeset
|
38 if "triggers_no_cancel" is present, it will be popped out |
3a8e7ec4648a
tools (trigger, async_trigger): added no_cancel argument to point and asyncPoint when a trigger must not be cancellable
Goffi <goffi@goffi.org>
parents:
2645
diff
changeset
|
39 when set to True, this argument don't let triggers stop |
3a8e7ec4648a
tools (trigger, async_trigger): added no_cancel argument to point and asyncPoint when a trigger must not be cancellable
Goffi <goffi@goffi.org>
parents:
2645
diff
changeset
|
40 the workflow |
2645 | 41 @return D(bool): True if the action must be continued, False else |
42 """ | |
43 if point_name not in self.__triggers: | |
44 defer.returnValue(True) | |
45 | |
2650
3a8e7ec4648a
tools (trigger, async_trigger): added no_cancel argument to point and asyncPoint when a trigger must not be cancellable
Goffi <goffi@goffi.org>
parents:
2645
diff
changeset
|
46 can_cancel = not kwargs.pop('triggers_no_cancel', False) |
3a8e7ec4648a
tools (trigger, async_trigger): added no_cancel argument to point and asyncPoint when a trigger must not be cancellable
Goffi <goffi@goffi.org>
parents:
2645
diff
changeset
|
47 |
2645 | 48 for priority, trigger in self.__triggers[point_name]: |
49 try: | |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3755
diff
changeset
|
50 cont = yield utils.as_deferred(trigger, *args, **kwargs) |
2650
3a8e7ec4648a
tools (trigger, async_trigger): added no_cancel argument to point and asyncPoint when a trigger must not be cancellable
Goffi <goffi@goffi.org>
parents:
2645
diff
changeset
|
51 if can_cancel and not cont: |
2645 | 52 defer.returnValue(False) |
53 except sync_trigger.SkipOtherTriggers: | |
54 break | |
55 defer.returnValue(True) | |
3525
7f5bf108961a
tools (async_trigger): new `asyncReturnPoint` method
Goffi <goffi@goffi.org>
parents:
3479
diff
changeset
|
56 |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3755
diff
changeset
|
57 async def async_return_point( |
3755
e14847bf65c0
tools (async_trigger): fix return value in `asyncReturnPoint` + typing hints
Goffi <goffi@goffi.org>
parents:
3525
diff
changeset
|
58 self, |
e14847bf65c0
tools (async_trigger): fix return value in `asyncReturnPoint` + typing hints
Goffi <goffi@goffi.org>
parents:
3525
diff
changeset
|
59 point_name: str, |
e14847bf65c0
tools (async_trigger): fix return value in `asyncReturnPoint` + typing hints
Goffi <goffi@goffi.org>
parents:
3525
diff
changeset
|
60 *args, **kwargs |
e14847bf65c0
tools (async_trigger): fix return value in `asyncReturnPoint` + typing hints
Goffi <goffi@goffi.org>
parents:
3525
diff
changeset
|
61 ) -> Tuple[bool, Any]: |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3755
diff
changeset
|
62 """Async version of return_point""" |
3525
7f5bf108961a
tools (async_trigger): new `asyncReturnPoint` method
Goffi <goffi@goffi.org>
parents:
3479
diff
changeset
|
63 if point_name not in self.__triggers: |
3755
e14847bf65c0
tools (async_trigger): fix return value in `asyncReturnPoint` + typing hints
Goffi <goffi@goffi.org>
parents:
3525
diff
changeset
|
64 return True, None |
3525
7f5bf108961a
tools (async_trigger): new `asyncReturnPoint` method
Goffi <goffi@goffi.org>
parents:
3479
diff
changeset
|
65 |
7f5bf108961a
tools (async_trigger): new `asyncReturnPoint` method
Goffi <goffi@goffi.org>
parents:
3479
diff
changeset
|
66 for priority, trigger in self.__triggers[point_name]: |
7f5bf108961a
tools (async_trigger): new `asyncReturnPoint` method
Goffi <goffi@goffi.org>
parents:
3479
diff
changeset
|
67 try: |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3755
diff
changeset
|
68 cont, ret_value = await utils.as_deferred(trigger, *args, **kwargs) |
3525
7f5bf108961a
tools (async_trigger): new `asyncReturnPoint` method
Goffi <goffi@goffi.org>
parents:
3479
diff
changeset
|
69 if not cont: |
7f5bf108961a
tools (async_trigger): new `asyncReturnPoint` method
Goffi <goffi@goffi.org>
parents:
3479
diff
changeset
|
70 return False, ret_value |
7f5bf108961a
tools (async_trigger): new `asyncReturnPoint` method
Goffi <goffi@goffi.org>
parents:
3479
diff
changeset
|
71 except sync_trigger.SkipOtherTriggers: |
7f5bf108961a
tools (async_trigger): new `asyncReturnPoint` method
Goffi <goffi@goffi.org>
parents:
3479
diff
changeset
|
72 break |
7f5bf108961a
tools (async_trigger): new `asyncReturnPoint` method
Goffi <goffi@goffi.org>
parents:
3479
diff
changeset
|
73 return True, None |
7f5bf108961a
tools (async_trigger): new `asyncReturnPoint` method
Goffi <goffi@goffi.org>
parents:
3479
diff
changeset
|
74 |