From dba4451f747fa0aa92157b9734e7a34ba0a9a31f Mon Sep 17 00:00:00 2001 From: Christophe de Vienne Date: Fri, 7 Oct 2011 13:21:23 +0200 Subject: [PATCH] Add array support to restxml --- wsme/protocols/restxml.py | 18 ++++++++++++++++++ wsme/tests/test_restxml.py | 11 +++++++++-- 2 files changed, 27 insertions(+), 2 deletions(-) diff --git a/wsme/protocols/restxml.py b/wsme/protocols/restxml.py index 108c7c2..32146e4 100644 --- a/wsme/protocols/restxml.py +++ b/wsme/protocols/restxml.py @@ -46,6 +46,17 @@ def fromxml(datatype, element): return datatype(element.text) +@toxml.when_type(list) +def array_toxml(datatype, key, value): + el = et.Element(key) + if value is None: + el.set('nil', 'true') + else: + for item in value: + el.append(toxml(datatype[0], 'item', item)) + return el + + @toxml.when_object(bool) def bool_toxml(datatype, key, value): el = et.Element(key) @@ -86,6 +97,13 @@ def binary_toxml(datatype, key, value): return el +@fromxml.when_type(list) +def array_fromxml(datatype, element): + if element.get('nil') == 'true': + return None + return [fromxml(datatype[0], item) for item in element.findall('item')] + + @fromxml.when_object(datetime.date) def date_fromxml(datatype, element): return datetime.datetime.strptime(element.text, '%Y-%m-%d').date() diff --git a/wsme/tests/test_restxml.py b/wsme/tests/test_restxml.py index 550e178..0b974c9 100644 --- a/wsme/tests/test_restxml.py +++ b/wsme/tests/test_restxml.py @@ -17,7 +17,10 @@ def dumpxml(key, obj, datatype=None): el = et.Element(key) if isinstance(obj, tuple): obj, datatype = obj - if datatype == wsme.types.binary: + if isinstance(datatype, list): + for item in obj: + el.append(dumpxml('item', item, datatype[0])) + elif datatype == wsme.types.binary: el.text = base64.encodestring(obj) elif isinstance(obj, basestring): el.text = obj @@ -39,7 +42,11 @@ def dumpxml(key, obj, datatype=None): def loadxml(el, datatype): print el, datatype, len(el) - if len(el): + if el.get('nil') == 'true': + return None + if isinstance(datatype, list): + return [loadxml(item, datatype[0]) for item in el.findall('item')] + elif len(el): d = {} for name, attr in datatype._wsme_attributes: child = el.find(name)