diff options
author | Joshua Harlow <harlowja@yahoo-inc.com> | 2015-02-11 16:52:55 -0800 |
---|---|---|
committer | Joshua Harlow <harlowja@yahoo-inc.com> | 2015-02-12 04:55:56 +0000 |
commit | 2857ee3b683af2c2e9ef66b886c929e00f4b474d (patch) | |
tree | 280d1ab2771090850bb75c99ea0b272f0ea2ca07 | |
parent | 9f2a2edb56e67e592f52122e54deecef17f2d922 (diff) | |
download | oslo-serialization-2857ee3b683af2c2e9ef66b886c929e00f4b474d.tar.gz |
Correctly load and dump items with datetime.date(s)
Change-Id: I3fbe21df4b5ac12d13dd8633b7c362aeabbfc94f
-rw-r--r-- | oslo_serialization/msgpackutils.py | 20 | ||||
-rw-r--r-- | tests/test_msgpackutils.py | 5 |
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() |