martes, 19 de enero de 2010

Testing del ORM

En la línea de acción que estamos siguiendo para estabilizar el framework, estamos implementando un set de pruebas para YORM, el componente de ORM de Yupp Framework. Los tests se centran en la generación de las tablas en la base de datos, guardar correctamente estructuras complejas de datos, obtener estructuras complejas de datos desde la base, y verificar restricciones sobre los datos que se intentan guardar en la base.

Con esto lograremos encontrar las debilidades del YORM, al mismo tiempo que demostramos las fortalezas que tiene actualmente.

Los juegos de tests pueden ser descargados del SVN en nuestro sitio en Google Code: http://code.google.com/p/yupp/source/checkout

De esta forma nos acercamos a una versión estable de Yupp Framework, garantizando su poder para crear proyectos web de forma ágil y sencilla, ordenando el desarrollo y evitando las tareas repetitivas.


Actualización:
Uno de los tests que estoy desarrollando es el de probar estructuras de árboles en la base de datos. La prueba consiste en implementar una clase persistente en YORM, la cual es una página web, que a su vez puede tener subpáginas. Aquí está la implementación de la clase:

class Pagina extends PersistentObject
{
   function __construct($args = array (), $isSimpleInstance = false)
   {
      $this->setWithTable("test_a004_pagina");

      $this->addAttribute("titulo",  Datatypes :: TEXT);
      $this->addAttribute("contenido", Datatypes :: TEXT);

      // Pagina padre
      $this->addHasOne('owner', 'Pagina');

      // Paginas hijas
      $this->addHasMany('subpages', 'Pagina');

      $this->addConstraints(
         "titulo",
         array (
            Constraint :: maxLength(255)
         )
      );
      $this->addConstraints(
         "contenido",
         array (
            Constraint :: maxLength(100000)
         )
      );
      $this->addConstraints(
         "owner",
         array (
            Constraint :: nullable(true) // Las paginas del primer nivel no tienen padre.
         )
      );

      parent :: __construct($args, $isSimpleInstance);
   }

   // Mas codigo ...
}

Y ahora la prueba de cómo generar una estructura de árbol y guardarla en la base. Lo que vamos a hacer son 4 instancias de la clase Pagina, la primera es la página raíz, la segunda es hija de la página raíz y las dos restantes son a su vez hijas de esta última. Con el siguiente código no solo creamos la estructura de árbol de páginas, si no que vamos a ver que toda la estructura se guarda automáticamente en la base con una única línea de código por parte del programador!!!

$p1 = new Pagina(
        array(
          "titulo" => "Pagina raiz",
          "contenido" => "This step is usually done transparently as most compilers perform it and then invoke the assembler..."
        )
      );
      $p11 = new Pagina(
        array(
          "titulo" => "Subpagina de raiz 1",
          "contenido" => "This step is usually done transparently as most compilers perform it and then invoke the assembler...",
          "owner" => $p1
        )
      );
      $p111 = new Pagina(
        array(
          "titulo" => "Sub subpagina de raiz 1",
          "contenido" => "This step is usually done transparently as most compilers perform it and then invoke the assembler...",
          "owner" => $p11
        )
      );
      $p112 = new Pagina(
        array(
          "titulo" => "Sub subpagina de raiz 2",
          "contenido" => "This step is usually done transparently as most compilers perform it and then invoke the assembler...",
          "owner" => $p11
        )
      );
      
      
      // subpaginas de p11
      $p11->addToSubpages($p111);
      $p11->addToSubpages($p112);
      
      // subpaginas de p1
      $p1->addToSubpages($p11);
      
      // Guarda toda la estructura con esta única línea de código!
      if (!$p1->save())
      {
         Logger::struct( $p1->getErrors(), "Falla test A004.2 1" );
      }
      else
      {
         echo "Guarda Ok";
      }

sábado, 5 de diciembre de 2009

ORM de nivel enterprise

