Skip to content

Commit 5da147c

Browse files
authored
Eliminate "retry behavior" enum (#11)
1 parent 6efc0ca commit 5da147c

3 files changed

Lines changed: 55 additions & 32 deletions

File tree

src/nexusrpc/__init__.py

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@
1818
from . import handler
1919
from ._common import (
2020
HandlerError,
21-
HandlerErrorRetryBehavior,
2221
HandlerErrorType,
2322
InputT,
2423
Link,
@@ -43,7 +42,6 @@
4342
"handler",
4443
"HandlerError",
4544
"HandlerErrorType",
46-
"HandlerErrorRetryBehavior",
4745
"InputT",
4846
"LazyValue",
4947
"Link",

src/nexusrpc/_common.py

Lines changed: 14 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -48,42 +48,42 @@ def __init__(
4848
message: str,
4949
*,
5050
type: HandlerErrorType,
51-
retry_behavior: Optional[HandlerErrorRetryBehavior] = None,
51+
retryable_override: Optional[bool] = None,
5252
):
5353
"""
5454
Initialize a new HandlerError.
5555
56-
:param message: A descriptive message for the error. This will become the
57-
`message` in the resulting Nexus Failure object.
56+
:param message: A descriptive message for the error. This will become
57+
the `message` in the resulting Nexus Failure object.
5858
5959
:param type: The :py:class:`HandlerErrorType` of the error.
6060
61-
:param retry_behavior: Optional retry behavior for the error.
61+
:param retryable_override: Optionally set whether the error should be
62+
retried. By default, the error type is used
63+
to determine this.
6264
"""
6365
super().__init__(message)
6466
self._type = type
65-
self._retry_behavior = retry_behavior
67+
self._retryable_override = retryable_override
6668

6769
@property
68-
def retry_behavior(self) -> Optional[HandlerErrorRetryBehavior]:
70+
def retryable_override(self) -> Optional[bool]:
6971
"""
70-
The retry behavior set for this error.
72+
The optional retryability override set when this error was created.
7173
"""
72-
return self._retry_behavior
74+
return self._retryable_override
7375

7476
@property
7577
def retryable(self) -> bool:
7678
"""
7779
Whether this error should be retried.
7880
79-
If :py:attr:`retry_behavior` is None, then the default behavior for the error
80-
type is used. See
81+
If :py:attr:`retryable_override` is None, then the default behavior for the
82+
error type is used. See
8183
https://github.com/nexus-rpc/api/blob/main/SPEC.md#predefined-handler-errors
8284
"""
83-
if self.retry_behavior == HandlerErrorRetryBehavior.RETRYABLE:
84-
return True
85-
elif self.retry_behavior == HandlerErrorRetryBehavior.NON_RETRYABLE:
86-
return False
85+
if self._retryable_override is not None:
86+
return self._retryable_override
8787

8888
non_retryable_types = {
8989
HandlerErrorType.BAD_REQUEST,
@@ -116,22 +116,6 @@ def type(self) -> HandlerErrorType:
116116
return self._type
117117

118118

119-
class HandlerErrorRetryBehavior(Enum):
120-
"""
121-
Retry behavior for a handler error.
122-
"""
123-
124-
RETRYABLE = "RETRYABLE"
125-
"""
126-
The error should be retried.
127-
"""
128-
129-
NON_RETRYABLE = "NON_RETRYABLE"
130-
"""
131-
The error should not be retried.
132-
"""
133-
134-
135119
class HandlerErrorType(Enum):
136120
"""Nexus handler error types.
137121

tests/test_common.py

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
from nexusrpc._common import HandlerError, HandlerErrorType
2+
3+
4+
def test_handler_error_retryable_type():
5+
retryable_error_type = HandlerErrorType.RESOURCE_EXHAUSTED
6+
assert HandlerError(
7+
"test",
8+
type=retryable_error_type,
9+
retryable_override=True,
10+
).retryable
11+
12+
assert not HandlerError(
13+
"test",
14+
type=retryable_error_type,
15+
retryable_override=False,
16+
).retryable
17+
18+
assert HandlerError(
19+
"test",
20+
type=retryable_error_type,
21+
).retryable
22+
23+
24+
def test_handler_error_non_retryable_type():
25+
non_retryable_error_type = HandlerErrorType.BAD_REQUEST
26+
assert HandlerError(
27+
"test",
28+
type=non_retryable_error_type,
29+
retryable_override=True,
30+
).retryable
31+
32+
assert not HandlerError(
33+
"test",
34+
type=non_retryable_error_type,
35+
retryable_override=False,
36+
).retryable
37+
38+
assert not HandlerError(
39+
"test",
40+
type=non_retryable_error_type,
41+
).retryable

0 commit comments

Comments
 (0)