Skip to content

Commit

Permalink
Add CancelScope.cancelled_caught
Browse files Browse the repository at this point in the history
Added `CancelScope.cancelled_caught` to match the Trio API. Relevant
Trio documentation
[here](https://trio.readthedocs.io/en/stable/reference-core.html#trio.CancelScope.cancelled_caught).

Closes #257
  • Loading branch information
johnzeringue committed Apr 23, 2021
1 parent 5169f1d commit 752f34c
Show file tree
Hide file tree
Showing 5 changed files with 28 additions and 0 deletions.
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -15,3 +15,5 @@ __pycache__
.cache
.local
.pre-commit-config.yaml
.vscode/
.python-version
7 changes: 7 additions & 0 deletions src/anyio/_backends/_asyncio.py
Original file line number Diff line number Diff line change
Expand Up @@ -233,6 +233,7 @@ def __init__(self, deadline: float = math.inf, shield: bool = False):
self._deadline = deadline
self._shield = shield
self._parent_scope: Optional[CancelScope] = None
self._cancelled_caught = False
self._cancel_called = False
self._active = False
self._timeout_handle: Optional[asyncio.TimerHandle] = None
Expand Down Expand Up @@ -304,6 +305,8 @@ def __exit__(self, exc_type: Optional[Type[BaseException]], exc_val: Optional[Ba
if exc_val is not None:
exceptions = exc_val.exceptions if isinstance(exc_val, ExceptionGroup) else [exc_val]
if all(isinstance(exc, CancelledError) for exc in exceptions):
self._cancelled_caught = not self._parent_cancelled()

if self._timeout_expired:
return True
elif not self._cancel_called:
Expand Down Expand Up @@ -392,6 +395,10 @@ def deadline(self, value: float) -> None:
if self._active and not self._cancel_called:
self._timeout()

@property
def cancelled_caught(self) -> bool:
return self._cancelled_caught

@property
def cancel_called(self) -> bool:
return self._cancel_called
Expand Down
4 changes: 4 additions & 0 deletions src/anyio/_backends/_trio.py
Original file line number Diff line number Diff line change
Expand Up @@ -85,6 +85,10 @@ def deadline(self) -> float:
def deadline(self, value: float) -> None:
self.__original.deadline = value

@property
def cancelled_caught(self) -> bool:
return self.__original.cancelled_caught

@property
def cancel_called(self) -> bool:
return self.__original.cancel_called
Expand Down
5 changes: 5 additions & 0 deletions src/anyio/_core/_tasks.py
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,11 @@ def deadline(self) -> float:
def deadline(self, value: float) -> None:
raise NotImplementedError

@property
def cancelled_caught(self) -> bool:
"""Records whether this scope caught a ``CancelledError``."""
raise NotImplementedError

@property
def cancel_called(self) -> bool:
"""``True`` if :meth:`cancel` has been called."""
Expand Down
10 changes: 10 additions & 0 deletions tests/test_taskgroups.py
Original file line number Diff line number Diff line change
Expand Up @@ -395,6 +395,7 @@ async def test_fail_after(delay):
with fail_after(delay) as scope:
await sleep(1)

assert scope.cancelled_caught
assert scope.cancel_called


Expand All @@ -403,6 +404,7 @@ async def test_fail_after_no_timeout():
assert scope.deadline == float('inf')
await sleep(0.1)

assert not scope.cancelled_caught
assert not scope.cancel_called


Expand All @@ -429,6 +431,7 @@ async def test_move_on_after(delay):
result = True

assert not result
assert scope.cancelled_caught
assert scope.cancel_called


Expand All @@ -440,6 +443,7 @@ async def test_move_on_after_no_timeout():
result = True

assert result
assert not scope.cancelled_caught
assert not scope.cancel_called


Expand All @@ -456,6 +460,8 @@ async def test_nested_move_on_after():

assert not sleep_completed
assert not inner_scope_completed
assert outer_scope.cancelled_caught
assert not inner_scope.cancelled_caught
assert outer_scope.cancel_called
assert not inner_scope.cancel_called

Expand All @@ -478,6 +484,8 @@ async def cancel_when_ready():

assert inner_sleep_completed
assert not outer_sleep_completed
assert tg.cancel_scope.cancelled_caught
assert not inner_scope.cancelled_caught
assert tg.cancel_scope.cancel_called
assert not inner_scope.cancel_called

Expand Down Expand Up @@ -558,6 +566,7 @@ async def child():
host_done = True

assert host_done
assert not tg.cancel_scope.cancelled_caught
assert not tg.cancel_scope.cancel_called


Expand Down Expand Up @@ -654,6 +663,7 @@ async def killer(scope):

pytest.fail('Execution should also not reach this point')

assert scope.cancelled_caught
assert scope.cancel_called


Expand Down

0 comments on commit 752f34c

Please sign in to comment.