Skip to main content

An extremely fast Python linter and code formatter, written in Rust.

Project description

Ruff

Ruff image image image Actions status Discord

Docs | Playground

An extremely fast Python linter and code formatter, written in Rust.

Shows a bar chart with benchmark results.

Linting the CPython codebase from scratch.

  • ⚡️ 10-100x faster than existing linters (like Flake8) and formatters (like Black)
  • 🐍 Installable via pip
  • 🛠️ pyproject.toml support
  • 🤝 Python 3.13 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.

Testimonials

Sebastián Ramírez, creator of FastAPI:

Ruff is so fast that sometimes I add an intentional bug in the code just to confirm it's actually running and checking the code.

Nick Schrock, founder of Elementl, co-creator of GraphQL:

Why is Ruff a gamechanger? Primarily because it is nearly 1000x faster. Literally. Not a typo. On our largest module (dagster itself, 250k LOC) pylint takes about 2.5 minutes, parallelized across 4 cores on my M1. Running ruff against our entire codebase takes .4 seconds.

Bryan Van de Ven, co-creator of Bokeh, original author of Conda:

Ruff is ~150-200x faster than flake8 on my machine, scanning the whole repo takes ~0.2s instead of ~20s. This is an enormous quality of life improvement for local dev. It's fast enough that I added it as an actual commit hook, which is terrific.

Timothy Crosley, creator of isort:

Just switched my first project to Ruff. Only one downside so far: it's so fast I couldn't believe it was working till I intentionally introduced some errors.

Tim Abbott, lead developer of Zulip:

This is just ridiculously fast... ruff is amazing.

Table of Contents

For more, see the documentation.

  1. Getting Started
  2. Configuration
  3. Rules
  4. Contributing
  5. Support
  6. Acknowledgements
  7. Who's Using Ruff?
  8. License

Getting Started

For more, see the documentation.

Installation

Ruff is available as ruff on PyPI.

Invoke Ruff directly with uvx:

uvx ruff check   # Lint all files in the current directory.
uvx ruff format  # Format all files in the current directory.

Or install Ruff with uv (recommended), pip, or pipx:

# With uv.
uv tool install ruff@latest  # Install Ruff globally.
uv add --dev ruff            # Or add Ruff to your project.

# With pip.
pip install ruff

# With pipx.
pipx install ruff

Starting with version 0.5.0, Ruff can be installed with our standalone installers:

# On macOS and Linux.
curl -LsSf https://astral.sh/ruff/install.sh | sh

# On Windows.
powershell -c "irm https://astral.sh/ruff/install.ps1 | iex"

# For a specific version.
curl -LsSf https://astral.sh/ruff/0.12.1/install.sh | sh
powershell -c "irm https://astral.sh/ruff/0.12.1/install.ps1 | iex"

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:

