From 4aae5cc528084e6d01faf9316e2ea53f89b425dd Mon Sep 17 00:00:00 2001 From: Christophe de Vienne Date: Thu, 26 Apr 2012 00:26:08 +0200 Subject: [PATCH] Completed the python 3 port --- wsme/protocols/restxml.py | 18 ++++++++++++++---- wsme/tests/test_restxml.py | 26 ++++++++++++++++---------- 2 files changed, 30 insertions(+), 14 deletions(-) diff --git a/wsme/protocols/restxml.py b/wsme/protocols/restxml.py index e9d8608..29bdb81 100644 --- a/wsme/protocols/restxml.py +++ b/wsme/protocols/restxml.py @@ -99,6 +99,8 @@ def fromxml(datatype, element): if sub is not None: setattr(obj, attrdef.key, fromxml(attrdef.datatype, sub)) return obj + if datatype is wsme.types.bytes: + return element.text.encode('ascii') return datatype(element.text) @@ -119,8 +121,7 @@ def dict_toxml(datatype, key, value): if value is None: el.set('nil', 'true') else: - key_type = datatype.keys()[0] - value_type = datatype.values()[0] + key_type, value_type = list(datatype.items())[0] for item in value.items(): key = toxml(key_type, 'key', item[0]) value = toxml(value_type, 'value', item[1]) @@ -131,6 +132,16 @@ def dict_toxml(datatype, key, value): return el +@toxml.when_object(wsme.types.bytes) +def bytes_toxml(datatype, key, value): + el = et.Element(key) + if value is None: + el.set('nil', 'true') + else: + el.text = value.decode('ascii') + return el + + @toxml.when_object(bool) def bool_toxml(datatype, key, value): el = et.Element(key) @@ -172,8 +183,7 @@ def array_fromxml(datatype, element): def dict_fromxml(datatype, element): if element.get('nil') == 'true': return None - key_type = datatype.keys()[0] - value_type = datatype.values()[0] + key_type, value_type = list(datatype.items())[0] return dict(( (fromxml(key_type, item.find('key')), fromxml(value_type, item.find('value'))) diff --git a/wsme/tests/test_restxml.py b/wsme/tests/test_restxml.py index 96364ae..4b3a976 100644 --- a/wsme/tests/test_restxml.py +++ b/wsme/tests/test_restxml.py @@ -31,8 +31,10 @@ def dumpxml(key, obj, datatype=None): 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 = base64.encodestring(obj).decode('ascii') + elif isinstance(obj, wsme.types.bytes): + el.text = obj.decode('ascii') + elif isinstance(obj, wsme.types.text): el.text = obj elif type(obj) in (int, float, decimal.Decimal): el.text = six.text_type(obj) @@ -48,6 +50,7 @@ def dumpxml(key, obj, datatype=None): elif type(obj) == dict: for name, value in obj.items(): el.append(dumpxml(name, value)) + print(obj, datatype, et.tostring(el)) return el @@ -58,9 +61,10 @@ def loadxml(el, datatype): if isinstance(datatype, list): return [loadxml(item, datatype[0]) for item in el.findall('item')] elif isinstance(datatype, dict): + key_type, value_type = list(datatype.items())[0] return dict(( - (loadxml(item.find('key'), datatype.keys()[0]), - loadxml(item.find('value'), datatype.values()[0])) + (loadxml(item.find('key'), key_type), + loadxml(item.find('value'), value_type)) for item in el.findall('item') )) elif len(el): @@ -75,7 +79,7 @@ def loadxml(el, datatype): return d else: if datatype == wsme.types.binary: - return base64.decodestring(el.text) + return base64.decodestring(el.text.encode('ascii')) if isusertype(datatype): datatype = datatype.basetype if datatype == datetime.date: @@ -86,6 +90,8 @@ def loadxml(el, datatype): return parse_isodatetime(el.text) if datatype is None: return el.text + if datatype is wsme.types.bytes: + return el.text.encode('ascii') return datatype(el.text) @@ -125,23 +131,23 @@ class TestRestXML(wsme.tests.protocol.ProtocolTestCase): def test_encode_sample_value(self): class MyType(object): aint = int - aunicode = unicode + atext = wsme.types.text register_type(MyType) value = MyType() value.aint = 5 - value.aunicode = u('test') + value.atext = u('test') language, sample = self.root.protocols[0].encode_sample_value( MyType, value, True) print (language, sample) assert language == 'xml' - assert sample == """ + assert sample == b(""" 5 - test -""" + test +""") def test_nil_fromxml(self): for dt in (