mirror of
https://github.com/Hestia-Homes/Model.git
synced 2026-06-08 11:17:27 +00:00
Move the EpcClientService package (client + _retry + exceptions + tests) from the dying backend/ tree to infrastructure/epc_client/ as the New-EPC-API Fetcher; update the two callers (address2UPRN, a script). All 14 client tests pass. Add SolarRepository port + SolarPostgresRepository persisting Google Solar building insights as JSONB (solar_building_insights table), one row per Property. The EPC repo half of this slice already landed in #1129. pyright strict clean. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
28 lines
830 B
Python
28 lines
830 B
Python
import time
|
|
from typing import Callable, TypeVar
|
|
|
|
from infrastructure.epc_client.exceptions import EpcRateLimitError
|
|
|
|
T = TypeVar("T")
|
|
|
|
|
|
def call_with_retry(
|
|
fn: Callable[[], T],
|
|
max_retries: int = 5,
|
|
backoff_base: float = 1.0,
|
|
backoff_multiplier: float = 2.0,
|
|
max_backoff: float = 60.0,
|
|
) -> T:
|
|
last_exc: EpcRateLimitError | None = None
|
|
for attempt in range(max_retries + 1):
|
|
try:
|
|
return fn()
|
|
except EpcRateLimitError as exc:
|
|
last_exc = exc
|
|
if attempt < max_retries:
|
|
if exc.retry_after is not None:
|
|
delay = exc.retry_after
|
|
else:
|
|
delay = backoff_base * (backoff_multiplier ** attempt)
|
|
time.sleep(min(delay, max_backoff))
|
|
raise last_exc # type: ignore[misc]
|