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.8.0/install.sh | sh
powershell -c "irm https://astral.sh/ruff/0.8.0/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.8.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 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.9
target-version = "py39"

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

Uploaded Source

Built Distributions

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

Uploaded Python 3 Windows ARM64

ruff-0.8.0-py3-none-win_amd64.whl (9.6 MB view details)

Uploaded Python 3 Windows x86-64

ruff-0.8.0-py3-none-win32.whl (8.8 MB view details)

Uploaded Python 3 Windows x86

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

Uploaded Python 3 musllinux: musl 1.2+ x86-64

ruff-0.8.0-py3-none-musllinux_1_2_i686.whl (10.9 MB view details)

Uploaded Python 3 musllinux: musl 1.2+ i686

ruff-0.8.0-py3-none-musllinux_1_2_armv7l.whl (10.4 MB view details)

Uploaded Python 3 musllinux: musl 1.2+ ARMv7l

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

Uploaded Python 3 musllinux: musl 1.2+ ARM64

ruff-0.8.0-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.8.0-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl (12.8 MB view details)

Uploaded Python 3 manylinux: glibc 2.17+ s390x

ruff-0.8.0-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl (11.6 MB view details)

Uploaded Python 3 manylinux: glibc 2.17+ ppc64le

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

Uploaded Python 3 manylinux: glibc 2.17+ ppc64

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

Uploaded Python 3 manylinux: glibc 2.17+ i686

ruff-0.8.0-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl (10.3 MB view details)

Uploaded Python 3 manylinux: glibc 2.17+ ARMv7l

ruff-0.8.0-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (10.8 MB view details)

Uploaded Python 3 manylinux: glibc 2.17+ ARM64

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

Uploaded Python 3 macOS 11.0+ ARM64

ruff-0.8.0-py3-none-macosx_10_12_x86_64.whl (10.3 MB view details)

Uploaded Python 3 macOS 10.12+ x86-64

ruff-0.8.0-py3-none-linux_armv6l.whl (10.5 MB view details)

Uploaded Python 3

File details

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

File metadata

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

File hashes

Hashes for ruff-0.8.0.tar.gz
Algorithm Hash digest
SHA256 a7ccfe6331bf8c8dad715753e157457faf7351c2b69f62f32c165c2dbcbacd44
MD5 ca3ba2e1fe827852e0516c6e115722ff
BLAKE2b-256 b2d6a2373f3ba7180ddb44420d2a9d1f1510e1a4d162b3d27282bedcb09c8da9

See more details on using hashes here.

File details

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

File metadata

  • Download URL: ruff-0.8.0-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.4

File hashes

Hashes for ruff-0.8.0-py3-none-win_arm64.whl
Algorithm Hash digest
SHA256 ba93e6294e9a737cd726b74b09a6972e36bb511f9a102f1d9a7e1ce94dd206a6
MD5 da0494f4472b97da6bd4146564323fbd
BLAKE2b-256 5bbccc8a6a5ca4960b226dc15dd8fb511dd11f2014ff89d325c0b9b9faa9871f

See more details on using hashes here.

File details

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

File metadata

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

File hashes

Hashes for ruff-0.8.0-py3-none-win_amd64.whl
Algorithm Hash digest
SHA256 582891c57b96228d146725975fbb942e1f30a0c4ba19722e692ca3eb25cc9b4f
MD5 d6518fcdf872144eb9ec8ef3df877ead
BLAKE2b-256 1d5c4d800fca7854f62ad77f2c0d99b4b585f03e2d87a6ec1ecea85543a14a3c

See more details on using hashes here.

File details

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

File metadata

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

File hashes