ruff check                          # Lint all files in the current directory (and any subdirectories).
ruff check path/to/code/            # Lint all files in `/path/to/code` (and any subdirectories).
ruff check path/to/code/*.py        # Lint all `.py` files in `/path/to/code`.
ruff check path/to/code/to/file.py  # Lint `file.py`.
ruff check @arguments.txt           # Lint using an input file, treating its contents as newline-delimited command-line arguments.

Or, to run Ruff as a formatter:

ruff format                          # Format all files in the current directory (and any subdirectories).
ruff format path/to/code/            # Format all files in `/path/to/code` (and any subdirectories).
ruff format path/to/code/*.py        # Format all `.py` files in `/path/to/code`.
ruff format path/to/code/to/file.py  # Format `file.py`.
ruff format @arguments.txt           # Format using an input file, treating its contents as newline-delimited command-line arguments.

Ruff can also be used as a pre-commit hook via ruff-pre-commit:

- repo: https://github.com/astral-sh/ruff-pre-commit
  # Ruff version.
  rev: v0.12.1
  hooks:
    # Run the linter.
    - id: ruff-check
      args: [ --fix ]
    # Run the formatter.
    - id: ruff-format

Ruff can also be used as a VS Code extension or with various other editors.

Ruff can also be used as a GitHub Action via ruff-action:

name: Ruff
on: [ push, pull_request ]
jobs:
  ruff:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: astral-sh/ruff-action@v3

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:

# Exclude a variety of commonly ignored directories.
exclude = [
    ".bzr",
    ".direnv",
    ".eggs",
    ".git",
    ".git-rewrite",
    ".hg",
    ".ipynb_checkpoints",
    ".mypy_cache",
    ".nox",
    ".pants.d",
    ".pyenv",
    ".pytest_cache",
    ".pytype",
    ".ruff_cache",
    ".svn",
    ".tox",
    ".venv",
    ".vscode",
    "__pypackages__",
    "_build",
    "buck-out",
    "build",
    "dist",
    "node_modules",
    "site-packages",
    "venv",
]

# Same as Black.
line-length = 88
indent-width = 4

# Assume Python 3.9
target-version = "py39"

[lint]
# Enable Pyflakes (`F`) and a subset of the pycodestyle (`E`) codes by default.
select = ["E4", "E7", "E9", "F"]
ignore = []

# Allow fix for all enabled rules (when `--fix`) is provided.
fixable = ["ALL"]
unfixable = []

# Allow unused variables when underscore-prefixed.
dummy-variable-rgx = "^(_+|(_+[a-zA-Z0-9_]*[a-zA-Z0-9]+?))$"

[format]
# Like Black, use double quotes for strings.
quote-style = "double"

# Like Black, indent with spaces, rather than tabs.
indent-style = "space"

# Like Black, respect magic trailing commas.
skip-magic-trailing-comma = false

# Like Black, automatically detect the appropriate line ending.
line-ending = "auto"

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:

ruff check --select F401 --select F403 --quiet

The remaining configuration options can be provided through a catch-all --config argument:

ruff check --config "lint.per-file-ignores = {'some_file.py' = ['F841']}"

To opt in to the latest lint rules, formatter style changes, interface updates, and more, enable preview mode by setting preview = true in your configuration file or passing --preview on the command line. Preview mode enables a collection of unstable features that may change prior to stabilization.

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:

For a complete enumeration of the supported rules, see Rules.

Contributing

Contributions are welcome and highly appreciated. To get started, check out the contributing guidelines.

You can also join us on Discord.

Support

Having trouble? Check out the existing issues on GitHub, or feel free to open a new one.

You can also ask for help on Discord.

Acknowledgements

Ruff's linter draws on both the APIs and implementation details of many other tools in the Python ecosystem, especially Flake8, Pyflakes, pycodestyle, pydocstyle, pyupgrade, and isort.

In some cases, Ruff includes a "direct" Rust port of the corresponding tool. We're grateful to the maintainers of these tools for their work, and for all the value they've provided to the Python community.

Ruff's formatter is built on a fork of Rome's rome_formatter, and again draws on both API and implementation details from Rome, Prettier, and Black.

Ruff's import resolver is based on the import resolution algorithm from Pyright.

Ruff is also influenced by a number of tools outside the Python ecosystem, like Clippy and ESLint.

Ruff is the beneficiary of a large number of contributors.

Ruff is released under the MIT license.

Who's Using Ruff?

Ruff is used by a number of major open-source projects and companies, including:

Show Your Support

If you're using Ruff, consider adding the Ruff badge to your project's README.md:

[![Ruff](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/astral-sh/ruff/main/assets/badge/v2.json)](https://github.com/astral-sh/ruff)

...or README.rst:

.. image:: https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/astral-sh/ruff/main/assets/badge/v2.json
    :target: https://github.com/astral-sh/ruff
    :alt: Ruff

...or, as HTML:

<a href="https://github.com/astral-sh/ruff"><img src="https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/astral-sh/ruff/main/assets/badge/v2.json" alt="Ruff" style="max-width:100%;"></a>

License

This repository is licensed under the MIT License

Project details


Release history Release notifications | RSS feed

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

ruff-0.12.1.tar.gz (4.4 MB view details)

Uploaded Source

Built Distributions

ruff-0.12.1-py3-none-win_arm64.whl (10.7 MB view details)

Uploaded Python 3Windows ARM64

ruff-0.12.1-py3-none-win_amd64.whl (11.5 MB view details)

Uploaded Python 3Windows x86-64

ruff-0.12.1-py3-none-win32.whl (10.5 MB view details)

Uploaded Python 3Windows x86

ruff-0.12.1-py3-none-musllinux_1_2_x86_64.whl (11.6 MB view details)

Uploaded Python 3musllinux: musl 1.2+ x86-64

ruff-0.12.1-py3-none-musllinux_1_2_i686.whl (11.1 MB view details)

Uploaded Python 3musllinux: musl 1.2+ i686

ruff-0.12.1-py3-none-musllinux_1_2_armv7l.whl (10.1 MB view details)

Uploaded Python 3musllinux: musl 1.2+ ARMv7l

ruff-0.12.1-py3-none-musllinux_1_2_aarch64.whl (10.5 MB view details)

Uploaded Python 3musllinux: musl 1.2+ ARM64

ruff-0.12.1-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (11.6 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ x86-64

ruff-0.12.1-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl (11.6 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ s390x

ruff-0.12.1-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl (12.1 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ ppc64le

ruff-0.12.1-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl (12.5 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ ppc64

ruff-0.12.1-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl (11.8 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ i686

ruff-0.12.1-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl (10.2 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ ARMv7l

ruff-0.12.1-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (10.7 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ ARM64

ruff-0.12.1-py3-none-macosx_11_0_arm64.whl (10.5 MB view details)

Uploaded Python 3macOS 11.0+ ARM64

ruff-0.12.1-py3-none-macosx_10_12_x86_64.whl (11.1 MB view details)

Uploaded Python 3macOS 10.12+ x86-64

ruff-0.12.1-py3-none-linux_armv6l.whl (10.3 MB view details)

Uploaded Python 3

File details

Details for the file ruff-0.12.1.tar.gz.

File metadata

  • Download URL: ruff-0.12.1.tar.gz
  • Upload date:
  • Size: 4.4 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.7.15

File hashes

Hashes for ruff-0.12.1.tar.gz
Algorithm Hash digest
SHA256 806bbc17f1104fd57451a98a58df35388ee3ab422e029e8f5cf30aa4af2c138c
MD5 6fc65b457fd73b373c9dfc1a4c9d3e23
BLAKE2b-256 9738796a101608a90494440856ccfb52b1edae90de0b817e76bfade66b12d320

See more details on using hashes here.

File details

Details for the file ruff-0.12.1-py3-none-win_arm64.whl.

File metadata

  • Download URL: ruff-0.12.1-py3-none-win_arm64.whl
  • Upload date:
  • Size: 10.7 MB
  • Tags: Python 3, Windows ARM64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.7.15

File hashes

Hashes for ruff-0.12.1-py3-none-win_arm64.whl
Algorithm Hash digest
SHA256 78ad09a022c64c13cc6077707f036bab0fac8cd7088772dcd1e5be21c5002efc
MD5 cd99a387b8f7e68a93da2ff612f449a8
BLAKE2b-256 91d06902c0d017259439d6fd2fd9393cea1cfe30169940118b007d5e0ea7e954

See more details on using hashes here.

File details

Details for the file ruff-0.12.1-py3-none-win_amd64.whl.

File metadata

  • Download URL: ruff-0.12.1-py3-none-win_amd64.whl
  • Upload date:
  • Size: 11.5 MB
  • Tags: Python 3, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.7.15

File hashes

Hashes for ruff-0.12.1-py3-none-win_amd64.whl
Algorithm Hash digest
SHA256 9e1123b1c033f77bd2590e4c1fe7e8ea72ef990a85d2484351d408224d603013
MD5 b8ba1d247175e39fa6de4ce71e7e984e
BLAKE2b-256 cf567158bd8d3cf16394928f47c637d39a7d532268cd45220bdb6cd622985760

See more details on using hashes here.

File details

Details for the file ruff-0.12.1-py3-none-win32.whl.

File metadata

  • Download URL: ruff-0.12.1-py3-none-win32.whl
  • Upload date:
  • Size: 10.5 MB
  • Tags: Python 3, Windows x86
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.7.15

File hashes

Hashes for ruff-0.12.1-py3-none-win32.whl
Algorithm Hash digest
SHA256 d973fa626d4c8267848755bd0414211a456e99e125dcab147f24daa9e991a245
MD5 c81f022310ec283e469988c5ff538073
BLAKE2b-256 6f1c20cdb593783f8f411839ce749ec9ae9e4298c2b2079b40295c3e6e2089e1

See more details on using hashes here.

File details

Details for the file ruff-0.12.1-py3-none-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for ruff-0.12.1-py3-none-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 49b7ce354eed2a322fbaea80168c902de9504e6e174fd501e9447cad0232f9e6
MD5 e073597e9ae155e16bc3767d8f6525e5
BLAKE2b-256 dc349bbefa4d0ff2c000e4e533f591499f6b834346025e11da97f4ded21cb23e

See more details on using hashes here.

File details

Details for the file ruff-0.12.1-py3-none-musllinux_1_2_i686.whl.

File metadata

File hashes

Hashes for ruff-0.12.1-py3-none-musllinux_1_2_i686.whl
Algorithm Hash digest
SHA256 2be9d32a147f98a1972c1e4df9a6956d612ca5f5578536814372113d09a27a6c
MD5 d36cd0a23b3ceb71cfa95c6ebf0bafb7
BLAKE2b-256 345c9b7ba8c19a31e2b6bd5e31aa1e65b533208a30512f118805371dbbbdf6a9

See more details on using hashes here.

File details

Details for the file ruff-0.12.1-py3-none-musllinux_1_2_armv7l.whl.

File metadata

File hashes

Hashes for ruff-0.12.1-py3-none-musllinux_1_2_armv7l.whl
Algorithm Hash digest
SHA256 801d626de15e6bf988fbe7ce59b303a914ff9c616d5866f8c79eb5012720ae13
MD5 8ae80f67d082118456901061e3820d0b
BLAKE2b-256 2a98d6534322c74a7d47b0f33b036b2498ccac99d8d8c40edadb552c038cecf1

See more details on using hashes here.

File details

Details for the file ruff-0.12.1-py3-none-musllinux_1_2_aarch64.whl.

File metadata

File hashes

Hashes for ruff-0.12.1-py3-none-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 ed5af6aaaea20710e77698e2055b9ff9b3494891e1b24d26c07055459bb717e9
MD5 1c612cfde1862d990ac38cc0886d2744
BLAKE2b-256 f6020891872fc6aab8678084f4cf8826f85c5d2d24aa9114092139a38123f94b

See more details on using hashes here.

File details

Details for the file ruff-0.12.1-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for ruff-0.12.1-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 7fd49a4619f90d5afc65cf42e07b6ae98bb454fd5029d03b306bd9e2273d44cc
MD5 99cda65e44d3eae72dc9466f96d0c591
BLAKE2b-256 91e7f898391cc026a77fbe68dfea5940f8213622474cb848eb30215538a2dadf

See more details on using hashes here.

File details

Details for the file ruff-0.12.1-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl.

File metadata

File hashes

Hashes for ruff-0.12.1-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl
Algorithm Hash digest
SHA256 6cc32e863adcf9e71690248607ccdf25252eeeab5193768e6873b901fd441fed
MD5 dea67d98d8fc4d8afbcf5941b8351371
BLAKE2b-256 dd0040da9c66d4a4d51291e619be6757fa65c91b92456ff4f01101593f3a1170

See more details on using hashes here.

File details

Details for the file ruff-0.12.1-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl.

File metadata

File hashes

Hashes for ruff-0.12.1-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl
Algorithm Hash digest
SHA256 84d0a69d1e8d716dfeab22d8d5e7c786b73f2106429a933cee51d7b09f861d4e
MD5 bd5d4f05016f32b8932b64fde4c1fe94
BLAKE2b-256 85b27756a6925da236b3a31f234b4167397c3e5f91edb861028a631546bad719

See more details on using hashes here.

File details

Details for the file ruff-0.12.1-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl.

File metadata

File hashes

Hashes for ruff-0.12.1-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl
Algorithm Hash digest
SHA256 70d52a058c0e7b88b602f575d23596e89bd7d8196437a4148381a3f73fcd5010
MD5 f6056ceb96defde8be2af55cf87d1f11
BLAKE2b-256 354e4bfc519b5fcd462233f82fc20ef8b1e5ecce476c283b355af92c0935d5d9

See more details on using hashes here.

File details

Details for the file ruff-0.12.1-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl.

File metadata

File hashes

Hashes for ruff-0.12.1-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 bdecdef753bf1e95797593007569d8e1697a54fca843d78f6862f7dc279e23bd
MD5 29190eae91adac6eb6b2ac6f52a49a5c
BLAKE2b-256 6d05f2d4c965009634830e97ffe733201ec59e4addc5b1c0efa035645baa9e5f

See more details on using hashes here.

File details

Details for the file ruff-0.12.1-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl.

File metadata

File hashes

Hashes for ruff-0.12.1-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl
Algorithm Hash digest
SHA256 a684f125a4fec2d5a6501a466be3841113ba6847827be4573fddf8308b83477d
MD5 f75df96f2ea219fd69cb26a3d4e3892c
BLAKE2b-256 0e3a390782a9ed1358c95e78ccc745eed1a9d657a537e5c4c4812fce06c8d1a0

See more details on using hashes here.

File details

Details for the file ruff-0.12.1-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for ruff-0.12.1-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 069052605fe74c765a5b4272eb89880e0ff7a31e6c0dbf8767203c1fbd31c7ff
MD5 938074053e3bed30673ba607994a04e8
BLAKE2b-256 6337bde4cf84dbd7821c8de56ec4ccc2816bce8125684f7b9e22fe4ad92364de

See more details on using hashes here.

File details

Details for the file ruff-0.12.1-py3-none-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for ruff-0.12.1-py3-none-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 9a256522893cb7e92bb1e1153283927f842dea2e48619c803243dccc8437b8be
MD5 67a622ea7cfd3a517e764b1e80bce67e
BLAKE2b-256 3f3e2d819ffda01defe857fa2dd4cba4d19109713df4034cc36f06bbf582d62a

See more details on using hashes here.

File details

Details for the file ruff-0.12.1-py3-none-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for ruff-0.12.1-py3-none-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 b3f75a19e03a4b0757d1412edb7f27cffb0c700365e9d6b60bc1b68d35bc89e0
MD5 8ee0e05761380db0846c52ac5adc86dd
BLAKE2b-256 8c65dab1ba90269bc8c81ce1d499a6517e28fe6f87b2119ec449257d0983cceb

See more details on using hashes here.

File details

Details for the file ruff-0.12.1-py3-none-linux_armv6l.whl.

File metadata

File hashes

Hashes for ruff-0.12.1-py3-none-linux_armv6l.whl
Algorithm Hash digest
SHA256 6013a46d865111e2edb71ad692fbb8262e6c172587a57c0669332a449384a36b
MD5 423b5c5ff775f9edc812e40dfc0c0ec4
BLAKE2b-256 06bf3dba52c1d12ab5e78d75bd78ad52fb85a6a1f29cc447c2423037b82bed0d

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page