|
22 | 22 | ) |
23 | 23 | from TestHarness.resultsstore.utils import ( |
24 | 24 | TestName, |
| 25 | + compress_dict, |
25 | 26 | decompress_dict, |
26 | 27 | get_typed, |
27 | 28 | ) |
@@ -379,3 +380,62 @@ def get_perf_graph(self) -> Optional[dict]: |
379 | 380 | Requires filter TestDataFilter.TESTER when loading tests. |
380 | 381 | """ |
381 | 382 | return get_typed(self.get_json_metadata(), "perf_graph", (NoneType, dict)) |
| 383 | + |
| 384 | + def serialize(self) -> dict: |
| 385 | + """ |
| 386 | + Serialize the data so that it is JSON dumpable. |
| 387 | +
|
| 388 | + Can be reloaded with deserialize(). |
| 389 | + """ |
| 390 | + data = deepcopy(self.data) |
| 391 | + |
| 392 | + data["serialized"] = { |
| 393 | + "folder_name": self.folder_name, |
| 394 | + "test_name": self.test_name, |
| 395 | + "data_filters": [v.name for v in self._data_filters], |
| 396 | + } |
| 397 | + |
| 398 | + # Convert ObjectID to string ID |
| 399 | + for key in ["_id", "result_id"]: |
| 400 | + if value := data.get(key): |
| 401 | + data[key] = str(value) |
| 402 | + |
| 403 | + # Convert binary JSON metadata to dict |
| 404 | + if json_metadata := self.get_json_metadata(): |
| 405 | + data["tester"]["json_metadata"] = json_metadata |
| 406 | + |
| 407 | + # Time entry if it exists |
| 408 | + if (time := data.get("time")) is not None: |
| 409 | + data["time"] = str(time) |
| 410 | + |
| 411 | + return data |
| 412 | + |
| 413 | + @staticmethod |
| 414 | + def deserialize(data: dict, result: StoredResult) -> "StoredTestResult": |
| 415 | + """Deserialize data from serialize() into a test result.""" |
| 416 | + assert isinstance(data, dict) |
| 417 | + assert isinstance(result, StoredResult) |
| 418 | + |
| 419 | + serialized = data["serialized"] |
| 420 | + name = TestName(serialized["folder_name"], serialized["test_name"]) |
| 421 | + filters = [TestDataFilter[v] for v in serialized["data_filters"]] |
| 422 | + del data["serialized"] |
| 423 | + |
| 424 | + # Convert string ID to ObjectID |
| 425 | + for key in ["_id", "result_id"]: |
| 426 | + if value := data.get(key): |
| 427 | + data[key] = ObjectId(value) |
| 428 | + |
| 429 | + # Convert JSON metadata back to binary |
| 430 | + tester = data.get("tester", {}) |
| 431 | + json_metadata = tester.get("json_metadata") |
| 432 | + if json_metadata: |
| 433 | + data["tester"]["json_metadata"] = { |
| 434 | + k: compress_dict(v) for k, v in json_metadata.items() |
| 435 | + } |
| 436 | + |
| 437 | + # Convert time to datettime |
| 438 | + if (time := data.get("time")) is not None: |
| 439 | + data["time"] = datetime.fromisoformat(time) |
| 440 | + |
| 441 | + return StoredTestResult(data, name, result, filters) |
0 commit comments