Hello community,
here is the log from the commit of package python-msgpack-numpy for
openSUSE:Factory checked in at 2019-07-24 20:34:29
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/python-msgpack-numpy (Old)
and /work/SRC/openSUSE:Factory/.python-msgpack-numpy.new.4126 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "python-msgpack-numpy"
Wed Jul 24 20:34:29 2019 rev:2 rq:718008 version:0.4.4.3
Changes:
--------
---
/work/SRC/openSUSE:Factory/python-msgpack-numpy/python-msgpack-numpy.changes
2019-02-06 14:07:57.510643315 +0100
+++
/work/SRC/openSUSE:Factory/.python-msgpack-numpy.new.4126/python-msgpack-numpy.changes
2019-07-24 20:34:30.506580844 +0200
@@ -1,0 +2,8 @@
+Tue Jul 23 20:28:38 UTC 2019 - Todd R <[email protected]>
+
+- Update to 0.4.4.3
+ * Configure contiguous integration with Travis.
+ * Move unit tests out of msgpack_numpy module.
+ * Add workaround for issue handling n-dim arrays on MacOS.
+
+-------------------------------------------------------------------
Old:
----
msgpack-numpy-0.4.4.2.tar.gz
New:
----
msgpack-numpy-0.4.4.3.tar.gz
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ python-msgpack-numpy.spec ++++++
--- /var/tmp/diff_new_pack.doDjMJ/_old 2019-07-24 20:34:30.894580802 +0200
+++ /var/tmp/diff_new_pack.doDjMJ/_new 2019-07-24 20:34:30.898580801 +0200
@@ -18,7 +18,7 @@
%{?!python_module:%define python_module() python-%{**} python3-%{**}}
Name: python-msgpack-numpy
-Version: 0.4.4.2
+Version: 0.4.4.3
Release: 0
Summary: Numpy data serialization library using msgpack
License: BSD-3-Clause
@@ -55,6 +55,9 @@
%python_install
%python_expand %fdupes %{buildroot}%{$python_sitelib}
+%check
+%python_exec -B tests.py
+
%files %{python_files}
%doc AUTHORS.rst CHANGES.rst README.rst
%license LICENSE.rst
++++++ msgpack-numpy-0.4.4.2.tar.gz -> msgpack-numpy-0.4.4.3.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/msgpack-numpy-0.4.4.2/CHANGES.rst
new/msgpack-numpy-0.4.4.3/CHANGES.rst
--- old/msgpack-numpy-0.4.4.2/CHANGES.rst 2018-11-08 16:30:57.000000000
+0100
+++ new/msgpack-numpy-0.4.4.3/CHANGES.rst 2019-05-16 14:11:42.000000000
+0200
@@ -3,6 +3,12 @@
Change Log
==========
+Release 0.4.4.3 (May 16, 2019)
+------------------------------
+* Configure contiguous integration with Travis.
+* Move unit tests out of msgpack_numpy module.
+* Add workaround for issue handling n-dim arrays on MacOS (#35).
+
Release 0.4.4.2 (November 8, 2018)
----------------------------------
* Fix regression handling noncontiguous arrays (#34).
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/msgpack-numpy-0.4.4.2/LICENSE.rst
new/msgpack-numpy-0.4.4.3/LICENSE.rst
--- old/msgpack-numpy-0.4.4.2/LICENSE.rst 2018-02-26 03:43:23.000000000
+0100
+++ new/msgpack-numpy-0.4.4.3/LICENSE.rst 2019-05-15 14:52:44.000000000
+0200
@@ -3,7 +3,7 @@
License
=======
-Copyright (c) 2013-2018, Lev E. Givon.
+Copyright (c) 2013-2019, Lev E. Givon.
All rights reserved.
Redistribution and use in source and binary forms, with or without
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/msgpack-numpy-0.4.4.2/PKG-INFO
new/msgpack-numpy-0.4.4.3/PKG-INFO
--- old/msgpack-numpy-0.4.4.2/PKG-INFO 2018-11-08 16:33:33.000000000 +0100
+++ new/msgpack-numpy-0.4.4.3/PKG-INFO 2019-05-16 14:18:21.000000000 +0200
@@ -1,6 +1,6 @@
Metadata-Version: 1.1
Name: msgpack-numpy
-Version: 0.4.4.2
+Version: 0.4.4.3
Summary: Numpy data serialization using msgpack
Home-page: https://github.com/lebedov/msgpack-numpy
Author: Lev E. Givon
@@ -17,6 +17,8 @@
.. image:: https://img.shields.io/pypi/v/msgpack-numpy.svg
:target: https://pypi.python.org/pypi/msgpack-numpy
:alt: Latest Version
+ .. image::
https://travis-ci.org/lebedov/msgpack-numpy.svg?branch=master
+ :target: https://travis-ci.org/lebedov/msgpack-numpy
Installation
------------
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/msgpack-numpy-0.4.4.2/README.rst
new/msgpack-numpy-0.4.4.3/README.rst
--- old/msgpack-numpy-0.4.4.2/README.rst 2018-09-26 03:37:53.000000000
+0200
+++ new/msgpack-numpy-0.4.4.3/README.rst 2019-05-16 14:15:23.000000000
+0200
@@ -14,6 +14,8 @@
.. image:: https://img.shields.io/pypi/v/msgpack-numpy.svg
:target: https://pypi.python.org/pypi/msgpack-numpy
:alt: Latest Version
+.. image:: https://travis-ci.org/lebedov/msgpack-numpy.svg?branch=master
+ :target: https://travis-ci.org/lebedov/msgpack-numpy
Installation
------------
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/msgpack-numpy-0.4.4.2/msgpack_numpy.egg-info/PKG-INFO
new/msgpack-numpy-0.4.4.3/msgpack_numpy.egg-info/PKG-INFO
--- old/msgpack-numpy-0.4.4.2/msgpack_numpy.egg-info/PKG-INFO 2018-11-08
16:33:33.000000000 +0100
+++ new/msgpack-numpy-0.4.4.3/msgpack_numpy.egg-info/PKG-INFO 2019-05-16
14:18:21.000000000 +0200
@@ -1,6 +1,6 @@
Metadata-Version: 1.1
Name: msgpack-numpy
-Version: 0.4.4.2
+Version: 0.4.4.3
Summary: Numpy data serialization using msgpack
Home-page: https://github.com/lebedov/msgpack-numpy
Author: Lev E. Givon
@@ -17,6 +17,8 @@
.. image:: https://img.shields.io/pypi/v/msgpack-numpy.svg
:target: https://pypi.python.org/pypi/msgpack-numpy
:alt: Latest Version
+ .. image::
https://travis-ci.org/lebedov/msgpack-numpy.svg?branch=master
+ :target: https://travis-ci.org/lebedov/msgpack-numpy
Installation
------------
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/msgpack-numpy-0.4.4.2/msgpack_numpy.egg-info/SOURCES.txt
new/msgpack-numpy-0.4.4.3/msgpack_numpy.egg-info/SOURCES.txt
--- old/msgpack-numpy-0.4.4.2/msgpack_numpy.egg-info/SOURCES.txt
2018-11-08 16:33:33.000000000 +0100
+++ new/msgpack-numpy-0.4.4.3/msgpack_numpy.egg-info/SOURCES.txt
2019-05-16 14:18:21.000000000 +0200
@@ -5,6 +5,7 @@
msgpack_numpy.py
setup.cfg
setup.py
+tests.py
msgpack_numpy.egg-info/PKG-INFO
msgpack_numpy.egg-info/SOURCES.txt
msgpack_numpy.egg-info/dependency_links.txt
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/msgpack-numpy-0.4.4.2/msgpack_numpy.py
new/msgpack-numpy-0.4.4.3/msgpack_numpy.py
--- old/msgpack-numpy-0.4.4.2/msgpack_numpy.py 2018-11-08 16:29:03.000000000
+0100
+++ new/msgpack-numpy-0.4.4.3/msgpack_numpy.py 2019-05-15 20:34:15.000000000
+0200
@@ -4,7 +4,7 @@
Support for serialization of numpy data types with msgpack.
"""
-# Copyright (c) 2013-2018, Lev E. Givon
+# Copyright (c) 2013-2019, Lev E. Givon
# All rights reserved.
# Distributed under the terms of the BSD license:
# http://www.opensource.org/licenses/bsd-license
@@ -12,41 +12,18 @@
import sys
import functools
-import numpy as np
import msgpack
-
from msgpack import Packer as _Packer, Unpacker as _Unpacker, \
unpack as _unpack, unpackb as _unpackb
+import numpy as np
if sys.version_info >= (3, 0):
- def encode(obj, chain=None):
- """
- Data encoder for serializing numpy data types.
- """
-
- if isinstance(obj, np.ndarray):
- # If the dtype is structured, store the interface description;
- # otherwise, store the corresponding array protocol type string:
- if obj.dtype.kind == 'V':
- kind = b'V'
- descr = obj.dtype.descr
- else:
- kind = b''
- descr = obj.dtype.str
- return {b'nd': True,
- b'type': descr,
- b'kind': kind,
- b'shape': obj.shape,
- b'data': obj.data if obj.flags['C_CONTIGUOUS'] else
obj.tobytes()}
- elif isinstance(obj, (np.bool_, np.number)):
- return {b'nd': False,
- b'type': obj.dtype.str,
- b'data': obj.data}
- elif isinstance(obj, complex):
- return {b'complex': True,
- b'data': obj.__repr__()}
- else:
- return obj if chain is None else chain(obj)
+ if sys.platform == 'darwin':
+ ndarray_to_bytes = lambda obj: obj.tobytes()
+ else:
+ ndarray_to_bytes = lambda obj: obj.data if obj.flags['C_CONTIGUOUS']
else obj.tobytes()
+
+ num_to_bytes = lambda obj: obj.data
def tostr(x):
if isinstance(x, bytes):
@@ -54,38 +31,45 @@
else:
return str(x)
else:
- def encode(obj, chain=None):
- """
- Data encoder for serializing numpy data types.
- """
-
- if isinstance(obj, np.ndarray):
- # If the dtype is structured, store the interface description;
- # otherwise, store the corresponding array protocol type string:
- if obj.dtype.kind == 'V':
- kind = b'V'
- descr = obj.dtype.descr
- else:
- kind = b''
- descr = obj.dtype.str
- return {b'nd': True,
- b'type': descr,
- b'kind': kind,
- b'shape': obj.shape,
- b'data': memoryview(obj.data) if obj.flags['C_CONTIGUOUS']
else obj.tobytes()}
- elif isinstance(obj, (np.bool_, np.number)):
- return {b'nd': False,
- b'type': obj.dtype.str,
- b'data': memoryview(obj.data)}
- elif isinstance(obj, complex):
- return {b'complex': True,
- b'data': obj.__repr__()}
- else:
- return obj if chain is None else chain(obj)
+ if sys.platform == 'darwin':
+ ndarray_to_bytes = lambda obj: obj.tobytes()
+ else:
+ ndarray_to_bytes = lambda obj: memoryview(obj.data) if
obj.flags['C_CONTIGUOUS'] else obj.tobytes()
+
+ num_to_bytes = lambda obj: memoryview(obj.data)
def tostr(x):
return x
+def encode(obj, chain=None):
+ """
+ Data encoder for serializing numpy data types.
+ """
+
+ if isinstance(obj, np.ndarray):
+ # If the dtype is structured, store the interface description;
+ # otherwise, store the corresponding array protocol type string:
+ if obj.dtype.kind == 'V':
+ kind = b'V'
+ descr = obj.dtype.descr
+ else:
+ kind = b''
+ descr = obj.dtype.str
+ return {b'nd': True,
+ b'type': descr,
+ b'kind': kind,
+ b'shape': obj.shape,
+ b'data': ndarray_to_bytes(obj)}
+ elif isinstance(obj, (np.bool_, np.number)):
+ return {b'nd': False,
+ b'type': obj.dtype.str,
+ b'data': num_to_bytes(obj)}
+ elif isinstance(obj, complex):
+ return {b'complex': True,
+ b'data': obj.__repr__()}
+ else:
+ return obj if chain is None else chain(obj)
+
def decode(obj, chain=None):
"""
Decoder for deserializing numpy data types.
@@ -233,230 +217,3 @@
setattr(msgpack, 'packb', packb)
setattr(msgpack, 'unpack', unpack)
setattr(msgpack, 'unpackb', unpackb)
-
-if __name__ == '__main__':
- try:
- range = xrange # Python 2
- except NameError:
- pass # Python 3
-
- from unittest import main, TestCase
- from numpy.testing import assert_equal, assert_array_equal
-
- class ThirdParty(object):
-
- def __init__(self, foo=b'bar'):
- self.foo = foo
-
- def __eq__(self, other):
- return isinstance(other, ThirdParty) and self.foo == other.foo
-
- class test_numpy_msgpack(TestCase):
- def setUp(self):
- patch()
-
- def encode_decode(self, x, use_bin_type=False, raw=True):
- x_enc = msgpack.packb(x, use_bin_type=use_bin_type)
- return msgpack.unpackb(x_enc, raw=raw)
-
- def encode_thirdparty(self, obj):
- return dict(__thirdparty__=True, foo=obj.foo)
-
- def decode_thirdparty(self, obj):
- if b'__thirdparty__' in obj:
- return ThirdParty(foo=obj[b'foo'])
- return obj
-
- def encode_decode_thirdparty(self, x, use_bin_type=False, raw=True):
- x_enc = msgpack.packb(x, default=self.encode_thirdparty,
- use_bin_type=use_bin_type)
- return msgpack.unpackb(x_enc, raw=raw,
object_hook=self.decode_thirdparty)
-
- def test_bin(self):
- # Since bytes == str in Python 2.7, the following
- # should pass on both 2.7 and 3.*
- assert_equal(type(self.encode_decode(b'foo')), bytes)
-
- def test_str(self):
- assert_equal(type(self.encode_decode('foo')), bytes)
- if sys.version_info.major == 2:
- assert_equal(type(self.encode_decode(u'foo')), str)
-
- # Test non-default string encoding/decoding:
- assert_equal(type(self.encode_decode(u'foo', True, False)),
unicode)
-
- def test_numpy_scalar_bool(self):
- x = np.bool_(True)
- x_rec = self.encode_decode(x)
- assert_equal(x, x_rec)
- assert_equal(type(x), type(x_rec))
- x = np.bool_(False)
- x_rec = self.encode_decode(x)
- assert_equal(x, x_rec)
- assert_equal(type(x), type(x_rec))
-
- def test_numpy_scalar_float(self):
- x = np.float32(np.random.rand())
- x_rec = self.encode_decode(x)
- assert_equal(x, x_rec)
- assert_equal(type(x), type(x_rec))
-
- def test_numpy_scalar_complex(self):
- x = np.complex64(np.random.rand()+1j*np.random.rand())
- x_rec = self.encode_decode(x)
- assert_equal(x, x_rec)
- assert_equal(type(x), type(x_rec))
-
- def test_scalar_float(self):
- x = np.random.rand()
- x_rec = self.encode_decode(x)
- assert_equal(x, x_rec)
- assert_equal(type(x), type(x_rec))
-
- def test_scalar_complex(self):
- x = np.random.rand()+1j*np.random.rand()
- x_rec = self.encode_decode(x)
- assert_equal(x, x_rec)
- assert_equal(type(x), type(x_rec))
-
- def test_list_numpy_float(self):
- x = [np.float32(np.random.rand()) for i in range(5)]
- x_rec = self.encode_decode(x)
- assert_array_equal(x, x_rec)
- assert_array_equal([type(e) for e in x],
- [type(e) for e in x_rec])
-
- def test_list_numpy_float_complex(self):
- x = [np.float32(np.random.rand()) for i in range(5)] + \
- [np.complex128(np.random.rand()+1j*np.random.rand()) for i in
range(5)]
- x_rec = self.encode_decode(x)
- assert_array_equal(x, x_rec)
- assert_array_equal([type(e) for e in x],
- [type(e) for e in x_rec])
-
- def test_list_float(self):
- x = [np.random.rand() for i in range(5)]
- x_rec = self.encode_decode(x)
- assert_array_equal(x, x_rec)
- assert_array_equal([type(e) for e in x],
- [type(e) for e in x_rec])
-
- def test_list_float_complex(self):
- x = [(np.random.rand()+1j*np.random.rand()) for i in range(5)]
- x_rec = self.encode_decode(x)
- assert_array_equal(x, x_rec)
- assert_array_equal([type(e) for e in x],
- [type(e) for e in x_rec])
-
- def test_list_str(self):
- x = [b'x'*i for i in range(5)]
- x_rec = self.encode_decode(x)
- assert_array_equal(x, x_rec)
- assert_array_equal([type(e) for e in x_rec], [bytes]*5)
-
- def test_dict_float(self):
- x = {b'foo': 1.0, b'bar': 2.0}
- x_rec = self.encode_decode(x)
- assert_array_equal(sorted(x.values()), sorted(x_rec.values()))
- assert_array_equal([type(e) for e in sorted(x.values())],
- [type(e) for e in sorted(x_rec.values())])
- assert_array_equal(sorted(x.keys()), sorted(x_rec.keys()))
- assert_array_equal([type(e) for e in sorted(x.keys())],
- [type(e) for e in sorted(x_rec.keys())])
-
- def test_dict_complex(self):
- x = {b'foo': 1.0+1.0j, b'bar': 2.0+2.0j}
- x_rec = self.encode_decode(x)
- assert_array_equal(sorted(x.values(), key=np.linalg.norm),
- sorted(x_rec.values(), key=np.linalg.norm))
- assert_array_equal([type(e) for e in sorted(x.values(),
key=np.linalg.norm)],
- [type(e) for e in sorted(x_rec.values(),
key=np.linalg.norm)])
- assert_array_equal(sorted(x.keys()), sorted(x_rec.keys()))
- assert_array_equal([type(e) for e in sorted(x.keys())],
- [type(e) for e in sorted(x_rec.keys())])
-
- def test_dict_str(self):
- x = {b'foo': b'xxx', b'bar': b'yyyy'}
- x_rec = self.encode_decode(x)
- assert_array_equal(sorted(x.values()), sorted(x_rec.values()))
- assert_array_equal([type(e) for e in sorted(x.values())],
- [type(e) for e in sorted(x_rec.values())])
- assert_array_equal(sorted(x.keys()), sorted(x_rec.keys()))
- assert_array_equal([type(e) for e in sorted(x.keys())],
- [type(e) for e in sorted(x_rec.keys())])
-
- def test_dict_numpy_float(self):
- x = {b'foo': np.float32(1.0), b'bar': np.float32(2.0)}
- x_rec = self.encode_decode(x)
- assert_array_equal(sorted(x.values()), sorted(x_rec.values()))
- assert_array_equal([type(e) for e in sorted(x.values())],
- [type(e) for e in sorted(x_rec.values())])
- assert_array_equal(sorted(x.keys()), sorted(x_rec.keys()))
- assert_array_equal([type(e) for e in sorted(x.keys())],
- [type(e) for e in sorted(x_rec.keys())])
-
- def test_dict_numpy_complex(self):
- x = {b'foo': np.complex128(1.0+1.0j), b'bar':
np.complex128(2.0+2.0j)}
- x_rec = self.encode_decode(x)
- assert_array_equal(sorted(x.values(), key=np.linalg.norm),
- sorted(x_rec.values(), key=np.linalg.norm))
- assert_array_equal([type(e) for e in sorted(x.values(),
key=np.linalg.norm)],
- [type(e) for e in sorted(x_rec.values(),
key=np.linalg.norm)])
- assert_array_equal(sorted(x.keys()), sorted(x_rec.keys()))
- assert_array_equal([type(e) for e in sorted(x.keys())],
- [type(e) for e in sorted(x_rec.keys())])
-
- def test_numpy_array_float(self):
- x = np.random.rand(5).astype(np.float32)
- x_rec = self.encode_decode(x)
- assert_array_equal(x, x_rec)
- assert_equal(x.dtype, x_rec.dtype)
-
- def test_numpy_array_complex(self):
- x = (np.random.rand(5)+1j*np.random.rand(5)).astype(np.complex128)
- x_rec = self.encode_decode(x)
- assert_array_equal(x, x_rec)
- assert_equal(x.dtype, x_rec.dtype)
-
- def test_numpy_array_float_2d(self):
- x = np.random.rand(5,5).astype(np.float32)
- x_rec = self.encode_decode(x)
- assert_array_equal(x, x_rec)
- assert_equal(x.dtype, x_rec.dtype)
-
- def test_numpy_array_str(self):
- x = np.array([b'aaa', b'bbbb', b'ccccc'])
- x_rec = self.encode_decode(x)
- assert_array_equal(x, x_rec)
- assert_equal(x.dtype, x_rec.dtype)
-
- def test_numpy_array_mixed(self):
- x = np.array([(1, 2, b'a', [1.0, 2.0])],
- np.dtype([('arg0', np.uint32),
- ('arg1', np.uint32),
- ('arg2', 'S1'),
- ('arg3', np.float32, (2,))]))
- x_rec = self.encode_decode(x)
- assert_array_equal(x, x_rec)
- assert_equal(x.dtype, x_rec.dtype)
-
- def test_numpy_array_noncontiguous(self):
- x = np.ones((10, 10), np.uint32)[0:5, 0:5]
- x_rec = self.encode_decode(x)
- assert_array_equal(x, x_rec)
- assert_equal(x.dtype, x_rec.dtype)
-
- def test_list_mixed(self):
- x = [1.0, np.float32(3.5), np.complex128(4.25), b'foo']
- x_rec = self.encode_decode(x)
- assert_array_equal(x, x_rec)
- assert_array_equal([type(e) for e in x],
- [type(e) for e in x_rec])
-
- def test_chain(self):
- x = ThirdParty(foo=b'test marshal/unmarshal')
- x_rec = self.encode_decode_thirdparty(x)
- self.assertEqual(x, x_rec)
-
- main()
-
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/msgpack-numpy-0.4.4.2/setup.py
new/msgpack-numpy-0.4.4.3/setup.py
--- old/msgpack-numpy-0.4.4.2/setup.py 2018-11-08 16:31:05.000000000 +0100
+++ new/msgpack-numpy-0.4.4.3/setup.py 2019-05-16 14:11:56.000000000 +0200
@@ -6,7 +6,7 @@
from setuptools import setup
NAME = 'msgpack-numpy'
-VERSION = '0.4.4.2'
+VERSION = '0.4.4.3'
AUTHOR = 'Lev E. Givon'
AUTHOR_EMAIL = '[email protected]'
URL = 'https://github.com/lebedov/msgpack-numpy'
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/msgpack-numpy-0.4.4.2/tests.py
new/msgpack-numpy-0.4.4.3/tests.py
--- old/msgpack-numpy-0.4.4.2/tests.py 1970-01-01 01:00:00.000000000 +0100
+++ new/msgpack-numpy-0.4.4.3/tests.py 2019-05-16 14:10:59.000000000 +0200
@@ -0,0 +1,248 @@
+#!/usr/bin/env python
+
+import sys
+from unittest import main, TestCase
+
+import msgpack
+import numpy as np
+from numpy.testing import assert_equal, assert_array_equal
+
+from msgpack_numpy import patch
+
+try:
+ range = xrange # Python 2
+except NameError:
+ pass # Python 3
+
+class ThirdParty(object):
+
+ def __init__(self, foo=b'bar'):
+ self.foo = foo
+
+ def __eq__(self, other):
+ return isinstance(other, ThirdParty) and self.foo == other.foo
+
+class test_numpy_msgpack(TestCase):
+ def setUp(self):
+ patch()
+
+ def encode_decode(self, x, use_bin_type=False, raw=True,
+ use_list=True, max_bin_len=-1):
+ x_enc = msgpack.packb(x, use_bin_type=use_bin_type)
+ return msgpack.unpackb(x_enc, raw=raw, use_list=use_list,
+ max_bin_len=max_bin_len)
+
+ def encode_thirdparty(self, obj):
+ return dict(__thirdparty__=True, foo=obj.foo)
+
+ def decode_thirdparty(self, obj):
+ if b'__thirdparty__' in obj:
+ return ThirdParty(foo=obj[b'foo'])
+ return obj
+
+ def encode_decode_thirdparty(self, x, use_bin_type=False, raw=True,
+ use_list=True, max_bin_len=-1):
+ x_enc = msgpack.packb(x, default=self.encode_thirdparty,
+ use_bin_type=use_bin_type)
+ return msgpack.unpackb(x_enc, raw=raw,
+ object_hook=self.decode_thirdparty,
+ use_list=use_list, max_bin_len=max_bin_len)
+
+ def test_bin(self):
+ # Since bytes == str in Python 2.7, the following
+ # should pass on both 2.7 and 3.*
+ assert_equal(type(self.encode_decode(b'foo')), bytes)
+
+ def test_str(self):
+ assert_equal(type(self.encode_decode('foo')), bytes)
+ if sys.version_info.major == 2:
+ assert_equal(type(self.encode_decode(u'foo')), str)
+
+ # Test non-default string encoding/decoding:
+ assert_equal(type(self.encode_decode(u'foo', True, False)),
unicode)
+
+ def test_numpy_scalar_bool(self):
+ x = np.bool_(True)
+ x_rec = self.encode_decode(x)
+ assert_equal(x, x_rec)
+ assert_equal(type(x), type(x_rec))
+ x = np.bool_(False)
+ x_rec = self.encode_decode(x)
+ assert_equal(x, x_rec)
+ assert_equal(type(x), type(x_rec))
+
+ def test_numpy_scalar_float(self):
+ x = np.float32(np.random.rand())
+ x_rec = self.encode_decode(x)
+ assert_equal(x, x_rec)
+ assert_equal(type(x), type(x_rec))
+
+ def test_numpy_scalar_complex(self):
+ x = np.complex64(np.random.rand()+1j*np.random.rand())
+ x_rec = self.encode_decode(x)
+ assert_equal(x, x_rec)
+ assert_equal(type(x), type(x_rec))
+
+ def test_scalar_float(self):
+ x = np.random.rand()
+ x_rec = self.encode_decode(x)
+ assert_equal(x, x_rec)
+ assert_equal(type(x), type(x_rec))
+
+ def test_scalar_complex(self):
+ x = np.random.rand()+1j*np.random.rand()
+ x_rec = self.encode_decode(x)
+ assert_equal(x, x_rec)
+ assert_equal(type(x), type(x_rec))
+
+ def test_list_numpy_float(self):
+ x = [np.float32(np.random.rand()) for i in range(5)]
+ x_rec = self.encode_decode(x)
+ assert_array_equal(x, x_rec)
+ assert_array_equal([type(e) for e in x],
+ [type(e) for e in x_rec])
+
+ def test_list_numpy_float_complex(self):
+ x = [np.float32(np.random.rand()) for i in range(5)] + \
+ [np.complex128(np.random.rand()+1j*np.random.rand()) for i in
range(5)]
+ x_rec = self.encode_decode(x)
+ assert_array_equal(x, x_rec)
+ assert_array_equal([type(e) for e in x],
+ [type(e) for e in x_rec])
+
+ def test_list_float(self):
+ x = [np.random.rand() for i in range(5)]
+ x_rec = self.encode_decode(x)
+ assert_array_equal(x, x_rec)
+ assert_array_equal([type(e) for e in x],
+ [type(e) for e in x_rec])
+
+ def test_list_float_complex(self):
+ x = [(np.random.rand()+1j*np.random.rand()) for i in range(5)]
+ x_rec = self.encode_decode(x)
+ assert_array_equal(x, x_rec)
+ assert_array_equal([type(e) for e in x],
+ [type(e) for e in x_rec])
+
+ def test_list_str(self):
+ x = [b'x'*i for i in range(5)]
+ x_rec = self.encode_decode(x)
+ assert_array_equal(x, x_rec)
+ assert_array_equal([type(e) for e in x_rec], [bytes]*5)
+
+ def test_dict_float(self):
+ x = {b'foo': 1.0, b'bar': 2.0}
+ x_rec = self.encode_decode(x)
+ assert_array_equal(sorted(x.values()), sorted(x_rec.values()))
+ assert_array_equal([type(e) for e in sorted(x.values())],
+ [type(e) for e in sorted(x_rec.values())])
+ assert_array_equal(sorted(x.keys()), sorted(x_rec.keys()))
+ assert_array_equal([type(e) for e in sorted(x.keys())],
+ [type(e) for e in sorted(x_rec.keys())])
+
+ def test_dict_complex(self):
+ x = {b'foo': 1.0+1.0j, b'bar': 2.0+2.0j}
+ x_rec = self.encode_decode(x)
+ assert_array_equal(sorted(x.values(), key=np.linalg.norm),
+ sorted(x_rec.values(), key=np.linalg.norm))
+ assert_array_equal([type(e) for e in sorted(x.values(),
key=np.linalg.norm)],
+ [type(e) for e in sorted(x_rec.values(),
key=np.linalg.norm)])
+ assert_array_equal(sorted(x.keys()), sorted(x_rec.keys()))
+ assert_array_equal([type(e) for e in sorted(x.keys())],
+ [type(e) for e in sorted(x_rec.keys())])
+
+ def test_dict_str(self):
+ x = {b'foo': b'xxx', b'bar': b'yyyy'}
+ x_rec = self.encode_decode(x)
+ assert_array_equal(sorted(x.values()), sorted(x_rec.values()))
+ assert_array_equal([type(e) for e in sorted(x.values())],
+ [type(e) for e in sorted(x_rec.values())])
+ assert_array_equal(sorted(x.keys()), sorted(x_rec.keys()))
+ assert_array_equal([type(e) for e in sorted(x.keys())],
+ [type(e) for e in sorted(x_rec.keys())])
+
+ def test_dict_numpy_float(self):
+ x = {b'foo': np.float32(1.0), b'bar': np.float32(2.0)}
+ x_rec = self.encode_decode(x)
+ assert_array_equal(sorted(x.values()), sorted(x_rec.values()))
+ assert_array_equal([type(e) for e in sorted(x.values())],
+ [type(e) for e in sorted(x_rec.values())])
+ assert_array_equal(sorted(x.keys()), sorted(x_rec.keys()))
+ assert_array_equal([type(e) for e in sorted(x.keys())],
+ [type(e) for e in sorted(x_rec.keys())])
+
+ def test_dict_numpy_complex(self):
+ x = {b'foo': np.complex128(1.0+1.0j), b'bar': np.complex128(2.0+2.0j)}
+ x_rec = self.encode_decode(x)
+ assert_array_equal(sorted(x.values(), key=np.linalg.norm),
+ sorted(x_rec.values(), key=np.linalg.norm))
+ assert_array_equal([type(e) for e in sorted(x.values(),
key=np.linalg.norm)],
+ [type(e) for e in sorted(x_rec.values(),
key=np.linalg.norm)])
+ assert_array_equal(sorted(x.keys()), sorted(x_rec.keys()))
+ assert_array_equal([type(e) for e in sorted(x.keys())],
+ [type(e) for e in sorted(x_rec.keys())])
+
+ def test_numpy_array_float(self):
+ x = np.random.rand(5).astype(np.float32)
+ x_rec = self.encode_decode(x)
+ assert_array_equal(x, x_rec)
+ assert_equal(x.dtype, x_rec.dtype)
+
+ def test_numpy_array_complex(self):
+ x = (np.random.rand(5)+1j*np.random.rand(5)).astype(np.complex128)
+ x_rec = self.encode_decode(x)
+ assert_array_equal(x, x_rec)
+ assert_equal(x.dtype, x_rec.dtype)
+
+ def test_numpy_array_float_2d(self):
+ x = np.random.rand(5,5).astype(np.float32)
+ x_rec = self.encode_decode(x)
+ assert_array_equal(x, x_rec)
+ assert_equal(x.dtype, x_rec.dtype)
+
+ def test_numpy_array_float_2d_macos(self):
+ """
+ Unit test for weird data loss error on MacOS (#35).
+ """
+ x = np.random.rand(5,5).astype(np.float32)
+ x_rec = self.encode_decode(x, use_bin_type=True, raw=False,
+ use_list=False, max_bin_len=50000000)
+ assert_array_equal(x, x_rec)
+ assert_equal(x.dtype, x_rec.dtype)
+
+ def test_numpy_array_str(self):
+ x = np.array([b'aaa', b'bbbb', b'ccccc'])
+ x_rec = self.encode_decode(x)
+ assert_array_equal(x, x_rec)
+ assert_equal(x.dtype, x_rec.dtype)
+
+ def test_numpy_array_mixed(self):
+ x = np.array([(1, 2, b'a', [1.0, 2.0])],
+ np.dtype([('arg0', np.uint32),
+ ('arg1', np.uint32),
+ ('arg2', 'S1'),
+ ('arg3', np.float32, (2,))]))
+ x_rec = self.encode_decode(x)
+ assert_array_equal(x, x_rec)
+ assert_equal(x.dtype, x_rec.dtype)
+
+ def test_numpy_array_noncontiguous(self):
+ x = np.ones((10, 10), np.uint32)[0:5, 0:5]
+ x_rec = self.encode_decode(x)
+ assert_array_equal(x, x_rec)
+ assert_equal(x.dtype, x_rec.dtype)
+
+ def test_list_mixed(self):
+ x = [1.0, np.float32(3.5), np.complex128(4.25), b'foo']
+ x_rec = self.encode_decode(x)
+ assert_array_equal(x, x_rec)
+ assert_array_equal([type(e) for e in x],
+ [type(e) for e in x_rec])
+
+ def test_chain(self):
+ x = ThirdParty(foo=b'test marshal/unmarshal')
+ x_rec = self.encode_decode_thirdparty(x)
+ self.assertEqual(x, x_rec)
+
+if __name__ == '__main__':
+ main()