8000 Support packing subclass of dict. · peter80/msgpack-python@4d64389 · GitHub
[go: up one dir, main page]

Skip to content

Commit 4d64389

Browse files
committed
Support packing subclass of dict.
1 parent 5b66eda commit 4d64389

File tree

3 files changed

+50
-3
lines changed

3 files changed

+50
-3
lines changed

ChangeLog.rst

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,14 @@
1+
0.2.3
2+
=======
3+
:release date: in development
4+
5+
Changes
6+
-------
7+
8+
Bugs fixed
9+
-----------
10+
* Can't pack subclass of dict.
11+
112
0.2.2
213
=======
314
:release date: 2012-09-21

msgpack/_msgpack.pyx

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -139,11 +139,19 @@ cdef class Packer(object):
139139
ret = msgpack_pack_raw(&self.pk, len(o))
140140
if ret == 0:
141141
ret = msgpack_pack_raw_body(&self.pk, rawval, len(o))
142-
elif PyDict_Check(o):
142+
elif PyDict_CheckExact(o):
143143
d = <dict>o
144144
ret = msgpack_pack_map(&self.pk, len(d))
145145
if ret == 0:
146< 8000 span class="diff-text-marker">-
for k,v in d.iteritems():
146+
for k, v in d.iteritems():
147+
ret = self._pack(k, nest_limit-1)
148+
if ret != 0: break
149+
ret = self._pack(v, nest_limit-1)
150+
if ret != 0: break
151+
elif PyDict_Check(o):
152+
ret = msgpack_pack_map(&self.pk, len(o))
153+
if ret == 0:
154+
for k, v in o.items():
147155
ret = self._pack(k, nest_limit-1)
148156
if ret != 0: break
149157
ret = self._pack(v, nest_limit-1)
@@ -332,7 +340,9 @@ cdef class Unpacker(object):
332340

333341
def __init__(self, file_like=None, Py_ssize_t read_size=0, bint use_list=0,
334342
object object_hook=None, object list_hook=None,
335-
encoding=None, unicode_errors='strict', int max_buffer_size=0):
343+
encoding=None, unicode_errors='strict', int max_buffer_size=0,
344+
object object_pairs_hook=None,
345+
):
336346
self.use_list = use_list
337347
self.file_like = file_like
338348
if file_like:

test/test_pack.py

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,5 +91,31 @@ def testPackFloat():
9191
assert_equal(packb(1.0, use_single_float=True), b'\xca' + struct.pack('>f', 1.0))
9292
assert_equal(packb(1.0, use_single_float=False), b'\xcb' + struct.pack('>d', 1.0))
9393

94+
95+
class odict(dict):
96+
'''Reimplement OrderedDict to run test on Python 2.6'''
97+
def __init__(self, seq):
98+
self._seq = seq
99+
dict.__init__(self, seq)
100+
101+
def items(self):
102+
return self._seq[:]
103+
104+
def iteritems(self):
105+
return iter(self._seq)
106+
107+
def keys(self):
108+
return [x[0] for x in self._seq]
109+
110+
def test_odict():
111+
seq = [(b'one', 1), (b'two', 2), (b'three', 3), (b'four', 4)]
112+
od = odict(seq)
113+
assert_equal(unpackb(packb(od)), dict(seq))
114+
# After object_pairs_hook is implemented.
115+
#def pair_hook(seq):
116+
# return seq
117+
#assert_equal(unpackb(packb(od), object_pairs_hook=pair_hook), seq)
118+
119+
94120
if __name__ == '__main__':
95121
main()

0 commit comments

Comments
 (0)
0