Update tostring methods.

Will now always show top-level namespace, unless it is the same
as the stream's default namespace. Also added the XMPP stream
namespace to the namespace map as 'stream'.
This commit is contained in:
Lance Stout 2011-01-27 18:05:05 -05:00
parent cd800d636a
commit bd9bf3f1c7
5 changed files with 43 additions and 15 deletions

View file

@ -106,6 +106,7 @@ class BaseXMPP(XMLStream):
self.default_ns = default_ns self.default_ns = default_ns
self.stream_ns = 'http://etherx.jabber.org/streams' self.stream_ns = 'http://etherx.jabber.org/streams'
self.namespace_map[self.stream_ns] = 'stream'
self.boundjid = JID("") self.boundjid = JID("")
@ -119,6 +120,8 @@ class BaseXMPP(XMLStream):
self.sentpresence = False self.sentpresence = False
self.stanza = sleekxmpp.stanza
self.register_handler( self.register_handler(
Callback('IM', Callback('IM',
MatchXPath('{%s}message/{%s}body' % (self.default_ns, MatchXPath('{%s}message/{%s}body' % (self.default_ns,

View file

@ -1007,7 +1007,9 @@ class ElementBase(object):
""" """
Return a string serialization of the underlying XML object. Return a string serialization of the underlying XML object.
""" """
return tostring(self.xml, xmlns='', stanza_ns=self.namespace) return tostring(self.xml, xmlns='',
stanza_ns=self.namespace,
top_level=True)
def __repr__(self): def __repr__(self):
""" """
@ -1217,4 +1219,5 @@ class StanzaBase(ElementBase):
"""Serialize the stanza's XML to a string.""" """Serialize the stanza's XML to a string."""
return tostring(self.xml, xmlns='', return tostring(self.xml, xmlns='',
stanza_ns=self.namespace, stanza_ns=self.namespace,
stream=self.stream) stream=self.stream,
top_level = True)

View file

@ -7,7 +7,8 @@
""" """
def tostring(xml=None, xmlns='', stanza_ns='', stream=None, outbuffer=''): def tostring(xml=None, xmlns='', stanza_ns='', stream=None,
outbuffer='', top_level=False):
""" """
Serialize an XML object to a Unicode string. Serialize an XML object to a Unicode string.
@ -26,6 +27,8 @@ def tostring(xml=None, xmlns='', stanza_ns='', stream=None, outbuffer=''):
stream -- The XML stream that generated the XML object. stream -- The XML stream that generated the XML object.
outbuffer -- Optional buffer for storing serializations during outbuffer -- Optional buffer for storing serializations during
recursive calls. recursive calls.
top_level -- Indicates that the element is the outermost
element.
""" """
# Add previous results to the start of the output. # Add previous results to the start of the output.
output = [outbuffer] output = [outbuffer]
@ -39,9 +42,16 @@ def tostring(xml=None, xmlns='', stanza_ns='', stream=None, outbuffer=''):
else: else:
tag_xmlns = '' tag_xmlns = ''
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. # Output the tag name and derived namespace of the element.
namespace = '' namespace = ''
if tag_xmlns not in ['', xmlns, stanza_ns]: if top_level and tag_xmlns not in ['', default_ns, stream_ns] or \
tag_xmlns not in ['', xmlns, stanza_ns, stream_ns]:
namespace = ' xmlns="%s"' % tag_xmlns namespace = ' xmlns="%s"' % tag_xmlns
if stream and tag_xmlns in stream.namespace_map: if stream and tag_xmlns in stream.namespace_map:
mapped_namespace = stream.namespace_map[tag_xmlns] mapped_namespace = stream.namespace_map[tag_xmlns]

View file

@ -10,7 +10,8 @@ from __future__ import unicode_literals
import types import types
def tostring(xml=None, xmlns='', stanza_ns='', stream=None, outbuffer=''): def tostring(xml=None, xmlns='', stanza_ns='', stream=None,
outbuffer='', top_level=False):
""" """
Serialize an XML object to a Unicode string. Serialize an XML object to a Unicode string.
@ -29,6 +30,8 @@ def tostring(xml=None, xmlns='', stanza_ns='', stream=None, outbuffer=''):
stream -- The XML stream that generated the XML object. stream -- The XML stream that generated the XML object.
outbuffer -- Optional buffer for storing serializations during outbuffer -- Optional buffer for storing serializations during
recursive calls. recursive calls.
top_level -- Indicates that the element is the outermost
element.
""" """
# Add previous results to the start of the output. # Add previous results to the start of the output.
output = [outbuffer] output = [outbuffer]
@ -42,9 +45,16 @@ def tostring(xml=None, xmlns='', stanza_ns='', stream=None, outbuffer=''):
else: else:
tag_xmlns = u'' 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. # Output the tag name and derived namespace of the element.
namespace = u'' namespace = u''
if tag_xmlns not in ['', xmlns, stanza_ns]: 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 namespace = u' xmlns="%s"' % tag_xmlns
if stream and tag_xmlns in stream.namespace_map: if stream and tag_xmlns in stream.namespace_map:
mapped_namespace = stream.namespace_map[tag_xmlns] mapped_namespace = stream.namespace_map[tag_xmlns]

View file

@ -102,11 +102,13 @@ class TestToString(SleekTest):
""" """
Test that stanza objects are serialized properly. Test that stanza objects are serialized properly.
""" """
self.stream_start()
utf8_message = '\xe0\xb2\xa0_\xe0\xb2\xa0' utf8_message = '\xe0\xb2\xa0_\xe0\xb2\xa0'
if not hasattr(utf8_message, 'decode'): if not hasattr(utf8_message, 'decode'):
# Python 3 # Python 3
utf8_message = bytes(utf8_message, encoding='utf-8') utf8_message = bytes(utf8_message, encoding='utf-8')
msg = Message() msg = self.Message()
msg['body'] = utf8_message.decode('utf-8') msg['body'] = utf8_message.decode('utf-8')
expected = '<message><body>\xe0\xb2\xa0_\xe0\xb2\xa0</body></message>' expected = '<message><body>\xe0\xb2\xa0_\xe0\xb2\xa0</body></message>'
result = msg.__str__() result = msg.__str__()