Snippet para usar un unittest bottle.py con un proceso separado

Necsitaba probar un api rest y se me ocurrio levantar bottle en un proceso separado dentro de un testcase; y necesite hacer todos este chicle.

#!/usr/bin/env python
# -*- coding: utf-8 -*-

# "THE WISKEY-WARE LICENSE":
# <jbc.develop@gmail.com> wrote this file. As long as you retain this notice you
# can do whatever you want with this stuff. If we meet some day, and you think
# this stuff is worth it, you can buy me a WISKEY in return Juan BC

import multiprocessing
import urllib2
import unittest

import bottle

class BottleTest(unittest.TestCase):

    def setUp(self):
        self.process = multiprocessing.Process(
            target=bottle.run,
            kwargs={"port": "8081"}
        )
        self.process.start()

        # wait until bottle process full started
        # si no ponen esto el testcase se va a ejecutar antes
        # que bottle este listo para recibir peticiones
        started = False
        while not started:
            try:
                urllib2.urlopen("http://127.0.0.1:8081/")
            except urllib2.HTTPError:
                started = True
            except urllib2.URLError as err:
                if err.reason.args[0] == 111:
                    pass
                else:
                    raise err
            else:
                started = True

    def tearDown(self):
        self.process.terminate()

    def test_something(self):
        pass

Leer Más

csvcool 0.1.2

Actualicé denuevo csvcool mi libreria para manejar archivos csv in a cool way!

Por un pedido le puse soporte para “key” en el metodo de ordenamiento:

Suponiendo que tenemos un csv como el siguiente:

nombre apellido mail
tito puente tito@puente.com
cosme fulanito cosme@fulanito.com

para ordenarlo por  la ultima letra del “nombre” deberiamos hacer

import csvcool
csvf = csvcool.read(open("/archivo.csv"))
csvf.sort(lambda r: r["nombre"][-1])
csvcool.write(csvf, open("/archivo.csv", "w"))

y el resultado seria:

nombre apellido mail
cosme fulanito cosme@fulanito.com
tito puente tito@puente.com

Ademas de eso tambien tiene los sigientes features viejos:

  • extraer una sola columna como una tupla.
  • recortar un csv dejando “algunas” columnas o “algunas filas”.
  • agregar filas y columnas.
  • remover filas y columnas.
  • guardar en un archivo.
  • y unas cosas mas.
Instalar:
PD: ahora si agregue los test al setup.py (para felicidad de nessita)

Leer Más

csvcool 0.1.1

Actualicé csvcool mi libreria para manejar archivos csv in a cool way!

Si bien @chipaca, me comento de una funcionalidad similar que viene en la std lib de python, me sigue pareciendo mucho mas comodo de manejar mi libreria (que esta exelentemente documentada (hagan un help(csvcool))

El changelog es simple… le agregue un metodo sort que recive como parametro el nombre de la columna por la cual ordenar.

Suponiendo que tenemos un csv como el siguiente:

nombre apellido mail
tito puente tito@puente.com
cosme fulanito cosme@fulanito.com

para ordenarlo por “nombre” deberiamos hacer

import csvcool
csvf = csvcool.read(open("/archivo.csv"))
csvf.sort("nombre")
csvcool.write(csvf, open("/archivo.csv", "w"))

y el resultado seria:

nombre apellido mail
cosme fulanito cosme@fulanito.com
tito puente tito@puente.com

Ademas de eso tambien tiene los sigientes features viejos:

  • extraer una sola columna como una tupla.
  • recortar un csv dejando “algunas” columnas o “algunas filas”.
  • agregar filas y columnas.
  • remover filas y columnas.
  • guardar en un archivo.
  • y unas cosas mas.
Instalar:
PD: ahora si agregue los test al setup.py (para felicidad de nessita)

Leer Más

csvcool 0.1

Laburando en el pyday, tuve que lidiar con varios archivos csv. Los bichitos estos tenian en su primer fila el nombre del campo al cual hacia referencia la columna dada

porjemplo 2 personas con nombre apellido y email aparecia algo asi:

nombre apellido mail
tito puente tito@puente.com
cosme fulanito cosme@fulanito.com

Realmente usar el modulo csv de python me rompia un poco la paciencia, ya que se accedia siempre por indices  y habia que omitir la fila 0

ejemplito:

import csv
csvf = csv.reader(open("/archivo.csv"))
print csvf[1][0] # imprimiria "tito"

Mi solucion: csvcool

Que hace esta librería? bueno… omite la fila 0 y transforma  cada fila en un diccionario (entre otras cosas)

Ejemplito 3:

import csvcool
csvf = csvcool.read(open("/archivo.csv"))
print csvf[0]["nombre"] # imprimiria "tito"

Ademas de eso tambien tiene los sigientes features:

  • extraer una sola columna como una tupla.
  • recortar un csv dejando “algunas” columnas o “algunas filas”.
  • agregar filas y columnas.
  • remover filas y columnas.
  • guardar en un archivo.
  • y unas cosas mas.
Como ultimo ejemplo supongamos que solo queremos guardar un csv con los mails y el apellido de las personas:
import csvcool
csvf = csvcool.read(open("/archivo.csv"))
cortado = csvf.cut("apellido", "mail")
csvcool.write(cortado, open("/archivo_cortado.csv", "w"))
Instalar:
PD: hay test… y me olvide de incluirlos en el setup.py (moco)

Leer Más

Un aporte a “Google translate api”

He estado usando el google tranlate api, para traducir de un lenguaje a otro. El pequeño problema es que no soporta todas las combinaciones como por ejemplo “Japones a Español”.

Mi solución, hacer una clase que cuando captura una excepción utilice otro lenguaje pasado por parámetro como intermedio; así el “Japones a Español” cambiaría a la forma “Japones a <otro lenguaje> a Español”. Además agregue un método que directamente utiliza el inglés como lenguaje intermedio (“Japones a Ingles a español”).

Para utilizar estos métodos es necesario primero importar el api de google ya que el código para identificar idiomas que utiliza es el brindado por la clase “Languages” de ese paquete.

mi código (Licenciado bajo la GPL v3)

/*
* GoogleConnection.java
*
* Copyright (C) – 27 de noviembre de 2007, 18:18 – juan b cabral
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see .
*
* this is the code use to tranlate from one language to another when the combination is not soported.
* for example, if I need to translate “from Spanish to Japanese”
* this code will first try to do it directly, and when it gets an exception,will first try to use na intermediate
* language (usually english which is the
* most supported) and after trying with the intermediate language will try with Japanese.
*
*/

import com.google.api.translate.*;

/**
*
* @author Juan B Cabral
* @version 1.0
*/
public class GoogleConnection{

/**
* use as intermediate Language.ENGLISH
* @param String str
* @param String from
* @param String to
*/
public static String translateEnglishIntermediate(String str, String from, String to) throws java.net.MalformedURLException, java.io.IOException {
return getTranslation(str, from,to, Language.ENGLISH);
}

/**
* Try to translate directly the String from “from” language to “to” language
* or first translate from “from language” to “inter” (intermediate) language, and from “inter” language to “to” language
* @param String str
* @param String from
* @param String to
* @param String inter
*/
public static String getTranslation(String str, String from, String to, String inter) throws java.net.MalformedURLException, java.io.IOException{
try{
str=Translate.translate(str,from,to);
}catch(Exception e){
try{
str=Translate.translate(str,from,inter);
str=Translate.translate(str,inter, to);
}catch(Exception e2){
throw e2;
}

}
return str;
}

}

Leer Más