diff --git a/numpydoc/numpydoc.py b/numpydoc/numpydoc.py index 5b8faa94..58679da5 100644 --- a/numpydoc/numpydoc.py +++ b/numpydoc/numpydoc.py @@ -18,6 +18,7 @@ """ from __future__ import division, absolute_import, print_function +from copy import deepcopy import sys import re import pydoc @@ -160,7 +161,7 @@ def mangle_docstrings(app, what, name, obj, options, lines): 'attributes_as_param_list': app.config.numpydoc_attributes_as_param_list, 'xref_param_type': app.config.numpydoc_xref_param_type, - 'xref_aliases': app.config.numpydoc_xref_aliases, + 'xref_aliases': app.config.numpydoc_xref_aliases_complete, 'xref_ignore': app.config.numpydoc_xref_ignore, } @@ -258,9 +259,15 @@ def setup(app, get_doc_object_=get_doc_object): def update_config(app): """Update the configuration with default values.""" + # Do not simply overwrite the `app.config.numpydoc_xref_aliases` + # otherwise the next sphinx-build will compare the incoming values (without + # our additions) to the old values (with our additions) and trigger + # a full rebuild! + numpydoc_xref_aliases_complete = deepcopy(app.config.numpydoc_xref_aliases) for key, value in DEFAULT_LINKS.items(): - if key not in app.config.numpydoc_xref_aliases: - app.config.numpydoc_xref_aliases[key] = value + if key not in numpydoc_xref_aliases_complete: + numpydoc_xref_aliases_complete[key] = value + app.config.numpydoc_xref_aliases_complete = numpydoc_xref_aliases_complete # ------------------------------------------------------------------------------ diff --git a/numpydoc/tests/test_docscrape.py b/numpydoc/tests/test_docscrape.py index c2381f8b..83659c0e 100644 --- a/numpydoc/tests/test_docscrape.py +++ b/numpydoc/tests/test_docscrape.py @@ -2,6 +2,7 @@ from __future__ import division, absolute_import, print_function from collections import namedtuple +from copy import deepcopy import re import sys import textwrap @@ -10,6 +11,7 @@ import jinja2 from numpydoc.numpydoc import update_config +from numpydoc.xref import DEFAULT_LINKS from numpydoc.docscrape import ( NumpyDocString, FunctionDoc, @@ -1485,8 +1487,16 @@ def test_xref(): xref_aliases = { 'sequence': ':obj:`python:sequence`', } - config = namedtuple('numpydoc_xref_aliases', - 'numpydoc_xref_aliases')(xref_aliases) + + class Config(): + def __init__(self, a, b): + self.numpydoc_xref_aliases = a + self.numpydoc_xref_aliases_complete = b + + xref_aliases_complete = deepcopy(DEFAULT_LINKS) + for key in xref_aliases: + xref_aliases_complete[key] = xref_aliases[key] + config = Config(xref_aliases, xref_aliases_complete) app = namedtuple('config', 'config')(config) update_config(app) @@ -1496,7 +1506,7 @@ def test_xref(): xref_doc_txt, config=dict( xref_param_type=True, - xref_aliases=xref_aliases, + xref_aliases=xref_aliases_complete, xref_ignore=xref_ignore ) ) diff --git a/numpydoc/tests/test_numpydoc.py b/numpydoc/tests/test_numpydoc.py index 635a271d..146e44c6 100644 --- a/numpydoc/tests/test_numpydoc.py +++ b/numpydoc/tests/test_numpydoc.py @@ -1,9 +1,12 @@ # -*- encoding:utf-8 -*- from __future__ import division, absolute_import, print_function +from copy import deepcopy from numpydoc.numpydoc import mangle_docstrings +from numpydoc.xref import DEFAULT_LINKS from sphinx.ext.autodoc import ALL + class MockConfig(): numpydoc_use_plots = False numpydoc_use_blockquotes = True @@ -12,15 +15,18 @@ class MockConfig(): numpydoc_class_members_toctree = True numpydoc_xref_param_type = False numpydoc_xref_aliases = {} + numpydoc_xref_aliases_complete = deepcopy(DEFAULT_LINKS) numpydoc_xref_ignore = set() templates_path = [] numpydoc_edit_link = False numpydoc_citation_re = '[a-z0-9_.-]+' numpydoc_attributes_as_param_list = True + class MockBuilder(): config = MockConfig() + class MockApp(): config = MockConfig() builder = MockBuilder() @@ -30,6 +36,7 @@ class MockApp(): app = MockApp() app.builder.app = app + def test_mangle_docstrings(): s =''' A top section before @@ -56,5 +63,6 @@ def test_mangle_docstrings(): assert 'rpartition' in [x.strip() for x in lines] assert 'upper' not in [x.strip() for x in lines] + if __name__ == "__main__": import pytest