Configuración de pre-commit con Ruff y MyPy para validar código

Clase 6 de 17Curso de Python Profesional: Arquitectura de Proyectos, Entornos y PyPI

Resumen

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.