Script 'mail_helper' called by obssrc
Hello community,

here is the log from the commit of package python-zarr for openSUSE:Factory 
checked in at 2021-09-01 21:37:16
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/python-zarr (Old)
 and      /work/SRC/openSUSE:Factory/.python-zarr.new.1899 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "python-zarr"

Wed Sep  1 21:37:16 2021 rev:5 rq:915459 version:2.9.5

Changes:
--------
--- /work/SRC/openSUSE:Factory/python-zarr/python-zarr.changes  2021-08-28 
22:29:08.313975984 +0200
+++ /work/SRC/openSUSE:Factory/.python-zarr.new.1899/python-zarr.changes        
2021-09-01 21:37:38.676910368 +0200
@@ -1,0 +2,9 @@
+Wed Sep  1 09:34:16 UTC 2021 - Matej Cepl <mc...@suse.com>
+
+- Update to 2.9.5:
+  - Fix FSStore.listdir behavior for nested directories (replaces
+    now unnecessary skip-825-TestFSStore-test_create.patch).
+  - Fix structured arrays that contain objects (which replaces
+    zarr-pr802-fsspec-2021-07.patch).
+
+-------------------------------------------------------------------

Old:
----
  skip-825-TestFSStore-test_create.patch
  zarr-2.9.3.tar.gz
  zarr-pr802-fsspec-2021-07.patch

New:
----
  zarr-2.9.5.tar.gz

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ python-zarr.spec ++++++
--- /var/tmp/diff_new_pack.Rw5MzB/_old  2021-09-01 21:37:39.256911066 +0200
+++ /var/tmp/diff_new_pack.Rw5MzB/_new  2021-09-01 21:37:39.260911070 +0200
@@ -20,17 +20,12 @@
 %define skip_python2 1
 %define skip_python36 1
 Name:           python-zarr
-Version:        2.9.3
+Version:        2.9.5
 Release:        0
 Summary:        An implementation of chunked, compressed, N-dimensional arrays 
for Python
 License:        MIT
 URL:            https://github.com/zarr-developers/zarr-python
 Source:         
https://files.pythonhosted.org/packages/source/z/zarr/zarr-%{version}.tar.gz
-# PATCH-FIX-UPSTREAM zarr-pr802-fsspec-2021-07.patch -- 
gh#zarr-developers/zarr-python#802 and gh#zarr-developers/zarr-python#812
-Patch0:         zarr-pr802-fsspec-2021-07.patch
-# PATCH-FIX-UPSTREAM skip-825-TestFSStore-test_create.patch 
gh#zarr-developers/zarr-python#825 mc...@suse.com
-# Skip the failing test
-Patch1:         skip-825-TestFSStore-test_create.patch
 BuildRequires:  %{python_module setuptools >= 38.6.0}
 BuildRequires:  %{python_module setuptools_scm}
 BuildRequires:  fdupes

++++++ zarr-2.9.3.tar.gz -> zarr-2.9.5.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/zarr-2.9.3/PKG-INFO new/zarr-2.9.5/PKG-INFO
--- old/zarr-2.9.3/PKG-INFO     2021-08-26 11:57:52.194819700 +0200
+++ new/zarr-2.9.5/PKG-INFO     2021-09-01 10:21:28.011391600 +0200
@@ -1,6 +1,6 @@
 Metadata-Version: 2.1
 Name: zarr
-Version: 2.9.3
+Version: 2.9.5
 Summary: An implementation of chunked, compressed, N-dimensional arrays for 
Python.
 Home-page: https://github.com/zarr-developers/zarr-python
 Maintainer: Alistair Miles
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/zarr-2.9.3/docs/release.rst 
new/zarr-2.9.5/docs/release.rst
--- old/zarr-2.9.3/docs/release.rst     2021-08-26 11:57:39.000000000 +0200
+++ new/zarr-2.9.5/docs/release.rst     2021-09-01 10:21:18.000000000 +0200
@@ -6,6 +6,28 @@
 Unreleased
 ----------
 
