Skip to content

Commit 557e1f5

Browse files
committed
Refactor to check configured and ignored in one place
Configuration is defined once at config-inited event and ignored references in only one method in the HoverXRefBaseDomain class.
1 parent 5b7755e commit 557e1f5

File tree

2 files changed

+74
-50
lines changed

2 files changed

+74
-50
lines changed

hoverxref/domains.py

Lines changed: 51 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,6 @@
66

77
class HoverXRefBaseDomain:
88

9-
def _is_hoverxref_configured(self, env):
10-
project = env.config.hoverxref_project
11-
version = env.config.hoverxref_version
12-
return project and version
13-
149
def _inject_hoverxref_data(self, env, refnode, docname, labelid):
1510
refnode.replace_attr('classes', ['hoverxref'])
1611

@@ -23,19 +18,27 @@ def _inject_hoverxref_data(self, env, refnode, docname, labelid):
2318
'data-section': labelid,
2419
}
2520

21+
def _is_ignored_ref(self, env, target):
22+
if target in env.config.hoverxref_ignore_refs:
23+
logger.info(
24+
'Ignoring reference in hoverxref_ignore_refs. target=%s',
25+
target,
26+
)
27+
return True
28+
return False
29+
2630

2731
class HoverXRefPythonDomainMixin(HoverXRefBaseDomain):
2832

2933
def resolve_xref(self, env, fromdocname, builder, type, target, node, contnode):
3034
refnode = super().resolve_xref(env, fromdocname, builder, type, target, node, contnode)
3135
if refnode is None:
32-
return
36+
return refnode
3337

34-
if target in env.config.hoverxref_ignore_refs:
35-
logger.info(
36-
'Ignoring reference in hoverxref_ignore_refs. target=%s',
37-
target,
38-
)
38+
if any([
39+
not env.config.hoverxref_is_configured,
40+
self._is_ignored_ref(env, target),
41+
]):
3942
return refnode
4043

4144
modname = node.get('py:module')
@@ -45,14 +48,13 @@ def resolve_xref(self, env, fromdocname, builder, type, target, node, contnode):
4548
type, searchmode)
4649
name, obj = matches[0]
4750

48-
if self._is_hoverxref_configured(env):
49-
docname, labelid = obj[0], name
50-
self._inject_hoverxref_data(env, refnode, docname, labelid)
51-
logger.info(
52-
':ref: _hoverxref injected: fromdocname=%s %s',
53-
fromdocname,
54-
refnode._hoverxref,
55-
)
51+
docname, labelid = obj[0], name
52+
self._inject_hoverxref_data(env, refnode, docname, labelid)
53+
logger.info(
54+
':ref: _hoverxref injected: fromdocname=%s %s',
55+
fromdocname,
56+
refnode._hoverxref,
57+
)
5658
return refnode
5759

5860

@@ -79,43 +81,42 @@ def resolve_xref(self, env, fromdocname, builder, typ, target, node, contnode):
7981
def _resolve_ref_xref(self, env, fromdocname, builder, typ, target, node, contnode):
8082
refnode = super()._resolve_ref_xref(env, fromdocname, builder, typ, target, node, contnode)
8183
if refnode is None:
82-
return
83-
84-
if target in env.config.hoverxref_ignore_refs:
85-
logger.info(
86-
'Ignoring reference in hoverxref_ignore_refs. target=%s',
87-
target,
88-
)
8984
return refnode
9085

91-
if not self._is_hoverxref_configured(env) and typ == 'hoverxref':
92-
# Using ``:hoverxref:`` role without having hoverxref configured
93-
# properly. Log a warning.
94-
logger.warning('hoverxref role is not fully configured.')
86+
if any([
87+
not env.config.hoverxref_is_configured,
88+
self._is_ignored_ref(env, target),
89+
not (env.config.hoverxref_auto_ref or typ == 'hoverxref')
90+
]):
91+
return refnode
9592

