Source code for uplink.retry.when
# Local imports
from uplink.retry._helpers import ClientExceptionProxy
__all__ = ["RetryPredicate", "raises", "status", "status_5xx"]
class RetryPredicate(object):
def should_retry_after_response(self, response):
return False
def should_retry_after_exception(self, exc_type, exc_val, exc_tb):
return False
def __call__(self, request_builder): # Pragma: no cover
return self
def __or__(self, other):
if other is not None:
assert isinstance(
other, RetryPredicate
), "Both objects should be retry conditions."
return _Or(self, other)
return self
class _Or(RetryPredicate):
def __init__(self, left, right):
self._left = left
self._right = right
def should_retry_after_response(self, *args, **kwargs):
return self._left.should_retry_after_response(
*args, **kwargs
) or self._right.should_retry_after_response(*args, **kwargs)
def should_retry_after_exception(self, *args, **kwargs):
return self._left.should_retry_after_exception(
*args, **kwargs
) or self._right.should_retry_after_exception(*args, **kwargs)
def __call__(self, request_builder):
left = self._left(request_builder)
right = self._right(request_builder)
return type(self)(left, right)
# noinspection PyPep8Naming
[docs]class raises(RetryPredicate):
"""Retry when a specific exception type is raised."""
def __init__(self, expected_exception):
self._expected_exception = expected_exception
def __call__(self, request_builder):
proxy = ClientExceptionProxy.wrap_proxy_if_necessary(
self._expected_exception
)
type_ = proxy(request_builder.client.exceptions)
return raises(type_)
def should_retry_after_exception(self, exc_type, exc_val, exc_tb):
return isinstance(exc_val, self._expected_exception)
# noinspection PyPep8Naming
[docs]class status(RetryPredicate):
"""Retry on specific HTTP response status codes."""
def __init__(self, *status_codes):
self._status_codes = status_codes
def should_retry_after_response(self, response):
return response.status_code in self._status_codes
# noinspection PyPep8Naming
[docs]class status_5xx(RetryPredicate):
"""Retry after receiving a 5xx (server error) response."""
def should_retry_after_response(self, response):
return 500 <= response.status_code < 600