Merge pull request #11826 from bluetech/no-cwd
Prefer using the invocation dir over CWD
This commit is contained in:
commit
2178ee86d7
|
@ -541,6 +541,7 @@ class PytestPluginManager(PluginManager):
|
||||||
noconftest: bool,
|
noconftest: bool,
|
||||||
rootpath: Path,
|
rootpath: Path,
|
||||||
confcutdir: Optional[Path],
|
confcutdir: Optional[Path],
|
||||||
|
invocation_dir: Path,
|
||||||
importmode: Union[ImportMode, str],
|
importmode: Union[ImportMode, str],
|
||||||
) -> None:
|
) -> None:
|
||||||
"""Load initial conftest files given a preparsed "namespace".
|
"""Load initial conftest files given a preparsed "namespace".
|
||||||
|
@ -550,8 +551,9 @@ class PytestPluginManager(PluginManager):
|
||||||
All builtin and 3rd party plugins will have been loaded, however, so
|
All builtin and 3rd party plugins will have been loaded, however, so
|
||||||
common options will not confuse our logic here.
|
common options will not confuse our logic here.
|
||||||
"""
|
"""
|
||||||
current = Path.cwd()
|
self._confcutdir = (
|
||||||
self._confcutdir = absolutepath(current / confcutdir) if confcutdir else None
|
absolutepath(invocation_dir / confcutdir) if confcutdir else None
|
||||||
|
)
|
||||||
self._noconftest = noconftest
|
self._noconftest = noconftest
|
||||||
self._using_pyargs = pyargs
|
self._using_pyargs = pyargs
|
||||||
foundanchor = False
|
foundanchor = False
|
||||||
|
@ -561,7 +563,7 @@ class PytestPluginManager(PluginManager):
|
||||||
i = path.find("::")
|
i = path.find("::")
|
||||||
if i != -1:
|
if i != -1:
|
||||||
path = path[:i]
|
path = path[:i]
|
||||||
anchor = absolutepath(current / path)
|
anchor = absolutepath(invocation_dir / path)
|
||||||
|
|
||||||
# Ensure we do not break if what appears to be an anchor
|
# Ensure we do not break if what appears to be an anchor
|
||||||
# is in fact a very long option (#10169, #11394).
|
# is in fact a very long option (#10169, #11394).
|
||||||
|
@ -569,7 +571,7 @@ class PytestPluginManager(PluginManager):
|
||||||
self._try_load_conftest(anchor, importmode, rootpath)
|
self._try_load_conftest(anchor, importmode, rootpath)
|
||||||
foundanchor = True
|
foundanchor = True
|
||||||
if not foundanchor:
|
if not foundanchor:
|
||||||
self._try_load_conftest(current, importmode, rootpath)
|
self._try_load_conftest(invocation_dir, importmode, rootpath)
|
||||||
|
|
||||||
def _is_in_confcutdir(self, path: Path) -> bool:
|
def _is_in_confcutdir(self, path: Path) -> bool:
|
||||||
"""Whether a path is within the confcutdir.
|
"""Whether a path is within the confcutdir.
|
||||||
|
@ -1168,6 +1170,7 @@ class Config:
|
||||||
noconftest=early_config.known_args_namespace.noconftest,
|
noconftest=early_config.known_args_namespace.noconftest,
|
||||||
rootpath=early_config.rootpath,
|
rootpath=early_config.rootpath,
|
||||||
confcutdir=early_config.known_args_namespace.confcutdir,
|
confcutdir=early_config.known_args_namespace.confcutdir,
|
||||||
|
invocation_dir=early_config.invocation_params.dir,
|
||||||
importmode=early_config.known_args_namespace.importmode,
|
importmode=early_config.known_args_namespace.importmode,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -1176,8 +1179,8 @@ class Config:
|
||||||
args, namespace=copy.copy(self.option)
|
args, namespace=copy.copy(self.option)
|
||||||
)
|
)
|
||||||
rootpath, inipath, inicfg = determine_setup(
|
rootpath, inipath, inicfg = determine_setup(
|
||||||
ns.inifilename,
|
inifile=ns.inifilename,
|
||||||
ns.file_or_dir + unknown_args,
|
args=ns.file_or_dir + unknown_args,
|
||||||
rootdir_cmd_arg=ns.rootdir or None,
|
rootdir_cmd_arg=ns.rootdir or None,
|
||||||
invocation_dir=self.invocation_params.dir,
|
invocation_dir=self.invocation_params.dir,
|
||||||
)
|
)
|
||||||
|
@ -1261,6 +1264,8 @@ class Config:
|
||||||
"""Decide the args (initial paths/nodeids) to use given the relevant inputs.
|
"""Decide the args (initial paths/nodeids) to use given the relevant inputs.
|
||||||
|
|
||||||
:param warn: Whether can issue warnings.
|
:param warn: Whether can issue warnings.
|
||||||
|
|
||||||
|
:returns: The args and the args source. Guaranteed to be non-empty.
|
||||||
"""
|
"""
|
||||||
if args:
|
if args:
|
||||||
source = Config.ArgsSource.ARGS
|
source = Config.ArgsSource.ARGS
|
||||||
|
|
|
@ -87,6 +87,7 @@ def load_config_dict_from_file(
|
||||||
|
|
||||||
|
|
||||||
def locate_config(
|
def locate_config(
|
||||||
|
invocation_dir: Path,
|
||||||
args: Iterable[Path],
|
args: Iterable[Path],
|
||||||
) -> Tuple[Optional[Path], Optional[Path], Dict[str, Union[str, List[str]]]]:
|
) -> Tuple[Optional[Path], Optional[Path], Dict[str, Union[str, List[str]]]]:
|
||||||
"""Search in the list of arguments for a valid ini-file for pytest,
|
"""Search in the list of arguments for a valid ini-file for pytest,
|
||||||
|
@ -100,7 +101,7 @@ def locate_config(
|
||||||
]
|
]
|
||||||
args = [x for x in args if not str(x).startswith("-")]
|
args = [x for x in args if not str(x).startswith("-")]
|
||||||
if not args:
|
if not args:
|
||||||
args = [Path.cwd()]
|
args = [invocation_dir]
|
||||||
for arg in args:
|
for arg in args:
|
||||||
argpath = absolutepath(arg)
|
argpath = absolutepath(arg)
|
||||||
for base in (argpath, *argpath.parents):
|
for base in (argpath, *argpath.parents):
|
||||||
|
@ -113,7 +114,10 @@ def locate_config(
|
||||||
return None, None, {}
|
return None, None, {}
|
||||||
|
|
||||||
|
|
||||||
def get_common_ancestor(paths: Iterable[Path]) -> Path:
|
def get_common_ancestor(
|
||||||
|
invocation_dir: Path,
|
||||||
|
paths: Iterable[Path],
|
||||||
|
) -> Path:
|
||||||
common_ancestor: Optional[Path] = None
|
common_ancestor: Optional[Path] = None
|
||||||
for path in paths:
|
for path in paths:
|
||||||
if not path.exists():
|
if not path.exists():
|
||||||
|
@ -130,7 +134,7 @@ def get_common_ancestor(paths: Iterable[Path]) -> Path:
|
||||||
if shared is not None:
|
if shared is not None:
|
||||||
common_ancestor = shared
|
common_ancestor = shared
|
||||||
if common_ancestor is None:
|
if common_ancestor is None:
|
||||||
common_ancestor = Path.cwd()
|
common_ancestor = invocation_dir
|
||||||
elif common_ancestor.is_file():
|
elif common_ancestor.is_file():
|
||||||
common_ancestor = common_ancestor.parent
|
common_ancestor = common_ancestor.parent
|
||||||
return common_ancestor
|
return common_ancestor
|
||||||
|
@ -162,10 +166,11 @@ CFG_PYTEST_SECTION = "[pytest] section in {filename} files is no longer supporte
|
||||||
|
|
||||||
|
|
||||||
def determine_setup(
|
def determine_setup(
|
||||||
|
*,
|
||||||
inifile: Optional[str],
|
inifile: Optional[str],
|
||||||
args: Sequence[str],
|
args: Sequence[str],
|
||||||
rootdir_cmd_arg: Optional[str] = None,
|
rootdir_cmd_arg: Optional[str],
|
||||||
invocation_dir: Optional[Path] = None,
|
invocation_dir: Path,
|
||||||
) -> Tuple[Path, Optional[Path], Dict[str, Union[str, List[str]]]]:
|
) -> Tuple[Path, Optional[Path], Dict[str, Union[str, List[str]]]]:
|
||||||
"""Determine the rootdir, inifile and ini configuration values from the
|
"""Determine the rootdir, inifile and ini configuration values from the
|
||||||
command line arguments.
|
command line arguments.
|
||||||
|
@ -177,8 +182,7 @@ def determine_setup(
|
||||||
:param rootdir_cmd_arg:
|
:param rootdir_cmd_arg:
|
||||||
The `--rootdir` command line argument, if given.
|
The `--rootdir` command line argument, if given.
|
||||||
:param invocation_dir:
|
:param invocation_dir:
|
||||||
The working directory when pytest was invoked, if known.
|
The working directory when pytest was invoked.
|
||||||
If not known, the current working directory is used.
|
|
||||||
"""
|
"""
|
||||||
rootdir = None
|
rootdir = None
|
||||||
dirs = get_dirs_from_args(args)
|
dirs = get_dirs_from_args(args)
|
||||||
|
@ -189,8 +193,8 @@ def determine_setup(
|
||||||
if rootdir_cmd_arg is None:
|
if rootdir_cmd_arg is None:
|
||||||
rootdir = inipath_.parent
|
rootdir = inipath_.parent
|
||||||
else:
|
else:
|
||||||
ancestor = get_common_ancestor(dirs)
|
ancestor = get_common_ancestor(invocation_dir, dirs)
|
||||||
rootdir, inipath, inicfg = locate_config([ancestor])
|
rootdir, inipath, inicfg = locate_config(invocation_dir, [ancestor])
|
||||||
if rootdir is None and rootdir_cmd_arg is None:
|
if rootdir is None and rootdir_cmd_arg is None:
|
||||||
for possible_rootdir in (ancestor, *ancestor.parents):
|
for possible_rootdir in (ancestor, *ancestor.parents):
|
||||||
if (possible_rootdir / "setup.py").is_file():
|
if (possible_rootdir / "setup.py").is_file():
|
||||||
|
@ -198,13 +202,11 @@ def determine_setup(
|
||||||
break
|
break
|
||||||
else:
|
else:
|
||||||
if dirs != [ancestor]:
|
if dirs != [ancestor]:
|
||||||
rootdir, inipath, inicfg = locate_config(dirs)
|
rootdir, inipath, inicfg = locate_config(invocation_dir, dirs)
|
||||||
if rootdir is None:
|
if rootdir is None:
|
||||||
if invocation_dir is not None:
|
rootdir = get_common_ancestor(
|
||||||
cwd = invocation_dir
|
invocation_dir, [invocation_dir, ancestor]
|
||||||
else:
|
)
|
||||||
cwd = Path.cwd()
|
|
||||||
rootdir = get_common_ancestor([cwd, ancestor])
|
|
||||||
if is_fs_root(rootdir):
|
if is_fs_root(rootdir):
|
||||||
rootdir = ancestor
|
rootdir = ancestor
|
||||||
if rootdir_cmd_arg:
|
if rootdir_cmd_arg:
|
||||||
|
|
|
@ -109,10 +109,11 @@ def pytest_cmdline_parse() -> Generator[None, Config, Config]:
|
||||||
debugfile = open(path, "w", encoding="utf-8")
|
debugfile = open(path, "w", encoding="utf-8")
|
||||||
debugfile.write(
|
debugfile.write(
|
||||||
"versions pytest-%s, "
|
"versions pytest-%s, "
|
||||||
"python-%s\ncwd=%s\nargs=%s\n\n"
|
"python-%s\ninvocation_dir=%s\ncwd=%s\nargs=%s\n\n"
|
||||||
% (
|
% (
|
||||||
pytest.__version__,
|
pytest.__version__,
|
||||||
".".join(map(str, sys.version_info)),
|
".".join(map(str, sys.version_info)),
|
||||||
|
config.invocation_params.dir,
|
||||||
os.getcwd(),
|
os.getcwd(),
|
||||||
config.invocation_params.args,
|
config.invocation_params.args,
|
||||||
)
|
)
|
||||||
|
|
|
@ -1525,14 +1525,13 @@ def _ascii_escaped_by_config(val: Union[str, bytes], config: Optional[Config]) -
|
||||||
return val if escape_option else ascii_escaped(val) # type: ignore
|
return val if escape_option else ascii_escaped(val) # type: ignore
|
||||||
|
|
||||||
|
|
||||||
def _pretty_fixture_path(func) -> str:
|
def _pretty_fixture_path(invocation_dir: Path, func) -> str:
|
||||||
cwd = Path.cwd()
|
loc = Path(getlocation(func, invocation_dir))
|
||||||
loc = Path(getlocation(func, str(cwd)))
|
|
||||||
prefix = Path("...", "_pytest")
|
prefix = Path("...", "_pytest")
|
||||||
try:
|
try:
|
||||||
return str(prefix / loc.relative_to(_PYTEST_DIR))
|
return str(prefix / loc.relative_to(_PYTEST_DIR))
|
||||||
except ValueError:
|
except ValueError:
|
||||||
return bestrelpath(cwd, loc)
|
return bestrelpath(invocation_dir, loc)
|
||||||
|
|
||||||
|
|
||||||
def show_fixtures_per_test(config):
|
def show_fixtures_per_test(config):
|
||||||
|
@ -1545,19 +1544,19 @@ def _show_fixtures_per_test(config: Config, session: Session) -> None:
|
||||||
import _pytest.config
|
import _pytest.config
|
||||||
|
|
||||||
session.perform_collect()
|
session.perform_collect()
|
||||||
curdir = Path.cwd()
|
invocation_dir = config.invocation_params.dir
|
||||||
tw = _pytest.config.create_terminal_writer(config)
|
tw = _pytest.config.create_terminal_writer(config)
|
||||||
verbose = config.getvalue("verbose")
|
verbose = config.getvalue("verbose")
|
||||||
|
|
||||||
def get_best_relpath(func) -> str:
|
def get_best_relpath(func) -> str:
|
||||||
loc = getlocation(func, str(curdir))
|
loc = getlocation(func, invocation_dir)
|
||||||
return bestrelpath(curdir, Path(loc))
|
return bestrelpath(invocation_dir, Path(loc))
|
||||||
|
|
||||||
def write_fixture(fixture_def: fixtures.FixtureDef[object]) -> None:
|
def write_fixture(fixture_def: fixtures.FixtureDef[object]) -> None:
|
||||||
argname = fixture_def.argname
|
argname = fixture_def.argname
|
||||||
if verbose <= 0 and argname.startswith("_"):
|
if verbose <= 0 and argname.startswith("_"):
|
||||||
return
|
return
|
||||||
prettypath = _pretty_fixture_path(fixture_def.func)
|
prettypath = _pretty_fixture_path(invocation_dir, fixture_def.func)
|
||||||
tw.write(f"{argname}", green=True)
|
tw.write(f"{argname}", green=True)
|
||||||
tw.write(f" -- {prettypath}", yellow=True)
|
tw.write(f" -- {prettypath}", yellow=True)
|
||||||
tw.write("\n")
|
tw.write("\n")
|
||||||
|
@ -1601,7 +1600,7 @@ def _showfixtures_main(config: Config, session: Session) -> None:
|
||||||
import _pytest.config
|
import _pytest.config
|
||||||
|
|
||||||
session.perform_collect()
|
session.perform_collect()
|
||||||
curdir = Path.cwd()
|
invocation_dir = config.invocation_params.dir
|
||||||
tw = _pytest.config.create_terminal_writer(config)
|
tw = _pytest.config.create_terminal_writer(config)
|
||||||
verbose = config.getvalue("verbose")
|
verbose = config.getvalue("verbose")
|
||||||
|
|
||||||
|
@ -1615,7 +1614,7 @@ def _showfixtures_main(config: Config, session: Session) -> None:
|
||||||
if not fixturedefs:
|
if not fixturedefs:
|
||||||
continue
|
continue
|
||||||
for fixturedef in fixturedefs:
|
for fixturedef in fixturedefs:
|
||||||
loc = getlocation(fixturedef.func, str(curdir))
|
loc = getlocation(fixturedef.func, invocation_dir)
|
||||||
if (fixturedef.argname, loc) in seen:
|
if (fixturedef.argname, loc) in seen:
|
||||||
continue
|
continue
|
||||||
seen.add((fixturedef.argname, loc))
|
seen.add((fixturedef.argname, loc))
|
||||||
|
@ -1623,7 +1622,7 @@ def _showfixtures_main(config: Config, session: Session) -> None:
|
||||||
(
|
(
|
||||||
len(fixturedef.baseid),
|
len(fixturedef.baseid),
|
||||||
fixturedef.func.__module__,
|
fixturedef.func.__module__,
|
||||||
_pretty_fixture_path(fixturedef.func),
|
_pretty_fixture_path(invocation_dir, fixturedef.func),
|
||||||
fixturedef.argname,
|
fixturedef.argname,
|
||||||
fixturedef,
|
fixturedef,
|
||||||
)
|
)
|
||||||
|
|
|
@ -59,7 +59,7 @@ class TestParseIni:
|
||||||
),
|
),
|
||||||
encoding="utf-8",
|
encoding="utf-8",
|
||||||
)
|
)
|
||||||
_, _, cfg = locate_config([sub])
|
_, _, cfg = locate_config(Path.cwd(), [sub])
|
||||||
assert cfg["name"] == "value"
|
assert cfg["name"] == "value"
|
||||||
config = pytester.parseconfigure(str(sub))
|
config = pytester.parseconfigure(str(sub))
|
||||||
assert config.inicfg["name"] == "value"
|
assert config.inicfg["name"] == "value"
|
||||||
|
@ -1436,16 +1436,16 @@ def test_collect_pytest_prefix_bug(pytestconfig):
|
||||||
|
|
||||||
class TestRootdir:
|
class TestRootdir:
|
||||||
def test_simple_noini(self, tmp_path: Path, monkeypatch: MonkeyPatch) -> None:
|
def test_simple_noini(self, tmp_path: Path, monkeypatch: MonkeyPatch) -> None:
|
||||||
assert get_common_ancestor([tmp_path]) == tmp_path
|
assert get_common_ancestor(Path.cwd(), [tmp_path]) == tmp_path
|
||||||
a = tmp_path / "a"
|
a = tmp_path / "a"
|
||||||
a.mkdir()
|
a.mkdir()
|
||||||
assert get_common_ancestor([a, tmp_path]) == tmp_path
|
assert get_common_ancestor(Path.cwd(), [a, tmp_path]) == tmp_path
|
||||||
assert get_common_ancestor([tmp_path, a]) == tmp_path
|
assert get_common_ancestor(Path.cwd(), [tmp_path, a]) == tmp_path
|
||||||
monkeypatch.chdir(tmp_path)
|
monkeypatch.chdir(tmp_path)
|
||||||
assert get_common_ancestor([]) == tmp_path
|
assert get_common_ancestor(Path.cwd(), []) == tmp_path
|
||||||
no_path = tmp_path / "does-not-exist"
|
no_path = tmp_path / "does-not-exist"
|
||||||
assert get_common_ancestor([no_path]) == tmp_path
|
assert get_common_ancestor(Path.cwd(), [no_path]) == tmp_path
|
||||||
assert get_common_ancestor([no_path / "a"]) == tmp_path
|
assert get_common_ancestor(Path.cwd(), [no_path / "a"]) == tmp_path
|
||||||
|
|
||||||
@pytest.mark.parametrize(
|
@pytest.mark.parametrize(
|
||||||
"name, contents",
|
"name, contents",
|
||||||
|
@ -1467,10 +1467,20 @@ class TestRootdir:
|
||||||
b = a / "b"
|
b = a / "b"
|
||||||
b.mkdir()
|
b.mkdir()
|
||||||
for args in ([str(tmp_path)], [str(a)], [str(b)]):
|
for args in ([str(tmp_path)], [str(a)], [str(b)]):
|
||||||
rootpath, parsed_inipath, _ = determine_setup(None, args)
|
rootpath, parsed_inipath, _ = determine_setup(
|
||||||
|
inifile=None,
|
||||||
|
args=args,
|
||||||
|
rootdir_cmd_arg=None,
|
||||||
|
invocation_dir=Path.cwd(),
|
||||||
|
)
|
||||||
assert rootpath == tmp_path
|
assert rootpath == tmp_path
|
||||||
assert parsed_inipath == inipath
|
assert parsed_inipath == inipath
|
||||||
rootpath, parsed_inipath, ini_config = determine_setup(None, [str(b), str(a)])
|
rootpath, parsed_inipath, ini_config = determine_setup(
|
||||||
|
inifile=None,
|
||||||
|
args=[str(b), str(a)],
|
||||||
|
rootdir_cmd_arg=None,
|
||||||
|
invocation_dir=Path.cwd(),
|
||||||
|
)
|
||||||
assert rootpath == tmp_path
|
assert rootpath == tmp_path
|
||||||
assert parsed_inipath == inipath
|
assert parsed_inipath == inipath
|
||||||
assert ini_config == {"x": "10"}
|
assert ini_config == {"x": "10"}
|
||||||
|
@ -1482,7 +1492,12 @@ class TestRootdir:
|
||||||
a = tmp_path / "a"
|
a = tmp_path / "a"
|
||||||
a.mkdir()
|
a.mkdir()
|
||||||
(a / name).touch()
|
(a / name).touch()
|
||||||
rootpath, parsed_inipath, _ = determine_setup(None, [str(a)])
|
rootpath, parsed_inipath, _ = determine_setup(
|
||||||
|
inifile=None,
|
||||||
|
args=[str(a)],
|
||||||
|
rootdir_cmd_arg=None,
|
||||||
|
invocation_dir=Path.cwd(),
|
||||||
|
)
|
||||||
assert rootpath == tmp_path
|
assert rootpath == tmp_path
|
||||||
assert parsed_inipath == inipath
|
assert parsed_inipath == inipath
|
||||||
|
|
||||||
|
@ -1491,14 +1506,24 @@ class TestRootdir:
|
||||||
a.mkdir()
|
a.mkdir()
|
||||||
(a / "setup.cfg").touch()
|
(a / "setup.cfg").touch()
|
||||||
(tmp_path / "setup.py").touch()
|
(tmp_path / "setup.py").touch()
|
||||||
rootpath, inipath, inicfg = determine_setup(None, [str(a)])
|
rootpath, inipath, inicfg = determine_setup(
|
||||||
|
inifile=None,
|
||||||
|
args=[str(a)],
|
||||||
|
rootdir_cmd_arg=None,
|
||||||
|
invocation_dir=Path.cwd(),
|
||||||
|
)
|
||||||
assert rootpath == tmp_path
|
assert rootpath == tmp_path
|
||||||
assert inipath is None
|
assert inipath is None
|
||||||
assert inicfg == {}
|
assert inicfg == {}
|
||||||
|
|
||||||
def test_nothing(self, tmp_path: Path, monkeypatch: MonkeyPatch) -> None:
|
def test_nothing(self, tmp_path: Path, monkeypatch: MonkeyPatch) -> None:
|
||||||
monkeypatch.chdir(tmp_path)
|
monkeypatch.chdir(tmp_path)
|
||||||
rootpath, inipath, inicfg = determine_setup(None, [str(tmp_path)])
|
rootpath, inipath, inicfg = determine_setup(
|
||||||
|
inifile=None,
|
||||||
|
args=[str(tmp_path)],
|
||||||
|
rootdir_cmd_arg=None,
|
||||||
|
invocation_dir=Path.cwd(),
|
||||||
|
)
|
||||||
assert rootpath == tmp_path
|
assert rootpath == tmp_path
|
||||||
assert inipath is None
|
assert inipath is None
|
||||||
assert inicfg == {}
|
assert inicfg == {}
|
||||||
|
@ -1520,7 +1545,12 @@ class TestRootdir:
|
||||||
p = tmp_path / name
|
p = tmp_path / name
|
||||||
p.touch()
|
p.touch()
|
||||||
p.write_text(contents, encoding="utf-8")
|
p.write_text(contents, encoding="utf-8")
|
||||||
rootpath, inipath, ini_config = determine_setup(str(p), [str(tmp_path)])
|
rootpath, inipath, ini_config = determine_setup(
|
||||||
|
inifile=str(p),
|
||||||
|
args=[str(tmp_path)],
|
||||||
|
rootdir_cmd_arg=None,
|
||||||
|
invocation_dir=Path.cwd(),
|
||||||
|
)
|
||||||
assert rootpath == tmp_path
|
assert rootpath == tmp_path
|
||||||
assert inipath == p
|
assert inipath == p
|
||||||
assert ini_config == {"x": "10"}
|
assert ini_config == {"x": "10"}
|
||||||
|
@ -1534,14 +1564,24 @@ class TestRootdir:
|
||||||
monkeypatch.chdir(tmp_path)
|
monkeypatch.chdir(tmp_path)
|
||||||
|
|
||||||
# No config file is explicitly given: rootdir is determined to be cwd.
|
# No config file is explicitly given: rootdir is determined to be cwd.
|
||||||
rootpath, found_inipath, *_ = determine_setup(None, [str(tests_dir)])
|
rootpath, found_inipath, *_ = determine_setup(
|
||||||
|
inifile=None,
|
||||||
|
args=[str(tests_dir)],
|
||||||
|
rootdir_cmd_arg=None,
|
||||||
|
invocation_dir=Path.cwd(),
|
||||||
|
)
|
||||||
assert rootpath == tmp_path
|
assert rootpath == tmp_path
|
||||||
assert found_inipath is None
|
assert found_inipath is None
|
||||||
|
|
||||||
# Config file is explicitly given: rootdir is determined to be inifile's directory.
|
# Config file is explicitly given: rootdir is determined to be inifile's directory.
|
||||||
inipath = tmp_path / "pytest.ini"
|
inipath = tmp_path / "pytest.ini"
|
||||||
inipath.touch()
|
inipath.touch()
|
||||||
rootpath, found_inipath, *_ = determine_setup(str(inipath), [str(tests_dir)])
|
rootpath, found_inipath, *_ = determine_setup(
|
||||||
|
inifile=str(inipath),
|
||||||
|
args=[str(tests_dir)],
|
||||||
|
rootdir_cmd_arg=None,
|
||||||
|
invocation_dir=Path.cwd(),
|
||||||
|
)
|
||||||
assert rootpath == tmp_path
|
assert rootpath == tmp_path
|
||||||
assert found_inipath == inipath
|
assert found_inipath == inipath
|
||||||
|
|
||||||
|
@ -1553,7 +1593,12 @@ class TestRootdir:
|
||||||
a.mkdir()
|
a.mkdir()
|
||||||
b = tmp_path / "b"
|
b = tmp_path / "b"
|
||||||
b.mkdir()
|
b.mkdir()
|
||||||
rootpath, inifile, _ = determine_setup(None, [str(a), str(b)])
|
rootpath, inifile, _ = determine_setup(
|
||||||
|
inifile=None,
|
||||||
|
args=[str(a), str(b)],
|
||||||
|
rootdir_cmd_arg=None,
|
||||||
|
invocation_dir=Path.cwd(),
|
||||||
|
)
|
||||||
assert rootpath == tmp_path
|
assert rootpath == tmp_path
|
||||||
assert inifile is None
|
assert inifile is None
|
||||||
|
|
||||||
|
@ -1564,7 +1609,12 @@ class TestRootdir:
|
||||||
b.mkdir()
|
b.mkdir()
|
||||||
inipath = a / "pytest.ini"
|
inipath = a / "pytest.ini"
|
||||||
inipath.touch()
|
inipath.touch()
|
||||||
rootpath, parsed_inipath, _ = determine_setup(None, [str(a), str(b)])
|
rootpath, parsed_inipath, _ = determine_setup(
|
||||||
|
inifile=None,
|
||||||
|
args=[str(a), str(b)],
|
||||||
|
rootdir_cmd_arg=None,
|
||||||
|
invocation_dir=Path.cwd(),
|
||||||
|
)
|
||||||
assert rootpath == a
|
assert rootpath == a
|
||||||
assert inipath == parsed_inipath
|
assert inipath == parsed_inipath
|
||||||
|
|
||||||
|
@ -1573,7 +1623,12 @@ class TestRootdir:
|
||||||
self, dirs: Sequence[str], tmp_path: Path, monkeypatch: MonkeyPatch
|
self, dirs: Sequence[str], tmp_path: Path, monkeypatch: MonkeyPatch
|
||||||
) -> None:
|
) -> None:
|
||||||
monkeypatch.chdir(tmp_path)
|
monkeypatch.chdir(tmp_path)
|
||||||
rootpath, inipath, _ = determine_setup(None, dirs)
|
rootpath, inipath, _ = determine_setup(
|
||||||
|
inifile=None,
|
||||||
|
args=dirs,
|
||||||
|
rootdir_cmd_arg=None,
|
||||||
|
invocation_dir=Path.cwd(),
|
||||||
|
)
|
||||||
assert rootpath == tmp_path
|
assert rootpath == tmp_path
|
||||||
assert inipath is None
|
assert inipath is None
|
||||||
|
|
||||||
|
@ -1584,7 +1639,12 @@ class TestRootdir:
|
||||||
a.mkdir()
|
a.mkdir()
|
||||||
(a / "exists").touch()
|
(a / "exists").touch()
|
||||||
monkeypatch.chdir(tmp_path)
|
monkeypatch.chdir(tmp_path)
|
||||||
rootpath, inipath, _ = determine_setup(None, ["a/exist"])
|
rootpath, inipath, _ = determine_setup(
|
||||||
|
inifile=None,
|
||||||
|
args=["a/exist"],
|
||||||
|
rootdir_cmd_arg=None,
|
||||||
|
invocation_dir=Path.cwd(),
|
||||||
|
)
|
||||||
assert rootpath == tmp_path
|
assert rootpath == tmp_path
|
||||||
assert inipath is None
|
assert inipath is None
|
||||||
|
|
||||||
|
@ -1598,7 +1658,12 @@ class TestRootdir:
|
||||||
(tmp_path / "myproject" / "tests").mkdir()
|
(tmp_path / "myproject" / "tests").mkdir()
|
||||||
monkeypatch.chdir(tmp_path / "myproject")
|
monkeypatch.chdir(tmp_path / "myproject")
|
||||||
|
|
||||||
rootpath, inipath, _ = determine_setup(None, ["tests/"])
|
rootpath, inipath, _ = determine_setup(
|
||||||
|
inifile=None,
|
||||||
|
args=["tests/"],
|
||||||
|
rootdir_cmd_arg=None,
|
||||||
|
invocation_dir=Path.cwd(),
|
||||||
|
)
|
||||||
|
|
||||||
assert rootpath == tmp_path / "myproject"
|
assert rootpath == tmp_path / "myproject"
|
||||||
assert inipath == tmp_path / "myproject" / "setup.cfg"
|
assert inipath == tmp_path / "myproject" / "setup.cfg"
|
||||||
|
|
|
@ -35,6 +35,7 @@ def conftest_setinitial(
|
||||||
noconftest=False,
|
noconftest=False,
|
||||||
rootpath=Path(args[0]),
|
rootpath=Path(args[0]),
|
||||||
confcutdir=confcutdir,
|
confcutdir=confcutdir,
|
||||||
|
invocation_dir=Path.cwd(),
|
||||||
importmode="prepend",
|
importmode="prepend",
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
|
@ -109,18 +109,19 @@ class TestCommonAncestor:
|
||||||
fn2 = tmp_path / "foo" / "zaz" / "test_2.py"
|
fn2 = tmp_path / "foo" / "zaz" / "test_2.py"
|
||||||
fn2.parent.mkdir(parents=True)
|
fn2.parent.mkdir(parents=True)
|
||||||
fn2.touch()
|
fn2.touch()
|
||||||
assert get_common_ancestor([fn1, fn2]) == tmp_path / "foo"
|
cwd = Path.cwd()
|
||||||
assert get_common_ancestor([fn1.parent, fn2]) == tmp_path / "foo"
|
assert get_common_ancestor(cwd, [fn1, fn2]) == tmp_path / "foo"
|
||||||
assert get_common_ancestor([fn1.parent, fn2.parent]) == tmp_path / "foo"
|
assert get_common_ancestor(cwd, [fn1.parent, fn2]) == tmp_path / "foo"
|
||||||
assert get_common_ancestor([fn1, fn2.parent]) == tmp_path / "foo"
|
assert get_common_ancestor(cwd, [fn1.parent, fn2.parent]) == tmp_path / "foo"
|
||||||
|
assert get_common_ancestor(cwd, [fn1, fn2.parent]) == tmp_path / "foo"
|
||||||
|
|
||||||
def test_single_dir(self, tmp_path: Path) -> None:
|
def test_single_dir(self, tmp_path: Path) -> None:
|
||||||
assert get_common_ancestor([tmp_path]) == tmp_path
|
assert get_common_ancestor(Path.cwd(), [tmp_path]) == tmp_path
|
||||||
|
|
||||||
def test_single_file(self, tmp_path: Path) -> None:
|
def test_single_file(self, tmp_path: Path) -> None:
|
||||||
fn = tmp_path / "foo.py"
|
fn = tmp_path / "foo.py"
|
||||||
fn.touch()
|
fn.touch()
|
||||||
assert get_common_ancestor([fn]) == tmp_path
|
assert get_common_ancestor(Path.cwd(), [fn]) == tmp_path
|
||||||
|
|
||||||
|
|
||||||
def test_get_dirs_from_args(tmp_path):
|
def test_get_dirs_from_args(tmp_path):
|
||||||
|
|
Loading…
Reference in New Issue