diff --git a/wsme/rest/xml.py b/wsme/rest/xml.py index 331bbb0..2d1b585 100644 --- a/wsme/rest/xml.py +++ b/wsme/rest/xml.py @@ -203,6 +203,13 @@ def dict_fromxml(datatype, element): for item in element.findall('item'))) +@fromxml.when_object(wsme.types.text) +def unicode_fromxml(datatype, element): + if element.get('nil') == 'true': + return None + return wsme.types.text(element.text) if element.text else six.u('') + + @fromxml.when_object(datetime.date) def date_fromxml(datatype, element): if element.get('nil') == 'true': diff --git a/wsme/tests/protocol.py b/wsme/tests/protocol.py index bd5b9d9..4ad6948 100644 --- a/wsme/tests/protocol.py +++ b/wsme/tests/protocol.py @@ -176,6 +176,13 @@ class ArgTypes(object): assert type(value) == wsme.types.text return value + @expose(wsme.types.text) + @validate(wsme.types.text) + def settextnone(self, value): + print(repr(value)) + assert type(value) == type(None) + return value + @expose(bool) @validate(bool) def setbool(self, value): @@ -475,6 +482,14 @@ class ProtocolTestCase(unittest.TestCase): assert self.call('argtypes/settext', value=u('\xe3\x81\xae'), _rt=wsme.types.text) == u('\xe3\x81\xae') + def test_settext_empty(self): + assert self.call('argtypes/settext', value=u(''), + _rt=wsme.types.text) == u('') + + def test_settext_none(self): + assert self.call('argtypes/settextnone', value=None, + _rt=wsme.types.text) == None + def test_setint(self): r = self.call('argtypes/setint', value=3, _rt=int) assert r == 3, r diff --git a/wsme/tests/test_restxml.py b/wsme/tests/test_restxml.py index c96bb3e..e1c2641 100644 --- a/wsme/tests/test_restxml.py +++ b/wsme/tests/test_restxml.py @@ -40,6 +40,8 @@ def dumpxml(key, obj, datatype=None): el.text = six.text_type(obj) elif type(obj) in (datetime.date, datetime.time, datetime.datetime): el.text = obj.isoformat() + elif type(obj) == type(None): + el.set('nil', 'true') elif hasattr(datatype, '_wsme_attributes'): for attr in datatype._wsme_attributes: name = attr.name @@ -98,6 +100,8 @@ def loadxml(el, datatype): return parse_isotime(el.text) if datatype == datetime.datetime: return parse_isodatetime(el.text) + if datatype == wsme.types.text: + return datatype(el.text if el.text else u('')) if datatype == bool: return el.text.lower() != 'false' if datatype is None: diff --git a/wsme/tests/test_spore.py b/wsme/tests/test_spore.py index 5bbab9c..4d0b0b9 100644 --- a/wsme/tests/test_spore.py +++ b/wsme/tests/test_spore.py @@ -18,7 +18,7 @@ class TestSpore(unittest.TestCase): spore = json.loads(spore) - assert len(spore['methods']) == 45, str(len(spore['methods'])) + assert len(spore['methods']) == 46, str(len(spore['methods'])) m = spore['methods']['argtypes_setbytesarray'] assert m['path'] == 'argtypes/setbytesarray', m['path']