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.4
  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

This repository is licensed under the MIT License

Project details


Release history Release notifications | RSS feed

This version

0.4.4

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.4.tar.gz (2.5 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.4-py3-none-win_arm64.whl (7.8 MB view details)

Uploaded Python 3Windows ARM64

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

Uploaded Python 3Windows x86-64

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

Uploaded Python 3Windows x86

ruff-0.4.4-py3-none-musllinux_1_2_x86_64.whl (8.7 MB view details)

Uploaded Python 3musllinux: musl 1.2+ x86-64

ruff-0.4.4-py3-none-musllinux_1_2_i686.whl (8.2 MB view details)

Uploaded Python 3musllinux: musl 1.2+ i686

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

Uploaded Python 3musllinux: musl 1.2+ ARMv7l

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

Uploaded Python 3musllinux: musl 1.2+ ARM64

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

Uploaded Python 3manylinux: glibc 2.17+ s390x

ruff-0.4.4-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl (8.9 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ ppc64le

ruff-0.4.4-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl (9.3 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ ppc64

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

Uploaded Python 3manylinux: glibc 2.17+ i686

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

Uploaded Python 3manylinux: glibc 2.17+ ARMv7l

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

Uploaded Python 3manylinux: glibc 2.17+ ARM64

ruff-0.4.4-py3-none-macosx_11_0_arm64.whl (8.0 MB view details)

Uploaded Python 3macOS 11.0+ ARM64

ruff-0.4.4-py3-none-macosx_10_12_x86_64.whl (8.4 MB view details)

Uploaded Python 3macOS 10.12+ x86-64

File details

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

File metadata

  • Download URL: ruff-0.4.4.tar.gz
  • Upload date:
  • Size: 2.5 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.4.tar.gz
Algorithm Hash digest
SHA256 f87ea42d5cdebdc6a69761a9d0bc83ae9b3b30d0ad78952005ba6568d6c022af
MD5 3f5f03839059a6124bc2fff65c7195e4
BLAKE2b-256 2f2f1e91c17c5223a37992a9302af69056966657d23f945e07039319fe006f82

See more details on using hashes here.

File details

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

File metadata

  • Download URL: ruff-0.4.4-py3-none-win_arm64.whl
  • Upload date:
  • Size: 7.8 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.4-py3-none-win_arm64.whl
Algorithm Hash digest
SHA256 39df0537b47d3b597293edbb95baf54ff5b49589eb7ff41926d8243caa995ea6
MD5 441d86e35634d03f1648f6a0c97e99b6
BLAKE2b-256 6039c554b9f2af7788c63c2ca872bedec26e7a60771215fe75a997927cf22657

See more details on using hashes here.

File details

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

File metadata

  • Download URL: ruff-0.4.4-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.4-py3-none-win_amd64.whl
Algorithm Hash digest
SHA256 424e5b72597482543b684c11def82669cc6b395aa8cc69acc1858b5ef3e5daae
MD5 920c2e7cc9af650d26cf85b8f299fe02
BLAKE2b-256 79002470956ed833488a8fe4dd245782022686ba20579f63b5b968b90dc71d45

See more details on using hashes here.

File details

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

File metadata

  • Download URL: ruff-0.4.4-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.4-py3-none-win32.whl
Algorithm Hash digest
SHA256 cb53473849f011bca6e754f2cdf47cafc9c4f4ff4570003a0dad0b9b6890e876
MD5 8bcef3049c1d4110e726a9594d43e9ac
BLAKE2b-256 decf17c4b513aad66eca29be135b5446197ff72baebbae6868552545d809b3df

See more details on using hashes here.

File details

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

File metadata

  • Download URL: ruff-0.4.4-py3-none-musllinux_1_2_x86_64.whl
  • Upload date:
  • Size: 8.7 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.4-py3-none-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 958b4ea5589706a81065e2a776237de2ecc3e763342e5cc8e02a4a4d8a5e6f95
MD5 e97abb353f5940e6cc932d58f050ce1c
BLAKE2b-256 58f830969d9268d7435761431c002d29bd4e742ff47e9ffea56d4c6737c4accf

See more details on using hashes here.

File details

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

File metadata

  • Download URL: ruff-0.4.4-py3-none-musllinux_1_2_i686.whl
  • Upload date:
  • Size: 8.2 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.4-py3-none-musllinux_1_2_i686.whl
Algorithm Hash digest
SHA256 9da73eb616b3241a307b837f32756dc20a0b07e2bcb694fec73699c93d04a69e
MD5 b2d76bb3f9c795d130758f973646b57c
BLAKE2b-256 4287835d1bdb908a9c4ce56956cf0b08aa0cabe3a1de94294293f4420abd0ac7

See more details on using hashes here.

File details

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

File metadata

  • Download URL: ruff-0.4.4-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.4-py3-none-musllinux_1_2_armv7l.whl
Algorithm Hash digest
SHA256 1aecced1269481ef2894cc495647392a34b0bf3e28ff53ed95a385b13aa45768
MD5 3a35035e9e9ff3106cbf679d63a50d79
BLAKE2b-256 ea85e1bdcdc531a965af551b82233e9ceb12af9661144c9e548693e8b0eba902

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.4.4-py3-none-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 b1867ee9bf3acc21778dcb293db504692eda5f7a11a6e6cc40890182a9f9e595
MD5 1a8fa7ba132f6ee7a9d599ccb52ac630
BLAKE2b-256 78a4ad40ffae25ed3bbe6d835243383061fe59910fe0b8b969f69bf8adfbfa6e

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.4.4-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 b5eb0a4bfd6400b7d07c09a7725e1a98c3b838be557fee229ac0f84d9aa49c36
MD5 029c449ce7bbebc0bdc83bbbdbd4a68e
BLAKE2b-256 fa13dd0ff7a488ace95676486c9d4d0202fc15d64a6491748e2ce8876df87870

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.4.4-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl
Algorithm Hash digest
SHA256 c51c928a14f9f0a871082603e25a1588059b7e08a920f2f9fa7157b5bf08cfe9
MD5 1f8ddeac226ccd4cf8587aeabda2b2ba
BLAKE2b-256 30d55e22d68e5f79e63ea23322bca5b04aad94d03e6dcf23f8de5a472707b500

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.4.4-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl
Algorithm Hash digest
SHA256 b9ddb2c494fb79fc208cd15ffe08f32b7682519e067413dbaf5f4b01a6087bcd
MD5 e3ba4821bc0f43c2a72b61c6327f0a20
BLAKE2b-256 da9f9203470e3e30a088446a29ccadf81cffaf603cade8f4230f62da5658b292

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.4.4-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl
Algorithm Hash digest
SHA256 8e7e6ebc10ef16dcdc77fd5557ee60647512b400e4a60bdc4849468f076f6eef
MD5 3253b93e2e35c7f0b8f9667d58535ba8
BLAKE2b-256 ef6d0d3f7632f86f09dde0429872835d592151e22d4584ea6a5cfb8f0ade1394

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.4.4-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 b90fc5e170fc71c712cc4d9ab0e24ea505c6a9e4ebf346787a67e691dfb72e85
MD5 8c673a4a5b912278954c94ae1608b99e
BLAKE2b-256 b2fcc70845aa31a7971b838b5dfa07c5df461927148d84148e9a8e59482b418d

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.4.4-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl
Algorithm Hash digest
SHA256 60ed88b636a463214905c002fa3eaab19795679ed55529f91e488db3fe8976ab
MD5 80efc4943c0216227a3205aa8060c5bf
BLAKE2b-256 18ee4b7d6a7ef3ee6f67d60de67172791e8f334abd9f85a319fea9412343d0ec

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.4.4-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 4c8e2f1e8fc12d07ab521a9005d68a969e167b589cbcaee354cb61e9d9de9c15
MD5 af1c38d62dc3b21e8c4b57c3bd04db82
BLAKE2b-256 aeb834d5e2560d89cb43b3e27b12b11545a7557b7363cb7e8cbfdb0dac916bb3

See more details on using hashes here.

File details

Details for the file ruff-0.4.4-py3-none-macosx_11_0_arm64.whl.

File metadata

  • Download URL: ruff-0.4.4-py3-none-macosx_11_0_arm64.whl
  • Upload date:
  • Size: 8.0 MB
  • Tags: Python 3, macOS 11.0+ ARM64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/5.0.0 CPython/3.12.3

File hashes

Hashes for ruff-0.4.4-py3-none-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 c4efe62b5bbb24178c950732ddd40712b878a9b96b1d02b0ff0b08a090cbd891
MD5 85f3002ca264e87a3418fea1529228cc
BLAKE2b-256 5e046388dcb969cc69b365e2d024c0180a1462ce1be385b76ac126fe1bafa680

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.4.4-py3-none-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 29d44ef5bb6a08e235c8249294fa8d431adc1426bfda99ed493119e6f9ea1bf6
MD5 da2ad62d36e8bb2acaac9ce16a1672b8
BLAKE2b-256 016ed4d59a457b6633b4a2b08b2efb61323299b3ad3889ce604e1e8c2d278027

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