Source code for pymialsrtk.sphinxext.documenter
"""Modified Nipype sphinx autodoc ext.
Comes from Nipype https://github.com/nipy/nipype/blob/master/nipype/sphinxext/documenter.py.
**Modifications:**
* Use `get_url` from `pymialsrtk.sphinxext.gh` which correct the prefix of the URL to
http://github.com/Medical-Image-Analysis-Laboratory/mialsuperresolutiontoolkit.
"""
from sphinx.locale import _
from sphinx.ext import autodoc
from nipype.interfaces.base import BaseInterface
from .gh import get_url
_ClassDocumenter = autodoc.ClassDocumenter
RST_CLASS_BLOCK = """
.. index:: {name}
.. _{module}.{name}:
{name}
{underline}
`Link to code <{code_url}>`__
"""
[docs]class NipypeClassDocumenter(_ClassDocumenter): # type: ignore
priority = 20
[docs] def add_directive_header(self, sig: str) -> None:
if self.doc_as_attr:
self.directivetype = "attribute"
# Copied from super
domain = getattr(self, "domain", "py")
directive = getattr(self, "directivetype", self.objtype)
name = self.format_name()
sourcename = self.get_sourcename()
is_interface = False
try:
is_interface = issubclass(self.object, BaseInterface)
except TypeError:
pass
if is_interface is True:
lines = RST_CLASS_BLOCK.format(
code_url=get_url(self.object),
module=self.modname,
name=name,
underline="=" * len(name),
)
for line in lines.splitlines():
self.add_line(line, sourcename)
else:
self.add_line(
".. %s:%s:: %s%s" % (domain, directive, name, sig), sourcename
)
if self.options.noindex:
self.add_line(" :noindex:", sourcename)
if self.objpath:
# Be explicit about the module, this is necessary since .. class::
# etc. don't support a prepended module name
self.add_line(" :module: %s" % self.modname, sourcename)
# add inheritance info, if wanted
if not self.doc_as_attr and self.options.show_inheritance:
sourcename = self.get_sourcename()
self.add_line("", sourcename)
bases = getattr(self.object, "__bases__", [])
bases_links = []
for b in bases:
based_interface = False
try:
based_interface = issubclass(b, BaseInterface)
except TypeError:
pass
if b.__module__ in ("__builtin__", "builtins"):
bases_links.append(":class:`%s`" % b.__name__)
elif based_interface:
bases_links.append(":ref:`%s.%s`" % (b.__module__, b.__name__))
else:
bases_links.append(":class:`%s.%s`" % (b.__module__, b.__name__))
self.add_line(" " + _("Bases: %s") % ", ".join(bases_links), sourcename)