Uncompress.py – Descompactando .tar.gz y .zip

Este es un pequeño utilitario escrito en python para descompactar archivos .tar.gz y .zip.

Para el caso .tar.gz es trivial ( solo 2 lineas de código ), en el caso de .zip hay primero que listar el contenido, creando la estructura de directorios. Luego para cada archivo escribir su contenido en el path que le pertenece en la estructura.

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

__version__ = "$Revision$"

# $Id$
# $Source$

""" uncompress.py
    Clase utilitaria para descompactar tanto tar.gz
    como .zip (NO funciona para ZipGenius)
"""
# autor Jorge Rodrigez <jorge.rodriguez@continuum.cl>

import sys
import zipfile
import tarfile
import os
import os.path

class UnCompress:
    # file - str. Path del archivo
    # dir - str. Path donde descompactar el file
    def uncompress(self, file, dir):

        if os.path.exists(dir):
            # si existe lo borramos
            for root, dirs, files in os.walk(dir, topdown=False):
                for name in files:
                    os.remove(os.path.join(root, name))
                for name in dirs:
                    os.rmdir(os.path.join(root, name))
            if os.path.exists(dir): os.rmdir(dir)

        # creamos el dir target
        os.mkdir(dir)

        # si es un tar.gz
        if file.endswith(".tar.gz"):
            # extremadamente trivial
            tar = tarfile.open(file, mode='r:gz')
            tar.extractall(dir)
        # sino, si es un zip (mas complejo)
        elif file.endswith(".zip"):
            # creamos la estructura de directorio
            # donde copiar los archivos
            self._createstructure(file, dir)
            zf = zipfile.ZipFile(file)
           # para cada archivo que lista el zip
            for i, name in enumerate(zf.namelist()):
                # si no termina con '/' asumimos que es un archivo
                if not name.endswith('/'):
                    # creamos el archivo
                    outfile = open(os.path.join(dir, name), 'wb')
                    # copiamos el contenido
                    outfile.write(zf.read(name))
                    outfile.flush()
                    outfile.close()

    def _createstructure(self, file, dir):
        self._makedirs(self._listdirs(file), dir)

    def _makedirs(self, directories, basedir):
        """ crea los directorios """
        for dir in directories:
            curdir = os.path.join(basedir, dir)
            if not os.path.exists(curdir):
                os.mkdir(curdir)

    def _listdirs(self, file):
        """ crea una lista de los directorios
            que hay que crear
        """
        zf = zipfile.ZipFile(file)

        dirs = []
        for name in zf.namelist():
            if name.endswith('/'):
                dirs.append(name)
        # la ordenamos de menor a mayor
        dirs.sort()
        return dirs

['jQuery', 'prototypejs'].append(‘extjs’)

Mi posición es clara cuando se trata de escoger una tecnología para desarrollar RIA.

Así, luego de descartar Adoble (Flex y Air), Java FX, GWT, M$ Silverlight, o Curl (este lo seguiremos de cerca) y apostando por  JavaScript (Google también muestra su apuesta con Gears y V8, el engine de JavaScript de Chrome ) tenemos de nuevo varias opciones, que en mi opinión más que competir se complementan. Estas son las librerías jQuery, prototypejs, y extjs. Hay otra con fama ganada (Dojo), pero no haré referencia de ella en este post, a pesar de haberla probado.

Todas bajo el mismo modelo simple, usar el método de herencia prototypal de JavaScript para extender el modelo DOM que implementan los browsers, abstrayendo al programador e incorporando elementos como compatibilidad entre browsers, efectos visuales, utilitarios, etc.

Ya había usado durante unos 3 años prototypejs, luego lo complementé con jQuery, me sentía comodo usando estos frameworks javascript para crear aplicaciones web basadas en Ajax y usando JSON como protocolo de transferencia.

Pero entonces comencé a escribir una aplicación (desarrollo interno en Continuum) con interaccion visual compleja, extremadamente parecida a un IDE de programación, con árbol dinámico de navegación, grid de logs en tiempo real, ventanas para crear objetos, etc. Usabamos jQuery + algunos plugins. Luego de 3 dias de desarrollo teniamos mucho código HTML, no tanto código JavaScript y poco avance !.

Asi es que decidimos (1era persona del plural gracias a la insistencia de Israel Cruz) parar y buscar ayuda en extjs.com. Personalmente lo habia negado durante un año por 2 cosas (primero sentirme comodo con lo que teniamos, y segundo por su politica de licencia dual, o sea Comercial  y Open Source, ¿ porque pagar una licencia del software si tenia opciones gratis ?). Pero esta vez decidí probar. En definitiva, no es tan cara la licencia para el caso de un desarrollador y bueno, creo que merecen ganar algo de dinero con el trabajo que esta haciendo el equipo.

