Skip to main content

An extremely fast Python linter, 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:

# Run the Ruff linter.
- repo: https://github.com/astral-sh/ruff-pre-commit
  # Ruff version.
  rev: v0.1.2
  hooks:
    # Run the Ruff linter.
    - id: ruff
    # Run the Ruff 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@v3
      - 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",
    ".mypy_cache",
    ".nox",
    ".pants.d",
    ".pytype",
    ".ruff_cache",
    ".svn",
    ".tox",
    ".venv",
    "__pypackages__",
    "_build",
    "buck-out",
    "build",
    "dist",
    "node_modules",
    "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.
magic-trailing-comma = "respect"

# 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 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.1.2.tar.gz (1.7 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.1.2-py3-none-win_arm64.whl (5.8 MB view details)

Uploaded Python 3Windows ARM64

ruff-0.1.2-py3-none-win_amd64.whl (6.1 MB view details)

Uploaded Python 3Windows x86-64

ruff-0.1.2-py3-none-win32.whl (5.7 MB view details)

Uploaded Python 3Windows x86

ruff-0.1.2-py3-none-musllinux_1_2_x86_64.whl (6.3 MB view details)

Uploaded Python 3musllinux: musl 1.2+ x86-64

ruff-0.1.2-py3-none-musllinux_1_2_i686.whl (5.9 MB view details)

Uploaded Python 3musllinux: musl 1.2+ i686

ruff-0.1.2-py3-none-musllinux_1_2_armv7l.whl (5.6 MB view details)

Uploaded Python 3musllinux: musl 1.2+ ARMv7l

ruff-0.1.2-py3-none-musllinux_1_2_aarch64.whl (5.8 MB view details)

Uploaded Python 3musllinux: musl 1.2+ ARM64

