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.12 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 700 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:

pip install ruff

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.3.2
  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 alongside any other editor through the Ruff LSP.

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:

[tool.ruff]
# 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"

[tool.ruff.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]+?))$"

[tool.ruff.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"

Some configuration options can be provided via the command-line, such as those related to rule enablement and disablement, file discovery, and logging level:

ruff check path/to/code/ --select F401 --select F403 --quiet

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 700 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

MIT

Project details


Release history Release notifications | RSS feed

This version

0.3.2

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.3.2.tar.gz (2.1 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.3.2-py3-none-win_arm64.whl (7.2 MB view details)

Uploaded Python 3Windows ARM64

ruff-0.3.2-py3-none-win_amd64.whl (7.6 MB view details)

Uploaded Python 3Windows x86-64

ruff-0.3.2-py3-none-win32.whl (6.9 MB view details)

Uploaded Python 3Windows x86

ruff-0.3.2-py3-none-musllinux_1_2_x86_64.whl (7.9 MB view details)

Uploaded Python 3musllinux: musl 1.2+ x86-64

ruff-0.3.2-py3-none-musllinux_1_2_i686.whl (7.5 MB view details)

Uploaded Python 3musllinux: musl 1.2+ i686

ruff-0.3.2-py3-none-musllinux_1_2_armv7l.whl (6.7 MB view details)

Uploaded Python 3musllinux: musl 1.2+ ARMv7l

ruff-0.3.2-py3-none-musllinux_1_2_aarch64.whl (7.3 MB view details)

Uploaded Python 3musllinux: musl 1.2+ ARM64

ruff-0.3.2-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (7.9 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ x86-64

ruff-0.3.2-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl (9.0 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ s390x

ruff-0.3.2-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl (8.2 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ ppc64le

ruff-0.3.2-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl (8.5 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ ppc64

ruff-0.3.2-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl (7.8 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ i686

ruff-0.3.2-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl (6.7 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ ARMv7l

ruff-0.3.2-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (7.4 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ ARM64

ruff-0.3.2-py3-none-macosx_10_12_x86_64.whl (7.7 MB view details)

Uploaded Python 3macOS 10.12+ x86-64

ruff-0.3.2-py3-none-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl (14.9 MB view details)

Uploaded Python 3macOS 10.12+ universal2 (ARM64, x86-64)macOS 10.12+ x86-64macOS 11.0+ ARM64

File details

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

File metadata

  • Download URL: ruff-0.3.2.tar.gz
  • Upload date:
  • Size: 2.1 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/5.0.0 CPython/3.12.2

File hashes

Hashes for ruff-0.3.2.tar.gz
Algorithm Hash digest
SHA256 fa78ec9418eb1ca3db392811df3376b46471ae93792a81af2d1cbb0e5dcb5142
MD5 e8dca569192b3f1495cd8219dc08078b
BLAKE2b-256 e111134742808610b28b960687ab735c562ec4c8444d0fe09d39d01c4ffdc8ff

See more details on using hashes here.

File details

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

File metadata

  • Download URL: ruff-0.3.2-py3-none-win_arm64.whl
  • Upload date:
  • Size: 7.2 MB
  • Tags: Python 3, Windows ARM64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/5.0.0 CPython/3.12.2

File hashes

Hashes for ruff-0.3.2-py3-none-win_arm64.whl
Algorithm Hash digest
SHA256 5f65103b1d76e0d600cabd577b04179ff592064eaa451a70a81085930e907d0b
MD5 ddd454306a6175f96dcdf3649048071e
BLAKE2b-256 fa4bcb63278d66afe2137d042a03a92640a7190d51cf4ea19bdf0830ecf3625c

See more details on using hashes here.

File details

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

File metadata

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

File hashes

Hashes for ruff-0.3.2-py3-none-win_amd64.whl
Algorithm Hash digest
SHA256 0c1bdd9920cab5707c26c8b3bf33a064a4ca7842d91a99ec0634fec68f9f4037
MD5 f7d8a55fc4fabcd3adcd538d142cdcc4
BLAKE2b-256 50892d4c24fd695587bc4846ebbaabe436ada307b8e157af4c3f790c34ffef25

See more details on using hashes here.

File details

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

File metadata

  • Download URL: ruff-0.3.2-py3-none-win32.whl
  • Upload date:
  • Size: 6.9 MB
  • Tags: Python 3, Windows x86
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/5.0.0 CPython/3.12.2

File hashes

Hashes for ruff-0.3.2-py3-none-win32.whl
Algorithm Hash digest
SHA256 9bd640a8f7dd07a0b6901fcebccedadeb1a705a50350fb86b4003b805c81385a
MD5 cfc6743d8940f8c56c8792dfd65bfe83
BLAKE2b-256 9252dd7f121764ff32d9eccbdafc9985f6030b9be653f9c23e831489434fac4a

See more details on using hashes here.

File details

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

File metadata

  • Download URL: ruff-0.3.2-py3-none-musllinux_1_2_x86_64.whl
  • Upload date:
  • Size: 7.9 MB
  • Tags: Python 3, musllinux: musl 1.2+ x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/5.0.0 CPython/3.12.2

File hashes

Hashes for ruff-0.3.2-py3-none-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 0ac06a3759c3ab9ef86bbeca665d31ad3aa9a4b1c17684aadb7e61c10baa0df4
MD5 f34b645f6a2b288d7983ca9faf7bf54b
BLAKE2b-256 9258116d3c5a4ca56474a6736ba1438bd184886d7f244d72d37b0bd7533e5558

See more details on using hashes here.

File details

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

File metadata

  • Download URL: ruff-0.3.2-py3-none-musllinux_1_2_i686.whl
  • Upload date:
  • Size: 7.5 MB
  • Tags: Python 3, musllinux: musl 1.2+ i686
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/5.0.0 CPython/3.12.2

File hashes

Hashes for ruff-0.3.2-py3-none-musllinux_1_2_i686.whl
Algorithm Hash digest
SHA256 f380be9fc15a99765c9cf316b40b9da1f6ad2ab9639e551703e581a5e6da6745
MD5 e23b664f624b3c540a20b34fb17dbcee
BLAKE2b-256 a66003f8660a46e9b1596c32c6fa482e8c233620e9d1422a794bcf6ea852a0e1

See more details on using hashes here.

File details

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

File metadata

  • Download URL: ruff-0.3.2-py3-none-musllinux_1_2_armv7l.whl
  • Upload date:
  • Size: 6.7 MB
  • Tags: Python 3, musllinux: musl 1.2+ ARMv7l
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/5.0.0 CPython/3.12.2

File hashes

Hashes for ruff-0.3.2-py3-none-musllinux_1_2_armv7l.whl
Algorithm Hash digest
SHA256 b74c3de9103bd35df2bb05d8b2899bf2dbe4efda6474ea9681280648ec4d237d
MD5 06f4aaacdce055cd1be768973c91d6a2
BLAKE2b-256 e2741b6253f3091f62a361edb2d56ffd4b50d8b34102af6e7e73d8cc3cdb0df3

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.3.2-py3-none-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 de8b480d8379620cbb5ea466a9e53bb467d2fb07c7eca54a4aa8576483c35d36
MD5 725043f6bc0e9f72dcebf3b9e76fa4c0
BLAKE2b-256 54434187adc60af356b9a51d34b87ebf713a9abca39e83fc310f1a8a4b80c3ad

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.3.2-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 c8439338a6303585d27b66b4626cbde89bb3e50fa3cae86ce52c1db7449330a7
MD5 41f2612a06699d53ca699d81c88c9f80
BLAKE2b-256 5544d964d6bcb0f77712914d5ea4d4f04bb39dd42892114bf684913455b656a9

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.3.2-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl
Algorithm Hash digest
SHA256 2c6d613b19e9a8021be2ee1d0e27710208d1603b56f47203d0abbde906929a9b
MD5 55dea3c9a6439a8729c2afcf70775068
BLAKE2b-256 6151ace14dae70f8899a63e4aa57d32184be7fd8dd108456f72cef3fa0b3432e

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.3.2-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl
Algorithm Hash digest
SHA256 1231eacd4510f73222940727ac927bc5d07667a86b0cbe822024dd00343e77e9
MD5 1233a40a9e058e59eb8282ade7b38c7e
BLAKE2b-256 b2de3de944fe19ee272f1ec64d73b560cdf85652aa60257161b64248b8943753

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.3.2-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl
Algorithm Hash digest
SHA256 967978ac2d4506255e2f52afe70dda023fc602b283e97685c8447d036863a302
MD5 3513757ddbcc60cbe9b3fe3892c3da77
BLAKE2b-256 b35e36c480719a38d483fc4608e50d50988b6f1136ae54a982656a7f879cd09a

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.3.2-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 be75e468a6a86426430373d81c041b7605137a28f7014a72d2fc749e47f572aa
MD5 743a3ab526b15ae44e945d9426b012c6
BLAKE2b-256 5e113bf788c275bdc1194e054cf45e4142b83bd6e3b8a86028de5bacaf78b505

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.3.2-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl
Algorithm Hash digest
SHA256 bb875c6cc87b3703aeda85f01c9aebdce3d217aeaca3c2e52e38077383f7268a
MD5 662d465d0db123d7656651f19f6465ee
BLAKE2b-256 40897fc2bc8e465d7d84c0280ffb8638170853758c89d9c661a33d7fd6b5038f

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.3.2-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 b83d17ff166aa0659d1e1deaf9f2f14cbe387293a906de09bc4860717eb2e2da
MD5 50fe1ecbbdb7c8aff9af9fb1a1c23b79
BLAKE2b-256 f59d3b4534478107a188e7d3de11338868885a155e6ceff37f1627326b0e626c

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.3.2-py3-none-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 9966b964b2dd1107797be9ca7195002b874424d1d5472097701ae8f43eadef5d
MD5 56d8d0552c8e2babe1d6e7ab4bafab80
BLAKE2b-256 5f8d5ade33b7bb17ffcd11b38ce05e6366992532ebef873dc06d140227a1df72

See more details on using hashes here.

File details

Details for the file ruff-0.3.2-py3-none-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl.

File metadata

File hashes

Hashes for ruff-0.3.2-py3-none-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl
Algorithm Hash digest
SHA256 77f2612752e25f730da7421ca5e3147b213dca4f9a0f7e0b534e9562c5441f01
MD5 c71aa0bb487c16b9cec83b94d67bebfa
BLAKE2b-256 8de6fb34a7b7ce01cf1b99d5830ccec16aa6859206e044aaa24982db5496e940

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