Skip to content

Commit bf52b44

Browse files
fix: RoborockBase.as_dict
1 parent 6159412 commit bf52b44

File tree

3 files changed

+24
-12
lines changed

3 files changed

+24
-12
lines changed

roborock/containers.py

Lines changed: 16 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
1+
from __future__ import annotations
2+
13
import re
2-
from dataclasses import dataclass
4+
from dataclasses import dataclass, asdict
35
from enum import Enum
46
from typing import Any, Optional
57

@@ -11,25 +13,32 @@
1113
RoborockErrorCode, RoborockDockDustCollectionModeCode, RoborockFanPowerCode
1214

1315

14-
def to_snake(s):
16+
def camelize(s: str):
17+
first, *others = s.split('_')
18+
return ''.join([first.lower(), *map(str.title, others)])
19+
20+
21+
def decamelize(s: str):
1522
return re.sub('([A-Z]+)', '_\\1', s).lower()
1623

1724

18-
def decamelize(d):
25+
def decamelize_obj(d: dict | list):
1926
if isinstance(d, list):
20-
return [decamelize(i) if isinstance(i, (dict, list)) else i for i in d]
21-
return {to_snake(a): decamelize(b) if isinstance(b, (dict, list)) else b for a, b in d.items()}
27+
return [decamelize_obj(i) if isinstance(i, (dict, list)) else i for i in d]
28+
return {decamelize(a): decamelize_obj(b) if isinstance(b, (dict, list)) else b for a, b in d.items()}
2229

2330

2431
@dataclass
2532
class RoborockBase:
2633

2734
@classmethod
2835
def from_dict(cls, data: dict[str, any]):
29-
return from_dict(cls, decamelize(data), config=Config(cast=[Enum]))
36+
return from_dict(cls, decamelize_obj(data), config=Config(cast=[Enum]))
3037

3138
def as_dict(self):
32-
return self.__dict__
39+
return asdict(self, dict_factory=lambda _fields: {
40+
camelize(key): value for (key, value) in _fields if value is not None
41+
})
3342

3443

3544
@dataclass

tests/mock_data.py

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,6 @@
55
BASE_URL = "https://usiot.roborock.com"
66

77
USER_DATA = {
8-
"tuyaname": "abc123",
9-
"tuyapwd": "abc123",
108
"uid": 123456,
119
"tokentype": "token_type",
1210
"token": "abc123",

tests/test_containers.py

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
1+
from roborock import UserData, HomeData, Consumable, Status, DNDTimer, CleanSummary, CleanRecord, HomeDataProduct
12
from roborock.code_mappings import RoborockStateCode, RoborockErrorCode, RoborockFanPowerCode, RoborockMopIntensityCode, \
23
RoborockDockTypeCode, RoborockMopModeCode, RoborockDockErrorCode
3-
4-
from roborock import UserData, HomeData, Consumable, Status, DNDTimer, CleanSummary, CleanRecord
54
from .mock_data import USER_DATA, HOME_DATA_RAW, CONSUMABLE, STATUS, DND_TIMER, CLEAN_SUMMARY, CLEAN_RECORD
65

76

@@ -82,6 +81,12 @@ def test_home_data():
8281
assert hd.rooms[0].name == "Example room 1"
8382

8483

84+
def test_serialize_and_unserialize():
85+
ud = UserData.from_dict(USER_DATA)
86+
ud_dict = ud.as_dict()
87+
assert ud_dict == USER_DATA
88+
89+
8590
def test_consumable():
8691
c = Consumable.from_dict(CONSUMABLE)
8792
assert c.main_brush_work_time == 74382
@@ -173,4 +178,4 @@ def test_clean_record():
173178
assert cr.dust_collection_status == 1
174179
assert cr.avoid_count == 19
175180
assert cr.wash_count == 2
176-
assert cr.map_flag == 0
181+
assert cr.map_flag == 0

0 commit comments

Comments
 (0)