Skip to content

Commit e6cb8ab

Browse files
committed
Refactor to use country instead of regions
1 parent 90781cd commit e6cb8ab

File tree

8 files changed

+224
-49
lines changed

8 files changed

+224
-49
lines changed

karcher/auth.py

Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77
from dataclasses import dataclass, fields
88
import json
99

10-
from karcher.countries import COUNTRIES
1110

1211
@dataclass(init=False)
1312
class Domains:
@@ -27,21 +26,20 @@ def __init__(self, **kwargs):
2726
v = 'https://' + v
2827
setattr(self, k, v)
2928

29+
3030
@dataclass(init=False)
3131
class Session:
3232
"""Authorized user session class.
33-
33+
3434
This class represents a Karcher Home authorized user session.
3535
"""
3636

3737
register_id: str
3838
user_id: str
3939
auth_token: str
4040
mqtt_token: str
41-
country_code: str
4241

4342
def __init__(self, **kwargs):
44-
setattr(self, 'country_code', None)
4543
names = set([f.name for f in fields(self)])
4644
if 'id' in kwargs:
4745
setattr(self, 'user_id', kwargs['id'])
@@ -62,12 +60,6 @@ def reset(self):
6260
self.auth_token = ''
6361
self.mqtt_token = ''
6462

65-
def get_country_code(self):
66-
"""Get country code."""
67-
if self.country_code in COUNTRIES:
68-
return COUNTRIES[self.country_code]
69-
return self.country_code
70-
7163
@staticmethod
7264
def from_token(auth_token: str, mqtt_token: str):
7365
"""Create session from auth and MQTT tokens."""

karcher/countries.py

Lines changed: 153 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,11 @@
33
# SPDX-License-Identifier: MIT
44
# -----------------------------------------------------------
55

6+
from typing import Final
7+
8+
from .consts import Region
9+
10+
611
COUNTRIES = {
712
'AD': 'AND',
813
'AE': 'UAE',
@@ -134,3 +139,151 @@
134139
'SKN': 'SKN',
135140
'TWN': 'TWN',
136141
}
142+
143+
COUNTRY_REGIONS: Final = {
144+
'AND': Region.EU,
145+
'UAE': Region.EU,
146+
'AFG': Region.CN,
147+
'ANT': Region.US,
148+
'ALB': Region.EU,
149+
'ARM': Region.EU,
150+
'ARG': Region.US,
151+
'AUT': Region.EU,
152+
'AZE': Region.EU,
153+
'BAR': Region.US,
154+
'BAN': Region.CN,
155+
'BEL': Region.EU,
156+
'BUL': Region.EU,
157+
'BRN': Region.EU,
158+
'BRU': Region.CN,
159+
'BOL': Region.US,
160+
'BRA': Region.US,
161+
'BAH': Region.US,
162+
'BHU': Region.CN,
163+
'BLR': Region.EU,
164+
'BIZ': Region.US,
165+
'CAN': Region.US,
166+
'SUI': Region.EU,
167+
'CHI': Region.US,
168+
'CHN': Region.CN,
169+
'COL': Region.US,
170+
'CRI': Region.US,
171+
'CUB': Region.US,
172+
'CYP': Region.EU,
173+
'CZE': Region.EU,
174+
'GER': Region.EU,
175+
'DEN': Region.EU,
176+
'DMA': Region.US,
177+
'DOM': Region.US,
178+
'ECU': Region.US,
179+
'EST': Region.EU,
180+
'ESP': Region.EU,
181+
'FIN': Region.EU,
182+
'FRA': Region.EU,
183+
'GBR': Region.EU,
184+
'GRN': Region.US,
185+
'GEO': Region.EU,
186+
'GRE': Region.EU,
187+
'GUA': Region.US,
188+
'GUY': Region.US,
189+
'HKG': Region.CN,
190+
'HON': Region.US,
191+
'CRO': Region.EU,
192+
'HAI': Region.US,
193+
'HUN': Region.EU,
194+
'INA': Region.CN,
195+
'IRL': Region.EU,
196+
'ISR': Region.EU,
197+
'IND': Region.CN,
198+
'IRQ': Region.EU,
199+
'IRI': Region.EU,
200+
'ISL': Region.EU,
201+
'ITA': Region.EU,
202+
'JAM': Region.US,
203+
'JOR': Region.EU,
204+
'JPN': Region.CN,
205+
'KEN': Region.EU,
206+
'KGZ': Region.CN,
207+
'CAM': Region.CN,
208+
'KOR': Region.CN,
209+
'KUW': Region.EU,
210+
'KAZ': Region.CN,
211+
'LAO': Region.CN,
212+
'LIB': Region.EU,
213+
'LCA': Region.US,
214+
'LIE': Region.EU,
215+
'SRI': Region.CN,
216+
'LTU': Region.EU,
217+
'LUX': Region.EU,
218+
'LAT': Region.EU,
219+
'MAS': Region.CN,
220+
'MON': Region.EU,
221+
'MDA': Region.EU,
222+
'MGL': Region.CN,
223+
'Macao': Region.CN,
224+
'MAC': Region.CN,
225+
'MEX': Region.US,
226+
'NED': Region.EU,
227+
'NOR': Region.EU,
228+
'NEP': Region.CN,
229+
'NZL': Region.US,
230+
'OMA': Region.EU,
231+
'PAN': Region.US,
232+
'PER': Region.US,
233+
'PHI': Region.CN,
234+
'PAK': Region.CN,
235+
'POL': Region.EU,
236+
'PUR': Region.US,
237+
'POR': Region.EU,
238+
'PAR': Region.US,
239+
'QAT': Region.EU,
240+
'ROU': Region.EU,
241+
'SRB': Region.EU,
242+
'RUS': Region.EU,
243+
'KSA': Region.EU,
244+
'SIN': Region.CN,
245+
'SVK': Region.EU,
246+
'SMR': Region.EU,
247+
'SUR': Region.US,
248+
'ESA': Region.US,
249+
'SYR': Region.EU,
250+
'THA': Region.CN,
251+
'TJK': Region.CN,
252+
'TLS': Region.CN,
253+
'TKM': Region.CN,
254+
'TUR': Region.EU,
255+
'TRI': Region.US,
256+
'UKR': Region.EU,
257+
'USA': Region.US,
258+
'URU': Region.US,
259+
'UZB': Region.CN,
260+
'VCS': Region.US,
261+
'VIN': Region.US,
262+
'VEN': Region.US,
263+
'VIE': Region.CN,
264+
'YEM': Region.EU,
265+
'BIH': Region.EU,
266+
'PLE': Region.EU,
267+
'SKN': Region.US,
268+
'TWN': Region.CN,
269+
}
270+
271+
272+
def get_country_code(country: str) -> str:
273+
"""Get country code."""
274+
275+
country = country.upper()
276+
if country in COUNTRIES:
277+
return COUNTRIES[country]
278+
return country
279+
280+
281+
def get_region_by_country(country: str) -> Region:
282+
"""Get region by country."""
283+
284+
country = get_country_code(country)
285+
286+
# Return region (US, EU or CN) based on country code
287+
if country in COUNTRY_REGIONS:
288+
return COUNTRY_REGIONS[country]
289+
return Region.EU

