tmp
/
pip-install-ghxuqwgs
/numpy_78e94bf2b6094bf9a1f3d92042f9bf46
/doc
/sphinxext
/numpydoc
/numpydoc.py
""" | |
======== | |
numpydoc | |
======== | |
Sphinx extension that handles docstrings in the Numpy standard format. [1] | |
It will: | |
- Convert Parameters etc. sections to field lists. | |
- Convert See Also section to a See also entry. | |
- Renumber references. | |
- Extract the signature from the docstring, if it can't be determined otherwise. | |
.. [1] https://github.com/numpy/numpy/blob/master/doc/HOWTO_DOCUMENT.rst.txt | |
""" | |
from __future__ import division, absolute_import, print_function | |
import os, sys, re, pydoc | |
import sphinx | |
import inspect | |
import collections | |
if sphinx.__version__ < '1.0.1': | |
raise RuntimeError("Sphinx 1.0.1 or newer is required") | |
from .docscrape_sphinx import get_doc_object, SphinxDocString | |
from sphinx.util.compat import Directive | |
if sys.version_info[0] >= 3: | |
sixu = lambda s: s | |
else: | |
sixu = lambda s: unicode(s, 'unicode_escape') | |
def mangle_docstrings(app, what, name, obj, options, lines, | |
reference_offset=[0]): | |
cfg = dict(use_plots=app.config.numpydoc_use_plots, | |
show_class_members=app.config.numpydoc_show_class_members, | |
class_members_toctree=app.config.numpydoc_class_members_toctree, | |
) | |
if what == 'module': | |
# Strip top title | |
title_re = re.compile(sixu('^\\s*[#*=]{4,}\\n[a-z0-9 -]+\\n[#*=]{4,}\\s*'), | |
re.I|re.S) | |
lines[:] = title_re.sub(sixu(''), sixu("\n").join(lines)).split(sixu("\n")) | |
else: | |
doc = get_doc_object(obj, what, sixu("\n").join(lines), config=cfg) | |
if sys.version_info[0] >= 3: | |
doc = str(doc) | |
else: | |
doc = unicode(doc) | |
lines[:] = doc.split(sixu("\n")) | |
if app.config.numpydoc_edit_link and hasattr(obj, '__name__') and \ | |
obj.__name__: | |
if hasattr(obj, '__module__'): | |
v = dict(full_name=sixu("%s.%s") % (obj.__module__, obj.__name__)) | |
else: | |
v = dict(full_name=obj.__name__) | |
lines += [sixu(''), sixu('.. htmlonly::'), sixu('')] | |
lines += [sixu(' %s') % x for x in | |
(app.config.numpydoc_edit_link % v).split("\n")] | |
# replace reference numbers so that there are no duplicates | |
references = [] | |
for line in lines: | |
line = line.strip() | |
m = re.match(sixu('^.. \\[([a-z0-9_.-])\\]'), line, re.I) | |
if m: | |
references.append(m.group(1)) | |
# start renaming from the longest string, to avoid overwriting parts | |
references.sort(key=lambda x: -len(x)) | |
if references: | |
for i, line in enumerate(lines): | |
for r in references: | |
if re.match(sixu('^\\d+$'), r): | |
new_r = sixu("R%d") % (reference_offset[0] + int(r)) | |
else: | |
new_r = sixu("%s%d") % (r, reference_offset[0]) | |
lines[i] = lines[i].replace(sixu('[%s]_') % r, | |
sixu('[%s]_') % new_r) | |
lines[i] = lines[i].replace(sixu('.. [%s]') % r, | |
sixu('.. [%s]') % new_r) | |
reference_offset[0] += len(references) | |
def mangle_signature(app, what, name, obj, options, sig, retann): | |
# Do not try to inspect classes that don't define `__init__` | |
if (inspect.isclass(obj) and | |
(not hasattr(obj, '__init__') or | |
'initializes x; see ' in pydoc.getdoc(obj.__init__))): | |
return '', '' | |
if not (isinstance(obj, collections.Callable) or hasattr(obj, '__argspec_is_invalid_')): return | |
if not hasattr(obj, '__doc__'): return | |
doc = SphinxDocString(pydoc.getdoc(obj)) | |
if doc['Signature']: | |
sig = re.sub(sixu("^[^(]*"), sixu(""), doc['Signature']) | |
return sig, sixu('') | |
def setup(app, get_doc_object_=get_doc_object): | |
if not hasattr(app, 'add_config_value'): | |
return # probably called by nose, better bail out | |
global get_doc_object | |
get_doc_object = get_doc_object_ | |
app.connect('autodoc-process-docstring', mangle_docstrings) | |
app.connect('autodoc-process-signature', mangle_signature) | |
app.add_config_value('numpydoc_edit_link', None, False) | |
app.add_config_value('numpydoc_use_plots', None, False) | |
app.add_config_value('numpydoc_show_class_members', True, True) | |
app.add_config_value('numpydoc_class_members_toctree', True, True) | |
# Extra mangling domains | |
app.add_domain(NumpyPythonDomain) | |
app.add_domain(NumpyCDomain) | |
#------------------------------------------------------------------------------ | |
# Docstring-mangling domains | |
#------------------------------------------------------------------------------ | |
from docutils.statemachine import ViewList | |
from sphinx.domains.c import CDomain | |
from sphinx.domains.python import PythonDomain | |
class ManglingDomainBase(object): | |
directive_mangling_map = {} | |
def __init__(self, *a, **kw): | |
super(ManglingDomainBase, self).__init__(*a, **kw) | |
self.wrap_mangling_directives() | |
def wrap_mangling_directives(self): | |
for name, objtype in list(self.directive_mangling_map.items()): | |
self.directives[name] = wrap_mangling_directive( | |
self.directives[name], objtype) | |
class NumpyPythonDomain(ManglingDomainBase, PythonDomain): | |
name = 'np' | |
directive_mangling_map = { | |
'function': 'function', | |
'class': 'class', | |
'exception': 'class', | |
'method': 'function', | |
'classmethod': 'function', | |
'staticmethod': 'function', | |
'attribute': 'attribute', | |
} | |
indices = [] | |
class NumpyCDomain(ManglingDomainBase, CDomain): | |
name = 'np-c' | |
directive_mangling_map = { | |
'function': 'function', | |
'member': 'attribute', | |
'macro': 'function', | |
'type': 'class', | |
'var': 'object', | |
} | |
def wrap_mangling_directive(base_directive, objtype): | |
class directive(base_directive): | |
def run(self): | |
env = self.state.document.settings.env | |
name = None | |
if self.arguments: | |
m = re.match(r'^(.*\s+)?(.*?)(\(.*)?', self.arguments[0]) | |
name = m.group(2).strip() | |
if not name: | |
name = self.arguments[0] | |
lines = list(self.content) | |
mangle_docstrings(env.app, objtype, name, None, None, lines) | |
self.content = ViewList(lines, self.content.parent) | |
return base_directive.run(self) | |
return directive | |