home · contact · privacy
Don't trigger update logs on auto-creation of (at that point still uselessly empty...
authorChristian Heller <c.heller@plomlompom.de>
Thu, 20 Nov 2025 08:44:49 +0000 (09:44 +0100)
committerChristian Heller <c.heller@plomlompom.de>
Thu, 20 Nov 2025 08:44:49 +0000 (09:44 +0100)
src/ircplom/client_tui.py
src/ircplom/db_primitives.py
src/tests/channels.test
src/tests/lib/conn
src/tests/lib/part
src/tests/test.test
src/tests/tui_draw.test

index 2a473377679ac2d819c053544c070e45b17cc38a..ef62f571acf5f7e1c1601018b0fed4b3e3119e7c 100644 (file)
@@ -208,8 +208,8 @@ class _Update:
 
 class _UpdatingNode(AutoAttrMixin):
 
-    def _make_attr(self, cls: Callable, key: str):
-        return cls()
+    def _auto_setattr(self, key: str, cls: Callable) -> None:
+        setattr(self, key, cls())
 
     def recursive_set_and_report_change(self, update: _Update) -> None:
         'Apply update, and, if it makes a difference, add to its .results.'
index d62afa6881989297917979ad3b55d3f6373089a0..2e2993bd955d183b124a2793db54f36ffd7b5515 100644 (file)
@@ -4,7 +4,7 @@ from typing import (Any, Callable, Collection, Generic, Iterable, Iterator,
                     Optional, Set, TypeVar)
 
 
-class AutoAttrMixin:
+class AutoAttrMixin(ABC):
     'Ensures attribute as defined by annotations along MRO'
 
     @classmethod
@@ -15,12 +15,16 @@ class AutoAttrMixin:
                 types = c.__annotations__ | types
         return {k: v for k, v in types.items() if k[0] != '_'}
 
+    @abstractmethod
+    def _auto_setattr(self, key: str, cls: Callable) -> None:
+        pass
+
     def __getattribute__(self, key: str):
         if key[0] != '_' and (cls := self._deep_annotations().get(key, None)):
             try:
                 return super().__getattribute__(key)
             except AttributeError:
-                setattr(self, key, self._make_attr(cls, key))
+                self._auto_setattr(key, cls)
         return super().__getattribute__(key)
 
 
@@ -188,8 +192,9 @@ class UpdatingMixin:
 class UpdatingAttrsMixin(UpdatingMixin, AutoAttrMixin):
     'Calls update trigger on changes to attributes.'
 
-    def _make_attr(self, cls: Callable, key: str):
-        return cls(on_update=lambda *steps: self._on_update(key, *steps))
+    def _auto_setattr(self, key: str, cls: Callable) -> None:
+        super().__setattr__(key, cls(
+            on_update=lambda *steps: self._on_update(key, *steps)))
 
     def __setattr__(self, key: str, value) -> None:
         super().__setattr__(key, value)
@@ -215,6 +220,7 @@ class UpdatingDict(UpdatingMixin, Dict[DictItem]):
                 if UpdatingMixin in self._item_cls.__mro__:
                     kw |= {'on_update':
                            lambda *steps: self._on_update(key, *steps)}
+                # bypass .__setitem__: avoid ._on_update on useless emptiness
                 self._dict[key] = self._item_cls(**kw)
         return super().__getitem__(key)
 
index 5aa13e8f3e3f2308fa8f19d69ba0f37f2741a0ac..53b2b5e8d27711f58f739b89b5796f31fdd4d73d 100644 (file)
@@ -12,7 +12,7 @@ insert ./lib/disconnect
 insert ./lib/join-empty
 # for: join-channel-0, join-channel-1, join-empty
 insert ./lib/part
-# for: exit-channel, part, part-0, part-1, parts-core, quit
+# for: exit-channel, part, parts-core, quit
 insert ./lib/privmsg
 insert ./lib/retry-in
 insert ./lib/servermsglogged
@@ -149,15 +149,13 @@ log 3 < (*.?.net) msg_test6 msg_test7
 
 # check part of user visible, and of user NOT visible in other channel
 insert part-other : + NICK=baz USER_ID=2 REMAINING_IDS :[3], [4], [5], [me]
