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

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.4.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 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 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']}"

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

MIT

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.4.1.tar.gz (2.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.4.1-py3-none-win_arm64.whl (8.0 MB view details)

Uploaded Python 3Windows ARM64

ruff-0.4.1-py3-none-win_amd64.whl (8.5 MB view details)

Uploaded Python 3Windows x86-64

ruff-0.4.1-py3-none-win32.whl (7.6 MB view details)

Uploaded Python 3Windows x86

ruff-0.4.1-py3-none-musllinux_1_2_x86_64.whl (8.8 MB view details)

Uploaded Python 3musllinux: musl 1.2+ x86-64

ruff-0.4.1-py3-none-musllinux_1_2_i686.whl (8.3 MB view details)

Uploaded Python 3musllinux: musl 1.2+ i686

ruff-0.4.1-py3-none-musllinux_1_2_armv7l.whl (7.5 MB view details)

Uploaded Python 3musllinux: musl 1.2+ ARMv7l

ruff-0.4.1-py3-none-musllinux_1_2_aarch64.whl (8.0 MB view details)

Uploaded Python 3musllinux: musl 1.2+ ARM64

ruff-0.4.1-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (8.7 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ x86-64

ruff-0.4.1-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl (10.1 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ s390x

ruff-0.4.1-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl (9.1 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ ppc64le

ruff-0.4.1-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl (9.4 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ ppc64

ruff-0.4.1-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl (8.7 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ i686

ruff-0.4.1-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl (7.5 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ ARMv7l

ruff-0.4.1-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (8.1 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ ARM64

ruff-0.4.1-py3-none-macosx_10_12_x86_64.whl (8.5 MB view details)

Uploaded Python 3macOS 10.12+ x86-64

ruff-0.4.1-py3-none-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl (16.6 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.4.1.tar.gz.

File metadata

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

File hashes

Hashes for ruff-0.4.1.tar.gz
Algorithm Hash digest
SHA256 d592116cdbb65f8b1b7e2a2b48297eb865f6bdc20641879aa9d7b9c11d86db79
MD5 7f9be4fc677be52fa5d681b994dc24f7
BLAKE2b-256 cd76667f7536232ff6c3769a13f8d67911e038367350f7c3b3e09c4d98648fbc

See more details on using hashes here.

File details

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

File metadata

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

File hashes

Hashes for ruff-0.4.1-py3-none-win_arm64.whl
Algorithm Hash digest
SHA256 a1eaf03d87e6a7cd5e661d36d8c6e874693cb9bc3049d110bc9a97b350680c43
MD5 d53f9a1c48feb670195a6090f958915d
BLAKE2b-256 16611843c9b453cd58b9c9e928388b609ebe70a63f3291bb10e7cfa24de69d03

See more details on using hashes here.

File details

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

File metadata

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

File hashes

Hashes for ruff-0.4.1-py3-none-win_amd64.whl
Algorithm Hash digest
SHA256 c7d391e5936af5c9e252743d767c564670dc3889aff460d35c518ee76e4b26d7
MD5 140a62d89a8148719a13593cced1ce64
BLAKE2b-256 908f07e0b4e24337ca92521472b8f8030f450c9765fe7bcd177ff248f708c028

See more details on using hashes here.

File details

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

File metadata

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

File hashes

Hashes for ruff-0.4.1-py3-none-win32.whl
Algorithm Hash digest
SHA256 b90506f3d6d1f41f43f9b7b5ff845aeefabed6d2494307bc7b178360a8805252
MD5 b6b7f54c84429654ec3d4a84d15b9bfe
BLAKE2b-256 1c30b5f9fa73d7be01336750c8ca5bb3dc018a0ad29eb7e6d642785323bc67e5

See more details on using hashes here.

File details

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

File metadata

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

File hashes

Hashes for ruff-0.4.1-py3-none-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 6e68d248ed688b9d69fd4d18737edcbb79c98b251bba5a2b031ce2470224bdf9
MD5 3fa2fa93793c94f2319e23334812eeaa
BLAKE2b-256 7061ad210ae4b48f15de5630d96eede38a6d98984130fb3b61e7000721848b71

See more details on using hashes here.

File details

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

File metadata

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

File hashes

Hashes for ruff-0.4.1-py3-none-musllinux_1_2_i686.whl
Algorithm Hash digest
SHA256 b34510141e393519a47f2d7b8216fec747ea1f2c81e85f076e9f2910588d4b64
MD5 6fe5e61a7868e726e02fd177b1a57bac
BLAKE2b-256 50191d25f4daf6518f615676cab90d205ef1e221500f95e4a79325e4cd2bf937

See more details on using hashes here.

File details

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

File metadata

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

File hashes

Hashes for ruff-0.4.1-py3-none-musllinux_1_2_armv7l.whl
Algorithm Hash digest
SHA256 1c859f294f8633889e7d77de228b203eb0e9a03071b72b5989d89a0cf98ee262
MD5 34f0c69374328032a1558d8810a0b1a0
BLAKE2b-256 c43f11b0a93ae0e50bc323bfe74a70bbd2b84f6e1cd83b71967f9f34d9032d91

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.4.1-py3-none-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 b92f03b4aa9fa23e1799b40f15f8b95cdc418782a567d6c43def65e1bbb7f1cf
MD5 1892928dbe168417643ea6f1a5712483
BLAKE2b-256 28fa70236002bc002edca0a3d4ed2e45f3d3f499a45a3e9fd606c87f2c5822fe

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.4.1-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 efd703a5975ac1998c2cc5e9494e13b28f31e66c616b0a76e206de2562e0843c
MD5 d816cb179524450ad6033741b14c081a
BLAKE2b-256 bd380c172941d736433c494c5f3d3ce476c7a8060c70e2d8a2ab73fabd5e5869

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.4.1-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl
Algorithm Hash digest
SHA256 2c6e37f2e3cd74496a74af9a4fa67b547ab3ca137688c484749189bf3a686ceb
MD5 697abd71cc8ce862cc67461bd5a8be5f
BLAKE2b-256 291dd49911b2ad919575b0895043b97db81cce401635eb20cd8ebba949a038b9

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.4.1-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl
Algorithm Hash digest
SHA256 0926cefb57fc5fced629603fbd1a23d458b25418681d96823992ba975f050c2b
MD5 d4c00f14781f40ca206442d3002974c0
BLAKE2b-256 368ade76c13f9e1ce00bb03a70b371a3cd2cec86634263001b7afe8473f9da80

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.4.1-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl
Algorithm Hash digest
SHA256 f1ee41580bff1a651339eb3337c20c12f4037f6110a36ae4a2d864c52e5ef954
MD5 4a8e286372179be229ad7c0cac1d4558
BLAKE2b-256 e61c66ed2617bfa589ff88490448bb49385bd776c7f39d09359e46cdcc78e537

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.4.1-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 baa27d9d72a94574d250f42b7640b3bd2edc4c58ac8ac2778a8c82374bb27984
MD5 7364b0c616e4ee510b8971a36fac3689
BLAKE2b-256 b1f54f81560b8b555fda93ac624d5e534cba8c2362aa29eebd7a1ebb20185bd3

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.4.1-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl
Algorithm Hash digest
SHA256 eec8d185fe193ad053eda3a6be23069e0c8ba8c5d20bc5ace6e3b9e37d246d3f
MD5 0ebbe2c86bc44f5b87eeec8c8080544f
BLAKE2b-256 fab5d48020b41bd05a47be6c53d59e5fa8cbbe3bda597535286948d27415c1f6

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.4.1-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 d2921ac03ce1383e360e8a95442ffb0d757a6a7ddd9a5be68561a671e0e5807e
MD5 fbc226320b8077fe22b294de87a7d067
BLAKE2b-256 b019a1c7c7b9f15c58195675abad31ac4b4555c8b94d147ba8c7e9f6fcb9043f

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.4.1-py3-none-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 9485f54a7189e6f7433e0058cf8581bee45c31a25cd69009d2a040d1bd4bfaef
MD5 4cecefbf153ed83737abe2e4f252f04b
BLAKE2b-256 5229ce2d1aa82f0c8db7b1468fd4adf921c8572dfc2c95d25df2a7980edc4764

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.4.1-py3-none-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl
Algorithm Hash digest
SHA256 2d9ef6231e3fbdc0b8c72404a1a0c46fd0dcea84efca83beb4681c318ea6a953
MD5 525a116946b44855bdfdaf4dbf981008
BLAKE2b-256 847a1eea0f76c900b824f50631645dd84a1e4e3bb52b44642c1b82e808375259

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