From f2ea753321b741b8ded0cbd80a9eafc1f11f62a3 Mon Sep 17 00:00:00 2001 From: Pavel Karateev Date: Sun, 15 Oct 2023 22:40:39 +0200 Subject: [PATCH 01/10] Add `sys.monitoring` from Python 3.12 --- stdlib/{sys.pyi => sys/__init__.pyi} | 4 +++ stdlib/sys/_monitoring.pyi | 44 ++++++++++++++++++++++++++++ tests/stubtest_allowlists/py312.txt | 1 + 3 files changed, 49 insertions(+) rename stdlib/{sys.pyi => sys/__init__.pyi} (99%) create mode 100644 stdlib/sys/_monitoring.pyi diff --git a/stdlib/sys.pyi b/stdlib/sys/__init__.pyi similarity index 99% rename from stdlib/sys.pyi rename to stdlib/sys/__init__.pyi index a5e819d53326..cf3b1bc47d75 100644 --- a/stdlib/sys.pyi +++ b/stdlib/sys/__init__.pyi @@ -370,3 +370,7 @@ if sys.version_info >= (3, 12): def activate_stack_trampoline(__backend: str) -> None: ... else: def activate_stack_trampoline(__backend: str) -> NoReturn: ... + + from . import _monitoring + + monitoring = _monitoring diff --git a/stdlib/sys/_monitoring.pyi b/stdlib/sys/_monitoring.pyi new file mode 100644 index 000000000000..ddba5c7d181a --- /dev/null +++ b/stdlib/sys/_monitoring.pyi @@ -0,0 +1,44 @@ +from collections.abc import Callable +from types import CodeType, SimpleNamespace +from typing import Any + +DEBUGGER_ID: int +COVERAGE_ID: int +PROFILER_ID: int +OPTIMIZER_ID: int + +def use_tool_id(id: int, name: str) -> None: ... +def free_tool_id(id: int) -> None: ... +def get_tool(id: int) -> str | None: ... + +class events(SimpleNamespace): + BRANCH: int + CALL: int + C_RAISE: int + C_RETURN: int + EXCEPTION_HANDLED: int + INSTRUCTION: int + JUMP: int + LINE: int + NO_EVENTS: int + PY_RESUME: int + PY_RETURN: int + PY_START: int + PY_THROW: int + PY_UNWIND: int + PY_YIELD: int + RAISE: int + RERAISE: int + STOP_ITERATION: int + +def get_events(tool_id: int) -> int: ... +def set_events(tool_id: int, event_set: int) -> None: ... +def get_local_events(tool_id: int, code: CodeType) -> int: ... +def set_local_events(tool_id: int, code: CodeType, event_set: int) -> int: ... +def restart_events() -> None: ... # undocumented +def _all_events() -> dict[str, int]: ... # undocumented + +DISABLE: object +MISSING: object + +def register_callback(tool_id: int, event: int, func: Callable[..., Any] | None) -> Callable[..., Any] | None: ... diff --git a/tests/stubtest_allowlists/py312.txt b/tests/stubtest_allowlists/py312.txt index 80e6e1721486..bc9ea76d1a0d 100644 --- a/tests/stubtest_allowlists/py312.txt +++ b/tests/stubtest_allowlists/py312.txt @@ -69,6 +69,7 @@ os.PathLike.__class_getitem__ # PathLike is a protocol; we don't expect all Pat types.GenericAlias.__call__ # Would be complicated to fix properly, Any could silence problems. #6392 types.GenericAlias.__getattr__ types.GenericAlias.__mro_entries__ +sys._monitoring # Doesn't really exist weakref.ProxyType.__reversed__ # Doesn't really exist # C signature is broader than what is actually accepted From 24f45bd6e33ff6387cbf55394866e525605c072e Mon Sep 17 00:00:00 2001 From: Alex Waygood Date: Sun, 15 Oct 2023 22:02:58 +0100 Subject: [PATCH 02/10] Update VERSIONS --- stdlib/VERSIONS | 1 + 1 file changed, 1 insertion(+) diff --git a/stdlib/VERSIONS b/stdlib/VERSIONS index 9d4636a29a1d..64fab8a33606 100644 --- a/stdlib/VERSIONS +++ b/stdlib/VERSIONS @@ -250,6 +250,7 @@ sunau: 2.7- symbol: 2.7-3.9 symtable: 2.7- sys: 2.7- +sys._monitoring: 3.12- # N.B. actually a pseudo-module namespace at runtime sysconfig: 2.7- syslog: 2.7- tabnanny: 2.7- From a80c9f4228a1c69d5c04de23d183c9374d37d8ed Mon Sep 17 00:00:00 2001 From: Pavel Karateev Date: Mon, 16 Oct 2023 14:02:14 +0200 Subject: [PATCH 03/10] `tool` functions don't take keyword arguments Co-authored-by: Alex Waygood --- stdlib/sys/_monitoring.pyi | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/stdlib/sys/_monitoring.pyi b/stdlib/sys/_monitoring.pyi index ddba5c7d181a..07988dfcd6e2 100644 --- a/stdlib/sys/_monitoring.pyi +++ b/stdlib/sys/_monitoring.pyi @@ -7,9 +7,9 @@ COVERAGE_ID: int PROFILER_ID: int OPTIMIZER_ID: int -def use_tool_id(id: int, name: str) -> None: ... -def free_tool_id(id: int) -> None: ... -def get_tool(id: int) -> str | None: ... +def use_tool_id(__id: int, __name: str) -> None: ... +def free_tool_id(__id: int) -> None: ... +def get_tool(__id: int) -> str | None: ... class events(SimpleNamespace): BRANCH: int From ab81b1a7496a244f1f32f34a3060b1ffcdde3e88 Mon Sep 17 00:00:00 2001 From: Pavel Karateev Date: Mon, 16 Oct 2023 14:04:38 +0200 Subject: [PATCH 04/10] `events` should not inherit `SimpleNamespace` Co-authored-by: Alex Waygood --- stdlib/sys/_monitoring.pyi | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/stdlib/sys/_monitoring.pyi b/stdlib/sys/_monitoring.pyi index 07988dfcd6e2..72956100c7ac 100644 --- a/stdlib/sys/_monitoring.pyi +++ b/stdlib/sys/_monitoring.pyi @@ -11,7 +11,9 @@ def use_tool_id(__id: int, __name: str) -> None: ... def free_tool_id(__id: int) -> None: ... def get_tool(__id: int) -> str | None: ... -class events(SimpleNamespace): +events: _events + +class _events: BRANCH: int CALL: int C_RAISE: int From 295b29c58260b64046e30a32e0763dbc87d51ca7 Mon Sep 17 00:00:00 2001 From: Pavel Karateev Date: Mon, 16 Oct 2023 14:05:22 +0200 Subject: [PATCH 05/10] `events` functions don't take keyword arguments Co-authored-by: Alex Waygood --- stdlib/sys/_monitoring.pyi | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/stdlib/sys/_monitoring.pyi b/stdlib/sys/_monitoring.pyi index 72956100c7ac..53ca27bb8c2a 100644 --- a/stdlib/sys/_monitoring.pyi +++ b/stdlib/sys/_monitoring.pyi @@ -33,10 +33,10 @@ class _events: RERAISE: int STOP_ITERATION: int -def get_events(tool_id: int) -> int: ... -def set_events(tool_id: int, event_set: int) -> None: ... -def get_local_events(tool_id: int, code: CodeType) -> int: ... -def set_local_events(tool_id: int, code: CodeType, event_set: int) -> int: ... +def get_events(__tool_id: int) -> int: ... +def set_events(__tool_id: int, __event_set: int) -> None: ... +def get_local_events(__tool_id: int, __code: CodeType) -> int: ... +def set_local_events(__tool_id: int, __code: CodeType, __event_set: int) -> int: ... def restart_events() -> None: ... # undocumented def _all_events() -> dict[str, int]: ... # undocumented From f2375dd7258af3ce8499167bcdafd9d7f3383d43 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 16 Oct 2023 12:05:26 +0000 Subject: [PATCH 06/10] [pre-commit.ci] auto fixes from pre-commit.com hooks --- stdlib/sys/_monitoring.pyi | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/stdlib/sys/_monitoring.pyi b/stdlib/sys/_monitoring.pyi index 53ca27bb8c2a..ada9a25fc942 100644 --- a/stdlib/sys/_monitoring.pyi +++ b/stdlib/sys/_monitoring.pyi @@ -1,5 +1,5 @@ from collections.abc import Callable -from types import CodeType, SimpleNamespace +from types import CodeType from typing import Any DEBUGGER_ID: int From 8215de7bbc51ed02e207e4cc3e5169cbfb2d9840 Mon Sep 17 00:00:00 2001 From: Pavel Karateev Date: Mon, 16 Oct 2023 14:06:26 +0200 Subject: [PATCH 07/10] `callback` functions don't take keyword arguments Co-authored-by: Alex Waygood --- stdlib/sys/_monitoring.pyi | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/stdlib/sys/_monitoring.pyi b/stdlib/sys/_monitoring.pyi index ada9a25fc942..0125801799ef 100644 --- a/stdlib/sys/_monitoring.pyi +++ b/stdlib/sys/_monitoring.pyi @@ -43,4 +43,4 @@ def _all_events() -> dict[str, int]: ... # undocumented DISABLE: object MISSING: object -def register_callback(tool_id: int, event: int, func: Callable[..., Any] | None) -> Callable[..., Any] | None: ... +def register_callback(__tool_id: int, __event: int, __func: Callable[..., Any] | None) -> Callable[..., Any] | None: ... From 2e6c17949df4e86a43416647ad68e53856834b5c Mon Sep 17 00:00:00 2001 From: Pavel Karateev Date: Mon, 16 Oct 2023 14:27:12 +0200 Subject: [PATCH 08/10] Don't provide annotations for `_all_events()` Co-authored-by: Alex Waygood --- stdlib/sys/_monitoring.pyi | 1 - 1 file changed, 1 deletion(-) diff --git a/stdlib/sys/_monitoring.pyi b/stdlib/sys/_monitoring.pyi index 0125801799ef..61d86ce7acca 100644 --- a/stdlib/sys/_monitoring.pyi +++ b/stdlib/sys/_monitoring.pyi @@ -38,7 +38,6 @@ def set_events(__tool_id: int, __event_set: int) -> None: ... def get_local_events(__tool_id: int, __code: CodeType) -> int: ... def set_local_events(__tool_id: int, __code: CodeType, __event_set: int) -> int: ... def restart_events() -> None: ... # undocumented -def _all_events() -> dict[str, int]: ... # undocumented DISABLE: object MISSING: object From 8e14c3506fcf9211d6051cbedc70c926826f6a6e Mon Sep 17 00:00:00 2001 From: Pavel Karateev Date: Mon, 16 Oct 2023 14:31:47 +0200 Subject: [PATCH 09/10] Fix `tool` functions arguments Co-authored-by: Alex Waygood --- stdlib/sys/_monitoring.pyi | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/stdlib/sys/_monitoring.pyi b/stdlib/sys/_monitoring.pyi index 61d86ce7acca..81379b98ace3 100644 --- a/stdlib/sys/_monitoring.pyi +++ b/stdlib/sys/_monitoring.pyi @@ -7,9 +7,9 @@ COVERAGE_ID: int PROFILER_ID: int OPTIMIZER_ID: int -def use_tool_id(__id: int, __name: str) -> None: ... -def free_tool_id(__id: int) -> None: ... -def get_tool(__id: int) -> str | None: ... +def use_tool_id(__tool_id: int, __name: str) -> None: ... +def free_tool_id(__tool_id: int) -> None: ... +def get_tool(__tool_id: int) -> str | None: ... events: _events From f4d1df8a18d84b127fca8b65fc63b1b9c1a1d456 Mon Sep 17 00:00:00 2001 From: AlexWaygood Date: Mon, 16 Oct 2023 13:39:59 +0100 Subject: [PATCH 10/10] More comments --- stdlib/VERSIONS | 2 +- stdlib/sys/_monitoring.pyi | 7 +++++++ tests/stubtest_allowlists/py312.txt | 2 +- 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/stdlib/VERSIONS b/stdlib/VERSIONS index 64fab8a33606..62c58a64266f 100644 --- a/stdlib/VERSIONS +++ b/stdlib/VERSIONS @@ -250,7 +250,7 @@ sunau: 2.7- symbol: 2.7-3.9 symtable: 2.7- sys: 2.7- -sys._monitoring: 3.12- # N.B. actually a pseudo-module namespace at runtime +sys._monitoring: 3.12- # Doesn't actually exist. See comments in the stub. sysconfig: 2.7- syslog: 2.7- tabnanny: 2.7- diff --git a/stdlib/sys/_monitoring.pyi b/stdlib/sys/_monitoring.pyi index 81379b98ace3..0137fb484d29 100644 --- a/stdlib/sys/_monitoring.pyi +++ b/stdlib/sys/_monitoring.pyi @@ -1,3 +1,10 @@ +# This py312+ module provides annotations for `sys.monitoring`. +# It's named `sys._monitoring` in typeshed, +# because trying to import `sys.monitoring` will fail at runtime! +# At runtime, `sys.monitoring` has the unique status +# of being a `types.ModuleType` instance that cannot be directly imported, +# and exists in the `sys`-module namespace despite `sys` not being a package. + from collections.abc import Callable from types import CodeType from typing import Any diff --git a/tests/stubtest_allowlists/py312.txt b/tests/stubtest_allowlists/py312.txt index bc9ea76d1a0d..b8f2a5f4a231 100644 --- a/tests/stubtest_allowlists/py312.txt +++ b/tests/stubtest_allowlists/py312.txt @@ -69,7 +69,7 @@ os.PathLike.__class_getitem__ # PathLike is a protocol; we don't expect all Pat types.GenericAlias.__call__ # Would be complicated to fix properly, Any could silence problems. #6392 types.GenericAlias.__getattr__ types.GenericAlias.__mro_entries__ -sys._monitoring # Doesn't really exist +sys._monitoring # Doesn't really exist. See comments in the stub. weakref.ProxyType.__reversed__ # Doesn't really exist # C signature is broader than what is actually accepted