diff sat/core/xmpp.py @ 2643:189e38fb11ff

core: style improvments (90 chars limit)
author Goffi <goffi@goffi.org>
date Sun, 29 Jul 2018 18:44:27 +0200
parents 56f94936df1e
children f2cf1daa42cb
line wrap: on
line diff
--- a/sat/core/xmpp.py	Sun Jul 08 18:38:32 2018 +0200
+++ b/sat/core/xmpp.py	Sun Jul 29 18:44:27 2018 +0200
@@ -54,9 +54,11 @@
         self.profile = profile
         self.host_app = host_app
         self.cache = cache.Cache(host_app, profile)
-        self._mess_id_uid = {}  # map from message id to uid used in history. Key: (full_jid,message_id) Value: uid
+        self._mess_id_uid = {}  # map from message id to uid used in history.
+                                # Key: (full_jid,message_id) Value: uid
         self.conn_deferred = defer.Deferred()
-        self._progress_cb = {}  # callback called when a progress is requested (key = progress id)
+        self._progress_cb = {}  # callback called when a progress is requested
+                                # (key = progress id)
         self.actions = {}  # used to keep track of actions for retrieval (key = action_id)
 
     ## initialisation ##
@@ -113,10 +115,12 @@
     @defer.inlineCallbacks
     def startConnection(cls, host, profile, max_retries):
         """instantiate the entity and start the connection"""
-        # FIXME: reconnection doesn't seems to be handled correclty (client is deleted then recreated from scrash
-        #        most of methods called here should be called once on first connection (e.g. adding subprotocols)
-        #        but client should not be deleted except if session is finished (independently of connection/deconnection
-        #
+        # FIXME: reconnection doesn't seems to be handled correclty
+        #        (client is deleted then recreated from scratch)
+        #        most of methods called here should be called once on first connection
+        #        (e.g. adding subprotocols)
+        #        but client should not be deleted except if session is finished
+        #        (independently of connection/deconnection)
         try:
             port = int(
                 host.memory.getParamA(
@@ -164,9 +168,10 @@
 
         yield defer.maybeDeferred(entity.entityConnected)
 
-        # Call profileConnected callback for all plugins, and print error message if any of them fails
+        # Call profileConnected callback for all plugins,
+        # and print error message if any of them fails
         conn_cb_list = []
-        for dummy, callback in plugin_conn_cb:
+        for __, callback in plugin_conn_cb:
             conn_cb_list.append(defer.maybeDeferred(callback, entity))
         list_d = defer.DeferredList(conn_cb_list)
 
@@ -193,7 +198,7 @@
         """Return a deferred which fire when the client is connected"""
         return self.conn_deferred
 
-    def _disconnectionCb(self, dummy):
+    def _disconnectionCb(self, __):
         self._connected = None
 
     def _disconnectionEb(self, failure_):
@@ -219,7 +224,7 @@
             self.profile, unicode(self.jid)
         )  # we send the signal to the clients
 
-    def _finish_connection(self, dummy):
+    def _finish_connection(self, __):
         self.conn_deferred.callback(None)
 
     def streamInitialized(self):
@@ -283,7 +288,7 @@
             )
 
     @defer.inlineCallbacks
-    def _cleanConnection(self, dummy):
+    def _cleanConnection(self, __):
         """method called on disconnection
 
         used to call profileDisconnected* triggers
@@ -380,17 +385,9 @@
         """
         raise NotImplementedError
 
-    def sendMessage(
-        self,
-        to_jid,
-        message,
-        subject=None,
-        mess_type="auto",
-        extra=None,
-        uid=None,
-        no_trigger=False,
-    ):
-        """Send a message to an entity
+    def sendMessage(self, to_jid, message, subject=None, mess_type="auto", extra=None,
+                    uid=None, no_trigger=False,):
+        r"""Send a message to an entity
 
         @param to_jid(jid.JID): destinee of the message
         @param message(dict): message body, key is the language (use '' when unknown)
@@ -470,21 +467,15 @@
             ):
                 return defer.succeed(None)
 
-        log.debug(
-            _(u"Sending message (type {type}, to {to})").format(
-                type=data["type"], to=to_jid.full()
-            )
-        )
+        log.debug(_(u"Sending message (type {type}, to {to})")
+                    .format(type=data["type"], to=to_jid.full()))
 
-        pre_xml_treatments.addCallback(lambda dummy: self.generateMessageXML(data))
+        pre_xml_treatments.addCallback(lambda __: self.generateMessageXML(data))
         pre_xml_treatments.chainDeferred(post_xml_treatments)
         post_xml_treatments.addCallback(self.sendMessageData)
         if send_only:
