Merge pull request #8006 from bluetech/export-MonkeyPatch
Export MonkeyPatch as pytest.MonkeyPatch
This commit is contained in:
		
						commit
						e986d84466
					
				| 
						 | 
				
			
			@ -0,0 +1,8 @@
 | 
			
		|||
It is now possible to construct a :class:`~pytest.MonkeyPatch` object directly as ``pytest.MonkeyPatch()``,
 | 
			
		||||
in cases when the :fixture:`monkeypatch` fixture cannot be used. Previously some users imported it
 | 
			
		||||
from the private `_pytest.monkeypatch.MonkeyPatch` namespace.
 | 
			
		||||
 | 
			
		||||
Additionally, :meth:`MonkeyPatch.context <pytest.MonkeyPatch.context>` is now a classmethod,
 | 
			
		||||
and can be used as ``with MonkeyPatch.context() as mp: ...``. This is the recommended way to use
 | 
			
		||||
``MonkeyPatch`` directly, since unlike the ``monkeypatch`` fixture, an instance created directly
 | 
			
		||||
is not ``undo()``-ed automatically.
 | 
			
		||||
| 
						 | 
				
			
			@ -486,16 +486,14 @@ caplog
 | 
			
		|||
monkeypatch
 | 
			
		||||
~~~~~~~~~~~
 | 
			
		||||
 | 
			
		||||
.. currentmodule:: _pytest.monkeypatch
 | 
			
		||||
 | 
			
		||||
**Tutorial**: :doc:`monkeypatch`.
 | 
			
		||||
 | 
			
		||||
.. autofunction:: _pytest.monkeypatch.monkeypatch()
 | 
			
		||||
    :no-auto-options:
 | 
			
		||||
 | 
			
		||||
    Returns a :class:`MonkeyPatch` instance.
 | 
			
		||||
    Returns a :class:`~pytest.MonkeyPatch` instance.
 | 
			
		||||
 | 
			
		||||
.. autoclass:: _pytest.monkeypatch.MonkeyPatch
 | 
			
		||||
.. autoclass:: pytest.MonkeyPatch
 | 
			
		||||
    :members:
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -111,8 +111,17 @@ notset = Notset()
 | 
			
		|||
 | 
			
		||||
@final
 | 
			
		||||
class MonkeyPatch:
 | 
			
		||||
    """Object returned by the ``monkeypatch`` fixture keeping a record of
 | 
			
		||||
    setattr/item/env/syspath changes."""
 | 
			
		||||
    """Helper to conveniently monkeypatch attributes/items/environment
 | 
			
		||||
    variables/syspath.
 | 
			
		||||
 | 
			
		||||
    Returned by the :fixture:`monkeypatch` fixture.
 | 
			
		||||
 | 
			
		||||
    :versionchanged:: 6.2
 | 
			
		||||
        Can now also be used directly as `pytest.MonkeyPatch()`, for when
 | 
			
		||||
        the fixture is not available. In this case, use
 | 
			
		||||
        :meth:`with MonkeyPatch.context() as mp: <context>` or remember to call
 | 
			
		||||
        :meth:`undo` explicitly.
 | 
			
		||||
    """
 | 
			
		||||
 | 
			
		||||
    def __init__(self) -> None:
 | 
			
		||||
        self._setattr: List[Tuple[object, str, object]] = []
 | 
			
		||||
| 
						 | 
				
			
			@ -120,8 +129,9 @@ class MonkeyPatch:
 | 
			
		|||
        self._cwd: Optional[str] = None
 | 
			
		||||
        self._savesyspath: Optional[List[str]] = None
 | 
			
		||||
 | 
			
		||||
    @classmethod
 | 
			
		||||
    @contextmanager
 | 
			
		||||
    def context(self) -> Generator["MonkeyPatch", None, None]:
 | 
			
		||||
    def context(cls) -> Generator["MonkeyPatch", None, None]:
 | 
			
		||||
        """Context manager that returns a new :class:`MonkeyPatch` object
 | 
			
		||||
        which undoes any patching done inside the ``with`` block upon exit.
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -140,7 +150,7 @@ class MonkeyPatch:
 | 
			
		|||
        such as mocking ``stdlib`` functions that might break pytest itself if mocked (for examples
 | 
			
		||||
        of this see `#3290 <https://github.com/pytest-dev/pytest/issues/3290>`_.
 | 
			
		||||
        """
 | 
			
		||||
        m = MonkeyPatch()
 | 
			
		||||
        m = cls()
 | 
			
		||||
        try:
 | 
			
		||||
            yield m
 | 
			
		||||
        finally:
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -19,6 +19,7 @@ from _pytest.freeze_support import freeze_includes
 | 
			
		|||
from _pytest.main import Session
 | 
			
		||||
from _pytest.mark import MARK_GEN as mark
 | 
			
		||||
from _pytest.mark import param
 | 
			
		||||
from _pytest.monkeypatch import MonkeyPatch
 | 
			
		||||
from _pytest.nodes import Collector
 | 
			
		||||
from _pytest.nodes import File
 | 
			
		||||
from _pytest.nodes import Item
 | 
			
		||||
| 
						 | 
				
			
			@ -74,6 +75,7 @@ __all__ = [
 | 
			
		|||
    "main",
 | 
			
		||||
    "mark",
 | 
			
		||||
    "Module",
 | 
			
		||||
    "MonkeyPatch",
 | 
			
		||||
    "Package",
 | 
			
		||||
    "param",
 | 
			
		||||
    "PytestAssertRewriteWarning",
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -409,6 +409,16 @@ def test_context() -> None:
 | 
			
		|||
    assert inspect.isclass(functools.partial)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def test_context_classmethod() -> None:
 | 
			
		||||
    class A:
 | 
			
		||||
        x = 1
 | 
			
		||||
 | 
			
		||||
    with MonkeyPatch.context() as m:
 | 
			
		||||
        m.setattr(A, "x", 2)
 | 
			
		||||
        assert A.x == 2
 | 
			
		||||
    assert A.x == 1
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def test_syspath_prepend_with_namespace_packages(
 | 
			
		||||
    testdir: Testdir, monkeypatch: MonkeyPatch
 | 
			
		||||
) -> None:
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue