Una herramienta interesante es pre-commit, que básicamente nos permite hacer un chequeo extra antes de crear un commit, ejecutando procesos, linters, etc…, de ésta forma tenemos una seguridad extra de que el código con el cual estamos trabajando cumple ciertos estándares definidos antes de subirlo al repositorio.

Está creado en Python, así que en primera instancia, hay que tenerlo instalado.

1. Crear entorno virtual

Nada del otro mundo, en un entorno virtual ejecutas pip:

pip install virtualenv
python3 -m virtualenv mi_entorno

# Windows / CMD
./mi_entorno/Source/activate

# Linux / Mac
source ./mi_entorno/bin/activate

(mi_entorno) ...

2. Crear proyecto (en este ejemplo, de Python)

Acá pueden usar Poetry o UV que ya utilizan el nuevo estándar (con pyproject.toml ), sino la otra opción es usar setup.py que es la que voy a mostrar acá, que sería la forma “clásica” (y que pronto va a quedar deprecada, pero la idea es la misma)

./
├── mi_entorno/
│   ├── .../
├── mi_hook/
│   ├── __init__.py
│   └── main.py
└── tests/
│   ├── __init__.py
│   ├── .../
└── setup.py

3. Configuración de setup.py

Éste archivo es el cual utiliza Python para poder crear el ejecutable y se pueda instalar en otros proyectos y ser utilizado, por lo tanto, vamos a añadirle la configuración necesaria y los metadatos:

from pathlib import Path
from setuptools import find_packages, setup

setup(
    name="mi_hook",
    version="1.0.0",
    description="Mi hook de prueba",
    author="Facundo Padilla",
    author_email="...",
    license="MIT",
    packages=find_packages(exclude="tests"),
    zip_safe=False,
    install_requires=Path("requirements.txt").read_text().splitlines(),
    entry_points={
        "console_scripts": [
            "mi_hook = mi_hook.main:app"
        ]
    }
)

Lo más importante acá es lo siguiente:

4. Generar el requirements.txt

Como mencione anteriormente, vamos a instalar Typer, que es un package basado en Click pero con el agregado de Pydantic:

(mi_entorno) pip install typer

Ahora vamos a generar el requirements.txt

(mi_entorno) pip freeze > requirements.txt

Tengan en cuenta de eliminar pre-commit del requirements.txt porque no es una dependencia de nuestro proyecto.