+.. _release_2.9.5:
+
+2.9.5
+-----
+
+Bug fixes
+~~~~~~~~~
+
+* Fix FSStore.listdir behavior for nested directories.
+  By :user:`Greggory Lee <grlee77>`; :issue:`802`.
+
+.. _release_2.9.4:
+
+2.9.4
+-----
+
+Bug fixes
+~~~~~~~~~
+
+* Fix structured arrays that contain objects
+  By :user: `Attila Bergou <abergou>`; :issue: `806`
+
 .. _release_2.9.3:
 
 2.9.3
@@ -31,7 +53,6 @@
 * Correct conda-forge deployment of Zarr by fixing some Zarr tests.
   By :user:`Ben Williams <benjaminhwilliams>`; :issue:`821`.
 
-
 .. _release_2.9.1:
 
 2.9.1
@@ -92,7 +113,6 @@
 * TST: add missing assert in test_hexdigest.
   By :user:`Greggory Lee <grlee77>`; :issue:`801`.
 
-
 .. _release_2.8.3:
 
 2.8.3
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/zarr-2.9.3/requirements_dev_minimal.txt 
new/zarr-2.9.5/requirements_dev_minimal.txt
--- old/zarr-2.9.3/requirements_dev_minimal.txt 2021-08-26 11:57:40.000000000 
+0200
+++ new/zarr-2.9.5/requirements_dev_minimal.txt 2021-09-01 10:21:18.000000000 
+0200
@@ -5,4 +5,4 @@
 msgpack-python==0.5.6
 setuptools-scm==6.0.1
 # test requirements
-pytest==6.2.4
+pytest==6.2.5
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/zarr-2.9.3/requirements_dev_optional.txt 
new/zarr-2.9.5/requirements_dev_optional.txt
--- old/zarr-2.9.3/requirements_dev_optional.txt        2021-08-26 
11:57:40.000000000 +0200
+++ new/zarr-2.9.5/requirements_dev_optional.txt        2021-09-01 
10:21:18.000000000 +0200
@@ -9,6 +9,7 @@
 azure-storage-blob==12.8.1 # pyup: ignore
 redis==3.5.3
 types-redis
+types-setuptools
 pymongo==3.12.0
 # optional test requirements
 tox==3.24.3
@@ -17,7 +18,5 @@
 pytest-cov==2.12.1
 pytest-doctestplus==0.10.1
 h5py==3.4.0
-s3fs==2021.6.0
-fsspec==2021.6.0
-aiobotocore!=1.4.0
+fsspec[s3]==2021.08.1
 moto[server]>=1.3.14
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/zarr-2.9.3/zarr/codecs.py 
new/zarr-2.9.5/zarr/codecs.py
--- old/zarr-2.9.3/zarr/codecs.py       2021-08-26 11:57:40.000000000 +0200
+++ new/zarr-2.9.5/zarr/codecs.py       2021-09-01 10:21:18.000000000 +0200
@@ -1,4 +1,4 @@
 # flake8: noqa
 from numcodecs import *
-from numcodecs import get_codec, Blosc, Zlib, Delta, AsType, BZ2
+from numcodecs import get_codec, Blosc, Pickle, Zlib, Delta, AsType, BZ2
 from numcodecs.registry import codec_registry
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/zarr-2.9.3/zarr/meta.py new/zarr-2.9.5/zarr/meta.py
--- old/zarr-2.9.3/zarr/meta.py 2021-08-26 11:57:40.000000000 +0200
+++ new/zarr-2.9.5/zarr/meta.py 2021-09-01 10:21:18.000000000 +0200
@@ -40,7 +40,14 @@
     # extract array metadata fields
     try:
         dtype = decode_dtype(meta['dtype'])
