Emit reStructuredText from sphinx autodoc?
I had same problem and for one time generating of docs I've used quite ugly solution to patch Sphinx, see Make Sphinx generate RST class documentation from pydoc.
Not a full answer, more or less a starting point:
autodoc
translates auto directives to python directives.So one can use autodoc events to get the translated python directives.
For example if you have the following mymodule.py
:
#!/usr/bin/env python# -*- coding: utf-8 -*-"""This is my module."""def my_test_func(a, b=1): """This is my test function""" return a + b class MyClass(object): """This is my class""" def __init__(x, y='test'): """The init of my class""" self.x = float(x) self.y = y def my_method(self, z): """This is my method. :param z: a number :type z: float, int :returns: the sum of self.x and z :rtype: float """ return self.x + z
sphinx-apidoc
will create
mymodule Module===============.. automodule:: mymodule :members: :undoc-members: :show-inheritance:
The following extension (or addition to conf.py
):
NAMES = []DIRECTIVES = {}def get_rst(app, what, name, obj, options, signature, return_annotation): doc_indent = ' ' directive_indent = '' if what in ['method', 'attribute']: doc_indent += ' ' directive_indent += ' ' directive = '%s.. py:%s:: %s' % (directive_indent, what, name) if signature: # modules, attributes, ... don't have a signature directive += signature NAMES.append(name) rst = directive + '\n\n' + doc_indent + obj.__doc__ + '\n' DIRECTIVES[name] = rst def write_new_docs(app, exception): txt = ['My module documentation'] txt.append('-----------------------\n') for name in NAMES: txt.append(DIRECTIVES[name]) print '\n'.join(txt) with open('../doc_new/generated.rst', 'w') as outfile: outfile.write('\n'.join(txt))def setup(app): app.connect('autodoc-process-signature', get_rst) app.connect('build-finished', write_new_docs)
will give you:
My module documentation-----------------------.. py:module:: mymoduleThis is my module... py:class:: mymodule.MyClass(x, y='test') This is my class .. py:method:: mymodule.MyClass.my_method(z) This is my method. :param z: a number :type z: float, int :returns: the sum of self.x and z :rtype: float.. py:function:: mymodule.my_test_func(a, b=1) This is my test function
However as autodoc
emits no event, when the translation is completed, So further processing done by autodoc has to be adapted to the docstrings here.