API Documentation is a quick and concise way to tell a user about how to use a library or work with a program. It details classes, functions, parameters, return types and more. Courtesy of Sphinx, Yaydoc had build in support for Documenting APIs for Python based projects right from it’s inception. Sphinx has a built in tool autodoc which provides certain directives such as autoclass, automodule, etc which can be used to automatically extract docstrings from all specified Python packages and modules and use it to generate API documentation. As a user of Yaydoc you could add ReST sources files with appropriate directives provided by autodoc and we would handle the rest. As part of enhancing this feature we wanted to do three things.
- Enhance support for Python
- Extend API documentation to other languages apart from Python
- Automate the process of generating ReST source files
For Enhancing support for python projects, we implemented a few things.
Since autodoc imports the modules it needs to document, There could be import errors if a dependency was not met. To fix this issue, Now a user can specify certain modules to be mocked. This would really come in handy with projects depending on packages with third party C extensions such as numpy, scipy, etc.
{% if mock_modules %} mock_modules = [name.strip() for name in '{{ mock_modules }}'.split(',')] sys.modules.update((mod_name, mock.Mock()) for mod_name in mock_modules) {% endif %}
Apart from this, if we detect a setup.py in the repository or a requirements.txt, we automatically try to install from it to meet dependencies.
# autodoc imports the module while building source files. To avoid # ImportError, install any packages in requirements.txt of the project # if available if [ -f $ROOT_DIR/setup.py ]; then pip install $ROOT_DIR/ elif [ -f $ROOT_DIR/requirements.txt ]; then pip install -q -r $ROOT_DIR/requirements.txt fi
We also crawl the repository to detect any packages and add them to sys.path. With these changes, a user can expected generated API docs without having to extend conf.py.
{% if autoapi_python == 'true' %} for (dirpath, dirnames, filenames) in os.walk('{{ root_dir }}'): # Directory contains __init__.py. It should be a python package if '__init__.py' in filenames: # appending instead of inserting at front so that user # cannot overwrite some of our own modules. sys.path.append(os.path.abspath(os.path.dirname(dirpath))) {% endif %}
The second goal is a no brainer. We would like to support as many languages as we can. With this week’s update, Java has been added to the officially supported list of languages for which Yaydoc can generate full API documentation without any manual intervention. To extract API documentation for java source files, we used a sphinx extension named javasphinx. From the official javasphinx docs,
javasphinx is a Sphinx extension that provides a Sphinx domain for documenting Java projects and a javasphinx-apidoc command line tool for automatically generating API documentation from existing Java source code and Javadoc documentation.
javasphinx-apidoc -o source/ $ROOT_DIR/$AUTOAPI_JAVA_PATH/ sphinx-apidoc -o source/ $ROOT_DIR/$AUTOAPI_PYTHON_PATH/
For the third goal, we use the tools sphinx-apidoc and javasphinx-apidoc to generate source files.