22. Configuración del proyecto con pyproject.toml para herramientas de calidad

22.1 Objetivo del tema

Un proyecto de calidad no depende solo de recordar comandos. Conviene centralizar la configuración de herramientas para que todos los integrantes trabajen con los mismos criterios.

En este tema usaremos pyproject.toml para configurar metadatos del proyecto, pytest, Black, isort, Ruff y mypy. La idea es tener una base simple y repetible para el proyecto ventas_demo.

Objetivo práctico: construir un pyproject.toml claro que concentre la configuración básica de las herramientas de calidad del proyecto.

22.2 Qué es pyproject.toml

pyproject.toml es un archivo de configuración usado por muchos proyectos Python modernos. Permite declarar información del proyecto y configurar herramientas en un formato común.

En lugar de tener muchos archivos separados, podemos centralizar buena parte de la configuración en un solo lugar.

22.3 Ubicación del archivo

El archivo debe estar en la raíz del proyecto, junto a carpetas como src y tests.

ventas_demo/
|-- pyproject.toml
|-- src/
|   `-- ventas.py
`-- tests/
    `-- test_ventas.py

Las herramientas buscarán este archivo para leer su configuración.

22.4 Metadatos básicos del proyecto

Una sección inicial puede describir el proyecto:

[project]
name = "ventas-demo"
version = "0.1.0"
description = "Proyecto de práctica para calidad de código y code smells"
requires-python = ">=3.10"

Estos datos no mejoran el diseño por sí mismos, pero ayudan a identificar el proyecto y sus requisitos mínimos.

22.5 Configurar pytest

Podemos indicar dónde están las pruebas y cómo importar código desde src:

[tool.pytest.ini_options]
pythonpath = ["src"]
testpaths = ["tests"]
addopts = "-q"

Con esto, podemos ejecutar simplemente:

python -m pytest

22.6 Configurar Black

Black se configura con una longitud de línea y versión objetivo:

[tool.black]
line-length = 88
target-version = ["py310"]

Luego puedes ejecutar:

python -m black src tests

22.7 Configurar isort

Para que isort sea compatible con Black, usamos el perfil black:

[tool.isort]
profile = "black"
line_length = 88

Comando habitual:

python -m isort src tests

22.8 Configurar Ruff

Ruff permite definir versión objetivo, longitud de línea y reglas activas.

[tool.ruff]
line-length = 88
target-version = "py310"

[tool.ruff.lint]
select = ["E", "F", "B", "SIM", "I", "C901"]
ignore = []

[tool.ruff.lint.mccabe]
max-complexity = 6

Comando habitual:

python -m ruff check src tests

22.9 Configurar mypy

Una configuración gradual para mypy puede ser:

[tool.mypy]
python_version = "3.10"
warn_return_any = true
warn_unused_configs = true
disallow_untyped_defs = false
check_untyped_defs = true

Comando habitual:

python -m mypy src

22.10 pyproject.toml completo

Una versión completa para ventas_demo puede ser:

[project]
name = "ventas-demo"
version = "0.1.0"
description = "Proyecto de práctica para calidad de código y code smells"
requires-python = ">=3.10"

[tool.pytest.ini_options]
pythonpath = ["src"]
testpaths = ["tests"]
addopts = "-q"

[tool.black]
line-length = 88
target-version = ["py310"]

[tool.isort]
profile = "black"
line_length = 88

[tool.ruff]
line-length = 88
target-version = "py310"

[tool.ruff.lint]
select = ["E", "F", "B", "SIM", "I", "C901"]
ignore = []

[tool.ruff.lint.mccabe]
max-complexity = 6

[tool.mypy]
python_version = "3.10"
warn_return_any = true
warn_unused_configs = true
disallow_untyped_defs = false
check_untyped_defs = true

22.11 Instalar las herramientas

En el entorno virtual del proyecto, instala las herramientas necesarias:

python -m pip install pytest black isort ruff mypy

Verifica versiones:

python -m pytest --version
python -m black --version
python -m isort --version
python -m ruff --version
python -m mypy --version

22.12 Comandos de revisión

Con el archivo configurado, podemos revisar el proyecto con estos comandos:

python -m ruff check src tests
python -m mypy src
python -m pytest

Y aplicar formato con:

python -m isort src tests
python -m black src tests

22.13 Orden sugerido

Un flujo práctico durante el desarrollo es:

python -m isort src tests
python -m black src tests
python -m ruff check src tests
python -m mypy src
python -m pytest

isort y Black modifican formato. Ruff, mypy y pytest revisan calidad, tipos y comportamiento.

22.14 Modo check para automatización

Cuando no quieres modificar archivos, usa modos de revisión:

python -m isort --check-only src tests
python -m black --check src tests
python -m ruff check src tests
python -m mypy src
python -m pytest

Esto es útil para revisiones automáticas, pre-commit o CI/CD.

22.15 Evitar configuración contradictoria

Las herramientas deben trabajar con criterios compatibles. Por ejemplo, si Black usa línea de 88 caracteres e isort usa otro criterio, puedes tener cambios repetidos e innecesarios.

Buenas prácticas:

  • Usar el mismo límite de línea en herramientas relacionadas.
  • Configurar isort con profile = "black".
  • No activar reglas de Ruff que contradigan el formateador elegido.
  • Documentar comandos habituales en el README.

22.16 Documentar comandos en README

Agrega una sección de comandos al README.md:

## Comandos de calidad

Formatear:

python -m isort src tests
python -m black src tests

Revisar:

python -m ruff check src tests
python -m mypy src
python -m pytest

Esto reduce dudas y ayuda a que todos ejecuten las mismas revisiones.

22.17 Ejercicio guiado

Crea o actualiza el archivo pyproject.toml de ventas_demo con las secciones de pytest, Black, isort, Ruff y mypy. Luego ejecuta:

python -m isort --check-only src tests
python -m black --check src tests
python -m ruff check src tests
python -m mypy src
python -m pytest

Si alguna herramienta falla, corrige el problema o ajusta la configuración de forma justificada.

22.18 Ejercicio propuesto

Realiza estas tareas:

  • Centraliza la configuración del proyecto en pyproject.toml.
  • Elimina configuraciones duplicadas si existen en otros archivos.
  • Documenta los comandos en README.md.
  • Ejecuta todos los comandos de revisión.
  • Explica qué hace cada herramienta en una línea.

22.19 Lista de verificación

Antes de continuar, verifica que puedes hacer lo siguiente:

  • Ubicar pyproject.toml en la raíz del proyecto.
  • Configurar pytest para usar src y tests.
  • Configurar Black e isort de forma compatible.
  • Configurar Ruff con reglas básicas y complejidad.
  • Configurar mypy de forma gradual.
  • Ejecutar comandos de formato, linting, tipado y pruebas.
  • Documentar el flujo de calidad en el README.

22.20 Conclusión

En este tema centralizamos la configuración de herramientas de calidad en pyproject.toml. Esto hace que el proyecto sea más consistente, fácil de revisar y más simple de preparar en otro equipo.

En el próximo tema usaremos pre-commit para ejecutar controles de calidad antes de confirmar cambios.