summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoshua Harlow <harlowja@yahoo-inc.com>2015-02-11 16:52:55 -0800
committerJoshua Harlow <harlowja@yahoo-inc.com>2015-02-12 04:55:56 +0000
commit2857ee3b683af2c2e9ef66b886c929e00f4b474d (patch)
tree280d1ab2771090850bb75c99ea0b272f0ea2ca07
parent9f2a2edb56e67e592f52122e54deecef17f2d922 (diff)
downloadoslo-serialization-2857ee3b683af2c2e9ef66b886c929e00f4b474d.tar.gz
Correctly load and dump items with datetime.date(s)
Change-Id: I3fbe21df4b5ac12d13dd8633b7c362aeabbfc94f
-rw-r--r--oslo_serialization/msgpackutils.py20
-rw-r--r--tests/test_msgpackutils.py5
2 files changed, 25 insertions, 0 deletions
diff --git a/oslo_serialization/msgpackutils.py b/oslo_serialization/msgpackutils.py
index ac4f703..5a7f038 100644
--- a/oslo_serialization/msgpackutils.py
+++ b/oslo_serialization/msgpackutils.py
@@ -63,6 +63,22 @@ def _deserialize_datetime(blob):
return dt
+def _serialize_date(d):
+ dct = {
+ 'year': d.year,
+ 'month': d.month,
+ 'day': d.day,
+ }
+ return dumps(dct)
+
+
+def _deserialize_date(blob):
+ dct = loads(blob)
+ return datetime.date(year=dct['year'],
+ month=dct['month'],
+ day=dct['day'])
+
+
def _serializer(obj):
# Applications can assign 0 to 127 to store
# application-specific type information...
@@ -96,6 +112,8 @@ def _serializer(obj):
if isinstance(obj, xmlrpclib.DateTime):
dt = datetime.datetime(*tuple(obj.timetuple())[:6])
return msgpack.ExtType(6, _serialize_datetime(dt))
+ if isinstance(obj, datetime.date):
+ return msgpack.ExtType(7, _serialize_date(obj))
raise TypeError("Unknown type: %r" % (obj,))
@@ -122,6 +140,8 @@ def _unserializer(code, data):
if code == 6:
dt = _deserialize_datetime(data)
return xmlrpclib.DateTime(dt.timetuple())
+ if code == 7:
+ return _deserialize_date(data)
return msgpack.ExtType(code, data)
diff --git a/tests/test_msgpackutils.py b/tests/test_msgpackutils.py
index 8a9f965..1fcd3ac 100644
--- a/tests/test_msgpackutils.py
+++ b/tests/test_msgpackutils.py
@@ -75,6 +75,7 @@ class MsgPackUtilsTestMixin(test_base.BaseTestCase):
'zzz': uuid.uuid4(),
'yyy': 'yyy',
'ddd': b'bbb',
+ 'today': datetime.date.today(),
}
self.assertEqual(_dumps_loads(src), src)
@@ -120,6 +121,10 @@ class MsgPackUtilsTestMixin(test_base.BaseTestCase):
thing = {'ip_addr': netaddr.IPAddress('1.2.3.4')}
self.assertEqual(_dumps_loads(thing), thing)
+ def test_today(self):
+ today = datetime.date.today()
+ self.assertEqual(today, _dumps_loads(today))
+
def test_datetime_tz_clone(self):
eastern = timezone('US/Eastern')
now = datetime.datetime.now()