Skip to content

Commit d845b65

Browse files
Nicer error when packing a datetime without tzinfo
1 parent 4ace82f commit d845b65

File tree

3 files changed

+17
-2
lines changed

3 files changed

+17
-2
lines changed

msgpack/_packer.pyx

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -274,7 +274,9 @@ cdef class Packer(object):
274274
if ret == 0:
275275
ret = msgpack_pack_raw_body(&self.pk, <char*>view.buf, L)
276276
PyBuffer_Release(&view);
277-
elif self.datetime and PyDateTime_CheckExact(o) and datetime_tzinfo(o) is not None:
277+
elif self.datetime and PyDateTime_CheckExact(o):
278+
if datetime_tzinfo(o) is None:
279+
PyErr_Format(ValueError, b"can not serialize '%.200s' object where tzinfo=None", Py_TYPE(o).tp_name)
278280
delta = o - epoch
279281
if not PyDelta_CheckExact(delta):
280282
raise ValueError("failed to calculate delta")

msgpack/fallback.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -865,7 +865,9 @@ def _pack(
865865
len(obj), dict_iteritems(obj), nest_limit - 1
866866
)
867867

868-
if self._datetime and check(obj, _DateTime) and obj.tzinfo is not None:
868+
if self._datetime and check(obj, _DateTime):
869+
if obj.tzinfo is None:
870+
raise ValueError("Cannot serialize %r where tzinfo=None" % (obj,))
869871
obj = Timestamp.from_datetime(obj)
870872
default_used = 1
871873
continue

test/test_timestamp.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -140,3 +140,14 @@ def test_issue451():
140140

141141
unpacked = msgpack.unpackb(packed, timestamp=3)
142142
assert dt == unpacked
143+
144+
@pytest.mark.skipif(sys.version_info[0] == 2, reason="datetime support is PY3+ only")
145+
def test_pack_datetime_without_tzinfo():
146+
dt = datetime.datetime(1970, 1, 1, 0, 0, 42, 14)
147+
with pytest.raises(ValueError, match="where tzinfo=None"):
148+
packed = msgpack.packb(dt, datetime=True)
149+
150+
dt = datetime.datetime(1970, 1, 1, 0, 0, 42, 14, tzinfo=_utc)
151+
packed = msgpack.packb(dt, datetime=True)
152+
unpacked = msgpack.unpackb(packed, timestamp=3)
153+
assert unpacked == dt

0 commit comments

Comments
 (0)