Uso de Hooks en Cookie Cutter para Automatizar Proyectos
Resumen
Introducción a Hooks
Los Hooks son sentencias que se van a ejecutar antes o después de generar la plantilla de datos. Por ejemplo, puedes usarlos para verificar el nombre de una carpeta, actualizar git, etc.
Implementación de Hooks
Se crea la carpeta "hooks", adentro de la carpeta principal de tu proyecto.
Dentro de la carpeta se agregan los archivos "pre_gen_project.py" (lo que se ejecuta antes de generar la plantilla) y "pos_gen_project.py" (lo que se ejecuta después de generar la plantilla).
Por ejemplo, en "pre_gen_project.py" se puede inicializar git o validar nombres y archivos para evitar errores.
En el archivo "pos_gen_project.py" se puede hacer el primer commit en git o mostrar la finalización de la instalación de dependencias.
A veces las clases saben ser muy overwhelming. Mírenla al día siguiente de nuevo y muchas cosas se aclaran amigos :c
Me parece que los conceptos son bastante simples, después está el tema del código, el cual agrega mucho por fuera de lo que se da en Python en cualquier ruta en la que se encuentre este curso. Pero me parece que es mas un tema de ignorar esa parte, porque el código que hay en Python es infinito!
import os
import sys
project_slug ="{{ cookiecutter.project_slug }}"ERROR_COLOR ="\x1b[31m"# To change the terminal colorMESSAGE_COLOR ="\x1b[34m"RESET_ALL ="\x1b[0m"if project_slug.startswith("x"):print(f'{ERROR_COLOR}ERROR: {project_slug=} is not a valid name for this template.{RESET_ALL}') sys.exit(1)print(f"{MESSAGE_COLOR}Let's do it! You're going to create something awesome!")print(f"Creating project at { os.getcwd()}{RESET_ALL}")
post_gen_project.py code:
import subprocess
MESSAGE_COLOR ="\x1b[34m"RESET_ALL ="\x1b[0m"print(f"{MESSAGE_COLOR}Almost done!")print(f"Initializing a git repository...{RESET_ALL}")subprocess.call(['git','init'])subprocess.call(['git','add','*'])subprocess.call(['git','commit','-m','Initial commit'])print(f"{MESSAGE_COLOR}The beginning of your destiny is defined now! Create and have fun!{RESET_ALL}")
Aquí está mi post_gen_project.py. Genera una ambiente virtual, instala los paquetes de requierements.txt y además configura todo para correr las .iypnb notebooks en vscode.
import subprocess
# Iniciar ambiente virtualsubprocess.call(['python','-m','venv','venv'])# Path to a Python interpreter that runs any Python script# under the virtualenv /path/to/virtualenv/python_venv = os.getcwd()+"\\venv\\Scripts\\python.exe"subprocess.call([python_venv,'-m','pip','--upgrade','pip'])subprocess.call([python_venv,'-m','pip','install','-r','requirements.txt'])# Configurar el ambiente para recibir notebooks.if'{{ cookiecutter.project_packages }}'=='Notebook': subprocess.call([python_venv,'-m','ipykernel','install','--user','--name','venv'])# Iniciar gitsubprocess.call(['git','init'])subprocess.call(['git','add','*'])subprocess.call(['git','commit','-m','Initial commit'])
Gracias..!
Una abreviación
Dentro de la carpeta hooks pueden usar
touch {pre,post}_gen_project.py
para crear ambos archivos.
Siento que es demasiado sin ser claro. no tiene una explicación ni recorrido continuo. se va por las ramas y así no se aprende correctamente. solamente te marea
Por si alguien le llamo la atención lo de los colores como a mi, investigue se llama ANSI code
import re
import sys
MODULE_REGEX= r'^[_a-zA-Z][_a-zA-Z0-9]+$'module_name ='{{ cookiecutter.module_name }}'if not re.match(MODULE_REGEX, module_name):print('ERROR: %s is not a valid Python module name!'% module_name) # exits with status 1 to indicate failure
sys.exit(1)
Un pequeño cambio para 2026 en el cookiecutter.json:
{"project_title":"Cookiecutter Personal","project_slug":"{{ cookiecutter.project_title.lower().replace(\" \", \"_\").replace(\"-\", \"_\") }}","project_description":"Tu primer proyecto con Cookiecutter.","project_author_name":"Tu nombre","project_packages":["All, Minimal"],"python_version":"3.13"}
Sin duda si quisieran mejorar la privacidad, entorno de trabajo, y protección de datos, carpetss personales y no personales de trabajo, este curso puede ser arma principal para mejorar entornos de trabajo, incluso sin duda esta área de entorno de trabajo para ciencia de datos aplica Incluso para sector gobierno, sin importar Incluso nivel, aún así sin duda para mejorar la privacidad pueden usar un sotfware hardware que no se allá Elaborado en ee.uu u.e con fines de protección de soberanía que es la más importante, algunas algunos naciones tendrían que recibir una gran "lección internacional" para mejorar sus Infraestructura, tecnología, y protección en base a sotfware hardware que no son de la otan, por ejemplo brics que ya comienza con estos estas proyectos porque la soberanía es importante y civiles habitantes no tienen porqué estar siendo afectados(as) o estar haciendo trabajo que no les pertenece pero que además ni reciben sueldos salarios de instituciones Incluso de seguridad de soberanía y que sin duda Demuestra la alta corrupción, fallas, Incluso problemas de tecnología, y problemas de falta de apreciación nacional internacional, situación que no tiene porqué afectar a habítantes civiles incluso turistas sin excusas y pretextos. Gran falla internacional.
En fin se de lo que redacto xD.
siento que el "profesor"
Los "hooks" (ganchos)
Son scripts o comandos que se ejecutan automáticamente en ciertos momentos durante el proceso de uso de Git. Estos ganchos te permiten personalizar y automatizar tareas específicas en tu flujo de trabajo de desarrollo. Puede usar ganchos para ejecutar pruebas automáticas, formatear código, verificar requisitos antes de confirmar cambios, entre otras cosas.
Los hooks en Git residen
En la carpeta .git/hooksen el directorio raíz de tu repositorio. Allí encontrará una serie de archivos de ejemplo con nombres como pre-commit.sample, post-commit.sample, etc. Para activar un gancho, debe renombrar el archivo relevante eliminando el .samplenombre del archivo.
eso de copiar y pegar sin explicar no me gusta la verdad me toca ir indagando para que sirve todo.
Me sale lo siguiente en VS Code:
Author identity unknown
*** Please tell me who you are.
Tengo git bash instalado y ya registré mi email. Quizás me falta una configuración extra, alguien me podría decir que es lo que pasa?
y la alternativa para hacerlo sin conda?
¡Hola, Diego!
Algunas opciones son:
Crearlo sin un ambiente (no recomendado).
Ambiente pyenv
Ambiente con poetry.
Tengo cookiecutter y python instalados
File"<fstring>", line 1(project_slug=)^SyntaxError: invalid syntax
ERROR:Stopping generation because pre_gen_project hook script didn't exit successfully
hola Jose también tube el mismo problema,
el problema esta en el = en el archivo de pre process en hooks, creo que es una sintaxis que ya no se soporta
if project_slug.startswith("x"):print(f'{ERROR_COLOR}ERROR: {=project_slug} is not a valid name for this template.{RESET_ALL}')```
asi seria sin el igual lo que para mi me funciono
if project_slug.startswith("x"):print(f'{ERROR_COLOR}ERROR: {project_slug} is not a valid name for this template.{RESET_ALL}')
nota: el igual puede estan antes o despues
if project_slug.startswith("x"):print(f'{ERROR_COLOR}ERROR: {project_slug=} is not a valid name for this template.{RESET_ALL}')
así me imagino que estaba en tu caso
Alguna idea para solucionar el ERROR, gracias
Es un error y no lo es jeje. Al profesor también le apareció eso, es porque ha sido conducido hasta el "sys.exit(1)" del código de pre_gen_project.py. O sea es un error apropósito para que no se cree el proyecto que su nombre comience con "x". Si ese no es el caso, comparte el código para ayudarnos
cómo puedo capturar el TemplateSyntaxError para que no salga el traceback todo feo y colocarle el error ?
quise hacerlo en el hook de pre pero no lo captura
Los **hooks** en **Cookiecutter** son scripts que te permiten ejecutar código adicional antes o después de que se genere el proyecto a partir de una plantilla. Puedes usarlos para automatizar tareas adicionales, como la instalación de dependencias, la creación de archivos dinámicos o cualquier configuración extra que quieras realizar en tu plantilla personalizada.
### Tipos de hooks en Cookiecutter
1. **Pre-hook** (pre\_gen\_project): Se ejecuta antes de que Cookiecutter genere el proyecto.
2. **Post-hook** (post\_gen\_project): Se ejecuta después de que Cookiecutter genera el proyecto.
Estos hooks son scripts de Python o shell que se ejecutan durante el proceso de generación de la plantilla.
### Cómo implementar hooks en una plantilla Cookiecutter
#### Paso 1: Crear el directorio hooks
Dentro de tu estructura de plantilla, crea un directorio llamado hooks. Este directorio contendrá los scripts que quieres ejecutar antes o después de la generación del proyecto.
#### Paso 2: Escribir el hook pre\_gen\_project.py
Este hook se ejecuta **antes** de que Cookiecutter genere el proyecto. Puedes usarlo para validar entradas o preparar el entorno.
Por ejemplo, si deseas asegurarte de que el nombre del proyecto no contiene espacios, puedes escribir un script pre\_gen\_project.py:
import sys
from cookiecutter.utils import prompt\_for\_config
project\_name ='{{ cookiecutter.project\_name }}'if" "in project\_name:  print("ERROR: El nombre del proyecto no debe contener espacios.")  sys.exit(1)
#### Paso 3: Escribir el hook post\_gen\_project.py
Este hook se ejecuta **después** de que se ha generado el proyecto. Puedes usarlo para automatizar tareas adicionales, como inicializar un repositorio de Git, instalar dependencias o imprimir mensajes personalizados.
Por ejemplo, si quieres inicializar un repositorio de Git después de generar el proyecto, puedes crear un script post\_gen\_project.py:
import os
import subprocess
\# Inicializar un repositorio de Git
subprocess.run(\['git','init'])
\# Crear un commit inicial
subprocess.run(\['git','add','.'])subprocess.run(\['git','commit','-m','Initial commit'])
#### Paso 4: Probar los hooks
Una vez que has creado los hooks, puedes ejecutar **Cookiecutter** para probarlos:
cookiecutter path/to/project-template
Si todo está bien, el pre-hook se ejecutará antes de que se genere el proyecto y el post-hook después de que se genere el proyecto.
### Ejemplos de tareas comunes con hooks
- **Validar entradas**: Con un pre-hook, puedes validar que los valores ingresados en cookiecutter.json cumplan con ciertos requisitos.
- **Instalar dependencias**: Un post-hook puede ejecutar pip install o npm install automáticamente después de generar un proyecto.
- **Inicializar repositorios**: Usar hooks para crear un repositorio Git automáticamente y hacer un commit inicial.
- **Generar archivos adicionales**: Después de la generación del proyecto, un post-hook puede generar archivos adicionales o modificar archivos existentes.
### Resumen
Los **hooks** en Cookiecutter son una poderosa forma de personalizar aún más tus plantillas de proyectos, permitiéndote automatizar tareas complejas y mantener la flexibilidad. Con ellos puedes ejecutar validaciones previas o tareas de post-procesamiento de manera eficiente, optimizando el flujo de trabajo del desarrollo de proyectos.
Yo no configuro git a modo global (siempre lo hago proyecto por proyecto), por lo que cada vez que inicializo un proyecto, debo configurar usuario y mail.
En el hook de post uso la variables que he creado en el json (dos nuevas variables, una para usergit y otra para mailgit) y con ello complemento el git init y commit.