summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sleekxmpp/xmlstream/jid.py70
-rw-r--r--sleekxmpp/xmlstream/stanzabase.py23
-rw-r--r--tests/test_jid.py26
3 files changed, 97 insertions, 22 deletions
diff --git a/sleekxmpp/xmlstream/jid.py b/sleekxmpp/xmlstream/jid.py
new file mode 100644
index 00000000..2839ba58
--- /dev/null
+++ b/sleekxmpp/xmlstream/jid.py
@@ -0,0 +1,70 @@
+class JID(object):
+ def __init__(self, jid):
+ """Initialize a new jid"""
+ self.reset(jid)
+
+ def reset(self, jid):
+ """Start fresh from a new jid string"""
+ self._full = self._jid = str(jid)
+ self._domain = None
+ self._resource = None
+ self._user = None
+ self._domain = None
+ self._bare = None
+
+ def __getattr__(self, name):
+ """Handle getting the jid values, using cache if available"""
+ if name == 'resource':
+ if self._resource is not None: return self._resource
+ self._resource = self._jid.split('/', 1)[-1]
+ return self._resource
+ elif name == 'user':
+ if self._user is not None: return self._user
+ if '@' in self._jid:
+ self._user = self._jid.split('@', 1)[0]
+ else:
+ self._user = self._user
+ return self._user
+ elif name in ('server', 'domain'):
+ if self._domain is not None: return self._domain
+ self._domain = self._jid.split('@', 1)[-1].split('/', 1)[0]
+ return self._domain
+ elif name == 'full':
+ return self._jid
+ elif name == 'bare':
+ if self._bare is not None: return self._bare
+ self._bare = self._jid.split('/', 1)[0]
+ return self._bare
+
+ def __setattr__(self, name, value):
+ """Edit a jid by updating it's individual values, resetting by a generated jid in the end"""
+ if name in ('resource', 'user', 'domain'):
+ object.__setattr__(self, "_%s" % name, value)
+ self.regenerate()
+ elif name == 'server':
+ self.domain = value
+ elif name in ('full', 'jid'):
+ self.reset(value)
+ elif name == 'bare':
+ if '@' in value:
+ u, d = value.split('@', 1)
+ object.__setattr__(self, "_user", u)
+ object.__setattr__(self, "_domain", d)
+ else:
+ object.__setattr__(self, "_domain", value)
+ self.regenerate()
+ else:
+ object.__setattr__(self, name, value)
+
+
+ def regenerate(self):
+ """Generate a new jid based on current values, useful after editing"""
+ jid = ""
+ if self.user: jid = "%s@" % self.user
+ jid += self.domain
+ if self.resource: jid += "/%s" % self.resource
+ self.reset(jid)
+
+ def __str__(self):
+ return self.full
+
diff --git a/sleekxmpp/xmlstream/stanzabase.py b/sleekxmpp/xmlstream/stanzabase.py
index ab054073..b8c80ffa 100644
--- a/sleekxmpp/xmlstream/stanzabase.py
+++ b/sleekxmpp/xmlstream/stanzabase.py
@@ -10,6 +10,7 @@ import logging
import sys
import weakref
import copy
+from . jid import JID
if sys.version_info < (3,0):
from . import tostring26 as tostring
@@ -28,28 +29,6 @@ def registerStanzaPlugin(stanza, plugin):
stanza.plugin_tag_map[tag] = plugin
-class JID(object):
- def __init__(self, jid):
- self.jid = jid
-
- def __getattr__(self, name):
- if name == 'resource':
- return self.jid.split('/', 1)[-1]
- elif name == 'user':
- if '@' in self.jid:
- return self.jid.split('@', 1)[0]
- else:
- return ''
- elif name == 'server':
- return self.jid.split('@', 1)[-1].split('/', 1)[0]
- elif name == 'full':
- return self.jid
- elif name == 'bare':
- return self.jid.split('/', 1)[0]
-
- def __str__(self):
- return self.jid
-
class ElementBase(tostring.ToString):
name = 'stanza'
plugin_attrib = 'plugin'
diff --git a/tests/test_jid.py b/tests/test_jid.py
new file mode 100644
index 00000000..8b4c9761
--- /dev/null
+++ b/tests/test_jid.py
@@ -0,0 +1,26 @@
+from sleektest import *
+from sleekxmpp.xmlstream.jid import JID
+
+class TestJIDClass(SleekTest):
+ def testJIDfromfull(self):
+ j = JID('user@someserver/some/resource')
+ self.assertEqual(j.user, 'user', "User does not match")
+ self.assertEqual(j.domain, 'someserver', "Domain does not match")
+ self.assertEqual(j.resource, 'some/resource', "Resource does not match")
+ self.assertEqual(j.bare, 'user@someserver', "Bare does not match")
+ self.assertEqual(j.full, 'user@someserver/some/resource', "Full does not match")
+ self.assertEqual(str(j), 'user@someserver/some/resource', "String does not match")
+
+ def testJIDchange(self):
+ j = JID('user1@someserver1/some1/resource1')
+ j.user = 'user'
+ j.domain = 'someserver'
+ j.resource = 'some/resource'
+ self.assertEqual(j.user, 'user', "User does not match")
+ self.assertEqual(j.domain, 'someserver', "Domain does not match")
+ self.assertEqual(j.resource, 'some/resource', "Resource does not match")
+ self.assertEqual(j.bare, 'user@someserver', "Bare does not match")
+ self.assertEqual(j.full, 'user@someserver/some/resource', "Full does not match")
+ self.assertEqual(str(j), 'user@someserver/some/resource', "String does not match")
+
+suite = unittest.TestLoader().loadTestsFromTestCase(TestJIDClass)