-# !!!!
-insert part-other :2 + NICK=oof USER_ID=3 REMAINING_IDS :[4], [5], [me]
-insert part-other 3: + NICK=oof USER_ID=3 REMAINING_IDS :[4], [5], [me]
+insert part-other : + NICK=oof USER_ID=3 REMAINING_IDS :[4], [5], [me]
 log 1 $ users:3 cleared
 
 # check other-user part with exit message
 insert servermsglogged : + MSG ::zab!~zab@zab.zab PART #ch_test0 :goodbye
 insert user-set-to 1: + USER_ID=5 USERNAME=~zab USERHOST :zab.zab
-insert parts-core 1: + CHAN_WIN_ID=3 CHANNEL=#ch_test0 USER_ID=5 NICK=zab exitPREFIX=:§ exitMSG=goodbye USERIDS_CLEAR=set§to:§[4],§[me] § : 
+insert parts-core : + CHAN_WIN_ID=3 CHANNEL=#ch_test0 USER_ID=5 NICK=zab exitPREFIX=:§ exitMSG=goodbye USERIDS_CLEAR=set§to:§[4],§[me] § : 
 log 1 $ users:5 cleared
 
 # check re-join of user kept visible in other channel
@@ -183,15 +181,14 @@ insert cmd-nick : + NUH=myself!~baz@baz.bar.foo USER_ID=me NEWNICK :foo
 insert servermsglogged : + MSG ::baz!~baz@baz.baz QUIT :Client Quit
 log 1 $ users:2:exit_msg set to: [QClient Quit]
 log , $ baz!~baz@baz.baz quits: Client Quit
-insert quit 1: + CHAN_WIN_ID=3 CHANNEL=#ch_test0 USER_ID=2 NICK=baz REMAINING_IDS :[4], [6], [me]
+insert quit : + CHAN_WIN_ID=3 CHANNEL=#ch_test0 USER_ID=2 NICK=baz REMAINING_IDS :[4], [6], [me]
 insert quit : + CHAN_WIN_ID=4 CHANNEL=#ch_test1 USER_ID=2 NICK=baz REMAINING_IDS :[me]
 log 1 $ users:2 cleared
 
 # check effects of own QUIT while present in one channel
-insert part-0 : + CHANNEL :#ch_test1
-insert part-1 1: + CHAN_WIN_ID=4 USERIDS_CLEAR=cleared CHANNEL :#ch_test1
+insert part : + CHAN_WIN_ID=4 USERIDS_CLEAR=emptied CHANNEL :#ch_test1
 insert cmd-disconnect-0
-insert quit 1: + CHAN_WIN_ID=3 CHANNEL=#ch_test0 USER_ID=me NICK=foo foo@foo.foo=baz@baz.bar.foo REMAINING_IDS :[4], [6]
+insert quit : + CHAN_WIN_ID=3 CHANNEL=#ch_test0 USER_ID=me NICK=foo foo@foo.foo=baz@baz.bar.foo REMAINING_IDS :[4], [6]
 insert cmd-disconnect-1 :-1
 insert disconnect1 : + WIN_IDS :2,3,4
 
index dc3ae36de661b156e2a930bc1a54cde41a77eb73..680317b8149006cf59c1cad4253cc6a8c23a0fa7 100644 (file)
@@ -12,9 +12,9 @@ log 2 $ - no password
 > /connect foo.bar.baz:6697 foo bar:baz
 insert isupport-clear : +1
 log 1 $ caps cleared
-log 1 $ users cleared
 log 1 $ channels cleared
 log , $ DISCONNECTED
+log 1 $ users cleared
 log 1 $ hostname set to: [foo.bar.baz]
 log 1 $ port set to: [6697]
 log 1 $ nick_wanted set to: [foo]
index 7f4a662fb9b7460c331e1c2587f9240938a16ca6..9464cee064b0440df307c2dce0b233a6d688f7df 100644 (file)
@@ -1,7 +1,6 @@
 insert ./lib/servermsglogged
 
 × exit-channel
