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.5.7/install.sh | sh
powershell -c "irm https://astral.sh/ruff/0.5.7/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.5.7
  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: chartboost/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.8
target-version = "py38"

[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.5.7

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.5.7.tar.gz (2.4 MB view details)

Uploaded Source

Built Distributions

ruff-0.5.7-py3-none-win_arm64.whl (8.1 MB view details)

Uploaded Python 3 Windows ARM64

ruff-0.5.7-py3-none-win_amd64.whl (8.7 MB view details)

Uploaded Python 3 Windows x86-64

ruff-0.5.7-py3-none-win32.whl (7.8 MB view details)

Uploaded Python 3 Windows x86

ruff-0.5.7-py3-none-musllinux_1_2_x86_64.whl (10.2 MB view details)

Uploaded Python 3 musllinux: musl 1.2+ x86-64

ruff-0.5.7-py3-none-musllinux_1_2_i686.whl (9.8 MB view details)

Uploaded Python 3 musllinux: musl 1.2+ i686

ruff-0.5.7-py3-none-musllinux_1_2_armv7l.whl (9.4 MB view details)

Uploaded Python 3 musllinux: musl 1.2+ ARMv7l

ruff-0.5.7-py3-none-musllinux_1_2_aarch64.whl (10.0 MB view details)

Uploaded Python 3 musllinux: musl 1.2+ ARM64

ruff-0.5.7-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (10.2 MB view details)

Uploaded Python 3 manylinux: glibc 2.17+ x86-64

ruff-0.5.7-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl (11.5 MB view details)

Uploaded Python 3 manylinux: glibc 2.17+ s390x

ruff-0.5.7-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl (10.5 MB view details)

Uploaded Python 3 manylinux: glibc 2.17+ ppc64le

ruff-0.5.7-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl (10.9 MB view details)

Uploaded Python 3 manylinux: glibc 2.17+ ppc64

ruff-0.5.7-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl (10.2 MB view details)

Uploaded Python 3 manylinux: glibc 2.17+ i686

ruff-0.5.7-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl (9.4 MB view details)

Uploaded Python 3 manylinux: glibc 2.17+ ARMv7l

ruff-0.5.7-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (10.0 MB view details)

Uploaded Python 3 manylinux: glibc 2.17+ ARM64

ruff-0.5.7-py3-none-macosx_11_0_arm64.whl (8.3 MB view details)

Uploaded Python 3 macOS 11.0+ ARM64

ruff-0.5.7-py3-none-macosx_10_12_x86_64.whl (8.7 MB view details)

Uploaded Python 3 macOS 10.12+ x86-64

ruff-0.5.7-py3-none-linux_armv6l.whl (9.6 MB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: ruff-0.5.7.tar.gz
  • Upload date:
  • Size: 2.4 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/5.1.0 CPython/3.12.5

File hashes

Hashes for ruff-0.5.7.tar.gz
Algorithm Hash digest
SHA256 8dfc0a458797f5d9fb622dd0efc52d796f23f0a1493a9527f4e49a550ae9a7e5
MD5 cc3d1e4476a934089aef6838b329b374
BLAKE2b-256 bf2b69e5e412f9d390adbdbcbf4f64d6914fa61b44b08839a6584655014fc524

See more details on using hashes here.

File details

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

File metadata

  • Download URL: ruff-0.5.7-py3-none-win_arm64.whl
  • Upload date:
  • Size: 8.1 MB
  • Tags: Python 3, Windows ARM64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/5.1.0 CPython/3.12.5

File hashes

Hashes for ruff-0.5.7-py3-none-win_arm64.whl
Algorithm Hash digest
SHA256 2dca26154ff9571995107221d0aeaad0e75a77b5a682d6236cf89a58c70b76f4
MD5 96d9e0d5c709de36d05e1958fc4af68d
BLAKE2b-256 3823b3763a237d2523d40a31fe2d1a301191fe392dd48d3014977d079cf8c0bd

See more details on using hashes here.

File details

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

File metadata

  • Download URL: ruff-0.5.7-py3-none-win_amd64.whl
  • Upload date:
  • Size: 8.7 MB
  • Tags: Python 3, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/5.1.0 CPython/3.12.5

File hashes

Hashes for ruff-0.5.7-py3-none-win_amd64.whl
Algorithm Hash digest
SHA256 083bbcbe6fadb93cd86709037acc510f86eed5a314203079df174c40bbbca6b3
MD5 8638a8b473ca7e4c8c5bda83c48691d5
BLAKE2b-256 671c4520c98bfc06b9c73cd1457686d4d3935d40046b1ddea08403e5a6deff51

See more details on using hashes here.

File details

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

File metadata

  • Download URL: ruff-0.5.7-py3-none-win32.whl
  • Upload date:
  • Size: 7.8 MB
  • Tags: Python 3, Windows x86
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/5.1.0 CPython/3.12.5

File hashes

Hashes for ruff-0.5.7-py3-none-win32.whl
Algorithm Hash digest
SHA256 33d61fc0e902198a3e55719f4be6b375b28f860b09c281e4bdbf783c0566576a
MD5 28e258ee81499274b98b9fbbdc6155e0
BLAKE2b-256 cbb9673096d61276f39291b729dddde23c831a5833d98048349835782688a0ec

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.5.7-py3-none-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 b88ca3db7eb377eb24fb7c82840546fb7acef75af4a74bd36e9ceb37a890257e
MD5 e02aacfa74cef260f42c8e5e2a2133da
BLAKE2b-256 800e8c276103d518e5cf9202f70630aaa494abf6fc71c04d87c08b6d3cd07a4b

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.5.7-py3-none-musllinux_1_2_i686.whl
Algorithm Hash digest
SHA256 9369c218f789eefbd1b8d82a8cf25017b523ac47d96b2f531eba73770971c9e5
MD5 ece096329f143c58bc28b84334b25eb0
BLAKE2b-256 e0364fa43250e67741edeea3d366f59a1dc993d4d89ad493a36cbaa9889895f2

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.5.7-py3-none-musllinux_1_2_armv7l.whl
Algorithm Hash digest
SHA256 a36d8dcf55b3a3bc353270d544fb170d75d2dff41eba5df57b4e0b67a95bb64e
MD5 c93d5e08775f837e859e2c31dde329eb
BLAKE2b-256 7de71433db2da505ffa8912dcf5b28a8743012ee780cbc20ad0bf114787385d9

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.5.7-py3-none-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 4a09ea2c3f7778cc635e7f6edf57d566a8ee8f485f3c4454db7771efb692c499
MD5 3edd77b47090079e56e9adb37a188e09
BLAKE2b-256 f138c2d94054dc4b3d1ea4c2ba3439b2a7095f08d1c8184bc41e6abe2a688be7

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.5.7-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 8d796327eed8e168164346b769dd9a27a70e0298d667b4ecee6877ce8095ec8e
MD5 f92d24dfe5f58b9ed787e93d0ca4751d
BLAKE2b-256 c83b2b683be597bbd02046678fc3fc1c199c641512b20212073b58f173822bb3

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.5.7-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl
Algorithm Hash digest
SHA256 7e31c9bad4ebf8fdb77b59cae75814440731060a09a0e0077d559a556453acbb
MD5 d4f428c36167a265e3aef9322d4f0b0d
BLAKE2b-256 e19cf5e6ed1751dc187a4ecf19a4970dd30a521c0ee66b7941c16e292a4043fb

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.5.7-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl
Algorithm Hash digest
SHA256 9ccd078c66a8e419475174bfe60a69adb36ce04f8d4e91b006f1329d5cd44bcf
MD5 0b315f141b9d1bab19e8cdbf4ec30e53
BLAKE2b-256 99674388b36d145675f4c51ebec561fcd4298a0e2550c81e629116f83ce45a39

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.5.7-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl
Algorithm Hash digest
SHA256 a78ad870ae3c460394fc95437d43deb5c04b5c29297815a2a1de028903f19692
MD5 f0f673daad7136ec81865b18d2f373f3
BLAKE2b-256 a245eae9da55f3357a1ac04220230b8b07800bf516e6dd7e1ad20a2ff3b03b1b

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.5.7-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 7f70284e73f36558ef51602254451e50dd6cc479f8b6f8413a95fcb5db4a55fc
MD5 77b15de3a5e32757bfcdc3f0411b40e9
BLAKE2b-256 327db3db19207de105daad0c8b704b2c6f2a011f9c07017bd58d8d6e7b8eba19

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.5.7-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl
Algorithm Hash digest
SHA256 fcc8054f1a717e2213500edaddcf1dbb0abad40d98e1bd9d0ad364f75c763eea
MD5 c434136853118dd642b3484d868f79ab
BLAKE2b-256 bfb1939836b70bf9fcd5e5cd3ea67fdb8abb9eac7631351d32f26544034a35e4

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.5.7-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 a01c34400097b06cf8a6e61b35d6d456d5bd1ae6961542de18ec81eaf33b4cb8
MD5 afacf6ca8c7d03e51512ce7bc036dc22
BLAKE2b-256 26797f49509bd844476235b40425756def366b227a9714191c91f02fb2178635

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.5.7-py3-none-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 eaf3d86a1fdac1aec8a3417a63587d93f906c678bb9ed0b796da7b59c1114a1e
MD5 66b32be7fb0c0c3c901a2e1e42316979
BLAKE2b-256 3d1dc218ce83beb4394ba04d05e9aa2ae6ce9fba8405688fe878b0fdb40ce855

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.5.7-py3-none-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 00cc8872331055ee017c4f1071a8a31ca0809ccc0657da1d154a1d2abac5c0be
MD5 d4575c9ce485b74051269b99ddf7cc20
BLAKE2b-256 a4101be32aeaab8728f78f673e7a47dd813222364479b2d6573dbcf0085e83ea

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.5.7-py3-none-linux_armv6l.whl
Algorithm Hash digest
SHA256 548992d342fc404ee2e15a242cdbea4f8e39a52f2e7752d0e4cbe88d2d2f416a
MD5 8593f01941b95db1c5c5614125e40dab
BLAKE2b-256 6beb06e06aaf96af30a68e83b357b037008c54a2ddcbad4f989535007c700394

See more details on using hashes here.

Supported by

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