1+ from __future__ import annotations
12import time
2- from collections .abc import MutableMapping
3+ from typing import MutableMapping , List , TypedDict , Iterator , Any
4+
35from functools import lru_cache
46
57
6- class DirCache (MutableMapping ):
8+ class DirEntry (TypedDict ):
9+ name : str
10+ size : int
11+ type : str
12+
13+
14+ class DirCache (MutableMapping [str , List [DirEntry ]]):
715 """
816 Caching of directory listings, in a structure like::
917
@@ -26,10 +34,10 @@ class DirCache(MutableMapping):
2634
2735 def __init__ (
2836 self ,
29- use_listings_cache = True ,
30- listings_expiry_time = None ,
31- max_paths = None ,
32- ** kwargs ,
37+ use_listings_cache : bool = True ,
38+ listings_expiry_time : float | None = None ,
39+ max_paths : int | None = None ,
40+ ** kwargs : Any ,
3341 ):
3442 """
3543
@@ -45,36 +53,36 @@ def __init__(
4553 The number of most recent listings that are considered valid; 'recent'
4654 refers to when the entry was set.
4755 """
48- self ._cache = {}
49- self ._times = {}
56+ self ._cache : dict [ str , list [ DirEntry ]] = {}
57+ self ._times : dict [ str , float ] = {}
5058 if max_paths :
5159 self ._q = lru_cache (max_paths + 1 )(lambda key : self ._cache .pop (key , None ))
5260 self .use_listings_cache = use_listings_cache
5361 self .listings_expiry_time = listings_expiry_time
5462 self .max_paths = max_paths
5563
56- def __getitem__ (self , item ) :
64+ def __getitem__ (self , item : str ) -> list [ DirEntry ] :
5765 if self .listings_expiry_time is not None :
5866 if self ._times .get (item , 0 ) - time .time () < - self .listings_expiry_time :
5967 del self ._cache [item ]
6068 if self .max_paths :
6169 self ._q (item )
6270 return self ._cache [item ] # maybe raises KeyError
6371
64- def clear (self ):
72+ def clear (self ) -> None :
6573 self ._cache .clear ()
6674
67- def __len__ (self ):
75+ def __len__ (self ) -> int :
6876 return len (self ._cache )
6977
70- def __contains__ (self , item ) :
78+ def __contains__ (self , item : object ) -> bool :
7179 try :
72- self [item ]
80+ self [item ] # type: ignore[index]
7381 return True
7482 except KeyError :
7583 return False
7684
77- def __setitem__ (self , key , value ) :
85+ def __setitem__ (self , key : str , value : List [ DirEntry ]) -> None :
7886 if not self .use_listings_cache :
7987 return
8088 if self .max_paths :
@@ -83,10 +91,10 @@ def __setitem__(self, key, value):
8391 if self .listings_expiry_time is not None :
8492 self ._times [key ] = time .time ()
8593
86- def __delitem__ (self , key ):
94+ def __delitem__ (self , key ) -> None :
8795 del self ._cache [key ]
8896
89- def __iter__ (self ):
97+ def __iter__ (self ) -> Iterator [ str ] :
9098 entries = list (self ._cache )
9199
92100 return (k for k in entries if k in self )
0 commit comments