From 40f02d72b0c66ebb45922388740b4e69e36bd978 Mon Sep 17 00:00:00 2001 From: Ronny Pfannschmidt Date: Fri, 10 Apr 2020 07:49:52 +0200 Subject: [PATCH] Merge pull request #6992 from pytest-dev/revert-6767-tmpdir-cleanup-upstream Revert "tmpdir: clean up indirection via config for factories" --- changelog/6992.bugfix.rst | 1 + src/_pytest/tmpdir.py | 24 +++++++++++++++++++++--- 2 files changed, 22 insertions(+), 3 deletions(-) create mode 100644 changelog/6992.bugfix.rst diff --git a/changelog/6992.bugfix.rst b/changelog/6992.bugfix.rst new file mode 100644 index 00000000000..2c9b0f89eea --- /dev/null +++ b/changelog/6992.bugfix.rst @@ -0,0 +1 @@ +Revert "tmpdir: clean up indirection via config for factories" #6767 as it breaks pytest-xdist. diff --git a/src/_pytest/tmpdir.py b/src/_pytest/tmpdir.py index c1e12da4f0d..85c5b838101 100644 --- a/src/_pytest/tmpdir.py +++ b/src/_pytest/tmpdir.py @@ -14,6 +14,7 @@ from .pathlib import make_numbered_dir_with_cleanup from .pathlib import Path from _pytest.fixtures import FixtureRequest +from _pytest.monkeypatch import MonkeyPatch @attr.s @@ -134,18 +135,35 @@ def get_user() -> Optional[str]: return None +def pytest_configure(config) -> None: + """Create a TempdirFactory and attach it to the config object. + + This is to comply with existing plugins which expect the handler to be + available at pytest_configure time, but ideally should be moved entirely + to the tmpdir_factory session fixture. + """ + mp = MonkeyPatch() + tmppath_handler = TempPathFactory.from_config(config) + t = TempdirFactory(tmppath_handler) + config._cleanup.append(mp.undo) + mp.setattr(config, "_tmp_path_factory", tmppath_handler, raising=False) + mp.setattr(config, "_tmpdirhandler", t, raising=False) + + @pytest.fixture(scope="session") -def tmpdir_factory(tmp_path_factory) -> TempdirFactory: +def tmpdir_factory(request: FixtureRequest) -> TempdirFactory: """Return a :class:`_pytest.tmpdir.TempdirFactory` instance for the test session. """ - return TempdirFactory(tmp_path_factory) + # Set dynamically by pytest_configure() above. + return request.config._tmpdirhandler # type: ignore @pytest.fixture(scope="session") def tmp_path_factory(request: FixtureRequest) -> TempPathFactory: """Return a :class:`_pytest.tmpdir.TempPathFactory` instance for the test session. """ - return TempPathFactory.from_config(request.config) + # Set dynamically by pytest_configure() above. + return request.config._tmp_path_factory # type: ignore def _mk_tmp(request: FixtureRequest, factory: TempPathFactory) -> Path: