Mostrando entradas con la etiqueta genshi. Mostrar todas las entradas
Mostrando entradas con la etiqueta genshi. Mostrar todas las entradas

domingo, 3 de febrero de 2013

Apache Bloodhound 0.4.0 listo para descarga

https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi4gd-MSjmmULqACjJvbZ53p-wgK0lWwQSR-9WPnxix3m6MtWpkeoeGMWRUw5xqT7hn8KdGCfuePyKHFQhvr4EDdsOmKyyAdplRZ0EHttRhzNCFdTVAC2qS7DYNnExBKfEhnT-VmpeqIIBH/s1600/bh_button.png

Después de una votación inicial en la lista de difusión ​bloodhound-dev@incubator.apache.org los ​miembros del IPMC han ratificado la decisión de liberar la ​versión 0.4.0 del sistema de gestión de incidencias ​Apache™ Bloodhound . El ​anuncio oficial deja constancia de la aprobación de los siguientes miembros


Branko Čibej mentor +1
Greg Stein mentor +1
Christian Grobmeier +1

Una recomendación importante para los despliegues existentes es actualizar el plugin ​ThemeEnginePlugin a la ​versión 2.1.3 o ​superior.

Ahora bien .... ¿qué es lo que incluye la versión 0.4.0?

Edición de tickets in-situ


Modificación in-situ de tickets

Como es de esperar esta versión trae nuevas funcionalidades . En primer lugar la interfaz de los tickets se transforma cuando Javascript está habilitado en el navegador de los usuarios. En estos casos , la modificación de sus atributos se realiza a través de un formulario in-situ . Si el cliente no habilita la ejecución de scripts entonces se sigue utilizando la misma sección Modificar ticket que ofrecían las versiones precedentes .

Imagen de marca

Las páginas wiki de la guía de usuario incluídas durante la instalación (e.g. TracStandalone, TracWorkflow, ...) han sido renombradas . Ahora comienzan con el prefijo Guide/ (e.g. Guide/Standalone, Guide/Workflow, ...) . También se han modificado ligeramente los textos de los mensajes de error y algunas partes de las páginas del sitio (e.g. el pie de página) con el fin de facilitar la conformación de una imagen de marca personalizada . Esto es posible mediante la configuración de las opciones application_full , application_short, footer_left_postfix, footer_left_prefix, footer_right en la sección labels del fichero de configuración trac.ini. La siguiente figura ilustra cómo funcionan estas opciones .

Pie de página configurable

Creación rápida de tickets

Descarga directa de TuxInfo nro 54

Hace unas semanas la revista ​TuxInfo publicó su ​número 54 conmemorando sus cinco años de publicación ininterrumpida ( ¡ Felicidades ! ) . En uno de los artículos abordé la solución inicial para especificar la descripción en el formulario de creación rápida de tickets. Ya es posible hacer este tipo de cosas en la versión 0.4.0 , aunque la forma definitiva es un poco diferente a la que expliqué en aquel momento. Además se ofrece la posibilidad de configurar los campos de los tickets que se mostrarán en el formulario, así como el orden en que aparecerán .

Lo que se viene …

Antes de finalizar le dedicaré unas líneas a explicar en qué estamos trabajando en este momento con vistas a la próxima versión .

Jure Zitnik

En primer lugar , es una prioridad completar la arquitectura multi-producto . Me encuentro trabajando actualmente con ​Jure Zitnik en la rama ​bep_0003_multiproduct con vistas a tenerla lista para finales de febrero o principios de marzo , a más tardar (<= suelo ser así de optimista, sí ...) . Hay grandes expectativas alrededor de este tema , ya que es una de las debilidades que siempre se le señala a Trac y por consecuencia Bloodhound .

Peter Koželj

