summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTakeshi KOMIYA <i.tkomiya@gmail.com>2020-10-30 00:49:59 +0900
committerGitHub <noreply@github.com>2020-10-30 00:49:59 +0900
commit921f0979060f209542a266ea79a5664e54160033 (patch)
treec58ae52fe5e2e884e889774f3e0bb72d9f25ffdd
parent293dced4d4213d924310160a112d0907e02f8059 (diff)
parent95c861facb752daeacca09a118f48f323ffcea32 (diff)
downloadsphinx-git-921f0979060f209542a266ea79a5664e54160033.tar.gz
Merge pull request #8051 from keewis/fix-see_also
use the obj role for all See Also items
-rw-r--r--sphinx/ext/napoleon/docstring.py68
-rw-r--r--tests/test_ext_napoleon_docstring.py33
2 files changed, 74 insertions, 27 deletions
diff --git a/sphinx/ext/napoleon/docstring.py b/sphinx/ext/napoleon/docstring.py
index d36fdd17a..b5c34a479 100644
--- a/sphinx/ext/napoleon/docstring.py
+++ b/sphinx/ext/napoleon/docstring.py
@@ -1188,6 +1188,41 @@ class NumpyDocstring(GoogleDocstring):
items.append((name, list(rest), role))
del rest[:]
+ def search_inventory(inventory, name, hint=None):
+ roles = list(inventory.keys())
+ if hint is not None:
+ preferred = [
+ role
+ for role in roles
+ if role.split(":", 1)[-1].startswith(hint)
+ ]
+ roles = preferred + [role for role in roles if role not in preferred]
+
+ for role in roles:
+ objects = inventory[role]
+ found = objects.get(name, None)
+ if found is not None:
+ domain, role = role.split(":", 1)
+ return role
+
+ return None
+
+ def translate(func, description, role):
+ translations = self._config.napoleon_type_aliases
+ if role is not None or not translations:
+ return func, description, role
+
+ translated = translations.get(func, func)
+ match = self._name_rgx.match(translated)
+ if not match:
+ return translated, description, role
+
+ groups = match.groupdict()
+ role = groups["role"]
+ new_func = groups["name"] or groups["name2"]
+
+ return new_func, description, role
+
current_func = None
rest = [] # type: List[str]
@@ -1218,37 +1253,20 @@ class NumpyDocstring(GoogleDocstring):
if not items:
return []
- roles = {
- 'method': 'meth',
- 'meth': 'meth',
- 'function': 'func',
- 'func': 'func',
- 'class': 'class',
- 'exception': 'exc',
- 'exc': 'exc',
- 'object': 'obj',
- 'obj': 'obj',
- 'module': 'mod',
- 'mod': 'mod',
- 'data': 'data',
- 'constant': 'const',
- 'const': 'const',
- 'attribute': 'attr',
- 'attr': 'attr'
- }
- if self._what is None:
- func_role = 'obj'
- else:
- func_role = roles.get(self._what, '')
+ # apply type aliases
+ items = [
+ translate(func, description, role)
+ for func, description, role in items
+ ]
+
+ func_role = 'obj'
lines = [] # type: List[str]
last_had_desc = True
for func, desc, role in items:
if role:
link = ':%s:`%s`' % (role, func)
- elif func_role:
- link = ':%s:`%s`' % (func_role, func)
else:
- link = "`%s`_" % func
+ link = ':%s:`%s`' % (func_role, func)
if desc or last_had_desc:
lines += ['']
lines += [link]
diff --git a/tests/test_ext_napoleon_docstring.py b/tests/test_ext_napoleon_docstring.py
index bbc075edd..d515a5c3f 100644
--- a/tests/test_ext_napoleon_docstring.py
+++ b/tests/test_ext_napoleon_docstring.py
@@ -1455,9 +1455,38 @@ numpy.multivariate_normal(mean, cov, shape=None, spam=None)
.. seealso::
- :meth:`some`, :meth:`other`, :meth:`funcs`
+ :obj:`some`, :obj:`other`, :obj:`funcs`
+ \n\
+ :obj:`otherfunc`
+ relationship
+"""
+ self.assertEqual(expected, actual)
+
+ docstring = """\
+numpy.multivariate_normal(mean, cov, shape=None, spam=None)
+
+See Also
+--------
+some, other, :func:`funcs`
+otherfunc : relationship
+
+"""
+ translations = {
+ "other": "MyClass.other",
+ "otherfunc": ":func:`~my_package.otherfunc`",
+ }
+ config = Config(napoleon_type_aliases=translations)
+ app = mock.Mock()
+ actual = str(NumpyDocstring(docstring, config, app, "method"))
+
+ expected = """\
+numpy.multivariate_normal(mean, cov, shape=None, spam=None)
+
+.. seealso::
+
+ :obj:`some`, :obj:`MyClass.other`, :func:`funcs`
\n\
- :meth:`otherfunc`
+ :func:`~my_package.otherfunc`
relationship
"""
self.assertEqual(expected, actual)