Skip to content

Commit 0c7ab00

Browse files
committed
use relative path for zipfile listing
1 parent bd912ef commit 0c7ab00

File tree

1 file changed

+22
-20
lines changed

1 file changed

+22
-20
lines changed

src/zarr/storage/zip.py

Lines changed: 22 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -179,9 +179,9 @@ async def get(
179179
) -> Buffer | None:
180180
# docstring inherited
181181
assert isinstance(key, str)
182-
182+
key_absolute = self.resolve_key(key)
183183
with self._lock:
184-
return self._get(self.resolve_key(key), prototype=prototype, byte_range=byte_range)
184+
return self._get(key_absolute, prototype=prototype, byte_range=byte_range)
185185

186186
async def get_partial_values(
187187
self,
@@ -192,9 +192,8 @@ async def get_partial_values(
192192
out = []
193193
with self._lock:
194194
for key, byte_range in key_ranges:
195-
out.append(
196-
self._get(self.resolve_key(key), prototype=prototype, byte_range=byte_range)
197-
)
195+
key_absolute = self.resolve_key(key)
196+
out.append(self._get(key_absolute, prototype=prototype, byte_range=byte_range))
198197
return out
199198

200199
def _set(self, key: str, value: Buffer) -> None:
@@ -213,64 +212,67 @@ async def set(self, key: str, value: Buffer) -> None:
213212
# docstring inherited
214213
self._check_writable()
215214
assert isinstance(key, str)
215+
key_absolute = self.resolve_key(key)
216216
if not isinstance(value, Buffer):
217217
raise TypeError("ZipStore.set(): `value` must a Buffer instance")
218218
with self._lock:
219-
self._set(self.resolve_key(key), value)
219+
self._set(key_absolute, value)
220220

221221
async def set_partial_values(self, key_start_values: Iterable[tuple[str, int, bytes]]) -> None:
222222
raise NotImplementedError
223223

224224
async def set_if_not_exists(self, key: str, default: Buffer) -> None:
225-
key_abs = self.resolve_key(key)
225+
key_absolute = self.resolve_key(key)
226226
self._check_writable()
227227
with self._lock:
228228
members = self._zf.namelist()
229-
if key_abs not in members:
230-
self._set(key_abs, default)
229+
if key_absolute not in members:
230+
self._set(key_absolute, default)
231231

232232
async def delete(self, key: str) -> None:
233233
# docstring inherited
234234
raise NotImplementedError
235235

236236
async def exists(self, key: str) -> bool:
237237
# docstring inherited
238+
key_absolute = self.resolve_key(key)
238239
with self._lock:
239240
try:
240-
self._zf.getinfo(self.resolve_key(key))
241+
self._zf.getinfo(key_absolute)
241242
except KeyError:
242243
return False
243244
else:
244245
return True
245246

246247
async def list(self) -> AsyncGenerator[str, None]:
247248
# docstring inherited
248-
with self._lock:
249-
for key in self._zf.namelist():
250-
yield key.lstrip("/")
249+
async for result in self.list_prefix(""):
250+
yield result
251251

252252
async def list_prefix(self, prefix: str) -> AsyncGenerator[str, None]:
253253
# docstring inherited
254-
async for key in self.list():
255-
if key.startswith(prefix):
256-
yield key.removeprefix(prefix)
254+
prefix_absolute = self.resolve_key(prefix)
255+
with self._lock:
256+
for key in self._zf.namelist():
257+
if key.startswith(prefix_absolute):
258+
yield key.removeprefix(prefix_absolute).lstrip("/")
257259

258260
async def list_dir(self, prefix: str) -> AsyncGenerator[str, None]:
259261
# docstring inherited
260-
prefix_abs = self.resolve_key(prefix)
262+
prefix_absolute = self.resolve_key(prefix)
261263

262264
keys = self._zf.namelist()
263265
seen = set()
264-
if prefix_abs == "":
266+
if prefix_absolute == "":
265267
keys_unique = {k.split("/")[0] for k in keys}
266268
for key in keys_unique:
267269
if key not in seen:
268270
seen.add(key)
269271
yield key
270272
else:
271273
for key in keys:
272-
if key.startswith(prefix_abs + "/") and key != prefix_abs:
273-
k = key.removeprefix(prefix_abs + "/").split("/")[0]
274+
if key.startswith(prefix_absolute):
275+
k = key.removeprefix(prefix_absolute).lstrip("/").split("/")[0]
274276
if k not in seen:
275277
seen.add(k)
276278
yield k

0 commit comments

Comments
 (0)