Como consecuencia de la reciente publicación de las versiones ​1.0.1 y ​1.1.1 de Trac . Muy próximamente se debe decidir cuál de ellas será distribuida con Bloodhound en el futuro inmediato . Por otra parte ​Ryan J. Ollos junto con Steffen Hoffmann preparan otras mejoras en el plugin ​AccountManagerPlugin , una pieza escencial en el funcionamiento de Bloodhound . ​Matevž Bradac y ​Peter Koželj trabajan en mejoras a la interfaz de usuario , especialmente orientadas a que se adapte a las diferentes resoluciones de pantalla (i.e. responsive layout) .

Andrej Golcov

Una de las adiciones más prometedoras en la versión 0.4.0 es la búsqueda avanzada . La misma se desarrolla en paralelo y por el momento se ofrece como una extensión opcional . Aunque es funcional , todavía es una versión inicial . ​Andrej Golcov se encuentra mejorando y añadiendo otros aspectos . Sin embargo, no me detendré a ofrecer muchos más detalles porque este será el asunto que trataré en un artículo que publicaré próximamente .

Pronto habrán dos demos online : uno con la última versión estable y otro con la versión más reciente en el repositorio (i.e. HEAD) . Si está interesado le invito a ​descargar Apache™ Bloodhound 0.4.0 (incubating) , a que lea el próximo número de la revista ​TuxInfo y queden a la espera de una nueva versión con muchas nuevas herramientas . Como siempre , espero que las mejoras sean de su agrado . No dude en comentar acerca de estas propuestas o sugerir mejoras . Todo es posible ... simelo piden .

lunes, 8 de junio de 2009

Diseño: Tema PyTpp, ahora Trac se parece más a Python

http://trac-hacks.org/attachment/wiki/PyTppThemePlugin/screenshot.2.png?format=raw

Mudar la piel es algo que puede ser muy agradecido por los visitantes de un sitio. Esta vez le toca a Trac, por lo que hablaremos del tema PyTpp, el cual contiene las recientes mejoras que le he hecho al popular tema PyDotOrg. Algunas de las ideas que están recogidas en su versión 2.2.0 han sido experimentandas en este blog y puesto a prueba en el sitio web de mis proyectos. Si quiere saber de que se trata: ¡continúe leyendo hasta el final! . Espero sus sugerencias y comentarios. Simelo propone, muy probablemente sus ideas también podrán ser incluídas.

Motivación

Como ya mencioné el tema PyTpp está inspirado en el tema PyDotOrg. Este último trata de lograr a su vez que el sitio de administración de proyectos luzca de forma similar al sitio oficial de Python. Todo el trabajo comenzó debido a que había algunas características que faltaban. En primer lugar la sección de navegación del sitio (mainnav) todavía no era como la de python.org. A esto se le sumaban algunos problemas con las imágenes en la parte superior del sitio (banner). Por otra parte la información acerca del usuario y otros aspectos de meta-navegación del sitio (metanav) también diferían de los del sitio de referencia. Todo estos aspectos han encontrado algún tipo de solución, siempre tratando de no perder el espíritu de la interfaz de usuario de Trac (i.e. todo se parece a python.org, pero queda muy claro que estamos en un sitio de administración de proyectos implementado con Trac ;).

Otra característica incluída es que se mantienen fijas las tres áreas del sitio antes mencionadas más los enlaces de navegación contextual y el pie de página. De esta manera se logra aprovechar más el tiempo y no hacerle scroll a toda la página para navegar a otra ya más distante. Por lo general esto hace que los visitantes aprovechen mejor su tiempo, y que estén más al tanto de todas las partes que pueden ser de su interés.

Lo nuevo …

Para la más reciente versión 2.2.0 se ha hecho énfasis en la tipografía. Esta es una inquietud que he tenido desde hace muy poco tiempo, y creo que ya comienzo a ir cubriendo mis carencias. La realidad es que he constatado muy frecuentemente que este arte es relegado a un plano muy secundario, si es que se hace. Pero la realidad es que el uso inteligente de la tipografía facilita la lectura de las informaciones y no solo eso, también puede servir para ofrecerle una guía al usuario al resaltar determinados elementos ubicados dentro de una misma página. Se logra así atraer su atención.

