Archive for the ‘zope3’ Category

¿Dónde está la documentación de Zope3?

Monday, October 1st, 2007

Zope siempre ha sido acusado de estar poco o mal documentado.

Bueno, yo pienso radicalmente lo contrario, como muchos de la comunidad, pero nunca está bien acomodarse en una postura y despreciar la opinión de otros por infundada que te parezca.

Si actuamos de abogados del diablo, hacemos un esfuerzo de empatía y nos ponemos en el lugar del que se acerca a zope3 por primera vez, nos damos cuenta que la documentación de Zope no está muy visible.

Cada instalación de zope tiene una documentación del api generada de forma dinámica que explica de forma exhaustiva cada método, clase, interfaz y adaptador de los que tiene Zope.

¿Cómo no va a estar zope documentado si cada declaración de función o clase lleva incluida la propia documentación? Gracias a la herramienta apidoc, podemos hacer en cualquier momento un ejercicio de introspección sobre cualquier objeto Python y leer cómodamente su documentación.

Pero lo que la gente aprecia como buena documentación es una URL (una sola), que apunte a una sección de un web site (uno solo), donde aparezca toda la documentación disponible, donde uno por uno se describa cada objeto, clase, interfaz o adpatador de Zope.

Bien, uno de los frutos del Foliage Sprint, celebrado la semana pasada está, precisamente, relacionado con esta hambre de documentación.

Julian Bonilla, Graham Stratton y Stephan Richter han completado la tarea de crear una versión estática de la documentación del API de Zope3, para poder dejarla disponble en una URL en zope.org

Para que no se diga que no hay documentación de Zope3:

http://apidoc.zope.org

El desarrollo de aplicaciones web con Python sobre Zope, ahora más elegante

Monday, July 9th, 2007

Antes, para desplegar una apliación había que instalar una gigantesca instancia de Zope e insertar tu código en su carpeta de productos.

Ahora, programar una aplicación consiste en programar un módulo Python e instalar solo las dependencias necesarias de módulos de zope.*

En su momento, una de las características que más sedujo a la comunidad fué el ZMI, el interfaz de administración web. Mediante el ZMI, es posible programar plantillas y scripts Python a través del navegador. Esta forma ágil ha hecho las delicias de programadores y no programadores que necesitaban publicar contenidos en la web y administrarlos de forma segura y en colaboración.

El ZMI, en seguida quedó en evidecia y dejó de manifiesto que para desarrollar grandes aplicaciones deja bastante que desear.

Desde casi el principio, todo desarrollo serio se hizo mediante la construcción de Productos Zope.

Ahora Zope3 ha llegado y ha impuesto, con su modelo de interfaces y adaptadores, un estilo sostenible de programación en zope. Además, recientemente, se propone un nuevo modo de desplegar las aplicaciones zope más modular y flexible.

Como adelantaba hace tiempo Jim Fulton, el enfoque de despliegue de zope3 debía romper con el tradicional definido desde timepos de zope2:

- instalar una instancia en que escucha un determinado puerto

- programar en Python tu aplicación, heredando de las clases necesarias para convertir tus objetos Python en zObjects

- insertar tu código en la carpeta de productos

Esta forma de trabajo comenzaba con la aplicación “mkzopeapp” que creaba la instancia inicial sobre la que programar. Ahora, con mkzopeapp y la redistribución de zope3 en forma de huevos Python, la cosa cambia.

Como nos cuenta Philipp Von Weiterhausen

El ciclo de desarrollo será parecido a lo siguiente:

- crear un módulo Python. (mkzopeapp facilita esta tarea creando para ti un módulo con los imports básicos necesarios)

- definir los parámetros de desplpiegue mediante un fichero de configuración

- instalar las dependencias (servidores, lenguajes de plantillas, etc.) que están disponibles en los módulos zope.* aunque serán intercambiables por otros componentes de la comunidad Python.

La comunidad zope está trabajando duro en el tema de despliegue y ya se están viendo agradables resultados, ej:buildout, paste.deploy, etc.

TriZPUG Camp Five – VIII

Sunday, March 18th, 2007

Ya nos volvemos al solar patrio, a euskalherria, al reinado de españa, a europa, a indoeuropa o a eurasia. Después de atraversar tantas fronteras y aduanas no comprendo a donde diantres llego. Volvemos a casa.

