diff sat/plugins/plugin_xep_0050.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 6c93a18b6250
children
line wrap: on
line diff
--- a/sat/plugins/plugin_xep_0050.py	Fri Apr 07 15:18:39 2023 +0200
+++ b/sat/plugins/plugin_xep_0050.py	Sat Apr 08 13:54:42 2023 +0200
@@ -102,18 +102,18 @@
     def getName(self, xml_lang=None):
         return self.label
 
-    def isAuthorised(self, requestor):
+    def is_authorised(self, requestor):
         if "@ALL@" in self.allowed_magics:
             return True
         forbidden = set(self.forbidden_jids)
         for group in self.forbidden_groups:
-            forbidden.update(self.client.roster.getJidsFromGroup(group))
+            forbidden.update(self.client.roster.get_jids_from_group(group))
         if requestor.userhostJID() in forbidden:
             return False
         allowed = set(self.allowed_jids)
         for group in self.allowed_groups:
             try:
-                allowed.update(self.client.roster.getJidsFromGroup(group))
+                allowed.update(self.client.roster.get_jids_from_group(group))
             except exceptions.UnknownGroupError:
                 log.warning(_("The groups [{group}] is unknown for profile [{profile}])")
                             .format(group=group, profile=self.client.profile))
@@ -194,7 +194,7 @@
         self.client.send(iq_elt)
         del self.sessions[session_id]
 
-    def _requestEb(self, failure_, request, session_id):
+    def _request_eb(self, failure_, request, session_id):
         if failure_.check(AdHocError):
             error_constant = failure_.value.callback_error
         else:
@@ -203,8 +203,8 @@
 
         self._sendError(error_constant, session_id, request)
 
-    def onRequest(self, command_elt, requestor, action, session_id):
-        if not self.isAuthorised(requestor):
+    def on_request(self, command_elt, requestor, action, session_id):
+        if not self.is_authorised(requestor):
             return self._sendError(
                 XEP_0050.ERROR.FORBIDDEN, session_id, command_elt.parent
             )
@@ -220,12 +220,12 @@
                     XEP_0050.ERROR.FORBIDDEN, session_id, command_elt.parent
                 )
         else:
-            session_id, session_data = self.sessions.newSession()
+            session_id, session_data = self.sessions.new_session()
             session_data["requestor"] = requestor
         if action == XEP_0050.ACTION.CANCEL:
             d = defer.succeed((None, XEP_0050.STATUS.CANCELED, None, None))
         else:
