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.
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) ...
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
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:
install_requires
: con éste parámetro lo que hacemos es indicar que cuando se instale nuestro package, también instale las dependencias que utiliza (vamos a usar Typer)entry_points
: éste parámetro así como está en el código de arriba, nos sirve para que una vez tengamos instalado nuestro paquete, lo podamos ejecutar en la terminal sin utilizar Python “directamente”, o sea, así como instalamos Django y luego usamos django-admin startapp <algo>
o pre-commit —version
, lo mismo, acá sería mi_hook <lo que sea>
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.