11from __future__ import annotations
22
33import logging
4- from typing import TYPE_CHECKING
4+ from typing import TYPE_CHECKING , Any
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 ]):
19+ class TestLoggingStore (StoreTests [LoggingStore [ LocalStore ] , cpu .Buffer ]):
2020 store_cls = LoggingStore
2121 buffer_cls = cpu .Buffer
2222
23- async def get (self , store : LoggingStore , key : str ) -> Buffer :
23+ async def get (self , store : LoggingStore [ LocalStore ] , key : str ) -> Buffer :
2424 return self .buffer_cls .from_bytes ((store ._store .root / key ).read_bytes ())
2525
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 :
2727 parent = (store ._store .root / key ).parent
2828 if not parent .exists ():
2929 parent .mkdir (parents = True )
3030 (store ._store .root / key ).write_bytes (value .to_bytes ())
3131
3232 @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" }
3535
3636 @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" }
3939
4040 @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 ] :
4242 return self .store_cls (** store_kwargs )
4343
44- def test_store_supports_writes (self , store : LoggingStore ) -> None :
44+ def test_store_supports_writes (self , store : LoggingStore [ LocalStore ] ) -> None :
4545 assert store .supports_writes
4646
47- def test_store_supports_partial_writes (self , store : LoggingStore ) -> None :
47+ def test_store_supports_partial_writes (self , store : LoggingStore [ LocalStore ] ) -> None :
4848 assert store .supports_partial_writes
4949
50- def test_store_supports_listing (self , store : LoggingStore ) -> None :
50+ def test_store_supports_listing (self , store : LoggingStore [ LocalStore ] ) -> None :
5151 assert store .supports_listing
5252
53- def test_store_repr (self , store : LoggingStore ) -> None :
53+ def test_store_repr (self , store : LoggingStore [ LocalStore ] ) -> None :
5454 assert f"{ store !r} " == f"LoggingStore(LocalStore, 'file://{ store ._store .root .as_posix ()} ')"
5555
56- def test_store_str (self , store : LoggingStore ) -> None :
56+ def test_store_str (self , store : LoggingStore [ LocalStore ] ) -> None :
5757 assert str (store ) == f"logging-file://{ store ._store .root .as_posix ()} "
5858
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 :
6062 # Store and then remove existing handlers to enter default handler code path
6163 handlers = logging .getLogger ().handlers [:]
6264 for h in handlers :
6365 logging .getLogger ().removeHandler (h )
6466 # Test logs are sent to stdout
6567 wrapped = LoggingStore (store = local_store )
6668 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]
6870 assert res is None
6971 captured = capsys .readouterr ()
7072 assert len (captured ) == 2
@@ -74,7 +76,7 @@ async def test_default_handler(self, local_store, capsys) -> None:
7476 for h in handlers :
7577 logging .getLogger ().addHandler (h )
7678
77- def test_is_open_setter_raises (self , store : LoggingStore ) -> None :
79+ def test_is_open_setter_raises (self , store : LoggingStore [ LocalStore ] ) -> None :
7880 "Test that a user cannot change `_is_open` without opening the underlying store."
7981 with pytest .raises (
8082 NotImplementedError , match = "LoggingStore must be opened via the `_open` method"
@@ -83,12 +85,12 @@ def test_is_open_setter_raises(self, store: LoggingStore) -> None:
8385
8486
8587@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 :
8789 wrapped = LoggingStore (store = store , log_level = "DEBUG" )
8890 buffer = default_buffer_prototype ().buffer
8991
9092 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]
9294 assert res is None
9395 assert len (caplog .record_tuples ) == 2
9496 for tup in caplog .record_tuples :
0 commit comments