From 1a7f8cf942b6b05addd53532c04acf85eb52c922 Mon Sep 17 00:00:00 2001 From: Prerit Das Date: Mon, 24 Nov 2025 00:49:13 +0000 Subject: [PATCH 1/3] Give retry logic to `_request` by calling `__request`. --- real_intent/client.py | 80 ++++++++++++++++++++++--------------------- 1 file changed, 41 insertions(+), 39 deletions(-) diff --git a/real_intent/client.py b/real_intent/client.py index c27a768..3d8743a 100644 --- a/real_intent/client.py +++ b/real_intent/client.py @@ -127,52 +127,54 @@ def __request(self, request: Request) -> dict: }" ) - for n_attempt in range(1, self.max_request_attempts+1): - try: - with Session() as session: - response = session.send( - request.prepare(), - timeout=self.request_timeout_seconds - ) - - response.raise_for_status() - break - except RequestException as e: - last_exception: RequestException = e + with Session() as session: + response = session.send( + request.prepare(), + timeout=self.request_timeout_seconds + ) - if n_attempt == self.max_request_attempts: - continue # on last failed attempt, skip to else block + response.raise_for_status() + log("trace", f"Received response: {response}") + return response.json() - # Log it, sleep, loop again to try again - sleep_time = round( - number=random.uniform(30 * n_attempt, (30 * n_attempt) + 10), - ndigits=2 - ) + def _request(self, request: Request) -> dict: + """Request abstraction with logging and retry backoff.""" + with log_span(f"Requesting {request.method} {request.url}", _level="trace"): + for n_attempt in range(1, self.max_request_attempts+1): + try: + response = self.__request(request) + break + except RequestException as e: + last_exception: RequestException = e + + if n_attempt == self.max_request_attempts: + continue # on last failed attempt, skip to else block + + # Log it, sleep, loop again to try again + sleep_time = round( + number=random.uniform(30 * n_attempt, (30 * n_attempt) + 10), + ndigits=2 + ) + log( + "warn", + ( + f"Request attempt {n_attempt} of {self.max_request_attempts} " + f"failed. Retrying in {sleep_time}s. Error: {e}" + ) + ) + time.sleep(sleep_time) + else: log( - "warn", + "error", ( - f"Request attempt {n_attempt} of {self.max_request_attempts} " - f"failed. Retrying in {sleep_time}s. Error: {e}" + f"Request failed after {self.max_request_attempts} " + f"attempts. Error: {last_exception}" ) ) - time.sleep(sleep_time) - else: - log( - "error", - ( - f"Request failed after {self.max_request_attempts} " - f"attempts. Error: {last_exception}" - ) - ) - raise last_exception + raise last_exception - log("trace", f"Received response: {response.text}") - return response.json() - - def _request(self, request: Request) -> dict: - """Request abstraction with logging.""" - with log_span(f"Requesting {request.method} {request.url}", _level="trace"): - return self.__request(request) + log("trace", f"Received response: {response.text}") + return response.json() def get_config_dates(self) -> ConfigDates: """Get the configuration dates from /config.""" From 7b2abe2d6a00dd5f8e644041b47d5925c257bb33 Mon Sep 17 00:00:00 2001 From: Prerit Das Date: Mon, 24 Nov 2025 00:58:22 +0000 Subject: [PATCH 2/3] Fix: dict received by `__request_ from `_request`. --- real_intent/client.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/real_intent/client.py b/real_intent/client.py index 3d8743a..0138692 100644 --- a/real_intent/client.py +++ b/real_intent/client.py @@ -142,7 +142,7 @@ def _request(self, request: Request) -> dict: with log_span(f"Requesting {request.method} {request.url}", _level="trace"): for n_attempt in range(1, self.max_request_attempts+1): try: - response = self.__request(request) + response: dict = self.__request(request) break except RequestException as e: last_exception: RequestException = e @@ -173,8 +173,8 @@ def _request(self, request: Request) -> dict: ) raise last_exception - log("trace", f"Received response: {response.text}") - return response.json() + log("trace", f"Received response: {response}") + return response def get_config_dates(self) -> ConfigDates: """Get the configuration dates from /config.""" From 34907c08c0ed472b741c6d8f08dcbda73bf62232 Mon Sep 17 00:00:00 2001 From: Prerit Das Date: Sun, 23 Nov 2025 20:07:02 -0500 Subject: [PATCH 3/3] Simplify while removing double logs. --- real_intent/client.py | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/real_intent/client.py b/real_intent/client.py index 0138692..e154483 100644 --- a/real_intent/client.py +++ b/real_intent/client.py @@ -142,8 +142,7 @@ def _request(self, request: Request) -> dict: with log_span(f"Requesting {request.method} {request.url}", _level="trace"): for n_attempt in range(1, self.max_request_attempts+1): try: - response: dict = self.__request(request) - break + return self.__request(request) except RequestException as e: last_exception: RequestException = e @@ -172,9 +171,6 @@ def _request(self, request: Request) -> dict: ) ) raise last_exception - - log("trace", f"Received response: {response}") - return response def get_config_dates(self) -> ConfigDates: """Get the configuration dates from /config."""