No tienes acceso a esta clase

¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera

Implementar hooks

4/14
Recursos

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.

Contribución creada por: Néstor Arellano.

Aportes 16

Preguntas 4

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad?

Subproceso para instalar las librerias en requirements.txt

subprocess.call(['pip', 'install', '-r', 'requirements.txt'])

A veces las clases saben ser muy overwhelming. Mírenla al día siguiente de nuevo y muchas cosas se aclaran amigos :c

Código

cookiecutter.json code:

{
    "project_title": "Cookiecutter Personal",
    "project_slug": "{{ cookiecutter.project_title.lower().replace(' ', '_') }}",
    "project_description": "Something cool",
    "project_author_name": "Your name",
    "project_packages": ["All", "Minimal"],
    "python_version": "3.7"
}

pre_gen_project.py code:

import os
import sys

project_slug = "{{ cookiecutter.project_slug }}"

ERROR_COLOR = "\x1b[31m" # To change the terminal color
MESSAGE_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}")

Una abreviación
Dentro de la carpeta hooks pueden usar

touch {pre,post}_gen_project.py

para crear ambos archivos.

Excelente y entendido

Example: Validating template variables

Using Pre/Post-Generate Hooks

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)

Por si alguien le llamo la atención lo de los colores como a mi, investigue se llama ANSI code

https://www.lihaoyi.com/post/BuildyourownCommandLinewithANSIescapecodes.html

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.

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.
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. La estructura de la plantilla se verá así: ``` project-template/ ├── cookiecutter.json ├── {{cookiecutter.project\_name}}/ │ ├── README.md │ ├── setup.py │ └── {{cookiecutter.module\_name}}/ │ ├── \_\_init\_\_.py │ └── main.py └── hooks/ ├── pre\_gen\_project.py └── post\_gen\_project.py ``` \#### 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`: ```python 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`: ```python 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: ```bash 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. Solo por eso me parecio mas genial!!!

genial!

Muy buena esa clase, empecé el módulo como con nervios, no entendí casi, pero vamos conociendo el alancé y uff. Me toca aprender buscar librerías tan útiles.

Cuando se ejecute el comando

cookiecutter https://github.com....

Hay que asegurse estar activo en el ambiente virtual,sino dara el siguiente error “cookiecutter no se reconoce como un comando interno o externo”

Estando activo en un ambiente se puede hacer de esta forma :

C:\Users\usuario\Documents\Platzi-cursos\Probando_Cookiecutter
(cookiecutter-personal) λ cookiecutter https://github.com/IvanTolaba/cookiecutter_prueba

estando activo en el ambiente (cookiecutter-personal) ,parado en la carpeta Probando_Cookiecutter ,ejecuto el comando de una plantilla de nombre diferente en github llamada cookiecutter_prueba y lo crea en esa carpeta,funciona !!!

Personal Mistakes:

  1. Make sure you’ve removed the default Prefix from environment.yml that’s part of cookiecutter.
  2. Mamba is better off, so create your venv and then install your packages with mamba as show bellow.
subprocess.call(['conda', 'create', '-n', '{{cookiecutter.environment_name}}'])
subprocess.call(['mamba','env','update','-n','{{cookiecutter.environment_name}}','-f','environment.yml'])

Estuvo muy completo.