Resulta curioso que todo esto está estudiado y puesto en práctica hace mucho tiempo en otros medios como la prensa escrita. En mi caso he ido descubriendo todos los detalles después de prestarle atención a la edición escrita de Le Monde Economie (sí los franceses son expertos en esto de la publicidad y el diseño gráfico), a Blogger in Draft y al formato de la publicación The Python Papers. Este último caso ha servido de referencia para los estilos aplicados a los encabezamientos de las páginas wiki, al ser de mi agrado y tan compatible con los colores del logotipo de Python. Sin embargo Blogger in Draft (que es otro que bien baila en la misma rama) me ha servido como guía para algunos otros detalles añadidos a este blog. Y más allá de todo eso, yo también puse un poquito de mi parte. Espero que les guste :).

Hasta aquí llegan las bondades que se pueden encontrar en la versión 2.1.0. Los nuevos cambios consisten en :

  • Modificar los tipos de letra empleados para los textos. De esta manera serán más legibles. Solo échenle un vistazo a lo que sugiere un libro especializado :

Arial is a common font choice, largely because of its dominance on Windows. Its poor design makes it unreadable at small sizes and a poor choice for body copy.

  • Variar el estilo de la primera letra del texto o artículo (en inglés dropcaps). Sí, exactamente lo que se ve al inicio de todas las entradas de este blog :).
  • Arreglar un problema con el Internet Explorer. Resulta ser que este navegador quiere seriamente romper el récord de incompatibilidades con los estándares de la web. En este caso específico :
    • No se interpreta el parámetro float como lo indica el estándar de CSS. Esto hace que haya que perder el tiempo para ajustar el estilo, y recurrir unos cuantos trucos. Antes las páginas se veían horribles con el mencionado navegador web.
    • Los dropcaps no funcionan, eso parece ser demasiado para un navegador tan defectuoso.
    • Las posiciones de los elementos no se interpretan como lo indica el estándar de CSS. Esto hace que la apariencia difiera a la que se logra browsers más serios como Opera o Firefox.

Pero bueno, al final los usuarios no tienen la mayor parte de la culpa, y todavía el infame Internet Explorer es bastante popular a pesar de ser tan incompatible. Por tanto apreciaría mucho si alguien me aporta sugerencias para homogenizar la apariencia al usar los tres navegadores ya mencionados.

Solo me resta invitarlos a que le echen un vistazo a este nuevo tema para Trac. Si tiene otras ideas o inquietud, bueno ... espero sus comentarios y sugerencias. Incluso en el caso de que no sea apropiado incluirlas en el tema oficial, simelo pide, no dudaría en indicarle como lograr que la apariencia se ajuste a sus necesidades particulares. Pero ... ¿esto es todo?

lunes, 2 de marzo de 2009

No me gustan los templates de Django ...

Había una vez un programador solitario que comentó que no le gustaban los templates de Django. ¡Semejante herejía! ¿Cómo se le iba a ocurrir decir eso del framework que el propio Guido van Rossum ha sugerido para ser desplegado en Google App Engine? Como todos se quedaron impávidos, y como ese programador soy yo ... aquí les van los detalles. ¿Cuáles son mis argumentos? ¿Cuál es el mejor sistema de templates para Python? ¿Realmente alguno sobresale? Todo esto y muchas cosas más las tendrá acá ... continúe leyendo hasta el final ... y si se motiva, ¡puede dejar también su comentario! ;) ... pero primero es lo primero. Todo comenzó con un tablero de ajedrez ...

Antecedentes