La experiencia ha sido genial, y eso que lo escribo en caliente, sin apenas reposar los recuerdos y sin desechar los malos como acostumbra la optimista, selectiva y humana memoria mía.

Aunque no hemos venido como “sprinters esponsorizados”, el viaje ha costado mucho. Hemos de agradecer, especialmente a CodeSyntax

, nuestra empresa, todo: los gastos, el tiempo cedido, los ánimos y la fe y confianza en nosotros. Gracias por el esfuerzo. Esperamos rentabilizarlo. Nuestra mente hierve de ideas, planes y hojas de ruta.

Gracias a esos clientes por entender lo ininteligible. Gracias por tolerar las molestias que una semana fuera de la oficina puede causar. La tecnología no solo es apasionante, sino que garantiza las mejores soluciones para ellos.

Mujer, familia y amigos. Han puesto lo suyo. Aunque no me habrán echado de menos como yo a ellos, se agradece el permiso que me he tomado, lo poco que han rechistado y los cientos de minutos al otro lado del chat y teléfono.

Gracias también a los chicos del TriZPUG por no haber pasado ningún detalle por alto. Gracias a Philip por ese saber llevar ese talento y gracias a los demás gurús que se han dejado caer por el sprint.

Detectando y corrigiendo bugs en Zope3

Saturday, March 17th, 2007

Anoche Mikel y yo no fuimos al RockFest del Camp5. Fatigados de actos sociales en lengua extranjera, nos quedamos programando tan panchos en el hotel.

Probando el SetIndex que Zope Corporation ha publicado para el catalogo de Zope3, detectamos un comportamiento que no nos gustaba.

Me pongo a contaros esto con la emoción de quien descubre y corrige su primer bug. Absteneos, pues, de juzgar el mérito y la vanidad de este humilde escritor de código y blog.

En Zope3, el comportamiento esperado de los programas se documenta con DocTests. Los primero que hemos hecho ha sido modificar el DocTest para que refleje el comportamiento que, creemos, es el correcto.:

setindex.txt.patch


 # diff -u zc.catalog-1.1-py2.4.egg/zc/catalog/setindex.txt zc.catalog-1.1-py2.4.egg/zc/catalog/setindex.txt.new > setindex.txt.patch

Después hemos modificado el código para que realice lo que queremos:

index.py.patch

# export PYTHONPATH=/opt/Zope-3.3.0/lib/python# /opt/Python-2.4.3/bin/python zc/catalog/tests.py

¿Cómo se aplican los ficheros patch? descargatelos en el directorio donde tengas 'zc.catalog-1.1-py2.4.egg', posiblemente el directorio 'site-packages' de tu instalación de Python y ejecutar el parche:

# patch -p0 < setindex.txt.patch# patch -p0 < index.py.patch

TriZPUG Camp Five VI

Thursday, March 15th, 2007

-Yo grok hoy.- Diría cualquier cavernícola. En realidad yo no soy un cavernícola (ya podía, cazando megafauna y desatando mi imaginación sobre lienzos rupestres…)

Hoy he dedicado parte de la mañana a Grok. Philip y yo nos hemos dedicado a la aplicación Hudge Hudge que empezamos ayer y con ella como escusa me ha estado explicando los pormayores de la seguridad en Zope3 y Grok.

A mitad del dia se me ha colado un trabajo de un cliente que no podía esperar, así que he dejado a Philip solucionando unos cuantos bugs que hemos detectado en Grok. Por lo que me ha dicho al final del dia, ha cambiado de pe a pa el funcionamiento de los formularios en Grok.

El día ha terminado con el resumen diario de los grupos y unas microcharlas de la gente que le ha apetecido participar, como Michel Pelletier, Tres Seaver o Ian Bicking, por ejemplo.

Por cierto, la gente está colaborando y cada vez hay más fotografías en el grupo de Flicker sobre el camp5.

TriZPUG Camp Five V

Thursday, March 15th, 2007

Un sprint es algo improvisado y con una organización flexible. Partiendo del desorden, todos los participantes nos hemos presentado y expresado nuestras aspiraciones acerca del sprint.

Whit y Jacqueline, de openplans han tomado la iniciativa y han puesto un poco de concierto a la jornada.

