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.13 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:

# With pip.
pip install ruff

# With pipx.
pipx install ruff

Starting with version 0.5.0, Ruff can be installed with our standalone installers:

# On macOS and Linux.
curl -LsSf https://astral.sh/ruff/install.sh | sh

# On Windows.
powershell -c "irm https://astral.sh/ruff/install.ps1 | iex"

# For a specific version.
curl -LsSf https://astral.sh/ruff/0.7.4/install.sh | sh
powershell -c "irm https://astral.sh/ruff/0.7.4/install.ps1 | iex"

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.7.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 with various other editors.

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: astral-sh/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']}"

To opt in to the latest lint rules, formatter style changes, interface updates, and more, enable preview mode by setting preview = true in your configuration file or passing --preview on the command line. Preview mode enables a collection of unstable features that may change prior to stabilization.

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

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.7.4.tar.gz (3.3 MB view details)

Uploaded Source

Built Distributions

ruff-0.7.4-py3-none-win_arm64.whl (8.9 MB view details)

Uploaded Python 3 Windows ARM64

ruff-0.7.4-py3-none-win_amd64.whl (9.5 MB view details)

Uploaded Python 3 Windows x86-64

ruff-0.7.4-py3-none-win32.whl (8.7 MB view details)

Uploaded Python 3 Windows x86

ruff-0.7.4-py3-none-musllinux_1_2_x86_64.whl (11.2 MB view details)

Uploaded Python 3 musllinux: musl 1.2+ x86-64

ruff-0.7.4-py3-none-musllinux_1_2_i686.whl (10.8 MB view details)

Uploaded Python 3 musllinux: musl 1.2+ i686

ruff-0.7.4-py3-none-musllinux_1_2_armv7l.whl (10.3 MB view details)

Uploaded Python 3 musllinux: musl 1.2+ ARMv7l

ruff-0.7.4-py3-none-musllinux_1_2_aarch64.whl (10.7 MB view details)

Uploaded Python 3 musllinux: musl 1.2+ ARM64

ruff-0.7.4-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (11.1 MB view details)

Uploaded Python 3 manylinux: glibc 2.17+ x86-64

ruff-0.7.4-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl (12.7 MB view details)

Uploaded Python 3 manylinux: glibc 2.17+ s390x

ruff-0.7.4-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl (11.5 MB view details)

Uploaded Python 3 manylinux: glibc 2.17+ ppc64le

ruff-0.7.4-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl (12.0 MB view details)

Uploaded Python 3 manylinux: glibc 2.17+ ppc64

ruff-0.7.4-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl (11.3 MB view details)

Uploaded Python 3 manylinux: glibc 2.17+ i686

ruff-0.7.4-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl (10.2 MB view details)

Uploaded Python 3 manylinux: glibc 2.17+ ARMv7l

ruff-0.7.4-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (10.7 MB view details)

Uploaded Python 3 manylinux: glibc 2.17+ ARM64

ruff-0.7.4-py3-none-macosx_11_0_arm64.whl (9.9 MB view details)

Uploaded Python 3 macOS 11.0+ ARM64

ruff-0.7.4-py3-none-macosx_10_12_x86_64.whl (10.2 MB view details)

Uploaded Python 3 macOS 10.12+ x86-64

