Geração automática de documentação a partir do código¶
Na seção anterior do tutorial você documentou manualmente uma função Python no Sphinx. No entanto, a descrição estava fora de sincronia com o próprio código, pois a assinatura da função não era a mesma. Além disso, seria bom reutilizar Python docstrings na documentação, ao invés de ter que escrever as informações em dois lugares.
Felizmente, a extensão autodoc fornece essa funcionalidade.
Reutilizando assinaturas e docstrings com autodoc¶
Para usar o autodoc, primeiro adicione-o à lista de extensões habilitadas:
extensions = [
'sphinx.ext.duration',
'sphinx.ext.doctest',
'sphinx.ext.autodoc',
]
Em seguida, mova o conteúdo da diretiva .. py:function
para a função docstring no arquivo Python original, como segue:
def get_random_ingredients(kind=None):
"""
Return a list of random ingredients as strings.
:param kind: Optional "kind" of ingredients.
:type kind: list[str] or None
:raise lumache.InvalidKindError: If the kind is invalid.
:return: The ingredients list.
:rtype: list[str]
"""
return ["shells", "gorgonzola", "parsley"]
Finalmente, substitua a diretiva .. py:function
da documentação do Sphinx por autofunction
:
you can use the ``lumache.get_random_ingredients()`` function:
.. autofunction:: lumache.get_random_ingredients
Se você agora construir a documentação HTML, a saída será a mesma! Com a vantagem de ser gerado a partir do próprio código. Sphinx pegou o reStructuredText da docstring e o incluiu, também gerando referências cruzadas apropriadas.
Você também pode gerar automaticamente a documentação de outros objetos. Por exemplo, adicione o código para a exceção Invalid KindError
:
class InvalidKindError(Exception):
"""Raised if the kind is invalid."""
pass
E substitua a diretiva .. py:exception
por autoexception
da seguinte forma:
or ``"veggies"``. Otherwise, :py:func:`lumache.get_random_ingredients`
will raise an exception.
.. autoexception:: lumache.InvalidKindError
E novamente, depois de executar make html
, a saída será a mesma de antes.
Gerando referências de API abrangentes¶
Enquanto usar sphinx.ext.autodoc
torna muito mais fácil manter o código e a documentação em sincronia, ainda requer que você escreva uma diretiva auto*
para cada objeto que você deseja documentar. Sphinx fornece ainda outro nível de automação: a extensão autosummary.
A diretiva autosummary
gera documentos que contêm todas as diretivas autodoc
necessárias. Para usá-la, primeiro habilite a extensão autosummary:
extensions = [
'sphinx.ext.duration',
'sphinx.ext.doctest',
'sphinx.ext.autodoc',
'sphinx.ext.autosummary',
]
Em seguida, crie um novo arquivo api.rst
com este conteúdo:
API
===
.. autosummary::
:toctree: generated
lumache
Lembre-se de incluir o novo documento na toctree raiz:
Contents
--------
.. toctree::
usage
api
Finalmente, depois de construir a documentação HTML executando make html
, ela conterá duas novas páginas:
api.html
, correspondente adocs/source/api.rst
e contendo uma tabela com os objetos que você incluiu na diretivaautosummary
(neste caso, apenas um).generated/lumache.html
, correspondendo a um arquivo reStructuredText recém-criadogenerated/lumache.rst
e contendo um resumo dos membros do módulo, neste caso uma função e uma exceção.
Cada um dos links na página de resumo irá levá-lo aos lugares onde você originalmente usou a diretiva autodoc
correspondente, neste caso no documento usage.rst
.
Nota
Os arquivos gerados são baseados em modelos Jinja2 que podem ser personalizados, mas isso está fora do escopo deste tutorial.