33import inspect
44import logging
55import time
6+ from collections import defaultdict
67from contextlib import contextmanager
78from typing import TYPE_CHECKING
89
9- from zarr .abc .store import Store
10+ from zarr .abc .store import AccessMode , Store
1011
1112if TYPE_CHECKING :
1213 from collections .abc import AsyncGenerator , Generator
1617
1718class LoggingStore (Store ):
1819 _store : Store
20+ counter : defaultdict [str , int ]
1921
2022 def __init__ (
2123 self ,
@@ -24,6 +26,7 @@ def __init__(
2426 log_handler : logging .Handler | None = None ,
2527 ):
2628 self ._store = store
29+ self .counter = defaultdict (int )
2730
2831 self ._configure_logger (log_level , log_handler )
2932
@@ -44,16 +47,19 @@ def _default_handler(self) -> logging.Handler:
4447 """Define a default log handler"""
4548 handler = logging .StreamHandler ()
4649 handler .setLevel (self .log_level )
47- formatter = logging .Formatter ("%(asctime)s - %(name)s - %(levelname)s - %(message)s" )
48- handler .setFormatter (formatter )
50+ handler .setFormatter (
51+ logging .Formatter ("%(asctime)s - %(name)s - %(levelname)s - %(message)s" )
52+ )
4953 return handler
5054
5155 @contextmanager
5256 def log (self ) -> Generator [None , None , None ]:
53- op = f"{ type (self ._store ).__name__ } .{ inspect .stack ()[2 ].function } "
57+ method = inspect .stack ()[2 ].function
58+ op = f"{ type (self ._store ).__name__ } .{ method } "
5459 self .logger .info (f"Calling { op } " )
5560 start_time = time .time ()
5661 try :
62+ self .counter [method ] += 1
5763 yield
5864 finally :
5965 end_time = time .time ()
@@ -79,6 +85,16 @@ def supports_listing(self) -> bool:
7985 with self .log ():
8086 return self ._store .supports_listing
8187
88+ @property
89+ def _mode (self ) -> AccessMode : # type: ignore[override]
90+ with self .log ():
91+ return self ._store ._mode
92+
93+ @property
94+ def _is_open (self ) -> bool : # type: ignore[override]
95+ with self .log ():
96+ return self ._store ._is_open
97+
8298 async def empty (self ) -> bool :
8399 with self .log ():
84100 return await self ._store .empty ()
0 commit comments