Ruff
Sources:
Overview
ABOUT
Ruff
: an extremely fast Python code linter and formatter, written with Rust. For more, see the documentation.
- ⚡️ 10-100x faster than existing linters (like Flake8) and formatters (like Black)
- 🐍 Installable via
pip
- 🛠️
pyproject.toml
support - 🤝 Python 3.12 compatibility
- ⚖️ Drop-in parity with Flake8, isort, and Black
- 📦 Built-in caching, to avoid re-analyzing unchanged files
- 🔧 Fix support, for automatic error correction (e.g., automatically remove unused imports)
- 📏 Over 800 built-in rules, with native re-implementations of popular Flake8 plugins, like flake8-bugbear
- ⌨️ First-party editor integrations for VS Code and more
- 🌎 Monorepo-friendly, with hierarchical and cascading configuration
Ruff aims to be orders of magnitude faster than alternative tools while integrating more functionality behind a single, common interface.
Ruff can be used to replace Flake8 (plus dozens of plugins), Black, isort, pydocstyle, pyupgrade, autoflake, and more, all while executing tens or hundreds of times faster than any individual tool.
Ruff is extremely actively developed and used in major open-source projects like:
…and many more.
Ruff is backed by Astral. Read the launch post, or the original project announcement.
Installation
Ruff is available as ruff
on PyPI:
You can also install Ruff via Homebrew, Conda, and with a variety of other package managers.
Usage
To run Ruff as a linter, try any of the following:
Or, to run Ruff as a formatter:
Ruff can also be used as a pre-commit hook via ruff-pre-commit
:
Ruff can also be used as a VS Code extension or alongside any other editor through the Ruff LSP.
Ruff can also be used as a GitHub Action via ruff-action
:
Configuration
Ruff can be configured through a pyproject.toml
, ruff.toml
, or .ruff.toml
file (see: Configuration, or Settings for a complete list of all configuration options).
If left unspecified, Ruff’s default configuration is equivalent to the following ruff.toml
file:
Note that, in a pyproject.toml
, each section header should be prefixed with tool.ruff
. For example, [lint]
should be replaced with [tool.ruff.lint]
.
Some configuration options can be provided via dedicated command-line arguments, such as those related to rule enablement and disablement, file discovery, and logging level:
The remaining configuration options can be provided through a catch-all --config
argument:
See ruff help
for more on Ruff’s top-level commands, or ruff help check
and ruff help format
for more on the linting and formatting commands, respectively.
Rules
Ruff supports over 800 lint rules, many of which are inspired by popular tools like Flake8, isort, pyupgrade, and others. Regardless of the rule’s origin, Ruff re-implements every rule in Rust as a first-party feature.
By default, Ruff enables Flake8’s F
rules, along with a subset of the E
rules, omitting any stylistic rules that overlap with the use of a formatter, like ruff format
or Black.
If you’re just getting started with Ruff, the default rule set is a great place to start: it catches a wide variety of common errors (like unused imports) with zero configuration.
Beyond the defaults, Ruff re-implements some of the most popular Flake8 plugins and related code quality tools, including:
- autoflake
- eradicate
- flake8-2020
- flake8-annotations
- flake8-async
- flake8-bandit (#1646)
- flake8-blind-except
- flake8-boolean-trap
- flake8-bugbear
- flake8-builtins
- flake8-commas
- flake8-comprehensions
- flake8-copyright
- flake8-datetimez
- flake8-debugger
- flake8-django
- flake8-docstrings
- flake8-eradicate
- flake8-errmsg
- flake8-executable
- flake8-future-annotations
- flake8-gettext
- flake8-implicit-str-concat
- flake8-import-conventions
- flake8-logging
- flake8-logging-format
- flake8-no-pep420
- flake8-pie
- flake8-print
- flake8-pyi
- flake8-pytest-style
- flake8-quotes
- flake8-raise
- flake8-return
- flake8-self
- flake8-simplify
- flake8-slots
- flake8-super
- flake8-tidy-imports
- flake8-todos
- flake8-trio
- flake8-type-checking
- flake8-use-pathlib
- flynt (#2102)
- isort
- mccabe
- pandas-vet
- pep8-naming
- pydocstyle
- pygrep-hooks
- pylint-airflow
- pyupgrade
- tryceratops
- yesqa
For a complete enumeration of the supported rules, see Rules.
Appendix
Note created on 2024-04-29 and last modified on 2024-04-29.
See Also
- Python (Tool)
- Python Map of Content
- Python Code
- uv
- Tools
- flake8
- isort
- Black
- Pyright
- ESLint
- Prettier
- Biome
- PyCodeStyle
- PyDocStyle
- PyUpgrade
Backlinks
(c) No Clocks, LLC | 2024