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, written in Rust.

Shows a bar chart with benchmark results.

Linting the CPython codebase from scratch.

  • ⚡️ 10-100x faster than existing linters
  • 🐍 Installable via pip
  • 🛠️ pyproject.toml support
  • 🤝 Python 3.11 compatibility
  • 📦 Built-in caching, to avoid re-analyzing unchanged files
  • 🔧 Autofix support, for automatic error correction (e.g., automatically remove unused imports)
  • 📏 Over 500 built-in rules
  • ⚖️ Near-parity with the built-in Flake8 rule set
  • 🔌 Native re-implementations of dozens of 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), isort, pydocstyle, yesqa, eradicate, pyupgrade, and autoflake, 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, 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 can also be used as a pre-commit hook:

- repo: https://github.com/astral-sh/ruff-pre-commit
  # Ruff version.
  rev: v0.0.272
  hooks:
    - id: ruff

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, the default configuration is equivalent to:

[tool.ruff]
# Enable pycodestyle (`E`) and Pyflakes (`F`) codes by default.
select = ["E", "F"]
ignore = []

# Allow autofix for all enabled rules (when `--fix`) is provided.
fixable = ["A", "B", "C", "D", "E", "F", "G", "I", "N", "Q", "S", "T", "W", "ANN", "ARG", "BLE", "COM", "DJ", "DTZ", "EM", "ERA", "EXE", "FBT", "ICN", "INP", "ISC", "NPY", "PD", "PGH", "PIE", "PL", "PT", "PTH", "PYI", "RET", "RSE", "RUF", "SIM", "SLF", "TCH", "TID", "TRY", "UP", "YTT"]
unfixable = []

# 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

# Allow unused variables when underscore-prefixed.
dummy-variable-rgx = "^(_+|(_+[a-zA-Z0-9_]*[a-zA-Z0-9]+?))$"

# Assume Python 3.10.
target-version = "py310"

[tool.ruff.mccabe]
# Unlike Flake8, default to a complexity level of 10.
max-complexity = 10

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

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 for more on the linting command.

Rules

