diff --git a/elasticsearch/exceptions.py b/elasticsearch/exceptions.py index 9da7c71a..a05e8486 100644 --- a/elasticsearch/exceptions.py +++ b/elasticsearch/exceptions.py @@ -2,6 +2,10 @@ class ElastiSearchException(Exception): pass +class SerializationError(ElastiSearchException): + pass + + class TransportError(ElastiSearchException): pass diff --git a/elasticsearch/serializer.py b/elasticsearch/serializer.py new file mode 100644 index 00000000..394bc798 --- /dev/null +++ b/elasticsearch/serializer.py @@ -0,0 +1,24 @@ +import json +from datetime import date, datetime + +from .exceptions import SerializationError + +class JSONSerializer(object): + def default(self, data): + if isinstance(data, (date, datetime)): + return data.isoformat() + raise TypeError + + def loads(self, s): + try: + return json.loads(s) + except ValueError as e: + raise SerializationError(e) + + def dumps(self, data): + try: + return json.dumps(data, default=self.default) + except ValueError as e: + raise SerializationError(e) + + diff --git a/test_elasticsearch/test_serializer.py b/test_elasticsearch/test_serializer.py new file mode 100644 index 00000000..3727c5c9 --- /dev/null +++ b/test_elasticsearch/test_serializer.py @@ -0,0 +1,8 @@ +from datetime import datetime +from unittest import TestCase + +from elasticsearch.serializer import JSONSerializer + +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)}))