recwarn: improve return type annotation of non-contextmanager pytest.warns
It returns the return value of the function.
This commit is contained in:
		
							parent
							
								
									f00bec2a12
								
							
						
					
					
						commit
						4d813fdf5e
					
				| 
						 | 
					@ -9,6 +9,7 @@ from typing import List
 | 
				
			||||||
from typing import Optional
 | 
					from typing import Optional
 | 
				
			||||||
from typing import Pattern
 | 
					from typing import Pattern
 | 
				
			||||||
from typing import Tuple
 | 
					from typing import Tuple
 | 
				
			||||||
 | 
					from typing import TypeVar
 | 
				
			||||||
from typing import Union
 | 
					from typing import Union
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from _pytest.compat import overload
 | 
					from _pytest.compat import overload
 | 
				
			||||||
| 
						 | 
					@ -20,6 +21,9 @@ if TYPE_CHECKING:
 | 
				
			||||||
    from typing import Type
 | 
					    from typing import Type
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					T = TypeVar("T")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@fixture
 | 
					@fixture
 | 
				
			||||||
def recwarn():
 | 
					def recwarn():
 | 
				
			||||||
    """Return a :class:`WarningsRecorder` instance that records all warnings emitted by test functions.
 | 
					    """Return a :class:`WarningsRecorder` instance that records all warnings emitted by test functions.
 | 
				
			||||||
| 
						 | 
					@ -67,11 +71,10 @@ def warns(
 | 
				
			||||||
@overload  # noqa: F811
 | 
					@overload  # noqa: F811
 | 
				
			||||||
def warns(  # noqa: F811
 | 
					def warns(  # noqa: F811
 | 
				
			||||||
    expected_warning: Optional[Union["Type[Warning]", Tuple["Type[Warning]", ...]]],
 | 
					    expected_warning: Optional[Union["Type[Warning]", Tuple["Type[Warning]", ...]]],
 | 
				
			||||||
    func: Callable,
 | 
					    func: Callable[..., T],
 | 
				
			||||||
    *args: Any,
 | 
					    *args: Any,
 | 
				
			||||||
    match: Optional[Union[str, "Pattern"]] = ...,
 | 
					 | 
				
			||||||
    **kwargs: Any
 | 
					    **kwargs: Any
 | 
				
			||||||
) -> Union[Any]:
 | 
					) -> T:
 | 
				
			||||||
    raise NotImplementedError()
 | 
					    raise NotImplementedError()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -97,7 +100,7 @@ def warns(  # noqa: F811
 | 
				
			||||||
        ...    warnings.warn("my warning", RuntimeWarning)
 | 
					        ...    warnings.warn("my warning", RuntimeWarning)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    In the context manager form you may use the keyword argument ``match`` to assert
 | 
					    In the context manager form you may use the keyword argument ``match`` to assert
 | 
				
			||||||
    that the exception matches a text or regex::
 | 
					    that the warning matches a text or regex::
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        >>> with warns(UserWarning, match='must be 0 or None'):
 | 
					        >>> with warns(UserWarning, match='must be 0 or None'):
 | 
				
			||||||
        ...     warnings.warn("value must be 0 or None", UserWarning)
 | 
					        ...     warnings.warn("value must be 0 or None", UserWarning)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -370,13 +370,14 @@ class TestWarns:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @pytest.mark.filterwarnings("ignore")
 | 
					    @pytest.mark.filterwarnings("ignore")
 | 
				
			||||||
    def test_can_capture_previously_warned(self) -> None:
 | 
					    def test_can_capture_previously_warned(self) -> None:
 | 
				
			||||||
        def f():
 | 
					        def f() -> int:
 | 
				
			||||||
            warnings.warn(UserWarning("ohai"))
 | 
					            warnings.warn(UserWarning("ohai"))
 | 
				
			||||||
            return 10
 | 
					            return 10
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        assert f() == 10
 | 
					        assert f() == 10
 | 
				
			||||||
        assert pytest.warns(UserWarning, f) == 10
 | 
					        assert pytest.warns(UserWarning, f) == 10
 | 
				
			||||||
        assert pytest.warns(UserWarning, f) == 10
 | 
					        assert pytest.warns(UserWarning, f) == 10
 | 
				
			||||||
 | 
					        assert pytest.warns(UserWarning, f) != "10"  # type: ignore[comparison-overlap]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def test_warns_context_manager_with_kwargs(self) -> None:
 | 
					    def test_warns_context_manager_with_kwargs(self) -> None:
 | 
				
			||||||
        with pytest.raises(TypeError) as excinfo:
 | 
					        with pytest.raises(TypeError) as excinfo:
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue