Skip to main content

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

Reason this release was yanked:

This release was partially published and is missing a source distribution and GitHub release

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.6/install.sh | sh
powershell -c "irm https://astral.sh/ruff/0.12.6/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.6
  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 Distributions

No source distribution files available for this release.See tutorial on generating distribution archives.

Built Distributions

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

ruff-0.12.6-py3-none-win_arm64.whl (12.0 MB view details)

Uploaded Python 3Windows ARM64

ruff-0.12.6-py3-none-win_amd64.whl (12.9 MB view details)

Uploaded Python 3Windows x86-64

ruff-0.12.6-py3-none-win32.whl (11.7 MB view details)

Uploaded Python 3Windows x86

ruff-0.12.6-py3-none-musllinux_1_2_x86_64.whl (13.0 MB view details)

Uploaded Python 3musllinux: musl 1.2+ x86-64

ruff-0.12.6-py3-none-musllinux_1_2_i686.whl (12.5 MB view details)

Uploaded Python 3musllinux: musl 1.2+ i686

ruff-0.12.6-py3-none-musllinux_1_2_armv7l.whl (11.6 MB view details)

Uploaded Python 3musllinux: musl 1.2+ ARMv7l

ruff-0.12.6-py3-none-musllinux_1_2_aarch64.whl (11.8 MB view details)

Uploaded Python 3musllinux: musl 1.2+ ARM64

