From 65524c4d45a92aa49da5c0fb22483163165c5b25 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20L=C3=B3pez=20Barr=C3=B3n?= Date: Tue, 20 Aug 2024 13:57:02 +1000 Subject: [PATCH 1/8] Starting sphinx-7.4.0, sphinx.ext.intersphinx is a package, so check for module names prefix rather than full names MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Christian López Barrón --- hoverxref/extension.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hoverxref/extension.py b/hoverxref/extension.py index c227ecf0..b139b615 100644 --- a/hoverxref/extension.py +++ b/hoverxref/extension.py @@ -174,7 +174,7 @@ def setup_intersphinx(app, config): for listener in app.events.listeners.get('missing-reference'): module_name = inspect.getmodule(listener.handler).__name__ - if module_name == 'sphinx.ext.intersphinx': + if module_name.startswith('sphinx.ext.intersphinx'): app.disconnect(listener.id) From ee8c12682c500e42726daa6459846bb72777f188 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20L=C3=B3pez=20Barr=C3=B3n?= Date: Wed, 28 Aug 2024 22:18:31 +1000 Subject: [PATCH 2/8] Adding test for disconnecting the intersphinx listener MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Christian López Barrón --- tests/test_internals.py | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/tests/test_internals.py b/tests/test_internals.py index 509766d7..edddae7c 100644 --- a/tests/test_internals.py +++ b/tests/test_internals.py @@ -34,3 +34,26 @@ def _get_docpath(self, builder, docname): content = open(path).read() assert app.builder.format == 'latex' + + +@pytest.mark.sphinx( + srcdir=srcdir, + confoverrides={ + 'hoverxref_domains': ['py'], + 'hoverxref_intersphinx': ['python'], + 'hoverxref_auto_ref': True, + 'extensions': [ + 'sphinx.ext.intersphinx', + 'hoverxref.extension', + ], + }, +) +def test_disconnect_intersphinx_listener(app, status, warning): + """Confirm that disconnecting the ``missing-reference`` listener from ``sphinx.ext.intershinx`` is successful.""" + app.build() + listeners = [] + for listener in app.events.listeners.get('missing-reference'): + module_name = inspect.getmodule(listener.handler).__name__ + if module_name.startswith('sphinx.ext.intersphinx'): + listeners.append((module_name, listener)) + assert not listeners, f"Expected to find zero listeners but found: {listeners}" From 8e384778d60cb59eba426f3aefa49591e8f4df68 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20L=C3=B3pez=20Barr=C3=B3n?= Date: Wed, 28 Aug 2024 22:18:53 +1000 Subject: [PATCH 3/8] removing unused imports MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Christian López Barrón --- tests/test_internals.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/tests/test_internals.py b/tests/test_internals.py index edddae7c..3962d9c7 100644 --- a/tests/test_internals.py +++ b/tests/test_internals.py @@ -1,8 +1,5 @@ import inspect -import os import pytest -import shutil -from unittest import mock from .utils import srcdir From ce0d6750d539fd8588b71ae39db03f1eee5bf11c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20L=C3=B3pez=20Barr=C3=B3n?= Date: Wed, 28 Aug 2024 22:23:03 +1000 Subject: [PATCH 4/8] adding sphinx 74 to tox MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Christian López Barrón --- tox.ini | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tox.ini b/tox.ini index 938d57d1..6e37deba 100644 --- a/tox.ini +++ b/tox.ini @@ -4,7 +4,7 @@ isolated_build = True envlist = docs - py{38,39,310,312}-sphinx{50,53,60,62,70,73,latest} + py{38,39,310,312}-sphinx{50,53,60,62,70,73,74,latest} [testenv] deps = @@ -18,6 +18,7 @@ deps = sphinx62: sphinx~=6.2.0 sphinx70: sphinx~=7.0.0 sphinx73: sphinx[test]~=7.3.0 + sphinx74: sphinx[test]~=7.4.0 sphinxlatest: sphinx[test] commands = pytest {posargs} From d19ae73e16b49392388cd690b817eec3baff7d84 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20L=C3=B3pez=20Barr=C3=B3n?= Date: Thu, 29 Aug 2024 21:16:21 +1000 Subject: [PATCH 5/8] target explicit intersphinx module name depending on sphinx version MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Christian López Barrón --- hoverxref/extension.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/hoverxref/extension.py b/hoverxref/extension.py index b139b615..8ab5d5b2 100644 --- a/hoverxref/extension.py +++ b/hoverxref/extension.py @@ -8,6 +8,7 @@ from sphinx.roles import XRefRole from sphinx.util.fileutil import copy_asset from sphinx.util import logging +from packaging.version import parse, Version from . import __version__ from .domains import ( @@ -172,9 +173,14 @@ def setup_intersphinx(app, config): # does not have hoverxref intersphinx enabled return + # Sphinx-7.4.0 turned the intersphinx module into a package, so target the module according to the version. + if parse(sphinx.__version__) >= Version("7.4"): + intersphinx_module_listener_name = 'sphinx.ext.intersphinx._resolve' + else: + intersphinx_module_listener_name = 'sphinx.ext.intersphinx' for listener in app.events.listeners.get('missing-reference'): module_name = inspect.getmodule(listener.handler).__name__ - if module_name.startswith('sphinx.ext.intersphinx'): + if module_name == intersphinx_module_listener_name: app.disconnect(listener.id) From a242bbf86fbc3bd7a39f65bf189cf8ff9b9b3258 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20L=C3=B3pez=20Barr=C3=B3n?= Date: Thu, 29 Aug 2024 21:17:43 +1000 Subject: [PATCH 6/8] check for explicit event listeners presence for missing-reference MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Christian López Barrón --- tests/test_internals.py | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/tests/test_internals.py b/tests/test_internals.py index 3962d9c7..bc0e6586 100644 --- a/tests/test_internals.py +++ b/tests/test_internals.py @@ -1,5 +1,10 @@ import inspect import pytest +from unittest import mock + +from sphinx.events import EventListener +from sphinx.ext.intersphinx._resolve import missing_reference as intersphinx_missing_reference +from hoverxref.extension import missing_reference from .utils import srcdir @@ -46,11 +51,8 @@ def _get_docpath(self, builder, docname): }, ) def test_disconnect_intersphinx_listener(app, status, warning): - """Confirm that disconnecting the ``missing-reference`` listener from ``sphinx.ext.intershinx`` is successful.""" + """The ``missing-reference`` listener from ``sphinx.ext.intershinx`` should be dropped in favor of ours.""" app.build() - listeners = [] - for listener in app.events.listeners.get('missing-reference'): - module_name = inspect.getmodule(listener.handler).__name__ - if module_name.startswith('sphinx.ext.intersphinx'): - listeners.append((module_name, listener)) - assert not listeners, f"Expected to find zero listeners but found: {listeners}" + missing_reference_listeners = app.events.listeners['missing-reference'] + assert EventListener(id=mock.ANY, priority=mock.ANY, handler=intersphinx_missing_reference) not in missing_reference_listeners + assert EventListener(id=mock.ANY, priority=mock.ANY, handler=missing_reference) in missing_reference_listeners From 79e07e33091b83b0cf59ff53354afe89a75c1f02 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20L=C3=B3pez=20Barr=C3=B3n?= Date: Thu, 29 Aug 2024 21:32:38 +1000 Subject: [PATCH 7/8] check handler against sphinx_missing_reference explicitly MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Christian López Barrón --- hoverxref/extension.py | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/hoverxref/extension.py b/hoverxref/extension.py index 8ab5d5b2..74d80edb 100644 --- a/hoverxref/extension.py +++ b/hoverxref/extension.py @@ -8,7 +8,6 @@ from sphinx.roles import XRefRole from sphinx.util.fileutil import copy_asset from sphinx.util import logging -from packaging.version import parse, Version from . import __version__ from .domains import ( @@ -173,14 +172,8 @@ def setup_intersphinx(app, config): # does not have hoverxref intersphinx enabled return - # Sphinx-7.4.0 turned the intersphinx module into a package, so target the module according to the version. - if parse(sphinx.__version__) >= Version("7.4"): - intersphinx_module_listener_name = 'sphinx.ext.intersphinx._resolve' - else: - intersphinx_module_listener_name = 'sphinx.ext.intersphinx' for listener in app.events.listeners.get('missing-reference'): - module_name = inspect.getmodule(listener.handler).__name__ - if module_name == intersphinx_module_listener_name: + if listener.handler == sphinx_missing_reference: app.disconnect(listener.id) From c6eb8af24259047ef8d2d133c1ad16ee4ee14a08 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20L=C3=B3pez=20Barr=C3=B3n?= Date: Thu, 29 Aug 2024 21:33:10 +1000 Subject: [PATCH 8/8] sphinx.ext.intersphinx.missing_reference continues to be public API in 7.4+ MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Christian López Barrón --- tests/test_internals.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/tests/test_internals.py b/tests/test_internals.py index bc0e6586..2d4e57ce 100644 --- a/tests/test_internals.py +++ b/tests/test_internals.py @@ -1,9 +1,8 @@ -import inspect import pytest from unittest import mock from sphinx.events import EventListener -from sphinx.ext.intersphinx._resolve import missing_reference as intersphinx_missing_reference +from sphinx.ext.intersphinx import missing_reference as intersphinx_missing_reference from hoverxref.extension import missing_reference from .utils import srcdir