Documentación técnica con Sphinx, Paver y Cog
Posted on Thu 14 July 2016 in Documentación
Doug Hellmann presenta un workflow robusto para documentación técnica que elimina el trabajo manual repetitivo y los errores en ejemplos de código.
El problema a resolver¶
"Automation is important for my sense of well being. I hate dealing with mundane repetitive tasks."
Desafíos comunes: - Mantener ejemplos de código actualizados - Múltiples formatos de salida (HTML, PDF, blog) - Tareas repetitivas de construcción y publicación - Errores de copy-paste en output de programas
La solución: Trio de herramientas¶
Sphinx: Motor de documentación¶
- Conversión reStructuredText a múltiples formatos
- Temas personalizables con Jinja templates
- Generación automática de índices y referencias cruzadas
Paver: Automatización de builds¶
# pavement.py
@task
def html():
"""Build HTML documentation"""
call_task('cog')
sphinx_build('html')
@task
def pdf():
"""Build PDF documentation"""
call_task('cog')
sphinx_build('latex')
make_pdf()
Resuelve: Automatización de procesos repetitivos de construcción
Cog: Inserción automática de código¶
.. cog::
import cog
import subprocess
result = subprocess.run(['python', 'ejemplo.py'],
capture_output=True, text=True)
cog.out(result.stdout)
.. cog::
Ventaja clave: El output de programas se actualiza automáticamente al regenerar la documentación.
Workflow de producción¶
1. Escritura en reStructuredText¶
Ejemplo de uso
==============
Ejecutamos el script:
.. cog::
cog.out("$ python mi_script.py\n")
result = subprocess.run(['python', 'mi_script.py'],
capture_output=True, text=True)
cog.out(result.stdout)
.. cog::
2. Construcción automatizada¶
# Un solo comando para todo
paver html
# O para múltiples destinos
paver all_formats
3. Publicación multi-destino¶
- Python Module of the Week (PyMOTW)
- Blog personal
- Sitio web del proyecto
- O'Reilly blog
- Documentación PDF
Ventajas del enfoque¶
Consistencia garantizada¶
- Ejemplos siempre actualizados con el código real
- Formato uniforme across múltiples destinos
- Sin errores de transcripción manual
Eficiencia maximizada¶
- Un source, múltiples outputs
- Automatización completa del pipeline
- Focus en contenido, no en proceso
Mantenibilidad¶
- Cambios en una sola fuente se propagan automáticamente
- Testing integrado de ejemplos de código
- Versionado único para toda la documentación
Implementación práctica¶
# pavement.py completo
from paver.easy import *
import paver.doctools
@task
def cog():
"""Run Cog to update code examples"""
sh('cog -r *.rst')
@task
@needs('cog')
def html():
"""Build HTML docs"""
paver.doctools.html()
@task
@needs('cog')
def blog_post():
"""Generate blog post version"""
# Custom blog formatting
pass
Este workflow representa la automatización inteligente de documentación técnica: escribes una vez, publicas en todas partes, siempre actualizado.
Fuente original: Doug Hellmann