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.3/install.sh | sh
powershell -c "irm https://astral.sh/ruff/0.8.3/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.3
  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.3.tar.gz (3.4 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.3-py3-none-win_arm64.whl (9.1 MB view details)

Uploaded Python 3Windows ARM64

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

Uploaded Python 3Windows x86-64

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

Uploaded Python 3Windows x86

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

Uploaded Python 3musllinux: musl 1.2+ x86-64

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

Uploaded Python 3musllinux: musl 1.2+ i686

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

Uploaded Python 3musllinux: musl 1.2+ ARMv7l

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

Uploaded Python 3musllinux: musl 1.2+ ARM64

ruff-0.8.3-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.3-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl (12.9 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ s390x

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

Uploaded Python 3manylinux: glibc 2.17+ ppc64le

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

Uploaded Python 3manylinux: glibc 2.17+ ppc64

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

Uploaded Python 3manylinux: glibc 2.17+ i686

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

Uploaded Python 3manylinux: glibc 2.17+ ARMv7l

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

Uploaded Python 3manylinux: glibc 2.17+ ARM64

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

Uploaded Python 3macOS 11.0+ ARM64

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

Uploaded Python 3macOS 10.12+ x86-64

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

Uploaded Python 3

File details

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

File metadata

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

File hashes

Hashes for ruff-0.8.3.tar.gz
Algorithm Hash digest
SHA256 5e7558304353b84279042fc584a4f4cb8a07ae79b2bf3da1a7551d960b5626d3
MD5 2cc6678bce98aaf53ba62b285af0d818
BLAKE2b-256 bf5e683c7ef7a696923223e7d95ca06755d6e2acbc5fd8382b2912a28008137c

See more details on using hashes here.

File details

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

File metadata

  • Download URL: ruff-0.8.3-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.8

File hashes

Hashes for ruff-0.8.3-py3-none-win_arm64.whl
Algorithm Hash digest
SHA256 fe2756edf68ea79707c8d68b78ca9a58ed9af22e430430491ee03e718b5e4936
MD5 4c27249ee6daad00525a37f98097a4bd
BLAKE2b-256 038fe4fa95288b81233356d9a9dcaed057e5b0adc6399aa8fd0f6d784041c9c3

See more details on using hashes here.

File details

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

File metadata

  • Download URL: ruff-0.8.3-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.8

File hashes

Hashes for ruff-0.8.3-py3-none-win_amd64.whl
Algorithm Hash digest
SHA256 f7df94f57d7418fa7c3ffb650757e0c2b96cf2501a0b192c18e4fb5571dfada9
MD5 c3e92f97ff95f10b5f8ff629d97c62e4
BLAKE2b-256 ea677291461066007617b59a707887b90e319b6a043c79b4d19979f86b7a20e7

See more details on using hashes here.

File details

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

File metadata

  • Download URL: ruff-0.8.3-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.8

File hashes

Hashes for ruff-0.8.3-py3-none-win32.whl
Algorithm Hash digest
SHA256 19048f2f878f3ee4583fc6cb23fb636e48c2635e30fb2022b3a1cd293402f964
MD5 629e8b4928d512f039cce1baaf7aad38
BLAKE2b-256 79e95b81dc9afc8a80884405b230b9429efeef76d04caead904bd213f453b973

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.8.3-py3-none-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 6567be9fb62fbd7a099209257fef4ad2c3153b60579818b31a23c886ed4147ea
MD5 5ee06642b478a158494d7311f8581b91
BLAKE2b-256 6df829f241742ed3954eb2222314b02db29f531a15cab3238d1295e8657c5f18

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.8.3-py3-none-musllinux_1_2_i686.whl
Algorithm Hash digest
SHA256 db503486e1cf074b9808403991663e4277f5c664d3fe237ee0d994d1305bb060
MD5 06ca694bb93c72225e6564b60254e26b
BLAKE2b-256 27da180ec771fc01c004045962ce017ca419a0281f4bfaf867ed0020f555b56e

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.8.3-py3-none-musllinux_1_2_armv7l.whl
Algorithm Hash digest
SHA256 8faeae3827eaa77f5721f09b9472a18c749139c891dbc17f45e72d8f2ca1f8fc
MD5 5255a2fffbd0a9cc2a5533370010bbf5
BLAKE2b-256 247e0e8f835103ac7da81c3663eedf79dec8359e9ae9a3b0d704bae50be59176

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.8.3-py3-none-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 5be450bb18f23f0edc5a4e5585c17a56ba88920d598f04a06bd9fd76d324cb20
MD5 a1748e744e96ecd87dadd605d3101890
BLAKE2b-256 60b95694716bdefd8f73df7c0104334156c38fb0f77673d2966a5a1345bab94d

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.8.3-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 d7c65bc0cadce32255e93c57d57ecc2cca23149edd52714c0c5d6fa11ec328cd
MD5 02284a1f8c4498a442d8e1c42b9e9399
BLAKE2b-256 4e84affcb30bacb94f6036a128ad5de0e29f543d3f67ee42b490b17d68e44b8a

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.8.3-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl
Algorithm Hash digest
SHA256 1ae441ce4cf925b7f363d33cd6570c51435972d697e3e58928973994e56e1452
MD5 15836b3c3347601d779915524032a7bb
BLAKE2b-256 6ad06156d4d1e53ebd17747049afe801c5d7e3014d9b2f398b9236fe36ba4320

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.8.3-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl
Algorithm Hash digest
SHA256 53babd6e63e31f4e96ec95ea0d962298f9f0d9cc5990a1bbb023a6baf2503a82
MD5 c904753f23d21c626c257677b94559b6
BLAKE2b-256 afaeff7f97b355da16d748ceec50e1604a8215d3659b36b38025a922e0612e9b

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.8.3-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl
Algorithm Hash digest
SHA256 01b14b2f72a37390c1b13477c1c02d53184f728be2f3ffc3ace5b44e9e87b90d
MD5 78f2c367fb3d35797cd4e33f00c9bcfb
BLAKE2b-256 820103e2857f9c371b8767d3e909f06a33bbdac880df17f17f93d6f6951c3381

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.8.3-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 7f26bc76a133ecb09a38b7868737eded6941b70a6d34ef53a4027e83913b6502
MD5 a2c6439bd1faf428df531425ed1d4942
BLAKE2b-256 c02da224d56bcd4383583db53c2b8f410ebf1200866984aa6eb9b5a70f04e71f

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.8.3-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl
Algorithm Hash digest
SHA256 75fb782f4db39501210ac093c79c3de581d306624575eddd7e4e13747e61ba18
MD5 105b9cc6892a94321606dfdd1b8d8e4a
BLAKE2b-256 30252e654bc7226da09a49730a1a2ea6e89f843b362db80b4b2a7a4f948ac986

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.8.3-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 9c0a60a825e3e177116c84009d5ebaa90cf40dfab56e1358d1df4e29a9a14b13
MD5 fc5ce204a34d563f5b8fc476568f29f3
BLAKE2b-256 915a642ed8f1ba23ffc2dd347697e01eef3c42fad6ac76603be4a8c3a9d6311e

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.8.3-py3-none-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 c356e770811858bd20832af696ff6c7e884701115094f427b64b25093d6d932d
MD5 1ba79a29c1e73117848f920bc85896e5
BLAKE2b-256 1a784843a59e7e7b398d6019cf91ab06502fd95397b99b2b858798fbab9151f5

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.8.3-py3-none-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 e4d66a21de39f15c9757d00c50c8cdd20ac84f55684ca56def7891a025d7e939
MD5 611aaf321189a910d9f7b2e318f80c20
BLAKE2b-256 efc50aabdc9314b4b6f051168ac45227e2aa8e1c6d82718a547455e40c9c9faa

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.8.3-py3-none-linux_armv6l.whl
Algorithm Hash digest
SHA256 8d5d273ffffff0acd3db5bf626d4b131aa5a5ada1276126231c4174543ce20d6
MD5 068f5250fde311d32cc4a0bca2e1e7f8
BLAKE2b-256 f8c4bfdbb8b9c419ff3b52479af8581026eeaac3764946fdb463dec043441b7d

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