Nos hemos dividido en grupos en función de los intereses de unos y otros y la organización de la UNC les ha provisto de un lugar donde reunirse y trabajar.

Mikel, el 50% del equipo de codesyntax ha estado en el grupo de trabajo de la sindicación de contenidos en Plone y Zope3. Este es un tema en el que ha pensado y trabajado bastante, por lo que sus aportaciones han sido (espero) un placer para los demás sprinters que asistían física y remotamente.

Grok

Mi elección ha sido Grok. grok es una forma simplificada de programar con Zope3. Te ahorra el esfuerzo de estar continuamente registrando componentes gracias a una máxima: convención en lugar de configuración.

Grok no es Five. Es un lenguaje fácil pero no es un proyecto temporal para migrar a Zope3. Es un proyecto con miras al futuro. Es una solución para novatos en Zope3, para que puedan aprovechar la potencia de los componentes sin saber tener un profundo conocimiento sobre la arquitectura de componentes.

easy_install grokprojectgrokproject nombre-de-mi-aplicación

Con las dos sentencias anteriores, grok te instala y configura un Zope3 con una nueva aplicación (vacía) donde programar en grok. Pero además el comando grokproject tiene algunos parámetros interesantes: ej: “–with-zope3″ para indicar que utilice tu propia instancia de zope3 o “–svn-repository” para crear directamente un projecto en un repositorio svn y una ‘working copy’ local.

Le auguro un gran futuro a Grok y las lineas de futuro que Philip ha descrito le llevan hacia una aplicación de desarrollo ágil, sin nada que envidiar a Turbogears, r-o-r, etc.

Los sprinters que nos hemos unido al grupo de grok hemos estado haciendo una aplicación de ejemplo en Grok llamada Hudge Hudge, para hacer ‘reviews’ de los paquetes del cheeseshop.

Al final del dia, un representante de cada grupo ha puesto en común con los demás el trabajo y las conclusiones practicadas en cada mesa de trabajao.

TriZPUG Camp Five – IV

Wednesday, March 14th, 2007

Último dia con zope3 como protagonista absoluto. Mañana comienza el sprint de Plone, con un montón de asuntos interesantes en el tintero.

Hemos terminado el programa del turorial con un poco de retraso y se ha tenido que caer del temario el tema de seguridad. Una pena. De cualquier forma, Philip Von Weitershausen ha vuelto a estar genial.

Metadatos en Zope3

Todos los objetos que queremos que (con)tengan metadatos, deben implementar el marker interface IAnnotatable.

Zope busca automáticamente un adapter para soportar esta característica.

Existe un adapter para los objetos que implementan el marker IAtributeAnnotatable (que hereda de IAnnotatable) que guarda los metadatos en un atributo llamado __annotations__ .

Si queremos personalizar el tratamiento que nuestros objetos hacen de los metadatos tendremos que seguir los siguientes pasos:

- creamos un nuevo marker interface que herede de IAnnotatable (ej:IRatable)

- creamos un interfaz con la funcionalidad sobre metadatos necesaria (ej:IRating)

- creamos un adapter para que los objetos (IRatable) implementen una funcionalidad

Esta clase es un objeto persistente que almacena los metadatos y tiene funciones para manejarlos.

Para adaptar Iannotatable, se utiliza la utilidad ‘annotation.factory’ que realiza una serie de comprobaciones necesarias de forma automática.

Trusted adapters

Un adaptador que intenta acceder/modificar un objeto se enfrenta en realidad a un security-proxy, no al objeto. Por esta razón, recibiremos una excepción de violación de permisos.

Sin embargo, si convertimos el adapter en un trusted adapter, este accederá al objeto directamente en lugar de acceder al security-proxy. En consecuencia, tenemos que definir permisos de lectura/escritura sobre este adapter. Que será quien será reemplazado por un security-proxy cuando sea publicado.

Eventos

Si queremos manejar eventos tendremos que crear un subscriber para dos interfaces: tipo de objeto y suceso (o tipo de suceso).

una vez registrado ya es estamos capturando estos eventos o sucesos. Además podemos crear instancias de eventos nosotros mismos y notificar a todos los observadores que estén pendientes (subscritos) a los eventos con cierta interfaz, generados por objetos con otra interfaz concreta.

La adquisición en Zope3

La adquisisción es un mecanismo muchísimo más sencillo que en Zope2:

