From d4f529e0ded5866f9c304eae3bef42f66a1c609c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dion=20H=C3=A4fner?= Date: Thu, 19 Feb 2026 12:33:38 +0100 Subject: [PATCH 1/2] always import from sphinx.ext.autodoc.mock module instead of relying on implicit import resolution --- sphinx_click/ext.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sphinx_click/ext.py b/sphinx_click/ext.py index 92b15ff..2f0874a 100644 --- a/sphinx_click/ext.py +++ b/sphinx_click/ext.py @@ -18,7 +18,7 @@ from sphinx import application from sphinx.util import logging from sphinx.util import nodes as sphinx_nodes -from sphinx.ext.autodoc import mock +from sphinx.ext.autodoc.mock import mock LOG = logging.getLogger(__name__) From 82fed753df074bb956e87b75abec027f177852ed Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dion=20H=C3=A4fner?= Date: Thu, 19 Feb 2026 13:05:06 +0100 Subject: [PATCH 2/2] add regression test --- tests/test_extension.py | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/tests/test_extension.py b/tests/test_extension.py index 1377e31..b23782b 100644 --- a/tests/test_extension.py +++ b/tests/test_extension.py @@ -4,6 +4,27 @@ from sphinx import addnodes as sphinx_nodes +def test_mock_import_compatibility(): + """Test that sphinx_click.ext.mock is callable after sphinx.ext.autodoc.mock is imported. + + Regression test for https://github.com/click-contrib/sphinx-click/issues/159 + + When sphinx_autodoc_typehints imports `from sphinx.ext.autodoc.mock import mock`, + it causes Python to bind the submodule as an attribute on sphinx.ext.autodoc, + which can shadow the re-exported mock function. sphinx_click must import mock + directly from the submodule to avoid this issue. + """ + # Simulate sphinx_autodoc_typehints being loaded first + from sphinx.ext.autodoc.mock import mock # noqa: F401 + + # Now import sphinx_click (as would happen during Sphinx extension loading) + import sphinx_click.ext + + # Verify the mock function is callable + with sphinx_click.ext.mock([]): + pass + + def test_basics(make_app, rootdir): srcdir = rootdir / 'basics' app = make_app('xml', srcdir=srcdir)