from six import itervalues
from lxml import etree as ET
-from sphinx.ext.autodoc import Documenter, AutoDirective, members_option, ALL
+from sphinx.ext.autodoc import Documenter, members_option, ALL
+try:
+ from sphinx.ext.autodoc import AutoDirective
+ sphinxVersion = 1
+except ImportError:
+ sphinxVersion = 2
from sphinx.errors import ExtensionError
from sphinx.util import logging
# document non-skipped members
memberdocumenters = []
for (mname, member, isattr) in self.filter_members(members, want_all):
- classes = [cls for cls in itervalues(AutoDirective._registry)
- if cls.can_document_member(member, mname, isattr, self)]
+ if sphinxVersion >= 2:
+ classes = [cls for cls in itervalues(self.env.app.registry.documenters)
+ if cls.can_document_member(member, mname, isattr, self)]
+ else:
+ classes = [cls for cls in itervalues(AutoDirective._registry)
+ if cls.can_document_member(member, mname, isattr, self)]
if not classes:
# don't know how to document this member
continue
def format_name(self):
return self.fullname
- def get_doc(self, encoding):
+ def get_doc(self, encoding=None): # This method is called with 1 parameter in Sphinx 2.x and 2 parameters in Sphinx 1.x
detaileddescription = self.object.find('detaileddescription')
doc = [format_xml_paragraph(detaileddescription)]
return doc
# Uncomment to view the generated rst for the class.
# print('\n'.join(self.directive.result))
+autodoxy_requalified_identifiers = []
+def fix_namespaces(str):
+ for unqualified,fullyqualif in autodoxy_requalified_identifiers:
+ p = re.compile("(^| ){:s}".format(unqualified))
+ str = p.sub(' {:s}'.format(fullyqualif), str)
+ return str
+
class DoxygenMethodDocumenter(DoxygenDocumenter):
objtype = 'doxymethod'
directivetype = 'function'
xpath_query_noparam = ('{:s}/memberdef[@kind="function"]/name[text()="{:s}"]/..').format(prefix, meth)
xpath_query = ""
- if self.argsstring != None:
+ if self.argsstring is not None:
xpath_query = ('{:s}/memberdef[@kind="function" and argsstring/text()="{:s}"]/name[text()="{:s}"]/..').format(prefix,self.argsstring,meth)
else:
xpath_query = xpath_query_noparam
if not match:
logger = logging.getLogger(__name__)
- if self.argsstring != None:
+ if self.argsstring is not None:
candidates = get_doxygen_root().xpath(xpath_query_noparam)
if len(candidates) == 1:
logger.warning("[autodoxy] Using method '{}{}{}' instead of '{}{}{}'. You may want to drop your specification of the signature, or to fix it."
self.object = match[0]
return True
- def get_doc(self, encoding):
+ def get_doc(self, encoding=None): # This method is called with 1 parameter in Sphinx 2.x and 2 parameters in Sphinx 1.x
detaileddescription = self.object.find('detaileddescription')
doc = [format_xml_paragraph(detaileddescription)]
return doc
rtype = rtype_el.text
# print("rtype: {}".format(rtype))
- signame = (rtype and (rtype + ' ') or '') + self.klassname + "::"+ self.objname
+ signame = fix_namespaces((rtype and (rtype + ' ') or '') + self.klassname + "::"+ self.objname )
+# print("signame: '{}'".format(signame))
return self.format_template_name() + signame
def format_template_name(self):
return ret
def format_signature(self):
- args = self.object.find('argsstring').text
+ args = fix_namespaces(self.object.find('argsstring').text)
+# print ("signature: {}".format(args))
return args
def document_members(self, all_members=False):
rtype_el_ref = rtype_el.find('ref')
if rtype_el_ref is not None:
rtype = text(rtype_el) + text(rtype_el_ref) + tail(rtype_el_ref)
+# print(" --> rtype_el: {} rtype_el_ref: {}".format(text(rtype_el), text(rtype_el_ref)))
else:
rtype = rtype_el.text
-# print("rtype: {}".format(rtype))
+ print("rtype: {}".format(rtype))
signame = (rtype and (rtype + ' ') or '') + self.klassname + "::" + self.objname
- return self.format_template_name() + signame
+ res = fix_namespaces(self.format_template_name() + signame)
+# print("formatted name: {}".format(res))
+ return res
- def get_doc(self, encoding):
+ def get_doc(self, encoding=None): # This method is called with 1 parameter in Sphinx 2.x and 2 parameters in Sphinx 1.x
detaileddescription = self.object.find('detaileddescription')
doc = [format_xml_paragraph(detaileddescription)]
+# print ("doc: {}".format(doc))
return doc
def format_template_name(self):
for node in root:
setup.DOXYGEN_ROOT.append(node)
+ if app.config.autodoxy_requalified_identifiers is not None:
+ global autodoxy_requalified_identifiers
+ autodoxy_requalified_identifiers = app.config.autodoxy_requalified_identifiers
def get_doxygen_root():
"""Get the root element of the doxygen XML document.
app.add_autodocumenter(DoxygenMethodDocumenter)
app.add_autodocumenter(DoxygenVariableDocumenter)
app.add_config_value("doxygen_xml", "", True)
+ app.add_config_value("autodoxy_requalified_identifiers", [], True)
# app.add_directive('autodoxysummary', DoxygenAutosummary)
# app.add_directive('autodoxyenum', DoxygenAutoEnum)