Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion msgpack/_packer.pyx
Original file line number Diff line number Diff line change
Expand Up @@ -160,7 +160,7 @@ cdef class Packer(object):
if ret != 0: break
ret = self._pack(v, nest_limit-1)
if ret != 0: break
elif PyDict_Check(o):
elif PyDict_Check(o) or PyMapping_Check(o):
ret = msgpack_pack_map(&self.pk, len(o))
if ret == 0:
for k, v in o.items():
Expand Down
38 changes: 37 additions & 1 deletion test/test_subtype.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,20 +2,56 @@
# coding: utf-8

from msgpack import packb, unpackb
from collections import namedtuple
from collections import namedtuple, Mapping, MutableMapping

class MyList(list):
pass

class MyDict(dict):
pass

class MyMapping(Mapping):

def __init__(self):
self._map = dict()

def __getitem__(self, key):
return self._map[key]

def __iter__(self):
return iter(self._map)

def __len__(self):
return len(self._map)

class MyMutableMapping(MutableMapping):

def __init__(self):
self._map = dict()

def __getitem__(self, key):
return self._map[key]

def __setitem__(self, key, value):
self._map[key] = value

def __delitem__(self, key):
del(self._map[key])

def __iter__(self):
return iter(self._map)

def __len__(self):
return len(self._map)

class MyTuple(tuple):
pass

MyNamedTuple = namedtuple('MyNamedTuple', 'x y')

def test_types():
assert packb(MyDict()) == packb(dict())
assert packb(MyMapping()) == packb(dict())
assert packb(MyMutableMapping()) == packb(dict())
assert packb(MyList()) == packb(list())
assert packb(MyNamedTuple(1, 2)) == packb((1, 2))