From 4428393403ad98e49459e36085c7f0a85a627bab Mon Sep 17 00:00:00 2001 From: Keewis Date: Thu, 6 Aug 2020 14:08:34 +0200 Subject: [PATCH] translate the functions before attempting to find a matching role --- sphinx/ext/napoleon/docstring.py | 22 +++++++++++++++++++ tests/test_ext_napoleon_docstring.py | 32 ++++++++++++++++++++++++++++ 2 files changed, 54 insertions(+) diff --git a/sphinx/ext/napoleon/docstring.py b/sphinx/ext/napoleon/docstring.py index 13a32cff8..d60deff6c 100644 --- a/sphinx/ext/napoleon/docstring.py +++ b/sphinx/ext/napoleon/docstring.py @@ -1175,6 +1175,22 @@ class NumpyDocstring(GoogleDocstring): 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] @@ -1205,6 +1221,12 @@ class NumpyDocstring(GoogleDocstring): if not items: return [] + # apply type aliases + items = [ + translate(func, description, role) + for func, description, role in items + ] + roles = { 'method': 'meth', 'meth': 'meth', diff --git a/tests/test_ext_napoleon_docstring.py b/tests/test_ext_napoleon_docstring.py index 0894a9bff..57bdf1342 100644 --- a/tests/test_ext_napoleon_docstring.py +++ b/tests/test_ext_napoleon_docstring.py @@ -1400,6 +1400,38 @@ numpy.multivariate_normal(mean, cov, shape=None, spam=None) """ 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() + app.builder.env.intersphinx_inventory = { + "py:func": {"funcs": (), "otherfunc": ()}, + "py:meth": {"some": (), "MyClass.other": ()}, + } + actual = str(NumpyDocstring(docstring, config, app, "method")) + + expected = """\ +numpy.multivariate_normal(mean, cov, shape=None, spam=None) + +.. seealso:: + + :meth:`some`, :meth:`MyClass.other`, :func:`funcs` + \n\ + :func:`~my_package.otherfunc` + relationship +""" + self.assertEqual(expected, actual) def test_colon_in_return_type(self): docstring = """