Archive for July, 2006

Primeira Colaboração de Código ! :)

July 21st, 2006

Semana passada surgiu uma dúvida na lista python-brasil ,
manipulação de datas com o pymssql e como eu tenho interesse na utilização de Python com o MS-SQL dei bastante atenção à dúvida, gerando minha primeira colaboração com código a um projeto Open Source.

O Problema

Em um comando INSERT desejava-se inserir uma data no banco de dados.

No Python 2.4 temos o objeto datetime para trabalhar com datas, porém o driver de acesso ao banco (pymssql) não reconhece esse tipo e isso nos obriga a converter a data para string antes de enviar ao pymssql.

Obviamente essa conversão é uma responsabilidade do driver pymssql.

Simulei o erro com esse código:

>>> import pymssql
>>> pymssql.__version__
>>> from datetime import datetime
>>> con = pymssql.connect(host='server', user='usuario', password='senha', database='base')
>>> cur = con.cursor()
>>> cur.execute('insert into PrazoLog(Data) values(%s)',>>> [datetime(2006, 7, 20, 11, 6, 14)])
>>> con.commit()

Contornando o Problema

Após eu conseguir simular o erro na minha máquina fui investigar como contornar o erro, e graças ao fato do Python ser executado a partir dos fontes eu pude ler o código do pymssql que estava instalado na minha máquina sem ter que consultar o site, repositórios ou qualquer outro local.

Novamente graças ao Python executar os fontes, pude fazer alterações nos fontes do pymssql e simplemente testar. Obviamente como não desenvolvo constantemente em Python fiz meus testes e debugs de forma bem artesanal (usando prints).

Apenas consultando o e-mail com o problema e os arquivos que já estavam na minha máquina consegui chegar em um patch que permitia contornar o problema de forma simples rápida e ao meu ver bem feita.

Tomei alguns cuidados que achei importante, como tentar não adicionar mais uma dependência ao pymssql. A versão do pymssql que eu disponho não depende do módulo datetime e como eu sabia que esse módulo foi incorporado somente na versão 2.4 não queria adicionar essa dependência.

Lembrei-me, então, do duck typing. Como eu queria apenas o método timetuple da classe datetime.datetime. Apenas verifiquei se o objeto tem o método e tendo-o eu executo-o.

Funcionou que foi uma beleza :), testei nas 3 versões do MS-SQL que eu tenho aqui na empresa (7.0, 2000, 2005) e funcionou. Fiquei empolgado e eufórico! Mandei a minha correção para a lista e o Girão, que é quem teve o problema, falou que funcionou beleza e gostou da correção.

Colaborando com a Comunidade

Aproveitando a euforia e a “aprovação” do Girão fui a página do projeto para enviar a minha proposta de patch. O projeto está no sourceforge.net , dei uma olhada no Fórum e todas as mensagens não recebiam respostas :( e não achava nenhum link do tipo “reporte um bug”.

Mas navegando pelo site do projeto achei uma nota sobre a dependência do módulo datetime e achei bem estranha. Então fui verificar os fontes, nos fontes da minha máquina não via nada que levasse ao módulo datetime, então fui consultar o repositório CVS.

Qual não foi minha surpresa quando a versão do CVS revelou-me que a dependência era justamente para solucionar o mesmo problema que eu tinha solucionado :S . Fiquei meio triste, pois pensei, re-invetei a roda, mas fiquei contante pois ainda achava minha solução mais adequada por não adicionar a tão falada dependência.

Apelei e mandei o patch direto para os 2 e-mails de desenvolvedores que eu achei no site.

Após 4 dias o Andrzej Kukula, um dos desenvolvedores, me respondeu dizendo que o meu patch seria incorporado no projeto! 😀 A empolgação foi total !

Moral da História

  1. O Python facilita a leitura e a depuração dos fontes
  2. Sempre verificar a versão do CVS/SVN
  3. Colaborar com algum projeto não é tão difícil assim
      Precisa-se de:

    • um pouco de interesse
    • um pouco de experiência para saber o que esperar de um módulo/biblioteca/framework, pois para mim (e para o Girão também) a conversão de tipo era função do módulo pymssql
    • um pouco de inglês
    • o que eu menos precisei foi conhecer bem a linguagem – eu acho
  4. e por último, mas não menos importante, colaborar é empolgante e divertido, principalmente em Python 😉