Hacia el AjGenesis Recipes

En estas semanas, estuve dando alguna charla explicando conceptos de generación de código en Tandil y en Corrientes, gracias a la gente del MUG. En esas charlas, muestro ejemplos de AjGenesis, proyecto que cumpliendo con el “dog fooding” uso todas las semanas. En la versión actual en desarrollo

AjGenesis 0.5

(publicada el 18 de Noviembre, no confundir con la anterior de Septiembre)

estoy experimentando en tener la capacidad de poder invocar a una o varias ventanas desde una tarea, para solicitar parámetros al usuario, interactivamente.

Si bien todo hasta ahora sale del modelo o modelos que tengamos serializados en archivos XML, bien puede ser cómodo, dependiendo de la tarea, pedir al usuario algún dato en el momento, como una conexión a base de datos.

Siguiendo con esa idea, encontrarán un nuevo proyecto experimental AjGenesis.Recipes que usa al nuevo proyecto AjGenesis.UI. Este último es el que tiene la definición de la ventana a usar para pedir información al usuario.

Veamos algunas ventanas de AjGenesis Recipes, para tener una idea de hacia dónde va la idea:

Al principio no muestra nada en el árbol. Pueden ir a File | Open… y elegir un archivo de recetas de ejemplo: Recipes.xml contenido en el directorio del código fuente del proyecto.

Este archivo contiene:

 

<?xml version="1.0" encoding="utf-8" ?> <Recipes Name="Recipes"> <Node Name="Hello World"> <Recipe Name="Hello World VB.NET Module" Task="Tasks/HelloWorldTask.ajg" Documentation="Tasks/HelloWorldTask.html"/> </Node> <Node Name="VB.NET"> <Recipe Name="Entities" Task="Tasks/Task1.ajg" Documentation="Tasks/Task1.html"/> <Recipe Name="Services"/> </Node> <Node Name="CSharp"> <Recipe Name="Entities"/> <Recipe Name="Services"/> </Node> </Recipes>

Cada nodo puede contener nodos y recetas. Una receta tiene un nombre, que se muestra en el árbol, una tarea, código de AjBasic a ejecutar, y un archivo que documenta en HTML a la receta.

Si hacemos doble click sobre la receta de Hello World VB.NET Module aparece una ventana, en la que indicamos el archivo de modelo a usar, y el archivo .vb a generar (estos son datos que se especifican en la tarea):

Lo nuevo es el archivo de tarea, que usa al nuevo proyecto AjGenesis.UI y su ventana. Veamos Tasks\HelloWorldTask.ajg:

 

form = UIManager.CreateInputForm() form.Text = "Class Generator Wizard" form.AddFileField("Model","Model to use","") form.AddFileField("FileName","File to Generate","") n = form.ShowDialog() if n = 1 then ModelFile = form.GetField("Model") FileName = form.GetField("FileName") ModelManager.LoadModel(ModelFile,Environment) TransformerManager.Transform("Templates/HelloWorldVb.tpl",FileName,Environment) end if

El UIManager es un nuevo manager en esta versión de AjGenesis. Noten cómo se puede definir una ventana, sus campos, procesarla, y tomar los campos de vuelta, para usarlos en el proceso de generación.

Todavía está en desarrollo, pero me pareció interesante comentar lo que se viene en esta nueva versión.

Vean que igual se sigue usando modelo. Prácticamente todas las recetas necesitarán uno o varios modelos desde donde partir. Pero con AjGenesis Recipes se podrá indicar el modelo interactivamente. Será cuestión de ver si los usuarios encuentran esta forma de operar útil o no, en contraposición a una serie de tareas NAnt ya armadas. También se pueden hacer recetas sin modelo: simplemente se alimenta de parámetros, por ejemplo, la conexión a una base de datos, y de ahí obtener la información que necesita para trabajar.

Me imagino que usando esta interfaz, podemos definir nuestros propios archivos de recetas, tareas, y plantillas, invocados desde este programa. Podemos tener una receta para generar todos los DAOs de un modelo de entidades, o una receta que nos pida cuál de las entidades generar. O una receta que pregunte si queremos usar NHibernate o directamente ADO.NET. O cuál es la base MySql que vamos a usar.

Próximos pasos:

  • Estabilizar el código (especialmente el manejo de directorios, su posicionamiento relativo)
  • Manejar mejor las excepciones
  • Capturar la salida de las tasks y mostrarlas en alguna ventana
  • Completar AjGenesis.UI para que maneje un conjunto interesante de controles (hoy apenas texto, elegir un directorio, y elegir un archivo) y una serie de ventanas como un wizard
  • Permitir el uso de controles y ventanas de usuario
  • Una vez hecha la experiencia de algunas recetas, ver si es interesante o útil o factible, integrarlo en Visual Studio (o por qué no, en Eclipse), a la GAT, o partiendo de Visual Studio Integration Package.

Sugerencias, comentarios, bienvenidos!

Nos leemos!

Angel “Java” Lopez
http://www.ajlopez.com/

This entry was posted in 1389, 2643, 6145. Bookmark the permalink.

Leave a Reply

Your email address will not be published. Required fields are marked *


*

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>