Skip to content

Commit 45146ca

Browse files
martindurantd-v-bdstansby
authored
Ensure compressor=None results in no compression for V2 (#2709)
* Ensure compressor=None results in no compression for V2 * rename argumnent * Update tests/test_v2.py Co-authored-by: Davis Bennett <davis.v.bennett@gmail.com> * fix * coverage * add release note * Update release note --------- Co-authored-by: Davis Bennett <davis.v.bennett@gmail.com> Co-authored-by: David Stansby <dstansby@gmail.com>
1 parent 168999c commit 45146ca

File tree

6 files changed

+55
-32
lines changed

6 files changed

+55
-32
lines changed

docs/release-notes.rst

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@ Bug fixes
1313

1414
* Fixes a bug that prevented reading Zarr format 2 data with consolidated metadata written using ``zarr-python`` version 2 (:issue:`2694`).
1515

16+
* Ensure that compressor=None results in no compression when writing Zarr format 2 data (:issue:`2708`)
17+
1618
Behaviour changes
1719
~~~~~~~~~~~~~~~~~
1820

src/zarr/core/array.py

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4131,15 +4131,22 @@ def _parse_chunk_encoding_v3(
41314131

41324132

41334133
def _parse_deprecated_compressor(
4134-
compressor: CompressorLike | None, compressors: CompressorsLike
4134+
compressor: CompressorLike | None, compressors: CompressorsLike, zarr_format: int = 3
41354135
) -> CompressorsLike | None:
4136-
if compressor:
4136+
if compressor != "auto":
41374137
if compressors != "auto":
41384138
raise ValueError("Cannot specify both `compressor` and `compressors`.")
4139-
warn(
4140-
"The `compressor` argument is deprecated. Use `compressors` instead.",
4141-
category=UserWarning,
4142-
stacklevel=2,
4143-
)
4144-
compressors = (compressor,)
4139+
if zarr_format == 3:
4140+
warn(
4141+
"The `compressor` argument is deprecated. Use `compressors` instead.",
4142+
category=UserWarning,
4143+
stacklevel=2,
4144+
)
4145+
if compressor is None:
4146+
# "no compression"
4147+
compressors = ()
4148+
else:
4149+
compressors = (compressor,)
4150+
elif zarr_format == 2 and compressor == compressors == "auto":
4151+
compressors = ({"id": "blosc"},)
41454152
return compressors

src/zarr/core/group.py

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1011,7 +1011,7 @@ async def create_array(
10111011
shards: ShardsLike | None = None,
10121012
filters: FiltersLike = "auto",
10131013
compressors: CompressorsLike = "auto",
1014-
compressor: CompressorLike = None,
1014+
compressor: CompressorLike = "auto",
10151015
serializer: SerializerLike = "auto",
10161016
fill_value: Any | None = 0,
10171017
order: MemoryOrder | None = None,
@@ -1114,8 +1114,9 @@ async def create_array(
11141114
AsyncArray
11151115
11161116
"""
1117-
1118-
compressors = _parse_deprecated_compressor(compressor, compressors)
1117+
compressors = _parse_deprecated_compressor(
1118+
compressor, compressors, zarr_format=self.metadata.zarr_format
1119+
)
11191120
return await create_array(
11201121
store=self.store_path,
11211122
name=name,
@@ -2244,7 +2245,7 @@ def create_array(
22442245
shards: ShardsLike | None = None,
22452246
filters: FiltersLike = "auto",
22462247
compressors: CompressorsLike = "auto",
2247-
compressor: CompressorLike = None,
2248+
compressor: CompressorLike = "auto",
22482249
serializer: SerializerLike = "auto",
22492250
fill_value: Any | None = 0,
22502251
order: MemoryOrder | None = "C",
@@ -2346,7 +2347,9 @@ def create_array(
23462347
-------
23472348
AsyncArray
23482349
"""
2349-
compressors = _parse_deprecated_compressor(compressor, compressors)
2350+
compressors = _parse_deprecated_compressor(
2351+
compressor, compressors, zarr_format=self.metadata.zarr_format
2352+
)
23502353
return Array(
23512354
self._sync(
23522355
self._async_group.create_array(

tests/test_group.py

Lines changed: 2 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99

1010
import numpy as np
1111
import pytest
12-
from numcodecs import Zstd
12+
from numcodecs import Blosc
1313

1414
import zarr
1515
import zarr.api.asynchronous
@@ -499,7 +499,7 @@ def test_group_child_iterators(store: Store, zarr_format: ZarrFormat, consolidat
499499
"chunks": (1,),
500500
"order": "C",
501501
"filters": None,
502-
"compressor": Zstd(level=0),
502+
"compressor": Blosc(),
503503
"zarr_format": zarr_format,
504504
},
505505
"subgroup": {
@@ -1505,13 +1505,3 @@ def test_group_members_concurrency_limit(store: MemoryStore) -> None:
15051505
elapsed = time.time() - start
15061506

15071507
assert elapsed > num_groups * get_latency
1508-
1509-
1510-
@pytest.mark.parametrize("store", ["local", "memory"], indirect=["store"])
1511-
def test_deprecated_compressor(store: Store) -> None:
1512-
g = zarr.group(store=store, zarr_format=2)
1513-
with pytest.warns(UserWarning, match="The `compressor` argument is deprecated.*"):
1514-
a = g.create_array(
1515-
"foo", shape=(100,), chunks=(10,), dtype="i4", compressor={"id": "blosc"}
1516-
)
1517-
assert a.metadata.compressor.codec_id == "blosc"

tests/test_metadata/test_consolidated.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55

66
import numpy as np
77
import pytest
8-
from numcodecs import Zstd
8+
from numcodecs import Blosc
99

1010
import zarr.api.asynchronous
1111
import zarr.api.synchronous
@@ -522,7 +522,7 @@ async def test_consolidated_metadata_v2(self):
522522
attributes={"key": "a"},
523523
chunks=(1,),
524524
fill_value=0,
525-
compressor=Zstd(level=0),
525+
compressor=Blosc(),
526526
order="C",
527527
),
528528
"g1": GroupMetadata(

tests/test_v2.py

Lines changed: 26 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,13 @@
77
import pytest
88
from numcodecs import Delta
99
from numcodecs.blosc import Blosc
10+
from numcodecs.zstd import Zstd
1011

1112
import zarr
1213
import zarr.core.buffer
1314
import zarr.storage
1415
from zarr import config
16+
from zarr.abc.store import Store
1517
from zarr.core.buffer.core import default_buffer_prototype
1618
from zarr.core.sync import sync
1719
from zarr.storage import MemoryStore, StorePath
@@ -93,11 +95,7 @@ async def test_v2_encode_decode(dtype):
9395
store = zarr.storage.MemoryStore()
9496
g = zarr.group(store=store, zarr_format=2)
9597
g.create_array(
96-
name="foo",
97-
shape=(3,),
98-
chunks=(3,),
99-
dtype=dtype,
100-
fill_value=b"X",
98+
name="foo", shape=(3,), chunks=(3,), dtype=dtype, fill_value=b"X", compressor=None
10199
)
102100

103101
result = await store.get("foo/.zarray", zarr.core.buffer.default_buffer_prototype())
@@ -166,6 +164,29 @@ def test_v2_filters_codecs(filters: Any, order: Literal["C", "F"]) -> None:
166164
np.testing.assert_array_equal(result, array_fixture)
167165

168166

167+
@pytest.mark.filterwarnings("ignore")
168+
@pytest.mark.parametrize("store", ["memory"], indirect=True)
169+
def test_create_array_defaults(store: Store):
170+
"""
171+
Test that passing compressor=None results in no compressor. Also test that the default value of the compressor
172+
parameter does produce a compressor.
173+
"""
174+
g = zarr.open(store, mode="w", zarr_format=2)
175+
arr = g.create_array("one", dtype="i8", shape=(1,), chunks=(1,), compressor=None)
176+
assert arr._async_array.compressor is None
177+
assert not (arr.filters)
178+
arr = g.create_array("two", dtype="i8", shape=(1,), chunks=(1,))
179+
assert arr._async_array.compressor is not None
180+
assert not (arr.filters)
181+
arr = g.create_array("three", dtype="i8", shape=(1,), chunks=(1,), compressor=Zstd())
182+
assert arr._async_array.compressor is not None
183+
assert not (arr.filters)
184+
with pytest.raises(ValueError):
185+
g.create_array(
186+
"four", dtype="i8", shape=(1,), chunks=(1,), compressor=None, compressors=None
187+
)
188+
189+
169190
@pytest.mark.parametrize("array_order", ["C", "F"])
170191
@pytest.mark.parametrize("data_order", ["C", "F"])
171192
@pytest.mark.parametrize("memory_order", ["C", "F"])

0 commit comments

Comments
 (0)