– Al pedir un objeto (url) atravesamos uno o varios SiteManagers.

- Las utilidades se registran bien a nivel global (zcml) o en un SiteManager.

- Cuando buscamos una utilidad en un contexto contreto, implícitamente lo hacemos en el último sitemanager que hayamos atravesado.

El catálogo en Zope3

El catálog es bastante más simple que en Zope2. ¿Cuál es el camino básico para añadir un Catálogo a nuestro Zope?

- registrar el catalog como una utilidad.

– añadir índices al catálogo e ndicar el interfaz que expresa los objetos que vamos a indexar (ej: el marker interface ISearchableText) y los atributos de esos objetos (callables o no).

- hacer un adaptador para nuestros objetos y el interface ISearchableText.

Cena en el jardín de un Camper

La noche no podía terminar mejor. Cerveza local y comida cocinada por la mujer (encantadora) de uno de los campers. ¡Grácias de corazón! Allí hemos podido charlar mientras las estrellas han ido apareciendo entre el follaje y el porche.

La gran sorpresa me la he llevado cuando Philip me ha abordado en “perfecto español”. Vamos, que el tipo es un crack y una caja de sorpresas :-)

Las transparencias de Philip de hoy:

15-sites.pdf, 16-catalog.pdf

, 18-security.pdf

TriZPUG Camp Five – III

Monday, March 12th, 2007

Hoy nos ha acercado Eric Smith hasta el campus. Es el primer coche híbrido (prius) que montamos y al bajar hemos tenido que limpiar las babas que se nos habían caido… :-)

Después de una jornada muy densa en contenidos, tanto Mikel

como yo celebramos la claridad y el orden que campa por las ideas que guardamos bajo el craneo.

Utilidades de Zope3

Es posible organizar los scripts de Python en forma de utilidades. La arquitectura de componentes de Zope3 exige incluirlas todas ellas en un registro centralizado donde se recuperarán conforme a dos estrategias:

- Por la funcionalidad que promete cumplir (interface)

- Por su nombre. Es posible registrar varias implementaciones para la misma utilidad.

Curiosidades del interprete de Python

#!/opt/Python-2.4.4/bin/python -ifrom sys import pathpath.append('/opt/Zope-3.3.1/lib/python')from pprint import pprint

Para interpretar los ejemplos de Zope3 en consola, utilizamos el mismo interprete que la instancia Zope3 y añadimos al path las librerías generales de Zope3.

El parámetro ‘-i’ hace que al acabar el script nos arroja el prompt python dejandonos el contexto como al final del fichero ‘.py’ .

pprint, o ‘pretty print’ permite imprimir variables ‘feas’ (diccionarios y demás) de forma ‘guapa’.

Adapters

Los adapters son la madre del cordero de la arquitectura de componentes. Cuatro ideas clave sobre ellos:

- las funcionalidades se representan mediante interfaces

- un adaptador implementa una funcionalidad para un tipo de objetos (para un interfaz). En términos de programación, el objeto para quien implementa esta funcionalidad es un parámetro llamado context.

- La única forma de que Zope se entere de que existe un adaptador dado para un objeto y funcionalidad es registrándo (en el zcml o con la función ‘provideAdapter’)

Un adaptador relaciona:

- el interfaz que representa la funcionalidad

- el interfaz que representa el tipo de objetos para quien implementa la funcionalidad.

¿Qué pasa si he publicado un interface y luego lo modifico…? Pues que le fastidio a toda la peña que utilizaba ese interfaz. Antes de modificar un interfaz público es mejor crear uno nuevo.

La única novedad que presentan los multiadapter es que adaptan varios contextos (varios interfaces) a una funcionalidad. Es decir, para proveer una funcionalidad, hacen falta todos los demás interfaces.

Persistencia en Zope3 con SqlAlchemy

Si alguna razón cósmica nos obliga a utilizar bases de datos relacionales lo podemos hacer con extrema facilidad. SQLalchemy plantea la posibilidad de crear un container persistente en la ZODB. Finalmente, los objetos contenidos se serializarán a filas sql de la forma más transparente del mundo (relaciones incluidas).

Skins

De forma similar a Plone, en Zope3, organizamos los recursos (vistas) agrupandolos en capas. Luego incluimos cada layer en una o varias skins.

