From 94a4f95f348801cea187465a8052230c3966758f Mon Sep 17 00:00:00 2001 From: Sebastien Jourdain Date: Fri, 31 Jul 2026 16:56:50 -0600 Subject: [PATCH 1/4] feat(ctrl): add method to unregister trigger --- src/trame_server/controller.py | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/src/trame_server/controller.py b/src/trame_server/controller.py index dc2194e..eeacedf 100644 --- a/src/trame_server/controller.py +++ b/src/trame_server/controller.py @@ -108,6 +108,23 @@ def trigger_fn(self, name): """ return self._triggers.get(name) + def trigger_unregister(self, fn_or_name): + """ + Given a trigger name or function, unregister it. + Return the mapped name or function or False if not found. + """ + if fn_or_name in self._triggers_fn2name: + name = self._triggers_fn2name.pop(fn_or_name) + self._triggers.pop(name) + return name + + if fn_or_name in self._triggers: + fn = self._triggers.pop(fn_or_name) + self._triggers_fn2name.pop(fn) + return fn + + return False + def __getitem__(self, name): return self.__getattr__(name) From c23394f3f429c42fa116977c5f5d4160570922bb Mon Sep 17 00:00:00 2001 From: Sebastien Jourdain Date: Fri, 31 Jul 2026 16:57:32 -0600 Subject: [PATCH 2/4] fix(ctrl): discard also remove the main function --- src/trame_server/controller.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/trame_server/controller.py b/src/trame_server/controller.py index eeacedf..f5e428c 100644 --- a/src/trame_server/controller.py +++ b/src/trame_server/controller.py @@ -416,6 +416,9 @@ def discard(self, func): :param func: Function to discard """ + if self.func == func: + self.func = None + self.funcs.discard(func) self.funcs_once.discard(func) self.task_funcs.discard(func) From 5601ca55a4adf476e19ae0dd1cd3102275496b6f Mon Sep 17 00:00:00 2001 From: Sebastien Jourdain Date: Fri, 31 Jul 2026 16:59:52 -0600 Subject: [PATCH 3/4] fix(ctrl): include once in size evaluation --- src/trame_server/controller.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/trame_server/controller.py b/src/trame_server/controller.py index f5e428c..f8143e7 100644 --- a/src/trame_server/controller.py +++ b/src/trame_server/controller.py @@ -342,7 +342,10 @@ def __init__(self, controller, name, func=None): self.can_be_empty = False def __call__(self, *args, **kwargs): - if self.func is None and len(self.funcs) + len(self.task_funcs) == 0: + if ( + self.func is None + and len(self.funcs) + len(self.funcs_once) + len(self.task_funcs) == 0 + ): if self.can_be_empty: return None raise FunctionNotImplementedError(self.name) From 707f3d59b3e4ee5413d8ccf2cfb9380ad784d704 Mon Sep 17 00:00:00 2001 From: Sebastien Jourdain Date: Fri, 31 Jul 2026 17:01:00 -0600 Subject: [PATCH 4/4] feat(ctrl): add annotation on fn when registering a trigger --- src/trame_server/controller.py | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/trame_server/controller.py b/src/trame_server/controller.py index f8143e7..af86765 100644 --- a/src/trame_server/controller.py +++ b/src/trame_server/controller.py @@ -1,4 +1,5 @@ import logging +import types import weakref from .utils import asynchronous, is_dunder, share @@ -80,6 +81,19 @@ def register_trigger(func): logger.info("trigger(%s)", name) self._triggers[name] = func self._triggers_fn2name[func] = name + + # Add annotation to function + if not hasattr(func, "_trame_trigger_names"): + if isinstance(func, types.MethodType): + _class = func.__self__.__class__ + _name = func.__name__ + getattr(_class, _name)._trame_trigger_names = [] + else: + func._trame_trigger_names = [] + + if name not in func._trame_trigger_names: + func._trame_trigger_names.append(name) + return func return register_trigger