Updated and simplified new JID class to have more documentation and use PEP8 style.

This commit is contained in:
Lance Stout 2010-08-04 00:33:28 -04:00
parent fec69be731
commit aa1dbe97e0
2 changed files with 116 additions and 64 deletions

View file

@ -6,5 +6,6 @@
See the file LICENSE for copying permission. See the file LICENSE for copying permission.
""" """
from sleekxmpp.xmlstream.jid import JID
from sleekxmpp.xmlstream.stanzabase import StanzaBase, ElementBase from sleekxmpp.xmlstream.stanzabase import StanzaBase, ElementBase
from sleekxmpp.xmlstream.xmlstream import XMLStream, RESPONSE_TIMEOUT from sleekxmpp.xmlstream.xmlstream import XMLStream, RESPONSE_TIMEOUT

View file

@ -1,70 +1,121 @@
"""
SleekXMPP: The Sleek XMPP Library
Copyright (C) 2010 Nathanael C. Fritz
This file is part of SleekXMPP.
See the file LICENSE for copying permission.
"""
class JID(object): class JID(object):
def __init__(self, jid): """
"""Initialize a new jid""" A representation of a Jabber ID, or JID.
self.reset(jid)
def reset(self, jid): Each JID may have three components: a user, a domain, and an optional
"""Start fresh from a new jid string""" resource. For example: user@domain/resource
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): When a resource is not used, the JID is called a bare JID.
"""Edit a jid by updating it's individual values, resetting by a generated jid in the end""" The JID is a full JID otherwise.
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)
Attributes:
jid -- Alias for 'full'.
full -- The value of the full JID.
bare -- The value of the bare JID.
user -- The username portion of the JID.
domain -- The domain name portion of the JID.
server -- Alias for 'domain'.
resource -- The resource portion of the JID.
def regenerate(self): Methods:
"""Generate a new jid based on current values, useful after editing""" reset -- Use a new JID value.
jid = "" regenerate -- Recreate the JID from its components.
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
def __init__(self, jid):
"""Initialize a new JID"""
self.reset(jid)
def reset(self, jid):
"""
Start fresh from a new JID string.
Arguments:
jid - The new JID value.
"""
self._full = self._jid = str(jid)
self._domain = None
self._resource = None
self._user = None
self._bare = None
def __getattr__(self, name):
"""
Handle getting the JID values, using cache if available.
Arguments:
name -- One of: user, server, domain, resource,
full, or bare.
"""
if name == 'resource':
if self._resource is None:
self._resource = self._jid.split('/', 1)[-1]
return self._resource
elif name == 'user':
if self._user is None:
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 None:
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 None:
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 the
generated JID in the end.
Arguments:
name -- The name of the JID part. One of: user, domain,
server, resource, full, jid, or bare.
value -- The new value for the JID part.
"""
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):
"""Use the full JID as the string value."""
return self.full