ruff-0.1.2-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (6.2 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ x86-64

ruff-0.1.2-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl (7.6 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ s390x

ruff-0.1.2-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl (6.5 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ ppc64le

ruff-0.1.2-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl (6.6 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ ppc64

ruff-0.1.2-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl (6.0 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ i686

ruff-0.1.2-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl (5.6 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ ARMv7l

ruff-0.1.2-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (5.8 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ ARM64

ruff-0.1.2-py3-none-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl (11.5 MB view details)

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

ruff-0.1.2-py3-none-macosx_10_7_x86_64.whl (6.0 MB view details)

Uploaded Python 3macOS 10.7+ x86-64

File details

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

File metadata

  • Download URL: ruff-0.1.2.tar.gz
  • Upload date:
  • Size: 1.7 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/4.0.2 CPython/3.11.6

File hashes

Hashes for ruff-0.1.2.tar.gz
Algorithm Hash digest
SHA256 afd4785ae060ce6edcd52436d0c197628a918d6d09e3107a892a1bad6a4c6608
MD5 124db054f4efbe7d40935dc0d2b6697e
BLAKE2b-256 ac3244dc810e4e0420d189404b441f5dba062dd57f7cf30db2fb0174a460929a

See more details on using hashes here.

File details

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

File metadata

  • Download URL: ruff-0.1.2-py3-none-win_arm64.whl
  • Upload date:
  • Size: 5.8 MB
  • Tags: Python 3, Windows ARM64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/4.0.2 CPython/3.11.6

File hashes

Hashes for ruff-0.1.2-py3-none-win_arm64.whl
Algorithm Hash digest
SHA256 b0c42d00db5639dbd5f7f9923c63648682dd197bf5de1151b595160c96172691
MD5 2807e790acb8f4be5c88fc539df3e518
BLAKE2b-256 c25dff70fd26834dca33905f5432a275620a65c35a85c650f2d25ba85ecde066

See more details on using hashes here.

File details

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

File metadata

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

File hashes

Hashes for ruff-0.1.2-py3-none-win_amd64.whl
Algorithm Hash digest
SHA256 b836ddff662a45385948ee0878b0a04c3a260949905ad861a37b931d6ee1c210
MD5 0e1a385f85d7966dcc71453c75266580
BLAKE2b-256 aab1e8fb421cfd9732e25a7688bb98acf116c1bf163b9f0ba6de6cc23c566776

See more details on using hashes here.

File details

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

File metadata

  • Download URL: ruff-0.1.2-py3-none-win32.whl
  • Upload date:
  • Size: 5.7 MB
  • Tags: Python 3, Windows x86
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/4.0.2 CPython/3.11.6

File hashes

Hashes for ruff-0.1.2-py3-none-win32.whl
Algorithm Hash digest
SHA256 6e8073f85e47072256e2e1909f1ae515cf61ff5a4d24730a63b8b4ac24b6704a
MD5 cfa6e397df981503ed34cfcf9d34aca6
BLAKE2b-256 763b9095ed1eb89690e9a5fc7f0c2500067ce4ecfca348bde21625e2a9ddf72d

See more details on using hashes here.

File details

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

File metadata

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

File hashes

Hashes for ruff-0.1.2-py3-none-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 ffa7ef5ded0563329a35bd5a1cfdae40f05a75c0cc2dd30f00b1320b1fb461fc
MD5 c49c19f0d782ae971bf65a5b11f6a670
BLAKE2b-256 9785040b7b0b3f7bde427ba6b9a84f263fbaf3e4732e6bbef9013cb94e4dfb3e

See more details on using hashes here.

File details

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

File metadata

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

File hashes

Hashes for ruff-0.1.2-py3-none-musllinux_1_2_i686.whl
Algorithm Hash digest
SHA256 6c1362eb9288f8cc95535294cb03bd4665c8cef86ec32745476a4e5c6817034c
MD5 610d0079e112ca3fb2b80acacf6550f7
BLAKE2b-256 06bf4a8842dd88b42d08182aa0e89adb5a666faff04c2cc2821a438445ff3351

See more details on using hashes here.

File details

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

File metadata

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

File hashes

Hashes for ruff-0.1.2-py3-none-musllinux_1_2_armv7l.whl
Algorithm Hash digest
SHA256 b0b1b82221ba7c50e03b7a86b983157b5d3f4d8d4f16728132bdf02c6d651f77
MD5 13ede23f598f6449daa46736d4a09804
BLAKE2b-256 ab50ff46ad653c44dc850f131a1e34bee90167fcb2c047598d0daa2a122f6482

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.1.2-py3-none-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 a8533efda625bbec0bf27da2886bd641dae0c209104f6c39abc4be5b7b22de2a
MD5 c0c9992884d43ac8f2a57bf47313c995
BLAKE2b-256 d0d3ea3bd622925e01ceea9f074e5ca22150218d63394f8464fcff64bf1d7732

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.1.2-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 42ddaea52cb7ba7c785e8593a7532866c193bc774fe570f0e4b1ccedd95b83c5
MD5 60da2ed43fb363ef7afc35e8fdfbe395
BLAKE2b-256 97ed5b115193065c2fec027e0f38a43668ef49f9c6336c2166f88474ba5ccc85

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.1.2-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl
Algorithm Hash digest
SHA256 dffa25f6e03c4950b6ac6f216bc0f98a4be9719cb0c5260c8e88d1bac36f1683
MD5 e43e9dee2ac317ab678c180300fae2c8
BLAKE2b-256 5e893ecc804a8fa1d1431c24f64a5dcddda628f4aac5f923b062f290200934a8

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.1.2-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl
Algorithm Hash digest
SHA256 7344eaca057d4c32373c9c3a7afb7274f56040c225b6193dd495fcf69453b436
MD5 a013fd2806e888fd43cad97c448da625
BLAKE2b-256 2cf999c98af930e437123eda7d61a20ff34d8cc8a3d5daaefaf8579da7b4e2f4

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.1.2-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl
Algorithm Hash digest
SHA256 f89ebcbe57a1eab7d7b4ceb57ddf0af9ed13eae24e443a7c1dc078000bd8cc6b
MD5 b53aaf0420e1419b173dc9c32dd05250
BLAKE2b-256 0a02363bfd14108a03b01aa27d1b9ea45ad8658fc9f1de1a2dbad1b260f08f71

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.1.2-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 10cdb302f519664d5e2cf954562ac86c9d20ca05855e5b5c2f9d542228f45da4
MD5 1f112def3e28b053a02e6e5b6ba341d2
BLAKE2b-256 d7dc5d87e304fd4eaad84cc384dd4f0053a2fcf7540667119f715a5a55693608

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.1.2-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl
Algorithm Hash digest
SHA256 46005e4abb268e93cad065244e17e2ea16b6fcb55a5c473f34fbc1fd01ae34cb
MD5 c2053bc92b4ea0f922170fd3710206a6
BLAKE2b-256 494f1be948d81d220228ed3430bff15bf38f4c08200709d17463eff9a0dff473

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.1.2-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 809c6d4e45683696d19ca79e4c6bd3b2e9204fe9546923f2eb3b126ec314b0dc
MD5 ee526172097d42f4f4899fc08fa45057
BLAKE2b-256 ed2cb09279d0a091d7a672dffb6c1042b867ce2a5d2f1aa941d5c35865811231

See more details on using hashes here.

File details

Details for the file ruff-0.1.2-py3-none-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl.

File metadata

File hashes

Hashes for ruff-0.1.2-py3-none-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl
Algorithm Hash digest
SHA256 f85f850a320ff532b8f93e8d1da6a36ef03698c446357c8c43b46ef90bb321eb
MD5 32a546228715f8ac96237379f8a15068
BLAKE2b-256 9db6aacb4a1234d210e591c2651a8413bad69747c308500afeb16d15ded8cdc2

See more details on using hashes here.

File details

Details for the file ruff-0.1.2-py3-none-macosx_10_7_x86_64.whl.

File metadata

  • Download URL: ruff-0.1.2-py3-none-macosx_10_7_x86_64.whl
  • Upload date:
  • Size: 6.0 MB
  • Tags: Python 3, macOS 10.7+ x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/4.0.2 CPython/3.11.6

File hashes

Hashes for ruff-0.1.2-py3-none-macosx_10_7_x86_64.whl
Algorithm Hash digest
SHA256 0d3ee66b825b713611f89aa35d16de984f76f26c50982a25d52cd0910dff3923
MD5 00a344c7209fb98c55f9c9e7e59270e3
BLAKE2b-256 ca265f770cf03815ab3eb24ef59783a40b4c82168ab3546c2fc194e8261d2510

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