mirror of
https://github.com/msgpack/msgpack-python.git
synced 2025-10-28 08:04:12 +00:00
Drop python2 support (#519)
The PR removes python2 references and cases. Close #518 Co-authored-by: Inada Naoki <songofacandy@gmail.com>
This commit is contained in:
parent
45f848695c
commit
feec06206c
17 changed files with 58 additions and 143 deletions
|
|
@ -220,9 +220,9 @@ and `raw=True` options.
|
||||||
|
|
||||||
```pycon
|
```pycon
|
||||||
>>> import msgpack
|
>>> import msgpack
|
||||||
>>> msgpack.unpackb(msgpack.packb([b'spam', u'eggs'], use_bin_type=False), raw=True)
|
>>> msgpack.unpackb(msgpack.packb([b'spam', 'eggs'], use_bin_type=False), raw=True)
|
||||||
[b'spam', b'eggs']
|
[b'spam', b'eggs']
|
||||||
>>> msgpack.unpackb(msgpack.packb([b'spam', u'eggs'], use_bin_type=True), raw=False)
|
>>> msgpack.unpackb(msgpack.packb([b'spam', 'eggs'], use_bin_type=True), raw=False)
|
||||||
[b'spam', 'eggs']
|
[b'spam', 'eggs']
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
|
||||||
20
docs/conf.py
20
docs/conf.py
|
|
@ -40,8 +40,8 @@ source_suffix = ".rst"
|
||||||
master_doc = "index"
|
master_doc = "index"
|
||||||
|
|
||||||
# General information about the project.
|
# General information about the project.
|
||||||
project = u"msgpack"
|
project = "msgpack"
|
||||||
copyright = u"Inada Naoki"
|
copyright = "Inada Naoki"
|
||||||
|
|
||||||
# The version info for the project you're documenting, acts as replacement for
|
# The version info for the project you're documenting, acts as replacement for
|
||||||
# |version| and |release|, also used in various other places throughout the
|
# |version| and |release|, also used in various other places throughout the
|
||||||
|
|
@ -181,7 +181,7 @@ latex_elements = {
|
||||||
# Grouping the document tree into LaTeX files. List of tuples
|
# Grouping the document tree into LaTeX files. List of tuples
|
||||||
# (source start file, target name, title, author, documentclass [howto/manual]).
|
# (source start file, target name, title, author, documentclass [howto/manual]).
|
||||||
latex_documents = [
|
latex_documents = [
|
||||||
("index", "msgpack.tex", u"msgpack Documentation", u"Author", "manual"),
|
("index", "msgpack.tex", "msgpack Documentation", "Author", "manual"),
|
||||||
]
|
]
|
||||||
|
|
||||||
# The name of an image file (relative to this directory) to place at the top of
|
# The name of an image file (relative to this directory) to place at the top of
|
||||||
|
|
@ -209,7 +209,7 @@ latex_documents = [
|
||||||
|
|
||||||
# One entry per manual page. List of tuples
|
# One entry per manual page. List of tuples
|
||||||
# (source start file, name, description, authors, manual section).
|
# (source start file, name, description, authors, manual section).
|
||||||
man_pages = [("index", "msgpack", u"msgpack Documentation", [u"Author"], 1)]
|
man_pages = [("index", "msgpack", "msgpack Documentation", ["Author"], 1)]
|
||||||
|
|
||||||
# If true, show URL addresses after external links.
|
# If true, show URL addresses after external links.
|
||||||
# man_show_urls = False
|
# man_show_urls = False
|
||||||
|
|
@ -224,8 +224,8 @@ texinfo_documents = [
|
||||||
(
|
(
|
||||||
"index",
|
"index",
|
||||||
"msgpack",
|
"msgpack",
|
||||||
u"msgpack Documentation",
|
"msgpack Documentation",
|
||||||
u"Author",
|
"Author",
|
||||||
"msgpack",
|
"msgpack",
|
||||||
"One line description of project.",
|
"One line description of project.",
|
||||||
"Miscellaneous",
|
"Miscellaneous",
|
||||||
|
|
@ -245,10 +245,10 @@ texinfo_documents = [
|
||||||
# -- Options for Epub output ---------------------------------------------------
|
# -- Options for Epub output ---------------------------------------------------
|
||||||
|
|
||||||
# Bibliographic Dublin Core info.
|
# Bibliographic Dublin Core info.
|
||||||
epub_title = u"msgpack"
|
epub_title = "msgpack"
|
||||||
epub_author = u"Author"
|
epub_author = "Author"
|
||||||
epub_publisher = u"Author"
|
epub_publisher = "Author"
|
||||||
epub_copyright = u"2013, Author"
|
epub_copyright = "2013, Author"
|
||||||
|
|
||||||
# The language of the text. It defaults to the language option
|
# The language of the text. It defaults to the language option
|
||||||
# or en if the language is not set.
|
# or en if the language is not set.
|
||||||
|
|
|
||||||
|
|
@ -10,7 +10,7 @@ version = (1, 0, 5)
|
||||||
__version__ = "1.0.5"
|
__version__ = "1.0.5"
|
||||||
|
|
||||||
|
|
||||||
if os.environ.get("MSGPACK_PUREPYTHON") or sys.version_info[0] == 2:
|
if os.environ.get("MSGPACK_PUREPYTHON"):
|
||||||
from .fallback import Packer, unpackb, Unpacker
|
from .fallback import Packer, unpackb, Unpacker
|
||||||
else:
|
else:
|
||||||
try:
|
try:
|
||||||
|
|
|
||||||
|
|
@ -98,7 +98,6 @@ cdef class Packer(object):
|
||||||
If set to true, datetime with tzinfo is packed into Timestamp type.
|
If set to true, datetime with tzinfo is packed into Timestamp type.
|
||||||
Note that the tzinfo is stripped in the timestamp.
|
Note that the tzinfo is stripped in the timestamp.
|
||||||
You can get UTC datetime with `timestamp=3` option of the Unpacker.
|
You can get UTC datetime with `timestamp=3` option of the Unpacker.
|
||||||
(Python 2 is not supported).
|
|
||||||
|
|
||||||
:param str unicode_errors:
|
:param str unicode_errors:
|
||||||
The error handler for encoding unicode. (default: 'strict')
|
The error handler for encoding unicode. (default: 'strict')
|
||||||
|
|
|
||||||
|
|
@ -236,7 +236,7 @@ cdef class Unpacker(object):
|
||||||
0 - Timestamp
|
0 - Timestamp
|
||||||
1 - float (Seconds from the EPOCH)
|
1 - float (Seconds from the EPOCH)
|
||||||
2 - int (Nanoseconds from the EPOCH)
|
2 - int (Nanoseconds from the EPOCH)
|
||||||
3 - datetime.datetime (UTC). Python 2 is not supported.
|
3 - datetime.datetime (UTC).
|
||||||
|
|
||||||
:param bool strict_map_key:
|
:param bool strict_map_key:
|
||||||
If true (default), only str or bytes are accepted for map (dict) keys.
|
If true (default), only str or bytes are accepted for map (dict) keys.
|
||||||
|
|
|
||||||
|
|
@ -5,19 +5,6 @@ import sys
|
||||||
import struct
|
import struct
|
||||||
|
|
||||||
|
|
||||||
PY2 = sys.version_info[0] == 2
|
|
||||||
|
|
||||||
if PY2:
|
|
||||||
int_types = (int, long)
|
|
||||||
_utc = None
|
|
||||||
else:
|
|
||||||
int_types = int
|
|
||||||
try:
|
|
||||||
_utc = datetime.timezone.utc
|
|
||||||
except AttributeError:
|
|
||||||
_utc = datetime.timezone(datetime.timedelta(0))
|
|
||||||
|
|
||||||
|
|
||||||
class ExtType(namedtuple("ExtType", "code data")):
|
class ExtType(namedtuple("ExtType", "code data")):
|
||||||
"""ExtType represents ext type in msgpack."""
|
"""ExtType represents ext type in msgpack."""
|
||||||
|
|
||||||
|
|
@ -55,9 +42,9 @@ class Timestamp(object):
|
||||||
|
|
||||||
Note: Negative times (before the UNIX epoch) are represented as negative seconds + positive ns.
|
Note: Negative times (before the UNIX epoch) are represented as negative seconds + positive ns.
|
||||||
"""
|
"""
|
||||||
if not isinstance(seconds, int_types):
|
if not isinstance(seconds, int):
|
||||||
raise TypeError("seconds must be an integer")
|
raise TypeError("seconds must be an integer")
|
||||||
if not isinstance(nanoseconds, int_types):
|
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(
|
||||||
|
|
@ -174,11 +161,10 @@ class Timestamp(object):
|
||||||
def to_datetime(self):
|
def to_datetime(self):
|
||||||
"""Get the timestamp as a UTC datetime.
|
"""Get the timestamp as a UTC datetime.
|
||||||
|
|
||||||
Python 2 is not supported.
|
|
||||||
|
|
||||||
:rtype: datetime.
|
:rtype: datetime.
|
||||||
"""
|
"""
|
||||||
return datetime.datetime.fromtimestamp(0, _utc) + datetime.timedelta(
|
utc = datetime.timezone.utc
|
||||||
|
return datetime.datetime.fromtimestamp(0, utc) + datetime.timedelta(
|
||||||
seconds=self.to_unix()
|
seconds=self.to_unix()
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
@ -186,8 +172,6 @@ class Timestamp(object):
|
||||||
def from_datetime(dt):
|
def from_datetime(dt):
|
||||||
"""Create a Timestamp from datetime with tzinfo.
|
"""Create a Timestamp from datetime with tzinfo.
|
||||||
|
|
||||||
Python 2 is not supported.
|
|
||||||
|
|
||||||
:rtype: Timestamp
|
:rtype: Timestamp
|
||||||
"""
|
"""
|
||||||
return Timestamp.from_unix(dt.timestamp())
|
return Timestamp.from_unix(dt.timestamp())
|
||||||
|
|
|
||||||
|
|
@ -4,22 +4,6 @@ import sys
|
||||||
import struct
|
import struct
|
||||||
|
|
||||||
|
|
||||||
PY2 = sys.version_info[0] == 2
|
|
||||||
if PY2:
|
|
||||||
int_types = (int, long)
|
|
||||||
|
|
||||||
def dict_iteritems(d):
|
|
||||||
return d.iteritems()
|
|
||||||
|
|
||||||
else:
|
|
||||||
int_types = int
|
|
||||||
unicode = str
|
|
||||||
xrange = range
|
|
||||||
|
|
||||||
def dict_iteritems(d):
|
|
||||||
return d.items()
|
|
||||||
|
|
||||||
|
|
||||||
if sys.version_info < (3, 5):
|
if sys.version_info < (3, 5):
|
||||||
# Ugly hack...
|
# Ugly hack...
|
||||||
RecursionError = RuntimeError
|
RecursionError = RuntimeError
|
||||||
|
|
@ -134,15 +118,6 @@ def unpackb(packed, **kwargs):
|
||||||
return ret
|
return ret
|
||||||
|
|
||||||
|
|
||||||
if sys.version_info < (2, 7, 6):
|
|
||||||
|
|
||||||
def _unpack_from(f, b, o=0):
|
|
||||||
"""Explicit type cast for legacy struct.unpack_from"""
|
|
||||||
return struct.unpack_from(f, bytes(b), o)
|
|
||||||
|
|
||||||
else:
|
|
||||||
_unpack_from = struct.unpack_from
|
|
||||||
|
|
||||||
_NO_FORMAT_USED = ""
|
_NO_FORMAT_USED = ""
|
||||||
_MSGPACK_HEADERS = {
|
_MSGPACK_HEADERS = {
|
||||||
0xC4: (1, _NO_FORMAT_USED, TYPE_BIN),
|
0xC4: (1, _NO_FORMAT_USED, TYPE_BIN),
|
||||||
|
|
@ -202,7 +177,7 @@ class Unpacker(object):
|
||||||
0 - Timestamp
|
0 - Timestamp
|
||||||
1 - float (Seconds from the EPOCH)
|
1 - float (Seconds from the EPOCH)
|
||||||
2 - int (Nanoseconds from the EPOCH)
|
2 - int (Nanoseconds from the EPOCH)
|
||||||
3 - datetime.datetime (UTC). Python 2 is not supported.
|
3 - datetime.datetime (UTC).
|
||||||
|
|
||||||
:param bool strict_map_key:
|
:param bool strict_map_key:
|
||||||
If true (default), only str or bytes are accepted for map (dict) keys.
|
If true (default), only str or bytes are accepted for map (dict) keys.
|
||||||
|
|
@ -477,7 +452,7 @@ class Unpacker(object):
|
||||||
size, fmt, typ = _MSGPACK_HEADERS[b]
|
size, fmt, typ = _MSGPACK_HEADERS[b]
|
||||||
self._reserve(size)
|
self._reserve(size)
|
||||||
if len(fmt) > 0:
|
if len(fmt) > 0:
|
||||||
n = _unpack_from(fmt, self._buffer, self._buff_i)[0]
|
n = struct.unpack_from(fmt, self._buffer, self._buff_i)[0]
|
||||||
else:
|
else:
|
||||||
n = self._buffer[self._buff_i]
|
n = self._buffer[self._buff_i]
|
||||||
self._buff_i += size
|
self._buff_i += size
|
||||||
|
|
@ -487,7 +462,7 @@ class Unpacker(object):
|
||||||
elif 0xC7 <= b <= 0xC9:
|
elif 0xC7 <= b <= 0xC9:
|
||||||
size, fmt, typ = _MSGPACK_HEADERS[b]
|
size, fmt, typ = _MSGPACK_HEADERS[b]
|
||||||
self._reserve(size)
|
self._reserve(size)
|
||||||
L, n = _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("%s exceeds max_ext_len(%s)" % (L, self._max_ext_len))
|
||||||
|
|
@ -496,7 +471,7 @@ class Unpacker(object):
|
||||||
size, fmt = _MSGPACK_HEADERS[b]
|
size, fmt = _MSGPACK_HEADERS[b]
|
||||||
self._reserve(size)
|
self._reserve(size)
|
||||||
if len(fmt) > 0:
|
if len(fmt) > 0:
|
||||||
obj = _unpack_from(fmt, self._buffer, self._buff_i)[0]
|
obj = struct.unpack_from(fmt, self._buffer, self._buff_i)[0]
|
||||||
else:
|
else:
|
||||||
obj = self._buffer[self._buff_i]
|
obj = self._buffer[self._buff_i]
|
||||||
self._buff_i += size
|
self._buff_i += size
|
||||||
|
|
@ -507,13 +482,13 @@ class Unpacker(object):
|
||||||
"%s exceeds max_ext_len(%s)" % (size, 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 = _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
|
||||||
elif 0xD9 <= b <= 0xDB:
|
elif 0xD9 <= b <= 0xDB:
|
||||||
size, fmt, typ = _MSGPACK_HEADERS[b]
|
size, fmt, typ = _MSGPACK_HEADERS[b]
|
||||||
self._reserve(size)
|
self._reserve(size)
|
||||||
if len(fmt) > 0:
|
if len(fmt) > 0:
|
||||||
(n,) = _unpack_from(fmt, self._buffer, self._buff_i)
|
(n,) = struct.unpack_from(fmt, self._buffer, self._buff_i)
|
||||||
else:
|
else:
|
||||||
n = self._buffer[self._buff_i]
|
n = self._buffer[self._buff_i]
|
||||||
self._buff_i += size
|
self._buff_i += size
|
||||||
|
|
@ -523,7 +498,7 @@ class Unpacker(object):
|
||||||
elif 0xDC <= b <= 0xDD:
|
elif 0xDC <= b <= 0xDD:
|
||||||
size, fmt, typ = _MSGPACK_HEADERS[b]
|
size, fmt, typ = _MSGPACK_HEADERS[b]
|
||||||
self._reserve(size)
|
self._reserve(size)
|
||||||
(n,) = _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(
|
||||||
|
|
@ -532,7 +507,7 @@ class Unpacker(object):
|
||||||
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,) = _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("%s exceeds max_map_len(%s)" % (n, self._max_map_len))
|
||||||
|
|
@ -554,12 +529,12 @@ class Unpacker(object):
|
||||||
# TODO should we eliminate the recursion?
|
# TODO should we eliminate the recursion?
|
||||||
if typ == TYPE_ARRAY:
|
if typ == TYPE_ARRAY:
|
||||||
if execute == EX_SKIP:
|
if execute == EX_SKIP:
|
||||||
for i in xrange(n):
|
for i in range(n):
|
||||||
# TODO check whether we need to call `list_hook`
|
# TODO check whether we need to call `list_hook`
|
||||||
self._unpack(EX_SKIP)
|
self._unpack(EX_SKIP)
|
||||||
return
|
return
|
||||||
ret = newlist_hint(n)
|
ret = newlist_hint(n)
|
||||||
for i in xrange(n):
|
for i in range(n):
|
||||||
ret.append(self._unpack(EX_CONSTRUCT))
|
ret.append(self._unpack(EX_CONSTRUCT))
|
||||||
if self._list_hook is not None:
|
if self._list_hook is not None:
|
||||||
ret = self._list_hook(ret)
|
ret = self._list_hook(ret)
|
||||||
|
|
@ -567,7 +542,7 @@ class Unpacker(object):
|
||||||
return ret if self._use_list else tuple(ret)
|
return ret if self._use_list else tuple(ret)
|
||||||
if typ == TYPE_MAP:
|
if typ == TYPE_MAP:
|
||||||
if execute == EX_SKIP:
|
if execute == EX_SKIP:
|
||||||
for i in xrange(n):
|
for i in range(n):
|
||||||
# TODO check whether we need to call hooks
|
# TODO check whether we need to call hooks
|
||||||
self._unpack(EX_SKIP)
|
self._unpack(EX_SKIP)
|
||||||
self._unpack(EX_SKIP)
|
self._unpack(EX_SKIP)
|
||||||
|
|
@ -575,17 +550,17 @@ class Unpacker(object):
|
||||||
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 xrange(n)
|
for _ in range(n)
|
||||||
)
|
)
|
||||||
else:
|
else:
|
||||||
ret = {}
|
ret = {}
|
||||||
for _ in xrange(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 (unicode, 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 not PY2 and 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)
|
||||||
if self._object_hook is not None:
|
if self._object_hook is not None:
|
||||||
|
|
@ -698,7 +673,6 @@ class Packer(object):
|
||||||
If set to true, datetime with tzinfo is packed into Timestamp type.
|
If set to true, datetime with tzinfo is packed into Timestamp type.
|
||||||
Note that the tzinfo is stripped in the timestamp.
|
Note that the tzinfo is stripped in the timestamp.
|
||||||
You can get UTC datetime with `timestamp=3` option of the Unpacker.
|
You can get UTC datetime with `timestamp=3` option of the Unpacker.
|
||||||
(Python 2 is not supported).
|
|
||||||
|
|
||||||
:param str unicode_errors:
|
:param str unicode_errors:
|
||||||
The error handler for encoding unicode. (default: 'strict')
|
The error handler for encoding unicode. (default: 'strict')
|
||||||
|
|
@ -743,8 +717,6 @@ class Packer(object):
|
||||||
self._autoreset = autoreset
|
self._autoreset = autoreset
|
||||||
self._use_bin_type = use_bin_type
|
self._use_bin_type = use_bin_type
|
||||||
self._buffer = StringIO()
|
self._buffer = StringIO()
|
||||||
if PY2 and datetime:
|
|
||||||
raise ValueError("datetime is not supported in Python 2")
|
|
||||||
self._datetime = bool(datetime)
|
self._datetime = bool(datetime)
|
||||||
self._unicode_errors = unicode_errors or "strict"
|
self._unicode_errors = unicode_errors or "strict"
|
||||||
if default is not None:
|
if default is not None:
|
||||||
|
|
@ -774,7 +746,7 @@ class Packer(object):
|
||||||
if obj:
|
if obj:
|
||||||
return self._buffer.write(b"\xc3")
|
return self._buffer.write(b"\xc3")
|
||||||
return self._buffer.write(b"\xc2")
|
return self._buffer.write(b"\xc2")
|
||||||
if check(obj, int_types):
|
if check(obj, int):
|
||||||
if 0 <= obj < 0x80:
|
if 0 <= obj < 0x80:
|
||||||
return self._buffer.write(struct.pack("B", obj))
|
return self._buffer.write(struct.pack("B", obj))
|
||||||
if -0x20 <= obj < 0:
|
if -0x20 <= obj < 0:
|
||||||
|
|
@ -806,7 +778,7 @@ class Packer(object):
|
||||||
raise ValueError("%s is too large" % type(obj).__name__)
|
raise ValueError("%s is too large" % type(obj).__name__)
|
||||||
self._pack_bin_header(n)
|
self._pack_bin_header(n)
|
||||||
return self._buffer.write(obj)
|
return self._buffer.write(obj)
|
||||||
if check(obj, unicode):
|
if check(obj, str):
|
||||||
obj = obj.encode("utf-8", self._unicode_errors)
|
obj = obj.encode("utf-8", self._unicode_errors)
|
||||||
n = len(obj)
|
n = len(obj)
|
||||||
if n >= 2**32:
|
if n >= 2**32:
|
||||||
|
|
@ -855,13 +827,11 @@ class Packer(object):
|
||||||
if check(obj, list_types):
|
if check(obj, list_types):
|
||||||
n = len(obj)
|
n = len(obj)
|
||||||
self._pack_array_header(n)
|
self._pack_array_header(n)
|
||||||
for i in xrange(n):
|
for i in range(n):
|
||||||
self._pack(obj[i], nest_limit - 1)
|
self._pack(obj[i], nest_limit - 1)
|
||||||
return
|
return
|
||||||
if check(obj, dict):
|
if check(obj, dict):
|
||||||
return self._pack_map_pairs(
|
return self._pack_map_pairs(len(obj), obj.items(), nest_limit - 1)
|
||||||
len(obj), dict_iteritems(obj), nest_limit - 1
|
|
||||||
)
|
|
||||||
|
|
||||||
if self._datetime and check(obj, _DateTime) and obj.tzinfo is not None:
|
if self._datetime and check(obj, _DateTime) and obj.tzinfo is not None:
|
||||||
obj = Timestamp.from_datetime(obj)
|
obj = Timestamp.from_datetime(obj)
|
||||||
|
|
@ -1004,7 +974,7 @@ class Packer(object):
|
||||||
|
|
||||||
def getbuffer(self):
|
def getbuffer(self):
|
||||||
"""Return view of internal buffer."""
|
"""Return view of internal buffer."""
|
||||||
if USING_STRINGBUILDER or PY2:
|
if USING_STRINGBUILDER:
|
||||||
return memoryview(self.bytes())
|
return memoryview(self.bytes())
|
||||||
else:
|
else:
|
||||||
return self._buffer.getbuffer()
|
return self._buffer.getbuffer()
|
||||||
|
|
|
||||||
3
setup.py
3
setup.py
|
|
@ -10,7 +10,6 @@ from setuptools.command.sdist import sdist
|
||||||
|
|
||||||
|
|
||||||
PYPY = hasattr(sys, "pypy_version_info")
|
PYPY = hasattr(sys, "pypy_version_info")
|
||||||
PY2 = sys.version_info[0] == 2
|
|
||||||
|
|
||||||
|
|
||||||
class NoCython(Exception):
|
class NoCython(Exception):
|
||||||
|
|
@ -79,7 +78,7 @@ if sys.platform == "win32":
|
||||||
macros = [("__LITTLE_ENDIAN__", "1")]
|
macros = [("__LITTLE_ENDIAN__", "1")]
|
||||||
|
|
||||||
ext_modules = []
|
ext_modules = []
|
||||||
if not PYPY and not PY2 and not os.environ.get("MSGPACK_PUREPYTHON"):
|
if not PYPY and not os.environ.get("MSGPACK_PUREPYTHON"):
|
||||||
ext_modules.append(
|
ext_modules.append(
|
||||||
Extension(
|
Extension(
|
||||||
"msgpack._cmsgpack",
|
"msgpack._cmsgpack",
|
||||||
|
|
|
||||||
|
|
@ -6,7 +6,6 @@ import pytest
|
||||||
from msgpack import packb, unpackb
|
from msgpack import packb, unpackb
|
||||||
|
|
||||||
|
|
||||||
@pytest.mark.skipif(sys.version_info[0] == 2, reason="Python 2 is not supported")
|
|
||||||
def test_unpack_buffer():
|
def test_unpack_buffer():
|
||||||
from array import array
|
from array import array
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -134,4 +134,4 @@ def test_match():
|
||||||
|
|
||||||
|
|
||||||
def test_unicode():
|
def test_unicode():
|
||||||
assert unpackb(packb(u"foobar"), use_list=1) == u"foobar"
|
assert unpackb(packb("foobar"), use_list=1) == "foobar"
|
||||||
|
|
|
||||||
|
|
@ -53,7 +53,7 @@ def test_invalidvalue():
|
||||||
|
|
||||||
|
|
||||||
def test_strict_map_key():
|
def test_strict_map_key():
|
||||||
valid = {u"unicode": 1, b"bytes": 2}
|
valid = {"unicode": 1, b"bytes": 2}
|
||||||
packed = packb(valid, use_bin_type=True)
|
packed = packb(valid, use_bin_type=True)
|
||||||
assert valid == unpackb(packed, raw=False, strict_map_key=True)
|
assert valid == unpackb(packed, raw=False, strict_map_key=True)
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -55,10 +55,7 @@ def test_extension_type():
|
||||||
print("ext_hook called", code, data)
|
print("ext_hook called", code, data)
|
||||||
assert code == 123
|
assert code == 123
|
||||||
obj = array.array("d")
|
obj = array.array("d")
|
||||||
try:
|
obj.frombytes(data)
|
||||||
obj.frombytes(data)
|
|
||||||
except AttributeError: # PY2
|
|
||||||
obj.fromstring(data)
|
|
||||||
return obj
|
return obj
|
||||||
|
|
||||||
obj = [42, b"hello", array.array("d", [1.1, 2.2, 3.3])]
|
obj = [42, b"hello", array.array("d", [1.1, 2.2, 3.3])]
|
||||||
|
|
@ -67,20 +64,14 @@ def test_extension_type():
|
||||||
assert obj == obj2
|
assert obj == obj2
|
||||||
|
|
||||||
|
|
||||||
import sys
|
|
||||||
|
|
||||||
if sys.version > "3":
|
|
||||||
long = int
|
|
||||||
|
|
||||||
|
|
||||||
def test_overriding_hooks():
|
def test_overriding_hooks():
|
||||||
def default(obj):
|
def default(obj):
|
||||||
if isinstance(obj, long):
|
if isinstance(obj, int):
|
||||||
return {"__type__": "long", "__data__": str(obj)}
|
return {"__type__": "long", "__data__": str(obj)}
|
||||||
else:
|
else:
|
||||||
return obj
|
return obj
|
||||||
|
|
||||||
obj = {"testval": long(1823746192837461928374619)}
|
obj = {"testval": 1823746192837461928374619}
|
||||||
refobj = {"testval": default(obj["testval"])}
|
refobj = {"testval": default(obj["testval"])}
|
||||||
refout = msgpack.packb(refobj)
|
refout = msgpack.packb(refobj)
|
||||||
assert isinstance(refout, (str, bytes))
|
assert isinstance(refout, (str, bytes))
|
||||||
|
|
|
||||||
|
|
@ -7,11 +7,6 @@ from msgpack import packb, unpackb
|
||||||
import sys
|
import sys
|
||||||
|
|
||||||
|
|
||||||
pytestmark = pytest.mark.skipif(
|
|
||||||
sys.version_info[0] < 3, reason="Only Python 3 supports buffer protocol"
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
def make_array(f, data):
|
def make_array(f, data):
|
||||||
a = array(f)
|
a = array(f)
|
||||||
a.frombytes(data)
|
a.frombytes(data)
|
||||||
|
|
|
||||||
|
|
@ -80,9 +80,6 @@ def testPackByteArrays():
|
||||||
check(td)
|
check(td)
|
||||||
|
|
||||||
|
|
||||||
@pytest.mark.skipif(
|
|
||||||
sys.version_info < (3, 0), reason="Python 2 passes invalid surrogates"
|
|
||||||
)
|
|
||||||
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"
|
||||||
|
|
@ -96,9 +93,6 @@ def testStrictUnicodeUnpack():
|
||||||
unpackb(packed, raw=False, use_list=1)
|
unpackb(packed, raw=False, use_list=1)
|
||||||
|
|
||||||
|
|
||||||
@pytest.mark.skipif(
|
|
||||||
sys.version_info < (3, 0), reason="Python 2 passes invalid surrogates"
|
|
||||||
)
|
|
||||||
def testIgnoreErrorsPack():
|
def testIgnoreErrorsPack():
|
||||||
re = unpackb(
|
re = unpackb(
|
||||||
packb("abc\uDC80\uDCFFdef", use_bin_type=True, unicode_errors="ignore"),
|
packb("abc\uDC80\uDCFFdef", use_bin_type=True, unicode_errors="ignore"),
|
||||||
|
|
|
||||||
|
|
@ -4,9 +4,6 @@ import datetime
|
||||||
import msgpack
|
import msgpack
|
||||||
from msgpack.ext import Timestamp
|
from msgpack.ext import Timestamp
|
||||||
|
|
||||||
if sys.version_info[0] > 2:
|
|
||||||
from msgpack.ext import _utc
|
|
||||||
|
|
||||||
|
|
||||||
def test_timestamp():
|
def test_timestamp():
|
||||||
# timestamp32
|
# timestamp32
|
||||||
|
|
@ -85,33 +82,33 @@ def test_timestamp_to():
|
||||||
assert t.to_unix_nano() == 42000014000
|
assert t.to_unix_nano() == 42000014000
|
||||||
|
|
||||||
|
|
||||||
@pytest.mark.skipif(sys.version_info[0] == 2, reason="datetime support is PY3+ only")
|
|
||||||
def test_timestamp_datetime():
|
def test_timestamp_datetime():
|
||||||
t = Timestamp(42, 14)
|
t = Timestamp(42, 14)
|
||||||
assert t.to_datetime() == datetime.datetime(1970, 1, 1, 0, 0, 42, 0, tzinfo=_utc)
|
utc = datetime.timezone.utc
|
||||||
|
assert t.to_datetime() == datetime.datetime(1970, 1, 1, 0, 0, 42, 0, tzinfo=utc)
|
||||||
|
|
||||||
|
|
||||||
@pytest.mark.skipif(sys.version_info[0] == 2, reason="datetime support is PY3+ only")
|
|
||||||
def test_unpack_datetime():
|
def test_unpack_datetime():
|
||||||
t = Timestamp(42, 14)
|
t = Timestamp(42, 14)
|
||||||
|
utc = datetime.timezone.utc
|
||||||
packed = msgpack.packb(t)
|
packed = msgpack.packb(t)
|
||||||
unpacked = msgpack.unpackb(packed, timestamp=3)
|
unpacked = msgpack.unpackb(packed, timestamp=3)
|
||||||
assert unpacked == datetime.datetime(1970, 1, 1, 0, 0, 42, 0, tzinfo=_utc)
|
assert unpacked == datetime.datetime(1970, 1, 1, 0, 0, 42, 0, tzinfo=utc)
|
||||||
|
|
||||||
|
|
||||||
@pytest.mark.skipif(sys.version_info[0] == 2, reason="datetime support is PY3+ only")
|
|
||||||
def test_pack_unpack_before_epoch():
|
def test_pack_unpack_before_epoch():
|
||||||
t_in = datetime.datetime(1960, 1, 1, tzinfo=_utc)
|
utc = datetime.timezone.utc
|
||||||
|
t_in = datetime.datetime(1960, 1, 1, tzinfo=utc)
|
||||||
packed = msgpack.packb(t_in, datetime=True)
|
packed = msgpack.packb(t_in, datetime=True)
|
||||||
unpacked = msgpack.unpackb(packed, timestamp=3)
|
unpacked = msgpack.unpackb(packed, timestamp=3)
|
||||||
assert unpacked == t_in
|
assert unpacked == t_in
|
||||||
|
|
||||||
|
|
||||||
@pytest.mark.skipif(sys.version_info[0] == 2, reason="datetime support is PY3+ only")
|
|
||||||
def test_pack_datetime():
|
def test_pack_datetime():
|
||||||
t = Timestamp(42, 14000)
|
t = Timestamp(42, 14000)
|
||||||
dt = t.to_datetime()
|
dt = t.to_datetime()
|
||||||
assert dt == datetime.datetime(1970, 1, 1, 0, 0, 42, 14, tzinfo=_utc)
|
utc = datetime.timezone.utc
|
||||||
|
assert dt == datetime.datetime(1970, 1, 1, 0, 0, 42, 14, tzinfo=utc)
|
||||||
|
|
||||||
packed = msgpack.packb(dt, datetime=True)
|
packed = msgpack.packb(dt, datetime=True)
|
||||||
packed2 = msgpack.packb(t)
|
packed2 = msgpack.packb(t)
|
||||||
|
|
@ -131,10 +128,10 @@ def test_pack_datetime():
|
||||||
assert msgpack.unpackb(packed) is None
|
assert msgpack.unpackb(packed) is None
|
||||||
|
|
||||||
|
|
||||||
@pytest.mark.skipif(sys.version_info[0] == 2, reason="datetime support is PY3+ only")
|
|
||||||
def test_issue451():
|
def test_issue451():
|
||||||
# https://github.com/msgpack/msgpack-python/issues/451
|
# https://github.com/msgpack/msgpack-python/issues/451
|
||||||
dt = datetime.datetime(2100, 1, 1, 1, 1, tzinfo=_utc)
|
utc = datetime.timezone.utc
|
||||||
|
dt = datetime.datetime(2100, 1, 1, 1, 1, tzinfo=utc)
|
||||||
packed = msgpack.packb(dt, datetime=True)
|
packed = msgpack.packb(dt, datetime=True)
|
||||||
assert packed == b"\xd6\xff\xf4\x86eL"
|
assert packed == b"\xd6\xff\xf4\x86eL"
|
||||||
|
|
||||||
|
|
@ -142,7 +139,6 @@ def test_issue451():
|
||||||
assert dt == unpacked
|
assert dt == unpacked
|
||||||
|
|
||||||
|
|
||||||
@pytest.mark.skipif(sys.version_info[0] == 2, reason="datetime support is PY3+ only")
|
|
||||||
def test_pack_datetime_without_tzinfo():
|
def test_pack_datetime_without_tzinfo():
|
||||||
dt = datetime.datetime(1970, 1, 1, 0, 0, 42, 14)
|
dt = datetime.datetime(1970, 1, 1, 0, 0, 42, 14)
|
||||||
with pytest.raises(ValueError, match="where tzinfo=None"):
|
with pytest.raises(ValueError, match="where tzinfo=None"):
|
||||||
|
|
@ -152,7 +148,8 @@ def test_pack_datetime_without_tzinfo():
|
||||||
packed = msgpack.packb(dt, datetime=True, default=lambda x: None)
|
packed = msgpack.packb(dt, datetime=True, default=lambda x: None)
|
||||||
assert packed == msgpack.packb(None)
|
assert packed == msgpack.packb(None)
|
||||||
|
|
||||||
dt = datetime.datetime(1970, 1, 1, 0, 0, 42, 14, tzinfo=_utc)
|
utc = datetime.timezone.utc
|
||||||
|
dt = datetime.datetime(1970, 1, 1, 0, 0, 42, 14, tzinfo=utc)
|
||||||
packed = msgpack.packb(dt, datetime=True)
|
packed = msgpack.packb(dt, datetime=True)
|
||||||
unpacked = msgpack.unpackb(packed, timestamp=3)
|
unpacked = msgpack.unpackb(packed, timestamp=3)
|
||||||
assert unpacked == dt
|
assert unpacked == dt
|
||||||
|
|
|
||||||
|
|
@ -70,7 +70,7 @@ def test_unpacker_ext_hook():
|
||||||
|
|
||||||
|
|
||||||
def test_unpacker_tell():
|
def test_unpacker_tell():
|
||||||
objects = 1, 2, u"abc", u"def", u"ghi"
|
objects = 1, 2, "abc", "def", "ghi"
|
||||||
packed = b"\x01\x02\xa3abc\xa3def\xa3ghi"
|
packed = b"\x01\x02\xa3abc\xa3def\xa3ghi"
|
||||||
positions = 1, 2, 6, 10, 14
|
positions = 1, 2, 6, 10, 14
|
||||||
unpacker = Unpacker(BytesIO(packed))
|
unpacker = Unpacker(BytesIO(packed))
|
||||||
|
|
@ -80,7 +80,7 @@ def test_unpacker_tell():
|
||||||
|
|
||||||
|
|
||||||
def test_unpacker_tell_read_bytes():
|
def test_unpacker_tell_read_bytes():
|
||||||
objects = 1, u"abc", u"ghi"
|
objects = 1, "abc", "ghi"
|
||||||
packed = b"\x01\x02\xa3abc\xa3def\xa3ghi"
|
packed = b"\x01\x02\xa3abc\xa3def\xa3ghi"
|
||||||
raw_data = b"\x02", b"\xa3def", b""
|
raw_data = b"\x02", b"\xa3def", b""
|
||||||
lenghts = 1, 4, 999
|
lenghts = 1, 4, 999
|
||||||
|
|
|
||||||
13
tox.ini
13
tox.ini
|
|
@ -1,9 +1,7 @@
|
||||||
[tox]
|
[tox]
|
||||||
envlist =
|
envlist =
|
||||||
py27-pure,
|
|
||||||
{py35,py36,py37,py38}-{c,pure},
|
{py35,py36,py37,py38}-{c,pure},
|
||||||
{pypy,pypy3}-pure,
|
{pypy,pypy3}-pure,
|
||||||
py27-x86,
|
|
||||||
py34-x86,
|
py34-x86,
|
||||||
isolated_build = true
|
isolated_build = true
|
||||||
|
|
||||||
|
|
@ -19,17 +17,6 @@ commands=
|
||||||
setenv=
|
setenv=
|
||||||
pure: MSGPACK_PUREPYTHON=x
|
pure: MSGPACK_PUREPYTHON=x
|
||||||
|
|
||||||
[testenv:py27-x86]
|
|
||||||
basepython=python2.7-x86
|
|
||||||
deps=
|
|
||||||
pytest
|
|
||||||
|
|
||||||
changedir=test
|
|
||||||
commands=
|
|
||||||
python -c 'import sys; print(hex(sys.maxsize))'
|
|
||||||
python -c 'from msgpack import _cmsgpack'
|
|
||||||
py.test
|
|
||||||
|
|
||||||
[testenv:py34-x86]
|
[testenv:py34-x86]
|
||||||
basepython=python3.4-x86
|
basepython=python3.4-x86
|
||||||
deps=
|
deps=
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue