Personal Website

lunes, 6 de diciembre de 2010

NINJA-IDE, Un IDE Pensado para Python

Este es el articulo que escribí para la segunda edición de la PET (la revista: Python Entre Todos)... que esperemos que salga pronto (cof cof... mi palito para si alguien de la PET lo lee :P, hay muchas ganas de leer lo que se junto de la PyCon!!)

NINJA-IDE, Un IDE Pensado para Python

Autores: Diego Sarmentero
Estudiantes de Ing. en Sistemas que les gusta desarrollar software libre por amor al arte.

Como comenzó NINJA-IDE?
NINJA-IDE nació por unos mails enviados a PyAr, cuya temática suele escucharse con bastante frecuencia: "Qué buen IDE para Python puedo usar?", "Por qué no hay un IDE para Python que tenga tal o cual característica?", y las respuestas a estos mails siempre terminan siendo mas o menos las mismas, ya que los IDEs actuales que encontramos disponibles, en su gran mayoría, no estaban diseñados para Python, sino que brindaban la opción de incorporarlo mediante algún Plugin y de esta forma se solía estar utilizando IDEs muy pesados diseñados para otros fines, donde el soporte para Python en realidad era mínimo, y aquellos que si eran para Python terminaban siendo muy orientados a un Framework especifico o no eran Libres. Entonces, motivados por el desafío que representaba, y por ideas interesantes que se plantearon en la lista de correo, decidimos encarar este proyecto enfocándonos en "qué características debería tener un buen IDE para un programador Python". Con esto en mente comenzamos el desarrolló de NINJA-IDE, el cual posee su nombre por el acrónimo recursivo: "Ninja Is Not Just Another IDE". El IDE tiene apenas poco más de dos meses de desarrollo, pero gracias a las ganas y las horas de programación que le estamos dedicando, ya podemos contar con un IDE con muchas funcionalidades implementadas, hasta el punto de poder continuar con el desarrollo de NINJA-IDE utilizando NINJA-IDE, lo cual a su vez nos ayuda para encontrar bugs y mejorar la usabilidad y practicidad de la aplicación, a través de la experiencia y uso continuo de la misma.

El proyecto esta desarrollado bajo licencia libre GPL y puede conseguirse el código a través de:

Algunas de las Features actuales del IDE son:
  • Funcionalidades típicas de cualquier IDE para el manejo de archivos, de Tabs, indentación automática, Zoom en Editor, etc.
  • Al estar escrito en Python y utilizar PyQt, es multiplataforma y fue probado en sistemas Linux, MAC OS X y Windows.
  • Resaltado de Sintaxis para un gran variedad de lenguajes (si bien esta centrado en Python, brinda el resaltado de sintaxis para otros lenguajes más para comodidad del programador).
  • Posibilidad de usar una Consola Python desde el mismo IDE.
  • Permite el manejo de Proyectos en el IDE, reconociendo los mismos como Proyectos Python y a través del IDE crear nuevos archivos y carpetas, borrar archivos existentes, creación automática de archivos "__init__" con la información dentro de ese módulo, etc.
  • Permite ocultar y reubicar todos los paneles de la interfaz de una forma muy simple, permitiendo que sea adaptado a los gustos del usuario.
  • Permite ver más de un Editor al mismo tiempo de forma vertical u horizontal.
  • Extensible a través de la incorporación de Plugins (los cuales pueden crearse utilizando un Plugin de NINJA-IDE para mayor simplicidad).
  • Maneja sesiones del IDE, para recordar que archivos y proyectos se encontraban abiertos cuando se cerró y los recupera al abrir nuevamente una instancia del mismo.
  • Soporte para Auto-completado (siendo un auto-completado especifico del objeto al que se esta accediendo).
  • Actualizaciones automáticas.
  • Y muchas características más!



Quienes desarrollamos NINJA-IDE?
NINJA-IDE comenzó siendo desarrollado por Diego Sarmentero, y a las 2 semanas de haber comenzado el proyecto ya estaba siendo utilizado para desarrollar el mismo. Gracias a la gente de la Lista de PyAr, Blogs, etc. en muy poco tiempo la difusión del proyecto hizo que pudiéramos estar contando con Reporte de Bugs por parte de Usuarios, Sugerencias en la lista de correo de NINJA y hasta con aportes de código por parte de usuarios y colaboradores, de los cuales algunos pasaron a formar parte de NINJA-IDE con el rol de commiters, como es el caso de: Martín Alderete, Juan Cabral y Matías Herranz. Esta fuerte colaboración y participación que estamos recibiendo de la comunidad permite que NINJA-IDE pueda crecer cada día más, mejorando e implementando caracterísitcas que los usuarios necesitan. A su vez los comentarios que recibimos de personas usando actualmente NINJA-IDE, nos motivan a seguir trabajando duro en esta herramienta, con la cual deseamos simplificar aún más el desarrollo de aplicaciones Python.

Para ponerse en contacto con cualquiera de los miembros del proyecto se puede utilizar:

Cómo decidimos que características agregar?
Al comenzar el proyecto se pensó en una estructura que le permitiera al mismo crecer e incorporar funcionalidades a lo largo del tiempo, teniendo como guía dos factores principales: el Editor de Código y el Manejo de Proyectos. La aplicación comenzó a construirse cuidando estos dos pilares fundamentales y permitiendo que una buena base de los mismos facilitara luego la incorporación de nuevas características. El proyecto fue pasando por distintas etapas, comenzando por un buen editor con resaltado de sintaxis, siguiendo con el manejo de archivos de proyecto, hasta agregar características de plugins, auto-completado, manejo de sesión, etc. Muchas veces se ve a Python como un lenguaje que presenta mayores dificultades para brindar información sobre el código que se esta escribiendo al no poder hacer inferencia de los objetos en el momento de la programación a causa del tipado dinámico, etc.
En algunos casos, es cierto que al contar con un tipado explicito se pueden realizar análisis más simples y detallados, pero también es cierto que actualmente existen muchas herramientas y librerías para Python que ayudan a eliminar este tabú de que no es posible contar con un IDE que brinde real asistencia sobre el código que se esta generando. Es por eso que NINJA-IDE busca permitir que aquellos programadores que utilizan Python para desarrollar sus programas, cuenten con las mismas facilidades y ayudas que se obtienen al desarrollar en Java o .NET con alguno de los IDEs más conocidos actualmente para esos lenguajes. Tomando los resultados y experiencias obtenidas de IDEs para otros lenguajes, se pretende lograr un IDE pensado para Python que genere la misma satisfacción al usarlo.
Para la sugerencia, decisión e incorporación de nuevas características en NINJA-IDE se suele utilizar la lista de correo para lograr una decisión colectiva por parte de los miembros que componen el proyecto, más que nada para saber cual será el objetivo de esta característica, en que etapa debería incorporarse y demás detalles. Muchas veces estas características son motivadas por alguna funcionalidad interesante vista en otro IDE, una idea de alguno de los miembros o sugerencias del grupo de usuarios. De este modo, cualquier persona, tanto usuario como desarrollador, puede plantear que cosas le gustaría ver implementadas en NINJA-IDE y en base a la arquitectura del proyecto se podrá definir si es necesario incorporarla como parte del IDE mismo o como un plugin, permitiendo a la vez conocer que ideas se están trabajando y quienes asumen el control de las mismas para mantener al grupo de trabajo sincronizado.



Que esperamos de NINJA-IDE?
NINJA-IDE nace para cubrir una necesidad que nos parecía importante, y además veíamos que los enfoques actuales de los IDEs no brindaban la cobertura necesaria.
Nuestra intención al iniciar este proyecto fue crear un entorno centrado en el desarrollo de aplicaciones Python, pero siempre teniendo en cuenta la necesidad de contar con una comunidad de usuarios que nos permitiera mejorar la experiencia de uso de esta herramienta, y actualmente nos pone muy contentos poder estar contando con la comunidad de NINJA-IDE, ya que gracias a la experiencia y conocimiento colectivo de los usuarios es posible, que con sus sugerencias, el desarrollo del proyecto pueda avanzar más rápido y se tengan en cuenta muchos más detalles que de otra forma podrían ser pasados por alto.


Planes para el Futuro
Actualmente con el desarrollo continuo que estamos logrando, nos encontramos próximos a la liberación de la versión 1.0 de NINJA-IDE, la cual recibirá la denominación de 'Kunai'. En esta primera versión estarán presentes varias de las características mencionadas previamente, las que permitirán al desarrollador contar con un IDE robusto y práctico, obviamente como en todo proyecto irán surgiendo mejoras y nuevas features para implementar. Algunas de las cosas que están pensadas para ser incorporadas en NINJA-IDE en futuras versiones son:
  • Debuguer Gráfico
  • Poder ver la navegabilidad y relación de los módulos y clases de un proyecto de forma gráfica (basado en BlueJ)
  • Soportar herramientas de versionado de código.
  • Permitir la edición colaborativa de un documento.
  • Diseñador de interfaces Qt y Gtk integrado en el IDE.
  • Soporte para Frameworks como:
    • Django
    • Google App Engine
  • Y esto apenas está comenzando!

Qué herramientas utiliza NINJA-IDE?
El IDE es desarrollado utilizando el framework de PyQt para todo el manejo de la Interfaz Gráfica y algunas otras funcionalidades, aunque se intento abstraer lo más posible ciertas funciones para permitir, de ser necesario el día de mañana, portar NINJA-IDE a otros frameworks como Gtk. Qt permitió contar con una interfaz solida y altamente configurable, lo que hizo posible poder extender de cada elemento necesario para modificar su comportamiento y adecuarlo a las necesidades del IDE. En cuanto al resaltado de sintaxis, NINJA-IDE hace uso de su propio sistema de resaltado de sintaxis utilizando funcionalidades de Qt, y permitiendo que este sistema de resaltado sea fácilmente extensible en NINJA-IDE con la creación de un simple archivo JSON que describa al lenguaje que se desea incorporar. Este método brinda mejoras en la performance, pero para cubrir aquellos lenguajes que no sean reconocidos a través de este sistema se incorporó el uso de Pygments para el resaltado de sintaxis de una mayor variedad de lenguajes. Aunque actualmente se está plantenado la posibilidad de que Pygments sea reemplazado por GNU Highlight por cuestiones de performance. Para las funcionalidades de auto-completado, refactoring, y aquellas que se refieren a la inferencia del código, se utiliza Rope, la cual es una excelente librería, muy completa para este tipo de situaciones. Rope es una herramienta que permite llevar a un IDE para Python características de IDEs de lenguajes tipados. Actualmente también estamos trabajando en la incorporación de Chequeo de código utilizando la librería de Pep8, justamente para brindar información acerca del estado del código en relación a las normas de la Pep8.


Extensibilidad de NINJA-IDE
NINJA-IDE cuenta con un sistema de plugins bastante completo que permite la integración de dichos complementos como un elemento nativo del IDE. La escritura de Plugins es bastante sencilla y hasta se puede utilizar un Plugin de NINJA-IDE para la escritura de Plugins para NINJA-IDE (recursivo?). Este Plugin "para escribir Plugins" permite decidir con que partes del IDE el nuevo complemento se va a relacionar y crea de forma automática la estructura del proyecto necesario, junto al descriptor del Plugin para que NINJA-IDE lo pueda interpretar y la clase base de ese Plugin con los métodos que serán necesario reimplementar, a su vez, al terminar con la escritura del Plugin nos permite empaquetarlo para luego poder distribuirlo. Actualmente existen 3 Plugins para NINJA-IDE disponibles:
  • Pastebin: el cual permite enviar código a pastebin.com y devuelve el link resultante para poder compartir ese código.
  • PluginProject: el encargado de crear proyectos Plugins para NINJA-IDE como mencionábamos.
  • ClassCompleter: completa de forma automática algunas estructuras mientras se esta escribiendo código Python, como por ejemplo: crear el constructor de forma automática realizando la llamada a las Clases Padre que sean necesarias, etc.
Para consultar mayor información acerca de como desarrollar un Plugin para NINJA-IDE, se puede visitar la siguiente Wiki: http://code.google.com/p/ninja-ide/wiki/CrearPlugins

1 comentario:

Anónimo dijo...

Hey, I am checking this blog using the phone and this appears to be kind of odd. Thought you'd wish to know. This is a great write-up nevertheless, did not mess that up.

- David