Dependiendo de la configuración de cada usuario, una petición web lleva asociada un skin.

Zope3 busca el recurso solicitado entre todas las capas del skin activo y lo hace en un órden específico: primero en una capa, luego en otra…

Unas cuantas anotaciones técnicas sobre el tema:

- el request es un interface que hereda de IBrowserRequest

- un layer es un marker interface que hereda de IBrowserRequest

- una skin es un marker interface que hereda de todas las layers que incluye.

Cuando se solicita una vista a Zope, en realidad se está buscando un multiadapter para un objeto (context) y un request (IBrowserRequest)para que cumpla una funcionalidad expresada en forma del interface (IBrowserView)

Cuando modificamos el skin (hay varias formas de hacerlo) y pedimos una vista, estamos intercambiando el marker interface del request (IBrowserRequest) por el interface de nuestra skin (ej:IWorldCookerySkin)

ZPT y macros

Pocas cosas novedosas en Zope3 sobre este tema. Sin duda lo más interesante es el tema de los ‘content providers’ y las ‘viewlets’. Esta será la forma en que los portlets y demás de Plone 3 estará implementado.

Podemos organizar el layaout de una página web planteando cajitas, barras de utilidades, etc. Cada uno de estos huecos donde podrán ir trozos de HTML serán ViewletManagers:

Dentro de estos ViewletManagers irán los Viewlets, que son los pedazos de HTML propiamente dichos (ej:calendario, últimas noticias, login form, etc.)

Técnicamente, los ‘ViewletManager’ son ‘ContentProvider’s.

Un ContentProvider es un multiadapter que implementa IContentProvider y adapta un interface (ej:IRecipe), IBrowserRequest (el request) y IBrowserView (una vista).

Una viewlet es un multiadapter que implementa la funcioinalidad de un viewlet adaptando: un interface (ej:IRecipe), un IBrowserRequest (el request), IBrowserView (una vista) e IContentProvider (el ViewletManager).

De esta forma, registramos cada pieza de html para un objeto (interface), un request (skin), una vista (página) y un viewletmanager (una cajita en la web).

Test driven development

Finalmente, alrededor de unas cervezas, hemos asistido en el hall del Hampton Inn a una serie de testimonios sobre la utilización de tests para el desarrollo de código. Muy interesantes.

Las transparencias de Philip de hoy:

10-sqlcontainer.pdf, 11-skinning.pdf

, 12-metadata.pdf, 13-events.pdf

TriZPUG Camp Five – I

Sunday, March 11th, 2007

Mikel y yo conformamos el pequeño equipo diplomático que CodeSyntax ha enviado a North Carolina, con motivo del Camp5. Philipp von Weitershausen pone a nuestra disposición toda su experiencia con Zope3 y sus dotes comunicativas y docentes para que nos sumerjamos en el desarrollo de componentes web con Zope3.

Primer día

Hoy ha sido el primer día del Camp5. Las primeras de las ocho horas que ha durado la jornada se han ido volando entre el registro, la configuración de la red y otros prolegómenos.

Philip ha liderado el Camp5 y nos ha preparado una introducción a Zope3 bastante práctica. Es decir, sin mencionar siquiera la palabra interfaz, nos hemos visto tecleando ejemplos reales de Zope3.

El plantamiento ha sido “from scratch”. Aprende zope3 desde cero. Incluso nos hemos detenido bastante en la programación ZPT. A pesar de eso hemos aprendido un montón.

De entre todo lo que Philip nos ha aclarado, podemos destacar lo siguiente:

BrowserView vs BrowserPage

Las clases que heredan de BrowserView y BrowserPage tienen sutiles pero interesantes diferencias:

Las primeras estan asociadas a una plantilla en el zcml y suelen contener métodos auxiliares que se invocan desde esta plantilla.

Las segundas implementan un método “__call__” que puede terminar renderizando una plantilla o no.

La primera clase es más adecuada cuando queremos publicar algo en la web y la segunda cuando necesitamos hacer un cálculo cuyo principal objetivo no es publicar nada, por ejemplo, recibir datos de un formulario.

Registro de componentes con ZCML

También hemos conocido un poco por encima cual es el mecanismo de despliegue de los componentes Zope3. El pegamento que une todos los objetos se escribe en ZCML. Todo comienza cuando una instancia arranca y lee el “/etc/site.zcml”. Este fichero contiene sentencias que apuntan a el resto de los ZCMLs que se leerán uno por uno en el orden indicado.

