annotate libervia/backend/tools/async_trigger.py @ 4202:b26339343076

core: use a user specific directory for PID file: default location of pid file is now specific to logged user, this allow to run several instances of Libervia by different users on the same machine without PID conflicts.
author Goffi <goffi@goffi.org>
date Sun, 14 Jan 2024 17:48:02 +0100
parents 4b842c1fb686
children e11b13418ba6
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
1 #!/usr/bin/env python3
3137
559a625a236b fixed shebangs
Goffi <goffi@goffi.org>
parents: 3136
diff changeset
2
2645
f2cf1daa42cb core: added async TriggerManager
Goffi <goffi@goffi.org>
parents:
diff changeset
3
f2cf1daa42cb core: added async TriggerManager
Goffi <goffi@goffi.org>
parents:
diff changeset
4 # SAT: a jabber client
3479
be6d91572633 date update
Goffi <goffi@goffi.org>
parents: 3397
diff changeset
5 # Copyright (C) 2009-2021 Jérôme Poisson (goffi@goffi.org)
2645
f2cf1daa42cb core: added async TriggerManager
Goffi <goffi@goffi.org>
parents:
diff changeset
6
f2cf1daa42cb core: added async TriggerManager
Goffi <goffi@goffi.org>
parents:
diff changeset
7 # This program is free software: you can redistribute it and/or modify
f2cf1daa42cb core: added async TriggerManager
Goffi <goffi@goffi.org>
parents:
diff changeset
8 # it under the terms of the GNU Affero General Public License as published by
f2cf1daa42cb core: added async TriggerManager
Goffi <goffi@goffi.org>
parents:
diff changeset
9 # the Free Software Foundation, either version 3 of the License, or
f2cf1daa42cb core: added async TriggerManager
Goffi <goffi@goffi.org>
parents:
diff changeset
10 # (at your option) any later version.
f2cf1daa42cb core: added async TriggerManager
Goffi <goffi@goffi.org>
parents:
diff changeset
11
f2cf1daa42cb core: added async TriggerManager
Goffi <goffi@goffi.org>
parents:
diff changeset
12 # This program is distributed in the hope that it will be useful,
f2cf1daa42cb core: added async TriggerManager
Goffi <goffi@goffi.org>
parents:
diff changeset
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
f2cf1daa42cb core: added async TriggerManager
Goffi <goffi@goffi.org>
parents:
diff changeset
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
f2cf1daa42cb core: added async TriggerManager
Goffi <goffi@goffi.org>
parents:
diff changeset
15 # GNU Affero General Public License for more details.
f2cf1daa42cb core: added async TriggerManager
Goffi <goffi@goffi.org>
parents:
diff changeset
16
f2cf1daa42cb core: added async TriggerManager
Goffi <goffi@goffi.org>
parents:
diff changeset
17 # You should have received a copy of the GNU Affero General Public License
f2cf1daa42cb core: added async TriggerManager
Goffi <goffi@goffi.org>
parents:
diff changeset
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
f2cf1daa42cb core: added async TriggerManager
Goffi <goffi@goffi.org>
parents:
diff changeset
19
f2cf1daa42cb core: added async TriggerManager
Goffi <goffi@goffi.org>
parents:
diff changeset
20 """Misc usefull classes"""
f2cf1daa42cb core: added async TriggerManager
Goffi <goffi@goffi.org>
parents:
diff changeset
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
f2cf1daa42cb core: added async TriggerManager
Goffi <goffi@goffi.org>
parents:
diff changeset
25 from twisted.internet import defer
f2cf1daa42cb core: added async TriggerManager
Goffi <goffi@goffi.org>
parents:
diff changeset
26
f2cf1daa42cb core: added async TriggerManager
Goffi <goffi@goffi.org>
parents:
diff changeset
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
f2cf1daa42cb core: added async TriggerManager
Goffi <goffi@goffi.org>
parents:
diff changeset
29
f2cf1daa42cb core: added async TriggerManager
Goffi <goffi@goffi.org>
parents:
diff changeset
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
f2cf1daa42cb core: added async TriggerManager
Goffi <goffi@goffi.org>
parents:
diff changeset
32 """This put a trigger point with potentially async Deferred
f2cf1daa42cb core: added async TriggerManager
Goffi <goffi@goffi.org>
parents:
diff changeset
33
f2cf1daa42cb core: added async TriggerManager
Goffi <goffi@goffi.org>
parents:
diff changeset
34 All the triggers for that point will be run
f2cf1daa42cb core: added async TriggerManager
Goffi <goffi@goffi.org>
parents:
diff changeset
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
f2cf1daa42cb core: added async TriggerManager
Goffi <goffi@goffi.org>
parents:
diff changeset
41 @return D(bool): True if the action must be continued, False else
f2cf1daa42cb core: added async TriggerManager
Goffi <goffi@goffi.org>
parents:
diff changeset
42 """
f2cf1daa42cb core: added async TriggerManager
Goffi <goffi@goffi.org>
parents:
diff changeset
43 if point_name not in self.__triggers:
f2cf1daa42cb core: added async TriggerManager
Goffi <goffi@goffi.org>
parents:
diff changeset
44 defer.returnValue(True)
f2cf1daa42cb core: added async TriggerManager
Goffi <goffi@goffi.org>
parents:
diff changeset
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
f2cf1daa42cb core: added async TriggerManager
Goffi <goffi@goffi.org>
parents:
diff changeset
48 for priority, trigger in self.__triggers[point_name]:
f2cf1daa42cb core: added async TriggerManager
Goffi <goffi@goffi.org>
parents:
diff changeset
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
f2cf1daa42cb core: added async TriggerManager
Goffi <goffi@goffi.org>
parents:
diff changeset
52 defer.returnValue(False)
f2cf1daa42cb core: added async TriggerManager
Goffi <goffi@goffi.org>
parents:
diff changeset
53 except sync_trigger.SkipOtherTriggers:
f2cf1daa42cb core: added async TriggerManager
Goffi <goffi@goffi.org>
parents:
diff changeset
54 break
f2cf1daa42cb core: added async TriggerManager
Goffi <goffi@goffi.org>
parents:
diff changeset
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