Support packing subclass of dict.

This commit is contained in:
INADA Naoki 2012-09-23 02:13:32 +09:00
parent 5b66edaa15
commit 4d643894a1
3 changed files with 50 additions and 3 deletions

View file

@ -1,3 +1,14 @@
0.2.3
=======
:release date: in development
Changes
-------
Bugs fixed
-----------
* Can't pack subclass of dict.
0.2.2
=======
:release date: 2012-09-21

View file

@ -139,7 +139,7 @@ cdef class Packer(object):
ret = msgpack_pack_raw(&self.pk, len(o))
if ret == 0:
ret = msgpack_pack_raw_body(&self.pk, rawval, len(o))
elif PyDict_Check(o):
elif PyDict_CheckExact(o):
d = <dict>o
ret = msgpack_pack_map(&self.pk, len(d))
if ret == 0:
@ -148,6 +148,14 @@ cdef class Packer(object):
if ret != 0: break
ret = self._pack(v, nest_limit-1)
if ret != 0: break
elif PyDict_Check(o):
ret = msgpack_pack_map(&self.pk, len(o))
if ret == 0:
for k, v in o.items():
ret = self._pack(k, nest_limit-1)
if ret != 0: break
ret = self._pack(v, nest_limit-1)
if ret != 0: break
elif PyTuple_Check(o) or PyList_Check(o):
ret = msgpack_pack_array(&self.pk, len(o))
if ret == 0:
@ -332,7 +340,9 @@ cdef class Unpacker(object):
def __init__(self, file_like=None, Py_ssize_t read_size=0, bint use_list=0,
object object_hook=None, object list_hook=None,
encoding=None, unicode_errors='strict', int max_buffer_size=0):
encoding=None, unicode_errors='strict', int max_buffer_size=0,
object object_pairs_hook=None,
):
self.use_list = use_list
self.file_like = file_like
if file_like:

View file

@ -91,5 +91,31 @@ def testPackFloat():
assert_equal(packb(1.0, use_single_float=True), b'\xca' + struct.pack('>f', 1.0))
assert_equal(packb(1.0, use_single_float=False), b'\xcb' + struct.pack('>d', 1.0))
class odict(dict):
'''Reimplement OrderedDict to run test on Python 2.6'''
def __init__(self, seq):
self._seq = seq
dict.__init__(self, seq)
def items(self):
return self._seq[:]
def iteritems(self):
return iter(self._seq)
def keys(self):
return [x[0] for x in self._seq]
def test_odict():
seq = [(b'one', 1), (b'two', 2), (b'three', 3), (b'four', 4)]
od = odict(seq)
assert_equal(unpackb(packb(od)), dict(seq))
# After object_pairs_hook is implemented.
#def pair_hook(seq):
# return seq
#assert_equal(unpackb(packb(od), object_pairs_hook=pair_hook), seq)
if __name__ == '__main__':
main()