ruff-0.7.4-py3-none-linux_armv6l.whl (10.4 MB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: ruff-0.7.4.tar.gz
  • Upload date:
  • Size: 3.3 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.5.2

File hashes

Hashes for ruff-0.7.4.tar.gz
Algorithm Hash digest
SHA256 cd12e35031f5af6b9b93715d8c4f40360070b2041f81273d0527683d5708fce2
MD5 bdbe23794d40e2a5025c192f49e43786
BLAKE2b-256 0b8bbc4e0dfa1245b07cf14300e10319b98e958a53ff074c1dd86b35253a8c2a

See more details on using hashes here.

File details

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

File metadata

  • Download URL: ruff-0.7.4-py3-none-win_arm64.whl
  • Upload date:
  • Size: 8.9 MB
  • Tags: Python 3, Windows ARM64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.5.2

File hashes

Hashes for ruff-0.7.4-py3-none-win_arm64.whl
Algorithm Hash digest
SHA256 11bff065102c3ae9d3ea4dc9ecdfe5a5171349cdd0787c1fc64761212fc9cf1f
MD5 b38f09c7f43258740df6da2081467729
BLAKE2b-256 aa70f8724f31abc0b329ca98b33d73c14020168babcf71b0cba3cded5d9d0e66

See more details on using hashes here.

File details

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

File metadata

  • Download URL: ruff-0.7.4-py3-none-win_amd64.whl
  • Upload date:
  • Size: 9.5 MB
  • Tags: Python 3, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.5.2

File hashes

Hashes for ruff-0.7.4-py3-none-win_amd64.whl
Algorithm Hash digest
SHA256 745775c7b39f914238ed1f1b0bebed0b9155a17cd8bc0b08d3c87e4703b990d6
MD5 aa7994f9c0b3333735e1911070355904
BLAKE2b-256 6376253ddc3e89e70165bba952ecca424b980b8d3c2598ceb4fc47904f424953

See more details on using hashes here.

File details

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

File metadata

  • Download URL: ruff-0.7.4-py3-none-win32.whl
  • Upload date:
  • Size: 8.7 MB
  • Tags: Python 3, Windows x86
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.5.2

File hashes

Hashes for ruff-0.7.4-py3-none-win32.whl
Algorithm Hash digest
SHA256 75c53f54904be42dd52a548728a5b572344b50d9b2873d13a3f8c5e3b91f5cac
MD5 265f11d65bf975d95910416fa45157e9
BLAKE2b-256 8d1bdd77503b3875c51e3dbc053fd8367b845ab8b01c9ca6d0c237082732856c

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.7.4-py3-none-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 876f5e09eaae3eb76814c1d3b68879891d6fde4824c015d48e7a7da4cf066a3a
MD5 44ca52cc8730dc63df20bdee0e990881
BLAKE2b-256 a58940e904784f305fb56850063f70a998a64ebba68796d823dde67e89a24691

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.7.4-py3-none-musllinux_1_2_i686.whl
Algorithm Hash digest
SHA256 662a63b4971807623f6f90c1fb664613f67cc182dc4d991471c23c541fee62dd
MD5 eb47fe38f11044cac2ae4948f1ea452a
BLAKE2b-256 9fe539100f72f8ba70bec1bd329efc880dea8b6c1765ea1cb9d0c1c5f18b8d7f

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.7.4-py3-none-musllinux_1_2_armv7l.whl
Algorithm Hash digest
SHA256 2e32829c429dd081ee5ba39aef436603e5b22335c3d3fff013cd585806a6486a
MD5 94474707b901b1da1ab8e7b674022e49
BLAKE2b-256 5e762270719dbee0fd35780b05c08a07b7a726c3da9f67d9ae89ef21fc18e2e5

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.7.4-py3-none-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 3bd726099f277d735dc38900b6a8d6cf070f80828877941983a57bca1cd92172
MD5 f3ef610f138ef78f59e820d5903a7c04
BLAKE2b-256 c8eb0a7cb6059ac3555243bd026bb21785bbc812f7bbfa95a36c101bd72b47ae

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.7.4-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 0e92dfb5f00eaedb1501b2f906ccabfd67b2355bdf117fea9719fc99ac2145bc
MD5 acf09aa2fdc3b98ba417f1e5cf9baf7a
BLAKE2b-256 509076867152b0d3c05df29a74bb028413e90f704f0f6701c4801174ba47f959

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.7.4-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl
Algorithm Hash digest
SHA256 7dbdc7d8274e1422722933d1edddfdc65b4336abf0b16dfcb9dedd6e6a517d06
MD5 f7ef03c8f5bd17c58dfb0b8844486ba1
BLAKE2b-256 371a5ec1844e993e376a86eb2456496831ed91b4398c434d8244f89094758940

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.7.4-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl
Algorithm Hash digest
SHA256 00b4cf3a6b5fad6d1a66e7574d78956bbd09abfd6c8a997798f01f5da3d46a05
MD5 d501d3ec60404befcaf27692324d9690
BLAKE2b-256 b8fc6519ce58c57b4edafcdf40920b7273dfbba64fc6ebcaae7b88e4dc1bf0a8

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.7.4-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl
Algorithm Hash digest
SHA256 997512325c6620d1c4c2b15db49ef59543ef9cd0f4aa8065ec2ae5103cedc7e7
MD5 8b4bf4bc19c2888c6caaef1df4b0b2e2
BLAKE2b-256 128d20abdbf705969914ce40988fe71a554a918deaab62c38ec07483e77866f6

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.7.4-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 80094ecd4793c68b2571b128f91754d60f692d64bc0d7272ec9197fdd09bf9ea
MD5 08faa19e97c00e47b22ca07cb7091f50
BLAKE2b-256 adb7964c75be9bc2945fc3172241b371197bb6d948cc69e28bc4518448c368f3

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.7.4-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl
Algorithm Hash digest
SHA256 e0cea28d0944f74ebc33e9f934238f15c758841f9f5edd180b5315c203293452
MD5 73241b2953eb2215aa34b25fe8ed68eb
BLAKE2b-256 212498d2e109c4efc02bfef144ec6ea2c3e1217e7ce0cfddda8361d268dfd499

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.7.4-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 0d06218747d361d06fd2fdac734e7fa92df36df93035db3dc2ad7aa9852cb109
MD5 dda00c76eae9d39fe6c3c73572861ef0
BLAKE2b-256 4d26e1e54893b13046a6ad05ee9b89ee6f71542ba250f72b4c7a7d17c3dbf73d

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.7.4-py3-none-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 63a569b36bc66fbadec5beaa539dd81e0527cb258b94e29e0531ce41bacc1f20
MD5 88afbf04b63d771196818a95244aabfd
BLAKE2b-256 628342a6ec6216ded30b354b13e0e9327ef75a3c147751aaf10443756cb690e9

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.7.4-py3-none-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 cfb365c135b830778dda8c04fb7d4280ed0b984e1aec27f574445231e20d6c63
MD5 b4ed1e94973332357eebf91f37fe2adc
BLAKE2b-256 9e1d3d2d2c9f601cf6044799c5349ff5267467224cefed9b35edf5f1f36486e9

See more details on using hashes here.

File details

Details for the file ruff-0.7.4-py3-none-linux_armv6l.whl.

File metadata

File hashes

Hashes for ruff-0.7.4-py3-none-linux_armv6l.whl
Algorithm Hash digest
SHA256 a4919925e7684a3f18e18243cd6bea7cfb8e968a6eaa8437971f681b7ec51478
MD5 b42104af98c180c4927a79b61d1287d1
BLAKE2b-256 e64bf5094719e254829766b807dadb766841124daba75a37da83e292ae5ad12f

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page