Skip to content

Commit 7231d7c

Browse files
committed
Merge remote-tracking branch 'upstream/main' into tom/feature/object-size
2 parents ade17d2 + 498cb78 commit 7231d7c

File tree

10 files changed

+38
-44
lines changed

10 files changed

+38
-44
lines changed

.github/workflows/test.yml

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -33,15 +33,14 @@ jobs:
3333
numpy-version: '2.1'
3434
dependency-set: 'optional'
3535
os: 'macos-latest'
36-
# https://github.com/zarr-developers/zarr-python/issues/2438
37-
# - python-version: '3.11'
38-
# numpy-version: '1.25'
39-
# dependency-set: 'optional'
40-
# os: 'windows-latest'
41-
# - python-version: '3.13'
42-
# numpy-version: '2.1'
43-
# dependency-set: 'optional'
44-
# os: 'windows-latest'
36+
- python-version: '3.11'
37+
numpy-version: '1.25'
38+
dependency-set: 'optional'
39+
os: 'windows-latest'
40+
- python-version: '3.13'
41+
numpy-version: '2.1'
42+
dependency-set: 'optional'
43+
os: 'windows-latest'
4544
runs-on: ${{ matrix.os }}
4645

4746
steps:

src/zarr/abc/store.py

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -336,17 +336,16 @@ def supports_listing(self) -> bool:
336336
...
337337

338338
@abstractmethod
339-
def list(self) -> AsyncGenerator[str, None]:
339+
def list(self) -> AsyncGenerator[str]:
340340
"""Retrieve all keys in the store.
341341
342342
Returns
343343
-------
344344
AsyncGenerator[str, None]
345345
"""
346-
...
347346

348347
@abstractmethod
349-
def list_prefix(self, prefix: str) -> AsyncGenerator[str, None]:
348+
def list_prefix(self, prefix: str) -> AsyncGenerator[str]:
350349
"""
351350
Retrieve all keys in the store that begin with a given prefix. Keys are returned relative
352351
to the root of the store.
@@ -359,10 +358,9 @@ def list_prefix(self, prefix: str) -> AsyncGenerator[str, None]:
359358
-------
360359
AsyncGenerator[str, None]
361360
"""
362-
...
363361

364362
@abstractmethod
365-
def list_dir(self, prefix: str) -> AsyncGenerator[str, None]:
363+
def list_dir(self, prefix: str) -> AsyncGenerator[str]:
366364
"""
367365
Retrieve all keys and prefixes with a given prefix and which do not contain the character
368366
“/” after the given prefix.
@@ -375,7 +373,6 @@ def list_dir(self, prefix: str) -> AsyncGenerator[str, None]:
375373
-------
376374
AsyncGenerator[str, None]
377375
"""
378-
...
379376

