From 11f3c02f5906e8df889525edcc28e60c853f559c Mon Sep 17 00:00:00 2001 From: Kevin Kirsche Date: Thu, 28 Jul 2022 14:15:49 -0400 Subject: [PATCH 1/9] fix: add missing multiprocessing.popen_spawn_win32 --- stdlib/multiprocessing/popen_spawn_win32.py | 41 +++++++++++++++++++++ stdlib/multiprocessing/reduction.pyi | 6 ++- 2 files changed, 45 insertions(+), 2 deletions(-) create mode 100644 stdlib/multiprocessing/popen_spawn_win32.py diff --git a/stdlib/multiprocessing/popen_spawn_win32.py b/stdlib/multiprocessing/popen_spawn_win32.py new file mode 100644 index 000000000000..0b4c326f0412 --- /dev/null +++ b/stdlib/multiprocessing/popen_spawn_win32.py @@ -0,0 +1,41 @@ +import sys +from multiprocessing.process import BaseProcess +from typing import ClassVar +from .util import Finalize + + +if sys.platform == "win32": + __all__ = ["Popen"] + + TERMINATE: int + WINEXE: bool + WINSERVICE: bool + WINENV: bool + + class Popen: + method: ClassVar[str] + pid: int + returncode: int | None + _handle: int + sentinel: int + finalizer: Finalize + + def __init__(self, process_obj: BaseProcess) -> None: + ... + + def duplicate_for_child(self, handle: int) -> int: + ... + + def wait(self, timeout: float | None = ...) -> int | None: + ... + + def poll(self) -> int | None: + ... + + def terminate(self) -> None: + ... + + kill = terminate + + def close(self) -> None: + ... diff --git a/stdlib/multiprocessing/reduction.pyi b/stdlib/multiprocessing/reduction.pyi index 5ddfcbe84647..cb95dc53ae0f 100644 --- a/stdlib/multiprocessing/reduction.pyi +++ b/stdlib/multiprocessing/reduction.pyi @@ -27,9 +27,11 @@ def dump(obj, file, protocol: Any | None = ...) -> None: ... if sys.platform == "win32": if sys.version_info >= (3, 8): - def duplicate(handle, target_process: Any | None = ..., inheritable: bool = ..., *, source_process: Any | None = ...): ... + def duplicate( + handle: int, target_process: Any | None = ..., inheritable: bool = ..., *, source_process: Any | None = ... + ) -> int: ... else: - def duplicate(handle, target_process: Any | None = ..., inheritable: bool = ...): ... + def duplicate(handle: int, target_process: Any | None = ..., inheritable: bool = ...) -> int: ... def steal_handle(source_pid, handle): ... def send_handle(conn, handle, destination_pid) -> None: ... From d28fd7749ff720d6f208cf7cd896e1abf6ed6bca Mon Sep 17 00:00:00 2001 From: Kevin Kirsche Date: Thu, 28 Jul 2022 14:16:51 -0400 Subject: [PATCH 2/9] fix: remove private var --- stdlib/multiprocessing/popen_spawn_win32.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/stdlib/multiprocessing/popen_spawn_win32.py b/stdlib/multiprocessing/popen_spawn_win32.py index 0b4c326f0412..189c1b807eb0 100644 --- a/stdlib/multiprocessing/popen_spawn_win32.py +++ b/stdlib/multiprocessing/popen_spawn_win32.py @@ -13,12 +13,11 @@ WINENV: bool class Popen: + finalizer: Finalize method: ClassVar[str] pid: int returncode: int | None - _handle: int sentinel: int - finalizer: Finalize def __init__(self, process_obj: BaseProcess) -> None: ... From f91f100eca87edd93d39fb5b86f95c8ec724bd34 Mon Sep 17 00:00:00 2001 From: Kevin Kirsche Date: Thu, 28 Jul 2022 14:19:18 -0400 Subject: [PATCH 3/9] fix: remove win32 guard to verify tests actually fail on win32, rather than by name --- stdlib/multiprocessing/popen_spawn_win32.py | 51 ++++++++++----------- 1 file changed, 25 insertions(+), 26 deletions(-) diff --git a/stdlib/multiprocessing/popen_spawn_win32.py b/stdlib/multiprocessing/popen_spawn_win32.py index 189c1b807eb0..48185659abda 100644 --- a/stdlib/multiprocessing/popen_spawn_win32.py +++ b/stdlib/multiprocessing/popen_spawn_win32.py @@ -1,40 +1,39 @@ -import sys from multiprocessing.process import BaseProcess from typing import ClassVar from .util import Finalize -if sys.platform == "win32": - __all__ = ["Popen"] +__all__ = ["Popen"] - TERMINATE: int - WINEXE: bool - WINSERVICE: bool - WINENV: bool +TERMINATE: int +WINEXE: bool +WINSERVICE: bool +WINENV: bool - class Popen: - finalizer: Finalize - method: ClassVar[str] - pid: int - returncode: int | None - sentinel: int - def __init__(self, process_obj: BaseProcess) -> None: - ... +class Popen: + finalizer: Finalize + method: ClassVar[str] + pid: int + returncode: int | None + sentinel: int - def duplicate_for_child(self, handle: int) -> int: - ... + def __init__(self, process_obj: BaseProcess) -> None: + ... - def wait(self, timeout: float | None = ...) -> int | None: - ... + def duplicate_for_child(self, handle: int) -> int: + ... - def poll(self) -> int | None: - ... + def wait(self, timeout: float | None = ...) -> int | None: + ... - def terminate(self) -> None: - ... + def poll(self) -> int | None: + ... - kill = terminate + def terminate(self) -> None: + ... - def close(self) -> None: - ... + kill = terminate + + def close(self) -> None: + ... From 867f1ab52bb24cf34238fded04cd6ce47b26fd59 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Thu, 28 Jul 2022 18:19:35 +0000 Subject: [PATCH 4/9] [pre-commit.ci] auto fixes from pre-commit.com hooks --- stdlib/multiprocessing/popen_spawn_win32.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/stdlib/multiprocessing/popen_spawn_win32.py b/stdlib/multiprocessing/popen_spawn_win32.py index 48185659abda..a71e66305d7d 100644 --- a/stdlib/multiprocessing/popen_spawn_win32.py +++ b/stdlib/multiprocessing/popen_spawn_win32.py @@ -1,7 +1,7 @@ from multiprocessing.process import BaseProcess from typing import ClassVar -from .util import Finalize +from .util import Finalize __all__ = ["Popen"] From 075e8725e672f488a715ee22b239aafd20e34447 Mon Sep 17 00:00:00 2001 From: Kevin Kirsche Date: Thu, 28 Jul 2022 14:22:31 -0400 Subject: [PATCH 5/9] fix: incorrect file extension --- stdlib/multiprocessing/popen_spawn_win32.py | 39 -------------------- stdlib/multiprocessing/popen_spawn_win32.pyi | 28 ++++++++++++++ 2 files changed, 28 insertions(+), 39 deletions(-) delete mode 100644 stdlib/multiprocessing/popen_spawn_win32.py create mode 100644 stdlib/multiprocessing/popen_spawn_win32.pyi diff --git a/stdlib/multiprocessing/popen_spawn_win32.py b/stdlib/multiprocessing/popen_spawn_win32.py deleted file mode 100644 index a71e66305d7d..000000000000 --- a/stdlib/multiprocessing/popen_spawn_win32.py +++ /dev/null @@ -1,39 +0,0 @@ -from multiprocessing.process import BaseProcess -from typing import ClassVar - -from .util import Finalize - -__all__ = ["Popen"] - -TERMINATE: int -WINEXE: bool -WINSERVICE: bool -WINENV: bool - - -class Popen: - finalizer: Finalize - method: ClassVar[str] - pid: int - returncode: int | None - sentinel: int - - def __init__(self, process_obj: BaseProcess) -> None: - ... - - def duplicate_for_child(self, handle: int) -> int: - ... - - def wait(self, timeout: float | None = ...) -> int | None: - ... - - def poll(self) -> int | None: - ... - - def terminate(self) -> None: - ... - - kill = terminate - - def close(self) -> None: - ... diff --git a/stdlib/multiprocessing/popen_spawn_win32.pyi b/stdlib/multiprocessing/popen_spawn_win32.pyi new file mode 100644 index 000000000000..1beb761574fe --- /dev/null +++ b/stdlib/multiprocessing/popen_spawn_win32.pyi @@ -0,0 +1,28 @@ +from multiprocessing.process import BaseProcess +from typing import ClassVar + +from .util import Finalize + +__all__ = ["Popen"] + +TERMINATE: int +WINEXE: bool +WINSERVICE: bool +WINENV: bool + +class Popen: + finalizer: Finalize + method: ClassVar[str] + pid: int + returncode: int | None + sentinel: int + + def __init__(self, process_obj: BaseProcess) -> None: ... + def duplicate_for_child(self, handle: int) -> int: ... + def wait(self, timeout: float | None = ...) -> int | None: ... + def poll(self) -> int | None: ... + def terminate(self) -> None: ... + + kill = terminate + + def close(self) -> None: ... From 1fb24ef63903f78337147894dc15a689d88c49d3 Mon Sep 17 00:00:00 2001 From: Kevin Kirsche Date: Thu, 28 Jul 2022 14:24:16 -0400 Subject: [PATCH 6/9] fix: revert f91f100 --- stdlib/multiprocessing/popen_spawn_win32.pyi | 39 +++++++++++--------- 1 file changed, 21 insertions(+), 18 deletions(-) diff --git a/stdlib/multiprocessing/popen_spawn_win32.pyi b/stdlib/multiprocessing/popen_spawn_win32.pyi index 1beb761574fe..35fe178aa4f2 100644 --- a/stdlib/multiprocessing/popen_spawn_win32.pyi +++ b/stdlib/multiprocessing/popen_spawn_win32.pyi @@ -1,28 +1,31 @@ +import sys + from multiprocessing.process import BaseProcess from typing import ClassVar from .util import Finalize -__all__ = ["Popen"] +if sys.platform == "win32": + __all__ = ["Popen"] -TERMINATE: int -WINEXE: bool -WINSERVICE: bool -WINENV: bool + TERMINATE: int + WINEXE: bool + WINSERVICE: bool + WINENV: bool -class Popen: - finalizer: Finalize - method: ClassVar[str] - pid: int - returncode: int | None - sentinel: int + class Popen: + finalizer: Finalize + method: ClassVar[str] + pid: int + returncode: int | None + sentinel: int - def __init__(self, process_obj: BaseProcess) -> None: ... - def duplicate_for_child(self, handle: int) -> int: ... - def wait(self, timeout: float | None = ...) -> int | None: ... - def poll(self) -> int | None: ... - def terminate(self) -> None: ... + def __init__(self, process_obj: BaseProcess) -> None: ... + def duplicate_for_child(self, handle: int) -> int: ... + def wait(self, timeout: float | None = ...) -> int | None: ... + def poll(self) -> int | None: ... + def terminate(self) -> None: ... - kill = terminate + kill = terminate - def close(self) -> None: ... + def close(self) -> None: ... From 1328903c1c8df3b8ef1ea119cb42c176fc4c09ff Mon Sep 17 00:00:00 2001 From: Kevin Kirsche Date: Thu, 28 Jul 2022 14:25:25 -0400 Subject: [PATCH 7/9] fix: add allowtest entries on darwin and linux --- tests/stubtest_allowlists/darwin.txt | 3 +++ tests/stubtest_allowlists/linux.txt | 3 +++ 2 files changed, 6 insertions(+) diff --git a/tests/stubtest_allowlists/darwin.txt b/tests/stubtest_allowlists/darwin.txt index eb29023ee3da..6c4349dd4ff5 100644 --- a/tests/stubtest_allowlists/darwin.txt +++ b/tests/stubtest_allowlists/darwin.txt @@ -48,6 +48,9 @@ winsound ossaudiodev spwd +# multiprocessing.popen_spawn_win32 exists on Darwin but fail to import +multiprocessing.popen_spawn_win32 + # Platform differences that cannot be captured by the type system os.SCHED_[A-Z_]+ posix.SCHED_[A-Z_]+ diff --git a/tests/stubtest_allowlists/linux.txt b/tests/stubtest_allowlists/linux.txt index c38a121f0b5b..91ea20cf7418 100644 --- a/tests/stubtest_allowlists/linux.txt +++ b/tests/stubtest_allowlists/linux.txt @@ -37,6 +37,9 @@ msvcrt winreg winsound +# multiprocessing.popen_spawn_win32 exists on Linux but fail to import +multiprocessing.popen_spawn_win32 + # Aliases for OSError posix.error.characters_written resource.error.characters_written From bed39329ff1395f1c8091a7b277d012dffb3ae66 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Thu, 28 Jul 2022 18:26:46 +0000 Subject: [PATCH 8/9] [pre-commit.ci] auto fixes from pre-commit.com hooks --- stdlib/multiprocessing/popen_spawn_win32.pyi | 1 - 1 file changed, 1 deletion(-) diff --git a/stdlib/multiprocessing/popen_spawn_win32.pyi b/stdlib/multiprocessing/popen_spawn_win32.pyi index 35fe178aa4f2..f5cb0a6c4844 100644 --- a/stdlib/multiprocessing/popen_spawn_win32.pyi +++ b/stdlib/multiprocessing/popen_spawn_win32.pyi @@ -1,5 +1,4 @@ import sys - from multiprocessing.process import BaseProcess from typing import ClassVar From 89cd3e5ca74671e1631d789fbd6e819c1d0fd277 Mon Sep 17 00:00:00 2001 From: Kevin Kirsche Date: Fri, 29 Jul 2022 10:53:18 -0400 Subject: [PATCH 9/9] fix: replace `Any | None` with `int | None` as the implementation does --- stdlib/multiprocessing/reduction.pyi | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/stdlib/multiprocessing/reduction.pyi b/stdlib/multiprocessing/reduction.pyi index cb95dc53ae0f..a22c16828780 100644 --- a/stdlib/multiprocessing/reduction.pyi +++ b/stdlib/multiprocessing/reduction.pyi @@ -28,10 +28,10 @@ def dump(obj, file, protocol: Any | None = ...) -> None: ... if sys.platform == "win32": if sys.version_info >= (3, 8): def duplicate( - handle: int, target_process: Any | None = ..., inheritable: bool = ..., *, source_process: Any | None = ... + handle: int, target_process: int | None = ..., inheritable: bool = ..., *, source_process: int | None = ... ) -> int: ... else: - def duplicate(handle: int, target_process: Any | None = ..., inheritable: bool = ...) -> int: ... + def duplicate(handle: int, target_process: int | None = ..., inheritable: bool = ...) -> int: ... def steal_handle(source_pid, handle): ... def send_handle(conn, handle, destination_pid) -> None: ...