-        fill_value = decode_fill_value(meta['fill_value'], dtype)
+
+        if dtype.hasobject:
+            import numcodecs
+            object_codec = numcodecs.get_codec(meta['filters'][0])
+        else:
+            object_codec = None
+
+        fill_value = decode_fill_value(meta['fill_value'], dtype, object_codec)
         meta = dict(
             zarr_format=meta['zarr_format'],
             shape=tuple(meta['shape']),
@@ -66,14 +73,18 @@
         dtype, sdshape = dtype.subdtype
 
     dimension_separator = meta.get('dimension_separator')
-
+    if dtype.hasobject:
+        import numcodecs
+        object_codec = numcodecs.get_codec(meta['filters'][0])
+    else:
+        object_codec = None
     meta = dict(
         zarr_format=ZARR_FORMAT,
         shape=meta['shape'] + sdshape,
         chunks=meta['chunks'],
         dtype=encode_dtype(dtype),
         compressor=meta['compressor'],
-        fill_value=encode_fill_value(meta['fill_value'], dtype),
+        fill_value=encode_fill_value(meta['fill_value'], dtype, object_codec),
         order=meta['order'],
         filters=meta['filters'],
     )
@@ -132,10 +143,17 @@
 }
 
 
-def decode_fill_value(v, dtype):
+def decode_fill_value(v, dtype, object_codec=None):
     # early out
     if v is None:
         return v
+    if dtype.kind == 'V' and dtype.hasobject:
+        if object_codec is None:
+            raise ValueError('missing object_codec for object array')
+        v = base64.standard_b64decode(v)
+        v = object_codec.decode(v)
+        v = np.array(v, dtype=dtype)[()]
+        return v
     if dtype.kind == 'f':
         if v == 'NaN':
             return np.nan
@@ -171,10 +189,16 @@
         return np.array(v, dtype=dtype)[()]
 
 
-def encode_fill_value(v: Any, dtype: np.dtype) -> Any:
+def encode_fill_value(v: Any, dtype: np.dtype, object_codec: Any = None) -> 
Any:
     # early out
     if v is None:
         return v
+    if dtype.kind == 'V' and dtype.hasobject:
+        if object_codec is None:
+            raise ValueError('missing object_codec for object array')
+        v = object_codec.encode(v)
+        v = str(base64.standard_b64encode(v), 'ascii')
+        return v
     if dtype.kind == 'f':
         if np.isnan(v):
             return 'NaN'
@@ -190,8 +214,8 @@
         return bool(v)
     elif dtype.kind in 'c':
         c = cast(np.complex128, np.dtype(complex).type())
-        v = (encode_fill_value(v.real, c.real.dtype),
-             encode_fill_value(v.imag, c.imag.dtype))
+        v = (encode_fill_value(v.real, c.real.dtype, object_codec),
+             encode_fill_value(v.imag, c.imag.dtype, object_codec))
         return v
     elif dtype.kind in 'SV':
         v = str(base64.standard_b64encode(v), 'ascii')
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/zarr-2.9.3/zarr/storage.py 
new/zarr-2.9.5/zarr/storage.py
--- old/zarr-2.9.3/zarr/storage.py      2021-08-26 11:57:40.000000000 +0200
+++ new/zarr-2.9.5/zarr/storage.py      2021-09-01 10:21:18.000000000 +0200
@@ -423,7 +423,7 @@
         filters_config = []
 
     # deal with object encoding
-    if dtype == object:
+    if dtype.hasobject:
         if object_codec is None:
             if not filters:
                 # there are no filters so we can be sure there is no object 
codec
@@ -1189,7 +1189,8 @@
                             for file_name in self.fs.find(entry_path):
                                 file_path = os.path.join(dir_path, file_name)
                                 rel_path = file_path.split(root_path)[1]
-                                
new_children.append(rel_path.replace(os.path.sep, '.'))
+                                rel_path = rel_path.lstrip('/')
+                                new_children.append(rel_path.replace('/', '.'))
                         else:
                             new_children.append(entry)
                     return sorted(new_children)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/zarr-2.9.3/zarr/tests/test_core.py 
new/zarr-2.9.5/zarr/tests/test_core.py
--- old/zarr-2.9.3/zarr/tests/test_core.py      2021-08-26 11:57:40.000000000 
+0200
+++ new/zarr-2.9.5/zarr/tests/test_core.py      2021-09-01 10:21:18.000000000 
+0200
@@ -15,6 +15,7 @@
 from numcodecs.compat import ensure_bytes, ensure_ndarray
 from numcodecs.tests.common import greetings
 from numpy.testing import assert_array_almost_equal, assert_array_equal
+from pkg_resources import parse_version
 
 from zarr.core import Array
 from zarr.meta import json_loads