96-
if self._is_hoverxref_configured(env) and (env.config.hoverxref_auto_ref or typ == 'hoverxref'):
97-
docname, labelid, _ = get_ref_xref_data(self, node, target)
98-
self._inject_hoverxref_data(env, refnode, docname, labelid)
99-
logger.info(
100-
':ref: _hoverxref injected: fromdocname=%s %s',
101-
fromdocname,
102-
refnode._hoverxref,
103-
)
93+
docname, labelid, _ = get_ref_xref_data(self, node, target)
94+
self._inject_hoverxref_data(env, refnode, docname, labelid)
95+
logger.info(
96+
':ref: _hoverxref injected: fromdocname=%s %s',
97+
fromdocname,
98+
refnode._hoverxref,
99+
)
104100
return refnode
105101

106102
def _resolve_obj_xref(self, env, fromdocname, builder, typ, target, node, contnode):
107103
refnode = super()._resolve_obj_xref(env, fromdocname, builder, typ, target, node, contnode)
108104
if refnode is None:
109-
return
110-
111-
if typ in env.config.hoverxref_roles:
112-
docname, labelid = get_ref_obj_data(self, node, typ, target)
113-
if self._is_hoverxref_configured(env):
114-
self._inject_hoverxref_data(env, refnode, docname, labelid)
115-
logger.info(
116-
':%s: _hoverxref injected: fromdocname=%s %s',
117-
typ,
118-
fromdocname,
119-
refnode._hoverxref,
120-
)
105+
return refnode
106+
107+
if any([
108+
not env.config.hoverxref_is_configured,
109+
self._is_ignored_ref(env, target),
110+
typ not in env.config.hoverxref_roles,
111+
]):
112+
return refnode
113+
114+
docname, labelid = get_ref_obj_data(self, node, typ, target)
115+
self._inject_hoverxref_data(env, refnode, docname, labelid)
116+
logger.info(
117+
':%s: _hoverxref injected: fromdocname=%s %s',
118+
typ,
119+
fromdocname,
120+
refnode._hoverxref,
121+
)
121122
return refnode

hoverxref/extension.py

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
from docutils import nodes
55
import sphinx
66
from sphinx.roles import XRefRole
7+
from sphinx.util import logging
78
from sphinx.util.fileutil import copy_asset
89

910
from . import version
@@ -24,6 +25,8 @@
2425
'css/tooltipster-sideTip-borderless.min.css',
2526
]
2627

28+
logger = logging.getLogger(__name__)
29+
2730

2831
def copy_asset_files(app, exception):
2932
"""
@@ -150,6 +153,25 @@ def setup_translators(app):
150153
app.set_translator(name, translator, override=True)
151154

152155

156+
def is_hoverxref_configured(app, config):
157+
"""
158+
Save a config if hoverxref is properly configured.
159+
160+
It checks for ``hoverxref_project`` and ``hoverxref_version`` being defined
161+
and set ``hoverxref_is_configured=True`` if configured.
162+
"""
163+
config.hoverxref_is_configured = True
164+
165+
project = config.hoverxref_project
166+
version = config.hoverxref_version
167+
if not project or not version:
168+
config.hoverxref_is_configured = False
169+
# ``hoverxref`` extension is not fully configured
170+
logger.warning(
171+
'hoverxref extension is not fully configured. '
172+
'Set hoverxref_project and hoverxref_version in your conf.py file.',
173+
)
174+
153175

154176
def setup(app):
155177
"""Setup ``hoverxref`` Sphinx extension."""
@@ -181,6 +203,7 @@ def setup(app):
181203
app.connect('builder-inited', setup_translators)
182204
app.connect('config-inited', setup_domains)
183205
app.connect('config-inited', setup_sphinx_tabs)
206+
app.connect('config-inited', is_hoverxref_configured)
184207
app.connect('build-finished', copy_asset_files)
185208

186209
for f in ASSETS_FILES:

0 commit comments

Comments
 (0)