Cuando intenté aprender cómo utilizar Django me dije: comenzaré por hacer algo bien sencillo, pero no muy tradicional, para ir familiarizándome con los templates. Fue entonces cuando comenzó mi Odisea: se me ocurrió mostrar un tablero de ajedrez utilizando tablas HTML. En este momento tenía el antecedente de JSP después de terminar un curso de J2EE ofrecido por profesores del NIIT. Ya había logrado comprender su estilo hasta el punto de darme cuenta de que podía ser dañino si se mezclaban los detalles de la interfaz con otra lógica más propia de la aplicación. Además esto no mejora mucho tampoco utilizando JavaBeans. Pero realmente en ese tiempo (ahora realmente no sé ;) me gustaba mucho la idea de dejar abierto un bloque (e.g. un for) en el template, intercalar el código HTML que se iba a ir repitiendo y cerrar el ciclo más adelante. Antes de conocer incluso a Django, cuando comencé a explorar el desarrollo de aplicaciones web con Python esperé que toda la naturalidad del lenguaje redundaría en templates dignos de admiración. Por tanto comencé por echarle una ojeada a mod_python. Me sorprendí al ver sus similitudes con JSP, y por tanto era consciente también de sus limitaciones. Pero bueno, al grano, supongamos que se tiene el ancho de las celdas (celldim), dos listas que contienen los identificadores de columnas (cols) y filas (rows) y una variable que indica si el jugador lleva las piezas blancas o negras (home_player). Después de todo esto mi famoso tablero de ajedrez sería tan sencillo como:
<%
celldim = 20
rows = "abcdefgh"
cols = range(1,9)
home_player = True
%>
<!DOCTYPE html
PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
<head>
<style type="text/css">
.white_sq{
background-color: white;
}
.black_sq{
background-color: black;
}
</style>
</head>
<body>
<table>
<tr height="<%= celldim %>">
<td width="<%= celldim %>"></td>
<%
for ci, c in enumerate(home_player and cols or reversed(cols)):
%>
<td width="<%= celldim %>">
<small><%= c %></small>
</td>
<%
%>
</tr>
<%
for ri, r in enumerate(home_player and reversed(rows) or rows):
# Rows in board ...
%>
<tr height="<%= celldim %>">
<td width="<%= celldim %>">
<small><%= r %></small>
</td>
<%
for ci, c in enumerate(home_player and cols or reversed(cols)):
# Cols in board ...
%>
<td class="<%= (ci + ri) % 2 == 0 and 'white_sq' or 'black_sq' %> "
width="<%= celldim %>"></td>
<%

%>
<td width="<%= celldim %>">
<small><%= r %></small>
</td>
</tr>
<%
%>
<tr height="<%= celldim %>">
<td width="<%= celldim %>"></td>
<%
for ci, c in enumerate(home_player and cols or reversed(cols)):
%>
<td width="<%= celldim %>">
<small><%= c %></small>
</td>
<%
%>
</tr>
</table>
</body>
</html>

Con Django ... ¡¡¡me duele la cabeza!!!

De pronto traté de reproducir la misma idea utilizando los templates de [www.djangoproject.com/ Django]. Atraído por los comentarios que me adelantaban sus virtudes (entre ellas su separación bien establecida entre la capa de presentación y la lógica de la aplicación, sumándole a esto su enfoque para persistencia) de datos, no me resultó nada raro pensar que este ejemplo tan sencillo iba a ser algo muy fácil de hacer ... sin embargo, como pueden ver, el resultado (hasta ahora ;) es realmente decepcionante.
<html>
<head>
<style type="text/css">
.white_sq{
background-color: white;
}
.black_sq{
background-color: black;
}
</style>
</head>
<body>
<table>
<tr>
<td width="{{celldim}}"></td>
{% for c in cols %}
<td width="{{celldim}}">
<small>
  {% if home_player %}
    {{c}}
  {% else %}
    {{cols|slice:forloop.revcounter.__str__|slice:"-1::-1"|first}}
  {% endif %}
