104
104
have_zarr_kvstore = False
105
105
try :
106
106
from zarr .storage import KVStore
107
+
107
108
have_zarr_kvstore = True
108
109
except ImportError :
109
110
KVStore = None
110
111
111
112
have_zarr_v3 = False
112
113
try :
113
- from zarr .storage_v3 import DirectoryStoreV3 , KVStoreV3
114
+ # as of Zarr v2.13 these imports require environment variable
115
+ # ZARR_V3_EXPERIMENTAL_API=1
116
+ from zarr import DirectoryStoreV3 , KVStoreV3
117
+
114
118
have_zarr_v3 = True
115
119
except ImportError :
116
120
KVStoreV3 = None
@@ -1705,14 +1709,18 @@ def create_zarr_target(self):
1705
1709
@contextlib .contextmanager
1706
1710
def create_store (self ):
1707
1711
with self .create_zarr_target () as store_target :
1708
- yield backends .ZarrStore .open_group (store_target , mode = "w" , ** self .version_kwargs )
1712
+ yield backends .ZarrStore .open_group (
1713
+ store_target , mode = "w" , ** self .version_kwargs
1714
+ )
1709
1715
1710
1716
def save (self , dataset , store_target , ** kwargs ):
1711
1717
return dataset .to_zarr (store = store_target , ** kwargs , ** self .version_kwargs )
1712
1718
1713
1719
@contextlib .contextmanager
1714
1720
def open (self , store_target , ** kwargs ):
1715
- with xr .open_dataset (store_target , engine = "zarr" , ** kwargs , ** self .version_kwargs ) as ds :
1721
+ with xr .open_dataset (
1722
+ store_target , engine = "zarr" , ** kwargs , ** self .version_kwargs
1723
+ ) as ds :
1716
1724
yield ds
1717
1725
1718
1726
@contextlib .contextmanager
@@ -2040,9 +2048,13 @@ def test_write_persistence_modes(self, group):
2040
2048
ds , ds_to_append , _ = create_append_test_data ()
2041
2049
with self .create_zarr_target () as store_target :
2042
2050
ds .to_zarr (store_target , mode = "w" , group = group , ** self .version_kwargs )
2043
- ds_to_append .to_zarr (store_target , append_dim = "time" , group = group , ** self .version_kwargs )
2051
+ ds_to_append .to_zarr (
2052
+ store_target , append_dim = "time" , group = group , ** self .version_kwargs
2053
+ )
2044
2054
original = xr .concat ([ds , ds_to_append ], dim = "time" )
2045
- actual = xr .open_dataset (store_target , group = group , engine = "zarr" , ** self .version_kwargs )
2055
+ actual = xr .open_dataset (
2056
+ store_target , group = group , engine = "zarr" , ** self .version_kwargs
2057
+ )
2046
2058
assert_identical (original , actual )
2047
2059
2048
2060
def test_compressor_encoding (self ):
@@ -2104,13 +2116,19 @@ def test_append_with_invalid_dim_raises(self):
2104
2116
with pytest .raises (
2105
2117
ValueError , match = "does not match any existing dataset dimensions"
2106
2118
):
2107
- ds_to_append .to_zarr (store_target , append_dim = "notvalid" , ** self .version_kwargs )
2119
+ ds_to_append .to_zarr (
2120
+ store_target , append_dim = "notvalid" , ** self .version_kwargs
2121
+ )
2108
2122
2109
2123
def test_append_with_no_dims_raises (self ):
2110
2124
with self .create_zarr_target () as store_target :
2111
- Dataset ({"foo" : ("x" , [1 ])}).to_zarr (store_target , mode = "w" , ** self .version_kwargs )
2125
+ Dataset ({"foo" : ("x" , [1 ])}).to_zarr (
2126
+ store_target , mode = "w" , ** self .version_kwargs
2127
+ )
2112
2128
with pytest .raises (ValueError , match = "different dimension names" ):
2113
- Dataset ({"foo" : ("y" , [2 ])}).to_zarr (store_target , mode = "a" , ** self .version_kwargs )
2129
+ Dataset ({"foo" : ("y" , [2 ])}).to_zarr (
2130
+ store_target , mode = "a" , ** self .version_kwargs
2131
+ )
2114
2132
2115
2133
def test_append_with_append_dim_not_set_raises (self ):
2116
2134
ds , ds_to_append , _ = create_append_test_data ()
@@ -2124,7 +2142,9 @@ def test_append_with_mode_not_a_raises(self):
2124
2142
with self .create_zarr_target () as store_target :
2125
2143
ds .to_zarr (store_target , mode = "w" , ** self .version_kwargs )
2126
2144
with pytest .raises (ValueError , match = "cannot set append_dim unless" ):
2127
- ds_to_append .to_zarr (store_target , mode = "w" , append_dim = "time" , ** self .version_kwargs )
2145
+ ds_to_append .to_zarr (
2146
+ store_target , mode = "w" , append_dim = "time" , ** self .version_kwargs
2147
+ )
2128
2148
2129
2149
def test_append_with_existing_encoding_raises (self ):
2130
2150
ds , ds_to_append , _ = create_append_test_data ()
@@ -2161,11 +2181,15 @@ def test_check_encoding_is_consistent_after_append(self):
2161
2181
encoding = {"da" : {"compressor" : compressor }}
2162
2182
ds .to_zarr (store_target , mode = "w" , encoding = encoding , ** self .version_kwargs )
2163
2183
ds_to_append .to_zarr (store_target , append_dim = "time" , ** self .version_kwargs )
2164
- actual_ds = xr .open_dataset (store_target , engine = "zarr" , ** self .version_kwargs )
2184
+ actual_ds = xr .open_dataset (
2185
+ store_target , engine = "zarr" , ** self .version_kwargs
2186
+ )
2165
2187
actual_encoding = actual_ds ["da" ].encoding ["compressor" ]
2166
2188
assert actual_encoding .get_config () == compressor .get_config ()
2167
2189
assert_identical (
2168
- xr .open_dataset (store_target , engine = "zarr" , ** self .version_kwargs ).compute (),
2190
+ xr .open_dataset (
2191
+ store_target , engine = "zarr" , ** self .version_kwargs
2192
+ ).compute (),
2169
2193
xr .concat ([ds , ds_to_append ], dim = "time" ),
2170
2194
)
2171
2195
@@ -2182,7 +2206,8 @@ def test_append_with_new_variable(self):
2182
2206
combined = xr .concat ([ds , ds_to_append ], dim = "time" )
2183
2207
combined ["new_var" ] = ds_with_new_var ["new_var" ]
2184
2208
assert_identical (
2185
- combined , xr .open_dataset (store_target , engine = "zarr" , ** self .version_kwargs )
2209
+ combined ,
2210
+ xr .open_dataset (store_target , engine = "zarr" , ** self .version_kwargs ),
2186
2211
)
2187
2212
2188
2213
@requires_dask
@@ -2289,9 +2314,14 @@ def test_write_region(self, consolidated, compute, use_dask):
2289
2314
for i in range (0 , 10 , 2 ):
2290
2315
region = {"x" : slice (i , i + 2 )}
2291
2316
nonzeros .isel (region ).to_zarr (
2292
- store , region = region , consolidated = consolidated , ** self .version_kwargs ,
2317
+ store ,
2318
+ region = region ,
2319
+ consolidated = consolidated ,
2320
+ ** self .version_kwargs ,
2293
2321
)
2294
- with xr .open_zarr (store , consolidated = consolidated , ** self .version_kwargs ) as actual :
2322
+ with xr .open_zarr (
2323
+ store , consolidated = consolidated , ** self .version_kwargs
2324
+ ) as actual :
2295
2325
assert_identical (actual , nonzeros )
2296
2326
2297
2327
@pytest .mark .parametrize ("mode" , [None , "r+" , "a" ])
@@ -2301,7 +2331,9 @@ def test_write_region_mode(self, mode):
2301
2331
with self .create_zarr_target () as store :
2302
2332
zeros .to_zarr (store , ** self .version_kwargs )
2303
2333
for region in [{"x" : slice (5 )}, {"x" : slice (5 , 10 )}]:
2304
- nonzeros .isel (region ).to_zarr (store , region = region , mode = mode , ** self .version_kwargs )
2334
+ nonzeros .isel (region ).to_zarr (
2335
+ store , region = region , mode = mode , ** self .version_kwargs
2336
+ )
2305
2337
with xr .open_zarr (store , ** self .version_kwargs ) as actual :
2306
2338
assert_identical (actual , nonzeros )
2307
2339
@@ -2343,7 +2375,9 @@ def test_write_preexisting_override_metadata(self):
2343
2375
with self .create_zarr_target () as store :
2344
2376
original .to_zarr (store , compute = False , ** self .version_kwargs )
2345
2377
# with region, the default mode becomes r+
2346
- both_modified .to_zarr (store , region = {"x" : slice (None )}, ** self .version_kwargs )
2378
+ both_modified .to_zarr (
2379
+ store , region = {"x" : slice (None )}, ** self .version_kwargs
2380
+ )
2347
2381
with self .open (store ) as actual :
2348
2382
assert_identical (actual , only_new_data )
2349
2383
@@ -2371,7 +2405,9 @@ def setup_and_verify_store(expected=data):
2371
2405
"cannot set region unless mode='a', mode='r+' or mode=None"
2372
2406
),
2373
2407
):
2374
- data .to_zarr (store , region = {"x" : slice (None )}, mode = "w" , ** self .version_kwargs )
2408
+ data .to_zarr (
2409
+ store , region = {"x" : slice (None )}, mode = "w" , ** self .version_kwargs
2410
+ )
2375
2411
2376
2412
with setup_and_verify_store () as store :
2377
2413
with pytest .raises (TypeError , match = r"must be a dict" ):
@@ -2383,7 +2419,9 @@ def setup_and_verify_store(expected=data):
2383
2419
2384
2420
with setup_and_verify_store () as store :
2385
2421
with pytest .raises (ValueError , match = r"step on all slices" ):
2386
- data2 .to_zarr (store , region = {"x" : slice (None , None , 2 )}, ** self .version_kwargs )
2422
+ data2 .to_zarr (
2423
+ store , region = {"x" : slice (None , None , 2 )}, ** self .version_kwargs
2424
+ )
2387
2425
2388
2426
with setup_and_verify_store () as store :
2389
2427
with pytest .raises (
@@ -2397,13 +2435,20 @@ def setup_and_verify_store(expected=data):
2397
2435
ValueError ,
2398
2436
match = r"all variables in the dataset to write must have at least one dimension in common" ,
2399
2437
):
2400
- data2 .assign (v = 2 ).to_zarr (store , region = {"x" : slice (2 )}, ** self .version_kwargs )
2438
+ data2 .assign (v = 2 ).to_zarr (
2439
+ store , region = {"x" : slice (2 )}, ** self .version_kwargs
2440
+ )
2401
2441
2402
2442
with setup_and_verify_store () as store :
2403
2443
with pytest .raises (
2404
2444
ValueError , match = r"cannot list the same dimension in both"
2405
2445
):
2406
- data .to_zarr (store , region = {"x" : slice (None )}, append_dim = "x" , ** self .version_kwargs )
2446
+ data .to_zarr (
2447
+ store ,
2448
+ region = {"x" : slice (None )},
2449
+ append_dim = "x" ,
2450
+ ** self .version_kwargs ,
2451
+ )
2407
2452
2408
2453
with setup_and_verify_store () as store :
2409
2454
with pytest .raises (
@@ -2517,7 +2562,6 @@ def create_store(self):
2517
2562
yield group
2518
2563
2519
2564
2520
-
2521
2565
class ZarrBaseV3 (ZarrBase ):
2522
2566
def test_roundtrip_coordinates_with_space (self ):
2523
2567
original = Dataset (coords = {"x" : 0 , "y z" : 1 })
@@ -2548,7 +2592,7 @@ def create_zarr_target(self):
2548
2592
class TestZarrDirectoryStoreV3FromPath (TestZarrDirectoryStoreV3 ):
2549
2593
# Must specify zarr_version=3 to get a v3 store because create_zarr_target
2550
2594
# is a string path.
2551
- version_kwargs = {' zarr_version' : 3 }
2595
+ version_kwargs = {" zarr_version" : 3 }
2552
2596
2553
2597
@contextlib .contextmanager
2554
2598
def create_zarr_target (self ):
0 commit comments