Blog de Contraslash (Legacy)

Usando Sphinx para documentar con docString en Django

May 24, 2016

Usando Sphinx para documentar con docString en Django

Para usuarios que venimos de Java, la documentación automática de código fuente es una herramienta importante para el mantenimiento de nuestros proyectos.

El DocString es una herramienta de python para mantener el código entendible a los desarrolladores, y existen herramientas para proporcionar documentación por este medio.

Sphinx es una poderosa herramienta para documentar documentación en Python, y podemos usarla para documentar nuestro proyecto en django.

Primero debemos instalar sphinx

pip install Sphinx

Luego, podemos ejecutar el comando de configuración automática de sphinx

sphinx-quickstart

Que nos llevará por una serie de pasos importantes, que podremos llenar con información de nuestro proyecto, pero quisiera darle importante a la activación de los módulos.

Please indicate if you want to use one of the following Sphinx extensions:
> autodoc: automatically insert docstrings from modules (y/n) [n]: y
> doctest: automatically test code snippets in doctest blocks (y/n) [n]: y
> intersphinx: link between Sphinx documentation of different projects (y/n) [n]: y
> todo: write "todo" entries that can be shown or hidden on build (y/n) [n]: y
> coverage: checks for documentation coverage (y/n) [n]: y
> imgmath: include math, rendered as PNG or SVG images (y/n) [n]: n
> mathjax: include math, rendered in the browser by MathJax (y/n) [n]: n
> ifconfig: conditional inclusion of content based on config values (y/n) [n]: n
> viewcode: include links to the source code of documented Python objects (y/n) [n]: y
> githubpages: create .nojekyll file to publish the document on GitHub pages (y/n) [n]: n

Al terminar el asistente, podremos ejecutar el siguiente comando

make html

Existen distintas opciones, pero quiero enfocarme en la generación del HTML.

Luego de esto, se crearán una serie de archivos, en la ubicación que definimos como Root Path, ahí encontraremos las siguientes carpetas

  • build
  • static
  • templates

Con el prefijo que nosotros hayamos definido.

En rootpath/prefijobuild encontraremos un archivo llamado conf.py, el cual debemos ajustar para que encuentre los módulos en python.

Para esto debemos añadir las siguientes líneas

sys.path.insert(0, os.path.abspath('ruta_proyecto'))
from django.conf import settings
settings.configure()

donde ruta_proyecto es la ubicación de nuestro proyecto.

Es importante definir estas líneas antes de que se defina la variable extensions, que debe parecerse a esta:

extensions = [
    'sphinx.ext.autodoc',
    'sphinx.ext.doctest',
    'sphinx.ext.intersphinx',
    'sphinx.ext.todo',
    'sphinx.ext.coverage',
    'sphinx.ext.viewcode',
]

Con el archivo de configuración listo vamos a crear un archivo por cada archivo donde queremos que se genere la documentación automática en una nueva carpeta que crearemos llamada modules.

Con esto tendremos una estructura de archivos similar a esto

documentacion/
    prefijo_build/
    prefijo_static/
    prefijo_templates/
    modules/
        app1/
             forms.py
            models.py
            views.py
        app2/
             forms.py
            models.py
            views.py
        .....
    conf.py
    index.rst

En cada archivo vamos a escribir el siguiente contenido

modules/app1/forms.py

Formularios de app 1
=================

.. automodule:: app1.forms
    :members:

Donde la primera línea es el título del módulo y en la cuarta lína está la ubicación del archivo con el código fuente.

Por último en documentacion/index.rst vamos a añadir las rutas de los archivos que acabamos de crear

.....
Contents:

.. toctree::
   :maxdepth: 2

   modules/app1/forms
   modules/app1/models
   modules/app1/views

.....

Por último re ejecutaremos el comando de generación de documentación

make html

Y la documentación se creará.

Este post está basado en este post