Skip to content

Commit

Permalink
Allow Class.from_parent to forward custom parameters to the constructor
Browse files Browse the repository at this point in the history
Similarly to pytest-dev#7143, at work we have a project with a custom pytest.Class
subclass, adding an additional argument to the constructor.

All from_parent implementations in pytest accept and forward *kw, except
Class (before this change) and DoctestItem - since I'm not familiar with
doctest support, I've left the latter as-is.
  • Loading branch information
The-Compiler committed Feb 23, 2021
1 parent d6522b5 commit 54a154c
Show file tree
Hide file tree
Showing 3 changed files with 21 additions and 2 deletions.
1 change: 1 addition & 0 deletions changelog/8367.bugfix.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Fix ``Class.from_parent`` so it forwards extra keyword arguments to the constructor.
4 changes: 2 additions & 2 deletions src/_pytest/python.py
Original file line number Diff line number Diff line change
Expand Up @@ -763,9 +763,9 @@ class Class(PyCollector):
"""Collector for test methods."""

@classmethod
def from_parent(cls, parent, *, name, obj=None):
def from_parent(cls, parent, *, name, obj=None, **kw):
"""The public constructor."""
return super().from_parent(name=name, parent=parent)
return super().from_parent(name=name, parent=parent, **kw)

def collect(self) -> Iterable[Union[nodes.Item, nodes.Collector]]:
if not safe_getattr(self.obj, "__test__", True):
Expand Down
18 changes: 18 additions & 0 deletions testing/test_collection.py
Original file line number Diff line number Diff line change
Expand Up @@ -1360,6 +1360,24 @@ def from_parent(cls, parent, *, fspath, x):
assert collector.x == 10


def test_class_from_parent(pytester: Pytester, request: FixtureRequest) -> None:
"""Ensure Class.from_parent can forward custom arguments to the constructor."""

class MyCollector(pytest.Class):
def __init__(self, name, parent, x):
super().__init__(name, parent)
self.x = x

@classmethod
def from_parent(cls, parent, *, name, x):
return super().from_parent(parent=parent, name=name, x=x)

collector = MyCollector.from_parent(
parent=request.session, name="foo", x=10
)
assert collector.x == 10


class TestImportModeImportlib:
def test_collect_duplicate_names(self, pytester: Pytester) -> None:
"""--import-mode=importlib can import modules with same names that are not in packages."""
Expand Down

0 comments on commit 54a154c

Please sign in to comment.