Foros del Web » Programando para Internet » Python »

Cómo puedo hacer este empaquetador?

Estas en el tema de Cómo puedo hacer este empaquetador? en el foro de Python en Foros del Web. Hola foreros. Pues bueno, el día de hoy se me presentó un reto, el cual consiste en crear un empaquetador para una aplicación llamada iRep. ...
  #1 (permalink)  
Antiguo 08/10/2012, 16:09
Avatar de kvillaloboscr  
Fecha de Ingreso: agosto-2012
Ubicación: Costa Rica
Mensajes: 12
Antigüedad: 11 años, 8 meses
Puntos: 1
Cómo puedo hacer este empaquetador?

Hola foreros.

Pues bueno, el día de hoy se me presentó un reto, el cual consiste en crear un empaquetador para una aplicación llamada iRep. La cosa es que ocupo agarrar el contenido de un proyecto y crear un paquete independiente para cada página, tomando en cuenta su nombre.

A ver si me expliqué bien; tengo el siguiente árbol de directorios:

Cita:
|- _css/
|--- Pag01.css
|
|- _img/
|--- _thumb/
|----- Pag01-thumb.png
|----- Pag02-thumb.png
|----- Pag03-thumb.png
|
|--- _full/
|----- Pag01-full.png
|----- Pag02-full.png
|----- Pag03-full.png
|
|--- Pag01/
|----- background.png
|----- logo.jpg
|
|--- Pag02/
|----- header.png
|
|- _template/
|--- style.css
|--- config.js
|
|- Pag01.html
|- Pag02.html
|- Pag03.pdf
Los he seccionado por los siguientes colores:
- Los verdes, deben de ir en todos los paquetes.
- Los amarillos, deben de ir en el paquete amarillo, los rojos en el rojo, y así sucesivamente, al final debe de quedar algo así:

Cita:
|- Pag01
|--- _css/
|----- Pag01.css
|
|--- _img/
|----- Pag01/
|------- background.png
|------- logo.jpg
|
|--- _template/
|----- style.css
|----- config.js
|
|--- Pag01.html
|--- Pag01-thumb.png
|--- Pag01-full.png
|
|
|- Pag02
|--- _img/
|----- Pag02/
|------- header.png
|
|--- _template/
|----- style.css
|----- config.js
|
|--- Pag02.html
|--- Pag02-thumb.png
|--- Pag02-full.png
|
|
|- Pag03
|--- _template/
|----- style.css
|----- config.js
|
|--- Pag03.html
|--- Pag03-thumb.png
|--- Pag03-full.png

Como pudieron ver, lo que hago es lo siguiente:
  1. Agarrar el nombre del archivo que se encuentra en la raíz de la carpeta (Page01.html, Page02.html, Page03.pdf) y luego crear una carpeta a partir de ese nombre, solo que sin la extensión.
  2. Recorrer la carpeta _css hasta encontrar el nombre del archivo con extensión .css y agregarlo a la carpeta creada en el punto 1.
  3. Hago lo mismo con la carpeta _img, solo que en esta creo la carpeta con el nombre del paquete, y dentro las imagenes que le corresponden.
  4. Agrego la carpeta _template a todos los paquetes (ya que es general).
  5. En la raíz de la carpeta creada en el punto 1, meto el archivo .html, y la imagen thumb y full.

Y pues bueno, me gustaría saber más o menos como puedo hacer eso en Python.
Un saludo.
  #2 (permalink)  
Antiguo 08/10/2012, 17:05
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 1 mes
Puntos: 1360
Respuesta: Cómo puedo hacer este empaquetador?

Solo tienes que saber como moverte en python.

Con os.walk puedes recorrer el árbol de directorios.

Con shutil.copy copias archivos.

Con os.mkdir creas carpetas.

Y con el modulo re puedes usar expresiones regulares para sacar coincidir patrones con el nombre de los archivos.

Básicamente todo lo que necesitas para programarlo en python.
  #3 (permalink)  
Antiguo 08/10/2012, 17:45
Avatar de kvillaloboscr  
Fecha de Ingreso: agosto-2012
Ubicación: Costa Rica
Mensajes: 12
Antigüedad: 11 años, 8 meses
Puntos: 1
Respuesta: Cómo puedo hacer este empaquetador?

Gracias, razpeitia.

Supongo que voy a tener que utilizar mucha recursividad para hacerlo, pero voy a hacer el intento. De igual manera, como es un proyecto, ofrezco remuneración por si alguien se anima a crearlo o a colaborar con el packager.
  #4 (permalink)  
