From be9c41070595566eeb22e9ccf4baf7e1507870e0 Mon Sep 17 00:00:00 2001 From: Luke Date: Thu, 6 Apr 2023 22:50:27 -0400 Subject: [PATCH] fix: serialize nested objects --- roborock/containers.py | 14 +++++++++++++- tests/test_containers.py | 11 +++++++++-- 2 files changed, 22 insertions(+), 3 deletions(-) diff --git a/roborock/containers.py b/roborock/containers.py index c246c91d..f595b467 100644 --- a/roborock/containers.py +++ b/roborock/containers.py @@ -29,7 +29,19 @@ def from_dict(cls, data: dict[str, any]): return from_dict(cls, decamelize(data), config=Config(cast=[Enum])) def as_dict(self): - return self.__dict__ + dict = self.__dict__ + for key, value in dict.items(): + if isinstance(value, RoborockBase): + dict[key] = value.as_dict() + if isinstance(value, list): + new_list = [] + for val in value: + if isinstance(val, RoborockBase): + new_list.append(val.as_dict()) + else: + new_list.append(val) + dict[key] = new_list + return dict @dataclass diff --git a/tests/test_containers.py b/tests/test_containers.py index 8bb98f3f..c5b3a055 100644 --- a/tests/test_containers.py +++ b/tests/test_containers.py @@ -1,7 +1,6 @@ +from roborock import UserData, HomeData, Consumable, Status, DNDTimer, CleanSummary, CleanRecord, HomeDataProduct from roborock.code_mappings import RoborockStateCode, RoborockErrorCode, RoborockFanPowerCode, RoborockMopIntensityCode, \ RoborockDockTypeCode, RoborockMopModeCode, RoborockDockErrorCode - -from roborock import UserData, HomeData, Consumable, Status, DNDTimer, CleanSummary, CleanRecord from .mock_data import USER_DATA, HOME_DATA_RAW, CONSUMABLE, STATUS, DND_TIMER, CLEAN_SUMMARY, CLEAN_RECORD @@ -82,6 +81,14 @@ def test_home_data(): assert hd.rooms[0].name == "Example room 1" +def test_serialize_and_unserialize(): + hd = HomeData.from_dict(HOME_DATA_RAW) + hd_2 = hd.as_dict() + assert isinstance(hd_2["products"][0], dict) + hd_3 = HomeData.from_dict(hd_2) + assert isinstance(hd_3.products[0], HomeDataProduct) + + def test_consumable(): c = Consumable.from_dict(CONSUMABLE) assert c.main_brush_work_time == 74382