From 73f170f23f2741fd72d50471680e2de104991f3e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Honza=20Kr=C3=A1l?= Date: Tue, 22 Oct 2013 00:26:58 +0200 Subject: [PATCH] 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 --- elasticsearch/serializer.py | 3 +++ test_elasticsearch/test_serializer.py | 10 +++++++++- 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/elasticsearch/serializer.py b/elasticsearch/serializer.py index cbf0a2d7..970db113 100644 --- a/elasticsearch/serializer.py +++ b/elasticsearch/serializer.py @@ -1,5 +1,6 @@ import json from datetime import date, datetime +from decimal import Decimal from .exceptions import SerializationError @@ -7,6 +8,8 @@ class JSONSerializer(object): def default(self, data): if isinstance(data, (date, datetime)): return data.isoformat() + elif isinstance(data, Decimal): + return float(data) raise TypeError def loads(self, s): diff --git a/test_elasticsearch/test_serializer.py b/test_elasticsearch/test_serializer.py index 061a0048..a6aad0dc 100644 --- a/test_elasticsearch/test_serializer.py +++ b/test_elasticsearch/test_serializer.py @@ -1,14 +1,22 @@ +import sys + from datetime import datetime +from decimal import Decimal from elasticsearch.serializer import JSONSerializer from elasticsearch.exceptions import SerializationError -from .test_cases import TestCase +from .test_cases import TestCase, SkipTest class TestJSONSerializer(TestCase): def test_datetime_serialization(self): 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): self.assertRaises(SerializationError, JSONSerializer().dumps, object())