Skip to content

Commit

Permalink
remove now-unused callback protocols, add test for type coverage
Browse files Browse the repository at this point in the history
  • Loading branch information
glyph committed Nov 22, 2022
1 parent 80e8dbb commit 1d80f0f
Show file tree
Hide file tree
Showing 2 changed files with 51 additions and 84 deletions.
112 changes: 29 additions & 83 deletions src/twisted/internet/defer.py
Original file line number Diff line number Diff line change
Expand Up @@ -85,81 +85,6 @@ def _copy_context() -> Type[_NoContext]:
_P = ParamSpec("_P")
_R = TypeVar("_R")
_R_co = TypeVar("_R_co", covariant=True)


class _SyncCallback(Protocol[_ResultParam, _P, _R_co]):
def __call__(
self, result: _ResultParam, *args: _P.args, **kwargs: _P.kwargs
) -> _R_co:
...


class _AsyncCallback(Protocol[_ResultParam, _P, _R]):
def __call__(
self, result: _ResultParam, *args: _P.args, **kwargs: _P.kwargs
) -> Deferred[_R]:
...


class _FailingCallback(Protocol[_ResultParam, _P]):
def __call__(
self, result: _ResultParam, *args: _P.args, **kwargs: _P.kwargs
) -> Failure:
...


class _SyncRecoveryCallback(Protocol[_P, _R_co]):
def __call__(self, result: Failure, *args: _P.args, **kwargs: _P.kwargs) -> _R_co:
...


class _AsyncRecoveryCallback(Protocol[_P, _R]):
def __call__(
self, result: Failure, *args: _P.args, **kwargs: _P.kwargs
) -> Deferred[_R]:
...


class _FailingRecoveryCallback(Protocol[_P]):
def __call__(self, result: Failure, *args: _P.args, **kwargs: _P.kwargs) -> Failure:
...


class _SyncEitherCallback(Protocol[_ResultParam, _P, _R_co]):
def __call__(
self, result: Union[_ResultParam, Failure], *args: _P.args, **kwargs: _P.kwargs
) -> _R_co:
...


class _AsyncEitherCallback(Protocol[_ResultParam, _P, _R]):
def __call__(
self, result: Union[_ResultParam, Failure], *args: _P.args, **kwargs: _P.kwargs
) -> Deferred[_R]:
...


class _FailingEitherCallback(Protocol[_ResultParam, _P]):
def __call__(
self, result: Union[_ResultParam, Failure], *args: _P.args, **kwargs: _P.kwargs
) -> Failure:
...


# class _EitherCallback(Protocol[_ResultParam, _P, _R_co]):
# def __call__(
# self, result: Union[_ResultParam, Failure], /, *args: _P.args, **kwargs: _P.kwargs
# ) -> Union[_R_co, Deferred[_R_co], Failure]:
# ...


# _DeferredCallback: TypeAlias = Union[
# _SyncCallback[_T, _P, _R],
# _AsyncCallback[_T, _P, _R],
# _FailingCallback[_T, _P],
# ]

# ^ This must be expanded in-line everywhere, due to this issue:
# https://github.com/python/mypy/issues/11855


Expand Down Expand Up @@ -342,9 +267,6 @@ def passthru(arg: _T) -> _T:
return arg


_passthru: _SyncCallback[Any, Any, Any]


def _failthru(arg: Failure) -> Failure:
return arg

Expand Down Expand Up @@ -668,22 +590,46 @@ def addCallback(
"""
return self.addCallbacks(callback, callbackArgs=args, callbackKeywords=kwargs)

@overload
def addErrback(
self,
errback: Callable[Concatenate[Failure, _P], Deferred[_NextDeferredResultT]],
*args: _P.args,
**kwargs: _P.kwargs,
) -> "Deferred[Union[_DeferredResultT, _NextDeferredResultT]]":
...

@overload
def addErrback(
self,
errback: Callable[Concatenate[Failure, _P], Failure],
*args: _P.args,
**kwargs: _P.kwargs,
) -> "Deferred[Union[_DeferredResultT]]":
...

@overload
def addErrback(
self,
errback: Callable[Concatenate[Failure, _P], _NextDeferredResultT],
*args: _P.args,
**kwargs: _P.kwargs,
) -> "Deferred[Union[_NextDeferredResultT]]":
) -> "Deferred[Union[_DeferredResultT, _NextDeferredResultT]]":
...

def addErrback(
self,
errback: Callable[..., Any],
*args: Any,
**kwargs: Any,
) -> "Deferred[Union[_DeferredResultT, _NextDeferredResultT]]":
"""
Convenience method for adding just an errback.
See L{addCallbacks}.
"""
# type note: passthru constrains the type of errback in a way which mypy
# can't propagate through to _NextDeferredResultT, so we have to
# ignore a type error.
return self.addCallbacks(
_passthru,
passthru,
errback,
errbackArgs=args,
errbackKeywords=kwargs,
Expand Down
23 changes: 22 additions & 1 deletion src/twisted/test/test_defer.py
Original file line number Diff line number Diff line change
Expand Up @@ -1286,7 +1286,7 @@ def test_nestedAsynchronousChainedDeferredsWithExtraCallbacks(self) -> None:
# added explicitly and directly to it.
inner: Deferred[str] = Deferred()

def cb(result: str) -> Deferred[None]:
def cb(result: str) -> Deferred[Optional[List[str]]]:
results.append(("start-of-cb", result))
d = defer.succeed("inner")

Expand Down Expand Up @@ -3036,6 +3036,27 @@ def errback(f: Failure) -> Failure:

self.failureResultOf(d, defer.TimeoutError)

def test_errbackReturnsDeferred(self) -> None:
"""
Errbacks can return Deferreds just as callbacks can.
"""
d: Deferred[int] = Deferred()
d2: Deferred[str] = Deferred()
resultValues = []

def asyncErrback(result: Failure) -> Deferred[str]:
return d2

def syncCallback(result: Union[str, int]) -> None:
resultValues.append(result)

d.addErrback(asyncErrback).addCallback(syncCallback)
d.errback(ValueError())
self.assertNoResult(d)
self.assertEqual(resultValues, [])
d2.callback("result")
self.assertEqual(resultValues, ["result"])

def test_errbackAddedBeforeTimeoutSuppressesCancellation(self) -> None:
"""
An errback added before a timeout is added errbacks with a
Expand Down

0 comments on commit 1d80f0f

Please sign in to comment.