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

Uploaded Python 3Windows ARM64

ruff-0.3.6-py3-none-win_amd64.whl (8.7 MB view details)

Uploaded Python 3Windows x86-64

ruff-0.3.6-py3-none-win32.whl (7.8 MB view details)

Uploaded Python 3Windows x86

ruff-0.3.6-py3-none-musllinux_1_2_x86_64.whl (8.9 MB view details)

Uploaded Python 3musllinux: musl 1.2+ x86-64

ruff-0.3.6-py3-none-musllinux_1_2_i686.whl (8.4 MB view details)

Uploaded Python 3musllinux: musl 1.2+ i686

ruff-0.3.6-py3-none-musllinux_1_2_armv7l.whl (7.7 MB view details)

Uploaded Python 3musllinux: musl 1.2+ ARMv7l

ruff-0.3.6-py3-none-musllinux_1_2_aarch64.whl (8.2 MB view details)

Uploaded Python 3musllinux: musl 1.2+ ARM64

ruff-0.3.6-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (8.9 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ x86-64

ruff-0.3.6-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl (10.1 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ s390x

ruff-0.3.6-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl (9.3 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ ppc64le

ruff-0.3.6-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl (9.6 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ ppc64

ruff-0.3.6-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl (8.9 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ i686

ruff-0.3.6-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl (7.7 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ ARMv7l

ruff-0.3.6-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (8.3 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ ARM64

ruff-0.3.6-py3-none-macosx_10_12_x86_64.whl (8.6 MB view details)

Uploaded Python 3macOS 10.12+ x86-64

ruff-0.3.6-py3-none-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl (16.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.3.6.tar.gz.

File metadata

  • Download URL: ruff-0.3.6.tar.gz
  • Upload date:
  • Size: 2.2 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/5.0.0 CPython/3.12.3

File hashes

Hashes for ruff-0.3.6.tar.gz
Algorithm Hash digest
SHA256 26071fb530038602b984e3bbe1443ef82a38450c4dcb1344a9caf67234ff9756
MD5 33a23b6b73a522b589cf3eeb3c227572
BLAKE2b-256 005a7fda7cb7121cb19e02401426d8a26b1d1dfda9de7d9f4d0b5dfa2a47b952

See more details on using hashes here.

File details

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

File metadata

  • Download URL: ruff-0.3.6-py3-none-win_arm64.whl
  • Upload date:
  • Size: 8.2 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.3.6-py3-none-win_arm64.whl
Algorithm Hash digest
SHA256 7c8a2a0e0cab077a07465259ffe3b3c090e747ca8097c5dc4c36ca0fdaaac90d
MD5 5effc899e136c242d6417cda8f46462a
BLAKE2b-256 ab171b48d196e0e95adc98cc87bd4014eca2ef3b6161b965c9e13d4e64e2f169

See more details on using hashes here.

File details

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

File metadata

  • Download URL: ruff-0.3.6-py3-none-win_amd64.whl
  • Upload date:
  • Size: 8.7 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.3.6-py3-none-win_amd64.whl
Algorithm Hash digest
SHA256 f1aa621beed533f46e9c7d6fe00e7f6e4570155b61d8f020387b72ace2b42e04
MD5 7fda51b1f98bdb5d182bd55c68d5f926
BLAKE2b-256 106f2fe45c3932f63eab04a667a4027f4bfab0da281ee6d024eaf70dff32be63

See more details on using hashes here.

File details

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

File metadata

  • Download URL: ruff-0.3.6-py3-none-win32.whl
  • Upload date:
  • Size: 7.8 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.3.6-py3-none-win32.whl
Algorithm Hash digest
SHA256 4056480f5cf38ad278667c31b0ef334c29acdfcea617cb89c4ccbc7d96f1637f
MD5 4437cc8f3c4d14d89e8bb6d5148efcd7
BLAKE2b-256 9968693d23f9019f0c06f9184de88b3dafe5ee2a081f82295782860b93d0e7eb

See more details on using hashes here.

File details

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

File metadata

  • Download URL: ruff-0.3.6-py3-none-musllinux_1_2_x86_64.whl
  • Upload date:
  • Size: 8.9 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.3.6-py3-none-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 e3da499ded004d0b956ab04248b2ae17e54a67ffc81353514ac583af5959a255
MD5 4246e0b20811d2cc5902f86321caa6a9
BLAKE2b-256 3c7ef09a75f74efa12d529a2b9be04de089e23a259062de5a9de73421ab6ac68

See more details on using hashes here.

File details

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

File metadata

  • Download URL: ruff-0.3.6-py3-none-musllinux_1_2_i686.whl
  • Upload date:
  • Size: 8.4 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.3.6-py3-none-musllinux_1_2_i686.whl
Algorithm Hash digest
SHA256 2b0c4c70578ef1871a9ac5c85ed7a8c33470e976c73ba9211a111d2771b5f787
MD5 c4f0d25934c07037e539d6944f0ac385
BLAKE2b-256 54cdb0539b6b1c2c8f50410f06f85dd12cf0cde43c7b8255eaa2fb4eee8f41fd

See more details on using hashes here.

File details

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

File metadata

  • Download URL: ruff-0.3.6-py3-none-musllinux_1_2_armv7l.whl
  • Upload date:
  • Size: 7.7 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.3.6-py3-none-musllinux_1_2_armv7l.whl
Algorithm Hash digest
SHA256 647f1fb5128a3e24ce68878b8050bb55044c45bb3f3ae4710d4da9ca96ede5cb
MD5 b770e07d6725231bfcac49af84b4be6e
BLAKE2b-256 79125ab41a4fcef8132a9161d56122344f1bfafc6376e159459be292ee06b682

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.3.6-py3-none-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 b11e09439d9df6cc12d9f622065834654417c40216d271f639512d80e80e3e53
MD5 b2e31fd893bc69b2161d39838832a2b3
BLAKE2b-256 5333d5759518311b2d8bc037b9620c3712ae4ce8143a48cd92b7ac773ef7d10b

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.3.6-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 28ccf3fb6d1162a73cd286c63a5e4d885f46a1f99f0b392924bc95ccbd18ea8f
MD5 da4d579037d44cb9ca2459aa964f7413
BLAKE2b-256 29f574068d1932a2f14dd54a8f2e88a0c9a89dcd82b22b6924c4eec2ac9b89bf

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.3.6-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl
Algorithm Hash digest
SHA256 c466a52c522e6a08df0af018f550902f154f5649ad09e7f0d43da766e7399ebc
MD5 736e1f576eb9de69dd1928951e6e7f80
BLAKE2b-256 6c5bf806db8204fcb125f7be14b4dc7b56072f2abc70f7da64fddbe19369de6a

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.3.6-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl
Algorithm Hash digest
SHA256 cf48ec2c4bfae7837dc325c431a2932dc23a1485e71c59591c1df471ba234e0e
MD5 9f0f747f618c90d06ab57f60e920d627
BLAKE2b-256 ef0c65212abb2e30a36fcbf7e25d533c661bfb6cd40712d40f57fc9793c4ea33

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.3.6-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl
Algorithm Hash digest
SHA256 b2e79f8e1b6bd5411d7ddad3f2abff3f9d371beda29daef86400d416dedb7e02
MD5 b4d9f68cdf69c28bdc0a1c6cb1523506
BLAKE2b-256 1b7e7df2693eebd59c705495078d4523b362a454aa6d0dae4d1bba444ad2bafb

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.3.6-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 ecb87788284af96725643eae9ab3ac746d8cc09aad140268523b019f7ac3cd98
MD5 bf0c3144a4d0b9bf4ed576a24dea3426
BLAKE2b-256 28bf44606284eda832a6162c514313b55b22a57a18acd805483e2c11cd1f89e6

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.3.6-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl
Algorithm Hash digest
SHA256 878ef1a55ce931f3ca23b690b159cd0659f495a4c231a847b00ca55e4c688baf
MD5 eb8ea66819426891640b067dcad3d70f
BLAKE2b-256 dceb8f598305b99ce2fc68b70edf7989d2f2e233bd7688a611eba56473082b04

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.3.6-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 fc4006cbc6c11fefc25f122d2eb4731d7a3d815dc74d67c54991cc3f99c90177
MD5 e4de4e0dd98b3ee2bcf78fb45b9abd73
BLAKE2b-256 5598741694c0b138f17f368460864114254abd1e92fdc1c74d36394821dfd55d

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.3.6-py3-none-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 93699d61116807edc5ca1cdf9d2d22cf8d93335d59e3ff0ca7aee62c1818a736
MD5 596de02cf5aeb99285c18d14d4ea0d20
BLAKE2b-256 75e3bc15ba3465f821427659913e70e64fec3b2b089d6b969bf9105d386b5a67

See more details on using hashes here.

File details

Details for the file ruff-0.3.6-py3-none-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl.

File metadata

File hashes

Hashes for ruff-0.3.6-py3-none-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl
Algorithm Hash digest
SHA256 732ef99984275534f9466fbc01121523caf72aa8c2bdeb36fd2edf2bc294a992
MD5 085866d01660a1874064fa42ffa6e5f0
BLAKE2b-256 0132cc6d980fc0bc9c429786baffb5ea9d716127bfe396bb243fed6bb114df6f

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