Ruff supports over 500 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 E and F rules. Ruff supports all rules from the F category, and a subset of the E category, omitting those stylistic rules made obsolete by the use of an autoformatter, like 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 autoformatter is built on a fork of Rome's rome_formatter, and again draws on both the APIs and implementation details of Rome, Prettier, and Black.

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/charliermarsh/ruff/main/assets/badge/v2.json)](https://github.com/charliermarsh/ruff)

...or README.rst:

.. image:: https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/charliermarsh/ruff/main/assets/badge/v2.json
    :target: https://github.com/charliermarsh/ruff
    :alt: Ruff

...or, as HTML:

<a href="https://github.com/charliermarsh/ruff"><img src="https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/charliermarsh/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.0.272.tar.gz (939.8 kB view details)

Uploaded Source

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

ruff-0.0.272-py3-none-win_arm64.whl (5.7 MB view details)

Uploaded Python 3Windows ARM64

ruff-0.0.272-py3-none-win_amd64.whl (5.7 MB view details)

Uploaded Python 3Windows x86-64

ruff-0.0.272-py3-none-win32.whl (5.4 MB view details)

Uploaded Python 3Windows x86

ruff-0.0.272-py3-none-musllinux_1_2_x86_64.whl (5.9 MB view details)

Uploaded Python 3musllinux: musl 1.2+ x86-64

ruff-0.0.272-py3-none-musllinux_1_2_i686.whl (5.5 MB view details)

Uploaded Python 3musllinux: musl 1.2+ i686

ruff-0.0.272-py3-none-musllinux_1_2_armv7l.whl (5.1 MB view details)

Uploaded Python 3musllinux: musl 1.2+ ARMv7l

ruff-0.0.272-py3-none-musllinux_1_2_aarch64.whl (5.4 MB view details)

Uploaded Python 3musllinux: musl 1.2+ ARM64

ruff-0.0.272-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (5.9 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ x86-64

ruff-0.0.272-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl (6.9 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ s390x

ruff-0.0.272-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl (6.1 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ ppc64le

ruff-0.0.272-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl (6.3 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ ppc64

ruff-0.0.272-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl (5.6 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ i686

ruff-0.0.272-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl (5.1 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ ARMv7l

ruff-0.0.272-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (5.5 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ ARM64

ruff-0.0.272-py3-none-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl (10.9 MB view details)

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

ruff-0.0.272-py3-none-macosx_10_7_x86_64.whl (5.6 MB view details)

Uploaded Python 3macOS 10.7+ x86-64

File details

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

File metadata

  • Download URL: ruff-0.0.272.tar.gz
  • Upload date:
  • Size: 939.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/4.0.1 CPython/3.11.4

File hashes

Hashes for ruff-0.0.272.tar.gz
Algorithm Hash digest
SHA256 273a01dc8c3c4fd4c2af7ea7a67c8d39bb09bce466e640dd170034da75d14cab
MD5 ec80f4347e4edc5b5fe6b47420bbb5be
BLAKE2b-256 67d5ce76ab5f37f647bdbed63b857c47c275620ad34b1a062529c5514675c5ee

See more details on using hashes here.

File details

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

File metadata

  • Download URL: ruff-0.0.272-py3-none-win_arm64.whl
  • Upload date:
  • Size: 5.7 MB
  • Tags: Python 3, Windows ARM64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/4.0.1 CPython/3.11.4

File hashes

Hashes for ruff-0.0.272-py3-none-win_arm64.whl
Algorithm Hash digest
SHA256 06b8ee4eb8711ab119db51028dd9f5384b44728c23586424fd6e241a5b9c4a3b
MD5 61fbe81932425bbb52e44adc8fe43e31
BLAKE2b-256 48cb2e8b7d690eec62a16971f15ca018248bc9058fb2d6abf0588f1fcc9fafb4

See more details on using hashes here.

File details

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

File metadata

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

File hashes

Hashes for ruff-0.0.272-py3-none-win_amd64.whl
Algorithm Hash digest
SHA256 a37ec80e238ead2969b746d7d1b6b0d31aa799498e9ba4281ab505b93e1f4b28
MD5 6a5c67c4ebbd7bbdb101c879ec539bed
BLAKE2b-256 4a8f66590b978ceeb3d62eee4f46eeabff4a4967cde81c05e9d4e8a28ca18f7d

See more details on using hashes here.

File details

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

File metadata

  • Download URL: ruff-0.0.272-py3-none-win32.whl
  • Upload date:
  • Size: 5.4 MB
  • Tags: Python 3, Windows x86
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/4.0.1 CPython/3.11.4

File hashes

Hashes for ruff-0.0.272-py3-none-win32.whl
Algorithm Hash digest
SHA256 dc406e5d756d932da95f3af082814d2467943631a587339ee65e5a4f4fbe83eb
MD5 a6f46f71c77b1f2103a00e7569820146
BLAKE2b-256 989c932d41fe80ec408a8a618b61ee7f36a99d67b99b70de480f8ab1d2771af0

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.0.272-py3-none-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 691d72a00a99707a4e0b2846690961157aef7b17b6b884f6b4420a9f25cd39b5
MD5 39b4626c521656185ea4325eb10db7e3
BLAKE2b-256 1f121b0b513ccf7a0ea19430843bf3a82b51704a1c8001900ca99066b69270ec

See more details on using hashes here.

File details

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

File metadata

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

File hashes

Hashes for ruff-0.0.272-py3-none-musllinux_1_2_i686.whl
Algorithm Hash digest
SHA256 19643d448f76b1eb8a764719072e9c885968971bfba872e14e7257e08bc2f2b7
MD5 85d5c0c9c606efa7296bca78f3648714
BLAKE2b-256 4bf850874f1992355a8c565bc6322659abf7cc86ce2e929ea4930d14768a022b

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.0.272-py3-none-musllinux_1_2_armv7l.whl
Algorithm Hash digest
SHA256 905ff8f3d6206ad56fcd70674453527b9011c8b0dc73ead27618426feff6908e
MD5 a576bf8554ea6bff521c8cc8a5fb0934
BLAKE2b-256 6eff6864326dc773a5467a06369cb1125391424b86478ed8f242bffb835b10a8

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.0.272-py3-none-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 d5a208f8ef0e51d4746930589f54f9f92f84bb69a7d15b1de34ce80a7681bc00
MD5 afa6b4fd38f6f9839d6aef4af105a1dc
BLAKE2b-256 2e961a4b3b9c658bf2a04ba7820aefa24d8561f73379bf0d79c2f01321c4dd84

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.0.272-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 bd2bbe337a3f84958f796c77820d55ac2db1e6753f39d1d1baed44e07f13f96d
MD5 1ec88fcbaba251a5ccf3bdfa0331879a
BLAKE2b-256 e3f8c8242e21cd82e0e2d6403e54d62d2dff66a6bf5f221455ba3496363de0a3

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.0.272-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl
Algorithm Hash digest
SHA256 27b2ea68d2aa69fff1b20b67636b1e3e22a6a39e476c880da1282c3e4bf6ee5a
MD5 8b9f712490dff6646ce533c2de30c03a
BLAKE2b-256 e21ac0e7f3b10550f53113bdb671b509171f54e7c3fbec99b7114561c99c5cc2

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.0.272-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl
Algorithm Hash digest
SHA256 86bc788245361a8148ff98667da938a01e1606b28a45e50ac977b09d3ad2c538
MD5 4384a1db31bfbd00985faa77510d0f7a
BLAKE2b-256 d6ae8018ccae4f6757d1b6c0e3b1c6ca5fbe2f0a9c83474b9abc468b76b2ba26

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.0.272-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl
Algorithm Hash digest
SHA256 9c4bfb75456a8e1efe14c52fcefb89cfb8f2a0d31ed8d804b82c6cf2dc29c42c
MD5 6a6a9a20066f161ac72655c0026ce0e4
BLAKE2b-256 c57425a315f9020f05e5f8508467d930bff61667514260ab03505397fb293cf0

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.0.272-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 677284430ac539bb23421a2b431b4ebc588097ef3ef918d0e0a8d8ed31fea216
MD5 a32850ece72d2b075e78b612857cbe6c
BLAKE2b-256 6e418d0ceacc7e5be1f54f9c5cf22ad80541e8751ffa4b6870d801ad082257e7

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.0.272-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl
Algorithm Hash digest
SHA256 48eccf225615e106341a641f826b15224b8a4240b84269ead62f0afd6d7e2d95
MD5 057a2ba60e8da968e5b51fa27096a616
BLAKE2b-256 74a8c6a072ae54cb9144086b0437e9febc638e52d7c4e4520e197395cf6b1e7a

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.0.272-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 ee76b4f05fcfff37bd6ac209d1370520d509ea70b5a637bdf0a04d0c99e13dff
MD5 291e83bbd1dc18fc2f29ef95fec29e1f
BLAKE2b-256 98b7478cf23d492f07ca13b45b7efa2c43660e3a4a229623f3f196022631e387

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.0.272-py3-none-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl
Algorithm Hash digest
SHA256 1609b864a8d7ee75a8c07578bdea0a7db75a144404e75ef3162e0042bfdc100d
MD5 27ed69923ff8fc28b86f9a4b9104294d
BLAKE2b-256 6acd5ef249cd71029d869edb858171d108ea001c98baab7c1e88123d7a49c86b

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.0.272-py3-none-macosx_10_7_x86_64.whl
Algorithm Hash digest
SHA256 ae9b57546e118660175d45d264b87e9b4c19405c75b587b6e4d21e6a17bf4fdf
MD5 3d382223a458ae33cccc6afa45d7f2c3
BLAKE2b-256 91815d65b3ed9a0e02f14275df6e2e1e1d95495af0a429256ab998a35d2de104

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