Skip to content

Commit

Permalink
test annotations to make sure thehy do something.
Browse files Browse the repository at this point in the history
  • Loading branch information
glyph committed Nov 29, 2022
1 parent 3b8c7cf commit b1e0777
Show file tree
Hide file tree
Showing 2 changed files with 44 additions and 2 deletions.
16 changes: 14 additions & 2 deletions src/twisted/internet/defer.py
Original file line number Diff line number Diff line change
Expand Up @@ -554,11 +554,21 @@ def addCallbacks(
# the caller should treat the result as the new type, consistently.
return cast(Deferred[_NextDeferredResultT], self)

@overload
def addCallback(
self,
callback: Callable[Concatenate[_DeferredResultT, _P], Failure],
*args: _P.args,
**kwargs: _P.kwargs,
) -> Deferred[_NextDeferredResultT]:
...

@overload
def addCallback(
self,
callback: Callable[
Concatenate[_DeferredResultT, _P], Union[_NextDeferredResultT, Failure]
Concatenate[_DeferredResultT, _P],
Union[Failure, Deferred[_NextDeferredResultT]],
],
*args: _P.args,
**kwargs: _P.kwargs,
Expand All @@ -568,7 +578,9 @@ def addCallback(
@overload
def addCallback(
self,
callback: Callable[Concatenate[_DeferredResultT, _P], Failure],
callback: Callable[
Concatenate[_DeferredResultT, _P], Union[Failure, _NextDeferredResultT]
],
*args: _P.args,
**kwargs: _P.kwargs,
) -> Deferred[_NextDeferredResultT]:
Expand Down
30 changes: 30 additions & 0 deletions src/twisted/test/test_defer.py
Original file line number Diff line number Diff line change
Expand Up @@ -662,6 +662,36 @@ def test_callbackReturnsDeferred(self) -> None:
self.callbackResults
)

def test_callbackMaybeReturnsFailure(self) -> None:
"""
Callbacks passed to addCallback may return Failures.
"""
d: Deferred[int] = Deferred()

shouldFail = False
rte = RuntimeError()

def maybeFail(result: int) -> Union[int, Failure]:
# testing the Union return annotation here
if shouldFail:
return Failure(rte)
else:
return result + 1

d.callback(6)
self.assertEqual(self.successResultOf(d.addCallback(maybeFail)), 7)
d = Deferred[int]()
shouldFail = True
d.callback(6)
self.assertIs(
self.failureResultOf(
# make sure mypy still considers us a Deferred[int] here
d.addCallback(maybeFail).addCallback(maybeFail),
RuntimeError,
).value,
rte,
)

def test_errbackReturnsDeferred(self) -> None:
"""
Errbacks passed to L{Deferred.addErrback} can return Deferreds just as
Expand Down

0 comments on commit b1e0777

Please sign in to comment.