Handle binary and decimal return types
This commit is contained in:
@@ -1,5 +1,6 @@
|
|||||||
import base64
|
import base64
|
||||||
import datetime
|
import datetime
|
||||||
|
import decimal
|
||||||
|
|
||||||
from simplegeneric import generic
|
from simplegeneric import generic
|
||||||
|
|
||||||
@@ -23,6 +24,11 @@ def tojson(datatype, value):
|
|||||||
return value
|
return value
|
||||||
|
|
||||||
|
|
||||||
|
@tojson.when_object(decimal.Decimal)
|
||||||
|
def decimal_tojson(datatype, value):
|
||||||
|
return str(value)
|
||||||
|
|
||||||
|
|
||||||
@tojson.when_object(datetime.date)
|
@tojson.when_object(datetime.date)
|
||||||
def date_tojson(datatype, value):
|
def date_tojson(datatype, value):
|
||||||
return value.isoformat()
|
return value.isoformat()
|
||||||
@@ -32,6 +38,7 @@ def date_tojson(datatype, value):
|
|||||||
def time_tojson(datatype, value):
|
def time_tojson(datatype, value):
|
||||||
return value.isoformat()
|
return value.isoformat()
|
||||||
|
|
||||||
|
|
||||||
@tojson.when_object(datetime.datetime)
|
@tojson.when_object(datetime.datetime)
|
||||||
def datetime_tojson(datatype, value):
|
def datetime_tojson(datatype, value):
|
||||||
return value.isoformat()
|
return value.isoformat()
|
||||||
@@ -39,7 +46,7 @@ def datetime_tojson(datatype, value):
|
|||||||
|
|
||||||
@tojson.when_object(wsme.types.binary)
|
@tojson.when_object(wsme.types.binary)
|
||||||
def datetime_tojson(datatype, value):
|
def datetime_tojson(datatype, value):
|
||||||
return base64.encode(value)
|
return base64.encodestring(value)
|
||||||
|
|
||||||
|
|
||||||
class RestJsonProtocol(RestProtocol):
|
class RestJsonProtocol(RestProtocol):
|
||||||
|
|||||||
@@ -47,6 +47,16 @@ def datetime_toxml(datatype, key, value):
|
|||||||
return el
|
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):
|
class RestXmlProtocol(RestProtocol):
|
||||||
name = 'REST+XML'
|
name = 'REST+XML'
|
||||||
dataformat = 'xml'
|
dataformat = 'xml'
|
||||||
|
|||||||
@@ -4,15 +4,19 @@ import unittest
|
|||||||
import warnings
|
import warnings
|
||||||
import datetime
|
import datetime
|
||||||
import decimal
|
import decimal
|
||||||
|
import base64
|
||||||
|
|
||||||
from webob.dec import wsgify
|
from webob.dec import wsgify
|
||||||
from webtest import TestApp
|
from webtest import TestApp
|
||||||
|
|
||||||
from wsme import *
|
from wsme import *
|
||||||
|
import wsme.types
|
||||||
|
|
||||||
warnings.filterwarnings('ignore', module='webob.dec')
|
warnings.filterwarnings('ignore', module='webob.dec')
|
||||||
|
|
||||||
|
|
||||||
|
binarysample = r'\x00\xff\x43'
|
||||||
|
|
||||||
class CallException(RuntimeError):
|
class CallException(RuntimeError):
|
||||||
def __init__(self, faultcode, faultstring, debuginfo):
|
def __init__(self, faultcode, faultstring, debuginfo):
|
||||||
self.faultcode = faultcode
|
self.faultcode = faultcode
|
||||||
@@ -71,6 +75,10 @@ class ReturnTypes(object):
|
|||||||
def getdatetime(self):
|
def getdatetime(self):
|
||||||
return datetime.datetime(1994, 1, 26, 12, 0, 0)
|
return datetime.datetime(1994, 1, 26, 12, 0, 0)
|
||||||
|
|
||||||
|
@expose(wsme.types.binary)
|
||||||
|
def getbinary(self):
|
||||||
|
return binarysample
|
||||||
|
|
||||||
@expose(NestedOuter)
|
@expose(NestedOuter)
|
||||||
def getnested(self):
|
def getnested(self):
|
||||||
n = NestedOuter()
|
n = NestedOuter()
|
||||||
@@ -138,6 +146,10 @@ class ProtocolTestCase(unittest.TestCase):
|
|||||||
r = self.call('returntypes/getfloat')
|
r = self.call('returntypes/getfloat')
|
||||||
assert r == 3.14159265 or r == '3.14159265', r
|
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):
|
def test_return_date(self):
|
||||||
r = self.call('returntypes/getdate')
|
r = self.call('returntypes/getdate')
|
||||||
assert r == datetime.date(1994, 1, 26) or r == '1994-01-26', r
|
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) \
|
assert r == datetime.datetime(1994, 1, 26, 12) \
|
||||||
or r == '1994-01-26T12:00:00', r
|
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):
|
def test_return_nested(self):
|
||||||
r = self.call('returntypes/getnested')
|
r = self.call('returntypes/getnested')
|
||||||
assert r == {'inner': {'aint': 0}} or r == {'inner': {'aint': '0'}}, r
|
assert r == {'inner': {'aint': 0}} or r == {'inner': {'aint': '0'}}, r
|
||||||
|
|||||||
Reference in New Issue
Block a user