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.270
  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.270.tar.gz (710.5 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.270-py3-none-win_arm64.whl (5.3 MB view details)

Uploaded Python 3Windows ARM64

ruff-0.0.270-py3-none-win_amd64.whl (5.5 MB view details)

Uploaded Python 3Windows x86-64

ruff-0.0.270-py3-none-win32.whl (5.0 MB view details)

Uploaded Python 3Windows x86

ruff-0.0.270-py3-none-musllinux_1_2_x86_64.whl (5.6 MB view details)

Uploaded Python 3musllinux: musl 1.2+ x86-64

ruff-0.0.270-py3-none-musllinux_1_2_i686.whl (5.2 MB view details)

Uploaded Python 3musllinux: musl 1.2+ i686

ruff-0.0.270-py3-none-musllinux_1_2_armv7l.whl (4.8 MB view details)

Uploaded Python 3musllinux: musl 1.2+ ARMv7l

ruff-0.0.270-py3-none-musllinux_1_2_aarch64.whl (5.1 MB view details)

Uploaded Python 3musllinux: musl 1.2+ ARM64

ruff-0.0.270-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (5.5 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ x86-64

ruff-0.0.270-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl (6.4 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ s390x

ruff-0.0.270-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl (5.7 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ ppc64le

ruff-0.0.270-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl (5.8 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ ppc64

ruff-0.0.270-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl (5.3 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ i686

ruff-0.0.270-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl (4.8 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ ARMv7l

ruff-0.0.270-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (5.1 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ ARM64

ruff-0.0.270-py3-none-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl (10.2 MB view details)

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

ruff-0.0.270-py3-none-macosx_10_7_x86_64.whl (5.3 MB view details)

Uploaded Python 3macOS 10.7+ x86-64

File details

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

File metadata

  • Download URL: ruff-0.0.270.tar.gz
  • Upload date:
  • Size: 710.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.2 CPython/3.10.6

File hashes

Hashes for ruff-0.0.270.tar.gz
Algorithm Hash digest
SHA256 95db07b7850b30ebf32b27fe98bc39e0ab99db3985edbbf0754d399eb2f0e690
MD5 7204f37e33b330d538e582221c73c248
BLAKE2b-256 b06fd875381e8ca1070b6065aad1095b5b7dff0a2b2198962f72166efd6bbf24

See more details on using hashes here.

File details

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

File metadata

  • Download URL: ruff-0.0.270-py3-none-win_arm64.whl
  • Upload date:
  • Size: 5.3 MB
  • Tags: Python 3, Windows ARM64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.2 CPython/3.10.6

File hashes

Hashes for ruff-0.0.270-py3-none-win_arm64.whl
Algorithm Hash digest
SHA256 9613456b0b375766244c25045e353bc8890c856431cd97893c97b10cc93bd28d
MD5 be1929b0726ae3d6fa5c4bc404cca251
BLAKE2b-256 a6fcfd90a58b09ec004f773617a92e0844e30830791e9c6e39582fae414966c2

See more details on using hashes here.

File details

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

File metadata

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

File hashes

Hashes for ruff-0.0.270-py3-none-win_amd64.whl
Algorithm Hash digest
SHA256 0012f9b7dc137ab7f1f0355e3c4ca49b562baf6c9fa1180948deeb6648c52957
MD5 39e774716efa78db1bf8780efb9fb0fc
BLAKE2b-256 065639079c40dc7e995f26f630d28dec11b1b63f498bfb56409adda27300bf2f

See more details on using hashes here.

File details

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

File metadata

  • Download URL: ruff-0.0.270-py3-none-win32.whl
  • Upload date:
  • Size: 5.0 MB
  • Tags: Python 3, Windows x86
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.2 CPython/3.10.6

File hashes

Hashes for ruff-0.0.270-py3-none-win32.whl
Algorithm Hash digest
SHA256 b4c037fe2f75bcd9aed0c89c7c507cb7fa59abae2bd4c8b6fc331a28178655a4
MD5 16948449d387fb7f9bfba8d6d5bd7588
BLAKE2b-256 afa02b773726f2b534acc32ea60b51a3e2f0b130b68a67a32baa099536c153a4

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.0.270-py3-none-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 8af391ef81f7be960be10886a3c1aac0b298bde7cb9a86ec2b05faeb2081ce6b
MD5 3d9b22c8f443be74cffdc93acfc47612
BLAKE2b-256 dc594f1e078ddf622e42096a45e3e3e3dd524499557044847261e40817f56d2e

See more details on using hashes here.

File details

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

File metadata

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

File hashes

Hashes for ruff-0.0.270-py3-none-musllinux_1_2_i686.whl
Algorithm Hash digest
SHA256 0bbfbf6fd2436165566ca85f6e57be03ed2f0a994faf40180cfbb3604c9232ef
MD5 158df3bf2362fa7f88b2d8c11d1372b1
BLAKE2b-256 36abff2870e22556c780d6b0b2934152e824ca0d3d40d9e3dedb44a158a979dc

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.0.270-py3-none-musllinux_1_2_armv7l.whl
Algorithm Hash digest
SHA256 21f00e47ab2308617c44435c8dfd9e2e03897461c9e647ec942deb2a235b4cfd
MD5 254f430b8038e06a90fbadf63879517b
BLAKE2b-256 9afb625f83b6e19ef8d78f68cc43afdcb26f0e59ed83c3c569f7cdfa09afd276

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.0.270-py3-none-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 b775e2c5fc869359daf8c8b8aa0fd67240201ab2e8d536d14a0edf279af18786
MD5 99d0102fcd3c0a77010406f37f1aedf4
BLAKE2b-256 b24dc74c7223aa96e2168aa55042a9123a41daddb585e1d492b10de45bcf4db9

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.0.270-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 0eb412f20e77529a01fb94d578b19dcb8331b56f93632aa0cce4a2ea27b7aeba
MD5 cbafd389fe4800a4696edd8b4e3ec9df
BLAKE2b-256 cb1ec6aa0c7e443bae068fe151c592d07078dbb75efcc4c8d73fbf8a7f872e85

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.0.270-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl
Algorithm Hash digest
SHA256 0d61ae4841313f6eeb8292dc349bef27b4ce426e62c36e80ceedc3824e408734
MD5 088c65be6cf63aa65d10d87e14aca9c4
BLAKE2b-256 572f3f964a1d0208248f3c51441a9e59690c8ac6f33422a0f0918521743c9f16

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.0.270-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl
Algorithm Hash digest
SHA256 0827b074635d37984fc98d99316bfab5c8b1231bb83e60dacc83bd92883eedb4
MD5 3f774ee898e2badd7cc9f4d82bdb4670
BLAKE2b-256 4082c393794c4cd462ffbd0afe45b8e77c174c7f3d5df4340ecead9a42d1fa53

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.0.270-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl
Algorithm Hash digest
SHA256 08188f8351f4c0b6216e8463df0a76eb57894ca59a3da65e4ed205db980fd3ae
MD5 85ef7b8d1db22ea436dca825a7bb822b
BLAKE2b-256 3621aa8e1d22756e1d3bcdb43f4d25451f8978cacd9d6896e365bb7c1f9037fa

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.0.270-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 739495d2dbde87cf4e3110c8d27bc20febf93112539a968a4e02c26f0deccd1d
MD5 5e541da22252a76dc6479fd09ad0c8f9
BLAKE2b-256 5a22e4e4d9219993e3b7f34ba16b9b14176d19bc77232daf70d176ee86687d51

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.0.270-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl
Algorithm Hash digest
SHA256 3ed3b198768d2b3a2300fb18f730cd39948a5cc36ba29ae9d4639a11040880be
MD5 cd8e664de626022f5dcc6272ea9d7293
BLAKE2b-256 f048a56cdeec0277aff92d68c39c282c9f7c01f38db37c5832605ee8c1ed8097

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.0.270-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 eca02e709b3308eb7255b5f74e779be23b5980fca3862eae28bb23069cd61ae4
MD5 fca3e0a554a947669b2c653359136618
BLAKE2b-256 7f2c3989a9296e058720b65106bcb4756781ddada2c258fb2f54be0e702602cf

See more details on using hashes here.

File details

Details for the file ruff-0.0.270-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.270-py3-none-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl
Algorithm Hash digest
SHA256 643de865fd35cb76c4f0739aea5afe7b8e4d40d623df7e9e6ea99054e5cead0a
MD5 9d2eda16e4388e37cf634f2324314bc2
BLAKE2b-256 02d177f9425bea1e5a929ecbeb3fd9e2e0931e30751b4d75bbe8b46e14408ada

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.0.270-py3-none-macosx_10_7_x86_64.whl
Algorithm Hash digest
SHA256 f74c4d550f7b8e808455ac77bbce38daafc458434815ba0bc21ae4bdb276509b
MD5 6c022854ddd84893f4420bc6b0cd8f82
BLAKE2b-256 c090cdbb101b1864aba6a785ef5a91c426abd4d76a3863054496c7c32a20ace8

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