diff --git a/wsme/restjson.py b/wsme/restjson.py index 1deecfb..35ccb31 100644 --- a/wsme/restjson.py +++ b/wsme/restjson.py @@ -1,5 +1,6 @@ import base64 import datetime +import decimal from simplegeneric import generic @@ -23,6 +24,11 @@ def tojson(datatype, value): return value +@tojson.when_object(decimal.Decimal) +def decimal_tojson(datatype, value): + return str(value) + + @tojson.when_object(datetime.date) def date_tojson(datatype, value): return value.isoformat() @@ -32,6 +38,7 @@ def date_tojson(datatype, value): def time_tojson(datatype, value): return value.isoformat() + @tojson.when_object(datetime.datetime) def datetime_tojson(datatype, value): return value.isoformat() @@ -39,7 +46,7 @@ def datetime_tojson(datatype, value): @tojson.when_object(wsme.types.binary) def datetime_tojson(datatype, value): - return base64.encode(value) + return base64.encodestring(value) class RestJsonProtocol(RestProtocol): diff --git a/wsme/restxml.py b/wsme/restxml.py index 74bd175..e270272 100644 --- a/wsme/restxml.py +++ b/wsme/restxml.py @@ -47,6 +47,16 @@ def datetime_toxml(datatype, key, value): return el +@toxml.when_object(wsme.types.binary) +def binary_toxml(datatype, key, value): + el = et.Element(key) + if value is None: + el.set('nil', 'true') + else: + el.text = base64.encodestring(value) + return el + + class RestXmlProtocol(RestProtocol): name = 'REST+XML' dataformat = 'xml' diff --git a/wsme/tests/protocol.py b/wsme/tests/protocol.py index 164e02e..0cf039f 100644 --- a/wsme/tests/protocol.py +++ b/wsme/tests/protocol.py @@ -4,15 +4,19 @@ import unittest import warnings import datetime import decimal +import base64 from webob.dec import wsgify from webtest import TestApp from wsme import * +import wsme.types warnings.filterwarnings('ignore', module='webob.dec') +binarysample = r'\x00\xff\x43' + class CallException(RuntimeError): def __init__(self, faultcode, faultstring, debuginfo): self.faultcode = faultcode @@ -71,6 +75,10 @@ class ReturnTypes(object): def getdatetime(self): return datetime.datetime(1994, 1, 26, 12, 0, 0) + @expose(wsme.types.binary) + def getbinary(self): + return binarysample + @expose(NestedOuter) def getnested(self): n = NestedOuter() @@ -138,6 +146,10 @@ class ProtocolTestCase(unittest.TestCase): r = self.call('returntypes/getfloat') assert r == 3.14159265 or r == '3.14159265', r + def test_return_decimal(self): + r = self.call('returntypes/getdecimal') + assert r in (decimal.Decimal('3.14159265'), '3.14159265'), r + def test_return_date(self): r = self.call('returntypes/getdate') assert r == datetime.date(1994, 1, 26) or r == '1994-01-26', r @@ -151,6 +163,14 @@ class ProtocolTestCase(unittest.TestCase): assert r == datetime.datetime(1994, 1, 26, 12) \ or r == '1994-01-26T12:00:00', r + def test_return_binary(self): + r = self.call('returntypes/getbinary') + assert r == binarysample or r == base64.encodestring(binarysample), r + + def test_return_binary(self): + r = self.call('returntypes/getbinary') + assert r == binarysample or r == base64.encodestring(binarysample), r + def test_return_nested(self): r = self.call('returntypes/getnested') assert r == {'inner': {'aint': 0}} or r == {'inner': {'aint': '0'}}, r