</small>
</td>
{% endfor %}
<td width="{{celldim}}"></td>
</tr>
{% for r in rows reversed %}
<tr height="{{celldim}}">
<td width="{{celldim}}">
<small>
{% if home_player %}
  {{r}}
{% else %}
  {{rows|slice:"-1::-1"|slice:forloop.revcounter.__str__|slice:"-1::-1"|first}}
{% endif %}
</small>
</td>
{% for c in cols %}
<td class={% if forloop.counter|add:forloop.parentloop.counter|divisibleby:"2" %}
          "white_sq"
        {% else %}
          "black_sq"
        {% endif %}
  width="{{celldim}}"></td>
{% endfor %}
<td width="{{celldim}}">
<small>
{% if home_player %}
  {{r}}
{% else %}
  {{rows|slice:"-1::-1"|slice:forloop.revcounter.__str__|slice:"-1::-1"|first}}
{% endif %}
</small>
</td>
</tr>
{% endfor %}
<tr>
<td width="{{celldim}}"></td>
{% for c in cols %}
<td width="{{celldim}}">
<small>
  {% if home_player %}
    {{c}}
  {% else %}
    {{cols|slice:forloop.revcounter.__str__|slice:"-1::-1"|first}}
  {% endif %}
</small>
</td>
{% endfor %}
<td width="{{celldim}}"></td>
</tr>
</table>
</body>
</html>
El código es altamente ilegible, no tiene nada de naturalidad, su ejecución es ineficiente debido a que hay que procesar varios filtros (y evidentemente eso tarda más que una evaluación directa contra un espacio de nombres global ;). Además, para lograr hacerlo hay que pasar por un proceso de aprendizaje nada despreciable. ¡Qué desastre! Mi impresión es que los templates de [www.djangoproject.com/ Django] se han tornado tan restrictivos para separar los detalles de la interfaz de lo demás, que han convertido en un infierno hacer rápida y naturalmente tareas extremadamente sencillas que no tienen nada que ver con la lógica de la aplicación.

Por suerte llegó Genshi ... y mandó a parar

Más tarde entré en contacto con Genshi durante mi aventurero desarrollo de plugins para Trac. En este caso se alcanza un mejor equilibrio entre la programación de la interfaz y su separación ¡Qué alegría! Para empezar mi tablero de ajedrez quedaría apróximadamente así ...
<!DOCTYPE html
PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:py="http://genshi.edgewall.org/">
<head>
<style type="text/css">
.white_sq{
background-color: white;
}
.black_sq{
background-color: black;
}
</style>
</head>
<body>

<py:def function="label_row()">
<tr height="$celldim">
<td width="$celldim"></td>
<td py:for="ci, c in enumerate(home_player and cols or reversed(cols))"
  width="$celldim">
<small>$c</small>
</td>
<td width="$celldim"></td>
</tr>
</py:def>
<py:def function="label_cell(r)">
<td width="$celldim">
<small>$r</small>
</td>
</py:def>

<table>
${label_row()}
<tr py:for="ri, r in enumerate(home_player and reversed(rows) or rows)"
height="$celldim">
${label_cell(r)}
<td py:for="ci, c in enumerate(home_player and cols or reversed(cols))"
class="${(ci + ri) % 2 == 0 and 'white_sq' or 'black_sq'} "
width="$celldim"></td>
${label_cell(r)}
</tr>
${label_row()}
</table>
</body>
</html>
... y además fíjese en la reutilización que permite el elemento py:def para crear estructuras semejantes a funciones (digamos def) que se expresan solamente en términos de elementos XML / HTML. Además Genshi está preparado para hacer streamming, lo que contribuye a la eficiencia para expandir los templates, y para filtrarlos (e.g. para lograr con relativa fácilidad, la preparación de sitios web completos en diferentes idiomas).

Pero cuidado con Cheetah …