ruff-0.12.6-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (12.9 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ x86-64

ruff-0.12.6-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl (12.7 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ s390x

ruff-0.12.6-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl (13.6 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ ppc64le

ruff-0.12.6-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl (14.2 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ ppc64

ruff-0.12.6-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl (13.2 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ i686

ruff-0.12.6-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl (11.7 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ ARMv7l

ruff-0.12.6-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (12.0 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ ARM64

ruff-0.12.6-py3-none-macosx_11_0_arm64.whl (11.7 MB view details)

Uploaded Python 3macOS 11.0+ ARM64

ruff-0.12.6-py3-none-macosx_10_12_x86_64.whl (12.5 MB view details)

Uploaded Python 3macOS 10.12+ x86-64

ruff-0.12.6-py3-none-linux_armv6l.whl (11.9 MB view details)

Uploaded Python 3

File details

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

File metadata

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

File hashes

Hashes for ruff-0.12.6-py3-none-win_arm64.whl
Algorithm Hash digest
SHA256 cd2c9c898a11f1441778d1cf9e358244cf5f4f2f11e93ff03c1a6c6759f4b15d
MD5 9a44406c3fedc1db053f16279cab9c93
BLAKE2b-256 55680454d21dbc251e45da45c0cf0fd6db1253ec80d5888db0c1e11b25f21d5a

See more details on using hashes here.

File details

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

File metadata

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

File hashes

Hashes for ruff-0.12.6-py3-none-win_amd64.whl
Algorithm Hash digest
SHA256 48b73d4acef6768bfe9912e8f623ec87677bcfb6dc748ac406ebff06a84a6d70
MD5 0a6f23bab76cacf527159b9ab6ff8c6f
BLAKE2b-256 2b55935b38ca28fd550a81b758743f66dfb060428b0c5e1995833865644f4d9d

See more details on using hashes here.

File details

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

File metadata

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

File hashes

Hashes for ruff-0.12.6-py3-none-win32.whl
Algorithm Hash digest
SHA256 b553271d6ed5611fcbe5f6752852eef695f2a77c0405b3a16fd507e5a057f5b0
MD5 e67ebc4aae3712680e627927171a3511
BLAKE2b-256 4a6d1b121d75ad74cb4e16b9f6e1e2493b178e64a84a8b57a3189fcf3dcce329

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.12.6-py3-none-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 80f9d56205f6f6c4a1039c79d9acc0a9c104915f4fc0fc0385170decc72f6e4c
MD5 a2875efe718d4598bfbe0b129b25ef56
BLAKE2b-256 9fa7e47be7e51e54945fdedcc10b43f819c3dffbd12a0378d7854fa43da7f9e8

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.12.6-py3-none-musllinux_1_2_i686.whl
Algorithm Hash digest
SHA256 de5185f19289a800c16d6ec8a9ba0b8b911b4640a4927b487f48fb51634ce315
MD5 076247a810e4c4d9dfc46b2337a1ad43
BLAKE2b-256 5ea283dfcdec877bfba16589ed8c0463cb40c28e01cb52381af495146cf7b83b

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.12.6-py3-none-musllinux_1_2_armv7l.whl
Algorithm Hash digest
SHA256 3f32aaa9b5ed69de80693abeecf9961cd97851cadf7850081461261d0e6551b6
MD5 b00b58acb58f21a42992600a242f2020
BLAKE2b-256 e6159532fa52ac7a9c9c088ae77a60a626a4fb2a2d1e1e1fcca5ea082f1a9615

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.12.6-py3-none-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 c1d87f2b1abf330281b3972d6bf34d366ee84b3077df66a89169e2d81b291891
MD5 9f094f886ffa2d937a7719532d9956ea
BLAKE2b-256 4ffddd266e754d584a4f60652795bbc1ce0cffed83b9e897f6d479e5c73fca07

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.12.6-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 b3cfbd192c312669fb22cd4bf8c700e8b4b1dced7ce034e581459c0e375486fa
MD5 aa121f8ed0afbc23464f9e04aae516e7
BLAKE2b-256 f9b32f71b72f47ea6d2352bafcc08ca02d5d80ace032dd5f0c43d30a49f2d02a

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.12.6-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl
Algorithm Hash digest
SHA256 8883ab5e9506574a6a2abacb5da34d416fdd8434151b35421ba3f79ca9a14a11
MD5 36a22358489debf89a97db9b5aed276b
BLAKE2b-256 62a72f614b90698084b5d9985e741ae11d1581e90fdd7ffc37cb4730a0472725

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.12.6-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl
Algorithm Hash digest
SHA256 d47ff2b300da87df8437e1b35291349faaceb666d8349edef733b6562d29264f
MD5 62c8ed7db31ceaf2e2a4b06ca8206df9
BLAKE2b-256 36b15723f4d8f227351005c6c7a1cda1680a5357536be99f4a74da3fa51ebd76

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.12.6-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl
Algorithm Hash digest
SHA256 c99e62bae20c7e1a8d4de84f96754e9732d0831614ed165415ed2c4f4aa83864
MD5 85d5e3c5259493fdeec994891a29ff25
BLAKE2b-256 ef1d301a4788986b9f31a12439503f643413f6188a6bd154ee11bd47ac5fd6c1

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.12.6-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 4e7456efef8dd6957843de60a245152e34a842210d8b13381d5f3e7540d17935
MD5 62ae6212f3a6873d78e8de2c132d764b
BLAKE2b-256 565cc2c56b605666353c139235a598a2ea073d51e65f9b615f6eee71b19657d3

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.12.6-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl
Algorithm Hash digest
SHA256 0c3fd9955d3009c33e60bb596ea7bc66832de34d621883061114bb3b6114d358
MD5 c5826ad494c3c32fbf93176f7f45210e
BLAKE2b-256 c52a5bcc44d63823331e93b585797576b7e5bc581cd7eaf73f782bb2031dba81

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.12.6-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 1ef9e292957bd6a868ce4e5f57931d0583814a363add2adedae3a1c9854b7ad9
MD5 6dc6bcb584b69fb102dac356dad75135
BLAKE2b-256 57d92004a5c099d96f75931b318138c5bb39df6af7d9035b02c188e5024d3a35

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.12.6-py3-none-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 b56a3f51a27d0db8141d5b4b095c2849b24f639539a05d201f72f8d83f829a78
MD5 8d9f565f8ce38d46a35f53a39ce9d94a
BLAKE2b-256 e75bca87980044b163278eca24dc081a38101d3b2b5da3b57af28ca33f997f1e

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.12.6-py3-none-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 412518260394e8a6647a0c610062cac48ff230d39b9df57faae93aa77123e90c
MD5 72fa8f06fc7f3c90450884fb2e2da4bd
BLAKE2b-256 844b17060a0c01ff20329cb86aff0ec8ade03a033fb340a0e8276973395ba5d1

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.12.6-py3-none-linux_armv6l.whl
Algorithm Hash digest
SHA256 59b48d8581989e0527b64c3297e672357c03b78d58cf1b228037a49915316277
MD5 9c904560a9f985859f28da842570e470
BLAKE2b-256 0da2364031a095e0d50277813b61c98918b8e5057a232f3b97bd39c3050898ad

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