Change Node.reportinfo() return value from py.path to str|os.PathLike[str]
`reportinfo()` is the last remaining py.path-only code path in pytest, i.e. the last piece holding back py.path deprecation. The problem with it is that plugins/users use it from both sides -- implementing it (returning the value) and using it (using the return value). Dealing with implementers is easy enough -- allow to return `os.PathLike[str]`. But for callers who expect strictly `py.path` this will break and there's not really a good way to provide backward compat for this. From analyzing a corpus of 680 pytest plugins, the vast majority of `reportinfo` appearances are implementations, and the few callers don't actually access the path part of the return tuple. As for test suites that might access `reportinfo` (e.g. using `request.node.reportinfo()` or other ways), that is much harder to survey, but from the ones I searched, I only found case (`pytest_teamcity`, but even then it uses `str(fspath)` so is unlikely to be affected in practice). They are better served with using `node.location` or `node.path` directly. Therefore, just break it and change the return type to `str|os.PathLike[str]`. Refs #7259.
This commit is contained in:
@@ -1154,8 +1154,8 @@ class TestReportInfo:
|
||||
|
||||
def test_func_reportinfo(self, pytester: Pytester) -> None:
|
||||
item = pytester.getitem("def test_func(): pass")
|
||||
fspath, lineno, modpath = item.reportinfo()
|
||||
assert str(fspath) == str(item.path)
|
||||
path, lineno, modpath = item.reportinfo()
|
||||
assert os.fspath(path) == str(item.path)
|
||||
assert lineno == 0
|
||||
assert modpath == "test_func"
|
||||
|
||||
@@ -1169,8 +1169,8 @@ class TestReportInfo:
|
||||
)
|
||||
classcol = pytester.collect_by_name(modcol, "TestClass")
|
||||
assert isinstance(classcol, Class)
|
||||
fspath, lineno, msg = classcol.reportinfo()
|
||||
assert str(fspath) == str(modcol.path)
|
||||
path, lineno, msg = classcol.reportinfo()
|
||||
assert os.fspath(path) == str(modcol.path)
|
||||
assert lineno == 1
|
||||
assert msg == "TestClass"
|
||||
|
||||
@@ -1194,7 +1194,7 @@ class TestReportInfo:
|
||||
assert isinstance(classcol, Class)
|
||||
instance = list(classcol.collect())[0]
|
||||
assert isinstance(instance, Instance)
|
||||
fspath, lineno, msg = instance.reportinfo()
|
||||
path, lineno, msg = instance.reportinfo()
|
||||
|
||||
|
||||
def test_customized_python_discovery(pytester: Pytester) -> None:
|
||||
|
||||
@@ -19,7 +19,7 @@ class TestOEJSKITSpecials:
|
||||
return MyCollector.from_parent(collector, name=name)
|
||||
class MyCollector(pytest.Collector):
|
||||
def reportinfo(self):
|
||||
return self.fspath, 3, "xyz"
|
||||
return self.path, 3, "xyz"
|
||||
"""
|
||||
)
|
||||
modcol = pytester.getmodulecol(
|
||||
@@ -52,7 +52,7 @@ class TestOEJSKITSpecials:
|
||||
return MyCollector.from_parent(collector, name=name)
|
||||
class MyCollector(pytest.Collector):
|
||||
def reportinfo(self):
|
||||
return self.fspath, 3, "xyz"
|
||||
return self.path, 3, "xyz"
|
||||
"""
|
||||
)
|
||||
modcol = pytester.getmodulecol(
|
||||
|
||||
Reference in New Issue
Block a user