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.2.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@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",
    ".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

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

Uploaded Python 3Windows ARM64

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

Uploaded Python 3Windows x86-64

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

Uploaded Python 3Windows x86

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

Uploaded Python 3musllinux: musl 1.2+ x86-64

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

Uploaded Python 3musllinux: musl 1.2+ i686

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

Uploaded Python 3musllinux: musl 1.2+ ARMv7l

ruff-0.2.2-py3-none-musllinux_1_2_aarch64.whl (7.2 MB view details)

Uploaded Python 3musllinux: musl 1.2+ ARM64

ruff-0.2.2-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (7.8 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ x86-64

ruff-0.2.2-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl (8.9 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ s390x

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

Uploaded Python 3manylinux: glibc 2.17+ ppc64le

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

Uploaded Python 3manylinux: glibc 2.17+ ppc64

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

Uploaded Python 3manylinux: glibc 2.17+ i686

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

Uploaded Python 3manylinux: glibc 2.17+ ARMv7l

ruff-0.2.2-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (7.3 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ ARM64

ruff-0.2.2-py3-none-macosx_10_12_x86_64.whl (7.6 MB view details)

Uploaded Python 3macOS 10.12+ x86-64

ruff-0.2.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.2.2.tar.gz.

File metadata

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

File hashes

Hashes for ruff-0.2.2.tar.gz
Algorithm Hash digest
SHA256 e62ed7f36b3068a30ba39193a14274cd706bc486fad521276458022f7bccb31d
MD5 4fcd8c8f4d310384984db6babda9eff9
BLAKE2b-256 7006b2e9ee5f17dab59476fcb6cc6fdd268e8340d95b7dfc760ed93f4243f16f

See more details on using hashes here.

File details

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

File metadata

  • Download URL: ruff-0.2.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/4.0.2 CPython/3.11.8

File hashes

Hashes for ruff-0.2.2-py3-none-win_arm64.whl
Algorithm Hash digest
SHA256 c9d15fc41e6054bfc7200478720570078f0b41c9ae4f010bcc16bd6f4d1aacdd
MD5 6c5bf4c0cc55cb39ac1b7363bac58e1f
BLAKE2b-256 1a830d002e72ba3c15a74e5ac63d31f57d222d8f297e637d065db28f1253f109

See more details on using hashes here.

File details

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

File metadata

  • Download URL: ruff-0.2.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/4.0.2 CPython/3.11.8

File hashes

Hashes for ruff-0.2.2-py3-none-win_amd64.whl
Algorithm Hash digest
SHA256 cc9a91ae137d687f43a44c900e5d95e9617cb37d4c989e462980ba27039d239d
MD5 eef749fd42a8014ca054db0254adef1d
BLAKE2b-256 47d223fe9d73dadec045cbffc0c2046a34f7b829f217abd76fb2d6ef7114d792

See more details on using hashes here.

File details

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

File metadata

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

File hashes

Hashes for ruff-0.2.2-py3-none-win32.whl
Algorithm Hash digest
SHA256 d920499b576f6c68295bc04e7b17b6544d9d05f196bb3aac4358792ef6f34325
MD5 37c60925d4d1774d1ff7f2dcce765dce
BLAKE2b-256 49989c678bd07561bcdf2129df8284b5708e0393e7c52256db9b30b1b1043cfd

See more details on using hashes here.

File details

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

File metadata

  • Download URL: ruff-0.2.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/4.0.2 CPython/3.11.8

File hashes

Hashes for ruff-0.2.2-py3-none-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 1ec49be4fe6ddac0503833f3ed8930528e26d1e60ad35c2446da372d16651ce9
MD5 a1cf2f48c8d4ca23d9a3239594689ca5
BLAKE2b-256 4c4025de7bd89d5af3cd033d42935c7ea2bc79f52fa2f2cf4cbd8f1dbc2cae2b

See more details on using hashes here.

File details

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

File metadata

  • Download URL: ruff-0.2.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/4.0.2 CPython/3.11.8

File hashes

Hashes for ruff-0.2.2-py3-none-musllinux_1_2_i686.whl
Algorithm Hash digest
SHA256 3b65494f7e4bed2e74110dac1f0d17dc8e1f42faaa784e7c58a98e335ec83d7e
MD5 11ff6fa319c6bb6d4ce144c4827cffe3
BLAKE2b-256 ace56684718861b205985164afb9a1a8ab83deb4fa2326c903570e9d1af9347a

See more details on using hashes here.

File details

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

File metadata

  • Download URL: ruff-0.2.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/4.0.2 CPython/3.11.8

File hashes

Hashes for ruff-0.2.2-py3-none-musllinux_1_2_armv7l.whl
Algorithm Hash digest
SHA256 0c126da55c38dd917621552ab430213bdb3273bb10ddb67bc4b761989210eb6e
MD5 700b13a40a39fad62425ec9dba79bcae
BLAKE2b-256 1d65250a8dd655563a31d7f38af35e5a2860a54bc66c121084f36c63d46dd687

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.2.2-py3-none-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 940de32dc8853eba0f67f7198b3e79bc6ba95c2edbfdfac2144c8235114d6726
MD5 c331bd805dfa884b5ddc51bf9ff3fba0
BLAKE2b-256 63ad57e10d775d94a22eabdbe272d6ebb687d10ff0312ad8cd81dbc3bdf74081

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.2.2-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 5e1439c8f407e4f356470e54cdecdca1bd5439a0673792dbe34a2b0a551a2fe3
MD5 8aa0ab151e37208e82ea27cb32c8258b
BLAKE2b-256 27f13bf230a048561fd03bc779f2a3e5b05d8ea8cb1c91456a4246c5673b8ef5

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.2.2-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl
Algorithm Hash digest
SHA256 6a61ea0ff048e06de273b2e45bd72629f470f5da8f71daf09fe481278b175001
MD5 6c49a92b054a3e3d600137d1758708ea
BLAKE2b-256 bc830dfcc589d8d4d27c551dfb5d50ef57b58fc6432298bc115010f7a0642f48

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.2.2-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl
Algorithm Hash digest
SHA256 f63d96494eeec2fc70d909393bcd76c69f35334cdbd9e20d089fb3f0640216ca
MD5 afe347d9e0c460c04abb52d09f8bcd88
BLAKE2b-256 ecc2d2f2b750971593580b29d965bd7bc36a7f5e971b3de24e342235ae7578a9

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.2.2-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl
Algorithm Hash digest
SHA256 b0c232af3d0bd8f521806223723456ffebf8e323bd1e4e82b0befb20ba18388e
MD5 8ddac0c310bcfde0fb642d4113f0994c
BLAKE2b-256 452089df4f35f0644b529b9e8bb4c9a0a4633ad2fcba888941caaba744ae5768

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.2.2-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 1695700d1e25a99d28f7a1636d85bafcc5030bba9d0578c0781ba1790dbcf51c
MD5 0692282ae71fc46e093deec46218096d
BLAKE2b-256 db715be31e5505307e852020d624049ae6610e1ebb68431bb03251904aa082c6

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.2.2-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl
Algorithm Hash digest
SHA256 5e22676a5b875bd72acd3d11d5fa9075d3a5f53b877fe7b4793e4673499318ba
MD5 fb60e2636cff0fb332cf5b208be20fdc
BLAKE2b-256 1c8a8c14e40da4cb8d651fc78f769e938552069e7bc34e9e65f7335f3469f9d2

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.2.2-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 ecd46e3106850a5c26aee114e562c329f9a1fbe9e4821b008c4404f64ff9ce73
MD5 f1f53a0a68b868edc275582e4eeaa812
BLAKE2b-256 4c5330651b54241f4f26796cbc5b7cdcafebf5ecd7a30997e7a08673e8050b30

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.2.2-py3-none-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 d450b7fbff85913f866a5384d8912710936e2b96da74541c82c1b458472ddb39
MD5 035ab3dcb4bf34a8bdd20d219c7bf7e3
BLAKE2b-256 b61efd238f116e2fab69a2fbb4c3ab8903225836cb6d900ff8139c03c2f6f7b7

See more details on using hashes here.

File details

Details for the file ruff-0.2.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.2.2-py3-none-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl
Algorithm Hash digest
SHA256 0a9efb032855ffb3c21f6405751d5e147b0c6b631e3ca3f6b20f917572b97eb6
MD5 42601e3f22a9cbcc75b1b9eedff434bf
BLAKE2b-256 1321e56126ca3b56e6d05a0f6744558305f6589327945ee01b85ffe85a0f37bf

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