Nicer error when packing a datetime without tzinfo (#466)

This commit is contained in:
Benjamin Egelund-Müller 2021-11-16 09:49:47 +01:00 committed by GitHub
parent cfa05d3fdc
commit e464cb44fa
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 22 additions and 0 deletions

View file

@ -285,6 +285,8 @@ cdef class Packer(object):
o = self._default(o) o = self._default(o)
default_used = 1 default_used = 1
continue continue
elif self.datetime and PyDateTime_CheckExact(o):
PyErr_Format(ValueError, b"can not serialize '%.200s' object where tzinfo=None", Py_TYPE(o).tp_name)
else: else:
PyErr_Format(TypeError, b"can not serialize '%.200s' object", Py_TYPE(o).tp_name) PyErr_Format(TypeError, b"can not serialize '%.200s' object", Py_TYPE(o).tp_name)
return ret return ret

View file

@ -874,6 +874,10 @@ class Packer(object):
obj = self._default(obj) obj = self._default(obj)
default_used = 1 default_used = 1
continue continue
if self._datetime and check(obj, _DateTime):
raise ValueError("Cannot serialize %r where tzinfo=None" % (obj,))
raise TypeError("Cannot serialize %r" % (obj,)) raise TypeError("Cannot serialize %r" % (obj,))
def pack(self, obj): def pack(self, obj):

View file

@ -140,3 +140,19 @@ def test_issue451():
unpacked = msgpack.unpackb(packed, timestamp=3) unpacked = msgpack.unpackb(packed, timestamp=3)
assert dt == unpacked assert dt == unpacked
@pytest.mark.skipif(sys.version_info[0] == 2, reason="datetime support is PY3+ only")
def test_pack_datetime_without_tzinfo():
dt = datetime.datetime(1970, 1, 1, 0, 0, 42, 14)
with pytest.raises(ValueError, match="where tzinfo=None"):
packed = msgpack.packb(dt, datetime=True)
dt = datetime.datetime(1970, 1, 1, 0, 0, 42, 14)
packed = msgpack.packb(dt, datetime=True, default=lambda x: None)
assert packed == msgpack.packb(None)
dt = datetime.datetime(1970, 1, 1, 0, 0, 42, 14, tzinfo=_utc)
packed = msgpack.packb(dt, datetime=True)
unpacked = msgpack.unpackb(packed, timestamp=3)
assert unpacked == dt