mirror of
https://github.com/sphinx-doc/sphinx.git
synced 2025-02-25 18:55:22 -06:00
Move env.temp_data content that might be used to resolve references to a new env.ref_context dictionary.
This commit is contained in:
parent
ca4e62e47b
commit
2c396601bf
@ -130,7 +130,7 @@ class CObject(ObjectDescription):
|
||||
if m:
|
||||
name = m.group(1)
|
||||
|
||||
typename = self.env.temp_data.get('c:type')
|
||||
typename = self.env.ref_context.get('c:type')
|
||||
if self.name == 'c:member' and typename:
|
||||
fullname = typename + '.' + name
|
||||
else:
|
||||
@ -212,12 +212,12 @@ class CObject(ObjectDescription):
|
||||
self.typename_set = False
|
||||
if self.name == 'c:type':
|
||||
if self.names:
|
||||
self.env.temp_data['c:type'] = self.names[0]
|
||||
self.env.ref_context['c:type'] = self.names[0]
|
||||
self.typename_set = True
|
||||
|
||||
def after_content(self):
|
||||
if self.typename_set:
|
||||
self.env.temp_data['c:type'] = None
|
||||
self.env.ref_context.pop('c:type', None)
|
||||
|
||||
|
||||
class CXRefRole(XRefRole):
|
||||
|
@ -434,7 +434,7 @@ class ASTNestedNameElement(ASTBase):
|
||||
'', refdomain='cpp', reftype='type',
|
||||
reftarget=targetText, modname=None, classname=None)
|
||||
if env: # during testing we don't have an env, do we?
|
||||
pnode['cpp:parent'] = env.temp_data.get('cpp:parent')
|
||||
pnode['cpp:parent'] = env.ref_context.get('cpp:parent')
|
||||
pnode += nodes.Text(text_type(self.identifier))
|
||||
signode += pnode
|
||||
elif mode == 'lastIsName':
|
||||
@ -1666,7 +1666,7 @@ class CPPObject(ObjectDescription):
|
||||
signode['names'].append(uninstantiated)
|
||||
objects.setdefault(uninstantiated, (
|
||||
self.env.docname, ast.objectType, theid))
|
||||
self.env.temp_data['cpp:lastname'] = ast.prefixedName
|
||||
self.env.ref_context['cpp:lastname'] = ast.prefixedName
|
||||
|
||||
indextext = self.get_index_text(name)
|
||||
if not re.compile(r'^[a-zA-Z0-9_]*$').match(theid):
|
||||
@ -1693,7 +1693,7 @@ class CPPObject(ObjectDescription):
|
||||
raise ValueError
|
||||
self.describe_signature(signode, ast)
|
||||
|
||||
parent = self.env.temp_data.get('cpp:parent')
|
||||
parent = self.env.ref_context.get('cpp:parent')
|
||||
if parent and len(parent) > 0:
|
||||
ast = ast.clone()
|
||||
ast.prefixedName = ast.name.prefix_nested_name(parent[-1])
|
||||
@ -1741,15 +1741,15 @@ class CPPClassObject(CPPObject):
|
||||
return _('%s (C++ class)') % name
|
||||
|
||||
def before_content(self):
|
||||
lastname = self.env.temp_data['cpp:lastname']
|
||||
lastname = self.env.ref_context['cpp:lastname']
|
||||
assert lastname
|
||||
if 'cpp:parent' in self.env.temp_data:
|
||||
self.env.temp_data['cpp:parent'].append(lastname)
|
||||
if 'cpp:parent' in self.env.ref_context:
|
||||
self.env.ref_context['cpp:parent'].append(lastname)
|
||||
else:
|
||||
self.env.temp_data['cpp:parent'] = [lastname]
|
||||
self.env.ref_context['cpp:parent'] = [lastname]
|
||||
|
||||
def after_content(self):
|
||||
self.env.temp_data['cpp:parent'].pop()
|
||||
self.env.ref_context['cpp:parent'].pop()
|
||||
|
||||
def parse_definition(self, parser):
|
||||
return parser.parse_class_object()
|
||||
@ -1774,7 +1774,7 @@ class CPPNamespaceObject(Directive):
|
||||
def run(self):
|
||||
env = self.state.document.settings.env
|
||||
if self.arguments[0].strip() in ('NULL', '0', 'nullptr'):
|
||||
env.temp_data['cpp:parent'] = []
|
||||
env.ref_context['cpp:parent'] = []
|
||||
else:
|
||||
parser = DefinitionParser(self.arguments[0])
|
||||
try:
|
||||
@ -1784,13 +1784,13 @@ class CPPNamespaceObject(Directive):
|
||||
self.state_machine.reporter.warning(e.description,
|
||||
line=self.lineno)
|
||||
else:
|
||||
env.temp_data['cpp:parent'] = [prefix]
|
||||
env.ref_context['cpp:parent'] = [prefix]
|
||||
return []
|
||||
|
||||
|
||||
class CPPXRefRole(XRefRole):
|
||||
def process_link(self, env, refnode, has_explicit_title, title, target):
|
||||
parent = env.temp_data.get('cpp:parent')
|
||||
parent = env.ref_context.get('cpp:parent')
|
||||
if parent:
|
||||
refnode['cpp:parent'] = parent[:]
|
||||
if not has_explicit_title:
|
||||
|
@ -45,7 +45,7 @@ class JSObject(ObjectDescription):
|
||||
nameprefix = None
|
||||
name = prefix
|
||||
|
||||
objectname = self.env.temp_data.get('js:object')
|
||||
objectname = self.env.ref_context.get('js:object')
|
||||
if nameprefix:
|
||||
if objectname:
|
||||
# someone documenting the method of an attribute of the current
|
||||
@ -77,7 +77,7 @@ class JSObject(ObjectDescription):
|
||||
|
||||
def add_target_and_index(self, name_obj, sig, signode):
|
||||
objectname = self.options.get(
|
||||
'object', self.env.temp_data.get('js:object'))
|
||||
'object', self.env.ref_context.get('js:object'))
|
||||
fullname = name_obj[0]
|
||||
if fullname not in self.state.document.ids:
|
||||
signode['names'].append(fullname)
|
||||
@ -140,7 +140,7 @@ class JSConstructor(JSCallable):
|
||||
class JSXRefRole(XRefRole):
|
||||
def process_link(self, env, refnode, has_explicit_title, title, target):
|
||||
# basically what sphinx.domains.python.PyXRefRole does
|
||||
refnode['js:object'] = env.temp_data.get('js:object')
|
||||
refnode['js:object'] = env.ref_context.get('js:object')
|
||||
if not has_explicit_title:
|
||||
title = title.lstrip('.')
|
||||
target = target.lstrip('~')
|
||||
@ -216,7 +216,7 @@ class JavaScriptDomain(Domain):
|
||||
|
||||
def resolve_any_xref(self, env, fromdocname, builder, target, node,
|
||||
contnode):
|
||||
objectname = node.get('js:object') # not likely
|
||||
objectname = node.get('js:object')
|
||||
name, obj = self.find_obj(env, objectname, target, None, 1)
|
||||
if not obj:
|
||||
return []
|
||||
|
@ -156,8 +156,8 @@ class PyObject(ObjectDescription):
|
||||
|
||||
# determine module and class name (if applicable), as well as full name
|
||||
modname = self.options.get(
|
||||
'module', self.env.temp_data.get('py:module'))
|
||||
classname = self.env.temp_data.get('py:class')
|
||||
'module', self.env.ref_context.get('py:module'))
|
||||
classname = self.env.ref_context.get('py:class')
|
||||
if classname:
|
||||
add_module = False
|
||||
if name_prefix and name_prefix.startswith(classname):
|
||||
@ -194,7 +194,7 @@ class PyObject(ObjectDescription):
|
||||
# 'exceptions' module.
|
||||
elif add_module and self.env.config.add_module_names:
|
||||
modname = self.options.get(
|
||||
'module', self.env.temp_data.get('py:module'))
|
||||
'module', self.env.ref_context.get('py:module'))
|
||||
if modname and modname != 'exceptions':
|
||||
nodetext = modname + '.'
|
||||
signode += addnodes.desc_addname(nodetext, nodetext)
|
||||
@ -225,7 +225,7 @@ class PyObject(ObjectDescription):
|
||||
|
||||
def add_target_and_index(self, name_cls, sig, signode):
|
||||
modname = self.options.get(
|
||||
'module', self.env.temp_data.get('py:module'))
|
||||
'module', self.env.ref_context.get('py:module'))
|
||||
fullname = (modname and modname + '.' or '') + name_cls[0]
|
||||
# note target
|
||||
if fullname not in self.state.document.ids:
|
||||
@ -254,7 +254,7 @@ class PyObject(ObjectDescription):
|
||||
|
||||
def after_content(self):
|
||||
if self.clsname_set:
|
||||
self.env.temp_data['py:class'] = None
|
||||
self.env.ref_context.pop('py:class', None)
|
||||
|
||||
|
||||
class PyModulelevel(PyObject):
|
||||
@ -299,7 +299,7 @@ class PyClasslike(PyObject):
|
||||
def before_content(self):
|
||||
PyObject.before_content(self)
|
||||
if self.names:
|
||||
self.env.temp_data['py:class'] = self.names[0][0]
|
||||
self.env.ref_context['py:class'] = self.names[0][0]
|
||||
self.clsname_set = True
|
||||
|
||||
|
||||
@ -377,8 +377,8 @@ class PyClassmember(PyObject):
|
||||
def before_content(self):
|
||||
PyObject.before_content(self)
|
||||
lastname = self.names and self.names[-1][1]
|
||||
if lastname and not self.env.temp_data.get('py:class'):
|
||||
self.env.temp_data['py:class'] = lastname.strip('.')
|
||||
if lastname and not self.env.ref_context.get('py:class'):
|
||||
self.env.ref_context['py:class'] = lastname.strip('.')
|
||||
self.clsname_set = True
|
||||
|
||||
|
||||
@ -434,7 +434,7 @@ class PyModule(Directive):
|
||||
env = self.state.document.settings.env
|
||||
modname = self.arguments[0].strip()
|
||||
noindex = 'noindex' in self.options
|
||||
env.temp_data['py:module'] = modname
|
||||
env.ref_context['py:module'] = modname
|
||||
ret = []
|
||||
if not noindex:
|
||||
env.domaindata['py']['modules'][modname] = \
|
||||
@ -472,16 +472,16 @@ class PyCurrentModule(Directive):
|
||||
env = self.state.document.settings.env
|
||||
modname = self.arguments[0].strip()
|
||||
if modname == 'None':
|
||||
env.temp_data['py:module'] = None
|
||||
env.ref_context.pop('py:module', None)
|
||||
else:
|
||||
env.temp_data['py:module'] = modname
|
||||
env.ref_context['py:module'] = modname
|
||||
return []
|
||||
|
||||
|
||||
class PyXRefRole(XRefRole):
|
||||
def process_link(self, env, refnode, has_explicit_title, title, target):
|
||||
refnode['py:module'] = env.temp_data.get('py:module')
|
||||
refnode['py:class'] = env.temp_data.get('py:class')
|
||||
refnode['py:module'] = env.ref_context.get('py:module')
|
||||
refnode['py:class'] = env.ref_context.get('py:class')
|
||||
if not has_explicit_title:
|
||||
title = title.lstrip('.') # only has a meaning for the target
|
||||
target = target.lstrip('~') # only has a meaning for the title
|
||||
|
@ -163,7 +163,7 @@ class Cmdoption(ObjectDescription):
|
||||
return firstname
|
||||
|
||||
def add_target_and_index(self, firstname, sig, signode):
|
||||
currprogram = self.env.temp_data.get('std:program')
|
||||
currprogram = self.env.ref_context.get('std:program')
|
||||
for optname in signode.get('allnames', []):
|
||||
targetname = optname.replace('/', '-')
|
||||
if not targetname.startswith('-'):
|
||||
@ -198,9 +198,9 @@ class Program(Directive):
|
||||
env = self.state.document.settings.env
|
||||
program = ws_re.sub('-', self.arguments[0].strip())
|
||||
if program == 'None':
|
||||
env.temp_data['std:program'] = None
|
||||
env.ref_context.pop('std:program', None)
|
||||
else:
|
||||
env.temp_data['std:program'] = program
|
||||
env.ref_context['std:program'] = program
|
||||
return []
|
||||
|
||||
|
||||
@ -219,7 +219,7 @@ class OptionXRefRole(XRefRole):
|
||||
innernodeclass = addnodes.literal_emphasis
|
||||
|
||||
def process_link(self, env, refnode, has_explicit_title, title, target):
|
||||
program = env.temp_data.get('std:program')
|
||||
program = env.ref_context.get('std:program')
|
||||
if not has_explicit_title:
|
||||
if ' ' in title and not (title.startswith('/') or
|
||||
title.startswith('-')):
|
||||
|
@ -225,6 +225,10 @@ class BuildEnvironment:
|
||||
|
||||
# temporary data storage while reading a document
|
||||
self.temp_data = {}
|
||||
# context for cross-references (e.g. current module or class)
|
||||
# this is similar to temp_data, but will for example be copied to
|
||||
# attributes of "any" cross references
|
||||
self.ref_context = {}
|
||||
|
||||
def set_warnfunc(self, func):
|
||||
self._warnfunc = func
|
||||
@ -681,6 +685,7 @@ class BuildEnvironment:
|
||||
|
||||
# cleanup
|
||||
self.temp_data.clear()
|
||||
self.ref_context.clear()
|
||||
roles._roles.pop('', None) # if a document has set a local default role
|
||||
|
||||
if save_parsed:
|
||||
@ -747,7 +752,7 @@ class BuildEnvironment:
|
||||
def note_versionchange(self, type, version, node, lineno):
|
||||
self.versionchanges.setdefault(version, []).append(
|
||||
(type, self.temp_data['docname'], lineno,
|
||||
self.temp_data.get('py:module'),
|
||||
self.ref_context.get('py:module'),
|
||||
self.temp_data.get('object'), node.astext()))
|
||||
|
||||
# post-processing of read doctrees
|
||||
|
@ -891,7 +891,7 @@ class ModuleLevelDocumenter(Documenter):
|
||||
modname = self.env.temp_data.get('autodoc:module')
|
||||
# ... or in the scope of a module directive
|
||||
if not modname:
|
||||
modname = self.env.temp_data.get('py:module')
|
||||
modname = self.env.ref_context.get('py:module')
|
||||
# ... else, it stays None, which means invalid
|
||||
return modname, parents + [base]
|
||||
|
||||
@ -913,7 +913,7 @@ class ClassLevelDocumenter(Documenter):
|
||||
mod_cls = self.env.temp_data.get('autodoc:class')
|
||||
# ... or from a class directive
|
||||
if mod_cls is None:
|
||||
mod_cls = self.env.temp_data.get('py:class')
|
||||
mod_cls = self.env.ref_context.get('py:class')
|
||||
# ... if still None, there's no way to know
|
||||
if mod_cls is None:
|
||||
return None, []
|
||||
@ -923,7 +923,7 @@ class ClassLevelDocumenter(Documenter):
|
||||
if not modname:
|
||||
modname = self.env.temp_data.get('autodoc:module')
|
||||
if not modname:
|
||||
modname = self.env.temp_data.get('py:module')
|
||||
modname = self.env.ref_context.get('py:module')
|
||||
# ... else, it stays None, which means invalid
|
||||
return modname, parents + [base]
|
||||
|
||||
|
@ -432,11 +432,11 @@ def get_import_prefixes_from_env(env):
|
||||
"""
|
||||
prefixes = [None]
|
||||
|
||||
currmodule = env.temp_data.get('py:module')
|
||||
currmodule = env.ref_context.get('py:module')
|
||||
if currmodule:
|
||||
prefixes.insert(0, currmodule)
|
||||
|
||||
currclass = env.temp_data.get('py:class')
|
||||
currclass = env.ref_context.get('py:class')
|
||||
if currclass:
|
||||
if currmodule:
|
||||
prefixes.insert(0, currmodule + "." + currclass)
|
||||
|
@ -310,7 +310,7 @@ class InheritanceDiagram(Directive):
|
||||
# Create a graph starting with the list of classes
|
||||
try:
|
||||
graph = InheritanceGraph(
|
||||
class_names, env.temp_data.get('py:module'),
|
||||
class_names, env.ref_context.get('py:module'),
|
||||
parts=node['parts'],
|
||||
private_bases='private-bases' in self.options)
|
||||
except InheritanceException as err:
|
||||
|
@ -123,24 +123,24 @@ def test_parse_name():
|
||||
directive.env.temp_data['autodoc:module'] = 'util'
|
||||
verify('function', 'raises', ('util', ['raises'], None, None))
|
||||
del directive.env.temp_data['autodoc:module']
|
||||
directive.env.temp_data['py:module'] = 'util'
|
||||
directive.env.ref_context['py:module'] = 'util'
|
||||
verify('function', 'raises', ('util', ['raises'], None, None))
|
||||
verify('class', 'TestApp', ('util', ['TestApp'], None, None))
|
||||
|
||||
# for members
|
||||
directive.env.temp_data['py:module'] = 'foo'
|
||||
directive.env.ref_context['py:module'] = 'foo'
|
||||
verify('method', 'util.TestApp.cleanup',
|
||||
('util', ['TestApp', 'cleanup'], None, None))
|
||||
directive.env.temp_data['py:module'] = 'util'
|
||||
directive.env.temp_data['py:class'] = 'Foo'
|
||||
directive.env.ref_context['py:module'] = 'util'
|
||||
directive.env.ref_context['py:class'] = 'Foo'
|
||||
directive.env.temp_data['autodoc:class'] = 'TestApp'
|
||||
verify('method', 'cleanup', ('util', ['TestApp', 'cleanup'], None, None))
|
||||
verify('method', 'TestApp.cleanup',
|
||||
('util', ['TestApp', 'cleanup'], None, None))
|
||||
|
||||
# and clean up
|
||||
del directive.env.temp_data['py:module']
|
||||
del directive.env.temp_data['py:class']
|
||||
del directive.env.ref_context['py:module']
|
||||
del directive.env.ref_context['py:class']
|
||||
del directive.env.temp_data['autodoc:class']
|
||||
|
||||
|
||||
@ -584,7 +584,7 @@ def test_generate():
|
||||
'method', 'test_autodoc.Class.foobar', more_content=None)
|
||||
|
||||
# test auto and given content mixing
|
||||
directive.env.temp_data['py:module'] = 'test_autodoc'
|
||||
directive.env.ref_context['py:module'] = 'test_autodoc'
|
||||
assert_result_contains(' Function.', 'method', 'Class.meth')
|
||||
add_content = ViewList()
|
||||
add_content.append('Content.', '', 0)
|
||||
@ -682,12 +682,12 @@ def test_generate():
|
||||
'attribute', 'test_autodoc.Class.descr')
|
||||
|
||||
# test generation for C modules (which have no source file)
|
||||
directive.env.temp_data['py:module'] = 'time'
|
||||
directive.env.ref_context['py:module'] = 'time'
|
||||
assert_processes([('function', 'time.asctime')], 'function', 'asctime')
|
||||
assert_processes([('function', 'time.asctime')], 'function', 'asctime')
|
||||
|
||||
# test autodoc_member_order == 'source'
|
||||
directive.env.temp_data['py:module'] = 'test_autodoc'
|
||||
directive.env.ref_context['py:module'] = 'test_autodoc'
|
||||
assert_order(['.. py:class:: Class(arg)',
|
||||
' .. py:attribute:: Class.descr',
|
||||
' .. py:method:: Class.meth()',
|
||||
@ -704,7 +704,7 @@ def test_generate():
|
||||
' .. py:method:: Class.inheritedmeth()',
|
||||
],
|
||||
'class', 'Class', member_order='bysource', all_members=True)
|
||||
del directive.env.temp_data['py:module']
|
||||
del directive.env.ref_context['py:module']
|
||||
|
||||
# test attribute initialized to class instance from other module
|
||||
directive.env.temp_data['autodoc:class'] = 'test_autodoc.Class'
|
||||
@ -729,7 +729,7 @@ def test_generate():
|
||||
'test_autodoc.Class.moore')
|
||||
|
||||
# test new attribute documenter behavior
|
||||
directive.env.temp_data['py:module'] = 'test_autodoc'
|
||||
directive.env.ref_context['py:module'] = 'test_autodoc'
|
||||
options.undoc_members = True
|
||||
assert_processes([('class', 'test_autodoc.AttCls'),
|
||||
('attribute', 'test_autodoc.AttCls.a1'),
|
||||
@ -743,7 +743,7 @@ def test_generate():
|
||||
# test explicit members with instance attributes
|
||||
del directive.env.temp_data['autodoc:class']
|
||||
del directive.env.temp_data['autodoc:module']
|
||||
directive.env.temp_data['py:module'] = 'test_autodoc'
|
||||
directive.env.ref_context['py:module'] = 'test_autodoc'
|
||||
options.inherited_members = False
|
||||
options.undoc_members = False
|
||||
options.members = ALL
|
||||
@ -765,7 +765,7 @@ def test_generate():
|
||||
], 'class', 'InstAttCls')
|
||||
del directive.env.temp_data['autodoc:class']
|
||||
del directive.env.temp_data['autodoc:module']
|
||||
del directive.env.temp_data['py:module']
|
||||
del directive.env.ref_context['py:module']
|
||||
|
||||
# test descriptor class documentation
|
||||
options.members = ['CustomDataDescriptor']
|
||||
|
Loading…
Reference in New Issue
Block a user