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:

# With uv.
uv add --dev ruff     # to add ruff to your project
uv tool install ruff  # to install ruff globally

# 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.8.5/install.sh | sh
powershell -c "irm https://astral.sh/ruff/0.8.5/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.8.5
  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

This version

0.8.5

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.8.5.tar.gz (3.5 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.8.5-py3-none-win_arm64.whl (9.1 MB view details)

Uploaded Python 3Windows ARM64

ruff-0.8.5-py3-none-win_amd64.whl (9.7 MB view details)

Uploaded Python 3Windows x86-64

ruff-0.8.5-py3-none-win32.whl (8.8 MB view details)

Uploaded Python 3Windows x86

ruff-0.8.5-py3-none-musllinux_1_2_x86_64.whl (11.3 MB view details)

Uploaded Python 3musllinux: musl 1.2+ x86-64

ruff-0.8.5-py3-none-musllinux_1_2_i686.whl (11.0 MB view details)

Uploaded Python 3musllinux: musl 1.2+ i686

ruff-0.8.5-py3-none-musllinux_1_2_armv7l.whl (10.5 MB view details)

Uploaded Python 3musllinux: musl 1.2+ ARMv7l

ruff-0.8.5-py3-none-musllinux_1_2_aarch64.whl (10.9 MB view details)

Uploaded Python 3musllinux: musl 1.2+ ARM64

ruff-0.8.5-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (11.3 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ x86-64

ruff-0.8.5-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl (13.0 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ s390x

ruff-0.8.5-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl (11.7 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ ppc64le

ruff-0.8.5-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl (12.1 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ ppc64

ruff-0.8.5-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl (11.4 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ i686

ruff-0.8.5-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl (10.4 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ ARMv7l

ruff-0.8.5-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (10.9 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ ARM64

ruff-0.8.5-py3-none-macosx_11_0_arm64.whl (10.0 MB view details)

Uploaded Python 3macOS 11.0+ ARM64

ruff-0.8.5-py3-none-macosx_10_12_x86_64.whl (10.4 MB view details)

Uploaded Python 3macOS 10.12+ x86-64

ruff-0.8.5-py3-none-linux_armv6l.whl (10.6 MB view details)

Uploaded Python 3

File details

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

File metadata

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

File hashes

Hashes for ruff-0.8.5.tar.gz
Algorithm Hash digest
SHA256 1098d36f69831f7ff2a1da3e6407d5fbd6dfa2559e4f74ff2d260c5588900317
MD5 2a60aeb40edaaaa5c465f5470a860ba2
BLAKE2b-256 255d4b5403f3e89837decfd54c51bea7f94b7d3fae77e08858603d0e04d7ad17

See more details on using hashes here.

File details

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

File metadata

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

File hashes

Hashes for ruff-0.8.5-py3-none-win_arm64.whl
Algorithm Hash digest
SHA256 134ae019ef13e1b060ab7136e7828a6d83ea727ba123381307eb37c6bd5e01cb
MD5 471843b800e6877a70b1899e5f78a96a
BLAKE2b-256 bf5effee22bf9f9e4b2669d1f0179ae8804584939fb6502b51f2401e26b1e028

See more details on using hashes here.

File details

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

File metadata

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

File hashes

Hashes for ruff-0.8.5-py3-none-win_amd64.whl
Algorithm Hash digest
SHA256 4020d8bf8d3a32325c77af452a9976a9ad6455773bcb94991cf15bd66b347e47
MD5 b2c808f590a051ef0fcac0f0c8f3b93d
BLAKE2b-256 bcb647d2b06784de8ae992c45cceb2a30f3f205b3236a629d7ca4c0c134839a2

See more details on using hashes here.

File details

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

File metadata

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

File hashes

Hashes for ruff-0.8.5-py3-none-win32.whl
Algorithm Hash digest
SHA256 8710ffd57bdaa6690cbf6ecff19884b8629ec2a2a2a2f783aa94b1cc795139ed
MD5 c98aebbf4b7f0653c22192f8bfda5a99
BLAKE2b-256 54775c8072ec7afdfdf42c7a4019044486a2b6c85ee73617f8875ec94b977fed

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.8.5-py3-none-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 03a90200c5dfff49e4c967b405f27fdfa81594cbb7c5ff5609e42d7fe9680da5
MD5 ec56b881f7287d427eef31d5ecf7bdd0
BLAKE2b-256 0dd678a9af8209ad99541816d74f01ce678fc01ebb3f37dd7ab8966646dcd92b

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.8.5-py3-none-musllinux_1_2_i686.whl
Algorithm Hash digest
SHA256 762f113232acd5b768d6b875d16aad6b00082add40ec91c927f0673a8ec4ede8
MD5 2c18a4f9fa9b466c5d0957f54e05fd4c
BLAKE2b-256 17478f9514b670969aab57c5fc826fb500a16aee8feac1bcf8a91358f153a5ba

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.8.5-py3-none-musllinux_1_2_armv7l.whl
Algorithm Hash digest
SHA256 7512e8cb038db7f5db6aae0e24735ff9ea03bb0ed6ae2ce534e9baa23c1dc9ea
MD5 3b3fb4b24015fbde2889280d8182705f
BLAKE2b-256 a5a82a3ea6bacead963f7aeeba0c61815d9b27b0d638e6a74984aa5cc5d27733

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.8.5-py3-none-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 c01c048f9c3385e0fd7822ad0fd519afb282af9cf1778f3580e540629df89725
MD5 ac5907092b7a5cbe94ffa343e9805bfd
BLAKE2b-256 ce1f3b30f3c65b1303cb8e268ec3b046b77ab21ed8e26921cfc7e8232aa57f2c

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.8.5-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 f99be814d77a5dac8a8957104bdd8c359e85c86b0ee0e38dca447cb1095f70fb
MD5 2f2610e964d5d3d129e897706cba3c6c
BLAKE2b-256 1af652a2973ff108d74b5da706a573379eea160bece098f7cfa3f35dc4622710

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.8.5-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl
Algorithm Hash digest
SHA256 622b82bf3429ff0e346835ec213aec0a04d9730480cbffbb6ad9372014e31bbd
MD5 29af13fe4db1f44782b75b2952a7c630
BLAKE2b-256 00394f83e517ec173e16a47c6d102cd22a1aaebe80e1208a1f2e83ab9a0e4134

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.8.5-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl
Algorithm Hash digest
SHA256 587c5e95007612c26509f30acc506c874dab4c4abbacd0357400bd1aa799931b
MD5 cc621288505e8c3b16ea4ec2904d1e50
BLAKE2b-256 1bfe644b70d473a27b5112ac7a3428edcc1ce0db775c301ff11aa146f71886e0

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.8.5-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl
Algorithm Hash digest
SHA256 c9d526a62c9eda211b38463528768fd0ada25dad524cb33c0e99fcff1c67b5dc
MD5 a5cbf805358b25f20b63ce961335e880
BLAKE2b-256 e395c1d1a1fe36658c1f3e1b47e1cd5f688b72d5786695b9e621c2c38399a95e

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.8.5-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 7b75ac29715ac60d554a049dbb0ef3b55259076181c3369d79466cb130eb5afd
MD5 4da84c0f48c0eb9295bec514db999aca
BLAKE2b-256 fefffe3a6a73006bced73e60d171d154a82430f61d97e787f511a24bd6302611

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.8.5-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl
Algorithm Hash digest
SHA256 9d99cf80b0429cbebf31cbbf6f24f05a29706f0437c40413d950e67e2d4faca4
MD5 3f6f7f00bfa56a4db7a0687ff99c6767
BLAKE2b-256 b667db2df2dd4a34b602d7f6ebb1b3744c8157f0d3579973ffc58309c9c272e8

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.8.5-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 d56de7220a35607f9fe59f8a6d018e14504f7b71d784d980835e20fc0611cd50
MD5 7003c22e22089af7501a229c419f8a03
BLAKE2b-256 e79f5ee5dcd135411402e35b6ec6a8dfdadbd31c5cd1c36a624d356a38d76090

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.8.5-py3-none-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 b5462d7804558ccff9c08fe8cbf6c14b7efe67404316696a2dde48297b1925bb
MD5 d177df546a66070a07e8ecccb5571093
BLAKE2b-256 e87aa162a4feb3ef85d594527165e366dde09d7a1e534186ff4ba5d127eda850

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.8.5-py3-none-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 f69ab37771ea7e0715fead8624ec42996d101269a96e31f4d31be6fc33aa19b7
MD5 8a1861184ec15d579b2c3395639ae380
BLAKE2b-256 557483bb74a44183b904216f3edfb9995b89830c83aaa6ce84627f74da0e0cf8

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.8.5-py3-none-linux_armv6l.whl
Algorithm Hash digest
SHA256 5ad11a5e3868a73ca1fa4727fe7e33735ea78b416313f4368c504dbeb69c0f88
MD5 b23c837127cba36f3b95925e413a99c7
BLAKE2b-256 73f803391745a703ce11678eb37c48ae89ec60396ea821e9d0bcea7c8e88fd91

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