summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAntonio Cuni <anto.cuni@gmail.com>2013-10-18 14:38:52 +0200
committerAntonio Cuni <anto.cuni@gmail.com>2013-10-18 14:38:52 +0200
commit5529dfe59660f3c2fc5058e6fa42b24fe764a255 (patch)
treeebdd12a8a9d3118442b750949dd2876ef3d232b3
parentd61097511a1caa0e3bc5a70c1d2d92f448bd5025 (diff)
downloadmsgpack-python-5529dfe59660f3c2fc5058e6fa42b24fe764a255.tar.gz
kill some duplicate code from unpack/unpackb and move the logic to Unpacker.unpack_one. By doing this we no longer need to make the module-level pack/unpack parametric on the class, because they contain no logic at all
-rw-r--r--msgpack/fallback.py95
-rw-r--r--test/test_extension.py8
2 files changed, 52 insertions, 51 deletions
diff --git a/msgpack/fallback.py b/msgpack/fallback.py
index b7f455b..2c79482 100644
--- a/msgpack/fallback.py
+++ b/msgpack/fallback.py
@@ -62,6 +62,44 @@ EXTENDED_TYPE = 1000
DEFAULT_RECURSE_LIMIT=511
+def pack(o, stream, **kwargs):
+ """
+ Pack object `o` and write it to `stream`
+
+ See :class:`Packer` for options.
+ """
+ packer = Packer(**kwargs)
+ stream.write(packer.pack(o))
+
+def packb(o, **kwargs):
+ """
+ Pack object `o` and return packed bytes
+
+ See :class:`Packer` for options.
+ """
+ return Packer(**kwargs).pack(o)
+
+def unpack(stream, **kwargs):
+ """
+ Unpack an object from `stream`.
+
+ Raises `ExtraData` when `packed` contains extra bytes.
+ See :class:`Unpacker` for options.
+ """
+ unpacker = Unpacker(stream, **kwargs)
+ return unpacker.unpack_one()
+
+def unpackb(packed, **kwargs):
+ """
+ Unpack an object from `packed`.
+
+ Raises `ExtraData` when `packed` contains extra bytes.
+ See :class:`Unpacker` for options.
+ """
+ unpacker = Unpacker(None, **kwargs)
+ unpacker.feed(packed)
+ return unpacker.unpack_one()
+
class Unpacker(object):
"""
Streaming unpacker.
@@ -149,6 +187,15 @@ class Unpacker(object):
raise ValueError("object_pairs_hook and object_hook are mutually "
"exclusive")
+ def unpack_one(self):
+ try:
+ ret = self._fb_unpack()
+ except OutOfData:
+ raise UnpackValueError("Data is not enough.")
+ if self._fb_got_extradata():
+ raise ExtraData(ret, self._fb_get_extradata())
+ return ret
+
def feed(self, next_bytes):
if isinstance(next_bytes, array.array):
next_bytes = next_bytes.tostring()
@@ -579,51 +626,3 @@ class Packer(object):
def reset(self):
self._buffer = StringIO()
-
-def pack(o, stream, Packer=Packer, **kwargs):
- """
- Pack object `o` and write it to `stream`
-
- See :class:`Packer` for options.
- """
- packer = Packer(**kwargs)
- stream.write(packer.pack(o))
-
-def packb(o, Packer=Packer, **kwargs):
- """
- Pack object `o` and return packed bytes
-
- See :class:`Packer` for options.
- """
- return Packer(**kwargs).pack(o)
-
-def unpack(stream, Unpacker=Unpacker, **kwargs):
- """
- Unpack an object from `stream`.
-
- Raises `ExtraData` when `packed` contains extra bytes.
- See :class:`Unpacker` for options.
- """
- unpacker = Unpacker(stream, **kwargs)
- ret = unpacker._fb_unpack()
- if unpacker._fb_got_extradata():
- raise ExtraData(ret, unpacker._fb_get_extradata())
- return ret
-
-def unpackb(packed, Unpacker=Unpacker, **kwargs):
- """
- Unpack an object from `packed`.
-
- Raises `ExtraData` when `packed` contains extra bytes.
- See :class:`Unpacker` for options.
- """
- unpacker = Unpacker(None, **kwargs)
- unpacker.feed(packed)
- try:
- ret = unpacker._fb_unpack()
- except OutOfData:
- raise UnpackValueError("Data is not enough.")
- if unpacker._fb_got_extradata():
- raise ExtraData(ret, unpacker._fb_get_extradata())
- return ret
-
diff --git a/test/test_extension.py b/test/test_extension.py
index 45e6027..0a9c14f 100644
--- a/test/test_extension.py
+++ b/test/test_extension.py
@@ -18,7 +18,9 @@ def test_extension_type():
return obj
obj = [42, 'hello', array.array('d', [1.1, 2.2, 3.3])]
- s = msgpack.packb(obj, MyPacker)
- obj2 = msgpack.unpackb(s, MyUnpacker)
+ packer = MyPacker()
+ unpacker = MyUnpacker(None)
+ s = packer.pack(obj)
+ unpacker.feed(s)
+ obj2 = unpacker.unpack_one()
assert obj == obj2
-