@@ -1362,6 +1363,44 @@
         if hasattr(z.store, 'close'):
             z.store.close()
 
+    @unittest.skipIf(parse_version(np.__version__) < parse_version('1.14.0'),
+                     "unsupported numpy version")
+    def test_structured_array_contain_object(self):
+
+        if "PartialRead" in self.__class__.__name__:
+            pytest.skip("partial reads of object arrays not supported")
+
+        # ----------- creation --------------
+
+        structured_dtype = [('c_obj', object), ('c_int', int)]
+        a = np.array([(b'aaa', 1),
+                      (b'bbb', 2)], dtype=structured_dtype)
+
+        # zarr-array with structured dtype require object codec
+        with pytest.raises(ValueError):
+            self.create_array(shape=a.shape, dtype=structured_dtype)
+
+        # create zarr-array by np-array
+        za = self.create_array(shape=a.shape, dtype=structured_dtype, 
object_codec=Pickle())
+        za[:] = a
+
+        # must be equal
+        assert_array_equal(a, za[:])
+
+        # ---------- indexing ---------------
+
+        assert za[0] == a[0]
+
+        za[0] = (b'ccc', 3)
+        za[1:2] = np.array([(b'ddd', 4)], dtype=structured_dtype)  # ToDo: not 
work with list
+        assert_array_equal(za[:], np.array([(b'ccc', 3), (b'ddd', 4)], 
dtype=structured_dtype))
+
+        za['c_obj'] = [b'eee', b'fff']
+        za['c_obj', 0] = b'ggg'
+        assert_array_equal(za[:], np.array([(b'ggg', 3), (b'fff', 4)], 
dtype=structured_dtype))
+        assert za['c_obj', 0] == b'ggg'
+        assert za[1, 'c_int'] == 4
+
     def test_iteration_exceptions(self):
         # zero d array
         a = np.array(1, dtype=int)
@@ -1490,6 +1529,14 @@
         if hasattr(a.store, 'close'):
             a.store.close()
 
+    def test_structured_with_object(self):
+        a = self.create_array(fill_value=(0.0, None),
+                              shape=10,
+                              chunks=10,
+                              dtype=[('x', float), ('y', object)],
+                              object_codec=Pickle())
+        assert tuple(a[0]) == (0.0, None)
+
 
 class TestArrayWithPath(TestArray):
 
@@ -1893,6 +1940,14 @@
         # Cannot hacking out object codec as N5 doesn't allow object codecs
         pass
 
+    def test_structured_with_object(self):
+        # Cannot hacking out object codec as N5 doesn't allow object codecs
+        pass
+
+    def test_structured_array_contain_object(self):
+        # Cannot hacking out object codec as N5 doesn't allow object codecs
+        pass
+
     def test_attrs_n5_keywords(self):
         z = self.create_array(shape=(1050,), chunks=100, dtype='i4')
         for k in n5_keywords:
@@ -2326,6 +2381,10 @@
         # skip this one, cannot use delta with objects
         pass
 
+    def test_structured_array_contain_object(self):
+        # skip this one, cannot use delta on structured array
+        pass
+
 
 # custom store, does not support getsize()
 class CustomMapping(object):
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/zarr-2.9.3/zarr/tests/test_meta.py 
new/zarr-2.9.5/zarr/tests/test_meta.py
--- old/zarr-2.9.3/zarr/tests/test_meta.py      2021-08-26 11:57:40.000000000 
+0200
+++ new/zarr-2.9.5/zarr/tests/test_meta.py      2021-09-01 10:21:18.000000000 
+0200
@@ -4,11 +4,12 @@
 import numpy as np
 import pytest
 
-from zarr.codecs import Blosc, Delta, Zlib
+from zarr.codecs import Blosc, Delta, Pickle, Zlib
 from zarr.errors import MetadataError
 from zarr.meta import (ZARR_FORMAT, decode_array_metadata, decode_dtype,
                        decode_group_metadata, encode_array_metadata,
-                       encode_dtype)
+                       encode_dtype, encode_fill_value, decode_fill_value)
+from zarr.util import normalize_dtype, normalize_fill_value
 
 
 def assert_json_equal(expect, actual):
