Skip to content

Commit 57083ab

Browse files
authored
fix: bump pyrate (#775)
1 parent df84567 commit 57083ab

File tree

4 files changed

+25
-40
lines changed

4 files changed

+25
-40
lines changed

pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ dependencies = [
2626
"paho-mqtt>=1.6.1,<3.0.0",
2727
"construct>=2.10.57,<3",
2828
"vacuum-map-parser-roborock",
29-
"pyrate-limiter>=3.7.0,<4",
29+
"pyrate-limiter>=4.0.0,<5",
3030
"aiomqtt>=2.5.0,<3",
3131
"click-shell~=2.1",
3232
]

roborock/web_api.py

Lines changed: 14 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212

1313
import aiohttp
1414
from aiohttp import ContentTypeError, FormData
15-
from pyrate_limiter import BucketFullException, Duration, Limiter, Rate
15+
from pyrate_limiter import Duration, Limiter, Rate
1616

1717
from roborock import HomeDataSchedule
1818
from roborock.data import HomeData, HomeDataRoom, HomeDataScene, ProductResponse, RRiot, UserData
@@ -62,7 +62,7 @@ class RoborockApiClient:
6262
Rate(40, Duration.DAY),
6363
]
6464

65-
_login_limiter = Limiter(_LOGIN_RATES, max_delay=1000)
65+
_login_limiter = Limiter(_LOGIN_RATES)
6666
_home_data_limiter = Limiter(_HOME_DATA_RATES)
6767

6868
def __init__(
@@ -204,11 +204,8 @@ async def add_device(self, user_data: UserData, s: str, t: str) -> dict:
204204
return add_device_response["result"]
205205

206206
async def request_code(self) -> None:
207-
try:
208-
await self._login_limiter.try_acquire_async("login")
209-
except BucketFullException as ex:
210-
_LOGGER.info(ex.meta_info)
211-
raise RoborockRateLimit("Reached maximum requests for login. Please try again later.") from ex
207+
if not await self._login_limiter.try_acquire_async("login", blocking=True, timeout=1):
208+
raise RoborockRateLimit("Reached maximum requests for login. Please try again later.")
212209
base_url = await self.base_url
213210
header_clientid = self._get_header_client_id()
214211
code_request = PreparedRequest(base_url, self.session, {"header_clientid": header_clientid})
@@ -238,11 +235,8 @@ async def request_code_v4(self) -> None:
238235
if await self.country_code is None or await self.country is None:
239236
_LOGGER.info("No country code or country found, trying old version of request code.")
240237
return await self.request_code()
241-
try:
242-
await self._login_limiter.try_acquire_async("login")
243-
except BucketFullException as ex:
244-
_LOGGER.info(ex.meta_info)
245-
raise RoborockRateLimit("Reached maximum requests for login. Please try again later.") from ex
238+
if not await self._login_limiter.try_acquire_async("login", blocking=True, timeout=1):
239+
raise RoborockRateLimit("Reached maximum requests for login. Please try again later.")
246240
base_url = await self.base_url
247241
header_clientid = self._get_header_client_id()
248242
code_request = PreparedRequest(
@@ -370,11 +364,8 @@ async def code_login_v4(
370364
return UserData.from_dict(user_data)
371365

372366
async def pass_login(self, password: str) -> UserData:
373-
try:
374-
await self._login_limiter.try_acquire_async("login")
375-
except BucketFullException as ex:
376-
_LOGGER.info(ex.meta_info)
377-
raise RoborockRateLimit("Reached maximum requests for login. Please try again later.") from ex
367+
if not await self._login_limiter.try_acquire_async("login", blocking=True, timeout=1):
368+
raise RoborockRateLimit("Reached maximum requests for login. Please try again later.")
378369
base_url = await self.base_url
379370
header_clientid = self._get_header_client_id()
380371

@@ -468,11 +459,8 @@ async def _get_home_id(self, user_data: UserData):
468459
return home_id_response["data"]["rrHomeId"]
469460

470461
async def get_home_data(self, user_data: UserData) -> HomeData:
471-
try:
472-
self._home_data_limiter.try_acquire("home_data")
473-
except BucketFullException as ex:
474-
_LOGGER.info(ex.meta_info)
475-
raise RoborockRateLimit("Reached maximum requests for home data. Please try again later.") from ex
462+
if not self._home_data_limiter.try_acquire("home_data", blocking=False):
463+
raise RoborockRateLimit("Reached maximum requests for home data. Please try again later.")
476464
rriot = user_data.rriot
477465
if rriot is None:
478466
raise RoborockException("rriot is none")
@@ -497,11 +485,8 @@ async def get_home_data(self, user_data: UserData) -> HomeData:
497485

498486
async def get_home_data_v2(self, user_data: UserData) -> HomeData:
499487
"""This is the same as get_home_data, but uses a different endpoint and includes non-robotic vacuums."""
500-
try:
501-
self._home_data_limiter.try_acquire("home_data")
502-
except BucketFullException as ex:
503-
_LOGGER.info(ex.meta_info)
504-
raise RoborockRateLimit("Reached maximum requests for home data. Please try again later.") from ex
488+
if not self._home_data_limiter.try_acquire("home_data", blocking=False):
489+
raise RoborockRateLimit("Reached maximum requests for home data. Please try again later.")
505490
rriot = user_data.rriot
506491
if rriot is None:
507492
raise RoborockException("rriot is none")
@@ -526,11 +511,8 @@ async def get_home_data_v2(self, user_data: UserData) -> HomeData:
526511

527512
async def get_home_data_v3(self, user_data: UserData) -> HomeData:
528513
"""This is the same as get_home_data, but uses a different endpoint and includes non-robotic vacuums."""
529-
try:
530-
self._home_data_limiter.try_acquire("home_data")
531-
except BucketFullException as ex:
532-
_LOGGER.info(ex.meta_info)
533-
raise RoborockRateLimit("Reached maximum requests for home data. Please try again later.") from ex
514+
if not self._home_data_limiter.try_acquire("home_data", blocking=False):
515+
raise RoborockRateLimit("Reached maximum requests for home data. Please try again later.")
534516
rriot = user_data.rriot
535517
home_id = await self._get_home_id(user_data)
536518
if rriot.r.a is None:

tests/fixtures/web_api_fixtures.py

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import re
22
from collections.abc import Generator
33
from typing import Any
4-
from unittest.mock import patch
4+
from unittest.mock import AsyncMock, patch
55

66
import pytest
77
from aioresponses import aioresponses
@@ -13,8 +13,11 @@
1313
def skip_rate_limit() -> Generator[None, None, None]:
1414
"""Don't rate limit tests as they aren't actually hitting the api."""
1515
with (
16-
patch("roborock.web_api.RoborockApiClient._login_limiter.try_acquire"),
17-
patch("roborock.web_api.RoborockApiClient._home_data_limiter.try_acquire"),
16+
patch(
17+
"roborock.web_api.RoborockApiClient._login_limiter.try_acquire_async",
18+
new=AsyncMock(return_value=True),
19+
),
20+
patch("roborock.web_api.RoborockApiClient._home_data_limiter.try_acquire", return_value=True),
1821
):
1922
yield
2023

uv.lock

Lines changed: 4 additions & 4 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)