Coverage for src\baobab_web_api_caller\transport\throttler.py: 97%
25 statements
« prev ^ index » next coverage.py v7.10.3, created at 2026-03-21 12:10 +0100
« prev ^ index » next coverage.py v7.10.3, created at 2026-03-21 12:10 +0100
1"""Throttling (intervalle minimal) testable."""
3from __future__ import annotations
5from dataclasses import dataclass
7from baobab_web_api_caller.config.rate_limit_policy import RateLimitPolicy
8from baobab_web_api_caller.transport.sleeper import Sleeper
9from baobab_web_api_caller.transport.time_provider import TimeProvider
12@dataclass(slots=True)
13class Throttler:
14 """Applique une politique de limitation de débit."""
16 rate_limit_policy: RateLimitPolicy
17 time_provider: TimeProvider
18 sleeper: Sleeper
19 _last_call_ts: float | None = None
21 def throttle(self) -> None:
22 """Attend si nécessaire pour respecter l'intervalle minimal."""
24 min_interval = float(self.rate_limit_policy.min_interval_seconds)
25 if min_interval <= 0:
26 return
28 now = float(self.time_provider.monotonic())
29 if self._last_call_ts is None:
30 self._last_call_ts = now
31 return
33 elapsed = now - self._last_call_ts
34 remaining = min_interval - elapsed
35 if remaining > 0: 35 ↛ 39line 35 didn't jump to line 39 because the condition on line 35 was always true
36 self.sleeper.sleep(remaining)
37 now = float(self.time_provider.monotonic())
39 self._last_call_ts = now