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.0
  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.0.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.0-py3-none-win_arm64.whl (8.0 MB view details)

Uploaded Python 3Windows ARM64

ruff-0.4.0-py3-none-win_amd64.whl (8.4 MB view details)

Uploaded Python 3Windows x86-64

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

Uploaded Python 3Windows x86

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

Uploaded Python 3musllinux: musl 1.2+ x86-64

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

Uploaded Python 3musllinux: musl 1.2+ i686

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

Uploaded Python 3musllinux: musl 1.2+ ARMv7l

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

Uploaded Python 3musllinux: musl 1.2+ ARM64

ruff-0.4.0-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.0-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl (10.1 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ s390x

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

Uploaded Python 3manylinux: glibc 2.17+ ppc64le

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

Uploaded Python 3manylinux: glibc 2.17+ ppc64

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

Uploaded Python 3manylinux: glibc 2.17+ i686

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

Uploaded Python 3manylinux: glibc 2.17+ ARMv7l

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

Uploaded Python 3manylinux: glibc 2.17+ ARM64

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

Uploaded Python 3macOS 10.12+ x86-64

ruff-0.4.0-py3-none-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl (16.5 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.0.tar.gz.

File metadata

  • Download URL: ruff-0.4.0.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.0.tar.gz
Algorithm Hash digest
SHA256 7457308d9ebf00d6a1c9a26aa755e477787a636c90b823f91cd7d4bea9e89260
MD5 9d586c72503c0c698fe1ca81a2314f76
BLAKE2b-256 3b4d037a20cd11fcdbb27fecb6abfc6ac31473e2c0c9a803021614902f10031e

See more details on using hashes here.

File details

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

File metadata

  • Download URL: ruff-0.4.0-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.0-py3-none-win_arm64.whl
Algorithm Hash digest
SHA256 fea4ec813c965e40af29ee627a1579ee1d827d77e81d54b85bdd7b42d1540cdd
MD5 4b5bf129d9057a75c193b086c1468822
BLAKE2b-256 440e88ca38641a3e9c92d18a21ff133a9fcc5d1376de6548f5dfe9f7a706a818

See more details on using hashes here.

File details

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

File metadata

  • Download URL: ruff-0.4.0-py3-none-win_amd64.whl
  • Upload date:
  • Size: 8.4 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.0-py3-none-win_amd64.whl
Algorithm Hash digest
SHA256 8584b9361900997ccf8d7aaa4dc4ab43e258a853ca7189d98ac929dc9ee50875
MD5 de74c5241dac0921ea7a1918aacb0072
BLAKE2b-256 4abf71c99323affe6b0a8dacbf5187a4d0c53490df8abfeef32f17ee638cbed9

See more details on using hashes here.

File details

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

File metadata

  • Download URL: ruff-0.4.0-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.0-py3-none-win32.whl
Algorithm Hash digest
SHA256 e70befd488271a2c28c80bd427f73d8855dd222fc549fa1e9967d287c5cfe781
MD5 9de78cf8662b2df1507265054837229a
BLAKE2b-256 6519f713f7e0ec9b1e20d14aedbebf0662f2b45975792bb48c2e2cf842e95208

See more details on using hashes here.

File details

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

File metadata

  • Download URL: ruff-0.4.0-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.0-py3-none-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 0b0eddd339e24dc4f7719b1cde4967f6b6bc0ad948cc183711ba8910f14aeafe
MD5 e7eaea2bd40d22a0190e754caf9b8684
BLAKE2b-256 ee923eaaa4c9ea731f3f95c7080f0127bd68cc8e92ecbb12281f99606391f770

See more details on using hashes here.

File details

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

File metadata

  • Download URL: ruff-0.4.0-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.0-py3-none-musllinux_1_2_i686.whl
Algorithm Hash digest
SHA256 0b20e7db4a672495320a8a18149b7febf4e4f97509a4657367144569ce0915fd
MD5 8167032d8b4e619ae2ef210b5eb73742
BLAKE2b-256 9d40c96f95bab1bd7232a0b8308180ff1df67be2592eeeb45ccdddce4d82e36b

See more details on using hashes here.

File details

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

File metadata

  • Download URL: ruff-0.4.0-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.0-py3-none-musllinux_1_2_armv7l.whl
Algorithm Hash digest
SHA256 84f2a5dd8f33964d826c5377e094f7ce11e55e432cd42d3bf64efe4384224a03
MD5 3eea4415b5fd351bf19e30143dc67f8b
BLAKE2b-256 77fd820048419458ecc2f053f3183a16483c63ea1280132c5421efc6359d0086

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.4.0-py3-none-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 752e0f77f421141dd470a0b1bed4fd8f763aebabe32c80ed3580f740ef4ba807
MD5 d84fc0ecb85812258ac981e8d475e301
BLAKE2b-256 b2e370ce1279c7a9cb2ff94a0376ac8eba939d3e38573b7121a1b8246c0ec568

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.4.0-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 4ca7a971c8f1a0b6f5ff4a819c0d1c2619536530bbd5a289af725d8b2ef1013d
MD5 85f1a811d873ac4fab150835bf90ed68
BLAKE2b-256 61a306431a9313e1437037ea5c5b412069408dbee39f95a49179d2fd630ee61a

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.4.0-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl
Algorithm Hash digest
SHA256 9911c9046b94253e1fa844c0192bb764b86866a881502dee324686474d498c17
MD5 4379c1d011e53861cdf55aeff1f2a8ac
BLAKE2b-256 0931af96ff572abda513ed3a4c97e20faf0eadc9fbecb6b142c05855be8deb09

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.4.0-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl
Algorithm Hash digest
SHA256 5e1cf8b064bb2a6b4922af7274fe2dffcb552d96ba716b2fbe5e2c970ed7de18
MD5 3bcf25225821f48d19f05f6e5a30cd14
BLAKE2b-256 9926ce591b1992101a96a16764ed71b9399638bd37128e55b09db978e88aa087

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.4.0-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl
Algorithm Hash digest
SHA256 c7b6b6b38e216036284c5779b6aa14acbf5664e3b5872533219cf93daf40ddfb
MD5 ee795416d112a2b32c8c5af690bf067c
BLAKE2b-256 5b57602713db5c76af347e22517c646bf08436b8f04557a15e1c23804d108970

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.4.0-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 2d546f511431fff2b17adcf7110f3b2c2c0c8d33b0e10e5fd27fd340bc617efc
MD5 11f20f937beca984ef33df99ced170ae
BLAKE2b-256 6c45344a901c0758fb6bdef27713c81a8b9b6d67608f2087288aa542bb62f077

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.4.0-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl
Algorithm Hash digest
SHA256 46eff08dd480b5d9b540846159fe134d70e3c45a3c913c600047cbf7f0e4e308
MD5 d03a0e0c96590fa79e6177b39f5cd0ac
BLAKE2b-256 270cf79e97ecc812f1e26a4a3071fb5b5cf04d9f0ac4778e1837352419b5e475

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.4.0-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 5616cca501d1d16b932b7e607d7e1fd1b8c8c51d6ee484b7940fc1adc5bea541
MD5 aad51a7c36de01de4c8ce546b3d179b3
BLAKE2b-256 1282f4f8cfcd48da7df89e5f17c7ff5b584d0e897404aef3b33cd3077133fb54

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.4.0-py3-none-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 cfa3e3ff53be05a8c5570c1585ea1e089f6b399ca99fcb78598d4a8234f248db
MD5 60b0f5fbc907b8d00f092a4f8e99a037
BLAKE2b-256 37a40abc22f83fad9b9eef9d3b45c5a5ec2cf3d3f43ad5a230eb4855a399028b

See more details on using hashes here.

File details

Details for the file ruff-0.4.0-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.0-py3-none-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl
Algorithm Hash digest
SHA256 70b8c620cf2212744eabd6d69c4f839f2be0d8880d27beaeb0adb6aa0b316aa8
MD5 02cc0f05829196d29ca4d767eecc2ac3
BLAKE2b-256 d0e480b67ef12d60bf73a7d87e36f6de415e62c91223098fd611595072e39d89

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