11from __future__ import annotations
22
33import logging
4- from typing import TYPE_CHECKING
4+ from typing import TYPE_CHECKING , TypedDict
55
66import pytest
77
1111from zarr .testing .store import StoreTests
1212
1313if TYPE_CHECKING :
14- from _pytest . compat import LEGACY_PATH
14+ from pathlib import Path
1515
1616 from zarr .abc .store import Store
1717
1818
19- class TestLoggingStore (StoreTests [LoggingStore , cpu .Buffer ]):
20- store_cls = LoggingStore
19+ class StoreKwargs (TypedDict ):
20+ store : LocalStore
21+ log_level : str
22+
23+
24+ class TestLoggingStore (StoreTests [LoggingStore [LocalStore ], cpu .Buffer ]):
25+ store_cls = LoggingStore [LocalStore ]
2126 buffer_cls = cpu .Buffer
2227
23- async def get (self , store : LoggingStore , key : str ) -> Buffer :
28+ async def get (self , store : LoggingStore [ LocalStore ] , key : str ) -> Buffer :
2429 return self .buffer_cls .from_bytes ((store ._store .root / key ).read_bytes ())
2530
26- async def set (self , store : LoggingStore , key : str , value : Buffer ) -> None :
31+ async def set (self , store : LoggingStore [ LocalStore ] , key : str , value : Buffer ) -> None :
2732 parent = (store ._store .root / key ).parent
2833 if not parent .exists ():
2934 parent .mkdir (parents = True )
3035 (store ._store .root / key ).write_bytes (value .to_bytes ())
3136
3237 @pytest .fixture
33- def store_kwargs (self , tmpdir : LEGACY_PATH ) -> dict [ str , str ] :
34- return {"store" : LocalStore (str (tmpdir )), "log_level" : "DEBUG" }
38+ def store_kwargs (self , tmp_path : Path ) -> StoreKwargs :
39+ return {"store" : LocalStore (str (tmp_path )), "log_level" : "DEBUG" }
3540
3641 @pytest .fixture
37- def open_kwargs (self , tmpdir ) -> dict [str , str ]:
38- return {"store_cls" : LocalStore , "root" : str (tmpdir ), "log_level" : "DEBUG" }
42+ def open_kwargs (self , tmp_path : Path ) -> dict [str , type [ LocalStore ] | str ]:
43+ return {"store_cls" : LocalStore , "root" : str (tmp_path ), "log_level" : "DEBUG" }
3944
4045 @pytest .fixture
41- def store (self , store_kwargs : str | dict [ str , Buffer ] | None ) -> LoggingStore :
46+ def store (self , store_kwargs : StoreKwargs ) -> LoggingStore [ LocalStore ] :
4247 return self .store_cls (** store_kwargs )
4348
44- def test_store_supports_writes (self , store : LoggingStore ) -> None :
49+ def test_store_supports_writes (self , store : LoggingStore [ LocalStore ] ) -> None :
4550 assert store .supports_writes
4651
47- def test_store_supports_partial_writes (self , store : LoggingStore ) -> None :
52+ def test_store_supports_partial_writes (self , store : LoggingStore [ LocalStore ] ) -> None :
4853 assert store .supports_partial_writes
4954
50- def test_store_supports_listing (self , store : LoggingStore ) -> None :
55+ def test_store_supports_listing (self , store : LoggingStore [ LocalStore ] ) -> None :
5156 assert store .supports_listing
5257
53- def test_store_repr (self , store : LoggingStore ) -> None :
58+ def test_store_repr (self , store : LoggingStore [ LocalStore ] ) -> None :
5459 assert f"{ store !r} " == f"LoggingStore(LocalStore, 'file://{ store ._store .root .as_posix ()} ')"
5560
56- def test_store_str (self , store : LoggingStore ) -> None :
61+ def test_store_str (self , store : LoggingStore [ LocalStore ] ) -> None :
5762 assert str (store ) == f"logging-file://{ store ._store .root .as_posix ()} "
5863
59- async def test_default_handler (self , local_store , capsys ) -> None :
64+ async def test_default_handler (
65+ self , local_store : LocalStore , capsys : pytest .CaptureFixture [str ]
66+ ) -> None :
6067 # Store and then remove existing handlers to enter default handler code path
6168 handlers = logging .getLogger ().handlers [:]
6269 for h in handlers :
6370 logging .getLogger ().removeHandler (h )
6471 # Test logs are sent to stdout
6572 wrapped = LoggingStore (store = local_store )
6673 buffer = default_buffer_prototype ().buffer
67- res = await wrapped .set ("foo/bar/c/0" , buffer .from_bytes (b"\x01 \x02 \x03 \x04 " ))
74+ res = await wrapped .set ("foo/bar/c/0" , buffer .from_bytes (b"\x01 \x02 \x03 \x04 " )) # type: ignore[func-returns-value]
6875 assert res is None
6976 captured = capsys .readouterr ()
7077 assert len (captured ) == 2
@@ -74,7 +81,7 @@ async def test_default_handler(self, local_store, capsys) -> None:
7481 for h in handlers :
7582 logging .getLogger ().addHandler (h )
7683
77- def test_is_open_setter_raises (self , store : LoggingStore ) -> None :
84+ def test_is_open_setter_raises (self , store : LoggingStore [ LocalStore ] ) -> None :
7885 "Test that a user cannot change `_is_open` without opening the underlying store."
7986 with pytest .raises (
8087 NotImplementedError , match = "LoggingStore must be opened via the `_open` method"
@@ -83,12 +90,12 @@ def test_is_open_setter_raises(self, store: LoggingStore) -> None:
8390
8491
8592@pytest .mark .parametrize ("store" , ["local" , "memory" , "zip" ], indirect = ["store" ])
86- async def test_logging_store (store : Store , caplog ) -> None :
93+ async def test_logging_store (store : Store , caplog : pytest . LogCaptureFixture ) -> None :
8794 wrapped = LoggingStore (store = store , log_level = "DEBUG" )
8895 buffer = default_buffer_prototype ().buffer
8996
9097 caplog .clear ()
91- res = await wrapped .set ("foo/bar/c/0" , buffer .from_bytes (b"\x01 \x02 \x03 \x04 " ))
98+ res = await wrapped .set ("foo/bar/c/0" , buffer .from_bytes (b"\x01 \x02 \x03 \x04 " )) # type: ignore[func-returns-value]
9299 assert res is None
93100 assert len (caplog .record_tuples ) == 2
94101 for tup in caplog .record_tuples :
0 commit comments