Extrayendo diagramas UML de código python con PyReverse

En la mayoría de proyectos Python de gran desarrollo, se hace necesario documentar el desarrollo de una aplicación.

A menudo se utilizan los diagramas UML, para ilustrar diagramas de clases, paquetes, etc.

Pyreverse es una utilidad que analiza el código fuente Python y extrae diagramas de clases y dependencias con paquetes.

En los diagramas generados se muestran:

  • Atributos de clases y si es posible su tipo
  • Métodos de clases
  • Enlaces de herencia entre clases
  • Enlaces de asociación entre clases
  • Representación de excepciones e interfaces

Nota: Esta utilidad ha sido integrada desde 2008 con Pylint a partir de la versión 0.15.

Instalación en Ubuntu 11.04

Puesto que Pyreverse esta integrado en Pylint y este utiliza Graphviz para generar los diagramas nos basta con instalar los siguientes paquetes:

sudo apt-get install graphviz pylint

A modo de ejemplo, utilizare el código fuente de Tivion, para generar algunos diagramas UML.

Generaramos con pyreverse, un archivo classes_Tivion.png aplicándolo a la carpeta src de Tivion:

pyreverse -o png -p Tivion src/

-o : establece el formato de salida
-p nombre : produce los archivos de salida añadiendo el nombre establecido

Esto generará un diagrama como el siguiente (haz click para agrandar):

Python Classes Tivion

Pero el layout por defecto, es algo espartano y podemos mejorarlo con otras hojas de estilo XML que definamos. Para ello necesitamos cambiar el formato de salida a .dot, para posteriormente generar un archivo SVG.

Generar el .dot

pyreverse -o dot -p Tivion src/

Generar el SVG a partir del DOT

dot -Tsvg classes_Tivion.dot > classes_Tivion.svg

Aplicar el layout mejorado

Para ello he utilizado el xsl definido aquí:

xsltproc notugly.xsl classes_Tivion.svg > classes_Tivion-notugly.svg

Esto mejora un poco, pero habría que editar el .dot para cambiar los estilos de cada “record”. Como prueba, he editado un par de records, cambiándoles el fondo, pero sería necesario automatizarlo, o incluso mucho mejor si pyreverse admitiera un xsl y lo generara ya con otro layout mas moderno.

El resultado es el siguiente (haz click para agrandar):

Python Class Tivion pretty layout
Python Class Tivion pretty layout

Fuentes

Pyreverse : UML Diagrams for Python

Making Graphviz output pretty with xsl

Making Graphviz output pretty with xsl (updated)