Skip to content

Commit 06f3fc9

Browse files
authored
Add asyncio.graph, updates to asyncio.futures (3.14) (#14003)
1 parent 3f8a48f commit 06f3fc9

File tree

5 files changed

+54
-12
lines changed

5 files changed

+54
-12
lines changed

stdlib/@tests/stubtest_allowlists/py314.txt

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -22,28 +22,17 @@ _thread.set_name
2222
ast.Interpolation
2323
ast.TemplateStr
2424
asyncio.__all__
25-
asyncio.FrameCallGraphEntry
26-
asyncio.FutureCallGraph
2725
asyncio._AbstractEventLoopPolicy
2826
asyncio._DefaultEventLoopPolicy
2927
asyncio._get_event_loop_policy
3028
asyncio._set_event_loop_policy
31-
asyncio.capture_call_graph
3229
asyncio.eager_task_factory
33-
asyncio.format_call_graph
34-
asyncio.future_add_to_awaited_by
35-
asyncio.future_discard_from_awaited_by
36-
asyncio.print_call_graph
3730
asyncio.events.__all__
3831
asyncio.events.AbstractEventLoopPolicy
3932
asyncio.events.BaseDefaultEventLoopPolicy
4033
asyncio.events._AbstractEventLoopPolicy
4134
asyncio.events._get_event_loop_policy
4235
asyncio.events._set_event_loop_policy
43-
asyncio.futures.__all__
44-
asyncio.futures.future_add_to_awaited_by
45-
asyncio.futures.future_discard_from_awaited_by
46-
asyncio.graph
4736
asyncio.tasks.eager_task_factory
4837
bdb.Bdb.__init__
4938
bdb.Bdb.disable_current_event

stdlib/VERSIONS

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,7 @@ asynchat: 3.0-3.11
8787
asyncio: 3.4-
8888
asyncio.exceptions: 3.8-
8989
asyncio.format_helpers: 3.7-
90+
asyncio.graph: 3.14-
9091
asyncio.mixins: 3.10-
9192
asyncio.runners: 3.7-
9293
asyncio.staggered: 3.8-

stdlib/asyncio/__init__.pyi

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,9 @@ from .tasks import *
2121
from .threads import *
2222
from .transports import *
2323

24+
if sys.version_info >= (3, 14):
25+
from .graph import *
26+
2427
if sys.version_info >= (3, 11):
2528
from .taskgroups import *
2629
from .timeouts import *
@@ -32,6 +35,7 @@ else:
3235

3336
if sys.platform == "win32":
3437
if sys.version_info >= (3, 14):
38+
3539
__all__ = (
3640
"BaseEventLoop", # from base_events
3741
"Server", # from base_events
@@ -60,6 +64,13 @@ if sys.platform == "win32":
6064
"Future", # from futures
6165
"wrap_future", # from futures
6266
"isfuture", # from futures
67+
"future_discard_from_awaited_by", # from futures
68+
"future_add_to_awaited_by", # from futures
69+
"capture_call_graph", # from graph
70+
"format_call_graph", # from graph
71+
"print_call_graph", # from graph
72+
"FrameCallGraphEntry", # from graph
73+
"FutureCallGraph", # from graph
6374
"Lock", # from locks
6475
"Event", # from locks
6576
"Condition", # from locks
@@ -527,6 +538,13 @@ else:
527538
"Future", # from futures
528539
"wrap_future", # from futures
529540
"isfuture", # from futures
541+
"future_discard_from_awaited_by", # from futures
542+
"future_add_to_awaited_by", # from futures
543+
"capture_call_graph", # from graph
544+
"format_call_graph", # from graph
545+
"print_call_graph", # from graph
546+
"FrameCallGraphEntry", # from graph
547+
"FutureCallGraph", # from graph
530548
"Lock", # from locks
531549
"Event", # from locks
532550
"Condition", # from locks

stdlib/asyncio/futures.pyi

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import sys
12
from _asyncio import Future as Future
23
from concurrent.futures._base import Future as _ConcurrentFuture
34
from typing import Any, TypeVar
@@ -6,7 +7,10 @@ from typing_extensions import TypeIs
67
from .events import AbstractEventLoop
78

89
# Keep asyncio.__all__ updated with any changes to __all__ here
9-
__all__ = ("Future", "wrap_future", "isfuture")
10+
if sys.version_info >= (3, 14):
11+
__all__ = ("Future", "wrap_future", "isfuture", "future_discard_from_awaited_by", "future_add_to_awaited_by")
12+
else:
13+
__all__ = ("Future", "wrap_future", "isfuture")
1014

1115
_T = TypeVar("_T")
1216

@@ -15,3 +19,7 @@ _T = TypeVar("_T")
1519
# That's why the import order is reversed.
1620
def isfuture(obj: object) -> TypeIs[Future[Any]]: ...
1721
def wrap_future(future: _ConcurrentFuture[_T] | Future[_T], *, loop: AbstractEventLoop | None = None) -> Future[_T]: ...
22+
23+
if sys.version_info >= (3, 14):
24+
def future_discard_from_awaited_by(future: Future[Any], waiter: Future[Any], /) -> None: ...
25+
def future_add_to_awaited_by(future: Future[Any], waiter: Future[Any], /) -> None: ...

stdlib/asyncio/graph.pyi

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
from _typeshed import SupportsWrite
2+
from asyncio import Future
3+
from dataclasses import dataclass
4+
from types import FrameType
5+
from typing import Any, overload
6+
7+
__all__ = ("capture_call_graph", "format_call_graph", "print_call_graph", "FrameCallGraphEntry", "FutureCallGraph")
8+
9+
@dataclass(frozen=True)
10+
class FrameCallGraphEntry:
11+
frame: FrameType
12+
13+
@dataclass(frozen=True)
14+
class FutureCallGraph:
15+
future: Future[Any]
16+
call_stack: tuple[FrameCallGraphEntry, ...]
17+
awaited_by: tuple[FutureCallGraph, ...]
18+
19+
@overload
20+
def capture_call_graph(future: None = None, /, *, depth: int = 1, limit: int | None = None) -> FutureCallGraph | None: ...
21+
@overload
22+
def capture_call_graph(future: Future[Any], /, *, depth: int = 1, limit: int | None = None) -> FutureCallGraph | None: ...
23+
def format_call_graph(future: Future[Any] | None = None, /, *, depth: int = 1, limit: int | None = None) -> str: ...
24+
def print_call_graph(
25+
future: Future[Any] | None = None, /, *, file: SupportsWrite[str] | None = None, depth: int = 1, limit: int | None = None
26+
) -> None: ...

0 commit comments

Comments
 (0)