karcher/device.py

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -142,13 +142,19 @@ def __init__(self, **kwargs):
142142
setattr(self, 'cur_path', [])
143143
self.update(kwargs)
144144

145-
def update(self, data: dict[str, Any]):
145+
def update(self, data: dict[str, Any]) -> bool:
146+
"""Update device properties."""
147+
148+
updated = False
146149
names = set([f.name for f in fields(self)])
147150
for k, v in data.items():
148151
if k in names:
149152
if k == 'firmware_code':
150153
v = int(v)
151-
setattr(self, k, v)
154+
if v != getattr(self, k):
155+
setattr(self, k, v)
156+
updated = True
157+
return updated
152158

153159

154160
@dataclass(init=False)
@@ -197,4 +203,5 @@ def __init__(self, **kwargs):
197203

198204
def is_online(self):
199205
"""Get device status."""
206+
200207
return self.status == DeviceStatus.Online

karcher/exception.py

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ def __init__(self, code, message):
1818

1919

2020
class KarcherHomeAccessDenied(KarcherHomeException):
21-
"""Exception raised for wrong credentials in the Karcher Home Robots library.
21+
"""Exception raised when user has no access for resource.
2222
2323
Attributes:
2424
message -- explanation of the error
@@ -29,16 +29,29 @@ def __init__(self, message):
2929
super().__init__(608, self.message)
3030

3131

32+
class KarcherHomeInvalidAuth(KarcherHomeException):
33+
"""Exception raised when wrong credentials are provided."""
34+
35+
def __init__(self):
36+
super().__init__(620, 'The username or password is incorrect')
37+
38+
39+
class KarcherHomeTokenExpired(KarcherHomeException):
40+
"""Exception raised when token has been expired."""
41+
42+
def __init__(self):
43+
super().__init__(609,
44+
'Unauthorized or authorization expired, please log in again')
45+
46+
3247
def handle_error_code(code, message):
3348
if code == 608:
3449
raise KarcherHomeAccessDenied('Forbidden')
3550
elif code == 609:
36-
raise KarcherHomeAccessDenied(
37-
'Unauthorized or authorization expired, please log in again')
51+
raise KarcherHomeTokenExpired()
3852
elif code == 613:
3953
raise KarcherHomeException(613, 'Invalid token')
4054
elif code == 620:
41-
raise KarcherHomeException(
42-
620, 'The username or password is incorrect')
55+
raise KarcherHomeInvalidAuth()
4356
else:
4457
raise KarcherHomeException(code, message)

0 commit comments

Comments
 (0)