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.11.9/install.sh | sh
powershell -c "irm https://astral.sh/ruff/0.11.9/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.11.9
  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.11.9.tar.gz (4.1 MB view details)

Uploaded Source

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

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

Uploaded Python 3Windows ARM64

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

Uploaded Python 3Windows x86-64

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

Uploaded Python 3Windows x86

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

Uploaded Python 3musllinux: musl 1.2+ x86-64

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

Uploaded Python 3musllinux: musl 1.2+ i686

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

Uploaded Python 3musllinux: musl 1.2+ ARMv7l

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

Uploaded Python 3musllinux: musl 1.2+ ARM64

ruff-0.11.9-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (11.5 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ x86-64

ruff-0.11.9-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl (14.0 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ s390x

ruff-0.11.9-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl (11.9 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ ppc64le

ruff-0.11.9-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl (12.4 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ ppc64

ruff-0.11.9-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl (11.7 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ i686

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

Uploaded Python 3manylinux: glibc 2.17+ ARMv7l

ruff-0.11.9-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (10.6 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ ARM64

ruff-0.11.9-py3-none-macosx_11_0_arm64.whl (10.4 MB view details)

Uploaded Python 3macOS 11.0+ ARM64

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

Uploaded Python 3macOS 10.12+ x86-64

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

Uploaded Python 3

File details

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

File metadata

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

File hashes

Hashes for ruff-0.11.9.tar.gz
Algorithm Hash digest
SHA256 ebd58d4f67a00afb3a30bf7d383e52d0e036e6195143c6db7019604a05335517
MD5 9b4b8701771e26a5b055f469594ae681
BLAKE2b-256 f5e7e55dda1c92cdcf34b677ebef17486669800de01e887b7831a1b8fdf5cb08

See more details on using hashes here.

File details

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

File metadata

  • Download URL: ruff-0.11.9-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.3

File hashes

Hashes for ruff-0.11.9-py3-none-win_arm64.whl
Algorithm Hash digest
SHA256 bcf42689c22f2e240f496d0c183ef2c6f7b35e809f12c1db58f75d9aa8d630ca
MD5 36beb1f6435cdf7a9c77e19ca44cd46e
BLAKE2b-256 40f770aad26e5877c8f7ee5b161c4c9fa0100e63fc4c944dc6d97b9c7e871417

See more details on using hashes here.

File details

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

File metadata

  • Download URL: ruff-0.11.9-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.3

File hashes

Hashes for ruff-0.11.9-py3-none-win_amd64.whl
Algorithm Hash digest
SHA256 52edaa4a6d70f8180343a5b7f030c7edd36ad180c9f4d224959c2d689962d964
MD5 d2203d27cda5f623e85fc88b9092defa
BLAKE2b-256 90361da5d566271682ed10f436f732e5f75f926c17255c9c75cefb77d4bf8f10

See more details on using hashes here.

File details

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

File metadata

  • Download URL: ruff-0.11.9-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.3

File hashes

Hashes for ruff-0.11.9-py3-none-win32.whl
Algorithm Hash digest
SHA256 7fe1bc950e7d7b42caaee2a8a3bc27410547cc032c9558ee2e0f6d3b209e845a
MD5 61ecaad0e4b2e262476c5f8068d41868
BLAKE2b-256 22e67ed70048e89b01d728ccc950557a17ecf8df4127b08a56944b9d0bae61bc

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.11.9-py3-none-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 e4b78454f97aa454586e8a5557facb40d683e74246c97372af3c2d76901d697b
MD5 536682e9e4eb9e94c46bcd8248e529cb
BLAKE2b-256 2fd943cfba291788459b9bfd4e09a0479aa94d05ab5021d381a502d61a807ec1

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.11.9-py3-none-musllinux_1_2_i686.whl
Algorithm Hash digest
SHA256 c67117bc82457e4501473c5f5217d49d9222a360794bfb63968e09e70f340abd
MD5 1b03190dc58d2f999aeb4c73264c1fa4
BLAKE2b-256 f0b82bd533bdaf469dc84b45815ab806784d561fab104d993a54e1852596d581

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.11.9-py3-none-musllinux_1_2_armv7l.whl
Algorithm Hash digest
SHA256 71c539bac63d0788a30227ed4d43b81353c89437d355fdc52e0cda4ce5651787
MD5 48e05a6aa51603613733341da51f8934
BLAKE2b-256 43d588b9a6534d9d4952c355e38eabc343df812f168a2c811dbce7d681aeb404

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.11.9-py3-none-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 440ac6a7029f3dee7d46ab7de6f54b19e34c2b090bb4f2480d0a2d635228f381
MD5 f0854221c5be2b24d1a1be0a508a9b77
BLAKE2b-256 23a0156c4d7e685f6526a636a60986ee4a3c09c8c4e2a49b9a08c9913f46c139

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.11.9-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 537c82c9829d7811e3aa680205f94c81a2958a122ac391c0eb60336ace741a70
MD5 d6e8c95634b0d844b6a587fe0f1e58ca
BLAKE2b-256 4e0bc53a664f06e0faab596397867c6320c3816df479e888fe3af63bc3f89699

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.11.9-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl
Algorithm Hash digest
SHA256 9e0d88756e63e8302e630cee3ce2ffb77859797cc84a830a24473939e6da3ca6
MD5 fa40368e384b7d453cb28436e42b68b4
BLAKE2b-256 39d19683f469ae0b99b95ef99a56cfe8c8373c14eba26bd5c622150959ce9f64

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.11.9-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl
Algorithm Hash digest
SHA256 7b27613a683b086f2aca8996f63cb3dd7bc49e6eccf590563221f7b43ded3f65
MD5 d95b7675ac490e65f6cc4253d302fcd0
BLAKE2b-256 c58f5a2c5fc6124dd925a5faf90e1089ee9036462118b619068e5b65f8ea03df

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.11.9-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl
Algorithm Hash digest
SHA256 f33b15e00435773df97cddcd263578aa83af996b913721d86f47f4e0ee0ff271
MD5 94fbb1379104459429c44f121aee6f8a
BLAKE2b-256 66d6ef4d5eba77677eab511644c37c55a3bb8dcac1cdeb331123fe342c9a16c9

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.11.9-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 f34847eea11932d97b521450cf3e1d17863cfa5a94f21a056b93fb86f3f3dba2
MD5 32f3e6d418bd133742dacbc131b74f01
BLAKE2b-256 6112d395203de1e8717d7a2071b5a340422726d4736f44daf2290aad1085075f

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.11.9-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl
Algorithm Hash digest
SHA256 0f3f46f759ac623e94824b1e5a687a0df5cd7f5b00718ff9c24f0a894a683be7
MD5 5e7a85d0d27fa2eec8388da3896af8df
BLAKE2b-256 ed9a40cf91f61e3003fe7bd43f1761882740e954506c5a0f9097b1cff861f04c

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.11.9-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 5b1d18b4be8182cc6fddf859ce432cc9631556e9f371ada52f3eaefc10d878de
MD5 7cc0b351caf9c5eb0f2a472367b4ae4a
BLAKE2b-256 5201e249e1da6ad722278094e183cbf22379a9bbe5f21a3e46cef24ccab76e22

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.11.9-py3-none-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 bd576cd06962825de8aece49f28707662ada6a1ff2db848d1348e12c580acbf1
MD5 861a514915e6473fc257c05f48cc9561
BLAKE2b-256 870d0ccececef8a0671dae155cbf7a1f90ea2dd1dba61405da60228bbe731d35

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.11.9-py3-none-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 66bc18ca783b97186a1f3100e91e492615767ae0a3be584e1266aa9051990722
MD5 ba4b06f1edaab0bf93c6e44b5966053a
BLAKE2b-256 74fcad80c869b1732f53c4232bbf341f33c5075b2c0fb3e488983eb55964076a

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.11.9-py3-none-linux_armv6l.whl
Algorithm Hash digest
SHA256 a31a1d143a5e6f499d1fb480f8e1e780b4dfdd580f86e05e87b835d22c5c6f8c
MD5 3d8ab8428d7c8a8855d03eaa8f3fdc51
BLAKE2b-256 fb7175dfb7194fe6502708e547941d41162574d1f579c4676a8eb645bf1a6842

See more details on using hashes here.

Supported by

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