@@ -435,3 +436,69 @@
     }''' % (ZARR_FORMAT - 1)
     with pytest.raises(MetadataError):
         decode_group_metadata(b)
+
+
+@pytest.mark.parametrize(
+    "fill_value,dtype,object_codec,result",
+    [
+        (
+            (0.0, None),
+            [('x', float), ('y', object)],
+            Pickle(),
+            True,  # Pass
+        ),
+        (
+            (0.0, None),
+            [('x', float), ('y', object)],
+            None,
+            False,  # Fail
+        ),
+    ],
+)
+def test_encode_fill_value(fill_value, dtype, object_codec, result):
+
+    # normalize metadata (copied from _init_array_metadata)
+    dtype, object_codec = normalize_dtype(dtype, object_codec)
+    dtype = dtype.base
+    fill_value = normalize_fill_value(fill_value, dtype)
+
+    # test
+    if result:
+        encode_fill_value(fill_value, dtype, object_codec)
+    else:
+        with pytest.raises(ValueError):
+            encode_fill_value(fill_value, dtype, object_codec)
+
+
+@pytest.mark.parametrize(
+    "fill_value,dtype,object_codec,result",
+    [
+        (
+            (0.0, None),
+            [('x', float), ('y', object)],
+            Pickle(),
+            True,  # Pass
+        ),
+        (
+            (0.0, None),
+            [('x', float), ('y', object)],
+            None,
+            False,  # Fail
+        ),
+    ],
+)
+def test_decode_fill_value(fill_value, dtype, object_codec, result):
+
+    # normalize metadata (copied from _init_array_metadata)
+    dtype, object_codec = normalize_dtype(dtype, object_codec)
+    dtype = dtype.base
+    fill_value = normalize_fill_value(fill_value, dtype)
+
+    # test
+    if result:
+        v = encode_fill_value(fill_value, dtype, object_codec)
+        decode_fill_value(v, dtype, object_codec)
+    else:
+        with pytest.raises(ValueError):
+            # No encoding is possible
+            decode_fill_value(fill_value, dtype, object_codec)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/zarr-2.9.3/zarr/util.py new/zarr-2.9.5/zarr/util.py
--- old/zarr-2.9.3/zarr/util.py 2021-08-26 11:57:40.000000000 +0200
+++ new/zarr-2.9.5/zarr/util.py 2021-09-01 10:21:18.000000000 +0200
@@ -253,10 +253,9 @@
 
 def normalize_fill_value(fill_value, dtype: np.dtype):
 
-    if fill_value is None:
+    if fill_value is None or dtype.hasobject:
         # no fill value
         pass
-
     elif fill_value == 0:
         # this should be compatible across numpy versions for any array type, 
including
         # structured arrays
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/zarr-2.9.3/zarr/version.py 
new/zarr-2.9.5/zarr/version.py
--- old/zarr-2.9.3/zarr/version.py      2021-08-26 11:57:49.000000000 +0200
+++ new/zarr-2.9.5/zarr/version.py      2021-09-01 10:21:26.000000000 +0200
@@ -1,5 +1,5 @@
 # coding: utf-8
 # file generated by setuptools_scm
 # don't change, don't track in version control
-version = '2.9.3'
-version_tuple = (2, 9, 3)
+version = '2.9.5'
+version_tuple = (2, 9, 5)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/zarr-2.9.3/zarr.egg-info/PKG-INFO 
new/zarr-2.9.5/zarr.egg-info/PKG-INFO
--- old/zarr-2.9.3/zarr.egg-info/PKG-INFO       2021-08-26 11:57:49.000000000 
+0200
+++ new/zarr-2.9.5/zarr.egg-info/PKG-INFO       2021-09-01 10:21:26.000000000 
+0200
@@ -1,6 +1,6 @@
 Metadata-Version: 2.1
 Name: zarr
-Version: 2.9.3
+Version: 2.9.5
 Summary: An implementation of chunked, compressed, N-dimensional arrays for 
Python.
 Home-page: https://github.com/zarr-developers/zarr-python
 Maintainer: Alistair Miles

Reply via email to