home · contact · privacy
Minor AffectiveEvent.affector() refactoring.
authorChristian Heller <c.heller@plomlompom.de>
Wed, 6 Aug 2025 20:46:26 +0000 (22:46 +0200)
committerChristian Heller <c.heller@plomlompom.de>
Wed, 6 Aug 2025 20:46:26 +0000 (22:46 +0200)
ircplom/client.py
ircplom/client_tui.py
ircplom/events.py
ircplom/tui_base.py

index 621e956402e0ddbabcea230d2610d1325ae73011..0ce10bcbfc29c809b0c0376a211a696e554290f3 100644 (file)
@@ -45,8 +45,8 @@ class _IrcConnection(BaseIrcConnection, ClientIdMixin):
                          **kwargs)
 
     def _make_recv_event(self, msg: IrcMessage) -> ClientEvent:
-        return ClientEvent.affector()(
-                client_id=self.client_id, t_method='handle_msg').kw(msg=msg)
+        return ClientEvent.affector('handle_msg', client_id=self.client_id
+                                    ).kw(msg=msg)
 
 
 @dataclass
@@ -54,8 +54,8 @@ class ClientQueueMixin(QueueMixin, ClientIdMixin):
     'To QueueMixin adds _cput to send ClientEvent for self.'
 
     def _cput(self, t_method: str, **kwargs) -> None:
-        self._put(ClientEvent.affector()(
-            client_id=self.client_id, t_method=t_method).kw(**kwargs))
+        self._put(ClientEvent.affector(t_method, client_id=self.client_id
+                                       ).kw(**kwargs))
 
 
 @dataclass
index 356032745d983a549a4eff952bb628a31c5a6bce..6a48a1e108535b8fe09544631ff6d0600c6a7baa 100644 (file)
@@ -174,8 +174,8 @@ class ClientTui(BaseTui):
 class _ClientKnowingTui(Client):
 
     def _ctput(self, t_method: str, **kwargs) -> None:
-        self._put(TuiEvent.affector()(t_method).kw(client_id=self.client_id
-                                                   ).kw(**kwargs))
+        self._put(TuiEvent.affector(t_method).kw(client_id=self.client_id
+                                                 ).kw(**kwargs))
 
     def _log(self, msg: str, stream: str = STREAM_SERVER) -> None:
         self._ctput('log_for_client', stream=stream, msg=msg)
index 3adbe70b38bb555d148ab6ef58ec28244425bae5..6734e60f967f8faeb43e3f595c29a336f135ae53 100644 (file)
@@ -24,29 +24,32 @@ class AffectiveEvent(Event, ABC):
         'To be run by main loop on target.'
 
     @classmethod
-    def affector(cls):
-        '''Return subclass whose .affect calls target method on **kwargs.
+    def affector(cls, t_method: str, **kwargs):
+        '''Return instance of subclass affecting target via t_method.
 
         This will often be more convenient than a full subclass definition,
         which mostly only matters for what the main loop gotta differentiate.
         '''
-        class _Affector:
-            def __init__(self, t_method: str, **kwargs) -> None:
-                super().__init__(**kwargs)
-                self.t_method = t_method
-                self.kwargs: dict[str, Any] = {}
-
-            def kw(self, **kwargs) -> Self:
-                'Collect .kwargs expanded, return self for chaining.'
-                for k, v in kwargs.items():
-                    self.kwargs[k] = v
-                return self
-
-            def affect(self, target) -> None:
-                'Call target.t_method(**.kwargs).'
-                getattr(target, self.t_method)(**self.kwargs)
-
-        return type(f'{cls.__name__}·Affector', (_Affector, cls), {})
+        def wrap():  # else current mypy throw [valid-type] on 'Variable "cls"'
+            class _Affector(cls):
+                def __init__(self, t_method: str, **kwargs) -> None:
+                    super().__init__(**kwargs)
+                    self.t_method = t_method
+                    self.kwargs: dict[str, Any] = {}
+
+                def kw(self, **kwargs) -> Self:
+                    'Collect .kwargs expanded, return self for chaining.'
+                    for k, v in kwargs.items():
+                        self.kwargs[k] = v
+                    return self
+
+                def affect(self, target) -> None:
+                    'Call target.t_method(**.kwargs).'
+                    getattr(target, self.t_method)(**self.kwargs)
+
+            return _Affector
+
+        return wrap()(t_method=t_method, **kwargs)
 
 
 @dataclass
index c5b57b29181148fcde10513ed9d7ea97d3c979f8..6a92b324da4e03215c08c8e4f83a83db01e54c6e 100644 (file)
@@ -624,6 +624,6 @@ class Terminal(QueueMixin):
                             to_yield += c
                 else:
                     to_yield = 'esc:' + ':'.join([str(int(b)) for b in chars])
-            yield (TuiEvent.affector()('handle_keyboard_event'
-                                       ).kw(typed_in=to_yield) if to_yield
+            yield (TuiEvent.affector('handle_keyboard_event'
+                                     ).kw(typed_in=to_yield) if to_yield
                    else None)