Hello community,
here is the log from the commit of package python-u-msgpack-python for openSUSE:Factory checked in at 2019-04-19 18:36:42
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/python-u-msgpack-python (Old)
and /work/SRC/openSUSE:Factory/.python-u-msgpack-python.new.5536 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "python-u-msgpack-python"
Fri Apr 19 18:36:42 2019 rev:6 rq:693689 version:2.5.1
Changes:
--------
--- /work/SRC/openSUSE:Factory/python-u-msgpack-python/python-u-msgpack-python.changes 2018-12-27 00:29:07.399676255 +0100
+++ /work/SRC/openSUSE:Factory/.python-u-msgpack-python.new.5536/python-u-msgpack-python.changes 2019-04-19 18:36:43.599058483 +0200
@@ -1,0 +2,12 @@
+Fri Apr 12 09:23:15 UTC 2019 - Marketa Calabkova
+
+- update to version 2.5.1
+ * Fix handling of naive/aware datetime objects when packing the
+ timestamp extension type.
+ * Add handling for short reads during file object unpacking.
+ * Make Ext base class a new-style object for cleaner inheritance
+ in Python 2.
+ * Improve length comparisons and instance checks for minor
+ performance improvement.
+
+-------------------------------------------------------------------
Old:
----
u-msgpack-python-2.5.0.tar.gz
New:
----
u-msgpack-python-2.5.1.tar.gz
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ python-u-msgpack-python.spec ++++++
--- /var/tmp/diff_new_pack.QuJmPw/_old 2019-04-19 18:36:44.915060154 +0200
+++ /var/tmp/diff_new_pack.QuJmPw/_new 2019-04-19 18:36:44.943060190 +0200
@@ -1,7 +1,7 @@
#
# spec file for package python-u-msgpack-python
#
-# Copyright (c) 2018 SUSE LINUX GmbH, Nuernberg, Germany.
+# Copyright (c) 2019 SUSE LINUX GmbH, Nuernberg, Germany.
#
# All modifications and additions to the file contributed by third parties
# remain the property of their copyright owners, unless otherwise agreed
@@ -18,7 +18,7 @@
%{?!python_module:%define python_module() python-%{**} python3-%{**}}
Name: python-u-msgpack-python
-Version: 2.5.0
+Version: 2.5.1
Release: 0
Summary: A MessagePack serializer and deserializer
License: MIT
++++++ u-msgpack-python-2.5.0.tar.gz -> u-msgpack-python-2.5.1.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/u-msgpack-python-2.5.0/PKG-INFO new/u-msgpack-python-2.5.1/PKG-INFO
--- old/u-msgpack-python-2.5.0/PKG-INFO 2018-04-02 01:15:22.000000000 +0200
+++ new/u-msgpack-python-2.5.1/PKG-INFO 2019-03-05 01:37:45.000000000 +0100
@@ -1,6 +1,6 @@
Metadata-Version: 1.1
Name: u-msgpack-python
-Version: 2.5.0
+Version: 2.5.1
Summary: A portable, lightweight MessagePack serializer and deserializer written in pure Python.
Home-page: https://github.com/vsergeev/u-msgpack-python
Author: vsergeev
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/u-msgpack-python-2.5.0/README.md new/u-msgpack-python-2.5.1/README.md
--- old/u-msgpack-python-2.5.0/README.md 2018-04-01 02:54:55.000000000 +0200
+++ new/u-msgpack-python-2.5.1/README.md 2019-03-04 03:10:56.000000000 +0100
@@ -401,6 +401,7 @@
* Python float types are packed into the msgpack float32 or float64 format depending on the system's `sys.float_info`
* The Python `datetime.datetime` type is packed into, and unpacked from, the msgpack `timestamp` format
* Note that this Python type only supports microsecond resolution, while the msgpack `timestamp` format supports nanosecond resolution. Timestamps with finer than microsecond resolution will lose precision during unpacking. Users may override the packing and unpacking of the msgpack `timestamp` format with a custom type for alternate behavior.
+ * Both naive and aware timestamp are supported. Naive timestamps are packed as if they are in the UTC timezone. Timestamps are always unpacked as aware `datetime.datetime` objects in the UTC timezone.
## Testing
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/u-msgpack-python-2.5.0/setup.py new/u-msgpack-python-2.5.1/setup.py
--- old/u-msgpack-python-2.5.0/setup.py 2018-04-01 02:54:55.000000000 +0200
+++ new/u-msgpack-python-2.5.1/setup.py 2019-03-04 03:10:56.000000000 +0100
@@ -5,7 +5,7 @@
setup(
name='u-msgpack-python',
- version='2.5.0',
+ version='2.5.1',
description='A portable, lightweight MessagePack serializer and deserializer written in pure Python.',
author='vsergeev',
author_email='v@sergeev.io',
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/u-msgpack-python-2.5.0/test_umsgpack.py new/u-msgpack-python-2.5.1/test_umsgpack.py
--- old/u-msgpack-python-2.5.0/test_umsgpack.py 2018-04-01 02:54:55.000000000 +0200
+++ new/u-msgpack-python-2.5.1/test_umsgpack.py 2019-03-04 03:10:56.000000000 +0100
@@ -319,6 +319,18 @@
["float precision double", 2.5, b"\xcb\x40\x04\x00\x00\x00\x00\x00\x00"],
]
+naive_timestamp_test_vectors = [
+ ["32-bit timestamp (naive)", datetime.datetime(2000, 1, 1, 10, 5, 2, 0, umsgpack._utc_tzinfo),
+ b"\xd6\xff\x38\x6d\xd1\x4e",
+ datetime.datetime(2000, 1, 1, 10, 5, 2, 0, umsgpack._utc_tzinfo)],
+ ["64-bit timestamp (naive)", datetime.datetime(2200, 1, 1, 10, 5, 2, 1234, umsgpack._utc_tzinfo),
+ b"\xd7\xff\x00\x4b\x51\x41\xb0\x9e\xa6\xce",
+ datetime.datetime(2200, 1, 1, 10, 5, 2, 1234, umsgpack._utc_tzinfo)],
+ ["96-bit timestamp (naive)", datetime.datetime(3000, 1, 1, 10, 5, 2, 1234, umsgpack._utc_tzinfo),
+ b"\xc7\x0c\xff\x00\x12\xd4\x50\x00\x00\x00\x07\x91\x5f\x59\xce",
+ datetime.datetime(3000, 1, 1, 10, 5, 2, 1234, umsgpack._utc_tzinfo)],
+]
+
CustomType = namedtuple('CustomType', ['x', 'y', 'z'])
ext_handlers = {
@@ -540,6 +552,24 @@
packed = umsgpack.packb(obj, force_float_precision=precision)
self.assertEqual(packed, data)
+ def test_pack_naive_timestamp(self):
+ for (name, obj, data, _) in naive_timestamp_test_vectors:
+ obj_repr = repr(obj)
+ print("\t Testing %s: object %s" %
+ (name, obj_repr if len(obj_repr) < 24 else obj_repr[0:24] + "..."))
+
+ packed = umsgpack.packb(obj)
+ self.assertEqual(packed, data)
+
+ def test_unpack_naive_timestamp(self):
+ for (name, _, data, obj) in naive_timestamp_test_vectors:
+ obj_repr = repr(obj)
+ print("\t Testing %s: object %s" %
+ (name, obj_repr if len(obj_repr) < 24 else obj_repr[0:24] + "..."))
+
+ unpacked = umsgpack.unpackb(data)
+ self.assertEqual(unpacked, obj)
+
def test_pack_ext_override(self):
# Test overridden packing of datetime.datetime
(name, obj, data) = override_ext_handlers_test_vectors[0]
@@ -585,6 +615,30 @@
for var in exported_vars_test_vector:
self.assertTrue(var in exported_vars)
+ def test_load_short_read(self):
+ # When reading from files, the network, etc. there's no guarantee that
+ # read(n) returns n bytes. Simulate this with a file-like object that
+ # returns 1 byte at a time.
+
+ class SlowFile(object):
+ def __init__(self, data):
+ self._data = data
+
+ def read(self, n=None):
+ if n is None or len(self._data) == 0:
+ data, self._data = self._data, b''
+ return data
+
+ chunk = self._data[0:1]
+ self._data = self._data[1:]
+ return chunk
+
+ obj = {'hello': 'world'}
+ f = SlowFile(umsgpack.dumps(obj))
+ unpacked = umsgpack.load(f)
+
+ self.assertEqual(unpacked, obj)
+
if __name__ == '__main__':
unittest.main()
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/u-msgpack-python-2.5.0/u_msgpack_python.egg-info/PKG-INFO new/u-msgpack-python-2.5.1/u_msgpack_python.egg-info/PKG-INFO
--- old/u-msgpack-python-2.5.0/u_msgpack_python.egg-info/PKG-INFO 2018-04-02 01:15:22.000000000 +0200
+++ new/u-msgpack-python-2.5.1/u_msgpack_python.egg-info/PKG-INFO 2019-03-05 01:37:45.000000000 +0100
@@ -1,6 +1,6 @@
Metadata-Version: 1.1
Name: u-msgpack-python
-Version: 2.5.0
+Version: 2.5.1
Summary: A portable, lightweight MessagePack serializer and deserializer written in pure Python.
Home-page: https://github.com/vsergeev/u-msgpack-python
Author: vsergeev
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/u-msgpack-python-2.5.0/umsgpack.py new/u-msgpack-python-2.5.1/umsgpack.py
--- old/u-msgpack-python-2.5.0/umsgpack.py 2018-04-01 02:54:55.000000000 +0200
+++ new/u-msgpack-python-2.5.1/umsgpack.py 2019-03-04 03:10:56.000000000 +0100
@@ -1,4 +1,4 @@
-# u-msgpack-python v2.5.0 - v at sergeev.io
+# u-msgpack-python v2.5.1 - v at sergeev.io
# https://github.com/vsergeev/u-msgpack-python
#
# u-msgpack-python is a lightweight MessagePack serializer and deserializer
@@ -31,7 +31,7 @@
# THE SOFTWARE.
#
"""
-u-msgpack-python v2.5.0 - v at sergeev.io
+u-msgpack-python v2.5.1 - v at sergeev.io
https://github.com/vsergeev/u-msgpack-python
u-msgpack-python is a lightweight MessagePack serializer and deserializer
@@ -49,10 +49,10 @@
import sys
import io
-__version__ = "2.5.0"
+__version__ = "2.5.1"
"Module version string"
-version = (2, 5, 0)
+version = (2, 5, 1)
"Module version tuple"
@@ -61,7 +61,7 @@
##############################################################################
# Extension type for application-defined types and data
-class Ext:
+class Ext(object):
"""
The Ext class facilitates creating a serializable extension object to store
an application-defined type and data byte array.
@@ -250,15 +250,15 @@
else:
raise UnsupportedTypeException("huge signed int")
else:
- if obj <= 127:
+ if obj < 128:
fp.write(struct.pack("B", obj))
- elif obj <= 2**8 - 1:
+ elif obj < 2**8:
fp.write(b"\xcc" + struct.pack("B", obj))
- elif obj <= 2**16 - 1:
+ elif obj < 2**16:
fp.write(b"\xcd" + struct.pack(">H", obj))
- elif obj <= 2**32 - 1:
+ elif obj < 2**32:
fp.write(b"\xce" + struct.pack(">I", obj))
- elif obj <= 2**64 - 1:
+ elif obj < 2**64:
fp.write(b"\xcf" + struct.pack(">Q", obj))
else:
raise UnsupportedTypeException("huge unsigned int")
@@ -285,66 +285,77 @@
def _pack_string(obj, fp, options):
obj = obj.encode('utf-8')
- if len(obj) <= 31:
- fp.write(struct.pack("B", 0xa0 | len(obj)) + obj)
- elif len(obj) <= 2**8 - 1:
- fp.write(b"\xd9" + struct.pack("B", len(obj)) + obj)
- elif len(obj) <= 2**16 - 1:
- fp.write(b"\xda" + struct.pack(">H", len(obj)) + obj)
- elif len(obj) <= 2**32 - 1:
- fp.write(b"\xdb" + struct.pack(">I", len(obj)) + obj)
+ obj_len = len(obj)
+ if obj_len < 32:
+ fp.write(struct.pack("B", 0xa0 | obj_len) + obj)
+ elif obj_len < 2**8:
+ fp.write(b"\xd9" + struct.pack("B", obj_len) + obj)
+ elif obj_len < 2**16:
+ fp.write(b"\xda" + struct.pack(">H", obj_len) + obj)
+ elif obj_len < 2**32:
+ fp.write(b"\xdb" + struct.pack(">I", obj_len) + obj)
else:
raise UnsupportedTypeException("huge string")
def _pack_binary(obj, fp, options):
- if len(obj) <= 2**8 - 1:
- fp.write(b"\xc4" + struct.pack("B", len(obj)) + obj)
- elif len(obj) <= 2**16 - 1:
- fp.write(b"\xc5" + struct.pack(">H", len(obj)) + obj)
- elif len(obj) <= 2**32 - 1:
- fp.write(b"\xc6" + struct.pack(">I", len(obj)) + obj)
+ obj_len = len(obj)
+ if obj_len < 2**8:
+ fp.write(b"\xc4" + struct.pack("B", obj_len) + obj)
+ elif obj_len < 2**16:
+ fp.write(b"\xc5" + struct.pack(">H", obj_len) + obj)
+ elif obj_len < 2**32:
+ fp.write(b"\xc6" + struct.pack(">I", obj_len) + obj)
else:
raise UnsupportedTypeException("huge binary string")
def _pack_oldspec_raw(obj, fp, options):
- if len(obj) <= 31:
- fp.write(struct.pack("B", 0xa0 | len(obj)) + obj)
- elif len(obj) <= 2**16 - 1:
- fp.write(b"\xda" + struct.pack(">H", len(obj)) + obj)
- elif len(obj) <= 2**32 - 1:
- fp.write(b"\xdb" + struct.pack(">I", len(obj)) + obj)
+ obj_len = len(obj)
+ if obj_len < 32:
+ fp.write(struct.pack("B", 0xa0 | obj_len) + obj)
+ elif obj_len < 2**16:
+ fp.write(b"\xda" + struct.pack(">H", obj_len) + obj)
+ elif obj_len < 2**32:
+ fp.write(b"\xdb" + struct.pack(">I", obj_len) + obj)
else:
raise UnsupportedTypeException("huge raw string")
def _pack_ext(obj, fp, options):
- if len(obj.data) == 1:
+ obj_len = len(obj.data)
+ if obj_len == 1:
fp.write(b"\xd4" + struct.pack("B", obj.type & 0xff) + obj.data)
- elif len(obj.data) == 2:
+ elif obj_len == 2:
fp.write(b"\xd5" + struct.pack("B", obj.type & 0xff) + obj.data)
- elif len(obj.data) == 4:
+ elif obj_len == 4:
fp.write(b"\xd6" + struct.pack("B", obj.type & 0xff) + obj.data)
- elif len(obj.data) == 8:
+ elif obj_len == 8:
fp.write(b"\xd7" + struct.pack("B", obj.type & 0xff) + obj.data)
- elif len(obj.data) == 16:
+ elif obj_len == 16:
fp.write(b"\xd8" + struct.pack("B", obj.type & 0xff) + obj.data)
- elif len(obj.data) <= 2**8 - 1:
+ elif obj_len < 2**8:
fp.write(b"\xc7" +
- struct.pack("BB", len(obj.data), obj.type & 0xff) + obj.data)
- elif len(obj.data) <= 2**16 - 1:
+ struct.pack("BB", obj_len, obj.type & 0xff) + obj.data)
+ elif obj_len < 2**16:
fp.write(b"\xc8" +
- struct.pack(">HB", len(obj.data), obj.type & 0xff) + obj.data)
- elif len(obj.data) <= 2**32 - 1:
+ struct.pack(">HB", obj_len, obj.type & 0xff) + obj.data)
+ elif obj_len < 2**32:
fp.write(b"\xc9" +
- struct.pack(">IB", len(obj.data), obj.type & 0xff) + obj.data)
+ struct.pack(">IB", obj_len, obj.type & 0xff) + obj.data)
else:
raise UnsupportedTypeException("huge ext data")
def _pack_ext_timestamp(obj, fp, options):
- delta = obj - _epoch
+ if not obj.tzinfo:
+ # Object is naive datetime, convert to aware date time,
+ # assuming UTC timezone
+ delta = obj.replace(tzinfo=_utc_tzinfo) - _epoch
+ else:
+ # Object is aware datetime
+ delta = obj - _epoch
+
seconds = delta.seconds + delta.days * 86400
microseconds = delta.microseconds
@@ -367,12 +378,13 @@
def _pack_array(obj, fp, options):
- if len(obj) <= 15:
- fp.write(struct.pack("B", 0x90 | len(obj)))
- elif len(obj) <= 2**16 - 1:
- fp.write(b"\xdc" + struct.pack(">H", len(obj)))
- elif len(obj) <= 2**32 - 1:
- fp.write(b"\xdd" + struct.pack(">I", len(obj)))
+ obj_len = len(obj)
+ if obj_len < 16:
+ fp.write(struct.pack("B", 0x90 | obj_len))
+ elif obj_len < 2**16:
+ fp.write(b"\xdc" + struct.pack(">H", obj_len))
+ elif obj_len < 2**32:
+ fp.write(b"\xdd" + struct.pack(">I", obj_len))
else:
raise UnsupportedTypeException("huge array")
@@ -381,12 +393,13 @@
def _pack_map(obj, fp, options):
- if len(obj) <= 15:
- fp.write(struct.pack("B", 0x80 | len(obj)))
- elif len(obj) <= 2**16 - 1:
- fp.write(b"\xde" + struct.pack(">H", len(obj)))
- elif len(obj) <= 2**32 - 1:
- fp.write(b"\xdf" + struct.pack(">I", len(obj)))
+ obj_len = len(obj)
+ if obj_len < 16:
+ fp.write(struct.pack("B", 0x80 | obj_len))
+ elif obj_len < 2**16:
+ fp.write(b"\xde" + struct.pack(">H", obj_len))
+ elif obj_len < 2**32:
+ fp.write(b"\xdf" + struct.pack(">I", obj_len))
else:
raise UnsupportedTypeException("huge array")
@@ -437,7 +450,7 @@
_pack_ext(ext_handlers[obj.__class__](obj), fp, options)
elif isinstance(obj, bool):
_pack_boolean(obj, fp, options)
- elif isinstance(obj, int) or isinstance(obj, long):
+ elif isinstance(obj, (int, long)):
_pack_integer(obj, fp, options)
elif isinstance(obj, float):
_pack_float(obj, fp, options)
@@ -449,7 +462,7 @@
_pack_string(obj, fp, options)
elif isinstance(obj, str):
_pack_binary(obj, fp, options)
- elif isinstance(obj, list) or isinstance(obj, tuple):
+ elif isinstance(obj, (list, tuple)):
_pack_array(obj, fp, options)
elif isinstance(obj, dict):
_pack_map(obj, fp, options)
@@ -521,7 +534,7 @@
_pack_string(obj, fp, options)
elif isinstance(obj, bytes):
_pack_binary(obj, fp, options)
- elif isinstance(obj, list) or isinstance(obj, tuple):
+ elif isinstance(obj, (list, tuple)):
_pack_array(obj, fp, options)
elif isinstance(obj, dict):
_pack_map(obj, fp, options)
@@ -613,9 +626,20 @@
def _read_except(fp, n):
+ if n == 0:
+ return b""
+
data = fp.read(n)
- if len(data) < n:
+ if len(data) == 0:
raise InsufficientDataException()
+
+ while len(data) < n:
+ chunk = fp.read(n - len(data))
+ if len(chunk) == 0:
+ raise InsufficientDataException()
+
+ data += chunk
+
return data
@@ -751,16 +775,17 @@
def _unpack_ext_timestamp(ext, options):
- if len(ext.data) == 4:
+ obj_len = len(ext.data)
+ if obj_len == 4:
# 32-bit timestamp
seconds = struct.unpack(">I", ext.data)[0]
microseconds = 0
- elif len(ext.data) == 8:
+ elif obj_len == 8:
# 64-bit timestamp
value = struct.unpack(">Q", ext.data)[0]
seconds = value & 0x3ffffffff
microseconds = (value >> 34) // 1000
- elif len(ext.data) == 12:
+ elif obj_len == 12:
# 96-bit timestamp
seconds = struct.unpack(">q", ext.data[4:12])[0]
microseconds = struct.unpack(">I", ext.data[0:4])[0] // 1000
@@ -1045,9 +1070,21 @@
if sys.version_info[0] == 3:
_utc_tzinfo = datetime.timezone.utc
else:
- _utc_tzinfo = None
+ class UTC(datetime.tzinfo):
+ ZERO = datetime.timedelta(0)
+
+ def utcoffset(self, dt):
+ return UTC.ZERO
+
+ def tzname(self, dt):
+ return "UTC"
+
+ def dst(self, dt):
+ return UTC.ZERO
+
+ _utc_tzinfo = UTC()
- # Calculate epoch datetime
+ # Calculate an aware epoch datetime
_epoch = datetime.datetime(1970, 1, 1, tzinfo=_utc_tzinfo)
# Auto-detect system float precision