Ojota    Publicado: 2012-09-28 18:17:00


En MSA, la empresa para la que trabajo, necesitábamos una base de datos cuya información esté lo suficientemente estructurada como para ser recuperada rápidamente, pero que no esté guardada en forma binaria, sino en texto claro para ser visualizada con un simple editor de texto. Por otra parte, las bases de datos "Flat File" tradicionales, como SQLite no nos nos servían por que almacenan la información en archivos binarios y hacen muchas mas cosas que las que necesitábamos.

El código fue liberado y mejorado en pycamp 2012 y fue creciendo cada vez mas, agregando cada vez mas funcionalidad y robustez gracias a la colaboración de miembros de la comunidad de Python Argentina.

El requerimiento inicial era que hiciera pocas cosas pero que las hiciera bien, rápido y de manera liviana. Desarrollamos una especie de motor de base de datos hecho 100% en Python que sabe leer y escribir a disco y que maneja la información en una Cache. El motor tiene integrado un ORM que nos permite hacer búsquedas y ordenar la información, así como cruzar información de varias fuentes de datos.

Cada clase tiene asociado una fuente de datos (que puede ser JSON, YAML, o un Web Service que devuelva JSON) y lee toda la información desde ahi y nos permite hacer consultas, ordenar, filtrar y hasta actualizar información y guardarla. Se comporta, en ese sentido, como un ORM tradicional. También tiene soporte para distintos back-ends de Cache (en memoria, memcache o simplemente no usar cache) lo que permite que se lea muy poco a disco.

Algunos ejemplos:

# La informacion esta en el archivo Persons.json, Por defecto se asume que la fuente de informacion es JSON
class Person(Ojota):
    required_fields = ("name", "address", "age")
    cache  = Memcache()

# La informacion esta en el archivo Teams.yaml
class Team(Ojota):
    pk_field = "id"
    data_source = YAMLSource()
    required_fields = ("id", "name", "color")

    def __repr__(self):
        return self.name

# Algunos ejemplos de busquedas:
# "all" devuelve una lista de objetos Person
Person.all(age=30, sorted="name")
Person.all(age__lt=30, sorted="-name")
Person.all(sorted="name")

# "get" devuelve un objeto Team, si encuentra mas de 1 devuelve el primero que encuentre
Team.get(1)
Team.get(name="River Plate")

Tanto las fuentes de datos como los motores de cache pueden ser extendidos para crear motores personalizados para la necesidad de cada usuario. Algo interesante que tiene es que cada fuente de datos (lo que en una DB tradicional llamarían "tabla") puede ser de un tipo y un origen distinto.

Ojota también maneja las relaciones entre los objetos, permitiéndonos "seguir" las relaciones que tiene un objeto con otro, también pudiendo traer todos los objetos que hacen referencia a este, dándole a Ojota capacidades de base de datos relacional.

class Person(Ojota):
    pk_field = "id"
    required_fields = ("id", "name", "address", "age", "team_id")
    team = Relation("team_id", Team, "persons")
    country = Relation("country_id", Country, "persons")
    cache  = Memcache()

# Algunos ejemplos de relaciones
# Trae el pais de la persona
country = Person.get(1).country
country_name = country.name
# Trae todas las personas apra un pais
persons_for_country = Country.get(1).persons

Pueden leer la documentación esta en http://ojota.readthedocs.org , probarlo instalandolo desde Pypi http://pypi.python.org/pypi/Ojota o ver directamente el código fuente en bitbucket https://bitbucket.org/msa_team/ojota

Tambien estoy desarrollando una interfaz web para explorar ojota que se llama Havaiana, pueden ver el codigo y algunos ejemplos en https://bitbucket.org/felipelerena/havaiana

Comments

JSConf    Publicado: 2012-05-17 19:44:00


El sabado voy a estar dando una charla sobre "cosas raras de Javascript" en la jsconf Si les interesa dense una vuelta. Si no pueden ir voy a postear la charla en la seccion de charlas.

Comments

colaboracion    Publicado: 2012-05-17 19:36:00


Pasa algo curioso con la gente que quiere colaborar con el area de Labs de Mozilla hispano... Todo el mundo quiere hacer algo hasta que quiere hacer algo...

Me llega un correo por dia de alguien que dice querer colaborar y cuando le respondo las 3 pavadas que tiene que hacer no solo no las hace sino que nunca mas me responde ningun mail.

No es la primera vez que me pasa, me paso en otros proyectos de software libre. No entiendo a la gente...

¿Quieren ayudar o no?

Comments

Jugando con B2G    Publicado: 2012-05-06 16:28:00


Estos dias estuve jugando con B2G (Boot to Gecko) el sistema operativo que esta creando Mozilla para celulares basado en la web abierta y en estandares libres, muchos de los cuales ya existen y son populares.

Para probar el sistema es necesario tener un Samsung Galaxy SII, un Nexus one, o un Samsung Galaxy Nexus el cual uno tenga ganas (y valentia) para hacer andar.

Compilarlo es bastante complejo y requiere bajar 14 Gigas de codigo y tener 80 GB disponibles en total. Hay un sitio llamado B2G Builds que te facilita el tema de construir el sistema operativo, pero hay que buildear la interfaz, que es algo relativamente facil. De todos modos hay que tener hecho Este tutorial

Comments

Contents © 2012 Felipe Lerena