Decimal support

Currently only converting to floats which may lose some precision.
Not recommended in 2.6 where float to string serialization is sub-optimal
This commit is contained in:
Honza Král
2013-10-22 00:26:58 +02:00
parent 2bb16fe7ed
commit 73f170f23f
2 changed files with 12 additions and 1 deletions
+3
View File
@@ -1,5 +1,6 @@
import json import json
from datetime import date, datetime from datetime import date, datetime
from decimal import Decimal
from .exceptions import SerializationError from .exceptions import SerializationError
@@ -7,6 +8,8 @@ class JSONSerializer(object):
def default(self, data): def default(self, data):
if isinstance(data, (date, datetime)): if isinstance(data, (date, datetime)):
return data.isoformat() return data.isoformat()
elif isinstance(data, Decimal):
return float(data)
raise TypeError raise TypeError
def loads(self, s): def loads(self, s):
+9 -1
View File
@@ -1,14 +1,22 @@
import sys
from datetime import datetime from datetime import datetime
from decimal import Decimal
from elasticsearch.serializer import JSONSerializer from elasticsearch.serializer import JSONSerializer
from elasticsearch.exceptions import SerializationError from elasticsearch.exceptions import SerializationError
from .test_cases import TestCase from .test_cases import TestCase, SkipTest
class TestJSONSerializer(TestCase): class TestJSONSerializer(TestCase):
def test_datetime_serialization(self): def test_datetime_serialization(self):
self.assertEquals(u'{"d": "2010-10-01T02:30:00"}', JSONSerializer().dumps({'d': datetime(2010, 10, 1, 2, 30)})) self.assertEquals(u'{"d": "2010-10-01T02:30:00"}', JSONSerializer().dumps({'d': datetime(2010, 10, 1, 2, 30)}))
def test_decimal_serialization(self):
if sys.version_info[:2] == (2, 6):
raise SkipTest("Float rounding is broken in 2.6.")
self.assertEquals(u'{"d": 3.8}', JSONSerializer().dumps({'d': Decimal('3.8')}))
def test_raises_serialization_error_on_dump_error(self): def test_raises_serialization_error_on_dump_error(self):
self.assertRaises(SerializationError, JSONSerializer().dumps, object()) self.assertRaises(SerializationError, JSONSerializer().dumps, object())