fixup test suite for already-registered warnings

This commit is contained in:
Georg Brandl
2015-07-22 19:29:22 +02:00
parent 277f8d3ec3
commit 1d7db8da46
4 changed files with 34 additions and 18 deletions

View File

@@ -78,7 +78,7 @@ class Sphinx(object):
self._extensions = {} self._extensions = {}
self._extension_metadata = {} self._extension_metadata = {}
self._listeners = {} self._listeners = {}
self._setting_up_extension = '?' self._setting_up_extension = ['?']
self.domains = BUILTIN_DOMAINS.copy() self.domains = BUILTIN_DOMAINS.copy()
self.buildername = buildername self.buildername = buildername
self.builderclasses = BUILTIN_BUILDERS.copy() self.builderclasses = BUILTIN_BUILDERS.copy()
@@ -145,7 +145,7 @@ class Sphinx(object):
self.setup_extension(extension) self.setup_extension(extension)
# the config file itself can be an extension # the config file itself can be an extension
if self.config.setup: if self.config.setup:
self._setting_up_extension = 'conf.py' self._setting_up_extension = ['conf.py']
# py31 doesn't have 'callable' function for below check # py31 doesn't have 'callable' function for below check
if hasattr(self.config.setup, '__call__'): if hasattr(self.config.setup, '__call__'):
self.config.setup(self) self.config.setup(self)
@@ -428,7 +428,7 @@ class Sphinx(object):
self.debug('[app] setting up extension: %r', extension) self.debug('[app] setting up extension: %r', extension)
if extension in self._extensions: if extension in self._extensions:
return return
self._setting_up_extension = extension self._setting_up_extension.append(extension)
try: try:
mod = __import__(extension, None, None, ['setup']) mod = __import__(extension, None, None, ['setup'])
except ImportError as err: except ImportError as err:
@@ -463,7 +463,7 @@ class Sphinx(object):
ext_meta = {'version': 'unknown version'} ext_meta = {'version': 'unknown version'}
self._extensions[extension] = mod self._extensions[extension] = mod
self._extension_metadata[extension] = ext_meta self._extension_metadata[extension] = ext_meta
self._setting_up_extension = '?' self._setting_up_extension.pop()
def require_sphinx(self, version): def require_sphinx(self, version):
# check the Sphinx version if requested # check the Sphinx version if requested
@@ -554,7 +554,8 @@ class Sphinx(object):
def add_node(self, node, **kwds): def add_node(self, node, **kwds):
self.debug('[app] adding node: %r', (node, kwds)) self.debug('[app] adding node: %r', (node, kwds))
if hasattr(nodes.GenericNodeVisitor, 'visit_' + node.__name__): if not kwds.pop('override', False) and \
hasattr(nodes.GenericNodeVisitor, 'visit_' + node.__name__):
self.warn('while setting up extension %s: node class %r is ' self.warn('while setting up extension %s: node class %r is '
'already registered, its visitors will be overridden' % 'already registered, its visitors will be overridden' %
(self._setting_up_extension, node.__name__)) (self._setting_up_extension, node.__name__))
@@ -605,7 +606,7 @@ class Sphinx(object):
if name in directives._directives: if name in directives._directives:
self.warn('while setting up extension %s: directive %r is ' self.warn('while setting up extension %s: directive %r is '
'already registered, it will be overridden' % 'already registered, it will be overridden' %
(self._setting_up_extension, name)) (self._setting_up_extension[-1], name))
directives.register_directive( directives.register_directive(
name, self._directive_helper(obj, content, arguments, **options)) name, self._directive_helper(obj, content, arguments, **options))
@@ -614,7 +615,7 @@ class Sphinx(object):
if name in roles._roles: if name in roles._roles:
self.warn('while setting up extension %s: role %r is ' self.warn('while setting up extension %s: role %r is '
'already registered, it will be overridden' % 'already registered, it will be overridden' %
(self._setting_up_extension, name)) (self._setting_up_extension[-1], name))
roles.register_local_role(name, role) roles.register_local_role(name, role)
def add_generic_role(self, name, nodeclass): def add_generic_role(self, name, nodeclass):
@@ -624,7 +625,7 @@ class Sphinx(object):
if name in roles._roles: if name in roles._roles:
self.warn('while setting up extension %s: role %r is ' self.warn('while setting up extension %s: role %r is '
'already registered, it will be overridden' % 'already registered, it will be overridden' %
(self._setting_up_extension, name)) (self._setting_up_extension[-1], name))
role = roles.GenericRole(name, nodeclass) role = roles.GenericRole(name, nodeclass)
roles.register_local_role(name, role) roles.register_local_role(name, role)

