@@ -66,16 +66,16 @@ class BaseProvider(ABC):
66
66
Abstract Base Class for Parameter providers
67
67
"""
68
68
69
- store : Dict [Tuple [ str , TransformOptions ] , ExpirableValue ]
69
+ store : Dict [Tuple , ExpirableValue ]
70
70
71
71
def __init__ (self ):
72
72
"""
73
73
Initialize the base provider
74
74
"""
75
75
76
- self .store : Dict [Tuple [ str , TransformOptions ] , ExpirableValue ] = {}
76
+ self .store : Dict [Tuple , ExpirableValue ] = {}
77
77
78
- def has_not_expired_in_cache (self , key : Tuple [ str , TransformOptions ] ) -> bool :
78
+ def has_not_expired_in_cache (self , key : Tuple ) -> bool :
79
79
return key in self .store and self .store [key ].ttl >= datetime .now ()
80
80
81
81
def get (
@@ -123,13 +123,13 @@ def get(
123
123
# parameter will always be used in a specific transform, this should be
124
124
# an acceptable tradeoff.
125
125
value : Optional [Union [str , bytes , dict ]] = None
126
- key = (name , transform )
126
+ key = self . _build_cache_key (name = name , transform = transform )
127
127
128
128
# If max_age is not set, resolve it from the environment variable, defaulting to DEFAULT_MAX_AGE_SECS
129
129
max_age = resolve_max_age (env = os .getenv (constants .PARAMETERS_MAX_AGE_ENV , DEFAULT_MAX_AGE_SECS ), choice = max_age )
130
130
131
131
if not force_fetch and self .has_not_expired_in_cache (key ):
132
- return self .store [ key ]. value
132
+ return self .fetch_from_cache ( key )
133
133
134
134
try :
135
135
value = self ._get (name , ** sdk_options )
@@ -142,7 +142,7 @@ def get(
142
142
143
143
# NOTE: don't cache None, as they might've been failed transforms and may be corrected
144
144
if value is not None :
145
- self .store [ key ] = ExpirableValue ( value , datetime . now () + timedelta ( seconds = max_age ) )
145
+ self .add_to_cache ( key = key , value = value , max_age = max_age )
146
146
147
147
return value
148
148
@@ -191,13 +191,13 @@ def get_multiple(
191
191
TransformParameterError
192
192
When the parameter provider fails to transform a parameter value.
193
193
"""
194
- key = ( path , transform )
194
+ key = self . _build_cache_key ( name = path , transform = transform , is_nested = True )
195
195
196
196
# If max_age is not set, resolve it from the environment variable, defaulting to DEFAULT_MAX_AGE_SECS
197
197
max_age = resolve_max_age (env = os .getenv (constants .PARAMETERS_MAX_AGE_ENV , DEFAULT_MAX_AGE_SECS ), choice = max_age )
198
198
199
199
if not force_fetch and self .has_not_expired_in_cache (key ):
200
- return self .store [ key ]. value # type: ignore # need to revisit entire typing here
200
+ return self .fetch_from_cache ( key )
201
201
202
202
try :
203
203
values = self ._get_multiple (path , ** sdk_options )
@@ -208,7 +208,7 @@ def get_multiple(
208
208
if transform :
209
209
values .update (transform_value (values , transform , raise_on_transform_error ))
210
210
211
- self .store [ key ] = ExpirableValue ( values , datetime . now () + timedelta ( seconds = max_age ) )
211
+ self .add_to_cache ( key = key , value = values , max_age = max_age )
212
212
213
213
return values
214
214
@@ -222,12 +222,39 @@ def _get_multiple(self, path: str, **sdk_options) -> Dict[str, str]:
222
222
def clear_cache (self ):
223
223
self .store .clear ()
224
224
225
- def add_to_cache (self , key : Tuple [str , TransformOptions ], value : Any , max_age : int ):
225
+ def fetch_from_cache (self , key : Tuple ):
226
+ return self .store [key ].value if key in self .store else {}
227
+
228
+ def add_to_cache (self , key : Tuple , value : Any , max_age : int ):
226
229
if max_age <= 0 :
227
230
return
228
231
229
232
self .store [key ] = ExpirableValue (value , datetime .now () + timedelta (seconds = max_age ))
230
233
234
+ def _build_cache_key (
235
+ self ,
236
+ name : str ,
237
+ transform : TransformOptions = None ,
238
+ is_nested : bool = False ,
239
+ ):
240
+ """Creates cache key for parameters
241
+
242
+ Parameters
243
+ ----------
244
+ name : str
245
+ Name of parameter, secret or config
246
+ transform : TransformOptions, optional
247
+ Transform method used, by default None
248
+ is_nested : bool, optional
249
+ Whether it's a single parameter or multiple nested parameters, by default False
250
+
251
+ Returns
252
+ -------
253
+ Tuple[str, TransformOptions, bool]
254
+ Cache key
255
+ """
256
+ return (name , transform , is_nested )
257
+
231
258
@staticmethod
232
259
def _build_boto3_client (
233
260
service_name : str ,
0 commit comments