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.0/install.sh | sh
powershell -c "irm https://astral.sh/ruff/0.12.0/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.0
  hooks:
    # Run the linter.
    - id: ruff
      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.0.tar.gz (4.4 MB view details)

Uploaded Source

Built Distributions

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

Uploaded Python 3Windows ARM64

ruff-0.12.0-py3-none-win_amd64.whl (11.6 MB view details)

Uploaded Python 3Windows x86-64

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

Uploaded Python 3Windows x86

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

Uploaded Python 3musllinux: musl 1.2+ x86-64

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

Uploaded Python 3musllinux: musl 1.2+ i686

ruff-0.12.0-py3-none-musllinux_1_2_armv7l.whl (10.2 MB view details)

Uploaded Python 3musllinux: musl 1.2+ ARMv7l

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

Uploaded Python 3musllinux: musl 1.2+ ARM64

ruff-0.12.0-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.0-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl (11.4 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ s390x

ruff-0.12.0-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl (12.2 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ ppc64le

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

Uploaded Python 3manylinux: glibc 2.17+ ppc64

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

Uploaded Python 3manylinux: glibc 2.17+ i686

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

Uploaded Python 3manylinux: glibc 2.17+ ARMv7l

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

Uploaded Python 3manylinux: glibc 2.17+ ARM64

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

Uploaded Python 3macOS 11.0+ ARM64

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

Uploaded Python 3macOS 10.12+ x86-64

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

Uploaded Python 3

File details

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

File metadata

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

File hashes

Hashes for ruff-0.12.0.tar.gz
Algorithm Hash digest
SHA256 4d047db3662418d4a848a3fdbfaf17488b34b62f527ed6f10cb8afd78135bc5c
MD5 9ed354fd79a2c370bc97eb35bb822e6e
BLAKE2b-256 24905255432602c0b196a0da6720f6f76b93eb50baef46d3c9b0025e2f9acbf3

See more details on using hashes here.

File details

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

File metadata

  • Download URL: ruff-0.12.0-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.13

File hashes

Hashes for ruff-0.12.0-py3-none-win_arm64.whl
Algorithm Hash digest
SHA256 8cd24580405ad8c1cc64d61725bca091d6b6da7eb3d36f72cc605467069d7e8b
MD5 e54a2eff2cf25b55941206e35805a813
BLAKE2b-256 d0334d3e79e4a84533d6cd526bfb42c020a23256ae5e4265d858bd1287831f7d

See more details on using hashes here.

File details

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

File metadata

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

File hashes

Hashes for ruff-0.12.0-py3-none-win_amd64.whl
Algorithm Hash digest
SHA256 d00b7a157b8fb6d3827b49d3324da34a1e3f93492c1f97b08e222ad7e9b291e0
MD5 c1df4fd7df44fe3443585b3fd4fdb245
BLAKE2b-256 34938b16034d493ef958a500f17cda3496c63a537ce9d5a6479feec9558f1695

See more details on using hashes here.

File details

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

File metadata

  • Download URL: ruff-0.12.0-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.13

File hashes

Hashes for ruff-0.12.0-py3-none-win32.whl
Algorithm Hash digest
SHA256 7162a4c816f8d1555eb195c46ae0bd819834d2a3f18f98cc63819a7b46f474fb
MD5 8f1f4e54bd78abec24d06ecd1e6f9e81
BLAKE2b-256 6aefb960ab4818f90ff59e571d03c3f992828d4683561095e80f9ef31f3d58b7

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.12.0-py3-none-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 1e55e44e770e061f55a7dbc6e9aed47feea07731d809a3710feda2262d2d4d8a
MD5 86f1cd38e7ea93177640f39dd8f86d4a
BLAKE2b-256 107c1be8571011585914b9d23c95b15d07eec2d2303e94a03df58294bc9274d4

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.12.0-py3-none-musllinux_1_2_i686.whl
Algorithm Hash digest
SHA256 6a315992297a7435a66259073681bb0d8647a826b7a6de45c6934b2ca3a9ed51
MD5 7f4ad1f9541196dd15012722ba07b2b1
BLAKE2b-256 37fb057febf0eea07b9384787bfe197e8b3384aa05faa0d6bd844b94ceb29945

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.12.0-py3-none-musllinux_1_2_armv7l.whl
Algorithm Hash digest
SHA256 b08df3d96db798e5beb488d4df03011874aff919a97dcc2dd8539bb2be5d6a88
MD5 32060925a6701274041354e6971999bc
BLAKE2b-256 19f6fcee9935f25a8a8bba4adbae62495c39ef281256693962c2159e8b284c5f

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.12.0-py3-none-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 3a9512af224b9ac4757f7010843771da6b2b0935a9e5e76bb407caa901a1a514
MD5 cbb1ee4e6ee67fadec01c02af7ef9a43
BLAKE2b-256 2b42d5760d742669f285909de1bbf50289baccb647b53e99b8a3b4f7ce1b2001

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.12.0-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 68853e8517b17bba004152aebd9dd77d5213e503a5f2789395b25f26acac0da4
MD5 f7d6064efff690f0b9fb15670208d97e
BLAKE2b-256 dbc382b292ff8a561850934549aa9dc39e2c4e783ab3c21debe55a495ddf7827

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.12.0-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl
Algorithm Hash digest
SHA256 139b3d28027987b78fc8d6cfb61165447bdf3740e650b7c480744873688808c2
MD5 07f149cdcc90d5bb937883b5de16e8bb
BLAKE2b-256 76e679b91e41bc8cc3e78ee95c87093c6cacfa275c786e53c9b11b9358026b3d

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.12.0-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl
Algorithm Hash digest
SHA256 0c0758038f81beec8cc52ca22de9685b8ae7f7cc18c013ec2050012862cc9165
MD5 db6bfc103f780f3d9d5481bc5d16fbdf
BLAKE2b-256 ed5015ad9c80ebd3c4819f5bd8883e57329f538704ed57bac680d95cb6627527

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.12.0-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl
Algorithm Hash digest
SHA256 7d235618283718ee2fe14db07f954f9b2423700919dc688eacf3f8797a11315c
MD5 7ca995f7ef9c72dab90d42dfecf6c844
BLAKE2b-256 048fad459de67c70ec112e2ba7206841c8f4eb340a03ee6a5cabc159fe558b8e

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.12.0-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 c021f04ea06966b02614d442e94071781c424ab8e02ec7af2f037b4c1e01cc82
MD5 5bd98e729a79afc1133960869e6d3e5b
BLAKE2b-256 d7509349ee777614bc3062fc6b038503a59b2034d09dd259daf8192f56c06720

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.12.0-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl
Algorithm Hash digest
SHA256 952d0630eae628250ab1c70a7fffb641b03e6b4a2d3f3ec6c1d19b4ab6c6c807
MD5 1381e7fe34e28affae0f7539d26c4269
BLAKE2b-256 e9baaa393b972a782b4bc9ea121e0e358a18981980856190d7d2b6187f63e03a

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.12.0-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 e7731c3eec50af71597243bace7ec6104616ca56dda2b99c89935fe926bdcd48
MD5 3aa46681542f8013ea810539dabe1abc
BLAKE2b-256 4c577caf31dd947d72e7aa06c60ecb19c135cad871a0a8a251723088132ce801

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.12.0-py3-none-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 07a7aa9b69ac3fcfda3c507916d5d1bca10821fe3797d46bad10f2c6de1edda0
MD5 d56ecf16d8a85c63f3c9e7eef06a58d1
BLAKE2b-256 07a201a5acf495265c667686ec418f19fd5c32bcc326d4c79ac28824aecd6a32

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.12.0-py3-none-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 05ed0c914fabc602fc1f3b42c53aa219e5736cb030cdd85640c32dbc73da74a6
MD5 eb88cbeef5c99ff3d693e59fd6df1f27
BLAKE2b-256 e7d3021dde5a988fa3e25d2468d1dadeea0ae89dc4bc67d0140c6e68818a12a1

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.12.0-py3-none-linux_armv6l.whl
Algorithm Hash digest
SHA256 5652a9ecdb308a1754d96a68827755f28d5dfb416b06f60fd9e13f26191a8848
MD5 1ceae4a388a65aca332a605fff347433
BLAKE2b-256 e6fdb46bb20e14b11ff49dbc74c61de352e0dc07fb650189513631f6fb5fc69f

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