@@ -30,7 +30,7 @@ class EventMetadata(TypedDict):
30
30
31
31
type : str
32
32
target_key : str
33
- valid_from : str
33
+ valid_from : Optional [ str ]
34
34
category : str
35
35
version : int
36
36
created_at : str
@@ -132,7 +132,7 @@ class ConfigurationVersion:
132
132
version : int
133
133
contentUrl : str
134
134
sha256sum : str
135
- valid_from : float # timestamp ms
135
+ valid_from : Optional [ float ] # timestamp ms
136
136
retry_count : int = dataclasses .field (default = 0 , hash = False , init = False )
137
137
retry_at : int = dataclasses .field (default = sys .maxsize , hash = False , init = False )
138
138
@@ -145,15 +145,25 @@ def from_event(cls, event: Event) -> "ConfigurationVersion":
145
145
146
146
:returns: ConfigurationVersion: The created configuration version.
147
147
"""
148
+
149
+ raw_valid_from = event ["metadata" ]["valid_from" ]
150
+ if raw_valid_from is None :
151
+ valid_from : Optional [float ] = None
152
+ else :
153
+ # TODO python 3.11: Use `datetime.fromisoformat` when additional format are available
154
+ try :
155
+ parsed = datetime .strptime (raw_valid_from , "%Y-%m-%dT%H:%M:%S.%f%z" )
156
+ except ValueError :
157
+ parsed = datetime .strptime (raw_valid_from , "%Y-%m-%dT%H:%M:%S%z" )
158
+
159
+ valid_from = parsed .timestamp () * 1000
160
+
148
161
return cls (
149
162
id = event ["id" ],
150
163
version = event ["metadata" ]["version" ],
151
164
contentUrl = event ["contentUrl" ],
152
165
sha256sum = event ["metadata" ]["sha256sum" ],
153
- valid_from = datetime .fromisoformat (
154
- event ["metadata" ]["valid_from" ]
155
- ).timestamp ()
156
- * 1000 ,
166
+ valid_from = valid_from ,
157
167
)
158
168
159
169
def success (self ) -> None :
@@ -235,15 +245,25 @@ def find_valid_version(self, timestamp: int) -> Optional[ConfigurationVersion]:
235
245
self ._find_versions (timestamp )
236
246
)
237
247
return self .version
238
- if self .next_version and self .next_version .valid_from <= timestamp :
248
+ if (
249
+ self .next_version
250
+ and self .next_version .valid_from
251
+ and self .next_version .valid_from <= timestamp
252
+ ):
239
253
self .previous_version , self .version , self .next_version = (
240
254
self ._find_versions (timestamp )
241
255
)
242
256
return self .version
243
- if self .version and self .version .valid_from <= timestamp :
244
- return self .version
245
- if self .previous_version and self .previous_version .valid_from <= timestamp :
246
- return self .previous_version
257
+ if self .version :
258
+ if self .version .valid_from is None :
259
+ return self .version
260
+ if self .version .valid_from <= timestamp :
261
+ return self .version
262
+ if self .previous_version :
263
+ if self .previous_version .valid_from is None :
264
+ return self .previous_version
265
+ if self .previous_version .valid_from <= timestamp :
266
+ return self .previous_version
247
267
248
268
self .previous_version , self .version , self .next_version = self ._find_versions (
249
269
timestamp
@@ -276,10 +296,19 @@ def _find_versions(
276
296
for _ , version in sorted (
277
297
self .versions .items (), reverse = True , key = lambda x : x [0 ]
278
298
):
279
- if version .valid_from > timestamp :
299
+ if version .valid_from is None :
300
+ if current_version is None :
301
+ current_version = version
302
+ elif previous_version is None :
303
+ previous_version = version
304
+ return previous_version , current_version , next_version
305
+ elif version .valid_from > timestamp :
280
306
if next_version is None :
281
307
next_version = version
282
- elif version .valid_from < next_version .valid_from :
308
+ elif (
309
+ next_version .valid_from is not None
310
+ and version .valid_from < next_version .valid_from
311
+ ):
283
312
next_version = version
284
313
elif current_version is None :
285
314
current_version = version
0 commit comments