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 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.1/install.sh | sh
powershell -c "irm https://astral.sh/ruff/0.8.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.8.1
  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@v1

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.8.1.tar.gz (3.3 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.1-py3-none-win_arm64.whl (9.0 MB view details)

Uploaded Python 3Windows ARM64

ruff-0.8.1-py3-none-win_amd64.whl (9.6 MB view details)

Uploaded Python 3Windows x86-64

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

Uploaded Python 3Windows x86

ruff-0.8.1-py3-none-musllinux_1_2_x86_64.whl (11.2 MB view details)

Uploaded Python 3musllinux: musl 1.2+ x86-64

ruff-0.8.1-py3-none-musllinux_1_2_i686.whl (10.9 MB view details)

Uploaded Python 3musllinux: musl 1.2+ i686

ruff-0.8.1-py3-none-musllinux_1_2_armv7l.whl (10.4 MB view details)

Uploaded Python 3musllinux: musl 1.2+ ARMv7l

ruff-0.8.1-py3-none-musllinux_1_2_aarch64.whl (10.8 MB view details)

Uploaded Python 3musllinux: musl 1.2+ ARM64

ruff-0.8.1-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (11.2 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ x86-64

ruff-0.8.1-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl (12.8 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ s390x

ruff-0.8.1-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl (11.6 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ ppc64le

ruff-0.8.1-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl (12.0 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ ppc64

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

Uploaded Python 3manylinux: glibc 2.17+ i686

ruff-0.8.1-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl (10.3 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ ARMv7l

ruff-0.8.1-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (10.8 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ ARM64

ruff-0.8.1-py3-none-macosx_11_0_arm64.whl (9.9 MB view details)

Uploaded Python 3macOS 11.0+ ARM64

ruff-0.8.1-py3-none-macosx_10_12_x86_64.whl (10.3 MB view details)

Uploaded Python 3macOS 10.12+ x86-64

ruff-0.8.1-py3-none-linux_armv6l.whl (10.5 MB view details)

Uploaded Python 3

File details

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

File metadata

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

File hashes

Hashes for ruff-0.8.1.tar.gz
Algorithm Hash digest
SHA256 3583db9a6450364ed5ca3f3b4225958b24f78178908d5c4bc0f46251ccca898f
MD5 e9dbb75ddb659c3d0b302b8387c790e9
BLAKE2b-256 95d08ff5b189d125f4260f2255d143bf2fa413b69c2610c405ace7a0a8ec81ec

See more details on using hashes here.

File details

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

File metadata

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

File hashes

Hashes for ruff-0.8.1-py3-none-win_arm64.whl
Algorithm Hash digest
SHA256 55873cc1a473e5ac129d15eccb3c008c096b94809d693fc7053f588b67822737
MD5 8a7fa7ac4de32f4fc6a9ea476d421e70
BLAKE2b-256 eb76fbb4bd23dfb48fa7758d35b744413b650a9fd2ddd93bca77e30376864414

See more details on using hashes here.

File details

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

File metadata

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

File hashes

Hashes for ruff-0.8.1-py3-none-win_amd64.whl
Algorithm Hash digest
SHA256 2954cdbe8dfd8ab359d4a30cd971b589d335a44d444b6ca2cb3d1da21b75e4b6
MD5 18040fcc60a0ad80899437483f5fc8ac
BLAKE2b-256 e4eacae9aeb0f4822c44651c8407baacdb2e5b4dcd7b31a84e1c5df33aa2cc20

See more details on using hashes here.

File details

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

File metadata

  • Download URL: ruff-0.8.1-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.5

File hashes

Hashes for ruff-0.8.1-py3-none-win32.whl
Algorithm Hash digest
SHA256 93335cd7c0eaedb44882d75a7acb7df4b77cd7cd0d2255c93b28791716e81790
MD5 11db80d2663021af59c5009c441b6170
BLAKE2b-256 3972fcb7ad41947f38b4eaa702aca0a361af0e9c2bf671d7fd964480670c297e

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.8.1-py3-none-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 d2c16e3508c8cc73e96aa5127d0df8913d2290098f776416a4b157657bee44c5
MD5 62be11885d71265f5aa9e0cc216770d3
BLAKE2b-256 77bdaacdb8285d10f1b943dbeb818968efca35459afc29f66ae3bd4596fbf954

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.8.1-py3-none-musllinux_1_2_i686.whl
Algorithm Hash digest
SHA256 a885d68342a231b5ba4d30b8c6e1b1ee3a65cf37e3d29b3c74069cdf1ee1e3c9
MD5 dde29280273397b54e7d9e09e21f21c4
BLAKE2b-256 6be6083eb61300214590b188616a8ac6ae1ef5730a0974240fb4bec9c17de78b

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.8.1-py3-none-musllinux_1_2_armv7l.whl
Algorithm Hash digest
SHA256 adf314fc458374c25c5c4a4a9270c3e8a6a807b1bec018cfa2813d6546215540
MD5 4646d24f3161125f227506ed3954eb57
BLAKE2b-256 bbee4c3981c47147c72647a198a94202633130cfda0fc95cd863a553b6f65c6a

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.8.1-py3-none-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 b2f2f7a7e7648a2bfe6ead4e0a16745db956da0e3a231ad443d2a66a105c04fa
MD5 2c0e9e8db7033c4773f4b55ae22167a7
BLAKE2b-256 5547cbd05e5a62f3fb4c072bc65c1e8fd709924cad1c7ec60a1000d1e4ee8307

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.8.1-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 b22346f845fec132aa39cd29acb94451d030c10874408dbf776af3aaeb53284c
MD5 62678619d28ae034d059c042fc74574d
BLAKE2b-256 7f29e059f945d6bd2d90213387b8c360187f2fefc989ddcee6bbf3c241329b92

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.8.1-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl
Algorithm Hash digest
SHA256 364e6674450cbac8e998f7b30639040c99d81dfb5bbc6dfad69bc7a8f916b3d1
MD5 630bdf417b36b4dd46fd2ce71cc2a770
BLAKE2b-256 ba8c967b61c2cc8ebd1df877607fbe462bc1e1220b4a30ae3352648aec8c24bd

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.8.1-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl
Algorithm Hash digest
SHA256 b12c39b9448632284561cbf4191aa1b005882acbc81900ffa9f9f471c8ff7e26
MD5 a6d549c8ef9abfc4be77eec183247e44
BLAKE2b-256 7528752ff6120c0e7f9981bc4bc275d540c7f36db1379ba9db9142f69c88db21

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.8.1-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl
Algorithm Hash digest
SHA256 288326162804f34088ac007139488dcb43de590a5ccfec3166396530b58fb89d
MD5 e080074888f980fe0aa17a2ab942a138
BLAKE2b-256 6be19d4bbb2ace7aad14ded20e4674a48cda5b902aed7a1b14e6b028067060c4

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.8.1-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 333c57013ef8c97a53892aa56042831c372e0bb1785ab7026187b7abd0135ad5
MD5 900e0dc64d00833ee57cae51390a9115
BLAKE2b-256 c8b984c323780db1b06feae603a707d82dbbd85955c8c917738571c65d7d5aff

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.8.1-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl
Algorithm Hash digest
SHA256 2666520828dee7dfc7e47ee4ea0d928f40de72056d929a7c5292d95071d881d1
MD5 3316ef85d387c421348c47b1a01f382f
BLAKE2b-256 7a259c11dca9404ef1eb24833f780146236131a3c7941de394bc356912ef1041

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.8.1-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 2029b8c22da147c50ae577e621a5bfbc5d1fed75d86af53643d7a7aee1d23871
MD5 e92c03f712fee7f814e789dd32e13537
BLAKE2b-256 e2a06ee2d949835d5701d832fc5acd05c0bfdad5e89cfdd074a171411f5ccad5

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.8.1-py3-none-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 cd054486da0c53e41e0086e1730eb77d1f698154f910e0cd9e0d64274979a209
MD5 25b56357c644234179c220fa50e86c4f
BLAKE2b-256 a8239db40fa19c453fabf94f7a35c61c58f20e8200b4734a20839515a19da790

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.8.1-py3-none-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 b8a4f7385c2285c30f34b200ca5511fcc865f17578383db154e098150ce0a087
MD5 8bbefc3270bde1ef31107edd48eb5619
BLAKE2b-256 89a8a957a8812e31facffb6a26a30be0b5b4af000a6e30c7d43a22a5232a3398

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.8.1-py3-none-linux_armv6l.whl
Algorithm Hash digest
SHA256 fae0805bd514066f20309f6742f6ee7904a773eb9e6c17c45d6b1600ca65c9b5
MD5 174184ea0e853f4fbed2f674c899953c
BLAKE2b-256 a2d61a6314e568db88acdbb5121ed53e2c52cebf3720d3437a76f82f923bf171

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