À partir de la version 3.1 de Sphinx (juin 2020), sphinx.ext.autosummary
(enfin !) a une récursion automatique.
Il n'est donc pas nécessaire de coder en dur les noms de modules ou de s'appuyer sur des bibliothèques tierces comme Sphinx AutoAPI o Sphinx AutoPackageSummary pour leur détection automatique des paquets.
Exemple de paquetage Python 3.7 à documenter ( voir le code sur Github y résultat sur ReadTheDocs ) :
mytoolbox
|-- mypackage
| |-- __init__.py
| |-- foo.py
| |-- mysubpackage
| |-- __init__.py
| |-- bar.py
|-- doc
| |-- source
| |--index.rst
| |--conf.py
| |-- _templates
| |-- custom-module-template.rst
| |-- custom-class-template.rst
conf.py
:
import os
import sys
sys.path.insert(0, os.path.abspath('../..')) # Source code dir relative to this file
extensions = [
'sphinx.ext.autodoc', # Core library for html generation from docstrings
'sphinx.ext.autosummary', # Create neat summary tables
]
autosummary_generate = True # Turn on sphinx.ext.autosummary
# Add any paths that contain templates here, relative to this directory.
templates_path = ['_templates']
index.rst
(note nouvelle :recursive:
option) :
Welcome to My Toolbox
=====================
Some words.
.. autosummary::
:toctree: _autosummary
:template: custom-module-template.rst
:recursive:
mypackage
Ceci est suffisant pour résumer automatiquement chaque module du paquet, même s'il est profondément imbriqué. Pour chaque module, il résume ensuite chaque attribut, fonction, classe et exception de ce module.
Curieusement, cependant, la valeur par défaut sphinx.ext.autosummary
Les modèles ne génèrent pas de pages de documentation distinctes pour chaque attribut, fonction, classe et exception, et ne créent pas de liens vers ces pages à partir des tableaux récapitulatifs. Il est possible d'étendre les modèles pour faire cela, comme indiqué ci-dessous, mais je ne comprends pas pourquoi ce n'est pas le comportement par défaut - c'est sûrement ce que la plupart des gens veulent ? J'en ai fait une demande de fonctionnalité .
J'ai dû copier localement les modèles par défaut, puis les compléter :
- Copie
site-packages/sphinx/ext/autosummary/templates/autosummary/module.rst
a mytoolbox/doc/source/_templates/custom-module-template.rst
- Copie
site-packages/sphinx/ext/autosummary/templates/autosummary/class.rst
a mytoolbox/doc/source/_templates/custom-class-template.rst
Le crochet dans custom-module-template.rst
est en index.rst
ci-dessus, en utilisant le :template:
option. (Supprimez cette ligne pour voir ce qui se passe en utilisant les modèles de paquets de sites par défaut).
custom-module-template.rst
(lignes supplémentaires notées à droite) :
{{ fullname | escape | underline}}
.. automodule:: {{ fullname }}
{% block attributes %}
{% if attributes %}
.. rubric:: Module Attributes
.. autosummary::
:toctree: <-- add this line
{% for item in attributes %}
{{ item }}
{%- endfor %}
{% endif %}
{% endblock %}
{% block functions %}
{% if functions %}
.. rubric:: {{ _('Functions') }}
.. autosummary::
:toctree: <-- add this line
{% for item in functions %}
{{ item }}
{%- endfor %}
{% endif %}
{% endblock %}
{% block classes %}
{% if classes %}
.. rubric:: {{ _('Classes') }}
.. autosummary::
:toctree: <-- add this line
:template: custom-class-template.rst <-- add this line
{% for item in classes %}
{{ item }}
{%- endfor %}
{% endif %}
{% endblock %}
{% block exceptions %}
{% if exceptions %}
.. rubric:: {{ _('Exceptions') }}
.. autosummary::
:toctree: <-- add this line
{% for item in exceptions %}
{{ item }}
{%- endfor %}
{% endif %}
{% endblock %}
{% block modules %}
{% if modules %}
.. rubric:: Modules
.. autosummary::
:toctree:
:template: custom-module-template.rst <-- add this line
:recursive:
{% for item in modules %}
{{ item }}
{%- endfor %}
{% endif %}
{% endblock %}
custom-class-template.rst
(lignes supplémentaires notées à droite) :
{{ fullname | escape | underline}}
.. currentmodule:: {{ module }}
.. autoclass:: {{ objname }}
:members: <-- add at least this line
:show-inheritance: <-- plus I want to show inheritance...
:inherited-members: <-- ...and inherited members too
{% block methods %}
.. automethod:: __init__
{% if methods %}
.. rubric:: {{ _('Methods') }}
.. autosummary::
{% for item in methods %}
~{{ name }}.{{ item }}
{%- endfor %}
{% endif %}
{% endblock %}
{% block attributes %}
{% if attributes %}
.. rubric:: {{ _('Attributes') }}
.. autosummary::
{% for item in attributes %}
~{{ name }}.{{ item }}
{%- endfor %}
{% endif %}
{% endblock %}
143 votes
Personne n'a dit que c'était difficile. L'OP a dit que c'était fastidieux ce qui est le cas. Étant donné que d'autres systèmes de documentation peuvent le faire, ce n'est pas déraisonnable.
0 votes
Il suffit d'utiliser pdoc .