Hashes for ruff-0.8.0-py3-none-win32.whl
Algorithm Hash digest
SHA256 5fdb6efecc3eb60bba5819679466471fd7d13c53487df7248d6e27146e985468
MD5 cf809086b0ef40dda36e93778f931b76
BLAKE2b-256 0320401132c0908e8837625e3b7e32df9962e7cd681a4df1e16a10e2a5b4ecda

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.8.0-py3-none-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 780d5d8523c04202184405e60c98d7595bdb498c3c6abba3b6d4cdf2ca2af426
MD5 7987bde62d2680a9ffe256984b8dd14b
BLAKE2b-256 d5f7685b1e1d42a3e94ceb25eab23c70bdd8c0ab66a43121ef83fe6db5a58756

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.8.0-py3-none-musllinux_1_2_i686.whl
Algorithm Hash digest
SHA256 812e2052121634cf13cd6fddf0c1871d0ead1aad40a1a258753c04c18bb71bbd
MD5 61e57fd215165f45daa97a90c0faecd3
BLAKE2b-256 082ac013f4f3e4a54596c369cee74c24870ed1d534f31a35504908b1fc97017a

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.8.0-py3-none-musllinux_1_2_armv7l.whl
Algorithm Hash digest
SHA256 83a55679c4cb449fa527b8497cadf54f076603cc36779b2170b24f704171ce70
MD5 d1525d520e53d43c92dbe6bcf7e68ad3
BLAKE2b-256 2961a12f3b81520083cd7c5caa24ba61bb99fd1060256482eff0ef04cc5ccd1b

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.8.0-py3-none-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 85e654f0ded7befe2d61eeaf3d3b1e4ef3894469cd664ffa85006c7720f1e4a2
MD5 d8efec8f600cafb47b1409a6323e0f66
BLAKE2b-256 b723c12cdef58413cee2436d6a177aa06f7a366ebbca916cf10820706f632459

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.8.0-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 87a8e86bae0dbd749c815211ca11e3a7bd559b9710746c559ed63106d382bd9c
MD5 097b069ec0921fd6c5b48fbda7c488e2
BLAKE2b-256 4c5d083181bdec4ec92a431c1291d3fff65eef3ded630a4b55eb735000ef5f3b

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.8.0-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl
Algorithm Hash digest
SHA256 facebdfe5a5af6b1588a1d26d170635ead6892d0e314477e80256ef4a8470cf3
MD5 51a3f8e3670546e1f936d22f8d8f4cc7
BLAKE2b-256 263f7602eb11d2886db545834182a9dbe500b8211fcbc9b4064bf9d358bbbbb4

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.8.0-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl
Algorithm Hash digest
SHA256 2dabfd05b96b7b8f2da00d53c514eea842bff83e41e1cceb08ae1966254a51df
MD5 1c51b53422f6c7d283f82d40b3d2ecb5
BLAKE2b-256 24a0be5296dda6428ba8a13bda8d09fbc0e14c810b485478733886e61597ae2b

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.8.0-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl
Algorithm Hash digest
SHA256 c5c1466be2a2ebdf7c5450dd5d980cc87c8ba6976fb82582fea18823da6fa362
MD5 d04aa2178e17fd51a8cf801524aa91a2
BLAKE2b-256 90267dad6e7d833d391a8a1afe4ee70ca6f36c4a297d3cca83ef10e83e9aacf3

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.8.0-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 3f4cd64916d8e732ce6b87f3f5296a8942d285bbbc161acee7fe561134af64f9
MD5 65f41ba34cf9b3e2429a973398aa3725
BLAKE2b-256 65fa04c647bb809c4d65e8eae1ed1c654d9481b21dd942e743cd33511687b9f9

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.8.0-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl
Algorithm Hash digest
SHA256 0e55cce9aa93c5d0d4e3937e47b169035c7e91c8655b0974e61bb79cf398d49c
MD5 fe884b3bd33bc6cec9de01333d112d81
BLAKE2b-256 5d87afc95aeb8bc78b1d8a3461717a4419c05aa8aa943d4c9cbd441630f85584

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.8.0-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 eb0d4f250a7711b67ad513fde67e8870109e5ce590a801c3722580fe98c33a99
MD5 b227e072a8fdc0ad74beb3ac292f1d71
BLAKE2b-256 3ecd46b6f7043597eb318b5f5482c8ae8f5491cccce771e85f59d23106f2d179

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.8.0-py3-none-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 7b1f1c76b47c18fa92ee78b60d2d20d7e866c55ee603e7d19c1e991fad933a9a
MD5 16c3d5d6a263da75223a7eb4ae6d7cfc
BLAKE2b-256 41179885e4a0eeae07abd2a4ebabc3246f556719f24efa477ba2739146c4635a

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.8.0-py3-none-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 295bb4c02d58ff2ef4378a1870c20af30723013f441c9d1637a008baaf928c8b
MD5 d01e971493a579f2cb35b33905c89070
BLAKE2b-256 dac80a47de01edf19fb22f5f9b7964f46a68d0bdff20144d134556ffd1ba9154

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.8.0-py3-none-linux_armv6l.whl
Algorithm Hash digest
SHA256 fcb1bf2cc6706adae9d79c8d86478677e3bbd4ced796ccad106fd4776d395fea
MD5 2dd7d33fbda677d19cffb2d274576d1d
BLAKE2b-256 ec77e889ee3ce7fd8baa3ed1b77a03b9fb8ec1be68be1418261522fd6a5405e0

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