From 0ce825b5a8646a227978db83388d38b3cd96ba92 Mon Sep 17 00:00:00 2001 From: Alex Waygood Date: Sat, 4 Jun 2022 16:27:52 +0100 Subject: [PATCH] Add `unittest` features new in Python 3.11 (#8020) python/cpython@086c6b1 --- stdlib/unittest/__init__.pyi | 3 ++- stdlib/unittest/async_case.pyi | 8 ++++++++ stdlib/unittest/case.pyi | 11 +++++++++++ tests/stubtest_allowlists/py311.txt | 9 --------- 4 files changed, 21 insertions(+), 10 deletions(-) diff --git a/stdlib/unittest/__init__.pyi b/stdlib/unittest/__init__.pyi index 6420617cc..114c8aec5 100644 --- a/stdlib/unittest/__init__.pyi +++ b/stdlib/unittest/__init__.pyi @@ -33,7 +33,7 @@ if sys.version_info >= (3, 8): from .case import addModuleCleanup as addModuleCleanup if sys.version_info >= (3, 11): - from .case import doModuleCleanups as doModuleCleanups + from .case import doModuleCleanups as doModuleCleanups, enterModuleContext as enterModuleContext if sys.version_info >= (3, 11): __all__ = [ @@ -58,6 +58,7 @@ if sys.version_info >= (3, 11): "removeHandler", "addModuleCleanup", "doModuleCleanups", + "enterModuleContext", "getTestCaseNames", "makeSuite", "findTestCases", diff --git a/stdlib/unittest/async_case.pyi b/stdlib/unittest/async_case.pyi index 55407ec3f..c1de205fb 100644 --- a/stdlib/unittest/async_case.pyi +++ b/stdlib/unittest/async_case.pyi @@ -1,11 +1,19 @@ +import sys from collections.abc import Awaitable, Callable +from typing import TypeVar from typing_extensions import ParamSpec from .case import TestCase +if sys.version_info >= (3, 11): + from contextlib import AbstractAsyncContextManager + +_T = TypeVar("_T") _P = ParamSpec("_P") class IsolatedAsyncioTestCase(TestCase): async def asyncSetUp(self) -> None: ... async def asyncTearDown(self) -> None: ... def addAsyncCleanup(self, __func: Callable[_P, Awaitable[object]], *args: _P.args, **kwargs: _P.kwargs) -> None: ... + if sys.version_info >= (3, 11): + async def enterAsyncContext(self, cm: AbstractAsyncContextManager[_T]) -> _T: ... diff --git a/stdlib/unittest/case.pyi b/stdlib/unittest/case.pyi index ca4ad8368..7f2928233 100644 --- a/stdlib/unittest/case.pyi +++ b/stdlib/unittest/case.pyi @@ -13,6 +13,7 @@ from warnings import WarningMessage if sys.version_info >= (3, 9): from types import GenericAlias +_T = TypeVar("_T") _E = TypeVar("_E", bound=BaseException) _FT = TypeVar("_FT", bound=Callable[..., Any]) _P = ParamSpec("_P") @@ -50,6 +51,9 @@ if sys.version_info >= (3, 8): def addModuleCleanup(__function: Callable[_P, object], *args: _P.args, **kwargs: _P.kwargs) -> None: ... def doModuleCleanups() -> None: ... +if sys.version_info >= (3, 11): + def enterModuleContext(cm: AbstractContextManager[_T]) -> _T: ... + def expectedFailure(test_item: _FT) -> _FT: ... def skip(reason: str) -> Callable[[_FT], _FT]: ... def skipIf(condition: object, reason: str) -> Callable[[_FT], _FT]: ... @@ -211,6 +215,9 @@ class TestCase: else: def addCleanup(self, function: Callable[_P, object], *args: _P.args, **kwargs: _P.kwargs) -> None: ... + if sys.version_info >= (3, 11): + def enterContext(self, cm: AbstractContextManager[_T]) -> _T: ... + def doCleanups(self) -> None: ... if sys.version_info >= (3, 8): @classmethod @@ -218,6 +225,10 @@ class TestCase: @classmethod def doClassCleanups(cls) -> None: ... + if sys.version_info >= (3, 11): + @classmethod + def enterClassContext(cls, cm: AbstractContextManager[_T]) -> _T: ... + def _formatMessage(self, msg: str | None, standardMsg: str) -> str: ... # undocumented def _getAssertEqualityFunc(self, first: Any, second: Any) -> Callable[..., None]: ... # undocumented if sys.version_info < (3, 12): diff --git a/tests/stubtest_allowlists/py311.txt b/tests/stubtest_allowlists/py311.txt index c5c276d8f..218279dcf 100644 --- a/tests/stubtest_allowlists/py311.txt +++ b/tests/stubtest_allowlists/py311.txt @@ -69,15 +69,6 @@ typing.TypeVar.__typing_subst__ typing.TypeVarTuple.__typing_subst__ weakref.WeakValueDictionary.update -unittest.IsolatedAsyncioTestCase.enterAsyncContext -unittest.TestCase.enterClassContext -unittest.TestCase.enterContext -unittest.enterModuleContext -unittest.async_case.IsolatedAsyncioTestCase.enterAsyncContext -unittest.case.TestCase.enterClassContext -unittest.case.TestCase.enterContext -unittest.case.enterModuleContext - # stubtest complains that in 3.10 the default argument is inconsistent with the annotation, # but in 3.10+ calling the function without the default argument is in fact deprecated, # so it's better to ignore stubtest