-            log.debug(
-                _(
-                    "Triggers, storage and echo have been inhibited by the 'send_only' parameter"
-                )
-            )
+            log.debug(_(u"Triggers, storage and echo have been inhibited by the "
+                        u"'send_only' parameter"))
         else:
             self.addPostXmlCallbacks(post_xml_treatments)
             post_xml_treatments.addErrback(self._cancelErrorTrap)
@@ -562,8 +553,10 @@
         self.started = time.time()
 
         # Currently, we use "client/pc/Salut à Toi", but as
-        # SàT is multi-frontends and can be used on mobile devices, as a bot, with a web frontend,
-        # etc., we should implement a way to dynamically update identities through the bridge
+        # SàT is multi-frontends and can be used on mobile devices, as a bot,
+        # with a web frontend,
+        # etc., we should implement a way to dynamically update identities through the
+        # bridge
         self.identities = [disco.DiscoIdentity(u"client", u"pc", C.APP_NAME)]
         if sys.platform == "android":
             # FIXME: temporary hack as SRV is not working on android
@@ -591,9 +584,8 @@
                 host_data = None
             if host_data is not None:
                 log.info(
-                    u"using {host}:{port} for host {host_ori} as requested in config".format(
-                        host_ori=user_jid.host, host=host, port=port
-                    )
+                    u"using {host}:{port} for host {host_ori} as requested in config"
+                    .format(host_ori=user_jid.host, host=host, port=port)
                 )
 
         wokkel_client.XMPPClient.__init__(
@@ -634,7 +626,8 @@
         #      (out of band transmission for instance).
         #      e2e should have a priority of 0 here, and out of band transmission
         #      a lower priority
-        #  FIXME: trigger not used yet, can be uncommented when e2e full stanza encryption is implemented
+        #  FIXME: trigger not used yet, can be uncommented when e2e full stanza
+        #         encryption is implemented
         #  if not self.host_app.trigger.point("send", self, obj):
         #      return
         super(SatXMPPClient, self).send(obj)
@@ -648,8 +641,10 @@
         @param mess_data(dict): message data as constructed by onMessage workflow
         @return (dict): mess_data (so it can be used in a deferred chain)
         """
-        # XXX: This is the last trigger before u"send" (last but one globally) for sending message.
-        #      This is intented for e2e encryption which doesn't do full stanza encryption (e.g. OTR)
+        # XXX: This is the last trigger before u"send" (last but one globally)
+        #      for sending message.
+        #      This is intented for e2e encryption which doesn't do full stanza
+        #      encryption (e.g. OTR)
         #      This trigger point can't cancel the method
         self.host_app.trigger.point("sendMessageData", self, mess_data)
         self.send(mess_data[u"xml"])
@@ -675,10 +670,10 @@
             profile=self.profile,
         )
 
-    def _finish_connection(self, dummy):
+    def _finish_connection(self, __):
         self.roster.requestRoster()
         self.presence.available()
-        super(SatXMPPClient, self)._finish_connection(dummy)
+        super(SatXMPPClient, self)._finish_connection(__)
 
 
 class SatXMPPComponent(SatXMPPEntity, component.Component):
@@ -696,7 +691,8 @@
     is_component = True
     sendHistory = (
         False
-    )  # XXX: set to True from entry plugin to keep messages in history for received messages
+    )  # XXX: set to True from entry plugin to keep messages in history for received
+       #      messages
 
     def __init__(
         self,
@@ -748,7 +744,8 @@
         @param required(bool): True if plugin is mandatory
             for recursive calls only, should not be modified by inital caller
         @raise InternalError: one of the plugin is not handling components
-        @raise KeyError: one plugin should be present in self.host_app.plugins but it is not
+        @raise KeyError: one plugin should be present in self.host_app.plugins but it
+                         is not
         """
         if C.PLUG_MODE_COMPONENT not in current._info[u"modes"]:
             if not required:
@@ -756,7 +753,8 @@
             else:
                 log.error(
                     _(
-                        u"Plugin {current_name} is needed for {entry_name}, but it doesn't handle component mode"
+                        u"Plugin {current_name} is needed for {entry_name}, "
+                        u"but it doesn't handle component mode"
                     ).format(
                         current_name=current._info[u"import_name"],
                         entry_name=self.entry_plugin._info[u"import_name"],
@@ -898,7 +896,7 @@
         else:
             return self.host.memory.addToHistory(client, data)
 
-    def bridgeSignal(self, dummy, client, data):
+    def bridgeSignal(self, __, client, data):
         try:
             data["extra"]["received_timestamp"] = data["received_timestamp"]
             data["extra"]["delay_sender"] = data["delay_sender"]
@@ -942,7 +940,8 @@
                 # if there is no presence subscription
                 # may change in the future
                 log.info(
-                    u"Removing contact {} from roster because there is no presence subscription".format(
+                    u"Removing contact {} from roster because there is no presence "
+                    u"subscription".format(
                         item.jid
                     )
                 )
@@ -959,7 +958,8 @@
         log.debug(u"registering item: {}".format(item.entity.full()))
         if item.entity.resource:
             log.warning(
-                u"Received a roster item with a resource, this is not common but not restricted by RFC 6121, this case may be not well tested."
+                u"Received a roster item with a resource, this is not common but not "
+                u"restricted by RFC 6121, this case may be not well tested."
             )
         if not item.subscriptionTo:
             if not item.subscriptionFrom:
@@ -1044,8 +1044,8 @@
                     del self._groups[group]
             except KeyError:
                 log.warning(
-                    u"there is no cache for the group [%(group)s] of the removed roster item [%(jid)s]"
-                    % {"group": group, "jid": entity}
+                    u"there is no cache for the group [{group}] of the removed roster "
+                    u"item [{jid_}]".format(group=group, jid=entity)
                 )
 
         # then we send the bridge signal
@@ -1139,14 +1139,15 @@
     def availableReceived(self, entity, show=None, statuses=None, priority=0):
         log.debug(
             _(
-                u"presence update for [%(entity)s] (available, show=%(show)s statuses=%(statuses)s priority=%(priority)d)"
+                u"presence update for [{entity}] (available, show={show} "
+                u"statuses={statuses} priority={priority})"
             )
-            % {
-                "entity": entity,
-                C.PRESENCE_SHOW: show,
-                C.PRESENCE_STATUSES: statuses,
-                C.PRESENCE_PRIORITY: priority,
-            }
+            .format(
+                entity=entity,
+                show=show,
+                statuses=statuses,
+                priority=priority,
+            )
         )
 
         if not statuses:
@@ -1187,7 +1188,8 @@
             return
 
         # now it's time to notify frontends
-        # if the entity is not known yet in this session or is already unavailable, there is no need to send an unavailable signal
+        # if the entity is not known yet in this session or is already unavailable,
+        # there is no need to send an unavailable signal
         try:
             presence = self.host.memory.getEntityDatum(
                 entity, "presence", self.parent.profile
@@ -1275,7 +1277,8 @@
         yield self.parent.roster.got_roster
         item = self.parent.roster.getItem(entity)
         if item and item.subscriptionTo:
-            # We automatically accept subscription if we are already subscribed to contact presence
+            # We automatically accept subscription if we are already subscribed to
+            # contact presence
             log.debug(_("sending automatic subscription acceptance"))
             self.subscribed(entity)
         else:
@@ -1314,22 +1317,22 @@
 
 
 class SatVersionHandler(generic.VersionHandler):
+
     def getDiscoInfo(self, requestor, target, node):
-        # XXX: We need to work around wokkel's behaviour (namespace not added if there is a
-        # node) as it cause issues with XEP-0115 & PEP (XEP-0163): there is a node when server
-        # ask for disco info, and not when we generate the key, so the hash is used with different
-        # disco features, and when the server (seen on ejabberd) generate its own hash for security check
-        # it reject our features (resulting in e.g. no notification on PEP)
+        # XXX: We need to work around wokkel's behaviour (namespace not added if there
+        #      is a node) as it cause issues with XEP-0115 & PEP (XEP-0163): there is a
+        #      node when server ask for disco info, and not when we generate the key, so
+        #      the hash is used with different disco features, and when the server (seen
+        #      on ejabberd) generate its own hash for security check it reject our
+        #      features (resulting in e.g. no notification on PEP)
         return generic.VersionHandler.getDiscoInfo(self, requestor, target, None)
 
 
 class SatIdentityHandler(XMPPHandler):
-    """ Manage disco Identity of SàT.
-
-    """
-
-    # TODO: dynamic identity update (see docstring). Note that a XMPP entity can have several identities
+    """Manage disco Identity of SàT."""
     implements(iwokkel.IDisco)
+    # TODO: dynamic identity update (see docstring). Note that a XMPP entity can have
+    #       several identities
 
     def getDiscoInfo(self, requestor, target, nodeIdentifier=""):
         return self.parent.identities