Nos últimos meses, tenho escrito uma enorme quantidade de código em Python usando Redis como servidor de estrutura de dados e cache. Aliás, posso dizer que Redis se tornou uma ferramenta central e essencial nos meus projetos. E com o aumento de linhas de código usando basicamente a excelente biblioteca redis-py, tem aumentado a minha necessidade de jogar certas coisas por debaixo dos panos. Tipo ORM.
ORMs são temas de discussões acaloradas: pessoas amam, pessoas odeiam. Eu odiava, muito por conta do Hibernate. Com o Django, aprendi a usar, gostar, e saber que ele irá falhar em algum momento, sobretudo quando performance entra em jogo. No caso do Redis, conseguir abstrair um pouco as estruturas de dados, e trabalhar um nível acima com objetos deixaria o código mais elegante, conciso e fácil de trabalhar. Além disso, seria muito útil poder trabalhar com estruturas de dados de uma forma pythonica.
Tendo isto em mente, fui à caça de opções disponíveis, e descobri que não haviam muitas. Nas minhas várias pesquisas, acabava sempre esbarrando no rom e no redisco. Minha primeira tentativa foi com o rom, por parecer ser um projeto mais ativo e mais recente. Um dia de trabalho foi suficiente para fazer a primeira migração e perceber que 1) funciona 2) tem sérias limitações. O que mais me incomodou foi uma API um tanto quanto inconsistente e com alguns furos. Sem contar que a versão 0.20 disponível no PyPi simplesmente não rodava, por falta de um arquivo no pacote (a versão 0.21 saiu graças à minha reclamação).
Depois de alguns dias tentando contornar as limitações e tentando conversar com os desenvolvedores (que não se mostraram muito flexíveis), resolvi começar a escrever uma biblioteca própria. A idéia inicialmente era mapear as estruturas de dados disponíveis no Redis (List, Set, SortedSet, Dict) em estruturas de dados Python, mantendo sempre que possível uma sintaxe pythonica. O resultado foi o projeto redis-datastore, cujo resultado ficou bem razoável e cheio de testes.
Mas aí, chegou o momento de implementar o mapeamento de objetos, e, confesso, bateu certa preguiça. Resolvi revisitar os projetos mencionados anteriormente, e desta vez escolhi experimentar o Redisco. O ponto interessante era o fato dos desenvolvedores terem implementado uma API mais consistente, inspirada no QuerySet do Django, implementado estruturas de dados e algumas funcionalidades extras úteis. Mas haviam alguns bugs e ainda sentia falta de algumas funcionalidades. Seguindo as premissãs do mundo do Software Livre, decidi fazer um fork próprio, disponível aqui, e implementar as modificações.
Alguns dos pontos que estou trabalhando neste fork:
- Corrigir bugs (já encontrei e corrigi alguns);
- Performance;
- Evoluir a API, adicionando funcionalidades e usando como base a API do QuerySet do Django, que já se tornou padrão e está bem maduro;
- Evoluir arquitetura, sempre que possível. Estou aos poucos mergulhando no código, e sempre que encontro algo questionável, faço refactoring;
- Fazer o merge do redis-datastore.
Fiz alguns pulls requests para o projeto original (que já é um fork do projeto criado pelo Tim Medina e que foi oficialmente descontinuado), e a julgar pela falta de resposta, me parece que este foi descontinuado também. Veremos. No caso do meu fork, estou trabalhando ele em paralelo com um projeto profissional que usa a biblioteca. Portanto, estou “vivendo o projeto”.
Interessado em colaborar? Chega mais!