diff --git a/doc/en/example/nonpython/conftest.py b/doc/en/example/nonpython/conftest.py index bdcc8b762..8a32814ed 100644 --- a/doc/en/example/nonpython/conftest.py +++ b/doc/en/example/nonpython/conftest.py @@ -2,9 +2,9 @@ import pytest -def pytest_collect_file(parent, path): - if path.ext == ".yaml" and path.basename.startswith("test"): - return YamlFile.from_parent(parent, fspath=path) +def pytest_collect_file(parent, fspath): + if fspath.suffix == ".yaml" and fspath.name.startswith("test"): + return YamlFile.from_parent(parent, path=fspath) class YamlFile(pytest.File): @@ -12,7 +12,7 @@ class YamlFile(pytest.File): # We need a yaml parser, e.g. PyYAML. import yaml - raw = yaml.safe_load(self.fspath.open()) + raw = yaml.safe_load(self.path.open()) for name, spec in sorted(raw.items()): yield YamlItem.from_parent(self, name=name, spec=spec) diff --git a/src/_pytest/doctest.py b/src/_pytest/doctest.py index b8e46297a..5eaeccc47 100644 --- a/src/_pytest/doctest.py +++ b/src/_pytest/doctest.py @@ -28,7 +28,6 @@ from _pytest._code.code import ExceptionInfo from _pytest._code.code import ReprFileLocation from _pytest._code.code import TerminalRepr from _pytest._io import TerminalWriter -from _pytest.compat import LEGACY_PATH from _pytest.compat import legacy_path from _pytest.compat import safe_getattr from _pytest.config import Config @@ -122,7 +121,6 @@ def pytest_unconfigure() -> None: def pytest_collect_file( fspath: Path, - path: LEGACY_PATH, parent: Collector, ) -> Optional[Union["DoctestModule", "DoctestTextfile"]]: config = parent.config diff --git a/src/_pytest/main.py b/src/_pytest/main.py index 3e7213489..b6de7a8dd 100644 --- a/src/_pytest/main.py +++ b/src/_pytest/main.py @@ -465,7 +465,7 @@ class Session(nodes.FSCollector): def __init__(self, config: Config) -> None: super().__init__( path=config.rootpath, - fspath=config.rootdir, + fspath=None, parent=None, config=config, session=self, diff --git a/src/_pytest/pytester.py b/src/_pytest/pytester.py index df106abb3..febae0785 100644 --- a/src/_pytest/pytester.py +++ b/src/_pytest/pytester.py @@ -912,7 +912,7 @@ class Pytester: example_dir = self._request.config.getini("pytester_example_dir") if example_dir is None: raise ValueError("pytester_example_dir is unset, can't copy examples") - example_dir = Path(str(self._request.config.rootdir)) / example_dir + example_dir = self._request.config.rootpath / example_dir for extra_element in self._request.node.iter_markers("pytester_example_path"): assert extra_element.args diff --git a/src/_pytest/python.py b/src/_pytest/python.py index ccd685f54..905b40d89 100644 --- a/src/_pytest/python.py +++ b/src/_pytest/python.py @@ -210,11 +210,11 @@ def path_matches_patterns(path: Path, patterns: Iterable[str]) -> bool: return any(fnmatch_ex(pattern, path) for pattern in patterns) -def pytest_pycollect_makemodule(fspath: Path, path: LEGACY_PATH, parent) -> "Module": +def pytest_pycollect_makemodule(fspath: Path, parent) -> "Module": if fspath.name == "__init__.py": - pkg: Package = Package.from_parent(parent, fspath=path) + pkg: Package = Package.from_parent(parent, path=fspath) return pkg - mod: Module = Module.from_parent(parent, fspath=path) + mod: Module = Module.from_parent(parent, path=fspath) return mod @@ -691,7 +691,7 @@ class Package(Module): assert ( fspath.is_file() ), "{!r} is not a file (isdir={!r}, exists={!r}, islink={!r})".format( - path, fspath.is_dir(), fspath.exists(), fspath.is_symlink() + fspath, fspath.is_dir(), fspath.exists(), fspath.is_symlink() ) ihook = self.session.gethookproxy(fspath) if not self.session.isinitpath(fspath): diff --git a/testing/acceptance_test.py b/testing/acceptance_test.py index b7ec18a9c..452849f2b 100644 --- a/testing/acceptance_test.py +++ b/testing/acceptance_test.py @@ -304,9 +304,9 @@ class TestGeneralUsage: class MyCollector(pytest.File): def collect(self): return [MyItem.from_parent(name="xyz", parent=self)] - def pytest_collect_file(path, parent): - if path.basename.startswith("conftest"): - return MyCollector.from_parent(fspath=path, parent=parent) + def pytest_collect_file(fspath, parent): + if fspath.name.startswith("conftest"): + return MyCollector.from_parent(path=fspath, parent=parent) """ ) result = pytester.runpytest(c.name + "::" + "xyz") diff --git a/testing/conftest.py b/testing/conftest.py index 2dc20bcb2..63817b9ad 100644 --- a/testing/conftest.py +++ b/testing/conftest.py @@ -114,13 +114,13 @@ def dummy_yaml_custom_test(pytester: Pytester): """ import pytest - def pytest_collect_file(parent, path): - if path.ext == ".yaml" and path.basename.startswith("test"): - return YamlFile.from_parent(fspath=path, parent=parent) + def pytest_collect_file(parent, fspath): + if fspath.suffix == ".yaml" and fspath.name.startswith("test"): + return YamlFile.from_parent(path=fspath, parent=parent) class YamlFile(pytest.File): def collect(self): - yield YamlItem.from_parent(name=self.fspath.basename, parent=self) + yield YamlItem.from_parent(name=self.path.name, parent=self) class YamlItem(pytest.Item): def runtest(self): diff --git a/testing/example_scripts/collect/package_infinite_recursion/conftest.py b/testing/example_scripts/collect/package_infinite_recursion/conftest.py index 9629fa646..d9e7a89bd 100644 --- a/testing/example_scripts/collect/package_infinite_recursion/conftest.py +++ b/testing/example_scripts/collect/package_infinite_recursion/conftest.py @@ -1,2 +1,2 @@ -def pytest_ignore_collect(path): +def pytest_ignore_collect(fspath): return False diff --git a/testing/example_scripts/fixtures/custom_item/conftest.py b/testing/example_scripts/fixtures/custom_item/conftest.py index 161934b58..1b3940e95 100644 --- a/testing/example_scripts/fixtures/custom_item/conftest.py +++ b/testing/example_scripts/fixtures/custom_item/conftest.py @@ -11,5 +11,5 @@ class CustomFile(pytest.File): yield CustomItem.from_parent(name="foo", parent=self) -def pytest_collect_file(path, parent): - return CustomFile.from_parent(fspath=path, parent=parent) +def pytest_collect_file(fspath, parent): + return CustomFile.from_parent(path=fspath, parent=parent) diff --git a/testing/example_scripts/issue88_initial_file_multinodes/conftest.py b/testing/example_scripts/issue88_initial_file_multinodes/conftest.py index a053a638a..7227a53b7 100644 --- a/testing/example_scripts/issue88_initial_file_multinodes/conftest.py +++ b/testing/example_scripts/issue88_initial_file_multinodes/conftest.py @@ -6,8 +6,8 @@ class MyFile(pytest.File): return [MyItem.from_parent(name="hello", parent=self)] -def pytest_collect_file(path, parent): - return MyFile.from_parent(fspath=path, parent=parent) +def pytest_collect_file(fspath, parent): + return MyFile.from_parent(path=fspath, parent=parent) class MyItem(pytest.Item): diff --git a/testing/python/collect.py b/testing/python/collect.py index bb4c937c0..633212d95 100644 --- a/testing/python/collect.py +++ b/testing/python/collect.py @@ -778,9 +778,9 @@ class TestConftestCustomization: import pytest class MyModule(pytest.Module): pass - def pytest_pycollect_makemodule(path, parent): - if path.basename == "test_xyz.py": - return MyModule.from_parent(fspath=path, parent=parent) + def pytest_pycollect_makemodule(fspath, parent): + if fspath.name == "test_xyz.py": + return MyModule.from_parent(path=fspath, parent=parent) """ ) pytester.makepyfile("def test_some(): pass") @@ -882,9 +882,9 @@ class TestConftestCustomization: return Loader() sys.meta_path.append(Finder()) - def pytest_collect_file(path, parent): - if path.ext == ".narf": - return Module.from_parent(fspath=path, parent=parent)""" + def pytest_collect_file(fspath, parent): + if fspath.suffix == ".narf": + return Module.from_parent(path=fspath, parent=parent)""" ) pytester.makefile( ".narf", diff --git a/testing/python/fixtures.py b/testing/python/fixtures.py index 8d0dc538a..3eb4b80f3 100644 --- a/testing/python/fixtures.py +++ b/testing/python/fixtures.py @@ -3208,10 +3208,10 @@ class TestRequestScopeAccess: pytestmark = pytest.mark.parametrize( ("scope", "ok", "error"), [ - ["session", "", "fspath class function module"], - ["module", "module fspath", "cls function"], - ["class", "module fspath cls", "function"], - ["function", "module fspath cls function", ""], + ["session", "", "path class function module"], + ["module", "module path", "cls function"], + ["class", "module path cls", "function"], + ["function", "module path cls function", ""], ], ) diff --git a/testing/test_collection.py b/testing/test_collection.py index 33087fd2e..98d0e1744 100644 --- a/testing/test_collection.py +++ b/testing/test_collection.py @@ -95,9 +95,9 @@ class TestCollector: import pytest class CustomFile(pytest.File): pass - def pytest_collect_file(path, parent): - if path.ext == ".xxx": - return CustomFile.from_parent(fspath=path, parent=parent) + def pytest_collect_file(fspath, parent): + if fspath.suffix == ".xxx": + return CustomFile.from_parent(path=fspath, parent=parent) """ ) node = pytester.getpathnode(hello) @@ -271,15 +271,15 @@ class TestCollectPluginHookRelay: wascalled = [] class Plugin: - def pytest_collect_file(self, path): - if not path.basename.startswith("."): + def pytest_collect_file(self, fspath: Path) -> None: + if not fspath.name.startswith("."): # Ignore hidden files, e.g. .testmondata. - wascalled.append(path) + wascalled.append(fspath) pytester.makefile(".abc", "xyz") pytest.main(pytester.path, plugins=[Plugin()]) assert len(wascalled) == 1 - assert wascalled[0].ext == ".abc" + assert wascalled[0].suffix == ".abc" class TestPrunetraceback: @@ -292,15 +292,15 @@ class TestPrunetraceback: pytester.makeconftest( """ import pytest - def pytest_collect_file(path, parent): - return MyFile.from_parent(fspath=path, parent=parent) + def pytest_collect_file(fspath, parent): + return MyFile.from_parent(path=fspath, parent=parent) class MyError(Exception): pass class MyFile(pytest.File): def collect(self): raise MyError() def repr_failure(self, excinfo): - if excinfo.errisinstance(MyError): + if isinstance(excinfo.value, MyError): return "hello world" return pytest.File.repr_failure(self, excinfo) """ @@ -335,9 +335,8 @@ class TestCustomConftests: def test_ignore_collect_path(self, pytester: Pytester) -> None: pytester.makeconftest( """ - def pytest_ignore_collect(path, config): - return path.basename.startswith("x") or \ - path.basename == "test_one.py" + def pytest_ignore_collect(fspath, config): + return fspath.name.startswith("x") or fspath.name == "test_one.py" """ ) sub = pytester.mkdir("xy123") @@ -352,7 +351,7 @@ class TestCustomConftests: def test_ignore_collect_not_called_on_argument(self, pytester: Pytester) -> None: pytester.makeconftest( """ - def pytest_ignore_collect(path, config): + def pytest_ignore_collect(fspath, config): return True """ ) @@ -420,9 +419,9 @@ class TestCustomConftests: import pytest class MyModule(pytest.Module): pass - def pytest_collect_file(path, parent): - if path.ext == ".py": - return MyModule.from_parent(fspath=path, parent=parent) + def pytest_collect_file(fspath, parent): + if fspath.suffix == ".py": + return MyModule.from_parent(path=fspath, parent=parent) """ ) pytester.mkdir("sub") @@ -438,9 +437,9 @@ class TestCustomConftests: import pytest class MyModule1(pytest.Module): pass - def pytest_collect_file(path, parent): - if path.ext == ".py": - return MyModule1.from_parent(fspath=path, parent=parent) + def pytest_collect_file(fspath, parent): + if fspath.suffix == ".py": + return MyModule1.from_parent(path=fspath, parent=parent) """ ) conf1.replace(sub1.joinpath(conf1.name)) @@ -449,9 +448,9 @@ class TestCustomConftests: import pytest class MyModule2(pytest.Module): pass - def pytest_collect_file(path, parent): - if path.ext == ".py": - return MyModule2.from_parent(fspath=path, parent=parent) + def pytest_collect_file(fspath, parent): + if fspath.suffix == ".py": + return MyModule2.from_parent(path=fspath, parent=parent) """ ) conf2.replace(sub2.joinpath(conf2.name)) @@ -540,9 +539,9 @@ class TestSession: class SpecialFile(pytest.File): def collect(self): return [SpecialItem.from_parent(name="check", parent=self)] - def pytest_collect_file(path, parent): - if path.basename == %r: - return SpecialFile.from_parent(fspath=path, parent=parent) + def pytest_collect_file(fspath, parent): + if fspath.name == %r: + return SpecialFile.from_parent(path=fspath, parent=parent) """ % p.name ) @@ -762,13 +761,13 @@ def test_matchnodes_two_collections_same_file(pytester: Pytester) -> None: config.pluginmanager.register(Plugin2()) class Plugin2(object): - def pytest_collect_file(self, path, parent): - if path.ext == ".abc": - return MyFile2.from_parent(fspath=path, parent=parent) + def pytest_collect_file(self, fspath, parent): + if fspath.suffix == ".abc": + return MyFile2.from_parent(path=fspath, parent=parent) - def pytest_collect_file(path, parent): - if path.ext == ".abc": - return MyFile1.from_parent(fspath=path, parent=parent) + def pytest_collect_file(fspath, parent): + if fspath.suffix == ".abc": + return MyFile1.from_parent(path=fspath, parent=parent) class MyFile1(pytest.File): def collect(self): diff --git a/testing/test_conftest.py b/testing/test_conftest.py index 3497b7cc4..344c9bc51 100644 --- a/testing/test_conftest.py +++ b/testing/test_conftest.py @@ -629,7 +629,7 @@ def test_hook_proxy(pytester: Pytester) -> None: "root/demo-0/test_foo1.py": "def test1(): pass", "root/demo-a/test_foo2.py": "def test1(): pass", "root/demo-a/conftest.py": """\ - def pytest_ignore_collect(path, config): + def pytest_ignore_collect(fspath, config): return True """, "root/demo-b/test_foo3.py": "def test1(): pass", diff --git a/testing/test_junitxml.py b/testing/test_junitxml.py index 1c76351ea..139e2a9a7 100644 --- a/testing/test_junitxml.py +++ b/testing/test_junitxml.py @@ -979,9 +979,9 @@ class TestNonPython: pytester.makeconftest( """ import pytest - def pytest_collect_file(path, parent): - if path.ext == ".xyz": - return MyItem.from_parent(name=path.basename, parent=parent) + def pytest_collect_file(fspath, parent): + if fspath.suffix == ".xyz": + return MyItem.from_parent(name=fspath.name, parent=parent) class MyItem(pytest.Item): def runtest(self): raise ValueError(42) @@ -1430,9 +1430,9 @@ def test_fancy_items_regression(pytester: Pytester, run_and_parse: RunAndParse) NoFunItem.from_parent(name='b', parent=self), ] - def pytest_collect_file(path, parent): - if path.check(ext='.py'): - return FunCollector.from_parent(fspath=path, parent=parent) + def pytest_collect_file(fspath, parent): + if fspath.suffix == '.py': + return FunCollector.from_parent(path=fspath, parent=parent) """ ) diff --git a/testing/test_skipping.py b/testing/test_skipping.py index 349de6e08..bba36421a 100644 --- a/testing/test_skipping.py +++ b/testing/test_skipping.py @@ -1303,7 +1303,7 @@ def test_xfail_item(pytester: Pytester) -> None: def runtest(self): pytest.xfail("Expected Failure") - def pytest_collect_file(path, parent): + def pytest_collect_file(fspath, parent): return MyItem.from_parent(name="foo", parent=parent) """ ) @@ -1377,7 +1377,7 @@ def test_mark_xfail_item(pytester: Pytester) -> None: def runtest(self): assert False - def pytest_collect_file(path, parent): + def pytest_collect_file(fspath, parent): return MyItem.from_parent(name="foo", parent=parent) """ ) diff --git a/testing/test_terminal.py b/testing/test_terminal.py index 53bced8e6..5dc5a1cb6 100644 --- a/testing/test_terminal.py +++ b/testing/test_terminal.py @@ -1036,8 +1036,8 @@ class TestTerminalFunctional: def test_report_collectionfinish_hook(self, pytester: Pytester, params) -> None: pytester.makeconftest( """ - def pytest_report_collectionfinish(config, startpath, startdir, items): - return ['hello from hook: {0} items'.format(len(items))] + def pytest_report_collectionfinish(config, startpath, items): + return [f'hello from hook: {len(items)} items'] """ ) pytester.makepyfile( @@ -1462,7 +1462,7 @@ class TestGenericReporting: ) pytester.mkdir("a").joinpath("conftest.py").write_text( """ -def pytest_report_header(config, startdir, startpath): +def pytest_report_header(config, startpath): return ["line1", str(startpath)] """ )