Ruff es un linter y formateador de código Python creado por Astral. Está escrito en Rust, y ese es precisamente el motivo por el que es tan rápido: reemplaza herramientas como Flake8, Black, isort, pydocstyle, pyupgrade y autoflake. En total soporta más de 900 reglas para revisar códigos, aunque no todas vienen activas de fábrica: corrige errores automáticamente y usa caché para no repetir trabajo de más. Proyectos como Pandas, FastAPI, Hugging Face y Apache Airflow ya lo usan en producción.
La razón por la que se volvió el estándar tan rápido no es que "sea otro linter más". Es que hace en 0.2 segundos lo que a otras herramientas les toma 20.
Instalarlo de forma global, para usarlo en cualquier proyecto:
uv tool install ruff@latest
Agregarlo como dependencia de desarrollo de tu proyecto actual:
uv add --dev ruff
Ejecutarlo sin instalarlo, directo desde uvx:
uvx ruff check
uvx ruff format
Cómo correrlo una vez instalado
Si lo instalaste con uv tool install, ya tienes el comando ruff disponible en cualquier proyecto:
ruff check # revisa todos los archivos del directorio actual
ruff format # formatea todos los archivos del directorio actual
La diferencia con uvx ruff es que ese modo lo descarga y ejecuta sin instalarlo.
uff trae un set de reglas dedicado a detectar vulnerabilidades de seguridad en tu código. Cosas como el uso de assert en producción, exec(), o funciones de hash inseguras como MD5 o SHA1.
El problema es que ese set no está activo por defecto. Si solo corres ruff check con la configuración estándar, esas reglas ni siquiera se evalúan. Tienes que decirle explícitamente a Ruff que las incluya.
Para activarlas en tu proyecto (la forma recomendada), agrega esto a tu pyproject.toml:
[tool.ruff.lint]
extend-select = ["S"]
Ojo con la diferencia entre extend-select y select, porque cambia el resultado por completo:
extend-select = "además de lo que ya tengo, agrega esto". Ruff sigue revisando todo lo de siempre (errores de estilo, etc.) y le suma las reglas de seguridad. Es la opción que casi siempre quieres.select = "olvídate de lo que tenía, usa solo esto". Si escribes select = ["S"], Ruff deja de revisar todo lo demás y solo te va a marcar temas de seguridad. Perderías, sin darte cuenta, todas las demás alertas que ya te estaba dando.Para probarlas una sola vez desde la terminal, sin tocar el archivo de configuración:
ruff check --select S
Una vez activas, cualquier ruff check en ese proyecto te va a marcar los patrones de riesgo junto con el resto de los errores de estilo. No es un escáner de seguridad completo, para eso existen herramientas dedicadas, pero te avisa de los errores más comunes antes de que lleguen a producción.
Si programas con ayuda de IA, esto importa todavía más: el código que genera un asistente puede tener estos mismos patrones de riesgo, y tú no te enteras si nadie los está revisando. Activar el set S es una línea de configuración que cuesta cero y te cubre las espaldas.
Documentación oficial de Ruff, para quien quiera profundizar: https://docs.astral.sh/ruff/