From 265ffeedbd928192293c1360b1c4793890a9dfb4 Mon Sep 17 00:00:00 2001 From: Michael Goerz Date: Sat, 2 Mar 2024 06:39:51 -0500 Subject: [PATCH] [intersphinx] allow case-insensitive match of label-refs through intersphinx (#12033) --- CHANGES.rst | 2 ++ sphinx/ext/intersphinx.py | 6 ++++-- tests/test_extensions/test_ext_intersphinx.py | 10 ++++++++++ tests/test_util/test_util_inventory.py | 1 + 4 files changed, 17 insertions(+), 2 deletions(-) diff --git a/CHANGES.rst b/CHANGES.rst index 16253c72c..af56692f7 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -84,6 +84,8 @@ Bugs fixed Patch by James Addison. * #11962: Fix target resolution when using ``:paramtype:`` fields. Patch by Bénédikt Tran. +* #12008: Fix case-sensitive lookup of ``std:label`` names in intersphinx inventory. + Patch by Michael Goerz. Testing ------- diff --git a/sphinx/ext/intersphinx.py b/sphinx/ext/intersphinx.py index cf59f386e..5eb8f0759 100644 --- a/sphinx/ext/intersphinx.py +++ b/sphinx/ext/intersphinx.py @@ -334,8 +334,10 @@ def _resolve_reference_in_domain_by_target( if target in inventory[objtype]: # Case sensitive match, use it data = inventory[objtype][target] - elif objtype == 'std:term': - # Check for potential case insensitive matches for terms only + elif objtype in {'std:label', 'std:term'}: + # Some types require case insensitive matches: + # * 'term': https://github.com/sphinx-doc/sphinx/issues/9291 + # * 'label': https://github.com/sphinx-doc/sphinx/issues/12008 target_lower = target.lower() insensitive_matches = list(filter(lambda k: k.lower() == target_lower, inventory[objtype].keys())) diff --git a/tests/test_extensions/test_ext_intersphinx.py b/tests/test_extensions/test_ext_intersphinx.py index bbe08d66b..51ca7f5ed 100644 --- a/tests/test_extensions/test_ext_intersphinx.py +++ b/tests/test_extensions/test_ext_intersphinx.py @@ -236,6 +236,16 @@ def test_missing_reference_stddomain(tmp_path, app, status, warning): rn = missing_reference(app, app.env, node, contnode) assert rn.astext() == 'A TERM' + # label reference (normal) + node, contnode = fake_node('std', 'ref', 'The-Julia-Domain', 'The-Julia-Domain') + rn = missing_reference(app, app.env, node, contnode) + assert rn.astext() == 'The Julia Domain' + + # label reference (case insensitive) + node, contnode = fake_node('std', 'ref', 'the-julia-domain', 'the-julia-domain') + rn = missing_reference(app, app.env, node, contnode) + assert rn.astext() == 'The Julia Domain' + @pytest.mark.sphinx('html', testroot='ext-intersphinx-cppdomain') def test_missing_reference_cppdomain(tmp_path, app, status, warning): diff --git a/tests/test_util/test_util_inventory.py b/tests/test_util/test_util_inventory.py index c63b4e0ce..2d9b7462f 100644 --- a/tests/test_util/test_util_inventory.py +++ b/tests/test_util/test_util_inventory.py @@ -41,6 +41,7 @@ foo.bar js:class 1 index.html#foo.bar - foo.bar.baz js:method 1 index.html#foo.bar.baz - foo.bar.qux js:data 1 index.html#foo.bar.qux - a term including:colon std:term -1 glossary.html#term-a-term-including-colon - +The-Julia-Domain std:label -1 write_inventory/#$ The Julia Domain ''') inventory_v2_not_having_version = b'''\