diff sat_frontends/quick_frontend/quick_widgets.py @ 4037:524856bd7b19

massive refactoring to switch from camelCase to snake_case: historically, Libervia (SàT before) was using camelCase as allowed by PEP8 when using a pre-PEP8 code, to use the same coding style as in Twisted. However, snake_case is more readable and it's better to follow PEP8 best practices, so it has been decided to move on full snake_case. Because Libervia has a huge codebase, this ended with a ugly mix of camelCase and snake_case. To fix that, this patch does a big refactoring by renaming every function and method (including bridge) that are not coming from Twisted or Wokkel, to use fully snake_case. This is a massive change, and may result in some bugs.
author Goffi <goffi@goffi.org>
date Sat, 08 Apr 2023 13:54:42 +0200
parents be6d91572633
children 4b842c1fb686
line wrap: on
line diff
--- a/sat_frontends/quick_frontend/quick_widgets.py	Fri Apr 07 15:18:39 2023 +0200
+++ b/sat_frontends/quick_frontend/quick_widgets.py	Sat Apr 08 13:54:42 2023 +0200
@@ -68,7 +68,7 @@
                 for widget in widget_instances:
                     yield widget
 
-    def getRealClass(self, class_):
+    def get_real_class(self, class_):
         """Return class registered for given class_
 
         @param class_: subclass of QuickWidget
@@ -86,20 +86,20 @@
             )
         return cls
 
-    def getWidgetInstances(self, widget):
+    def get_widget_instances(self, widget):
         """Get all instance of a widget
 
-        This is a helper method which call getWidgets
+        This is a helper method which call get_widgets
         @param widget(QuickWidget): retrieve instances of this widget
         @return: iterator on widgets
         """
-        return self.getWidgets(widget.__class__, widget.target, widget.profiles)
+        return self.get_widgets(widget.__class__, widget.target, widget.profiles)
 
-    def getWidgets(self, class_, target=None, profiles=None, with_duplicates=True):
+    def get_widgets(self, class_, target=None, profiles=None, with_duplicates=True):
         """Get all subclassed widgets instances
 
         @param class_: subclass of QuickWidget, same parameter as used in
-            [getOrCreateWidget]
+            [get_or_create_widget]
         @param target: if not None, construct a hash with this target and filter
             corresponding widgets
             recreated widgets are handled
@@ -109,14 +109,14 @@
             returned
         @return: iterator on widgets
         """
-        class_ = self.getRealClass(class_)
+        class_ = self.get_real_class(class_)
         try:
             widgets_map = self._widgets[class_.__name__]
         except KeyError:
             return
         else:
             if target is not None:
-                filter_hash = str(class_.getWidgetHash(target, profiles))
+                filter_hash = str(class_.get_widget_hash(target, profiles))
             else:
                 filter_hash = None
             if filter_hash is not None:
@@ -133,11 +133,11 @@
                             # we only return the first widget of the list
                             break
 
-    def getWidget(self, class_, target=None, profiles=None):
+    def get_widget(self, class_, target=None, profiles=None):
         """Get a widget without creating it if it doesn't exist.
 
         if several instances of widgets with this hash exist, the first one is returned
-        @param class_: subclass of QuickWidget, same parameter as used in [getOrCreateWidget]
+        @param class_: subclass of QuickWidget, same parameter as used in [get_or_create_widget]
         @param target: target depending of the widget, usually a JID instance
         @param profiles (unicode, iterable[unicode], None): profile(s) to use (may or may not be
             used, depending of the widget class)
@@ -146,17 +146,17 @@
         assert (target is not None) or (profiles is not None)
         if profiles is not None and isinstance(profiles, str):
             profiles = [profiles]
-        class_ = self.getRealClass(class_)
-        hash_ = class_.getWidgetHash(target, profiles)
+        class_ = self.get_real_class(class_)
+        hash_ = class_.get_widget_hash(target, profiles)
         try:
             return self._widgets[class_.__name__][hash_][0]
         except KeyError:
             return None
 
-    def getOrCreateWidget(self, class_, target, *args, **kwargs):
+    def get_or_create_widget(self, class_, target, *args, **kwargs):
         """Get an existing widget or create a new one when necessary
 
-        If the widget is new, self.host.newWidget will be called with it.
+        If the widget is new, self.host.new_widget will be called with it.
         @param class_(class): class of the widget to create
         @param target: target depending of the widget, usually a JID instance
         @param args(list): optional args to create a new instance of class_
@@ -164,22 +164,22 @@
             if 'profile' key is present, it will be popped and put in 'profiles'
             if there is neither 'profile' nor 'profiles', None will be used for 'profiles'
             if 'on_new_widget' is present it can have the following values:
-                C.WIDGET_NEW [default]: self.host.newWidget will be called on widget creation
-                [callable]: this method will be called instead of self.host.newWidget
+                C.WIDGET_NEW [default]: self.host.new_widget will be called on widget creation
+                [callable]: this method will be called instead of self.host.new_widget
                 None: do nothing
             if 'on_existing_widget' is present it can have the following values:
                 C.WIDGET_KEEP  [default]: return the existing widget
                 C.WIDGET_RAISE: raise WidgetAlreadyExistsError
                 C.WIDGET_RECREATE: create a new widget
-                    if the existing widget has a "recreateArgs" method, it will be called with args list and kwargs dict
+                    if the existing widget has a "recreate_args" method, it will be called with args list and kwargs dict
                     so the values can be completed to create correctly the new instance
                 [callable]: this method will be called with existing widget as argument, the widget to use must be returned
-            if 'force_hash' is present, the hash given in value will be used instead of the one returned by class_.getWidgetHash
+            if 'force_hash' is present, the hash given in value will be used instead of the one returned by class_.get_widget_hash
             other keys will be used to instanciate class_ if the case happen (e.g. if type_ is present and class_ is a QuickChat subclass,
                 it will be used to create a new QuickChat instance).
         @return: a class_ instance, either new or already existing
         """