Si bien nos falta recorrer un largo camino vamos hacia ese objetivo: llegar a un ORM de nivel "enterprise". YORM, el ORM de Yupp Framework hoy está soportando las siguientes características:

  • Mapeo de clases con atributos de diversos tipos (TEXT, DATE, BOOLEAN, INT, FLOAT, entre otros)
  • Mapeo de estructuras de herencia en 2 sabores: cuando la clase A hereda de la clase B se puede optar por "mapeo de herencia en tabla única", entonces A y B se mapean a la misma tabla, o por "mapeo de herencia de múltiple tabla" donde A y B se mapean a distintas tablas, cualquiera de las opciones es transparente para el programador.
  • Mapeo de relaciones entre clases: estamos soportando relaciones unidireccionales y bidireccionales con cardinalidades 1-1, 1-N y N-N.
  • Las relaciones múltiples pueden ser de 3 tipos: colecciones, listas o conjuntos. Las colecciones pueden tener elementos repetidos y desordenados, las listas tienen elementos ordenados, y los conjuntos no tienen repetidos.
  • Estamos soportando 3 bases de datos: MySQL, SQLite y el último agregado PosgreSQL.
  • Podemos definir restricciones sobre los datos y esas restricciones se verifican antes de ingresar cualquier dato a la base.
  • Salvado en cascada: simplifica el código PHP al salvar en la base una estructura compleja de clases relacionadas a partir de la invocación al método save() en la clase principal.
  • Carga perezosa: cuando se carga una clase desde la base no se cargan sus clases asociadas, las mismas son cargadas una vez que son referenciadas, o sea que si no se usan, no se cargan, ahorrando tiempo.
  • Creación automática del esquema de en la base de datos: crea todas las tablas necesarias haciendo un clic.
Qué esperamos para el futuro en ORM:
  • Soporte para más bases de datos: Oracle, SQLServer, Access, etc.
  • Soporte para persistencia de colecciones de valores simples (Strings, Integers, Dates, etc).
  • Soporte para transacciones y rollback.
  • Capacidad de especificar los nombres de las columnas donde se guardan los campos de las clases.
  • muchas otras características...
¡Aceptamos sugerencias!
-

martes, 1 de diciembre de 2009

Liberamos Yupp PHP Framework v0.1.7

-
Luego de largas horas de trabajo estamos muy contentos de liberar la nueva versión de Yupp PHP Framework.


Las diferencias con la versión 0.1.6.7 son:
  1. Se corrije un bug que se liberó con Yupp 0.1.6.7 en la clase routing.Executer, pasaba cuando se retornaba null de una accion de un controller.

  2. Corrección de DatabaseMySQL en consultas que buscan por strings numéricos.

  3. Se eliminaron las clases Filter y Mapping, y se creó una clase Router que cumple las tareas de las elminadas y es mucho mas simple de usar. (http://code.google.com/p/yupp/issues/detail?id=10)

  4. YuppContext se quitan pasajes por referencia.

  5. Se agregan pruebas de generacion de controles complejos en formularios: html y calendar. html usa TinyMCE y calendar usa YUI Calendar. Se agregan ambas librerias al framework.

  6. Primer integración de PostgreSQL a Yupp. Nueva clase DatabasePosgreSQL.

  7. Correcciones a DAL, PersistentObject y PersistentManager.


Descargas:
http://code.google.com/p/yupp/downloads/list
http://www.simplewebportal.net/host/1022.htm

TAG SVN:
http://code.google.com/p/yupp/source/browse/#svn/tags/v017

Cualquier duda, consulta o reporte de error pueden hacerla en el grupo google (opción "debates > nueva entrada"):
http://groups.google.com/group/yuppframeworkphp


Hasta pronto!

Pablo Pazos Gutiérrez
Líder de proyecto
Yupp PHP Framework

-
-

lunes, 23 de noviembre de 2009

Próxima liberación de Yupp Framework

Amigos, como todos quienes siguen el grupo sabrán, en la última
versión de Yupp (v0.1.6.7) se me coló un bug en la clase Executer que
no permitía el correcto funcionamiento del framework. Si ven en un
post previo adjunté la solución, esta solución también fue subida al
SVN como todos los cambios que voy haciendo: http://yupp.googlecode.com/svn/trunk/

Ahora me encuentro integrando PostgreSQL al framework. La próxima
versión será la 0.1.7 y aparte de PostgreSQL vendrá con algunos
frameworks Javascript adjuntos, con los cuales estoy haciendo pruebas
de integración, como el editor WYSIWYG TinyMCE y el YUI Calendar.
También hice una siplificación del Router, creando una sola clase y
eliminando las clases Filter y Mapping (ahora todas sus
funcionalidades están en la clase Router).

En definitiva, la próxima versión podrá usarse con cualquiera de estos
DBMS: MySQL, SQLite o PostgreSQL.

domingo, 1 de noviembre de 2009

Cómo crear un blog, paso a paso

He actualizado el documento de como crear un blog simple con Yupp PHP Framework para su última versión 0.1.6.7.

El documento puede descargarse desde: http://code.google.com/p/yupp/downloads/list

La última versión del framework se puede descargar desde el mismo sitio y contiene la implementación del blog para poder ver el producto final de lo que se muestra en el documento.

Cualquier duda o comentario la pueden colgar en nuestro grupo: http://groups.google.com/group/yuppframeworkphp


Hasta pronto.

martes, 27 de octubre de 2009

Yupp Portal v0.1

Estamos muy contentos de poder liberar la primer versión del componente para crear portales web de Yupp Framework: Yupp Portal

¿Para qué sirve Yupp Portal?

Es una herramienta de alta productividad que permite crear un portal web completo en 5 minutos, sin necesidad de programación extra, solamente es necesario configurar la conexión con la base de datos.

Este componente permite:

Administrar páginas:
  • Crear páginas con un clic
  • Editar contenido con editor visual desde la web
  • Estados de páginas: Normal, Borrador, Deshabilitada, Oculta
  • Edición visual de items del menú principal
  • Edición visual de contenido fijo (por ejemplo banners que se muestran en todas las páginas)
Administración de usuarios:
  • Administración de roles
  • Crear/Editar/Eliminar/Aprobar usuarios
  • Registro de usuarios y aprobación con email en un clic
  • Login/Logout
Tres roles disponibles:
  • Administrador: crea/edita páginas, modifica el menú, crea/edita usuarios
  • Editor: crea/edita páginas, modifica el menú
  • Usuario: ve páginas ocultas

Por más información: http://code.google.com/p/yupp-portal/

domingo, 25 de octubre de 2009

Liberamos Yupp PHP Framework v0.1.6.7

Amigos, estamos muy contentos de anunciar la liberación de la nueva versión de Yupp PHP Framework.


Las diferencias con respecto a la versión 0.1.6.4 son:

1. Correccion a YuppForm en el campo date.

2. Se agrega el método YuppController.componentControllersAction() que sirve para mostrar los controladores de un componente dado.

3. Se agrega la restricción "inList" que permite verificar si un valor está en una lista de valores dados.

4. Se agrega el metodo PersistentObject.hasFieldErrors( $attr ) para preguntar si existen errores en el valor de un atributo particular.

5. Se agrega el metodo PersistentObject.attributeDeclaredOnThisClass() para saber si un determinado atributo fue declarado en una clase. Sirve para derivar los nombres de las tablas intermedias en relaciones multiples.

6. Se agrega el helper DisplayHelper.yupp_select para crear selects html de forma sencilla.

7. Se corrije el metodo PersistentObject.validate() para que priorice la validacion de nulos y vacios sobre el resto de las validaciones. Ahora si un valor es nullable(true) y tambien debe ser email(), la validacion de un valor vacío devuelve true, antes fallaba en la validacion de email.

8. Correcciones menores en la clase Contraints.

9. El método PersistentObject.setProperties() ahora hace trim de los valores antes de asginarlos a los campos, esto es para evitar el llenado accidental de datos con espacios en blanco delante o detrás del valor ingresado.

10. Agregamos soporte para varios subdirectorios dentro del directorio de clases de modelo, para ordenar las clases cuando son muchas.
- Se corrige el metodo ModelUtils.getModelClasses() para poder crear subdirectorios en el directorio del modelo de un componente.
- Correccion al metodo YuppConventions::getModelPath().
- Correccion en PackageNames a una expresion regular para poder poner subdirectorios en el modelo.
- Correcciones en YuppLoader, en el cargado del modelo para permitir definir clases en subdirectorios.

11. Corrección en el método YuppConventions::relTableName(..) donde se creaba mal el nombre de la tabla intermedia para relaciones hasMany si se trataba de salvar una subclase y el atributo estaba declarado en su superclase.

12. Se corrige el helper Helpers.template() para mejorar el pasaje de parametros.

13. Correccion en el mapeo de herencia de tabla multiple para soportar modelos de relaciones y herencia complejos (PersistentManager, PersistentObject, MultipleTableInheritanceSupport).

14. Se corrije el metodo YuppController::getFlash() y se hace limpieza.

15. Corrección de la comparación de strings para generar consultas MySQL (donde el "=" no considera mayúsculas y minúsculas)
- Se reescribió completamente la evaluación de QUery que genera las consultas SQL, para que considera las particularidades de cada DBMS (MySQL, SQLite, PostgreSQL, etc)


Descargas:
http://code.google.com/p/yupp/downloads/list
http://www.simplewebportal.net/host/1022.htm

TAG SVN:
http://code.google.com/p/yupp/source/browse/#svn/tags/v0167

Cualquier duda, consulta o reporte de error pueden hacerla en el grupo google (opción "debates > nueva entrada"):
http://groups.google.com/group/yuppframeworkphp


Hasta pronto!

Pablo Pazos Gutiérrez
Líder de proyecto
Yupp PHP Framework