Configuración de pre-commit con Ruff y MyPy para validar código
Clase 6 de 17 • Curso de Python Profesional: Arquitectura de Proyectos, Entornos y PyPI
Configura pre-commit para ejecutar validaciones automáticas antes de cada commit y evita que problemas de calidad lleguen a GitHub. Con Ruff como linter y formatter, más MyPy para tipos y reglas de seguridad de Bandit, tu código en Python cumple estándares desde el primer intento.
¿Qué es pre-commit y cómo garantiza calidad en cada commit?
Pre-commit es un framework que simplifica la configuración de hooks que se ejecutan automáticamente cada vez que haces un commit. Al instalarlo y crear el archivo de configuración pre-commit.config.yml, puedes activar reglas como corrección de fin de archivo, eliminación de espacios en blanco y validación de YAML. Al correr pre-commit install, el hook se integra en la carpeta .git para que todo commit pase por estas comprobaciones.
¿Qué reglas básicas conviene activar?
- end-of-file-fixer: asegura una línea vacía al final del archivo.
- trailing-whitespace: elimina espacios en blanco innecesarios.
- check-yaml: valida la sintaxis de archivos YAML.
¿Cómo instalar y configurar pre-commit con Ruff y MyPy?
Primero instala pre-commit como dependencia de desarrollo y valida que responde en la terminal. Si avisa que falta configuración, crea pre-commit.config.yml y añade tus reglas. Luego ejecuta pre-commit install: se activará el hook local.
- Herramientas clave: Ruff como linter y formatter. MyPy como analizador estático de tipos.
- Archivo de proyecto: pyproject.toml con la configuración de Ruff y reglas como Bandit.
- Habilidad práctica: interpretar mensajes de error y corregirlos antes del commit.
# Instalar el hook en el repositorio
pre-commit install
# Flujo de trabajo básico
git status
git add .
git commit -m "mensaje"
Un ejemplo minimal de estructura para pre-commit.config.yml con las reglas mencionadas:
repos:
- repo: ...
rev: ...
hooks:
- id: end-of-file-fixer
- id: trailing-whitespace
- id: check-yaml
- repo: ... # Integración de Ruff (Astral)
rev: ...
hooks:
- id: ruff
- id: ruff-format
- repo: ... # mirrors-mypy
rev: "1.8.0"
hooks:
- id: mypy
¿Cómo probar la configuración con Ruff?
- Genera un cambio que viole una regla: por ejemplo, una línea muy larga.
- Ejecuta git add y git commit con un mensaje como “intento de commit malo”.
- El primer commit puede instalar dependencias de hooks automáticamente.
- Verás que Ruff bloquea el commit con el detalle del error: la línea supera el límite.
¿Cómo integrar MyPy en los hooks?
- Añade mirrors-mypy con un ref que coincida con tu versión, por ejemplo: "1.8.0".
- Guarda cambios y recuerda: si modificas pre-commit.config.yml, debes hacer git add de ese archivo para que el hook lo tenga en cuenta.
- Reintenta el commit y confirma que MyPy ejecute sus comprobaciones.
¿Cómo validar, evitar errores y aplicar seguridad con Bandit?
Puedes necesitar terminar un commit urgente y omitir las verificaciones de estilo. En ese caso, usa la opción --no-verify al final del comando de commit. Úsala con responsabilidad.
git commit -m "mensaje urgente" --no-verify
Para seguridad, activa reglas de Bandit desde la configuración de Ruff en tu pyproject.toml. Un caso típico es la regla S307, que alerta sobre el uso inseguro de eval.
# Ejemplo inseguro: Bandit S307
user_input = input("Ingresa una expresión:")
resultado = eval(user_input) # Inseguro: ejecución arbitraria de código
- Al intentar el commit, pre-commit mostrará: “función insegura, considera cambiarla”.
- Elimina el uso de eval y vuelve a ejecutar git add y git commit.
- El commit pasará cuando el código cumpla las reglas activadas.
¿Qué buenas prácticas mejoran tu flujo?
- Configúralo desde el inicio del proyecto para estándares consistentes.
- Incluye solo herramientas esenciales para no ralentizar los commits.
- Combínalo con continuous integration y continuous deployment para doble validación: local y remota.
¿Te funcionó esta guía y activaste tus hooks con Ruff y MyPy? Comparte en comentarios qué reglas usas y qué errores te ayudan a prevenir.