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 700 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.2.1
  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@v3
      - 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:

[tool.ruff]
# 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"

[tool.ruff.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]+?))$"

[tool.ruff.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"

Some configuration options can be provided via the command-line, such as those related to rule enablement and disablement, file discovery, and logging level:

ruff check path/to/code/ --select F401 --select F403 --quiet

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 700 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

This version

0.2.1

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.2.1.tar.gz (2.0 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.2.1-py3-none-win_arm64.whl (7.1 MB view details)

Uploaded Python 3Windows ARM64

ruff-0.2.1-py3-none-win_amd64.whl (7.4 MB view details)

Uploaded Python 3Windows x86-64

ruff-0.2.1-py3-none-win32.whl (6.8 MB view details)

Uploaded Python 3Windows x86

ruff-0.2.1-py3-none-musllinux_1_2_x86_64.whl (7.7 MB view details)

Uploaded Python 3musllinux: musl 1.2+ x86-64

ruff-0.2.1-py3-none-musllinux_1_2_i686.whl (7.3 MB view details)

Uploaded Python 3musllinux: musl 1.2+ i686

ruff-0.2.1-py3-none-musllinux_1_2_armv7l.whl (6.6 MB view details)

Uploaded Python 3musllinux: musl 1.2+ ARMv7l

ruff-0.2.1-py3-none-musllinux_1_2_aarch64.whl (7.1 MB view details)

Uploaded Python 3musllinux: musl 1.2+ ARM64

ruff-0.2.1-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (7.6 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ x86-64

ruff-0.2.1-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl (8.6 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ s390x

ruff-0.2.1-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl (8.1 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ ppc64le

ruff-0.2.1-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl (8.3 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ ppc64

ruff-0.2.1-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl (7.6 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ i686

ruff-0.2.1-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl (6.6 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ ARMv7l

ruff-0.2.1-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (7.2 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ ARM64

ruff-0.2.1-py3-none-macosx_10_12_x86_64.whl (7.4 MB view details)

Uploaded Python 3macOS 10.12+ x86-64

ruff-0.2.1-py3-none-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl (14.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.2.1.tar.gz.

File metadata

  • Download URL: ruff-0.2.1.tar.gz
  • Upload date:
  • Size: 2.0 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/4.0.2 CPython/3.11.7

File hashes

Hashes for ruff-0.2.1.tar.gz
Algorithm Hash digest
SHA256 3b42b5d8677cd0c72b99fcaf068ffc62abb5a19e71b4a3b9cfa50658a0af02f1
MD5 34b780de7878f34238a0b17ac141a571
BLAKE2b-256 61b6369912503f4858f3cdf4e123b951d7647beb47d7db0eb5f616dd1ef37775

See more details on using hashes here.

File details

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

File metadata

  • Download URL: ruff-0.2.1-py3-none-win_arm64.whl
  • Upload date:
  • Size: 7.1 MB
  • Tags: Python 3, Windows ARM64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/4.0.2 CPython/3.11.7

File hashes

Hashes for ruff-0.2.1-py3-none-win_arm64.whl
Algorithm Hash digest
SHA256 efababa8e12330aa94a53e90a81eb6e2d55f348bc2e71adbf17d9cad23c03ee6
MD5 0eb3f499fb82897fc9ffcb7881278055
BLAKE2b-256 4c819585441b9968c2052b0a25cf951d2e8923fd1c4d52f316165ebb958f3718

See more details on using hashes here.

File details

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

File metadata

  • Download URL: ruff-0.2.1-py3-none-win_amd64.whl
  • Upload date:
  • Size: 7.4 MB
  • Tags: Python 3, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/4.0.2 CPython/3.11.7

File hashes

Hashes for ruff-0.2.1-py3-none-win_amd64.whl
Algorithm Hash digest
SHA256 e3affdcbc2afb6f5bd0eb3130139ceedc5e3f28d206fe49f63073cb9e65988e0
MD5 cf7b8f881e573c3d7172e919d7e0a23f
BLAKE2b-256 8798f34b8f7e0af12846a5b25c55facc853c92d43f37304e35ceb7d60a2c4392

See more details on using hashes here.

File details

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

File metadata

  • Download URL: ruff-0.2.1-py3-none-win32.whl
  • Upload date:
  • Size: 6.8 MB
  • Tags: Python 3, Windows x86
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/4.0.2 CPython/3.11.7

File hashes

Hashes for ruff-0.2.1-py3-none-win32.whl
Algorithm Hash digest
SHA256 6b95ac9ce49b4fb390634d46d6ece32ace3acdd52814671ccaf20b7f60adb232
MD5 ac3f74f6f0e5d637b2169dcf08cb798b
BLAKE2b-256 aa9265a58c938d85999770b2fe40c4c089c31afc0b813bd0c517e11b2424531a

See more details on using hashes here.

File details

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

File metadata

  • Download URL: ruff-0.2.1-py3-none-musllinux_1_2_x86_64.whl
  • Upload date:
  • Size: 7.7 MB
  • Tags: Python 3, musllinux: musl 1.2+ x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/4.0.2 CPython/3.11.7

File hashes

Hashes for ruff-0.2.1-py3-none-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 e5cb5526d69bb9143c2e4d2a115d08ffca3d8e0fddc84925a7b54931c96f5c02
MD5 65999a78e113359d9edb44867c5f7024
BLAKE2b-256 438175a8b6771ea60a599551737b06cf6167bf47568f0530617c320e95bb916f

See more details on using hashes here.

File details

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

File metadata

  • Download URL: ruff-0.2.1-py3-none-musllinux_1_2_i686.whl
  • Upload date:
  • Size: 7.3 MB
  • Tags: Python 3, musllinux: musl 1.2+ i686
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/4.0.2 CPython/3.11.7

File hashes

Hashes for ruff-0.2.1-py3-none-musllinux_1_2_i686.whl
Algorithm Hash digest
SHA256 0034d5b6323e6e8fe91b2a1e55b02d92d0b582d2953a2b37a67a2d7dedbb7acc
MD5 1b97e520506d2fd14936710bc505e599
BLAKE2b-256 be16e490efc109900a7cd35881fc6ad3e9d885441aa7c154a57890ee66c998cd

See more details on using hashes here.

File details

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

File metadata

  • Download URL: ruff-0.2.1-py3-none-musllinux_1_2_armv7l.whl
  • Upload date:
  • Size: 6.6 MB
  • Tags: Python 3, musllinux: musl 1.2+ ARMv7l
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/4.0.2 CPython/3.11.7

File hashes

Hashes for ruff-0.2.1-py3-none-musllinux_1_2_armv7l.whl
Algorithm Hash digest
SHA256 0a725823cb2a3f08ee743a534cb6935727d9e47409e4ad72c10a3faf042ad5ba
MD5 3853ef3e9b5b4845d1822b26d0bc0738
BLAKE2b-256 ad75b553591a7ac113d3b1e8dc30442edf26fc3e865cd2ed8cfe8d7f6bc3a608

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.2.1-py3-none-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 7022d66366d6fded4ba3889f73cd791c2d5621b2ccf34befc752cb0df70f5fad
MD5 e7017f927b289b8ea0ab34f0f4eb3aa6
BLAKE2b-256 d3cfcc735333d04680ce918b81a0fde6aa582df36893a37f4647fe44ba180293

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.2.1-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 f3ef052283da7dec1987bba8d8733051c2325654641dfe5877a4022108098683
MD5 23bc54d23d908ab1ef4fe900cd44b68b
BLAKE2b-256 70d367fdaff63c3092fb667573d6b69fe601020212078b68adedcb821ad4dfcd

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.2.1-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl
Algorithm Hash digest
SHA256 fbd2288890b88e8aab4499e55148805b58ec711053588cc2f0196a44f6e3d855
MD5 1bbf7d8371144b8460ff17a7fdb84a4e
BLAKE2b-256 7a839633fb23c5c2bcdae402a711f1aee33a4e3362f35f636925923cf9a54367

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.2.1-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl
Algorithm Hash digest
SHA256 be60592f9d218b52f03384d1325efa9d3b41e4c4d55ea022cd548547cc42cd2b
MD5 e446491c825d08a806134fa549958b09
BLAKE2b-256 4a1825775a58c90c90f1bfab9cd3c072214e955aaf2b754ca2412c19a655c4d3

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.2.1-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl
Algorithm Hash digest
SHA256 00a818e2db63659570403e44383ab03c529c2b9678ba4ba6c105af7854008105
MD5 d712bdfdc259ca0a50e3388f166a6b78
BLAKE2b-256 f2ea2b87e1ce4b0c8175509a9206a3fd656f611aa1f6cfac5fe68a6e0b43aa11

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.2.1-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 a11567e20ea39d1f51aebd778685582d4c56ccb082c1161ffc10f79bebe6df35
MD5 8707fbde3bfa8418953500a2363ad9bc
BLAKE2b-256 237158999dc8a56d417658b26704347777e5d5c0df35303e39aecb5fe2dd2fa1

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.2.1-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl
Algorithm Hash digest
SHA256 13471684694d41ae0f1e8e3a7497e14cd57ccb7dd72ae08d56a159d6c9c3e30e
MD5 992a26750ab7718716e3fffe011f142c
BLAKE2b-256 8ee49bd2bbe2d950a58673b48d3080e66794b475f172d1f7ec6ca3ec8dd7422c

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.2.1-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 c92db7101ef5bfc18e96777ed7bc7c822d545fa5977e90a585accac43d22f18a
MD5 32e1c46bea9f90f3e1cf2632bc78aa8e
BLAKE2b-256 886d26de1c29fdef591e56e0f8336bb050f581b48ead1b7b69eab16a1e4ed8eb

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.2.1-py3-none-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 dc586724a95b7d980aa17f671e173df00f0a2eef23f8babbeee663229a938fec
MD5 d2916adc9723344c79bfd043b32e6744
BLAKE2b-256 5098da1db1515e6ad15a4e4bdbb9db8081ae555ba740fe5421a7a41bc35a144d

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.2.1-py3-none-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl
Algorithm Hash digest
SHA256 dd81b911d28925e7e8b323e8d06951554655021df8dd4ac3045d7212ac4ba080
MD5 50b4a814ca0204d7593c9a1f0d43b9d0
BLAKE2b-256 00a1618f1dbf5fc66c27221b1ede09a8b07ad4796cdf6cf9a8f8e4b20bb5987b

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