11from __future__ import annotations
22
3- from typing import TYPE_CHECKING
3+ from typing import TYPE_CHECKING , Any
44
55import pytest
66
7- from zarr .core .buffer .cpu import Buffer , buffer_prototype
7+ from zarr .abc .store import Store
8+ from zarr .core .buffer import Buffer
9+ from zarr .core .buffer .cpu import buffer_prototype
810from zarr .storage import LocalStore , WrapperStore
911from zarr .testing .store import StoreTests
1012
1113if TYPE_CHECKING :
14+ from pathlib import Path
15+
1216 from _pytest .compat import LEGACY_PATH
1317
14- from zarr .abc .store import Store
18+ from zarr .abc .store import ByteRequest
1519 from zarr .core .buffer .core import BufferPrototype
1620
1721
1822# TODO: fix this warning
1923@pytest .mark .filterwarnings (
2024 "ignore:coroutine 'ClientCreatorContext.__aexit__' was never awaited:RuntimeWarning"
2125)
22- class TestWrapperStore (StoreTests [WrapperStore , Buffer ]):
26+ class TestWrapperStore (StoreTests [WrapperStore [ LocalStore ] , Buffer ]):
2327 store_cls = WrapperStore
2428 buffer_cls = Buffer
2529
26- async def get (self , store : WrapperStore , key : str ) -> Buffer :
30+ async def get (self , store : WrapperStore [ LocalStore ] , key : str ) -> Buffer :
2731 return self .buffer_cls .from_bytes ((store ._store .root / key ).read_bytes ())
2832
29- async def set (self , store : WrapperStore , key : str , value : Buffer ) -> None :
33+ async def set (self , store : WrapperStore [ LocalStore ] , key : str , value : Buffer ) -> None :
3034 parent = (store ._store .root / key ).parent
3135 if not parent .exists ():
3236 parent .mkdir (parents = True )
3337 (store ._store .root / key ).write_bytes (value .to_bytes ())
3438
3539 @pytest .fixture
36- def store_kwargs (self , tmpdir : LEGACY_PATH ) -> dict [str , str ]:
40+ def store_kwargs (self , tmpdir : LEGACY_PATH ) -> dict [str , Any ]:
3741 return {"store" : LocalStore (str (tmpdir ))}
3842
3943 @pytest .fixture
40- def open_kwargs (self , tmpdir ) -> dict [str , str ]:
41- return {"store_cls" : LocalStore , "root" : str (tmpdir )}
44+ def open_kwargs (self , store_kwargs : dict [ str , Any ], tmp_path : Path ) -> dict [str , Any ]:
45+ return {"store_cls" : LocalStore , "root" : str (tmp_path )}
4246
43- def test_store_supports_writes (self , store : WrapperStore ) -> None :
47+ def test_store_supports_writes (self , store : WrapperStore [ LocalStore ] ) -> None :
4448 assert store .supports_writes
4549
46- def test_store_supports_partial_writes (self , store : WrapperStore ) -> None :
50+ def test_store_supports_partial_writes (self , store : WrapperStore [ LocalStore ] ) -> None :
4751 assert store .supports_partial_writes
4852
49- def test_store_supports_listing (self , store : WrapperStore ) -> None :
53+ def test_store_supports_listing (self , store : WrapperStore [ LocalStore ] ) -> None :
5054 assert store .supports_listing
5155
52- def test_store_repr (self , store : WrapperStore ) -> None :
56+ def test_store_repr (self , store : WrapperStore [ LocalStore ] ) -> None :
5357 assert f"{ store !r} " == f"WrapperStore(LocalStore, 'file://{ store ._store .root .as_posix ()} ')"
5458
55- def test_store_str (self , store : WrapperStore ) -> None :
59+ def test_store_str (self , store : WrapperStore [ LocalStore ] ) -> None :
5660 assert str (store ) == f"wrapping-file://{ store ._store .root .as_posix ()} "
5761
58- def test_check_writeable (self , store : WrapperStore ) -> None :
62+ def test_check_writeable (self , store : WrapperStore [ LocalStore ] ) -> None :
5963 """
6064 Test _check_writeable() runs without errors.
6165 """
6266 store ._check_writable ()
6367
64- def test_close (self , store : WrapperStore ) -> None :
68+ def test_close (self , store : WrapperStore [ LocalStore ] ) -> None :
6569 "Test store can be closed"
6670 store .close ()
6771 assert not store ._is_open
6872
69- def test_is_open_setter_raises (self , store : WrapperStore ) -> None :
73+ def test_is_open_setter_raises (self , store : WrapperStore [ LocalStore ] ) -> None :
7074 """
7175 Test that a user cannot change `_is_open` without opening the underlying store.
7276 """
@@ -83,7 +87,7 @@ def test_is_open_setter_raises(self, store: WrapperStore) -> None:
8387@pytest .mark .parametrize ("store" , ["local" , "memory" , "zip" ], indirect = True )
8488async def test_wrapped_set (store : Store , capsys : pytest .CaptureFixture [str ]) -> None :
8589 # define a class that prints when it sets
86- class NoisySetter (WrapperStore ):
90+ class NoisySetter (WrapperStore [ Store ] ):
8791 async def set (self , key : str , value : Buffer ) -> None :
8892 print (f"setting { key } " )
8993 await super ().set (key , value )
@@ -101,10 +105,12 @@ async def set(self, key: str, value: Buffer) -> None:
101105@pytest .mark .parametrize ("store" , ["local" , "memory" , "zip" ], indirect = True )
102106async def test_wrapped_get (store : Store , capsys : pytest .CaptureFixture [str ]) -> None :
103107 # define a class that prints when it sets
104- class NoisyGetter (WrapperStore ):
105- def get (self , key : str , prototype : BufferPrototype ) -> None :
108+ class NoisyGetter (WrapperStore [Any ]):
109+ async def get (
110+ self , key : str , prototype : BufferPrototype , byte_range : ByteRequest | None = None
111+ ) -> Buffer | None :
106112 print (f"getting { key } " )
107- return super ().get (key , prototype = prototype )
113+ return await super ().get (key , prototype = prototype )
108114
109115 key = "foo"
110116 value = Buffer .from_bytes (b"bar" )
0 commit comments