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

View File

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

View File

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