-log 1 $ channels:CHANNEL:exits cleared
 log 1 $ channels:CHANNEL:exits:USER_ID set to: [exitTYPEexitMSG]
 log 1 $ channels:CHANNEL:user_ids USERIDS_CLEAR
 log CHAN_WIN_ID $ NICK!~NICK@NICK.NICK exitDESCexitPREFIXexitMSG
@@ -10,19 +9,14 @@ log 1 $ channels:CHANNEL:exits:USER_ID cleared
 × parts-core
 insert exit-channel : + exitTYPE=P exitDESC :parts
 
-× part-0
+× part-1
+× part
 > /part
 log 1 > PART :CHANNEL
 insert servermsglogged : + MSG ::foo!~baz@baz.bar.foo PART :CHANNEL
-
-× part-1
 insert parts-core : + exitPREFIX= exitMSG= USER_ID=me NICK=foo foo@foo.foo :baz@baz.bar.foo
 log 1 $ channels:CHANNEL cleared
 
-× part
-insert part-0
-insert part-1
-
 × quits
 insert exit-channel : + exitTYPE=Q exitDESC=quits exitPREFIX=:§ exitMSG=Client§Quit § : 
 
index 5607e9bf6a91959548bd126a20b5091be1b20f10..a029efe5602d4255e2a2f04b3d90d42df830ece6 100644 (file)
@@ -13,7 +13,7 @@ insert ./lib/join-empty
 # for: join-channel-0, join-channel-1
 insert ./lib/no-handler
 insert ./lib/part
-# for: part-0, part-1, quit, quits
+# for: part, quit, quits
 insert ./lib/pingpong
 insert ./lib/privmsg
 insert ./lib/req-sasl
@@ -154,8 +154,7 @@ log 1 $ users:2 cleared
 
 # handle self-PART: clear channel, and its squatters
 > /window 4
-insert part-0 : + CHANNEL :#test
-insert part-1 1: + CHAN_WIN_ID=4 CHANNEL=#test USERIDS_CLEAR :set to: [1]
+insert part : + CHAN_WIN_ID=4 CHANNEL=#test USERIDS_CLEAR :set to: [1]
 log 1 $ users:1 cleared
 
 # handle lack of implementation
@@ -164,7 +163,7 @@ insert no-handler : +0 ALERT_WIN_IDS=2,3,4,5,6,7 ? :foo bar baz
 # handle /disconnect, clear all
 insert cmd-disconnect-0 :-1
 log 3,6,7 $ foo!~baz@baz.bar.foo quits: Client Quit
-insert quits 1: + CHAN_WIN_ID=5 CHANNEL=#testtest USER_ID=me NICK=foo foo@foo.foo=baz@baz.bar.foo USERIDS_CLEAR :cleared
+insert quits : + CHAN_WIN_ID=5 CHANNEL=#testtest USER_ID=me NICK=foo foo@foo.foo=baz@baz.bar.foo USERIDS_CLEAR :cleared
 insert cmd-disconnect-1 : +0
 insert disconnect1 :-1 +1 WIN_IDS :2,3,4,5,6,7
 log 1 $ motd cleared
index 1a34b3ff39e3d792d31e698bc54ea60b78d03d69..618857e25bed760f0c0041099117a3ce3fbe4d3a 100644 (file)
@@ -129,8 +129,8 @@ insert line-server-log : +2 ? :isupport:CHANTYPES set to: [#&]
 insert line-server-log : +3 ? :isupport:PREFIX set to: [(ov)@+]
 insert line-server-log : +4 ? :isupport:USERLEN set to: [10]
 insert line-server-log : +5 ? :caps cleared
-insert line-server-log : +6 ? :users cleared
-insert line-server-log : +7 ? :channels cleared
+insert line-server-log : +6 ? :channels cleared
+insert line-server-log : +7 ? :users cleared
 insert line-server-log : +8 ? :hostname set to: [foo.bar.baz]
 insert line-server-log : +9 ? :port set to: [6697]
 insert line-server-log : +10 ? :nick_wanted set to: [foo]