1
1
from __future__ import annotations
2
2
3
3
import logging
4
- from typing import TYPE_CHECKING
4
+ from typing import TYPE_CHECKING , Any
5
5
6
6
import pytest
7
7
11
11
from zarr .testing .store import StoreTests
12
12
13
13
if TYPE_CHECKING :
14
- from _pytest . compat import LEGACY_PATH
14
+ from pathlib import Path
15
15
16
16
from zarr .abc .store import Store
17
17
18
18
19
- class TestLoggingStore (StoreTests [LoggingStore , cpu .Buffer ]):
19
+ class TestLoggingStore (StoreTests [LoggingStore [ LocalStore ] , cpu .Buffer ]):
20
20
store_cls = LoggingStore
21
21
buffer_cls = cpu .Buffer
22
22
23
- async def get (self , store : LoggingStore , key : str ) -> Buffer :
23
+ async def get (self , store : LoggingStore [ LocalStore ] , key : str ) -> Buffer :
24
24
return self .buffer_cls .from_bytes ((store ._store .root / key ).read_bytes ())
25
25
26
- async def set (self , store : LoggingStore , key : str , value : Buffer ) -> None :
26
+ async def set (self , store : LoggingStore [ LocalStore ] , key : str , value : Buffer ) -> None :
27
27
parent = (store ._store .root / key ).parent
28
28
if not parent .exists ():
29
29
parent .mkdir (parents = True )
30
30
(store ._store .root / key ).write_bytes (value .to_bytes ())
31
31
32
32
@pytest .fixture
33
- def store_kwargs (self , tmpdir : LEGACY_PATH ) -> dict [str , str ]:
34
- return {"store" : LocalStore (str (tmpdir )), "log_level" : "DEBUG" }
33
+ def store_kwargs (self , tmp_path : Path ) -> dict [str , str | LocalStore ]:
34
+ return {"store" : LocalStore (str (tmp_path )), "log_level" : "DEBUG" }
35
35
36
36
@pytest .fixture
37
- def open_kwargs (self , tmpdir ) -> dict [str , str ]:
38
- return {"store_cls" : LocalStore , "root" : str (tmpdir ), "log_level" : "DEBUG" }
37
+ def open_kwargs (self , store_kwargs : dict [ str , Any ], tmp_path : Path ) -> dict [str , Any ]:
38
+ return {"store_cls" : LocalStore , "root" : str (tmp_path ), "log_level" : "DEBUG" }
39
39
40
40
@pytest .fixture
41
- def store (self , store_kwargs : str | dict [str , Buffer ] | None ) -> LoggingStore :
41
+ async def store (self , store_kwargs : dict [str , Any ] ) -> LoggingStore [ LocalStore ] :
42
42
return self .store_cls (** store_kwargs )
43
43
44
- def test_store_supports_writes (self , store : LoggingStore ) -> None :
44
+ def test_store_supports_writes (self , store : LoggingStore [ LocalStore ] ) -> None :
45
45
assert store .supports_writes
46
46
47
- def test_store_supports_partial_writes (self , store : LoggingStore ) -> None :
47
+ def test_store_supports_partial_writes (self , store : LoggingStore [ LocalStore ] ) -> None :
48
48
assert store .supports_partial_writes
49
49
50
- def test_store_supports_listing (self , store : LoggingStore ) -> None :
50
+ def test_store_supports_listing (self , store : LoggingStore [ LocalStore ] ) -> None :
51
51
assert store .supports_listing
52
52
53
- def test_store_repr (self , store : LoggingStore ) -> None :
53
+ def test_store_repr (self , store : LoggingStore [ LocalStore ] ) -> None :
54
54
assert f"{ store !r} " == f"LoggingStore(LocalStore, 'file://{ store ._store .root .as_posix ()} ')"
55
55
56
- def test_store_str (self , store : LoggingStore ) -> None :
56
+ def test_store_str (self , store : LoggingStore [ LocalStore ] ) -> None :
57
57
assert str (store ) == f"logging-file://{ store ._store .root .as_posix ()} "
58
58
59
- async def test_default_handler (self , local_store , capsys ) -> None :
59
+ async def test_default_handler (
60
+ self , local_store : LocalStore , capsys : pytest .CaptureFixture [str ]
61
+ ) -> None :
60
62
# Store and then remove existing handlers to enter default handler code path
61
63
handlers = logging .getLogger ().handlers [:]
62
64
for h in handlers :
63
65
logging .getLogger ().removeHandler (h )
64
66
# Test logs are sent to stdout
65
67
wrapped = LoggingStore (store = local_store )
66
68
buffer = default_buffer_prototype ().buffer
67
- res = await wrapped .set ("foo/bar/c/0" , buffer .from_bytes (b"\x01 \x02 \x03 \x04 " ))
69
+ res = await wrapped .set ("foo/bar/c/0" , buffer .from_bytes (b"\x01 \x02 \x03 \x04 " )) # type: ignore[func-returns-value]
68
70
assert res is None
69
71
captured = capsys .readouterr ()
70
72
assert len (captured ) == 2
@@ -74,7 +76,7 @@ async def test_default_handler(self, local_store, capsys) -> None:
74
76
for h in handlers :
75
77
logging .getLogger ().addHandler (h )
76
78
77
- def test_is_open_setter_raises (self , store : LoggingStore ) -> None :
79
+ def test_is_open_setter_raises (self , store : LoggingStore [ LocalStore ] ) -> None :
78
80
"Test that a user cannot change `_is_open` without opening the underlying store."
79
81
with pytest .raises (
80
82
NotImplementedError , match = "LoggingStore must be opened via the `_open` method"
@@ -83,12 +85,12 @@ def test_is_open_setter_raises(self, store: LoggingStore) -> None:
83
85
84
86
85
87
@pytest .mark .parametrize ("store" , ["local" , "memory" , "zip" ], indirect = ["store" ])
86
- async def test_logging_store (store : Store , caplog ) -> None :
88
+ async def test_logging_store (store : Store , caplog : pytest . LogCaptureFixture ) -> None :
87
89
wrapped = LoggingStore (store = store , log_level = "DEBUG" )
88
90
buffer = default_buffer_prototype ().buffer
89
91
90
92
caplog .clear ()
91
- res = await wrapped .set ("foo/bar/c/0" , buffer .from_bytes (b"\x01 \x02 \x03 \x04 " ))
93
+ res = await wrapped .set ("foo/bar/c/0" , buffer .from_bytes (b"\x01 \x02 \x03 \x04 " )) # type: ignore[func-returns-value]
92
94
assert res is None
93
95
assert len (caplog .record_tuples ) == 2
94
96
for tup in caplog .record_tuples :
0 commit comments