1
1
from __future__ import annotations
2
2
3
- from typing import TYPE_CHECKING
3
+ from typing import TYPE_CHECKING , Any , TypedDict
4
4
5
5
import pytest
6
6
7
- from zarr .core .buffer .cpu import Buffer , buffer_prototype
7
+ from zarr .abc .store import ByteRequest , Store
8
+ from zarr .core .buffer import Buffer
9
+ from zarr .core .buffer .cpu import buffer_prototype
8
10
from zarr .storage import LocalStore , WrapperStore
9
11
from zarr .testing .store import StoreTests
10
12
11
13
if TYPE_CHECKING :
12
- from _pytest . compat import LEGACY_PATH
14
+ from pathlib import Path
13
15
14
- from zarr .abc .store import Store
15
16
from zarr .core .buffer .core import BufferPrototype
16
17
17
18
19
+ class StoreKwargs (TypedDict ):
20
+ store : LocalStore
21
+
22
+
23
+ class OpenKwargs (TypedDict ):
24
+ store_cls : type [LocalStore ]
25
+ root : str
26
+
27
+
18
28
# TODO: fix this warning
19
29
@pytest .mark .filterwarnings (
20
30
"ignore:coroutine 'ClientCreatorContext.__aexit__' was never awaited:RuntimeWarning"
21
31
)
22
- class TestWrapperStore (StoreTests [WrapperStore , Buffer ]):
23
- store_cls = WrapperStore
32
+ class TestWrapperStore (StoreTests [WrapperStore [ LocalStore ] , Buffer ]):
33
+ store_cls = WrapperStore [ LocalStore ]
24
34
buffer_cls = Buffer
25
35
26
- async def get (self , store : WrapperStore , key : str ) -> Buffer :
36
+ async def get (self , store : WrapperStore [ LocalStore ] , key : str ) -> Buffer :
27
37
return self .buffer_cls .from_bytes ((store ._store .root / key ).read_bytes ())
28
38
29
- async def set (self , store : WrapperStore , key : str , value : Buffer ) -> None :
39
+ async def set (self , store : WrapperStore [ LocalStore ] , key : str , value : Buffer ) -> None :
30
40
parent = (store ._store .root / key ).parent
31
41
if not parent .exists ():
32
42
parent .mkdir (parents = True )
33
43
(store ._store .root / key ).write_bytes (value .to_bytes ())
34
44
35
45
@pytest .fixture
36
- def store_kwargs (self , tmpdir : LEGACY_PATH ) -> dict [ str , str ] :
37
- return {"store" : LocalStore (str (tmpdir ))}
46
+ def store_kwargs (self , tmp_path : Path ) -> StoreKwargs :
47
+ return {"store" : LocalStore (str (tmp_path ))}
38
48
39
49
@pytest .fixture
40
- def open_kwargs (self , tmpdir ) -> dict [ str , str ] :
41
- return {"store_cls" : LocalStore , "root" : str (tmpdir )}
50
+ def open_kwargs (self , tmp_path : Path ) -> OpenKwargs :
51
+ return {"store_cls" : LocalStore , "root" : str (tmp_path )}
42
52
43
- def test_store_supports_writes (self , store : WrapperStore ) -> None :
53
+ def test_store_supports_writes (self , store : WrapperStore [ LocalStore ] ) -> None :
44
54
assert store .supports_writes
45
55
46
- def test_store_supports_partial_writes (self , store : WrapperStore ) -> None :
56
+ def test_store_supports_partial_writes (self , store : WrapperStore [ LocalStore ] ) -> None :
47
57
assert store .supports_partial_writes
48
58
49
- def test_store_supports_listing (self , store : WrapperStore ) -> None :
59
+ def test_store_supports_listing (self , store : WrapperStore [ LocalStore ] ) -> None :
50
60
assert store .supports_listing
51
61
52
- def test_store_repr (self , store : WrapperStore ) -> None :
62
+ def test_store_repr (self , store : WrapperStore [ LocalStore ] ) -> None :
53
63
assert f"{ store !r} " == f"WrapperStore(LocalStore, 'file://{ store ._store .root .as_posix ()} ')"
54
64
55
- def test_store_str (self , store : WrapperStore ) -> None :
65
+ def test_store_str (self , store : WrapperStore [ LocalStore ] ) -> None :
56
66
assert str (store ) == f"wrapping-file://{ store ._store .root .as_posix ()} "
57
67
58
- def test_check_writeable (self , store : WrapperStore ) -> None :
68
+ def test_check_writeable (self , store : WrapperStore [ LocalStore ] ) -> None :
59
69
"""
60
70
Test _check_writeable() runs without errors.
61
71
"""
62
72
store ._check_writable ()
63
73
64
- def test_close (self , store : WrapperStore ) -> None :
74
+ def test_close (self , store : WrapperStore [ LocalStore ] ) -> None :
65
75
"Test store can be closed"
66
76
store .close ()
67
77
assert not store ._is_open
68
78
69
- def test_is_open_setter_raises (self , store : WrapperStore ) -> None :
79
+ def test_is_open_setter_raises (self , store : WrapperStore [ LocalStore ] ) -> None :
70
80
"""
71
81
Test that a user cannot change `_is_open` without opening the underlying store.
72
82
"""
@@ -83,7 +93,7 @@ def test_is_open_setter_raises(self, store: WrapperStore) -> None:
83
93
@pytest .mark .parametrize ("store" , ["local" , "memory" , "zip" ], indirect = True )
84
94
async def test_wrapped_set (store : Store , capsys : pytest .CaptureFixture [str ]) -> None :
85
95
# define a class that prints when it sets
86
- class NoisySetter (WrapperStore ):
96
+ class NoisySetter (WrapperStore [ Store ] ):
87
97
async def set (self , key : str , value : Buffer ) -> None :
88
98
print (f"setting { key } " )
89
99
await super ().set (key , value )
@@ -101,15 +111,17 @@ async def set(self, key: str, value: Buffer) -> None:
101
111
@pytest .mark .parametrize ("store" , ["local" , "memory" , "zip" ], indirect = True )
102
112
async def test_wrapped_get (store : Store , capsys : pytest .CaptureFixture [str ]) -> None :
103
113
# define a class that prints when it sets
104
- class NoisyGetter (WrapperStore ):
105
- def get (self , key : str , prototype : BufferPrototype ) -> None :
114
+ class NoisyGetter (WrapperStore [Any ]):
115
+ async def get (
116
+ self , key : str , prototype : BufferPrototype , byte_range : ByteRequest | None = None
117
+ ) -> None :
106
118
print (f"getting { key } " )
107
- return super ().get (key , prototype = prototype )
119
+ await super ().get (key , prototype = prototype , byte_range = byte_range )
108
120
109
121
key = "foo"
110
122
value = Buffer .from_bytes (b"bar" )
111
123
store_wrapped = NoisyGetter (store )
112
124
await store_wrapped .set (key , value )
113
- assert await store_wrapped .get (key , buffer_prototype ) == value
125
+ await store_wrapped .get (key , buffer_prototype )
114
126
captured = capsys .readouterr ()
115
127
assert f"getting { key } " in captured .out
0 commit comments