380377
async def delete_dir(self, prefix: str) -> None:
381378
"""

src/zarr/core/group.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -967,7 +967,7 @@ async def create_array(
967967

968968
@deprecated("Use AsyncGroup.create_array instead.")
969969
async def create_dataset(
970-
self, name: str, **kwargs: Any
970+
self, name: str, *, shape: ShapeLike, **kwargs: Any
971971
) -> AsyncArray[ArrayV2Metadata] | AsyncArray[ArrayV3Metadata]:
972972
"""Create an array.
973973
@@ -988,7 +988,7 @@ async def create_dataset(
988988
.. deprecated:: 3.0.0
989989
The h5py compatibility methods will be removed in 3.1.0. Use `AsyncGroup.create_array` instead.
990990
"""
991-
return await self.create_array(name, **kwargs)
991+
return await self.create_array(name, shape=shape, **kwargs)
992992

993993
@deprecated("Use AsyncGroup.require_array instead.")
994994
async def require_dataset(
@@ -1666,7 +1666,7 @@ def create_dataset(self, name: str, **kwargs: Any) -> Array:
16661666
return Array(self._sync(self._async_group.create_dataset(name, **kwargs)))
16671667

16681668
@deprecated("Use Group.require_array instead.")
1669-
def require_dataset(self, name: str, **kwargs: Any) -> Array:
1669+
def require_dataset(self, name: str, *, shape: ShapeLike, **kwargs: Any) -> Array:
16701670
"""Obtain an array, creating if it doesn't exist.
16711671
16721672
Arrays are known as "datasets" in HDF5 terminology. For compatibility
@@ -1688,9 +1688,9 @@ def require_dataset(self, name: str, **kwargs: Any) -> Array:
16881688
.. deprecated:: 3.0.0
16891689
The h5py compatibility methods will be removed in 3.1.0. Use `Group.require_array` instead.
16901690
"""
1691-
return Array(self._sync(self._async_group.require_array(name, **kwargs)))
1691+
return Array(self._sync(self._async_group.require_array(name, shape=shape, **kwargs)))
16921692

1693-
def require_array(self, name: str, **kwargs: Any) -> Array:
1693+
def require_array(self, name: str, *, shape: ShapeLike, **kwargs: Any) -> Array:
16941694
"""Obtain an array, creating if it doesn't exist.
16951695
16961696
@@ -1707,7 +1707,7 @@ def require_array(self, name: str, **kwargs: Any) -> Array:
17071707
-------
17081708
a : Array
17091709
"""
1710-
return Array(self._sync(self._async_group.require_array(name, **kwargs)))
1710+
return Array(self._sync(self._async_group.require_array(name, shape=shape, **kwargs)))
17111711

17121712
@_deprecate_positional_args
17131713
def empty(self, *, name: str, shape: ChunkCoords, **kwargs: Any) -> Array:

src/zarr/storage/local.py

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -133,7 +133,7 @@ def with_mode(self, mode: AccessModeLiteral) -> Self:
133133
return type(self)(root=self.root, mode=mode)
134134

135135
def __str__(self) -> str:
136-
return f"file://{self.root}"
136+
return f"file://{self.root.as_posix()}"
137137

138138
def __repr__(self) -> str:
139139
return f"LocalStore({str(self)!r})"
@@ -220,30 +220,28 @@ async def exists(self, key: str) -> bool:
220220
path = self.root / key
221221
return await asyncio.to_thread(path.is_file)
222222

223-
async def list(self) -> AsyncGenerator[str, None]:
223+
async def list(self) -> AsyncGenerator[str]:
224224
# docstring inherited
225225
to_strip = self.root.as_posix() + "/"
226226
for p in list(self.root.rglob("*")):
227227
if p.is_file():
228228
yield p.as_posix().replace(to_strip, "")
229229

230-
async def list_prefix(self, prefix: str) -> AsyncGenerator[str, None]:
230+
async def list_prefix(self, prefix: str) -> AsyncGenerator[str]:
231231
# docstring inherited
232232
to_strip = self.root.as_posix() + "/"
233233
prefix = prefix.rstrip("/")
234234
for p in (self.root / prefix).rglob("*"):
235235
if p.is_file():
236236
yield p.as_posix().replace(to_strip, "")
237237

238-
async def list_dir(self, prefix: str) -> AsyncGenerator[str, None]:
238+
async def list_dir(self, prefix: str) -> AsyncGenerator[str]:
239239
# docstring inherited
240240
base = self.root / prefix
241-
to_strip = str(base) + "/"
242-
243241
try:
244242
key_iter = base.iterdir()
245243
for key in key_iter:
246-
yield key.as_posix().replace(to_strip, "")
244+
yield key.relative_to(base).as_posix()
247245
except (FileNotFoundError, NotADirectoryError):
248246
pass
249247

src/zarr/storage/logging.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ def _configure_logger(
5555
self, log_level: str = "DEBUG", log_handler: logging.Handler | None = None
5656
) -> None:
5757
self.log_level = log_level
58-
self.logger = logging.getLogger(f"LoggingStore({self._store!s})")
58+
self.logger = logging.getLogger(f"LoggingStore({self._store})")
5959
self.logger.setLevel(log_level)
6060

6161
if not self.logger.hasHandlers():
@@ -147,7 +147,7 @@ async def clear(self) -> None:
147147
return await self._store.clear()
148148

149149
def __str__(self) -> str:
150-
return f"logging-{self._store!s}"
150+
return f"logging-{self._store}"
151151

152152
def __repr__(self) -> str:
153153
return f"LoggingStore({repr(self._store)!r})"
@@ -204,19 +204,19 @@ async def set_partial_values(
204204
with self.log(keys):
205205
return await self._store.set_partial_values(key_start_values=key_start_values)
206206

207-
async def list(self) -> AsyncGenerator[str, None]:
207+
async def list(self) -> AsyncGenerator[str]:
208208
# docstring inherited
209209
with self.log():
210210
async for key in self._store.list():
211211
yield key
212212

213-
async def list_prefix(self, prefix: str) -> AsyncGenerator[str, None]:
213+
async def list_prefix(self, prefix: str) -> AsyncGenerator[str]:
214214
# docstring inherited
215215
with self.log(prefix):
216216
async for key in self._store.list_prefix(prefix=prefix):
217217
yield key
218218

219-
async def list_dir(self, prefix: str) -> AsyncGenerator[str, None]:
219+
async def list_dir(self, prefix: str) -> AsyncGenerator[str]:
220220
# docstring inherited
221221
with self.log(prefix):
222222
async for key in self._store.list_dir(prefix=prefix):

src/zarr/storage/memory.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -150,19 +150,19 @@ async def set_partial_values(self, key_start_values: Iterable[tuple[str, int, by
150150
# docstring inherited
151151
raise NotImplementedError
152152

153-
async def list(self) -> AsyncGenerator[str, None]:
153+
async def list(self) -> AsyncGenerator[str]:
154154
# docstring inherited
155155
for key in self._store_dict:
156156
yield key
157157

158-
async def list_prefix(self, prefix: str) -> AsyncGenerator[str, None]:
158+
async def list_prefix(self, prefix: str) -> AsyncGenerator[str]:
159159
# docstring inherited
160160
# note: we materialize all dict keys into a list here so we can mutate the dict in-place (e.g. in delete_prefix)
161161
for key in list(self._store_dict):
162162
if key.startswith(prefix):
163163
yield key
164164

165-
async def list_dir(self, prefix: str) -> AsyncGenerator[str, None]:
165+
async def list_dir(self, prefix: str) -> AsyncGenerator[str]:
166166
# docstring inherited
167167
prefix = prefix.rstrip("/")
168168

src/zarr/storage/remote.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -325,13 +325,13 @@ async def set_partial_values(
325325
# docstring inherited
326326
raise NotImplementedError
327327

328-
async def list(self) -> AsyncGenerator[str, None]:
328+
async def list(self) -> AsyncGenerator[str]:
329329
# docstring inherited
330330
allfiles = await self.fs._find(self.path, detail=False, withdirs=False)
331331
for onefile in (a.replace(self.path + "/", "") for a in allfiles):
332332
yield onefile
333333

334-
async def list_dir(self, prefix: str) -> AsyncGenerator[str, None]:
334+
async def list_dir(self, prefix: str) -> AsyncGenerator[str]:
335335
# docstring inherited
336336
prefix = f"{self.path}/{prefix.rstrip('/')}"
337337
try:
@@ -341,7 +341,7 @@ async def list_dir(self, prefix: str) -> AsyncGenerator[str, None]:
341341
for onefile in (a.replace(prefix + "/", "") for a in allfiles):
342342
yield onefile.removeprefix(self.path).removeprefix("/")
343343

344-
async def list_prefix(self, prefix: str) -> AsyncGenerator[str, None]:
344+
async def list_prefix(self, prefix: str) -> AsyncGenerator[str]:
345345
# docstring inherited
346346
for onefile in await self.fs._find(
347347
f"{self.path}/{prefix}", detail=False, maxdepth=None, withdirs=False

src/zarr/storage/zip.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -237,19 +237,19 @@ async def exists(self, key: str) -> bool:
237237
else:
238238
return True
239239

240-
async def list(self) -> AsyncGenerator[str, None]:
240+
async def list(self) -> AsyncGenerator[str]:
241241
# docstring inherited
242242
with self._lock:
243243
for key in self._zf.namelist():
244244
yield key
245245

246-
async def list_prefix(self, prefix: str) -> AsyncGenerator[str, None]:
246+
async def list_prefix(self, prefix: str) -> AsyncGenerator[str]:
247247
# docstring inherited
248248
async for key in self.list():
249249
if key.startswith(prefix):
250250
yield key
251251

252-
async def list_dir(self, prefix: str) -> AsyncGenerator[str, None]:
252+
async def list_dir(self, prefix: str) -> AsyncGenerator[str]:
253253
# docstring inherited
254254
prefix = prefix.rstrip("/")
255255

tests/test_store/test_local.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ def store_kwargs(self, tmpdir) -> dict[str, str]:
3131
return {"root": str(tmpdir), "mode": "r+"}
3232

3333
def test_store_repr(self, store: LocalStore) -> None:
34-
assert str(store) == f"file://{store.root!s}"
34+
assert str(store) == f"file://{store.root.as_posix()}"
3535

3636
def test_store_supports_writes(self, store: LocalStore) -> None:
3737
assert store.supports_writes

tests/test_store/test_zip.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ async def test_not_writable_store_raises(self, store_kwargs: dict[str, Any]) ->
5353
await store.set("foo", cpu.Buffer.from_bytes(b"bar"))
5454

5555
def test_store_repr(self, store: ZipStore) -> None:
56-
assert str(store) == f"zip://{store.path!s}"
56+
assert str(store) == f"zip://{store.path}"
5757

5858
def test_store_supports_writes(self, store: ZipStore) -> None:
5959
assert store.supports_writes

0 commit comments

Comments
 (0)