Handle binary and decimal return types

This commit is contained in:
Christophe de Vienne
2011-09-21 13:53:12 +02:00
parent 0df7044bf2
commit db326ab2ea
3 changed files with 38 additions and 1 deletions

View File

@@ -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):

View File

@@ -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'

View File

@@ -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