From 1f3d13278374167dd7fef95f4608e15c214cf19c Mon Sep 17 00:00:00 2001 From: Christian Heller Date: Wed, 6 Aug 2025 22:46:26 +0200 Subject: [PATCH] Minor AffectiveEvent.affector() refactoring. --- ircplom/client.py | 8 ++++---- ircplom/client_tui.py | 4 ++-- ircplom/events.py | 41 ++++++++++++++++++++++------------------- ircplom/tui_base.py | 4 ++-- 4 files changed, 30 insertions(+), 27 deletions(-) diff --git a/ircplom/client.py b/ircplom/client.py index 621e956..0ce10bc 100644 --- a/ircplom/client.py +++ b/ircplom/client.py @@ -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 diff --git a/ircplom/client_tui.py b/ircplom/client_tui.py index 3560327..6a48a1e 100644 --- a/ircplom/client_tui.py +++ b/ircplom/client_tui.py @@ -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) diff --git a/ircplom/events.py b/ircplom/events.py index 3adbe70..6734e60 100644 --- a/ircplom/events.py +++ b/ircplom/events.py @@ -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 diff --git a/ircplom/tui_base.py b/ircplom/tui_base.py index c5b57b2..6a92b32 100644 --- a/ircplom/tui_base.py +++ b/ircplom/tui_base.py @@ -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) -- 2.30.2