View File

@@ -192,7 +192,7 @@ def number_equations(app, doctree, docname):
def setup_math(app, htmlinlinevisitors, htmldisplayvisitors): def setup_math(app, htmlinlinevisitors, htmldisplayvisitors):
app.add_node(math, app.add_node(math, override=True,
latex=(latex_visit_math, None), latex=(latex_visit_math, None),
text=(text_visit_math, None), text=(text_visit_math, None),
man=(man_visit_math, None), man=(man_visit_math, None),

View File

@@ -153,12 +153,8 @@ if PY2:
def test_gen_check_types(): def test_gen_check_types():
for key, value, should, deftype in TYPECHECK_OVERRIDES: for key, value, should, deftype in TYPECHECK_OVERRIDES:
warning = StringIO() warning = StringIO()
try: app = TestApp(confoverrides={key: value}, warning=warning)
app = TestApp(confoverrides={key: value}, warning=warning) app.cleanup()
except:
pass
else:
app.cleanup()
real = type(value).__name__ real = type(value).__name__
msg = ("WARNING: the config value %r has type `%s'," msg = ("WARNING: the config value %r has type `%s',"

View File

@@ -17,6 +17,9 @@ from six import StringIO
from nose import tools, SkipTest from nose import tools, SkipTest
from docutils import nodes
from docutils.parsers.rst import directives, roles
from sphinx import application from sphinx import application
from sphinx.builders.latex import LaTeXBuilder from sphinx.builders.latex import LaTeXBuilder
from sphinx.theming import Theme from sphinx.theming import Theme
@@ -195,10 +198,19 @@ class TestApp(application.Sphinx):
warningiserror = False warningiserror = False
self._saved_path = sys.path[:] self._saved_path = sys.path[:]
self._saved_directives = directives._directives.copy()
self._saved_roles = roles._roles.copy()
application.Sphinx.__init__(self, srcdir, confdir, outdir, doctreedir, self._saved_nodeclasses = set(v for v in dir(nodes.GenericNodeVisitor)
buildername, confoverrides, status, warning, if v.startswith('visit_'))
freshenv, warningiserror, tags)
try:
application.Sphinx.__init__(self, srcdir, confdir, outdir, doctreedir,
buildername, confoverrides, status, warning,
freshenv, warningiserror, tags)
except:
self.cleanup()
raise
def cleanup(self, doctrees=False): def cleanup(self, doctrees=False):
Theme.themes.clear() Theme.themes.clear()
@@ -207,6 +219,13 @@ class TestApp(application.Sphinx):
LaTeXBuilder.usepackages = [] LaTeXBuilder.usepackages = []
sys.path[:] = self._saved_path sys.path[:] = self._saved_path
sys.modules.pop('autodoc_fodder', None) sys.modules.pop('autodoc_fodder', None)
directives._directives = self._saved_directives
roles._roles = self._saved_roles
for method in dir(nodes.GenericNodeVisitor):
if method.startswith('visit_') and \
method not in self._saved_nodeclasses:
delattr(nodes.GenericNodeVisitor, 'visit_' + method[6:])
delattr(nodes.GenericNodeVisitor, 'depart_' + method[6:])
def __repr__(self): def __repr__(self):
return '<%s buildername=%r>' % (self.__class__.__name__, self.builder.name) return '<%s buildername=%r>' % (self.__class__.__name__, self.builder.name)