1
1
import abc
2
2
import os
3
3
import shutil
4
- from typing import Any , Dict , KeysView , Optional
4
+ from typing import Any , Dict , KeysView , Optional , Union
5
5
6
6
import numpy
7
7
@@ -51,11 +51,11 @@ def delete(self, period: Optional[Period] = None) -> None:
51
51
...
52
52
53
53
@abc .abstractmethod
54
- def known_periods (self ) -> KeysView [ Period ]:
54
+ def memory_usage (self ) -> Dict [ str , int ]:
55
55
...
56
56
57
57
@abc .abstractmethod
58
- def memory_usage (self ) -> Dict [ str , int ]:
58
+ def known_periods (self ) -> KeysView [ Period ]:
59
59
...
60
60
61
61
@@ -74,7 +74,7 @@ def cast_period(self, period: Optional[Period], eternal: bool) -> Period:
74
74
75
75
76
76
class MemoryStorage (StorageLike ):
77
- """Responsible for storing and retrieving values in memory."""
77
+ """Low-level class responsible for storing and retrieving values in memory."""
78
78
79
79
def get (self , state : Dict [Period , Any ], key : Period ) -> Any :
80
80
return state .get (key )
@@ -90,7 +90,6 @@ def delete_all(self, state: StateType) -> dict:
90
90
state .clear ()
91
91
return state
92
92
93
- # TODO: test
94
93
def memory_usage (self , state : StateType ) -> Dict [str , int ]:
95
94
if not state :
96
95
return {
@@ -110,14 +109,17 @@ def memory_usage(self, state: StateType) -> Dict[str, int]:
110
109
111
110
112
111
class DiskStorage (StorageLike ):
113
- """Responsible for storing and retrieving values on disk."""
112
+ """Low-level class responsible for storing and retrieving values on disk."""
114
113
directory : str
115
114
preserve : bool
116
115
117
116
def __init__ (self , directory : str , preserve : bool ) -> None :
118
117
self .directory = directory
119
118
self .preserve = preserve
120
119
120
+ if not os .path .isdir (self .directory ):
121
+ os .makedirs (self .directory , exist_ok = True )
122
+
121
123
def get (self , state : Dict [Period , Any ], key : Period ) -> Any :
122
124
file = state .get (key )
123
125
@@ -153,7 +155,6 @@ def delete_all(self, state: StateType) -> dict:
153
155
state .clear ()
154
156
return state
155
157
156
- # TODO: test
157
158
def memory_usage (self , state : StateType ) -> Dict [str , int ]:
158
159
if not state :
159
160
return {
@@ -203,21 +204,26 @@ def __del__(self) -> None:
203
204
shutil .rmtree (parent_dir )
204
205
205
206
206
- class InMemoryStorage (CachingLike , SupportsPeriodCasting ):
207
+ StorageType = Union [MemoryStorage , DiskStorage ]
208
+
209
+
210
+ class Cache (CachingLike , SupportsPeriodCasting ):
207
211
"""
208
- Low-level class responsible for storing and retrieving calculated vectors in memory.
212
+ Explicit Cache API responsible of:
209
213
210
- TODO: separate concerns between the caching API and the storing API.
214
+ * keeping cache state
215
+ * reading from storages
216
+ * writing to storages
211
217
"""
212
218
213
219
state : StateType
220
+ storage : StorageType
214
221
is_eternal : bool
215
- storage : MemoryStorage
216
222
217
- def __init__ (self , is_eternal : bool = False ) -> None :
223
+ def __init__ (self , storage : StorageType , is_eternal : bool = False ) -> None :
218
224
self .state = {}
225
+ self .storage = storage
219
226
self .is_eternal = is_eternal
220
- self .storage = MemoryStorage ()
221
227
222
228
def get (self , period : Period ) -> Any :
223
229
casted : Period = self .cast_period (period , self .is_eternal )
@@ -235,75 +241,20 @@ def delete(self, period: Optional[Period] = None) -> None:
235
241
casted : Period = self .cast_period (period , self .is_eternal )
236
242
self .state = self .storage .delete (self .state , casted )
237
243
238
- # TODO: test
239
- def known_periods (self ) -> KeysView [Period ]:
240
- return self .state .keys ()
241
-
242
- # TODO: test
243
244
def memory_usage (self ) -> Dict [str , int ]:
244
245
return self .storage .memory_usage (self .state )
245
246
246
- def get_known_periods (self ) -> KeysView [Period ]:
247
- raise ValueError ("TODO: add a deprecation warning" )
248
-
249
- # TODO: decide what to do with this.
250
- def get_memory_usage (self ) -> Dict [str , int ]:
251
- raise ValueError ("TODO: add a deprecation warning" )
252
-
253
-
254
- class OnDiskStorage (CachingLike , SupportsPeriodCasting ):
255
- """
256
- Low-level class responsible for storing and retrieving calculated vectors on disk.
257
-
258
- TODO: separate concerns between the caching API and the storing API.
259
- """
260
-
261
- state : StateType
262
- is_eternal : bool
263
- storage : DiskStorage
264
-
265
- def __init__ (
266
- self ,
267
- storage_dir : str ,
268
- is_eternal : bool = False ,
269
- preserve_storage_dir : bool = False ,
270
- ) -> None :
271
- self .state = {}
272
- self .is_eternal = is_eternal
273
- self .storage = DiskStorage (storage_dir , preserve_storage_dir )
274
-
275
- def get (self , period : Period ) -> Any :
276
- casted : Period = self .cast_period (period , self .is_eternal )
277
- return self .storage .get (self .state , casted )
278
-
279
- def put (self , value : Any , period : Period ) -> None :
280
- casted : Period = self .cast_period (period , self .is_eternal )
281
- self .state = self .storage .put (self .state , casted , value )
282
-
283
- def delete (self , period : Optional [Period ] = None ) -> None :
284
- if period is None :
285
- self .state = self .storage .delete_all (self .state )
286
- return
287
-
288
- casted : Period = self .cast_period (period , self .is_eternal )
289
- self .state = self .storage .delete (self .state , casted )
290
-
291
- # TODO: test
292
247
def known_periods (self ) -> KeysView [Period ]:
293
248
return self .state .keys ()
294
249
295
- # TODO: test
296
- def memory_usage (self ) -> Dict [str , int ]:
297
- return self .storage .memory_usage (self .state )
298
-
250
+ # TODO : test
299
251
def get_known_periods (self ) -> KeysView [Period ]:
300
252
raise ValueError ("TODO: add a deprecation warning" )
301
253
254
+ # TODO : test
302
255
def get_memory_usage (self ) -> Dict [str , int ]:
303
256
raise ValueError ("TODO: add a deprecation warning" )
304
257
258
+ # TODO : test
305
259
def restore (self , state : StateType ) -> StateType :
306
260
raise ValueError ("TODO: add a deprecation warning" )
307
-
308
- def __del__ (self ) -> None :
309
- raise ValueError ("TODO: add a deprecation warning" )
0 commit comments