Skip to content

Commit 7b37b0a

Browse files
committed
pkg(sphinx-autodoc-pytest-fixtures[feat]): gate auto-pytest-plugin fixture-index behind :fixture-index: flag
why: ``auto-pytest-plugin`` always emitted a "Fixture Summary" rubric + :class:\`autofixture_index_node\` placeholder before the "Fixture Reference" detail blocks. For pytest plugin pages where the detail blocks already render every fixture's name, scope, return type, and description, the summary table is duplicative — Furo's ToC sidebar already enumerates each ``:fixture:`` anchor by name. what: - Add ``:fixture-index:`` flag option to ``AutoPytestPluginDirective``. Default unset → no summary. Pass ``:fixture-index:`` to opt back in for dense plugin pages that genuinely benefit from a scan-all view. - ``_build_doc_pytest_plugin_fixture_section_scaffold(modname, include_index=False)`` is the new pure helper signature; the fixture-summary rubric and placeholder render only when ``include_index`` is ``True``. - ``_build_fixture_section_nodes`` forwards the flag. - Existing ``test_..._scaffold_sets_module`` and ``test_..._scaffold_contains_index_node`` updated to pass ``include_index=True`` (preserving their original assertions). - New ``test_..._scaffold_defaults_to_no_summary`` covers the default off path. - Two integration scenarios in ``test_sphinx_pytest_fixtures_doctree.py`` (``myst_smoke_result`` fixture + ``test_doc_pytest_plugin_rst_snapshot``) exercise the summary path explicitly — now pass ``:fixture-index:`` so they continue to assert "Fixture Summary" appears in the output.
1 parent e917027 commit 7b37b0a

3 files changed

Lines changed: 74 additions & 14 deletions

File tree

packages/sphinx-autodoc-pytest-fixtures/src/sphinx_autodoc_pytest_fixtures/_directives.py

Lines changed: 48 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -218,16 +218,33 @@ def _build_doc_pytest_plugin_intro_nodes(
218218

219219
def _build_doc_pytest_plugin_fixture_section_scaffold(
220220
modname: str,
221+
*,
222+
include_index: bool = False,
221223
) -> list[nodes.Node]:
222-
"""Return the generated fixture-section scaffold nodes."""
223-
idx_node = autofixture_index_node()
224-
idx_node["module"] = modname
225-
idx_node["exclude"] = set()
226-
return [
227-
nodes.rubric("", "Fixture Summary"),
228-
idx_node,
229-
nodes.rubric("", "Fixture Reference"),
230-
]
224+
"""Return the generated fixture-section scaffold nodes.
225+
226+
Parameters
227+
----------
228+
modname : str
229+
Module the fixture-index placeholder targets.
230+
include_index : bool, optional
231+
When ``True``, prefix the section with a "Fixture Summary" rubric
232+
and an :class:`autofixture_index_node` placeholder before the
233+
"Fixture Reference" detail block. Defaults to ``False`` because
234+
Furo's ToC sidebar already enumerates each ``:fixture:`` anchor
235+
— the summary table only adds value on dense plugin pages where
236+
a scan-all-options view is desired. Toggle on via the
237+
``:fixture-index:`` flag on ``auto-pytest-plugin``.
238+
"""
239+
section_nodes: list[nodes.Node] = []
240+
if include_index:
241+
idx_node = autofixture_index_node()
242+
idx_node["module"] = modname
243+
idx_node["exclude"] = set()
244+
section_nodes.append(nodes.rubric("", "Fixture Summary"))
245+
section_nodes.append(idx_node)
246+
section_nodes.append(nodes.rubric("", "Fixture Reference"))
247+
return section_nodes
231248

232249

233250
def _compose_doc_pytest_plugin_nodes(
@@ -763,6 +780,7 @@ class AutoPytestPluginDirective(SphinxDirective):
763780
"summary": directives.unchanged,
764781
"tests-url": directives.unchanged,
765782
"install-command": directives.unchanged,
783+
"fixture-index": directives.flag,
766784
}
767785

768786
def run(self) -> list[nodes.Node]:
@@ -795,6 +813,7 @@ def run(self) -> list[nodes.Node]:
795813
fixture_section_nodes = self._build_fixture_section_nodes(
796814
modname=modname,
797815
entries=entries,
816+
include_index="fixture-index" in self.options,
798817
)
799818

800819
return _compose_doc_pytest_plugin_nodes(
@@ -859,10 +878,28 @@ def _build_fixture_section_nodes(
859878
*,
860879
modname: str,
861880
entries: list[tuple[str, str, t.Any]],
881+
include_index: bool = False,
862882
) -> list[nodes.Node]:
863-
"""Build generated fixture summary/reference nodes."""
883+
"""Build generated fixture summary/reference nodes.
884+
885+
Parameters
886+
----------
887+
modname : str
888+
Module containing the fixtures.
889+
entries : list[tuple[str, str, Any]]
890+
Discovered ``(public_name, attribute_name, fixture_fn)`` tuples.
891+
include_index : bool, optional
892+
Forwarded to
893+
:func:`_build_doc_pytest_plugin_fixture_section_scaffold` —
894+
controls whether the ``Fixture Summary`` rubric and
895+
:class:`autofixture_index_node` placeholder render before the
896+
detail blocks. Defaults to ``False``.
897+
"""
864898
return [
865-
*_build_doc_pytest_plugin_fixture_section_scaffold(modname),
899+
*_build_doc_pytest_plugin_fixture_section_scaffold(
900+
modname,
901+
include_index=include_index,
902+
),
866903
*_render_autofixtures_nodes(
867904
self,
868905
modname=modname,

tests/ext/pytest_fixtures/test_sphinx_pytest_fixtures.py

Lines changed: 24 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -172,9 +172,10 @@ def test_build_doc_pytest_plugin_intro_nodes_include_install_and_link() -> None:
172172

173173

174174
def test_build_doc_pytest_plugin_fixture_section_scaffold_sets_module() -> None:
175-
"""Fixture-section scaffold carries the target module on the placeholder."""
175+
"""``include_index=True`` adds a Fixture Summary rubric + index placeholder."""
176176
scaffold = spf_directives._build_doc_pytest_plugin_fixture_section_scaffold(
177177
"fixture_mod",
178+
include_index=True,
178179
)
179180

180181
assert [type(node) for node in scaffold] == [
@@ -188,6 +189,21 @@ def test_build_doc_pytest_plugin_fixture_section_scaffold_sets_module() -> None:
188189
assert scaffold[2].astext() == "Fixture Reference"
189190

190191

192+
def test_build_doc_pytest_plugin_fixture_section_scaffold_defaults_to_no_summary() -> (
193+
None
194+
):
195+
"""Default ``include_index=False`` emits only the Fixture Reference rubric."""
196+
scaffold = spf_directives._build_doc_pytest_plugin_fixture_section_scaffold(
197+
"fixture_mod",
198+
)
199+
200+
assert [type(node) for node in scaffold] == [nodes.rubric]
201+
assert scaffold[0].astext() == "Fixture Reference"
202+
assert not any(
203+
isinstance(node, spf_directives.autofixture_index_node) for node in scaffold
204+
)
205+
206+
191207
def test_compose_doc_pytest_plugin_nodes_preserves_display_order() -> None:
192208
"""Intro, authored body, and fixture section nodes stay in display order."""
193209
intro_nodes = [nodes.paragraph("", "intro")]
@@ -1369,9 +1385,10 @@ def test_build_doc_pytest_plugin_intro_nodes_uses_generic_test_suite_text() -> N
13691385

13701386

13711387
def test_build_doc_pytest_plugin_fixture_section_scaffold_contains_index_node() -> None:
1372-
"""Fixture section scaffold is testable without parsing nested directives."""
1388+
"""``include_index=True`` produces both rubrics + the index placeholder."""
13731389
section_nodes = spf_directives._build_doc_pytest_plugin_fixture_section_scaffold(
1374-
"fixture_mod"
1390+
"fixture_mod",
1391+
include_index=True,
13751392
)
13761393

13771394
assert [
@@ -1380,6 +1397,10 @@ def test_build_doc_pytest_plugin_fixture_section_scaffold_contains_index_node()
13801397
"Fixture Summary",
13811398
"Fixture Reference",
13821399
]
1400+
assert isinstance(
1401+
section_nodes[1],
1402+
spf_directives.autofixture_index_node,
1403+
)
13831404
assert isinstance(
13841405
section_nodes[1],
13851406
sphinx_autodoc_pytest_fixtures.autofixture_index_node,

tests/ext/pytest_fixtures/test_sphinx_pytest_fixtures_doctree.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -171,6 +171,7 @@ def myst_smoke_result(spf_doctree_root: pathlib.Path) -> SharedSphinxResult:
171171
:package: fixture-demo
172172
:summary: fixture-demo ships a pytest plugin for local test setup.
173173
:tests-url: https://example.com/fixture-demo/tests
174+
:fixture-index:
174175
175176
## Recommended fixtures
176177
@@ -588,6 +589,7 @@ def test_doc_pytest_plugin_rst_snapshot(
588589
:summary: fixture-demo ships a pytest plugin for local test setup.
589590
:tests-url: https://example.com/fixture-demo/tests
590591
:install-command: uv add --dev fixture-demo
592+
:fixture-index:
591593
592594
Use the plugin when you want isolated test resources with minimal
593595
conftest boilerplate.

0 commit comments

Comments
 (0)