aboutsummaryrefslogtreecommitdiffstats
path: root/contrib/python/pytest/py3/_pytest/tmpdir.py
diff options
context:
space:
mode:
authormonster <monster@ydb.tech>2022-07-07 14:41:37 +0300
committermonster <monster@ydb.tech>2022-07-07 14:41:37 +0300
commit06e5c21a835c0e923506c4ff27929f34e00761c2 (patch)
tree75efcbc6854ef9bd476eb8bf00cc5c900da436a2 /contrib/python/pytest/py3/_pytest/tmpdir.py
parent03f024c4412e3aa613bb543cf1660176320ba8f4 (diff)
downloadydb-06e5c21a835c0e923506c4ff27929f34e00761c2.tar.gz
fix ya.make
Diffstat (limited to 'contrib/python/pytest/py3/_pytest/tmpdir.py')
-rw-r--r--contrib/python/pytest/py3/_pytest/tmpdir.py212
1 files changed, 0 insertions, 212 deletions
diff --git a/contrib/python/pytest/py3/_pytest/tmpdir.py b/contrib/python/pytest/py3/_pytest/tmpdir.py
deleted file mode 100644
index 12dc463a2a..0000000000
--- a/contrib/python/pytest/py3/_pytest/tmpdir.py
+++ /dev/null
@@ -1,212 +0,0 @@
-"""Support for providing temporary directories to test functions."""
-import os
-import re
-import sys
-import tempfile
-from pathlib import Path
-from typing import Optional
-
-import attr
-
-from .pathlib import LOCK_TIMEOUT
-from .pathlib import make_numbered_dir
-from .pathlib import make_numbered_dir_with_cleanup
-from .pathlib import rm_rf
-from _pytest.compat import final
-from _pytest.config import Config
-from _pytest.deprecated import check_ispytest
-from _pytest.fixtures import fixture
-from _pytest.fixtures import FixtureRequest
-from _pytest.monkeypatch import MonkeyPatch
-
-
-@final
-@attr.s(init=False)
-class TempPathFactory:
- """Factory for temporary directories under the common base temp directory.
-
- The base directory can be configured using the ``--basetemp`` option.
- """
-
- _given_basetemp = attr.ib(type=Optional[Path])
- _trace = attr.ib()
- _basetemp = attr.ib(type=Optional[Path])
-
- def __init__(
- self,
- given_basetemp: Optional[Path],
- trace,
- basetemp: Optional[Path] = None,
- *,
- _ispytest: bool = False,
- ) -> None:
- check_ispytest(_ispytest)
- if given_basetemp is None:
- self._given_basetemp = None
- else:
- # Use os.path.abspath() to get absolute path instead of resolve() as it
- # does not work the same in all platforms (see #4427).
- # Path.absolute() exists, but it is not public (see https://bugs.python.org/issue25012).
- self._given_basetemp = Path(os.path.abspath(str(given_basetemp)))
- self._trace = trace
- self._basetemp = basetemp
-
- @classmethod
- def from_config(
- cls,
- config: Config,
- *,
- _ispytest: bool = False,
- ) -> "TempPathFactory":
- """Create a factory according to pytest configuration.
-
- :meta private:
- """
- check_ispytest(_ispytest)
- return cls(
- given_basetemp=config.option.basetemp,
- trace=config.trace.get("tmpdir"),
- _ispytest=True,
- )
-
- def _ensure_relative_to_basetemp(self, basename: str) -> str:
- basename = os.path.normpath(basename)
- if (self.getbasetemp() / basename).resolve().parent != self.getbasetemp():
- raise ValueError(f"{basename} is not a normalized and relative path")
- return basename
-
- def mktemp(self, basename: str, numbered: bool = True) -> Path:
- """Create a new temporary directory managed by the factory.
-
- :param basename:
- Directory base name, must be a relative path.
-
- :param numbered:
- If ``True``, ensure the directory is unique by adding a numbered
- suffix greater than any existing one: ``basename="foo-"`` and ``numbered=True``
- means that this function will create directories named ``"foo-0"``,
- ``"foo-1"``, ``"foo-2"`` and so on.
-
- :returns:
- The path to the new directory.
- """
- basename = self._ensure_relative_to_basetemp(basename)
- if not numbered:
- p = self.getbasetemp().joinpath(basename)
- p.mkdir(mode=0o700)
- else:
- p = make_numbered_dir(root=self.getbasetemp(), prefix=basename, mode=0o700)
- self._trace("mktemp", p)
- return p
-
- def getbasetemp(self) -> Path:
- """Return the base temporary directory, creating it if needed."""
- if self._basetemp is not None:
- return self._basetemp
-
- if self._given_basetemp is not None:
- basetemp = self._given_basetemp
- if basetemp.exists():
- rm_rf(basetemp)
- basetemp.mkdir(mode=0o700)
- basetemp = basetemp.resolve()
- else:
- from_env = os.environ.get("PYTEST_DEBUG_TEMPROOT")
- temproot = Path(from_env or tempfile.gettempdir()).resolve()
- user = get_user() or "unknown"
- # use a sub-directory in the temproot to speed-up
- # make_numbered_dir() call
- rootdir = temproot.joinpath(f"pytest-of-{user}")
- try:
- rootdir.mkdir(mode=0o700, exist_ok=True)
- except OSError:
- # getuser() likely returned illegal characters for the platform, use unknown back off mechanism
- rootdir = temproot.joinpath("pytest-of-unknown")
- rootdir.mkdir(mode=0o700, exist_ok=True)
- # Because we use exist_ok=True with a predictable name, make sure
- # we are the owners, to prevent any funny business (on unix, where
- # temproot is usually shared).
- # Also, to keep things private, fixup any world-readable temp
- # rootdir's permissions. Historically 0o755 was used, so we can't
- # just error out on this, at least for a while.
- if sys.platform != "win32":
- uid = os.getuid()
- rootdir_stat = rootdir.stat()
- # getuid shouldn't fail, but cpython defines such a case.
- # Let's hope for the best.
- if uid != -1:
- if rootdir_stat.st_uid != uid:
- raise OSError(
- f"The temporary directory {rootdir} is not owned by the current user. "
- "Fix this and try again."
- )
- if (rootdir_stat.st_mode & 0o077) != 0:
- os.chmod(rootdir, rootdir_stat.st_mode & ~0o077)
- basetemp = make_numbered_dir_with_cleanup(
- prefix="pytest-",
- root=rootdir,
- keep=3,
- lock_timeout=LOCK_TIMEOUT,
- mode=0o700,
- )
- assert basetemp is not None, basetemp
- self._basetemp = basetemp
- self._trace("new basetemp", basetemp)
- return basetemp
-
-
-def get_user() -> Optional[str]:
- """Return the current user name, or None if getuser() does not work
- in the current environment (see #1010)."""
- try:
- # In some exotic environments, getpass may not be importable.
- import getpass
-
- return getpass.getuser()
- except (ImportError, KeyError):
- return None
-
-
-def pytest_configure(config: Config) -> None:
- """Create a TempPathFactory 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 tmp_path_factory session fixture.
- """
- mp = MonkeyPatch()
- config.add_cleanup(mp.undo)
- _tmp_path_factory = TempPathFactory.from_config(config, _ispytest=True)
- mp.setattr(config, "_tmp_path_factory", _tmp_path_factory, raising=False)
-
-
-@fixture(scope="session")
-def tmp_path_factory(request: FixtureRequest) -> TempPathFactory:
- """Return a :class:`pytest.TempPathFactory` instance for the test session."""
- # Set dynamically by pytest_configure() above.
- return request.config._tmp_path_factory # type: ignore
-
-
-def _mk_tmp(request: FixtureRequest, factory: TempPathFactory) -> Path:
- name = request.node.name
- name = re.sub(r"[\W]", "_", name)
- MAXVAL = 30
- name = name[:MAXVAL]
- return factory.mktemp(name, numbered=True)
-
-
-@fixture
-def tmp_path(request: FixtureRequest, tmp_path_factory: TempPathFactory) -> Path:
- """Return a temporary directory path object which is unique to each test
- function invocation, created as a sub directory of the base temporary
- directory.
-
- By default, a new base temporary directory is created each test session,
- and old bases are removed after 3 sessions, to aid in debugging. If
- ``--basetemp`` is used then it is cleared each session. See :ref:`base
- temporary directory`.
-
- The returned object is a :class:`pathlib.Path` object.
- """
-
- return _mk_tmp(request, tmp_path_factory)