-            d = utils.asDeferred(
+            d = utils.as_deferred(
                 self.callback,
                 self.client,
                 command_elt,
@@ -234,7 +234,7 @@
                 self.node,
             )
         d.addCallback(self._sendAnswer, session_id, command_elt.parent)
-        d.addErrback(self._requestEb, command_elt.parent, session_id)
+        d.addErrback(self._request_eb, command_elt.parent, session_id)
 
 
 class XEP_0050(object):
@@ -276,49 +276,49 @@
         log.info(_("plugin XEP-0050 initialization"))
         self.host = host
         self.requesting = Sessions()
-        host.bridge.addMethod(
-            "adHocRun",
+        host.bridge.add_method(
+            "ad_hoc_run",
             ".plugin",
             in_sign="sss",
             out_sign="s",
             method=self._run,
             async_=True,
         )
-        host.bridge.addMethod(
-            "adHocList",
+        host.bridge.add_method(
+            "ad_hoc_list",
             ".plugin",
             in_sign="ss",
             out_sign="s",
-            method=self._listUI,
+            method=self._list_ui,
             async_=True,
         )
-        host.bridge.addMethod(
-            "adHocSequence",
+        host.bridge.add_method(
+            "ad_hoc_sequence",
             ".plugin",
             in_sign="ssss",
             out_sign="s",
             method=self._sequence,
             async_=True,
         )
-        self.__requesting_id = host.registerCallback(
-            self._requestingEntity, with_data=True
+        self.__requesting_id = host.register_callback(
+            self._requesting_entity, with_data=True
         )
-        host.importMenu(
+        host.import_menu(
             (D_("Service"), D_("Commands")),
-            self._commandsMenu,
+            self._commands_menu,
             security_limit=2,
             help_string=D_("Execute ad-hoc commands"),
         )
-        host.registerNamespace('commands', NS_COMMANDS)
+        host.register_namespace('commands', NS_COMMANDS)
 
-    def getHandler(self, client):
+    def get_handler(self, client):
         return XEP_0050_handler(self)
 
-    def profileConnected(self, client):
+    def profile_connected(self, client):
         # map from node to AdHocCommand instance
         client._XEP_0050_commands = {}
         if not client.is_component:
-            self.addAdHocCommand(client, self._statusCallback, _("Status"))
+            self.add_ad_hoc_command(client, self._status_callback, _("Status"))
 
     def do(self, client, entity, node, action=ACTION.EXECUTE, session_id=None,
            form_values=None, timeout=30):
@@ -349,20 +349,20 @@
         d = iq_elt.send()
         return d
 
-    def getCommandElt(self, iq_elt):
+    def get_command_elt(self, iq_elt):
         try:
             return next(iq_elt.elements(NS_COMMANDS, "command"))
         except StopIteration:
             raise exceptions.NotFound(_("Missing command element"))
 
-    def adHocError(self, error_type):
+    def ad_hoc_error(self, error_type):
         """Shortcut to raise an AdHocError
 
         @param error_type(unicode): one of XEP_0050.ERROR
         """
         raise AdHocError(error_type)
 
-    def _items2XMLUI(self, items, no_instructions):
+    def _items_2_xmlui(self, items, no_instructions):
         """Convert discovery items to XMLUI dialog """
         # TODO: manage items on different jids
         form_ui = xml_tools.XMLUI("form", submit_id=self.__requesting_id)
@@ -374,7 +374,7 @@
         form_ui.addList("node", options)
         return form_ui
 
-    def _getDataLvl(self, type_):
+    def _get_data_lvl(self, type_):
         """Return the constant corresponding to <note/> type attribute value
 
         @param type_: note type (see XEP-0050 §4.3)
@@ -389,7 +389,7 @@
                 log.warning(_("Invalid note type [%s], using info") % type_)
             return C.XMLUI_DATA_LVL_INFO
 
-    def _mergeNotes(self, notes):
+    def _merge_notes(self, notes):
         """Merge notes with level prefix (e.g. "ERROR: the message")
 
         @param notes (list): list of tuple (level, message)
@@ -402,8 +402,8 @@
         }
         return ["%s%s" % (lvl_map[lvl], msg) for lvl, msg in notes]
 
-    def parseCommandAnswer(self, iq_elt):
-        command_elt = self.getCommandElt(iq_elt)
+    def parse_command_answer(self, iq_elt):
+        command_elt = self.get_command_elt(iq_elt)
         data = {}
         data["status"] = command_elt.getAttribute("status", XEP_0050.STATUS.EXECUTING)
         data["session_id"] = command_elt.getAttribute("sessionid")
@@ -411,7 +411,7 @@
         for note_elt in command_elt.elements(NS_COMMANDS, "note"):
             notes.append(
                 (
-                    self._getDataLvl(note_elt.getAttribute("type", "info")),
+                    self._get_data_lvl(note_elt.getAttribute("type", "info")),
                     str(note_elt),
                 )
             )
@@ -419,14 +419,14 @@
         return command_elt, data
 
 
-    def _commandsAnswer2XMLUI(self, iq_elt, session_id, session_data):
+    def _commands_answer_2_xmlui(self, iq_elt, session_id, session_data):
         """Convert command answer to an ui for frontend
 
         @param iq_elt: command result
         @param session_id: id of the session used with the frontend
         @param profile_key: %(doc_profile_key)s
         """
-        command_elt, answer_data = self.parseCommandAnswer(iq_elt)
+        command_elt, answer_data = self.parse_command_answer(iq_elt)
         status = answer_data["status"]
         if status in [XEP_0050.STATUS.COMPLETED, XEP_0050.STATUS.CANCELED]:
             # the command session is finished, we purge our session
@@ -468,68 +468,68 @@
                 C.XMLUI_DIALOG,
                 dialog_opt={
                     C.XMLUI_DATA_TYPE: C.XMLUI_DIALOG_NOTE,
-                    C.XMLUI_DATA_MESS: "\n".join(self._mergeNotes(notes)),
+                    C.XMLUI_DATA_MESS: "\n".join(self._merge_notes(notes)),
                     C.XMLUI_DATA_LVL: dlg_level,
                 },
                 session_id=session_id,
             )
 
         if session_id is None:
-            xmlui = xml_tools.dataFormEltResult2XMLUI(data_elt)
+            xmlui = xml_tools.data_form_elt_result_2_xmlui(data_elt)
             if notes:
                 for level, note in notes:
                     if level != "info":
                         note = f"[{level}] {note}"
-                    xmlui.addWidget("text", note)
+                    xmlui.add_widget("text", note)
             return xmlui
 
         form = data_form.Form.fromElement(data_elt)
         # we add any present note to the instructions
-        form.instructions.extend(self._mergeNotes(notes))
-        return xml_tools.dataForm2XMLUI(form, self.__requesting_id, session_id=session_id)
+        form.instructions.extend(self._merge_notes(notes))
+        return xml_tools.data_form_2_xmlui(form, self.__requesting_id, session_id=session_id)
 
-    def _requestingEntity(self, data, profile):
+    def _requesting_entity(self, data, profile):
         def serialise(ret_data):
             if "xmlui" in ret_data:
                 ret_data["xmlui"] = ret_data["xmlui"].toXml()
             return ret_data
 
-        d = self.requestingEntity(data, profile)
+        d = self.requesting_entity(data, profile)
         d.addCallback(serialise)
         return d
 
-    def requestingEntity(self, data, profile):
+    def requesting_entity(self, data, profile):
         """Request and entity and create XMLUI accordingly.
 
         @param data: data returned by previous XMLUI (first one must come from
-                     self._commandsMenu)
+                     self._commands_menu)
         @param profile: %(doc_profile)s
         @return: callback dict result (with "xmlui" corresponding to the answering
                  dialog, or empty if it's finished without error)
         """
         if C.bool(data.get("cancelled", C.BOOL_FALSE)):
             return defer.succeed({})
-        data_form_values = xml_tools.XMLUIResult2DataFormResult(data)
-        client = self.host.getClient(profile)
+        data_form_values = xml_tools.xmlui_result_2_data_form_result(data)
+        client = self.host.get_client(profile)
         # TODO: cancel, prev and next are not managed
         # TODO: managed answerer errors
         # TODO: manage nodes with a non data form payload
         if "session_id" not in data:
             # we just had the jid, we now request it for the available commands
-            session_id, session_data = self.requesting.newSession(profile=client.profile)
+            session_id, session_data = self.requesting.new_session(profile=client.profile)
             entity = jid.JID(data[xml_tools.SAT_FORM_PREFIX + "jid"])
             session_data["jid"] = entity
-            d = self.listUI(client, entity)
+            d = self.list_ui(client, entity)
 
-            def sendItems(xmlui):
+            def send_items(xmlui):
                 xmlui.session_id = session_id  # we need to keep track of the session
                 return {"xmlui": xmlui}
 
-            d.addCallback(sendItems)
+            d.addCallback(send_items)
         else:
             # we have started a several forms sessions
             try:
-                session_data = self.requesting.profileGet(
+                session_data = self.requesting.profile_get(
                     data["session_id"], client.profile
                 )
             except KeyError:
@@ -552,24 +552,24 @@
             # we request execute node's command
             d = self.do(client, entity, session_data["node"], action=XEP_0050.ACTION.EXECUTE,
                         session_id=remote_id, form_values=data_form_values)
-            d.addCallback(self._commandsAnswer2XMLUI, session_id, session_data)
+            d.addCallback(self._commands_answer_2_xmlui, session_id, session_data)
             d.addCallback(lambda xmlui: {"xmlui": xmlui} if xmlui is not None else {})
 
         return d
 
-    def _commandsMenu(self, menu_data, profile):
+    def _commands_menu(self, menu_data, profile):
         """First XMLUI activated by menu: ask for target jid
 
         @param profile: %(doc_profile)s
         """
         form_ui = xml_tools.XMLUI("form", submit_id=self.__requesting_id)
         form_ui.addText(_("Please enter target jid"), "instructions")
-        form_ui.changeContainer("pairs")
+        form_ui.change_container("pairs")
         form_ui.addLabel("jid")
-        form_ui.addString("jid", value=self.host.getClient(profile).jid.host)
+        form_ui.addString("jid", value=self.host.get_client(profile).jid.host)
         return {"xmlui": form_ui.toXml()}
 
-    def _statusCallback(self, client, command_elt, session_data, action, node):
+    def _status_callback(self, client, command_elt, session_data, action, node):
         """Ad-hoc command used to change the "show" part of status"""
         actions = session_data.setdefault("actions", [])
         actions.append(action)
@@ -596,25 +596,25 @@
                 answer_form = data_form.Form.fromElement(x_elt)
                 show = answer_form["show"]
             except (KeyError, StopIteration):
-                self.adHocError(XEP_0050.ERROR.BAD_PAYLOAD)
+                self.ad_hoc_error(XEP_0050.ERROR.BAD_PAYLOAD)
             if show not in SHOWS:
-                self.adHocError(XEP_0050.ERROR.BAD_PAYLOAD)
+                self.ad_hoc_error(XEP_0050.ERROR.BAD_PAYLOAD)
             if show == "disconnect":
                 self.host.disconnect(client.profile)
             else:
-                self.host.setPresence(show=show, profile_key=client.profile)
+                self.host.presence_set(show=show, profile_key=client.profile)
 
             # job done, we can end the session
             status = XEP_0050.STATUS.COMPLETED
             payload = None
             note = (self.NOTE.INFO, _("Status updated"))
         else:
-            self.adHocError(XEP_0050.ERROR.INTERNAL)
+            self.ad_hoc_error(XEP_0050.ERROR.INTERNAL)
 
         return (payload, status, None, note)
 
     def _run(self, service_jid_s="", node="", profile_key=C.PROF_KEY_NONE):
-        client = self.host.getClient(profile_key)
+        client = self.host.get_client(profile_key)
         service_jid = jid.JID(service_jid_s) if service_jid_s else None
         d = defer.ensureDeferred(self.run(client, service_jid, node or None))
         d.addCallback(lambda xmlui: xmlui.toXml())
@@ -631,13 +631,13 @@
         """
         if service_jid is None:
             service_jid = jid.JID(client.jid.host)
-        session_id, session_data = self.requesting.newSession(profile=client.profile)
+        session_id, session_data = self.requesting.new_session(profile=client.profile)
         session_data["jid"] = service_jid
         if node is None:
-            xmlui = await self.listUI(client, service_jid)
+            xmlui = await self.list_ui(client, service_jid)
         else:
             session_data["node"] = node
-            cb_data = await self.requestingEntity(
+            cb_data = await self.requesting_entity(
                 {"session_id": session_id}, client.profile
             )
             xmlui = cb_data["xmlui"]
@@ -655,14 +655,14 @@
         d = self.host.getDiscoItems(client, to_jid, NS_COMMANDS)
         return d
 
-    def _listUI(self, to_jid_s, profile_key):
-        client = self.host.getClient(profile_key)
+    def _list_ui(self, to_jid_s, profile_key):
+        client = self.host.get_client(profile_key)
         to_jid = jid.JID(to_jid_s) if to_jid_s else None
-        d = self.listUI(client, to_jid, no_instructions=True)
+        d = self.list_ui(client, to_jid, no_instructions=True)
         d.addCallback(lambda xmlui: xmlui.toXml())
         return d
 
-    def listUI(self, client, to_jid, no_instructions=False):
+    def list_ui(self, client, to_jid, no_instructions=False):
         """Request available commands and generate XMLUI
 
         @param to_jid(jid.JID, None): the entity answering the commands
@@ -671,12 +671,12 @@
         @return D(xml_tools.XMLUI): UI with the commands
         """
         d = self.list(client, to_jid)
-        d.addCallback(self._items2XMLUI, no_instructions)
+        d.addCallback(self._items_2_xmlui, no_instructions)
         return d
 
     def _sequence(self, sequence, node, service_jid_s="", profile_key=C.PROF_KEY_NONE):
         sequence = data_format.deserialise(sequence, type_check=list)
-        client = self.host.getClient(profile_key)
+        client = self.host.get_client(profile_key)
         service_jid = jid.JID(service_jid_s) if service_jid_s else None
         d = defer.ensureDeferred(self.sequence(client, sequence, node, service_jid))
         d.addCallback(lambda data: data_format.serialise(data))
@@ -711,12 +711,12 @@
                 session_id=session_id,
                 form_values=data_to_send,
             )
-            __, answer_data = self.parseCommandAnswer(iq_result_elt)
+            __, answer_data = self.parse_command_answer(iq_result_elt)
             session_id = answer_data.pop("session_id")
 
         return answer_data
 
-    def addAdHocCommand(self, client, callback, label, node=None, features=None,
+    def add_ad_hoc_command(self, client, callback, label, node=None, features=None,
                         timeout=600, allowed_jids=None, allowed_groups=None,
                         allowed_magics=None, forbidden_jids=None, forbidden_groups=None,
                         ):
@@ -782,7 +782,7 @@
         commands = client._XEP_0050_commands
         commands[node] = ad_hoc_command
 
-    def onCmdRequest(self, request, client):
+    def on_cmd_request(self, request, client):
         request.handled = True
         requestor = jid.JID(request["from"])
         command_elt = next(request.elements(NS_COMMANDS, "command"))
@@ -798,7 +798,7 @@
         except KeyError:
             client.sendError(request, "item-not-found")
             return
-        command.onRequest(command_elt, requestor, action, sessionid)
+        command.on_request(command_elt, requestor, action, sessionid)
 
 
 @implementer(iwokkel.IDisco)
@@ -813,7 +813,7 @@
 
     def connectionInitialized(self):
         self.xmlstream.addObserver(
-            CMD_REQUEST, self.plugin_parent.onCmdRequest, client=self.parent
+            CMD_REQUEST, self.plugin_parent.on_cmd_request, client=self.parent
         )
 
     def getDiscoInfo(self, requestor, target, nodeIdentifier=""):
@@ -828,7 +828,7 @@
         if nodeIdentifier == NS_COMMANDS:
             commands = self.client._XEP_0050_commands
             for command in list(commands.values()):
-                if command.isAuthorised(requestor):
+                if command.is_authorised(requestor):
                     ret.append(
                         disco.DiscoItem(self.parent.jid, command.node, command.getName())
                     )  # TODO: manage name language