From f475504e989e2be39f0dd3a23ff5761b3aad713c Mon Sep 17 00:00:00 2001 From: Christophe de Vienne Date: Thu, 26 Apr 2012 00:03:25 +0200 Subject: [PATCH] Python 3 port in progress --- wsme/protocols/restxml.py | 3 ++- wsme/root.py | 22 ++++++++++++++++++++-- wsme/tests/test_restxml.py | 11 ++++++----- 3 files changed, 28 insertions(+), 8 deletions(-) diff --git a/wsme/protocols/restxml.py b/wsme/protocols/restxml.py index 5c58176..e9d8608 100644 --- a/wsme/protocols/restxml.py +++ b/wsme/protocols/restxml.py @@ -1,6 +1,7 @@ import datetime from six import u +import six try: import xml.etree.ElementTree as et @@ -63,7 +64,7 @@ def toxml(datatype, key, value): el.append(toxml(attrdef.datatype, attrdef.name, getattr(value, attrdef.key))) else: - el.text = unicode(value) + el.text = six.text_type(value) return el diff --git a/wsme/root.py b/wsme/root.py index 18f2bd2..4b98d98 100644 --- a/wsme/root.py +++ b/wsme/root.py @@ -4,6 +4,7 @@ import traceback import weakref from six import u, b +import six import webob @@ -166,7 +167,20 @@ class WSRoot(object): def _handle_request(self, request): def default_prepare_response_body(request, results): - return u('\n').join(results) + r = None + sep = None + for value in results: + if sep is None: + if isinstance(value, six.text_type): + sep = u('\n') + r = u('') + else: + sep = b('\n') + r = b('') + else: + r += sep + r += value + return r res = webob.Response() res_content_type = None @@ -207,7 +221,11 @@ class WSRoot(object): body = prepare_response_body(request, ( self._do_call(protocol, context) for context in protocol.iter_calls(request))) - res.unicode_body = body + + if isinstance(body, six.text_type): + res.text = body + else: + res.body = body if len(request.calls) == 1: if hasattr(protocol, 'get_response_status'): diff --git a/wsme/tests/test_restxml.py b/wsme/tests/test_restxml.py index 796d28b..96364ae 100644 --- a/wsme/tests/test_restxml.py +++ b/wsme/tests/test_restxml.py @@ -2,7 +2,7 @@ import decimal import datetime import base64 -from six import u +from six import u, b import six import wsme.tests.protocol @@ -25,16 +25,17 @@ def dumpxml(key, obj, datatype=None): for item in obj: el.append(dumpxml('item', item, datatype[0])) elif isinstance(datatype, dict): + key_type, value_type = list(datatype.items())[0] for item in obj.items(): node = et.SubElement(el, 'item') - node.append(dumpxml('key', item[0], datatype.keys()[0])) - node.append(dumpxml('value', item[1], datatype.values()[0])) + node.append(dumpxml('key', item[0], key_type)) + node.append(dumpxml('value', item[1], value_type)) elif datatype == wsme.types.binary: el.text = base64.encodestring(obj) elif isinstance(obj, six.string_types): el.text = obj elif type(obj) in (int, float, decimal.Decimal): - el.text = str(obj) + el.text = six.text_type(obj) elif type(obj) in (datetime.date, datetime.time, datetime.datetime): el.text = obj.isoformat() elif hasattr(datatype, '_wsme_attributes'): @@ -154,7 +155,7 @@ class TestRestXML(wsme.tests.protocol.ProtocolTestCase): [int], {int: str}, bool, datetime.date, datetime.time, datetime.datetime): x = et.tostring(toxml(dt, 'value', None)) - assert x == '', x + assert x == b(''), x def test_parse_arg(self): e = self.root.protocols[0].parse_arg('value', '5')