-        cls = self.getRealClass(class_)
+        cls = self.get_real_class(class_)
 
         ## arguments management ##
         _args = [self.host, target] + list(
@@ -212,7 +212,7 @@
         try:
             hash_ = _kwargs.pop("force_hash")
         except KeyError:
-            hash_ = cls.getWidgetHash(target, _kwargs["profiles"])
+            hash_ = cls.get_widget_hash(target, _kwargs["profiles"])
 
         ## widget creation or retrieval ##
 
@@ -227,17 +227,17 @@
             except KeyError:
                 widget = None
             else:
-                widget.addTarget(target)
+                widget.add_target(target)
 
         if widget is None:
             # we need to create a new widget
             log.debug(f"Creating new widget for target {target} {cls}")
             widget = cls(*_args, **_kwargs)
             widgets_map.setdefault(hash_, []).append(widget)
-            self.host.callListeners("widgetNew", widget)
+            self.host.call_listeners("widgetNew", widget)
 
             if on_new_widget == C.WIDGET_NEW:
-                self.host.newWidget(widget)
+                self.host.new_widget(widget)
             elif callable(on_new_widget):
                 on_new_widget(widget)
             else:
@@ -250,11 +250,11 @@
                 raise WidgetAlreadyExistsError(hash_)
             elif on_existing_widget == C.WIDGET_RECREATE:
                 try:
-                    recreateArgs = widget.recreateArgs
+                    recreate_args = widget.recreate_args
                 except AttributeError:
                     pass
                 else:
-                    recreateArgs(_args, _kwargs)
+                    recreate_args(_args, _kwargs)
                 widget = cls(*_args, **_kwargs)
                 widgets_map[hash_].append(widget)
                 log.debug("widget <{wid}> already exists, a new one has been recreated"
@@ -274,22 +274,22 @@
 
         return widget
 
-    def deleteWidget(self, widget_to_delete, *args, **kwargs):
+    def delete_widget(self, widget_to_delete, *args, **kwargs):
         """Delete a widget instance
 
         this method must be called by frontends when a widget is deleted
-        widget's onDelete method will be called before deletion, and deletion will be
+        widget's on_delete method will be called before deletion, and deletion will be
         stopped if it returns False.
         @param widget_to_delete(QuickWidget): widget which need to deleted
-        @param *args: extra arguments to pass to onDelete
-        @param *kwargs: extra keywords arguments to pass to onDelete
+        @param *args: extra arguments to pass to on_delete
+        @param *kwargs: extra keywords arguments to pass to on_delete
             the extra arguments are not used by QuickFrontend, it's is up to
             the frontend to use them or not.
             following extra arguments are well known:
                 - "all_instances" can be used as kwarg, if it evaluate to True,
-                  all instances of the widget will be deleted (if onDelete is
+                  all instances of the widget will be deleted (if on_delete is
                   not returning False for any of the instance). This arguments
-                  is not sent to onDelete methods.
+                  is not sent to on_delete methods.
                 - "explicit_close" is used when the deletion is requested by
                   the user or a leave signal, "all_instances" is usually set at
                   the same time.
@@ -299,26 +299,26 @@
         all_instances = kwargs.get('all_instances', False)
 
         if all_instances:
-            for w in self.getWidgetInstances(widget_to_delete):
-                if w.onDelete(**kwargs) == False:
+            for w in self.get_widget_instances(widget_to_delete):
+                if w.on_delete(**kwargs) == False:
                     log.debug(
                         f"Deletion of {widget_to_delete} cancelled by widget itself")
                     return
         else:
-            if widget_to_delete.onDelete(**kwargs) == False:
+            if widget_to_delete.on_delete(**kwargs) == False:
                 log.debug(f"Deletion of {widget_to_delete} cancelled by widget itself")
                 return
 
         if self.host.selected_widget == widget_to_delete:
             self.host.selected_widget = None
 
-        class_ = self.getRealClass(widget_to_delete.__class__)
+        class_ = self.get_real_class(widget_to_delete.__class__)
         try:
             widgets_map = self._widgets[class_.__name__]
         except KeyError:
             log.error("no widgets_map found for class {cls}".format(cls=class_))
             return
-        widget_hash = str(class_.getWidgetHash(widget_to_delete.target,
+        widget_hash = str(class_.get_widget_hash(widget_to_delete.target,
                                                    widget_to_delete.profiles))
         try:
             widget_instances = widgets_map[widget_hash]
@@ -342,7 +342,7 @@
             del widgets_map[widget_hash]
             log.debug("All instances of {cls} with hash {widget_hash!r} have been deleted"
                 .format(cls=class_, widget_hash=widget_hash))
-            self.host.callListeners("widgetDeleted", widget_to_delete)
+            self.host.call_listeners("widgetDeleted", widget_to_delete)
 
 
 class QuickWidget(object):
@@ -368,17 +368,17 @@
         """
         self.host = host
         self.targets = set()
-        self.addTarget(target)
+        self.add_target(target)
         self.profiles = set()
         self._sync = True
         if isinstance(profiles, str):
-            self.addProfile(profiles)
+            self.add_profile(profiles)
         elif profiles is None:
             if not self.PROFILES_ALLOW_NONE:
                 raise ValueError("profiles can't have a value of None")
         else:
             for profile in profiles:
-                self.addProfile(profile)
+                self.add_profile(profile)
             if not self.profiles:
                 raise ValueError("no profile found, use None for no profile classes")
 
@@ -402,7 +402,7 @@
     @property
     def widget_hash(self):
         """Return quick widget hash"""
-        return self.getWidgetHash(self.target, self.profiles)
+        return self.get_widget_hash(self.target, self.profiles)
 
     # synchronisation state
 
@@ -429,14 +429,14 @@
 
     # target/profile
 
-    def addTarget(self, target):
+    def add_target(self, target):
         """Add a target if it doesn't already exists
 
         @param target: target to add
         """
         self.targets.add(target)
 
-    def addProfile(self, profile):
+    def add_profile(self, profile):
         """Add a profile is if doesn't already exists
 
         @param profile: profile to add
@@ -448,7 +448,7 @@
     # widget identitication
 
     @staticmethod
-    def getWidgetHash(target, profiles):
+    def get_widget_hash(target, profiles):
         """Return the hash associated with this target for this widget class
 
         some widget classes can manage several target on the same instance
@@ -465,7 +465,7 @@
 
     # widget life events
 
-    def onDelete(self, *args, **kwargs):
+    def on_delete(self, *args, **kwargs):
         """Called when a widget is being deleted
 
         @return (boot, None): False to cancel deletion
@@ -473,6 +473,6 @@
         """
         return True
 
-    def onSelected(self):
+    def on_selected(self):
         """Called when host.selected_widget is this instance"""
         pass