sphinx-autodoc2 is a Sphinx extension that automatically generates API documentation for your Python packages.
Static analysis of Python code
: There is no need to install your package to generate the documentation, and sphinx-autodoc2 will correctly handle if TYPE_CHECKING blocks and other typing only features.
: You can even document packages from outside the project (via git clone)!
Optimized for rebuilds
: Analysis of packages and file rendering are cached, so you can use sphinx-autodoc2 in your development workflow.
Support for __all__
: sphinx-autodoc2 can follow __all__ variable, to only document the public API.
Support for both rst and md docstrings
: sphinx-autodoc2 supports both rst and md (MyST) docstrings, which can be mixed within the same project.
Highly configurable
: sphinx-autodoc2 is highly configurable, with many options to control the analysis and output of the documentation.
Decoupled analysis and rendering
: The analysis and rendering of the documentation are decoupled, and not dependent on Sphinx.
: This means that you can use sphinx-autodoc2 to generate documentation outside of Sphinx (see the autodoc2 command line tool).
See the documentation for more information!
I wanted an extension with the following goals:
- Static analysis of Python code, so things like
if TYPE_CHECKINGwere handled correctly - Support for MyST docstrings (see executablebooks/MyST-Parser#228)
- Also support for transitioning from
rsttomd, i.e. mixing docstrings
- Also support for transitioning from
- Make it simple and minimise the amount of configuration and rebuilds necessary
- Support for building public API via
__all__variable
I am not looking to support other languages tha Python (at least for now).
sphinx-autoapi was a good candidate, but it had a few issues:
- It does not support MyST docstrings: readthedocs/sphinx-autoapi#287
- It does not support the
__all__very well: readthedocs/sphinx-autoapi#358 - The analysis and rendering are coupled, making it difficult to test, modify and use outside of Sphinx
I've use a lot of their code, for the astroid static analysis, but I've made a number of "improvements":
- separating concerns: analysis and template writing
- type annotations for code base
- fixed
a | bannotations inference - added analysis of
functools.singledispatchand their registers - handling of
__all__ - docstrings (and summaries) are now parsed with the correct source/line, i.e. warnings point to the correct location in the source file
- added
:canonical:topydirectives - Moved away from using jinja templates, to using python functions
- IMO the templates were too complex and hard to read, plus they do not benefit from any form of type checking, linting, etc.
- uses
list-table, instead ofauto-summarydirective
All configuration is mainly in pyproject.toml.
Use tox to run the tests.
pipx install tox
tox -avUse pre-commit to run the linters and formatters.
pipx install pre-commit
pre-commit run --all-files
# pre-commit installflit is used to build the package.
pipx install flit
flit build