diff --git a/setup.py b/setup.py index 48d8869..be9a0d3 100644 --- a/setup.py +++ b/setup.py @@ -74,11 +74,6 @@ packages = [ 'sleekxmpp', 'sleekxmpp/thirdparty/suelta/mechanisms', ] -if sys.version_info < (3, 0): - py_modules = ['sleekxmpp.xmlstream.tostring.tostring26'] -else: - py_modules = ['sleekxmpp.xmlstream.tostring.tostring'] - setup( name = "sleekxmpp", version = VERSION, @@ -90,7 +85,6 @@ setup( license = 'MIT', platforms = [ 'any' ], packages = packages, - py_modules = py_modules, requires = [ 'tlslite', 'pythondns' ], ) diff --git a/sleekxmpp/plugins/xep_0060/__init__.py b/sleekxmpp/plugins/xep_0060/__init__.py index a0c91f8..026f7c2 100644 --- a/sleekxmpp/plugins/xep_0060/__init__.py +++ b/sleekxmpp/plugins/xep_0060/__init__.py @@ -1,2 +1,2 @@ -from pubsub import xep_0060 -import stanza +from sleekxmpp.plugins.xep_0060.pubsub import xep_0060 +from sleekxmpp.plugins.xep_0060 import stanza diff --git a/sleekxmpp/plugins/xep_0060/stanza/__init__.py b/sleekxmpp/plugins/xep_0060/stanza/__init__.py index 52a21ef..d7cd91a 100644 --- a/sleekxmpp/plugins/xep_0060/stanza/__init__.py +++ b/sleekxmpp/plugins/xep_0060/stanza/__init__.py @@ -1,3 +1,3 @@ -from pubsub import Pubsub, Affiliation, Affiliations, Subscription, Subscriptions, SubscribeOptions, Item, Items, Create, Publish, Retract, Unsubscribe, Subscribe, Configure, Options, PubsubState, PubsubStateEvent -from pubsub_owner import PubsubOwner, DefaultConfig, OwnerAffiliations, OwnerAffiliation, OwnerConfigure, OwnerDefault, OwnerDelete, OwnerPurge, OwnerRedirect, OwnerSubscriptions, OwnerSubscription -from pubsub_event import Event, EventItem, EventRetract, EventItems, EventCollection, EventAssociate, EventDisassociate, EventConfiguration, EventPurge, EventSubscription +from sleekxmpp.plugins.xep_0060.stanza.pubsub import Pubsub, Affiliation, Affiliations, Subscription, Subscriptions, SubscribeOptions, Item, Items, Create, Publish, Retract, Unsubscribe, Subscribe, Configure, Options, PubsubState, PubsubStateEvent +from sleekxmpp.plugins.xep_0060.stanza.pubsub_owner import PubsubOwner, DefaultConfig, OwnerAffiliations, OwnerAffiliation, OwnerConfigure, OwnerDefault, OwnerDelete, OwnerPurge, OwnerRedirect, OwnerSubscriptions, OwnerSubscription +from sleekxmpp.plugins.xep_0060.stanza.pubsub_event import Event, EventItem, EventRetract, EventItems, EventCollection, EventAssociate, EventDisassociate, EventConfiguration, EventPurge, EventSubscription diff --git a/sleekxmpp/plugins/xep_0060/stanza/pubsub.py b/sleekxmpp/plugins/xep_0060/stanza/pubsub.py index 4d586ca..9665594 100644 --- a/sleekxmpp/plugins/xep_0060/stanza/pubsub.py +++ b/sleekxmpp/plugins/xep_0060/stanza/pubsub.py @@ -5,7 +5,7 @@ from sleekxmpp.basexmpp import basexmpp from sleekxmpp.xmlstream.xmlstream import XMLStream import logging from sleekxmpp.plugins import xep_0004 -from base import OptionalSetting +from sleekxmpp.plugins.xep_0060.stanza.base import OptionalSetting class Pubsub(ElementBase): @@ -55,7 +55,7 @@ class Subscription(ElementBase): def setjid(self, value): self._setattr('jid', str(value)) - + def getjid(self): return jid(self._getattr('jid')) @@ -93,12 +93,12 @@ class Item(ElementBase): def setPayload(self, value): self.xml.append(value) - + def getPayload(self): childs = self.xml.getchildren() if len(childs) > 0: return childs[0] - + def delPayload(self): for child in self.xml.getchildren(): self.xml.remove(child) @@ -167,10 +167,10 @@ class Unsubscribe(ElementBase): interfaces = set(('node', 'jid')) plugin_attrib_map = {} plugin_tag_map = {} - + def setJid(self, value): self._setAttr('jid', str(value)) - + def getJid(self): return JID(self._getAttr('jid')) @@ -186,7 +186,7 @@ class Subscribe(ElementBase): def setJid(self, value): self._setAttr('jid', str(value)) - + def getJid(self): return JID(self._getAttr('jid')) @@ -204,7 +204,7 @@ class Configure(ElementBase): t = self._getAttr('type') if not t: t == 'leaf' return t - + registerStanzaPlugin(Pubsub, Configure) registerStanzaPlugin(Configure, xep_0004.Form) @@ -215,28 +215,28 @@ class Options(ElementBase): interfaces = set(('jid', 'node', 'options')) plugin_attrib_map = {} plugin_tag_map = {} - + def __init__(self, *args, **kwargs): ElementBase.__init__(self, *args, **kwargs) - + def getOptions(self): config = self.xml.find('{jabber:x:data}x') form = xep_0004.Form() if config is not None: form.fromXML(config) return form - + def setOptions(self, value): self.xml.append(value.getXML()) return self - + def delOptions(self): config = self.xml.find('{jabber:x:data}x') self.xml.remove(config) - + def setJid(self, value): self._setAttr('jid', str(value)) - + def getJid(self): return JID(self._getAttr('jid')) @@ -250,15 +250,15 @@ class PubsubState(ElementBase): interfaces = set(('node', 'item', 'payload')) plugin_attrib_map = {} plugin_tag_map = {} - + def setPayload(self, value): self.xml.append(value) - + def getPayload(self): childs = self.xml.getchildren() if len(childs) > 0: return childs[0] - + def delPayload(self): for child in self.xml.getchildren(): self.xml.remove(child) diff --git a/sleekxmpp/plugins/xep_0060/stanza/pubsub_owner.py b/sleekxmpp/plugins/xep_0060/stanza/pubsub_owner.py index 0588961..a90780c 100644 --- a/sleekxmpp/plugins/xep_0060/stanza/pubsub_owner.py +++ b/sleekxmpp/plugins/xep_0060/stanza/pubsub_owner.py @@ -5,8 +5,8 @@ from sleekxmpp.basexmpp import basexmpp from sleekxmpp.xmlstream.xmlstream import XMLStream import logging from sleekxmpp.plugins import xep_0004 -from base import OptionalSetting -from pubsub import Affiliations, Affiliation, Configure, Subscriptions +from sleekxmpp.plugins.xep_0060.stanza.base import OptionalSetting +from sleekxmpp.plugins.xep_0060.stanza.pubsub import Affiliations, Affiliation, Configure, Subscriptions class PubsubOwner(ElementBase): namespace = 'http://jabber.org/protocol/pubsub#owner' @@ -25,7 +25,7 @@ class DefaultConfig(ElementBase): interfaces = set(('node', 'type', 'config')) plugin_attrib_map = {} plugin_tag_map = {} - + def __init__(self, *args, **kwargs): ElementBase.__init__(self, *args, **kwargs) @@ -33,10 +33,10 @@ class DefaultConfig(ElementBase): t = self._getAttr('type') if not t: t = 'leaf' return t - + def getConfig(self): return self['form'] - + def setConfig(self, value): self['form'].setStanzaValues(value.getStanzaValues()) return self @@ -49,7 +49,7 @@ class OwnerAffiliations(Affiliations): interfaces = set(('node')) plugin_attrib_map = {} plugin_tag_map = {} - + def append(self, affiliation): if not isinstance(affiliation, OwnerAffiliation): raise TypeError @@ -77,10 +77,10 @@ class OwnerDefault(OwnerConfigure): interfaces = set(('node', 'config')) plugin_attrib_map = {} plugin_tag_map = {} - + def getConfig(self): return self['form'] - + def setConfig(self, value): self['form'].setStanzaValues(value.getStanzaValues()) return self @@ -114,10 +114,10 @@ class OwnerRedirect(ElementBase): interfaces = set(('node', 'jid')) plugin_attrib_map = {} plugin_tag_map = {} - + def setJid(self, value): self._setAttr('jid', str(value)) - + def getJid(self): return JID(self._getAttr('jid')) @@ -128,7 +128,7 @@ class OwnerSubscriptions(Subscriptions): interfaces = set(('node',)) plugin_attrib_map = {} plugin_tag_map = {} - + def append(self, subscription): if not isinstance(subscription, OwnerSubscription): raise TypeError @@ -147,6 +147,6 @@ class OwnerSubscription(ElementBase): def setJid(self, value): self._setAttr('jid', str(value)) - + def getJid(self): return JID(self._getAttr('from')) diff --git a/sleekxmpp/xmlstream/tostring/tostring.py b/sleekxmpp/xmlstream/tostring.py similarity index 95% rename from sleekxmpp/xmlstream/tostring/tostring.py rename to sleekxmpp/xmlstream/tostring.py index a6bb6eb..f9674b1 100644 --- a/sleekxmpp/xmlstream/tostring/tostring.py +++ b/sleekxmpp/xmlstream/tostring.py @@ -6,6 +6,11 @@ See the file LICENSE for copying permission. """ +import sys + +if sys.version_info < (3, 0): + import types + def tostring(xml=None, xmlns='', stanza_ns='', stream=None, outbuffer='', top_level=False): @@ -103,6 +108,10 @@ def xml_escape(text): Arguments: text -- The XML text to convert. """ + if sys.version_info < (3, 0): + if type(text) != types.UnicodeType: + text = unicode(text, 'utf-8', 'ignore') + text = list(text) escapes = {'&': '&', '<': '<', diff --git a/sleekxmpp/xmlstream/tostring/__init__.py b/sleekxmpp/xmlstream/tostring/__init__.py deleted file mode 100644 index 5852cba..0000000 --- a/sleekxmpp/xmlstream/tostring/__init__.py +++ /dev/null @@ -1,19 +0,0 @@ -""" - SleekXMPP: The Sleek XMPP Library - Copyright (C) 2010 Nathanael C. Fritz - This file is part of SleekXMPP. - - See the file LICENSE for copying permission. -""" - -import sys - -# Import the correct tostring and xml_escape functions based on the Python -# version in order to properly handle Unicode. - -if sys.version_info < (3, 0): - from sleekxmpp.xmlstream.tostring.tostring26 import tostring, xml_escape -else: - from sleekxmpp.xmlstream.tostring.tostring import tostring, xml_escape - -__all__ = ['tostring', 'xml_escape'] diff --git a/sleekxmpp/xmlstream/tostring/tostring26.py b/sleekxmpp/xmlstream/tostring/tostring26.py deleted file mode 100644 index 3d1ca3d..0000000 --- a/sleekxmpp/xmlstream/tostring/tostring26.py +++ /dev/null @@ -1,120 +0,0 @@ -""" - SleekXMPP: The Sleek XMPP Library - Copyright (C) 2010 Nathanael C. Fritz - This file is part of SleekXMPP. - - See the file LICENSE for copying permission. -""" - -from __future__ import unicode_literals -import types - - -def tostring(xml=None, xmlns='', stanza_ns='', stream=None, - outbuffer='', top_level=False): - """ - Serialize an XML object to a Unicode string. - - If namespaces are provided using xmlns or stanza_ns, then elements - that use those namespaces will not include the xmlns attribute in - the output. - - Arguments: - xml -- The XML object to serialize. If the value is None, - then the XML object contained in this stanza - object will be used. - xmlns -- Optional namespace of an element wrapping the XML - object. - stanza_ns -- The namespace of the stanza object that contains - the XML object. - stream -- The XML stream that generated the XML object. - outbuffer -- Optional buffer for storing serializations during - recursive calls. - top_level -- Indicates that the element is the outermost - element. - """ - # Add previous results to the start of the output. - output = [outbuffer] - - # Extract the element's tag name. - tag_name = xml.tag.split('}', 1)[-1] - - # Extract the element's namespace if it is defined. - if '}' in xml.tag: - tag_xmlns = xml.tag.split('}', 1)[0][1:] - else: - tag_xmlns = u'' - - default_ns = '' - stream_ns = '' - if stream: - default_ns = stream.default_ns - stream_ns = stream.stream_ns - - # Output the tag name and derived namespace of the element. - namespace = u'' - if top_level and tag_xmlns not in ['', default_ns, stream_ns] or \ - tag_xmlns not in ['', xmlns, stanza_ns, stream_ns]: - namespace = u' xmlns="%s"' % tag_xmlns - if stream and tag_xmlns in stream.namespace_map: - mapped_namespace = stream.namespace_map[tag_xmlns] - if mapped_namespace: - tag_name = u"%s:%s" % (mapped_namespace, tag_name) - output.append(u"<%s" % tag_name) - output.append(namespace) - - # Output escaped attribute values. - for attrib, value in xml.attrib.items(): - value = xml_escape(value) - if '}' not in attrib: - output.append(' %s="%s"' % (attrib, value)) - else: - attrib_ns = attrib.split('}')[0][1:] - attrib = attrib.split('}')[1] - if stream and attrib_ns in stream.namespace_map: - mapped_ns = stream.namespace_map[attrib_ns] - if mapped_ns: - output.append(' %s:%s="%s"' % (mapped_ns, - attrib, - value)) - - if len(xml) or xml.text: - # If there are additional child elements to serialize. - output.append(u">") - if xml.text: - output.append(xml_escape(xml.text)) - if len(xml): - for child in xml.getchildren(): - output.append(tostring(child, tag_xmlns, stanza_ns, stream)) - output.append(u"" % tag_name) - elif xml.text: - # If we only have text content. - output.append(u">%s" % (xml_escape(xml.text), tag_name)) - else: - # Empty element. - output.append(u" />") - if xml.tail: - # If there is additional text after the element. - output.append(xml_escape(xml.tail)) - return u''.join(output) - - -def xml_escape(text): - """ - Convert special characters in XML to escape sequences. - - Arguments: - text -- The XML text to convert. - """ - if type(text) != types.UnicodeType: - text = list(unicode(text, 'utf-8', 'ignore')) - else: - text = list(text) - escapes = {u'&': u'&', - u'<': u'<', - u'>': u'>', - u"'": u''', - u'"': u'"'} - for i, c in enumerate(text): - text[i] = escapes.get(c, c) - return u''.join(text)