Baje la version 2.2 (actual estable), y nos sorprendió que en tan solo 1 dia desarrollé todo el layout + comportamiento visual (y aún más) de la funcionalidad que me habia tardado 3 días usando jQuery y sus plugins (Anexo un screenshot). Por ahi dicen que “Nunca es tarde si al dicha es buena, :P “.

Queriamos compartir la experiencia con nuestros clientes (mostrando la tecnología como partner tecnológico y publicitandonos como proveedor de soluciones). Asi es que para hacerlo más impactante tomamos una aplicación que habiamos construido para un cliente y en tan solo 3 días, dejando intacta toda la lógica de la parte del server (en este caso J2EE 1.4) descartamos la parte visual reconstruyendola desde 0 con extjs 2.2 (Anexo un screenshot de unas de las pantallas).

Concluyo que a pesar que John Resig (el genio detrás de jQuery) critique al equipo de extjs llamando de bizarra su modalidad de licenciamiento, no se puede negar la excelencia de la librería. En nuestro caso (Continuum), com cliente decidimos que era hora de incorporarla al stack que tenemos para el desarrollo de RIAs. Por eso ejecutamos:

['jQuery', 'prototypejs'].append('extjs')

En-theos-usmus en continuum !!

“Nada que valga la pena se logró jamás en la vida SIN entusiasmo“.

Emerson.

El Entusiasmo es un requisito indispensable para el éxito en la vida.

Y es definitivamente ENTUSIASMO lo que nos define en estos momentos en continuum, y por muchas cosas, pero principalmente porque cuando comenzamos solo sabiamos que queriamos escribir código con mucha calidad y que queriamos lucrar con ello. Sabiamos que estabamos preparado para ello, pero no teniamos una linea definida aún. Nos costó trabajo, pero luego de 3 meses y medio la encontramos. Y lo mejor, encontramos a donde queremos llegar. Ya tenemos nuestra linea de productos que serán dada a conocer con tiempo, justo cuando este sitio cambie de look and feel, por ahora entusiasmo, mucho entusiasmo y sobre todas las cosas muuuuchas lineas de código ! sin abandonar nuestro blog que llega a las 2000 visitas y que forma parte de nuestro entusiasmo al ver la curva del blogstat empinarse.

A continuación nuestra TODO LIST. Es algo así como nuestro continuuismo, y se resume a practicar lo que hemos predicado durante los años como empleados:

Nota: Lo que está en cursiva ya lo logramos:

  1. Hacer que las cosas Complejas parezcan simples.
  2. Practicar la filosofica DRY (Dont repeat Yourself) de la comunidad Ruby y Rails.
  3. Crear soluciones genericas.
  4. Re-usar proyectos Open Sources.
  5. Ser extremadamente tecnologicos (uhmm, es como el chocolate !). Que tal una aplicación que usa «extjs 2.0»,« jquery 1.6», «Ajax», y «comet» en el cliente, «Spring 2.5», «tomcat 6.0», «OOP» y «AOP» (soporte AspectJ de Spring 2.5) en la capa web server y «Websphere MQ»  junto a «WebsphereBroker 6.0» en la capa de integración?. Sip, la tenemos.
  6. Establecer una metodolgía y ambiente agil. Que tal tener un ambiente de desarrollo con «Cruise Control», Trac», «Subversion», y «Mingle» (usando «SCRUM» como metodología), y todo ejecutandose sobre «Ubuntu 7.04» . Pues sencillo, denle una mirada a «Buildix»
  7. Seguir a los lideres tecnologicos (follow the lider, lider, lider, follow the lider, sigueme !!!). Tenemos varios, leemos sus blogs todos los dias, y seguimos su filosofia.
  8. Trabajar de 8:00 AM 12:00 AM y de 13:00 AM a 17:00 PM (descansando 10 minutos cada 2 horas, tomando café Serrano, :P ). Uhmm, esta tiene prioridad, aun trabajamos hasta las 18:00 horas, malo malo !.
  9. Trabajar el viernes hasta las 12:00 AM. Para alla vamos !!!, tengo certeza !. Y seremos más ambiciosos. Trabajar hasta el jueves.
  10. Tener identidad. Estamos cerca, en breve salimos renovados !.

…Continuuará…

Conócenos

Tel: +56 2 9341951

e-mail: info@continuum.cl

Copyright © 2010 Continuum Ltda.
Coronel Pereira 72. Oficina 903. Las Condes. Santiago. Chile