Fix date serialization (#873)

* [panoramix] -> [dashed]

* merge from caravel/master

* Updated from airbnb

* Cleaning

* Rebase with upstream/master

* merge from caravel/master

* Updated from airbnb

* Cleaning

* Manual rebase

* Last pending change to rebase

* Convert date to datetime before serialization.
Approach choosen: transform data before serialize and keep just one way to serialize

* Unit test created

* stupid error :(

* remove uneeded code and rename test

* Avoid double type checking
Test updated
note: isinstance(<datetime>, <date>) == True, check order changed

* Increase coverage

* Fix assertRaises
This commit is contained in:
Gustavo Brian 2016-08-11 08:13:59 +02:00 committed by Maxime Beauchemin
parent 2bfb9cc7dd
commit 198226a39f
2 changed files with 22 additions and 1 deletions

View File

@ -4,7 +4,7 @@ from __future__ import division
from __future__ import print_function
from __future__ import unicode_literals
from datetime import datetime
from datetime import datetime, date
import decimal
import functools
import json
@ -318,6 +318,8 @@ def json_int_dttm_ser(obj):
return val
if isinstance(obj, datetime):
obj = (obj - EPOCH).total_seconds() * 1000
elif isinstance(obj, date):
obj = (obj - EPOCH.date()).total_seconds() * 1000
else:
raise TypeError(
"Unserializable object {} of type {}".format(obj, type(obj))

19
tests/utils_tests.py Normal file
View File

@ -0,0 +1,19 @@
from datetime import datetime, date, timedelta
from caravel import utils
import unittest
class UtilsTestCase(unittest.TestCase):
def test_json_int_dttm_ser(self):
today = date.today()
now = datetime.now()
ms = utils.json_int_dttm_ser(today)
deser = (utils.EPOCH + timedelta(milliseconds=ms)).date()
assert today == deser, "Serialization error: %s is not %s" % (str(today), str(deser))
ms = utils.json_int_dttm_ser(now)
deser = (utils.EPOCH + timedelta(milliseconds=ms))
assert now == deser, "Serialization error: %s is not %s" % (str(now), str(deser))
with self.assertRaises(TypeError):
utils.json_int_dttm_ser("this is not a date")