diff --git a/pyproject.toml b/pyproject.toml index c56a80c..261bdfc 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "sw-utils" -version = "0.3.21" +version = "0.3.22" description = "StakeWise Python utils" authors = ["StakeWise Labs "] license = "GPL-3.0-or-later" diff --git a/sw_utils/__init__.py b/sw_utils/__init__.py index 3de9d9a..1120f0a 100644 --- a/sw_utils/__init__.py +++ b/sw_utils/__init__.py @@ -5,12 +5,7 @@ ValidatorStatus, get_consensus_client, ) -from .decorators import ( - custom_before_log, - retry_aiohttp_errors, - retry_ipfs_exception, - safe, -) +from .decorators import retry_aiohttp_errors, retry_ipfs_exception, safe from .event_scanner import EventProcessor, EventScanner from .execution import get_execution_client from .ipfs import ( diff --git a/sw_utils/consensus.py b/sw_utils/consensus.py index 1b47465..8577d25 100644 --- a/sw_utils/consensus.py +++ b/sw_utils/consensus.py @@ -131,19 +131,16 @@ async def get_consensus_fork(self, state_id: str = 'head') -> ConsensusFork: async def _async_make_get_request(self, endpoint_uri: str) -> dict[str, Any]: if self.retry_timeout: - def custom_before_log(retry_logger, log_level): - def custom_log_it(retry_state: 'RetryCallState') -> None: - if retry_state.attempt_number <= 1: - return - msg = 'Retrying consensus uri %s(), attempt %s' - args = (endpoint_uri, retry_state.attempt_number) - retry_logger.log(log_level, msg, *args) - - return custom_log_it + def custom_before_log(retry_state: 'RetryCallState') -> None: + if retry_state.attempt_number <= 1: + return + msg = 'Retrying consensus uri %s, attempt %s' + args = (endpoint_uri, retry_state.attempt_number) + logger.log(logging.INFO, msg, *args) retry_decorator = retry_aiohttp_errors( self.retry_timeout, - log_func=custom_before_log, + before=custom_before_log, ) return await retry_decorator(self._async_make_get_request_inner)(endpoint_uri) diff --git a/sw_utils/decorators.py b/sw_utils/decorators.py index 36f968e..75c04cb 100644 --- a/sw_utils/decorators.py +++ b/sw_utils/decorators.py @@ -1,11 +1,11 @@ import asyncio import logging -import typing from functools import wraps -from typing import Callable +from typing import Callable, Optional import aiohttp from tenacity import ( + RetryCallState, retry, retry_if_exception, retry_if_exception_type, @@ -18,10 +18,6 @@ default_logger = logging.getLogger(__name__) -if typing.TYPE_CHECKING: - from tenacity import RetryCallState - - def safe(func: Callable) -> Callable: if asyncio.iscoroutinefunction(func): @@ -46,15 +42,12 @@ def wrapper(*args, **kwargs): return wrapper -def custom_before_log(logger, log_level): - def custom_log_it(retry_state: 'RetryCallState') -> None: - if retry_state.attempt_number <= 1: - return - msg = 'Retrying %s, attempt %s' - args = (retry_state.fn.__name__, retry_state.attempt_number) # type: ignore - logger.log(log_level, msg, *args) - - return custom_log_it +def default_log_before(retry_state: 'RetryCallState') -> None: + if retry_state.attempt_number <= 1: + return + msg = 'Retrying %s, attempt %s' + args = (retry_state.fn.__name__, retry_state.attempt_number) # type: ignore + default_logger.log(logging.INFO, msg, *args) def can_be_retried_aiohttp_error(e: BaseException) -> bool: @@ -67,19 +60,19 @@ def can_be_retried_aiohttp_error(e: BaseException) -> bool: return False -def retry_aiohttp_errors(delay: int = 60, log_func=custom_before_log): +def retry_aiohttp_errors(delay: int = 60, before: Optional[Callable] = None): return retry( retry=retry_if_exception(can_be_retried_aiohttp_error), wait=wait_exponential(multiplier=1, min=1, max=delay // 2), stop=stop_after_delay(delay), - before=log_func(default_logger, logging.INFO), + before=before or default_log_before, ) -def retry_ipfs_exception(delay: int): +def retry_ipfs_exception(delay: int, before: Optional[Callable] = None): return retry( retry=retry_if_exception_type(IpfsException), wait=wait_exponential(multiplier=1, min=1, max=delay // 2), stop=stop_after_delay(delay), - before=custom_before_log(default_logger, logging.INFO), + before=before or default_log_before, ) diff --git a/sw_utils/execution.py b/sw_utils/execution.py index 1e31841..01d4b32 100644 --- a/sw_utils/execution.py +++ b/sw_utils/execution.py @@ -61,19 +61,16 @@ async def make_request(self, method: RPCEndpoint, params: Any) -> RPCResponse: if self.retry_timeout: - def custom_before_log(retry_logger, log_level): - def custom_log_it(retry_state: 'RetryCallState') -> None: - if retry_state.attempt_number <= 1: - return - msg = 'Retrying execution method %s, attempt %s' - args = (method, retry_state.attempt_number) - retry_logger.log(log_level, msg, *args) - - return custom_log_it + def custom_before_log(retry_state: 'RetryCallState') -> None: + if retry_state.attempt_number <= 1: + return + msg = 'Retrying execution method %s, attempt %s' + args = (method, retry_state.attempt_number) + logger.log(logging.INFO, msg, *args) retry_decorator = retry_aiohttp_errors( self.retry_timeout, - log_func=custom_before_log, + before=custom_before_log, ) return await retry_decorator(self.make_request_inner)(method, params)