Estos ZCMLs solo se leen una vez al inicio de zope, por eso es necesario reiniciarlo cuando se añaden nuevos componentes.

formlib

La última parte del dia la hemos dedicado a formlib. Es la solución que propone zope3 para no escribir los tediosos formulario. Esta librería proporciona una forma de reutilizar código y para eso dispone de varios elementos:

Esquemas (schemas). Describen semánticamente el tipo de datos que apareceran en un formulario (ej: un entero y una fecha, un texto opcional y una lista de booleanos, etc.) El esquema habla del tipo de datos que manejará el formulario pero no se dice nada de cómo aparecerán en el formulario.

Los campos (Fields) relacionan una porción del esquema con una parte del formulario. Especifican la forma en que estos campos se reflejarán en el formulario. (ej: la validación de los datos de entrada).

Cada campo lo renderiza un widget. Un widget es un trozo de código reutilizable y puede ser más o menos complejo (desde un sencillo input hasta una lista autorellenable repleta de ajax).

Por último, el formulario (form), tiene asociada una plantilla que renderiza el widget correspondiente a cada campo.

Cada elemento es personalizable y dependiendo del grado de customización debemos atacar el problema por uno de los componentes u otro.

La estructura de estos componentes es compleja, como lo suelen ser los formularios. Formlib no ofrece una solución rápida y facil pero rígida y reducida, sino una flexible y potente herramienta de complejidad moderada.

Las transparencias de Philip

El material sobre el que ha trabajado Philip tiene una gran calidad, al igual que su libro de zope3. Recomiendo conseguir una copia en papel de la segunda edición. Creo que merece la pena. Pero ¡ojo!, por lo que cuentan los organizadores del Camp5, Springer tarda casi el doble que amazon en mandarte el libro.

01-intro.pdf, 02-getstarted.pdf, 03-simplepages.pdf, 04-complexpages.pdf, 05-forms.pdf

Programando Python y Zope desde la consola con emacs

Saturday, November 11th, 2006

¿Quieres tener colores en tu emacs?

¿Quieres editar tus ficheros de zope desde la consola?

¿Quieres abrirlos directamente por FTP?

Aquí tienes unas pocas notas sobre como personalizar tu emacs para trabajar con Python, Zope2 o Zope3

Si estás en un entorno gráfico y lo que quieres es programar en una consola de texto, deberás invocar al comando con la opción ‘nw’ para que no abra una ventana adicional:


 emacs -nw

Puedes crear un alias para no tener que invocar a emacs de esta manera. Por ejemplo, puedes modificar tu ‘.bashrc’ asi:

alias emacs='emacs -nw'

Si quieres que emacs resalte la sintaxis del código de tus programas y plantillas, deberás utlizar el comando ‘font-lock-mode’:

M-x font-lock-mode

Si no queremos hacer esto cada vez que cargamos un fichero, podemos editar nuestro fichero de customización ‘.emacs’ así:

(add-hook 'find-file-hooks 'turn-on-font-lock)  

De esta forma, cada vez que se abre un fichero, se activa el resaltado de la sintaxtis.

Es muy recomendable tener el paquete de python para emacs instalado. En debian:

apt-get install python-mode

Si estas editando plantillas ‘zpt’, ‘dtml’ o ficheros de configuración ‘zcml’ tal vez quieras que emacs los interprete como html para que resalte adecuadamente la sintaxis. Denuevo deberás modificar tu fichero ‘.emacs’:

(add-to-list 'auto-mode-alist '("\.zpt$" . html-mode))(add-to-list 'auto-mode-alist '("\.pt$" . html-mode))(add-to-list 'auto-mode-alist '("\.zcml$" . html-mode))(add-to-list 'auto-mode-alist '("\.dtml$" . html-mode))

Si trabajas con Zope2 y lo que quieres es editar una plantilla que están en el ZODB, puedes hacerlo a través del protocolo FTP. Desde emacs puedes abrir un fichero mediante FTP, con la siguiente secuencia de comandos:

C-x C-f ftp://username@servername#portnumber:/path/to/template.pt

Recuerda habilitar el servidor ftp en el archivo de configuración de tu zope.

Referencias: