diff options
author | INADA Naoki <songofacandy@gmail.com> | 2014-03-25 12:19:51 +0900 |
---|---|---|
committer | INADA Naoki <songofacandy@gmail.com> | 2014-03-25 12:19:51 +0900 |
commit | ac4cd0684542182c47ea01bad50ff51d72dadb86 (patch) | |
tree | bbab016c2feeb04eac45b90e3141f64ba447b9ba | |
parent | e9de6b7f391a4b5e692af37505c959eaf02943e0 (diff) | |
parent | ee38505db59c55d2d96516274030eed712028039 (diff) | |
download | msgpack-python-ac4cd0684542182c47ea01bad50ff51d72dadb86.tar.gz |
Merge pull request #93 from popravich/unpacker_ext_hook_fix
Unpacker's ext_hook fixed + tests
-rw-r--r-- | msgpack/_unpacker.pyx | 3 | ||||
-rw-r--r-- | test/test_unpack.py | 26 |
2 files changed, 27 insertions, 2 deletions
diff --git a/msgpack/_unpacker.pyx b/msgpack/_unpacker.pyx index 0df6ab3..16de40f 100644 --- a/msgpack/_unpacker.pyx +++ b/msgpack/_unpacker.pyx @@ -207,7 +207,7 @@ cdef class Unpacker(object): cdef object file_like_read cdef Py_ssize_t read_size # To maintain refcnt. - cdef object object_hook, object_pairs_hook, list_hook + cdef object object_hook, object_pairs_hook, list_hook, ext_hook cdef object encoding, unicode_errors cdef size_t max_buffer_size @@ -228,6 +228,7 @@ cdef class Unpacker(object): self.object_hook = object_hook self.object_pairs_hook = object_pairs_hook self.list_hook = list_hook + self.ext_hook = ext_hook self.file_like = file_like if file_like: diff --git a/test/test_unpack.py b/test/test_unpack.py index 544cebf..8d0d949 100644 --- a/test/test_unpack.py +++ b/test/test_unpack.py @@ -1,6 +1,6 @@ from io import BytesIO import sys -from msgpack import Unpacker, packb, OutOfData +from msgpack import Unpacker, packb, OutOfData, ExtType from pytest import raises, mark @@ -42,6 +42,30 @@ def test_unpacker_hook_refcnt(): assert sys.getrefcount(hook) == basecnt +def test_unpacker_ext_hook(): + + class MyUnpacker(Unpacker): + + def __init__(self): + super(MyUnpacker, self).__init__(ext_hook=self._hook, + encoding='utf-8') + + def _hook(self, code, data): + if code == 1: + return int(data) + else: + return ExtType(code, data) + + unpacker = MyUnpacker() + unpacker.feed(packb({'a': 1}, encoding='utf-8')) + assert unpacker.unpack() == {'a': 1} + unpacker.feed(packb({'a': ExtType(1, b'123')}, encoding='utf-8')) + assert unpacker.unpack() == {'a': 123} + unpacker.feed(packb({'a': ExtType(2, b'321')}, encoding='utf-8')) + assert unpacker.unpack() == {'a': ExtType(2, b'321')} + + if __name__ == '__main__': test_unpack_array_header_from_file() test_unpacker_hook_refcnt() + test_unpacker_ext_hook() |