@@ -42,11 +42,11 @@ def getvalue(self):
4242 newlist_hint = lambda size : []
4343
4444from msgpack .exceptions import (
45- BufferFull ,
46- OutOfData ,
47- UnpackValueError ,
48- PackValueError ,
49- ExtraData )
45+ BufferFull ,
46+ OutOfData ,
47+ UnpackValueError ,
48+ PackValueError ,
49+ ExtraData )
5050
5151from msgpack import ExtType
5252
@@ -65,6 +65,7 @@ def getvalue(self):
6565
6666DEFAULT_RECURSE_LIMIT = 511
6767
68+
6869def unpack (stream , ** kwargs ):
6970 """
7071 Unpack an object from `stream`.
@@ -78,6 +79,7 @@ def unpack(stream, **kwargs):
7879 raise ExtraData (ret , unpacker ._fb_get_extradata ())
7980 return ret
8081
82+
8183def unpackb (packed , ** kwargs ):
8284 """
8385 Unpack an object from `packed`.
@@ -95,6 +97,7 @@ def unpackb(packed, **kwargs):
9597 raise ExtraData (ret , unpacker ._fb_get_extradata ())
9698 return ret
9799
100+
98101class Unpacker (object ):
99102 """
100103 Streaming unpacker.
@@ -548,8 +551,8 @@ def _pack(self, obj, nest_limit=DEFAULT_RECURSE_LIMIT, isinstance=isinstance):
548551 if isinstance (obj , Unicode ):
549552 if self ._encoding is None :
550553 raise TypeError (
551- "Can't encode unicode string: "
552- "no encoding is specified" )
554+ "Can't encode unicode string: "
555+ "no encoding is specified" )
553556 obj = obj .encode (self ._encoding , self ._unicode_errors )
554557 n = len (obj )
555558 if n <= 0x1f :
@@ -616,6 +619,35 @@ def pack_map_header(self, n):
616619 self ._buffer = StringIO (ret )
617620 return ret
618621
622+ def pack_ext_type (self , typecode , data ):
623+ if not isinstance (typecode , int ):
624+ raise TypeError ("typecode must have int type." )
625+ if not 0 <= typecode <= 127 :
626+ raise ValueError ("typecode should be 0-127" )
627+ if not isinstance (data , bytes ):
628+ raise TypeError ("data must have bytes type" )
629+ L = len (data )
630+ if L > 0xffffffff :
631+ raise ValueError ("Too large data" )
632+ if L == 1 :
633+ self ._buffer .write (b'\xd4 ' )
634+ elif L == 2 :
635+ self ._buffer .write (b'\xd5 ' )
636+ elif L == 4 :
637+ self ._buffer .write (b'\xd6 ' )
638+ elif L == 8 :
639+ self ._buffer .write (b'\xd7 ' )
640+ elif L == 16 :
641+ self ._buffer .write (b'\xd8 ' )
642+ elif L <= 0xff :
643+ self ._buffer .write (b'\xc7 ' + struct .pack ('B' , L ))
644+ elif L <= 0xffff :
645+ self ._buffer .write (b'\xc8 ' + struct .pack ('>H' , L ))
646+ else :
647+ self ._buffer .write (b'\xc9 ' + struct .pack ('>I' , L ))
648+ self ._buffer .write (struct .pack ('B' , typecode ))
649+ self ._buffer .write (data )
650+
619651 def _fb_pack_array_header (self , n ):
620652 if n <= 0x0f :
621653 return self ._buffer .write (struct .pack ('B' , 0x90 + n ))
0 commit comments