home · contact · privacy
Some Completables refactoring.
authorChristian Heller <c.heller@plomlompom.de>
Thu, 4 Sep 2025 01:53:24 +0000 (03:53 +0200)
committerChristian Heller <c.heller@plomlompom.de>
Thu, 4 Sep 2025 01:53:24 +0000 (03:53 +0200)
ircplom/client.py

index 67d3edef598dc601bf8e7bdc101e68db4a8b6046..86c765f0facdc26bb43b16e73b4a72d937f2bb0e 100644 (file)
@@ -96,7 +96,14 @@ class _Dict(Dict[DictItem]):
         return toks[0], '' if len(toks) == 1 else toks[1]
 
 
-class _CompletableStringsList:
+class _Completable(ABC):
+
+    @abstractmethod
+    def complete(self) -> None:
+        'Set .completed to "complete" value if possible of current state.'
+
+
+class _CompletableStringsList(_Completable):
 
     def __init__(self) -> None:
         self._incomplete: list[str] = []
@@ -116,7 +123,6 @@ class _CompletableStringsList:
         self._on_list('remove', value, complete)
 
     def complete(self) -> None:
-        'Declare list done.'
         self.completed = tuple(self._incomplete)
 
     def clear(self) -> None:
@@ -139,7 +145,7 @@ class _UpdatingMixin(AutoAttrMixin):
             return None
         if isinstance(self, _CompletableStringsList):
             return self.completed
-        if isinstance(self, _Topic):
+        if isinstance(self, _CompletableTopic):
             return Topic(*self.completed)
         for cls in [cls for cls in self.__class__.__mro__
                     if AutoAttrMixin not in cls.__mro__]:
@@ -215,13 +221,18 @@ class _UpdatingDict(_UpdatingMixin, _Dict[DictItem]):
         self._on_update()
 
 
-class _UpdatingCompletableStringsList(_UpdatingMixin, _CompletableStringsList):
+class _UpdatingCompletable(_UpdatingMixin, _Completable):
 
     def complete(self) -> None:
-        super().complete()
+        super().complete()  # type: ignore
         self._on_update()
 
 
+class _UpdatingCompletableStringsList(_UpdatingCompletable,
+                                      _CompletableStringsList):
+    pass
+
+
 @dataclass
 class IrcConnSetup:
     'All we need to know to set up a new Client connection.'
@@ -312,7 +323,7 @@ class Topic(NamedTuple):
     who: Optional[NickUserHost] = None
 
 
-class _Topic:
+class _CompletableTopic(_Completable):
     _what: str = ''
     _who: Optional[NickUserHost] = None
 
@@ -339,14 +350,13 @@ class _Topic:
         self._who = NickUserHost(copy.nick, copy.user, copy.host)
 
     def complete(self) -> None:
-        'Declare data collection finished, return full or empty content.'
         self.completed = (('', None) if self._who is None
                           else (self._what, self._who))
 
 
 class _Channel:
     user_ids: _CompletableStringsList
-    topic: _Topic
+    topic: _CompletableTopic
 
     def __init__(self,
                  get_id_for_nick: Callable,
@@ -428,11 +438,8 @@ class _UpdatingServerCapability(_UpdatingMixin, ServerCapability):
     pass
 
 
-class _UpdatingTopic(_UpdatingMixin, _Topic):
-
-    def complete(self) -> None:
-        super().complete()
-        self._on_update()
+class _UpdatingTopic(_UpdatingCompletable, _CompletableTopic):
+    pass
 
 
 class _UpdatingChannel(_UpdatingMixin, _Channel):