mirror of
https://github.com/msgpack/msgpack-python.git
synced 2025-10-20 04:13:16 +00:00
Drop Python 3.6 support (#543)
The following steps have been taken: 1. Black was updated to latest version. The code has been formatted with the new version. 2. The pyupgrade utility is installed. This helped to remove all the code that was needed to support Python < 3.7. Fix #541. Co-authored-by: Inada Naoki <songofacandy@gmail.com>
This commit is contained in:
parent
feec06206c
commit
c8d0751fe3
23 changed files with 60 additions and 119 deletions
8
Makefile
8
Makefile
|
@ -1,10 +1,16 @@
|
||||||
|
PYTHON_SOURCES = msgpack test setup.py
|
||||||
|
|
||||||
.PHONY: all
|
.PHONY: all
|
||||||
all: cython
|
all: cython
|
||||||
python setup.py build_ext -i -f
|
python setup.py build_ext -i -f
|
||||||
|
|
||||||
.PHONY: black
|
.PHONY: black
|
||||||
black:
|
black:
|
||||||
black -S msgpack/ test/ setup.py
|
black $(PYTHON_SOURCES)
|
||||||
|
|
||||||
|
.PHONY: pyupgrade
|
||||||
|
pyupgrade:
|
||||||
|
@find $(PYTHON_SOURCES) -name '*.py' -type f -exec pyupgrade --py37-plus '{}' \;
|
||||||
|
|
||||||
.PHONY: cython
|
.PHONY: cython
|
||||||
cython:
|
cython:
|
||||||
|
|
|
@ -1,4 +1,3 @@
|
||||||
# coding: utf-8
|
|
||||||
from .exceptions import *
|
from .exceptions import *
|
||||||
from .ext import ExtType, Timestamp
|
from .ext import ExtType, Timestamp
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,3 @@
|
||||||
# coding: utf-8
|
|
||||||
from collections import namedtuple
|
from collections import namedtuple
|
||||||
import datetime
|
import datetime
|
||||||
import sys
|
import sys
|
||||||
|
@ -15,10 +14,10 @@ class ExtType(namedtuple("ExtType", "code data")):
|
||||||
raise TypeError("data must be bytes")
|
raise TypeError("data must be bytes")
|
||||||
if not 0 <= code <= 127:
|
if not 0 <= code <= 127:
|
||||||
raise ValueError("code must be 0~127")
|
raise ValueError("code must be 0~127")
|
||||||
return super(ExtType, cls).__new__(cls, code, data)
|
return super().__new__(cls, code, data)
|
||||||
|
|
||||||
|
|
||||||
class Timestamp(object):
|
class Timestamp:
|
||||||
"""Timestamp represents the Timestamp extension type in msgpack.
|
"""Timestamp represents the Timestamp extension type in msgpack.
|
||||||
|
|
||||||
When built with Cython, msgpack uses C methods to pack and unpack `Timestamp`. When using pure-Python
|
When built with Cython, msgpack uses C methods to pack and unpack `Timestamp`. When using pure-Python
|
||||||
|
@ -47,24 +46,18 @@ class Timestamp(object):
|
||||||
if not isinstance(nanoseconds, int):
|
if not isinstance(nanoseconds, int):
|
||||||
raise TypeError("nanoseconds must be an integer")
|
raise TypeError("nanoseconds must be an integer")
|
||||||
if not (0 <= nanoseconds < 10**9):
|
if not (0 <= nanoseconds < 10**9):
|
||||||
raise ValueError(
|
raise ValueError("nanoseconds must be a non-negative integer less than 999999999.")
|
||||||
"nanoseconds must be a non-negative integer less than 999999999."
|
|
||||||
)
|
|
||||||
self.seconds = seconds
|
self.seconds = seconds
|
||||||
self.nanoseconds = nanoseconds
|
self.nanoseconds = nanoseconds
|
||||||
|
|
||||||
def __repr__(self):
|
def __repr__(self):
|
||||||
"""String representation of Timestamp."""
|
"""String representation of Timestamp."""
|
||||||
return "Timestamp(seconds={0}, nanoseconds={1})".format(
|
return f"Timestamp(seconds={self.seconds}, nanoseconds={self.nanoseconds})"
|
||||||
self.seconds, self.nanoseconds
|
|
||||||
)
|
|
||||||
|
|
||||||
def __eq__(self, other):
|
def __eq__(self, other):
|
||||||
"""Check for equality with another Timestamp object"""
|
"""Check for equality with another Timestamp object"""
|
||||||
if type(other) is self.__class__:
|
if type(other) is self.__class__:
|
||||||
return (
|
return self.seconds == other.seconds and self.nanoseconds == other.nanoseconds
|
||||||
self.seconds == other.seconds and self.nanoseconds == other.nanoseconds
|
|
||||||
)
|
|
||||||
return False
|
return False
|
||||||
|
|
||||||
def __ne__(self, other):
|
def __ne__(self, other):
|
||||||
|
@ -164,9 +157,7 @@ class Timestamp(object):
|
||||||
:rtype: datetime.
|
:rtype: datetime.
|
||||||
"""
|
"""
|
||||||
utc = datetime.timezone.utc
|
utc = datetime.timezone.utc
|
||||||
return datetime.datetime.fromtimestamp(0, utc) + datetime.timedelta(
|
return datetime.datetime.fromtimestamp(0, utc) + datetime.timedelta(seconds=self.to_unix())
|
||||||
seconds=self.to_unix()
|
|
||||||
)
|
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def from_datetime(dt):
|
def from_datetime(dt):
|
||||||
|
|
|
@ -4,23 +4,6 @@ import sys
|
||||||
import struct
|
import struct
|
||||||
|
|
||||||
|
|
||||||
if sys.version_info < (3, 5):
|
|
||||||
# Ugly hack...
|
|
||||||
RecursionError = RuntimeError
|
|
||||||
|
|
||||||
def _is_recursionerror(e):
|
|
||||||
return (
|
|
||||||
len(e.args) == 1
|
|
||||||
and isinstance(e.args[0], str)
|
|
||||||
and e.args[0].startswith("maximum recursion depth exceeded")
|
|
||||||
)
|
|
||||||
|
|
||||||
else:
|
|
||||||
|
|
||||||
def _is_recursionerror(e):
|
|
||||||
return True
|
|
||||||
|
|
||||||
|
|
||||||
if hasattr(sys, "pypy_version_info"):
|
if hasattr(sys, "pypy_version_info"):
|
||||||
# StringIO is slow on PyPy, StringIO is faster. However: PyPy's own
|
# StringIO is slow on PyPy, StringIO is faster. However: PyPy's own
|
||||||
# StringBuilder is fastest.
|
# StringBuilder is fastest.
|
||||||
|
@ -32,7 +15,7 @@ if hasattr(sys, "pypy_version_info"):
|
||||||
from __pypy__.builders import StringBuilder
|
from __pypy__.builders import StringBuilder
|
||||||
USING_STRINGBUILDER = True
|
USING_STRINGBUILDER = True
|
||||||
|
|
||||||
class StringIO(object):
|
class StringIO:
|
||||||
def __init__(self, s=b""):
|
def __init__(self, s=b""):
|
||||||
if s:
|
if s:
|
||||||
self.builder = StringBuilder(len(s))
|
self.builder = StringBuilder(len(s))
|
||||||
|
@ -109,10 +92,8 @@ def unpackb(packed, **kwargs):
|
||||||
ret = unpacker._unpack()
|
ret = unpacker._unpack()
|
||||||
except OutOfData:
|
except OutOfData:
|
||||||
raise ValueError("Unpack failed: incomplete input")
|
raise ValueError("Unpack failed: incomplete input")
|
||||||
except RecursionError as e:
|
except RecursionError:
|
||||||
if _is_recursionerror(e):
|
raise StackError
|
||||||
raise StackError
|
|
||||||
raise
|
|
||||||
if unpacker._got_extradata():
|
if unpacker._got_extradata():
|
||||||
raise ExtraData(ret, unpacker._get_extradata())
|
raise ExtraData(ret, unpacker._get_extradata())
|
||||||
return ret
|
return ret
|
||||||
|
@ -151,7 +132,7 @@ _MSGPACK_HEADERS = {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
class Unpacker(object):
|
class Unpacker:
|
||||||
"""Streaming unpacker.
|
"""Streaming unpacker.
|
||||||
|
|
||||||
Arguments:
|
Arguments:
|
||||||
|
@ -334,9 +315,7 @@ class Unpacker(object):
|
||||||
if object_pairs_hook is not None and not callable(object_pairs_hook):
|
if object_pairs_hook is not None and not callable(object_pairs_hook):
|
||||||
raise TypeError("`object_pairs_hook` is not callable")
|
raise TypeError("`object_pairs_hook` is not callable")
|
||||||
if object_hook is not None and object_pairs_hook is not None:
|
if object_hook is not None and object_pairs_hook is not None:
|
||||||
raise TypeError(
|
raise TypeError("object_pairs_hook and object_hook are mutually exclusive")
|
||||||
"object_pairs_hook and object_hook are mutually " "exclusive"
|
|
||||||
)
|
|
||||||
if not callable(ext_hook):
|
if not callable(ext_hook):
|
||||||
raise TypeError("`ext_hook` is not callable")
|
raise TypeError("`ext_hook` is not callable")
|
||||||
|
|
||||||
|
@ -428,20 +407,18 @@ class Unpacker(object):
|
||||||
n = b & 0b00011111
|
n = b & 0b00011111
|
||||||
typ = TYPE_RAW
|
typ = TYPE_RAW
|
||||||
if n > self._max_str_len:
|
if n > self._max_str_len:
|
||||||
raise ValueError("%s exceeds max_str_len(%s)" % (n, self._max_str_len))
|
raise ValueError(f"{n} exceeds max_str_len({self._max_str_len})")
|
||||||
obj = self._read(n)
|
obj = self._read(n)
|
||||||
elif b & 0b11110000 == 0b10010000:
|
elif b & 0b11110000 == 0b10010000:
|
||||||
n = b & 0b00001111
|
n = b & 0b00001111
|
||||||
typ = TYPE_ARRAY
|
typ = TYPE_ARRAY
|
||||||
if n > self._max_array_len:
|
if n > self._max_array_len:
|
||||||
raise ValueError(
|
raise ValueError(f"{n} exceeds max_array_len({self._max_array_len})")
|
||||||
"%s exceeds max_array_len(%s)" % (n, self._max_array_len)
|
|
||||||
)
|
|
||||||
elif b & 0b11110000 == 0b10000000:
|
elif b & 0b11110000 == 0b10000000:
|
||||||
n = b & 0b00001111
|
n = b & 0b00001111
|
||||||
typ = TYPE_MAP
|
typ = TYPE_MAP
|
||||||
if n > self._max_map_len:
|
if n > self._max_map_len:
|
||||||
raise ValueError("%s exceeds max_map_len(%s)" % (n, self._max_map_len))
|
raise ValueError(f"{n} exceeds max_map_len({self._max_map_len})")
|
||||||
elif b == 0xC0:
|
elif b == 0xC0:
|
||||||
obj = None
|
obj = None
|
||||||
elif b == 0xC2:
|
elif b == 0xC2:
|
||||||
|
@ -457,7 +434,7 @@ class Unpacker(object):
|
||||||
n = self._buffer[self._buff_i]
|
n = self._buffer[self._buff_i]
|
||||||
self._buff_i += size
|
self._buff_i += size
|
||||||
if n > self._max_bin_len:
|
if n > self._max_bin_len:
|
||||||
raise ValueError("%s exceeds max_bin_len(%s)" % (n, self._max_bin_len))
|
raise ValueError(f"{n} exceeds max_bin_len({self._max_bin_len})")
|
||||||
obj = self._read(n)
|
obj = self._read(n)
|
||||||
elif 0xC7 <= b <= 0xC9:
|
elif 0xC7 <= b <= 0xC9:
|
||||||
size, fmt, typ = _MSGPACK_HEADERS[b]
|
size, fmt, typ = _MSGPACK_HEADERS[b]
|
||||||
|
@ -465,7 +442,7 @@ class Unpacker(object):
|
||||||
L, n = struct.unpack_from(fmt, self._buffer, self._buff_i)
|
L, n = struct.unpack_from(fmt, self._buffer, self._buff_i)
|
||||||
self._buff_i += size
|
self._buff_i += size
|
||||||
if L > self._max_ext_len:
|
if L > self._max_ext_len:
|
||||||
raise ValueError("%s exceeds max_ext_len(%s)" % (L, self._max_ext_len))
|
raise ValueError(f"{L} exceeds max_ext_len({self._max_ext_len})")
|
||||||
obj = self._read(L)
|
obj = self._read(L)
|
||||||
elif 0xCA <= b <= 0xD3:
|
elif 0xCA <= b <= 0xD3:
|
||||||
size, fmt = _MSGPACK_HEADERS[b]
|
size, fmt = _MSGPACK_HEADERS[b]
|
||||||
|
@ -478,9 +455,7 @@ class Unpacker(object):
|
||||||
elif 0xD4 <= b <= 0xD8:
|
elif 0xD4 <= b <= 0xD8:
|
||||||
size, fmt, typ = _MSGPACK_HEADERS[b]
|
size, fmt, typ = _MSGPACK_HEADERS[b]
|
||||||
if self._max_ext_len < size:
|
if self._max_ext_len < size:
|
||||||
raise ValueError(
|
raise ValueError(f"{size} exceeds max_ext_len({self._max_ext_len})")
|
||||||
"%s exceeds max_ext_len(%s)" % (size, self._max_ext_len)
|
|
||||||
)
|
|
||||||
self._reserve(size + 1)
|
self._reserve(size + 1)
|
||||||
n, obj = struct.unpack_from(fmt, self._buffer, self._buff_i)
|
n, obj = struct.unpack_from(fmt, self._buffer, self._buff_i)
|
||||||
self._buff_i += size + 1
|
self._buff_i += size + 1
|
||||||
|
@ -493,7 +468,7 @@ class Unpacker(object):
|
||||||
n = self._buffer[self._buff_i]
|
n = self._buffer[self._buff_i]
|
||||||
self._buff_i += size
|
self._buff_i += size
|
||||||
if n > self._max_str_len:
|
if n > self._max_str_len:
|
||||||
raise ValueError("%s exceeds max_str_len(%s)" % (n, self._max_str_len))
|
raise ValueError(f"{n} exceeds max_str_len({self._max_str_len})")
|
||||||
obj = self._read(n)
|
obj = self._read(n)
|
||||||
elif 0xDC <= b <= 0xDD:
|
elif 0xDC <= b <= 0xDD:
|
||||||
size, fmt, typ = _MSGPACK_HEADERS[b]
|
size, fmt, typ = _MSGPACK_HEADERS[b]
|
||||||
|
@ -501,16 +476,14 @@ class Unpacker(object):
|
||||||
(n,) = struct.unpack_from(fmt, self._buffer, self._buff_i)
|
(n,) = struct.unpack_from(fmt, self._buffer, self._buff_i)
|
||||||
self._buff_i += size
|
self._buff_i += size
|
||||||
if n > self._max_array_len:
|
if n > self._max_array_len:
|
||||||
raise ValueError(
|
raise ValueError(f"{n} exceeds max_array_len({self._max_array_len})")
|
||||||
"%s exceeds max_array_len(%s)" % (n, self._max_array_len)
|
|
||||||
)
|
|
||||||
elif 0xDE <= b <= 0xDF:
|
elif 0xDE <= b <= 0xDF:
|
||||||
size, fmt, typ = _MSGPACK_HEADERS[b]
|
size, fmt, typ = _MSGPACK_HEADERS[b]
|
||||||
self._reserve(size)
|
self._reserve(size)
|
||||||
(n,) = struct.unpack_from(fmt, self._buffer, self._buff_i)
|
(n,) = struct.unpack_from(fmt, self._buffer, self._buff_i)
|
||||||
self._buff_i += size
|
self._buff_i += size
|
||||||
if n > self._max_map_len:
|
if n > self._max_map_len:
|
||||||
raise ValueError("%s exceeds max_map_len(%s)" % (n, self._max_map_len))
|
raise ValueError(f"{n} exceeds max_map_len({self._max_map_len})")
|
||||||
else:
|
else:
|
||||||
raise FormatError("Unknown header: 0x%x" % b)
|
raise FormatError("Unknown header: 0x%x" % b)
|
||||||
return typ, n, obj
|
return typ, n, obj
|
||||||
|
@ -549,17 +522,14 @@ class Unpacker(object):
|
||||||
return
|
return
|
||||||
if self._object_pairs_hook is not None:
|
if self._object_pairs_hook is not None:
|
||||||
ret = self._object_pairs_hook(
|
ret = self._object_pairs_hook(
|
||||||
(self._unpack(EX_CONSTRUCT), self._unpack(EX_CONSTRUCT))
|
(self._unpack(EX_CONSTRUCT), self._unpack(EX_CONSTRUCT)) for _ in range(n)
|
||||||
for _ in range(n)
|
|
||||||
)
|
)
|
||||||
else:
|
else:
|
||||||
ret = {}
|
ret = {}
|
||||||
for _ in range(n):
|
for _ in range(n):
|
||||||
key = self._unpack(EX_CONSTRUCT)
|
key = self._unpack(EX_CONSTRUCT)
|
||||||
if self._strict_map_key and type(key) not in (str, bytes):
|
if self._strict_map_key and type(key) not in (str, bytes):
|
||||||
raise ValueError(
|
raise ValueError("%s is not allowed for map key" % str(type(key)))
|
||||||
"%s is not allowed for map key" % str(type(key))
|
|
||||||
)
|
|
||||||
if type(key) is str:
|
if type(key) is str:
|
||||||
key = sys.intern(key)
|
key = sys.intern(key)
|
||||||
ret[key] = self._unpack(EX_CONSTRUCT)
|
ret[key] = self._unpack(EX_CONSTRUCT)
|
||||||
|
@ -634,7 +604,7 @@ class Unpacker(object):
|
||||||
return self._stream_offset
|
return self._stream_offset
|
||||||
|
|
||||||
|
|
||||||
class Packer(object):
|
class Packer:
|
||||||
"""
|
"""
|
||||||
MessagePack Packer
|
MessagePack Packer
|
||||||
|
|
||||||
|
@ -844,9 +814,9 @@ class Packer(object):
|
||||||
continue
|
continue
|
||||||
|
|
||||||
if self._datetime and check(obj, _DateTime):
|
if self._datetime and check(obj, _DateTime):
|
||||||
raise ValueError("Cannot serialize %r where tzinfo=None" % (obj,))
|
raise ValueError(f"Cannot serialize {obj!r} where tzinfo=None")
|
||||||
|
|
||||||
raise TypeError("Cannot serialize %r" % (obj,))
|
raise TypeError(f"Cannot serialize {obj!r}")
|
||||||
|
|
||||||
def pack(self, obj):
|
def pack(self, obj):
|
||||||
try:
|
try:
|
||||||
|
@ -933,7 +903,7 @@ class Packer(object):
|
||||||
|
|
||||||
def _pack_map_pairs(self, n, pairs, nest_limit=DEFAULT_RECURSE_LIMIT):
|
def _pack_map_pairs(self, n, pairs, nest_limit=DEFAULT_RECURSE_LIMIT):
|
||||||
self._pack_map_header(n)
|
self._pack_map_header(n)
|
||||||
for (k, v) in pairs:
|
for k, v in pairs:
|
||||||
self._pack(k, nest_limit - 1)
|
self._pack(k, nest_limit - 1)
|
||||||
self._pack(v, nest_limit - 1)
|
self._pack(v, nest_limit - 1)
|
||||||
|
|
||||||
|
|
|
@ -6,3 +6,8 @@ requires = [
|
||||||
"setuptools >= 35.0.2",
|
"setuptools >= 35.0.2",
|
||||||
]
|
]
|
||||||
build-backend = "setuptools.build_meta"
|
build-backend = "setuptools.build_meta"
|
||||||
|
|
||||||
|
[tool.black]
|
||||||
|
line-length = 100
|
||||||
|
target-version = ["py37"]
|
||||||
|
skip_string_normalization = true
|
||||||
|
|
|
@ -1,5 +1,7 @@
|
||||||
# Also declared in pyproject.toml, if updating here please also update there
|
# Also declared in pyproject.toml, if updating here please also update there.
|
||||||
Cython~=0.29.30
|
Cython~=0.29.30
|
||||||
|
|
||||||
# dev only tools. no need to add pyproject
|
# Tools required only for development. No need to add it to pyproject.toml file.
|
||||||
black==22.3.0
|
black==23.3.0
|
||||||
|
pytest==7.3.1
|
||||||
|
pyupgrade==3.3.2
|
||||||
|
|
|
@ -17,7 +17,6 @@ project_urls =
|
||||||
|
|
||||||
classifiers =
|
classifiers =
|
||||||
Programming Language :: Python :: 3
|
Programming Language :: Python :: 3
|
||||||
Programming Language :: Python :: 3.6
|
|
||||||
Programming Language :: Python :: 3.7
|
Programming Language :: Python :: 3.7
|
||||||
Programming Language :: Python :: 3.8
|
Programming Language :: Python :: 3.8
|
||||||
Programming Language :: Python :: 3.9
|
Programming Language :: Python :: 3.9
|
||||||
|
|
9
setup.py
9
setup.py
|
@ -1,5 +1,4 @@
|
||||||
#!/usr/bin/env python
|
#!/usr/bin/env python
|
||||||
# coding: utf-8
|
|
||||||
import io
|
import io
|
||||||
import os
|
import os
|
||||||
import sys
|
import sys
|
||||||
|
@ -25,7 +24,7 @@ except ImportError:
|
||||||
|
|
||||||
|
|
||||||
def cythonize(src):
|
def cythonize(src):
|
||||||
sys.stderr.write("cythonize: %r\n" % (src,))
|
sys.stderr.write(f"cythonize: {src!r}\n")
|
||||||
cython_compiler.compile([src], cplus=True)
|
cython_compiler.compile([src], cplus=True)
|
||||||
|
|
||||||
|
|
||||||
|
@ -36,11 +35,7 @@ def ensure_source(src):
|
||||||
if not have_cython:
|
if not have_cython:
|
||||||
raise NoCython
|
raise NoCython
|
||||||
cythonize(pyx)
|
cythonize(pyx)
|
||||||
elif (
|
elif os.path.exists(pyx) and os.stat(src).st_mtime < os.stat(pyx).st_mtime and have_cython:
|
||||||
os.path.exists(pyx)
|
|
||||||
and os.stat(src).st_mtime < os.stat(pyx).st_mtime
|
|
||||||
and have_cython
|
|
||||||
):
|
|
||||||
cythonize(pyx)
|
cythonize(pyx)
|
||||||
return src
|
return src
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,4 @@
|
||||||
#!/usr/bin/env python
|
#!/usr/bin/env python
|
||||||
# coding: utf-8
|
|
||||||
|
|
||||||
import sys
|
import sys
|
||||||
import pytest
|
import pytest
|
||||||
|
|
|
@ -1,11 +1,10 @@
|
||||||
#!/usr/bin/env python
|
#!/usr/bin/env python
|
||||||
# coding: utf-8
|
|
||||||
from msgpack import packb, unpackb
|
from msgpack import packb, unpackb
|
||||||
|
|
||||||
|
|
||||||
def check(length, obj, use_bin_type=True):
|
def check(length, obj, use_bin_type=True):
|
||||||
v = packb(obj, use_bin_type=use_bin_type)
|
v = packb(obj, use_bin_type=use_bin_type)
|
||||||
assert len(v) == length, "%r length should be %r but get %r" % (obj, length, len(v))
|
assert len(v) == length, f"{obj!r} length should be {length!r} but get {len(v)!r}"
|
||||||
assert unpackb(v, use_list=0, raw=not use_bin_type) == obj
|
assert unpackb(v, use_list=0, raw=not use_bin_type) == obj
|
||||||
|
|
||||||
|
|
||||||
|
@ -120,11 +119,11 @@ def test_match():
|
||||||
),
|
),
|
||||||
({}, b"\x80"),
|
({}, b"\x80"),
|
||||||
(
|
(
|
||||||
dict([(x, x) for x in range(15)]),
|
{x: x for x in range(15)},
|
||||||
b"\x8f\x00\x00\x01\x01\x02\x02\x03\x03\x04\x04\x05\x05\x06\x06\x07\x07\x08\x08\t\t\n\n\x0b\x0b\x0c\x0c\r\r\x0e\x0e",
|
b"\x8f\x00\x00\x01\x01\x02\x02\x03\x03\x04\x04\x05\x05\x06\x06\x07\x07\x08\x08\t\t\n\n\x0b\x0b\x0c\x0c\r\r\x0e\x0e",
|
||||||
),
|
),
|
||||||
(
|
(
|
||||||
dict([(x, x) for x in range(16)]),
|
{x: x for x in range(16)},
|
||||||
b"\xde\x00\x10\x00\x00\x01\x01\x02\x02\x03\x03\x04\x04\x05\x05\x06\x06\x07\x07\x08\x08\t\t\n\n\x0b\x0b\x0c\x0c\r\r\x0e\x0e\x0f\x0f",
|
b"\xde\x00\x10\x00\x00\x01\x01\x02\x02\x03\x03\x04\x04\x05\x05\x06\x06\x07\x07\x08\x08\t\t\n\n\x0b\x0b\x0c\x0c\r\r\x0e\x0e\x0f\x0f",
|
||||||
),
|
),
|
||||||
]
|
]
|
||||||
|
|
|
@ -1,5 +1,4 @@
|
||||||
#!/usr/bin/env python
|
#!/usr/bin/env python
|
||||||
# coding: utf-8
|
|
||||||
|
|
||||||
from pytest import raises
|
from pytest import raises
|
||||||
from msgpack import packb, unpackb, Unpacker, FormatError, StackError, OutOfData
|
from msgpack import packb, unpackb, Unpacker, FormatError, StackError, OutOfData
|
||||||
|
|
|
@ -1,4 +1,3 @@
|
||||||
from __future__ import print_function
|
|
||||||
import array
|
import array
|
||||||
import msgpack
|
import msgpack
|
||||||
from msgpack import ExtType
|
from msgpack import ExtType
|
||||||
|
@ -17,9 +16,7 @@ def test_pack_ext_type():
|
||||||
assert p(b"A" * 16) == b"\xd8\x42" + b"A" * 16 # fixext 16
|
assert p(b"A" * 16) == b"\xd8\x42" + b"A" * 16 # fixext 16
|
||||||
assert p(b"ABC") == b"\xc7\x03\x42ABC" # ext 8
|
assert p(b"ABC") == b"\xc7\x03\x42ABC" # ext 8
|
||||||
assert p(b"A" * 0x0123) == b"\xc8\x01\x23\x42" + b"A" * 0x0123 # ext 16
|
assert p(b"A" * 0x0123) == b"\xc8\x01\x23\x42" + b"A" * 0x0123 # ext 16
|
||||||
assert (
|
assert p(b"A" * 0x00012345) == b"\xc9\x00\x01\x23\x45\x42" + b"A" * 0x00012345 # ext 32
|
||||||
p(b"A" * 0x00012345) == b"\xc9\x00\x01\x23\x45\x42" + b"A" * 0x00012345
|
|
||||||
) # ext 32
|
|
||||||
|
|
||||||
|
|
||||||
def test_unpack_ext_type():
|
def test_unpack_ext_type():
|
||||||
|
@ -49,7 +46,7 @@ def test_extension_type():
|
||||||
except AttributeError:
|
except AttributeError:
|
||||||
data = obj.tostring()
|
data = obj.tostring()
|
||||||
return ExtType(typecode, data)
|
return ExtType(typecode, data)
|
||||||
raise TypeError("Unknown type object %r" % (obj,))
|
raise TypeError(f"Unknown type object {obj!r}")
|
||||||
|
|
||||||
def ext_hook(code, data):
|
def ext_hook(code, data):
|
||||||
print("ext_hook called", code, data)
|
print("ext_hook called", code, data)
|
||||||
|
|
|
@ -1,5 +1,4 @@
|
||||||
#!/usr/bin/env python
|
#!/usr/bin/env python
|
||||||
# coding: utf-8
|
|
||||||
|
|
||||||
from msgpack import unpackb
|
from msgpack import unpackb
|
||||||
|
|
||||||
|
@ -25,9 +24,7 @@ def testFixRaw():
|
||||||
|
|
||||||
|
|
||||||
def testFixMap():
|
def testFixMap():
|
||||||
check(
|
check(b"\x82\xc2\x81\xc0\xc0\xc3\x81\xc0\x80", {False: {None: None}, True: {None: {}}})
|
||||||
b"\x82\xc2\x81\xc0\xc0\xc3\x81\xc0\x80", {False: {None: None}, True: {None: {}}}
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
def testUnsignedInt():
|
def testUnsignedInt():
|
||||||
|
|
|
@ -1,6 +1,4 @@
|
||||||
#!/usr/bin/env python
|
#!/usr/bin/env python
|
||||||
# coding: utf-8
|
|
||||||
from __future__ import absolute_import, division, print_function, unicode_literals
|
|
||||||
import pytest
|
import pytest
|
||||||
|
|
||||||
from msgpack import (
|
from msgpack import (
|
||||||
|
|
|
@ -1,5 +1,4 @@
|
||||||
#!/usr/bin/env python
|
#!/usr/bin/env python
|
||||||
# coding: utf-8
|
|
||||||
|
|
||||||
import pytest
|
import pytest
|
||||||
from array import array
|
from array import array
|
||||||
|
|
|
@ -1,5 +1,3 @@
|
||||||
# coding: utf-8
|
|
||||||
|
|
||||||
from msgpack import packb, unpackb, ExtType
|
from msgpack import packb, unpackb, ExtType
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,4 @@
|
||||||
#!/usr/bin/env python
|
#!/usr/bin/env python
|
||||||
# coding: utf-8
|
|
||||||
|
|
||||||
from pytest import raises
|
from pytest import raises
|
||||||
from msgpack import packb, unpackb
|
from msgpack import packb, unpackb
|
||||||
|
|
|
@ -1,6 +1,4 @@
|
||||||
#!/usr/bin/env python
|
#!/usr/bin/env python
|
||||||
# coding: utf-8
|
|
||||||
from __future__ import absolute_import, division, print_function, unicode_literals
|
|
||||||
|
|
||||||
from collections import OrderedDict
|
from collections import OrderedDict
|
||||||
from io import BytesIO
|
from io import BytesIO
|
||||||
|
@ -81,9 +79,7 @@ def testPackByteArrays():
|
||||||
|
|
||||||
|
|
||||||
def testIgnoreUnicodeErrors():
|
def testIgnoreUnicodeErrors():
|
||||||
re = unpackb(
|
re = unpackb(packb(b"abc\xeddef", use_bin_type=False), raw=False, unicode_errors="ignore")
|
||||||
packb(b"abc\xeddef", use_bin_type=False), raw=False, unicode_errors="ignore"
|
|
||||||
)
|
|
||||||
assert re == "abcdef"
|
assert re == "abcdef"
|
||||||
|
|
||||||
|
|
||||||
|
@ -108,8 +104,8 @@ def testDecodeBinary():
|
||||||
|
|
||||||
|
|
||||||
def testPackFloat():
|
def testPackFloat():
|
||||||
assert packb(1.0, use_single_float=True) == b"\xca" + struct.pack(str(">f"), 1.0)
|
assert packb(1.0, use_single_float=True) == b"\xca" + struct.pack(">f", 1.0)
|
||||||
assert packb(1.0, use_single_float=False) == b"\xcb" + struct.pack(str(">d"), 1.0)
|
assert packb(1.0, use_single_float=False) == b"\xcb" + struct.pack(">d", 1.0)
|
||||||
|
|
||||||
|
|
||||||
def testArraySize(sizes=[0, 5, 50, 1000]):
|
def testArraySize(sizes=[0, 5, 50, 1000]):
|
||||||
|
@ -154,7 +150,7 @@ def testMapSize(sizes=[0, 5, 50, 1000]):
|
||||||
bio.seek(0)
|
bio.seek(0)
|
||||||
unpacker = Unpacker(bio, strict_map_key=False)
|
unpacker = Unpacker(bio, strict_map_key=False)
|
||||||
for size in sizes:
|
for size in sizes:
|
||||||
assert unpacker.unpack() == dict((i, i * 2) for i in range(size))
|
assert unpacker.unpack() == {i: i * 2 for i in range(size)}
|
||||||
|
|
||||||
|
|
||||||
def test_odict():
|
def test_odict():
|
||||||
|
|
|
@ -1,5 +1,4 @@
|
||||||
#!/usr/bin/env python
|
#!/usr/bin/env python
|
||||||
# coding: utf-8
|
|
||||||
|
|
||||||
import io
|
import io
|
||||||
import msgpack
|
import msgpack
|
||||||
|
|
|
@ -1,5 +1,4 @@
|
||||||
#!/usr/bin/env python
|
#!/usr/bin/env python
|
||||||
# coding: utf-8
|
|
||||||
import io
|
import io
|
||||||
from msgpack import Unpacker, BufferFull
|
from msgpack import Unpacker, BufferFull
|
||||||
from msgpack import pack, packb
|
from msgpack import pack, packb
|
||||||
|
|
|
@ -1,5 +1,3 @@
|
||||||
# coding: utf-8
|
|
||||||
|
|
||||||
from collections import namedtuple
|
from collections import namedtuple
|
||||||
from msgpack import packb, unpackb, ExtType
|
from msgpack import packb, unpackb, ExtType
|
||||||
|
|
||||||
|
@ -10,7 +8,7 @@ def test_namedtuple():
|
||||||
def default(o):
|
def default(o):
|
||||||
if isinstance(o, T):
|
if isinstance(o, T):
|
||||||
return dict(o._asdict())
|
return dict(o._asdict())
|
||||||
raise TypeError("Unsupported type %s" % (type(o),))
|
raise TypeError(f"Unsupported type {type(o)}")
|
||||||
|
|
||||||
packed = packb(T(1, 42), strict_types=True, use_bin_type=True, default=default)
|
packed = packb(T(1, 42), strict_types=True, use_bin_type=True, default=default)
|
||||||
unpacked = unpackb(packed, raw=False)
|
unpacked = unpackb(packed, raw=False)
|
||||||
|
@ -23,7 +21,7 @@ def test_tuple():
|
||||||
def default(o):
|
def default(o):
|
||||||
if isinstance(o, tuple):
|
if isinstance(o, tuple):
|
||||||
return {"__type__": "tuple", "value": list(o)}
|
return {"__type__": "tuple", "value": list(o)}
|
||||||
raise TypeError("Unsupported type %s" % (type(o),))
|
raise TypeError(f"Unsupported type {type(o)}")
|
||||||
|
|
||||||
def convert(o):
|
def convert(o):
|
||||||
if o.get("__type__") == "tuple":
|
if o.get("__type__") == "tuple":
|
||||||
|
@ -44,9 +42,7 @@ def test_tuple_ext():
|
||||||
def default(o):
|
def default(o):
|
||||||
if isinstance(o, tuple):
|
if isinstance(o, tuple):
|
||||||
# Convert to list and pack
|
# Convert to list and pack
|
||||||
payload = packb(
|
payload = packb(list(o), strict_types=True, use_bin_type=True, default=default)
|
||||||
list(o), strict_types=True, use_bin_type=True, default=default
|
|
||||||
)
|
|
||||||
return ExtType(MSGPACK_EXT_TYPE_TUPLE, payload)
|
return ExtType(MSGPACK_EXT_TYPE_TUPLE, payload)
|
||||||
raise TypeError(repr(o))
|
raise TypeError(repr(o))
|
||||||
|
|
||||||
|
@ -54,7 +50,7 @@ def test_tuple_ext():
|
||||||
if code == MSGPACK_EXT_TYPE_TUPLE:
|
if code == MSGPACK_EXT_TYPE_TUPLE:
|
||||||
# Unpack and convert to tuple
|
# Unpack and convert to tuple
|
||||||
return tuple(unpackb(payload, raw=False, ext_hook=convert))
|
return tuple(unpackb(payload, raw=False, ext_hook=convert))
|
||||||
raise ValueError("Unknown Ext code {}".format(code))
|
raise ValueError(f"Unknown Ext code {code}")
|
||||||
|
|
||||||
data = packb(t, strict_types=True, use_bin_type=True, default=default)
|
data = packb(t, strict_types=True, use_bin_type=True, default=default)
|
||||||
expected = unpackb(data, raw=False, ext_hook=convert)
|
expected = unpackb(data, raw=False, ext_hook=convert)
|
||||||
|
|
|
@ -1,5 +1,4 @@
|
||||||
#!/usr/bin/env python
|
#!/usr/bin/env python
|
||||||
# coding: utf-8
|
|
||||||
|
|
||||||
from msgpack import packb, unpackb
|
from msgpack import packb, unpackb
|
||||||
from collections import namedtuple
|
from collections import namedtuple
|
||||||
|
|
|
@ -52,7 +52,7 @@ def test_unpacker_hook_refcnt():
|
||||||
def test_unpacker_ext_hook():
|
def test_unpacker_ext_hook():
|
||||||
class MyUnpacker(Unpacker):
|
class MyUnpacker(Unpacker):
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
super(MyUnpacker, self).__init__(ext_hook=self._hook, raw=False)
|
super().__init__(ext_hook=self._hook, raw=False)
|
||||||
|
|
||||||
def _hook(self, code, data):
|
def _hook(self, code, data):
|
||||||
if code == 1:
|
if code == 1:
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue