Handle binary and decimal return types
This commit is contained in:
@@ -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):
|
||||
|
||||
@@ -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'
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user