Después de haber escuchado a Alex Martelli en su presentación de Python durante Google I/O 2008 me interesé por saber un poco más de Cheetah. Aunque mi corta experiencia no me permitiría hacer un análisis más profundo ahora (... quizás luego ;), sí les puedo asegurar que mi tablero sería especificado con un template como el siguiente:
<!DOCTYPE html
PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
<head>
<style type="text/css">
.white_sq{
background-color: white;
}
.black_sq{
background-color: black;
}
</style>
</head>
#def label_row()
<tr height="$celldim">
<td width="$celldim"></td>
#for $ci, $c in enumerate($home_player and $cols or reversed($cols))
<td width="$celldim">
<small>$c</small>
</td>
#end for
<td width="$celldim"></td>
</tr>
#end def
#def label_cell($r)
<td width="$celldim">
<small>$r</small>
</td>
#end def
<body>
<table>
$label_row()
#for $ri, $r in enumerate($home_player and reversed($rows) or $rows)
<tr height="$celldim">
$label_cell($r)
#for $ci, $c in enumerate($home_player and $cols or reversed($cols))
<td class="${(ci + ri) % 2 == 0 and 'white_sq' or 'black_sq'} "
width="$celldim"></td>
#end for
$label_cell($r)
</tr>
#end for
$label_row()
</table>
</body>
</html>
... es decir, se repite la reutilización de código con la directiva #def para crear estructuras semejantes a funciones, parecido al caso de Genshi. Además Cheetah compila los templates a código Python, lo que le aporta potencialidades increíbles al framework (... de las que quizás podremos hablar más adelante ...). Solo les adelanto lo siguiente, Cheetah ha sido utilizado para generar HTML, SGML, XML, SQL, Postscript, e-mail y LaTeX. En la práctica es capaz de hacerlo con cualquier otro formato de texto y, en otras aplicaciones menos ortodoxas, se ha generado código para lenguajes como Python, Java y PHP. Además Cheetah permite utilizar otras sintaxis, lo que implica que se pueda, por ejemplo, intercalar código PSP en templates de Cheetah.

Conclusiones

Sinceramente quisiera pensar que no comprendo los templates de [www.djangoproject.com/ Django] tan bien como para obtener lo que realmente quiero de una forma más natural y sencilla. Pero luego he descubierto que parece ser que no soy el único. Les dejo con los principios de diseño detrás de Cheetah, saquen Ustedes sus propias conclusiones :
  • Python para la lógica de la aplicación, y Cheetah para la capa de presentación. Cheetah está diseñado para complementar a Python, no para remplazarlo.
  • La sintaxis debe ser fácil de aprender por personas que no programen.
  • La reutilización de código debe estar disponible de forma sencilla, al proveer una interfaz orientada a objetos que facilite el acceso a los datos en el template ya sea desde Python o desde otros templates de Cheetah.
  • Los objetos, funciones, y otras estructuras de datos presentes en Python deben ser accesibles en los templates de Cheetah.
  • Cheetah debe proveer directivas de control de flujo y manipulación de errores. La lógica que pertenece a la capa de presentación no debe ser relegada a la capa de la aplicación, simplemente porque es compleja.
  • El contenido, el diseño gráfico y el código de la aplicación deben ser separados, y a la vez integrados, de manera fácil.
  • En particular debe resultar intuitivo:
    • para los programadores, poder crear componentes reutilizables y funciones accesibles y comprensibles por los diseñadores.
    • para los diseñadores, el poder marcar los espacios dónde se ubicarán los diferentes contenidos y componentes dinámicos en los templates.
    • para los diseñadores también, el poder escribir código simple para poder expresar aspectos que en el diseño resultan ser repetitivos o que cambian con facilidad.
    • para los diseñadores también, el poder reutilizar y extender plantillas existentes y minimizar así la duplicación del esfuerzo y las líneas de código.
    • y, claro, para los autores de los contenidos, utilizar las plantillas creadas por los diseñadores.
Sin embargo ... al margen de todo este debate, para aplicaciones más serias mantengo mi posición de liberarme lo más posible de la tiranía de los frameworks. Si Ud tiene otra opinión no hay nada para mí más valioso que conocer sus comentarios ... y, simelo pide, seguiremos explorando este hermoso universo de la programación web en Python.