Antiguo 08/10/2012, 23:13
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 1 mes
Puntos: 1360
Respuesta: Cómo puedo hacer este empaquetador?

No necesitas tanta recursividad. Para hacer este "simple" script.

Imagina que estas en alguna carpeta, y dentro de esa carpeta tienes una carpeta que llamaremos 'a' donde tienes la siguiente estructura.

Código:
a
├── _css
│** └── Pag01.css
├── _img
│** ├── _full
│** │** ├── Pag01-full.png
│** │** ├── Pag02-full.png
│** │** └── Pag03-full.png
│** ├── Pag01
│** │** ├── background.png
│** │** └── logo.jpg
│** ├── Pag02
│** │** └── header.png
│** └── _thumb
│**     ├── Pag01-thumb.png
│**     ├── Pag02-thumb.png
│**     └── Pag03-thumb.png
├── Pag01.html
├── Pag02.html
├── Pag03.pdf
└── _template
    ├── config.js
    └── style.css
Lo que hice para resolver este problema es muy sencillo (inspirado en el URLConf de Django):
Recorro los archivos y por cada archivo, reviso la lista de patrones, si llega a coincidir con un patrón entonces en base a ese patrón se formatea un nuevo destino a donde va a ser copiado.

Es un script rápido (mas o menos 2 - 3 horas) que hice:
Código Python:
Ver original
  1. import os
  2. import re
  3.  
  4. def source(pattern_path):
  5.     pattern = re.compile(pattern_path)
  6.     def match(path):
  7.         m = pattern.match(path)
  8.         return m
  9.     return match
  10.  
  11. def destination(str_format):
  12.     "Format string with arguments recieved"
  13.     def format_path(match):
  14.         args = match.groups()
  15.         return str_format.format(*args)
  16.     return format_path
  17.  
  18. patterns = (
  19.     (source(r'^a/_img/_full/Pag(\d+)-full\.(png|jpg|gif)$'), destination('b/Pag{0}')),
  20.     (source(r'^a/_img/_thumb/Pag(\d+)-thumb\.(png|jpg|gif)$'), destination('b/Pag{0}')),
  21.     (source(r'^a/_img/Pag(\d+)/'), destination('b/Pag{0}/_img/Pag{0}')),
  22.     (source(r'^a/_css/Pag(\d+)\.css$'), destination('b/Pag{0}/_css')),
  23.     (source(r'^a/Pag(\d+)\.'), destination('b/Pag{0}')),
  24.     (source(r'^a/_template'), destination('b/Pag01/_template')),
  25.     (source(r'^a/_template'), destination('b/Pag02/_template')),
  26.     (source(r'^a/_template'), destination('b/Pag03/_template')),
  27. )
  28.  
  29. # Kids, never ever indent this much
  30. # It's just for fast programming sake
  31. dir_tree = os.walk('a/')
  32. for path, dirs, files in dir_tree:
  33.     for file_ in files:
  34.         full_path = os.path.join(path, file_)
  35.         for src, dst in patterns:
  36.             match = src(full_path)
  37.             if match:
  38.                 command = 'mkdir -p %s' % (dst(match),)
  39.                 print command
  40.                 os.system(command)
  41.                
  42.                 command = "cp %s %s" % (full_path, dst(match))
  43.                 print command
  44.                 os.system(command)

Una vez que corre el script al mismo nivel de la carpeta 'a' obtengo una carpeta hermana llamada 'b'.

Con la siguiente estructura:
Código:
b/
├── Pag01
│** ├── _css
│** │** └── Pag01.css
│** ├── _img
│** │** └── Pag01
│** │**     ├── background.png
│** │**     └── logo.jpg
│** ├── Pag01-full.png
│** ├── Pag01.html
│** ├── Pag01-thumb.png
│** └── _template
│**     ├── config.js
│**     └── style.css
├── Pag02
│** ├── _img
│** │** └── Pag02
│** │**     └── header.png
│** ├── Pag02-full.png
│** ├── Pag02.html
│** ├── Pag02-thumb.png
│** └── _template
│**     ├── config.js
│**     └── style.css
└── Pag03
    ├── Pag03-full.png
    ├── Pag03.pdf
    ├── Pag03-thumb.png
    └── _template
        ├── config.js
        └── style.css
Sientete libre de modificar el script para que cubra tus necesidades.

PD: Este script esta atado al sistema operativo en este caso ubuntu, para hacerlo correr en windows necesitas cambiar las llamadas al sistema (osea los comandos).

Etiquetas: gui, nombre, template
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 06:40.