diff frontends/src/tools/jid.py @ 1367:f71a0fc26886

merged branch frontends_multi_profiles
author Goffi <goffi@goffi.org>
date Wed, 18 Mar 2015 10:52:28 +0100
parents 4895e1e092fb
children 3dae6964c071
line wrap: on
line diff
--- a/frontends/src/tools/jid.py	Thu Feb 05 11:59:26 2015 +0100
+++ b/frontends/src/tools/jid.py	Wed Mar 18 10:52:28 2015 +0100
@@ -18,38 +18,94 @@
 # along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
 
-class JID(unicode):
+# hack to use this module with pyjamas
+try:
+    unicode('') # XXX: unicode doesn't exist in pyjamas
+
+    # normal version
+    class BaseJID(unicode):
+        def __new__(cls, jid_str):
+            self = unicode.__new__(cls, cls._normalize(jid_str))
+            return self
+
+        def __init__(self, jid_str):
+            pass
+
+        def _parse(self):
+            """Find node domain and resource"""
+            node_end = self.find('@')
+            if node_end < 0:
+                node_end = 0
+            domain_end = self.find('/')
+            if domain_end == 0:
+               raise ValueError("a jid can't start with '/'")
+            if domain_end == -1:
+                domain_end = len(self)
+            self.node = self[:node_end] or None
+            self.domain = self[(node_end + 1) if node_end else 0:domain_end]
+            self.resource = self[domain_end + 1:] or None
+
+except (TypeError, AttributeError): # Error raised is not the same depending on pyjsbuild options
+    # pyjamas version
+    class BaseJID(object):
+        def __init__(self, jid_str):
+            self.__internal_str = JID._normalize(jid_str)
+
+        def __str__(self):
+            return self.__internal_str
+
+        def __getattr__(self, name):
+            return getattr(self.__internal_str, name)
+
+        def __eq__(self, other):
+            if not isinstance(other, JID):
+                return False
+            return (self.node == other.node
+                    and self.domain == other.domain
+                    and self.resource == other.resource)
+
+        def __hash__(self):
+            return hash('JID<{}>'.format(self.__internal_str))
+
+        def find(self, *args):
+            return self.__internal_str.find(*args)
+
+        def _parse(self):
+            """Find node domain and resource"""
+            node_end = self.__internal_str.find('@')
+            if node_end < 0:
+                node_end = 0
+            domain_end = self.__internal_str.find('/')
+            if domain_end == 0:
+                raise ValueError("a jid can't start with '/'")
+            if domain_end == -1:
+                domain_end = len(self.__internal_str)
+            self.node = self.__internal_str[:node_end] or None
+            self.domain = self.__internal_str[(node_end + 1) if node_end else 0:domain_end]
+            self.resource = self.__internal_str[domain_end + 1:] or None
+
+
+class JID(BaseJID):
     """This class help manage JID (Node@Domaine/Resource)"""
 
-    def __new__(cls, jid):
-        self = unicode.__new__(cls, cls.__normalize(jid))
-        self.__parse()
-        return self
+    def __init__(self, jid_str):
+        super(JID, self).__init__(jid_str)
+        self._parse()
 
-    @classmethod
-    def __normalize(cls, jid):
+    @staticmethod
+    def _normalize(jid_str):
         """Naive normalization before instantiating and parsing the JID"""
-        if not jid:
-            return jid
-        tokens = jid.split('/')
+        if not jid_str:
+            return jid_str
+        tokens = jid_str.split('/')
         tokens[0] = tokens[0].lower()  # force node and domain to lower-case
         return '/'.join(tokens)
 
-    def __parse(self):
-        """Find node domain and resource"""
-        node_end = self.find('@')
-        if node_end < 0:
-            node_end = 0
-        domain_end = self.find('/')
-        if domain_end < 1:
-            domain_end = len(self)
-        self.node = self[:node_end]
-        self.domain = self[(node_end + 1) if node_end else 0:domain_end]
-        self.resource = self[domain_end + 1:]
-        if not node_end:
-            self.bare = self
-        else:
-            self.bare = self.node + '@' + self.domain
+    @property
+    def bare(self):
+        if not self.node:
+            return JID(self.domain)
+        return JID(u"{}@{}".format(self.node, self.domain))
 
     def is_valid(self):
         """