Estructura aplicaciones PyGTK

Quiero explicaros una de las cosas que veo menos en los tutoriales y es sobre las estructuras de directorios para aplicaciones Python. Sigue una estructura parecida a las de Unix (¿POSIX?). Esta es la que he seguido para mcm y estoy bastante satisfecho con ella, por lo que voy a utilizarla como ejemplo:
  • mcm
    • doc
      • INSTALL
      • CHANGELOG
      • BUGS
      • manpage
    • conf
    • logs
    • bin
      • mcm.sh
    • mcm
      • __init__.py
      • terminal
        • __init__.py
      • common
        • __init__.py
        • utils.py
        • models.py
        • controllers.py
        • exceptions.py
      • gtk
        • __init__.py
        • mcm-gtk.py
        • mcm.glade
        • mcm_icon.png
      • qt
        • __init__.py
        • mcm-qt.gtk
Una aplicación no es sólo el código fuente, por lo que el orden en la documentación, ficheros de configuración y otros, merecen un lugar donde desarrollarse de forma independiente al desarrollo de la aplicación misma.
Cada páquete o modulo de Python es definido por el fichero __ini__.py y serán estos los que podremos importar dentro de nuestros modulos y conseguir un empaquetado bien definido que nos permitira cumplir con facilidad el principio DRY.
De igual forma podemos ver que la misma estrúctura de directorios define un modelo MVC lo que facilita mucho el desarrollo para diferentes presentaciones. En mcm, reutilizamos las clases y métodos definidos para la aplicación CLI en las aplicaciones gráficas para GTK y Qt. Esto lo logramos, en el caso de GTK definiendo distintos eventos que utilizan a los controladores para crear y modificar nuestros modelos. Por ejemplo veamos como añadimos una conexión desde la vista GTK:

  • def add_event(self, widget):
  •     # Obtenemos de distintas formas los datos necesarios
  •     connection = connections.connections_factory(x, y, z, a, b, c, d)
  •     connections.append(connection)
  • def save_and_quit(self):
  •      dao = Dao()
  •      dao.save(connections)
Lo mejor es que esto mismo lo hacemos en la parte Qt y cualquier otra vista que se nos ocurra.