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.
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.
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.
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.
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
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
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
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
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
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
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
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
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.
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.
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:
profile = "black".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.
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.
Realiza estas tareas:
pyproject.toml.README.md.Antes de continuar, verifica que puedes hacer lo siguiente:
pyproject.toml en la raíz del proyecto.src y tests.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.