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.1.15
  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 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.1.15.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.1.15-py3-none-win_arm64.whl (7.0 MB view details)

Uploaded Python 3Windows ARM64

ruff-0.1.15-py3-none-win_amd64.whl (7.3 MB view details)

Uploaded Python 3Windows x86-64

ruff-0.1.15-py3-none-win32.whl (6.7 MB view details)

Uploaded Python 3Windows x86

ruff-0.1.15-py3-none-musllinux_1_2_x86_64.whl (7.6 MB view details)

Uploaded Python 3musllinux: musl 1.2+ x86-64

ruff-0.1.15-py3-none-musllinux_1_2_i686.whl (7.2 MB view details)

Uploaded Python 3musllinux: musl 1.2+ i686

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

Uploaded Python 3musllinux: musl 1.2+ ARMv7l

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

Uploaded Python 3musllinux: musl 1.2+ ARM64

ruff-0.1.15-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (7.5 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ x86-64

ruff-0.1.15-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl (8.5 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ s390x

ruff-0.1.15-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl (7.9 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ ppc64le

ruff-0.1.15-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl (8.2 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ ppc64

ruff-0.1.15-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl (7.5 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ i686

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

Uploaded Python 3manylinux: glibc 2.17+ ARMv7l

ruff-0.1.15-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (7.1 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ ARM64

ruff-0.1.15-py3-none-macosx_10_12_x86_64.whl (7.3 MB view details)

Uploaded Python 3macOS 10.12+ x86-64

ruff-0.1.15-py3-none-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl (14.4 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.1.15.tar.gz.

File metadata

  • Download URL: ruff-0.1.15.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.1.15.tar.gz
Algorithm Hash digest
SHA256 f6dfa8c1b21c913c326919056c390966648b680966febcb796cc9d1aaab8564e
MD5 6a58be996ee3b6a4da1196eab57b9b97
BLAKE2b-256 42337165f88a156be1c2fd13a18b3af6e75bbf82da5b6978cd2128d666accc18

See more details on using hashes here.

File details

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

File metadata

  • Download URL: ruff-0.1.15-py3-none-win_arm64.whl
  • Upload date:
  • Size: 7.0 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.1.15-py3-none-win_arm64.whl
Algorithm Hash digest
SHA256 9a933dfb1c14ec7a33cceb1e49ec4a16b51ce3c20fd42663198746efc0427360
MD5 241c55ab25047ddb5fd9ed7499e537e9
BLAKE2b-256 c9bdc196493563d6bf8fe960f10b83926a3fae3a43a96eac6b263aecb96c61d7

See more details on using hashes here.

File details

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

File metadata

  • Download URL: ruff-0.1.15-py3-none-win_amd64.whl
  • Upload date:
  • Size: 7.3 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.1.15-py3-none-win_amd64.whl
Algorithm Hash digest
SHA256 3837ac73d869efc4182d9036b1405ef4c73d9b1f88da2413875e34e0d6919587
MD5 58e22db3c256e94fdf87903cc15c80e7
BLAKE2b-256 2b5f3ba51cc770ed2b2df88efc32bba26759e6ac5c6149319a60913a85230936

See more details on using hashes here.

File details

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

File metadata

  • Download URL: ruff-0.1.15-py3-none-win32.whl
  • Upload date:
  • Size: 6.7 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.1.15-py3-none-win32.whl
Algorithm Hash digest
SHA256 2417e1cb6e2068389b07e6fa74c306b2810fe3ee3476d5b8a96616633f40d14f
MD5 0e62c733d546c7ded79092059766c0fa
BLAKE2b-256 8d61ffdccecb0b39521d7060d6a6bc33c53d7f20d48d3511d6333cb01f26e979

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.1.15-py3-none-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 1bab866aafb53da39c2cadfb8e1c4550ac5340bb40300083eb8967ba25481447
MD5 492c7009ecc4b2eebc9b36c95f9a1e48
BLAKE2b-256 e5bfde34ad339e0d1f6faa858cbcf793f3abc168b7aa516dd9227d843b992be8

See more details on using hashes here.

File details

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

File metadata

  • Download URL: ruff-0.1.15-py3-none-musllinux_1_2_i686.whl
  • Upload date:
  • Size: 7.2 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.1.15-py3-none-musllinux_1_2_i686.whl
Algorithm Hash digest
SHA256 6c629cf64bacfd136c07c78ac10a54578ec9d1bd2a9d395efbee0935868bf852
MD5 1a4dfb782247fcc1a70541d8bf744f51
BLAKE2b-256 b885da93f0fc8f2424cf776fcce6daef9291162345179d16faf1401ff2890068

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.1.15-py3-none-musllinux_1_2_armv7l.whl
Algorithm Hash digest
SHA256 abf4822129ed3a5ce54383d5f0e964e7fef74a41e48eb1dfad404151efc130a2
MD5 d963899e5127bde402865549d45b0eec
BLAKE2b-256 e8ca4066dbcc3631a4efe1fe695f42f20aca50474d760b3bd8e57d7565d75aa5

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.1.15-py3-none-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 ddb87643be40f034e97e97f5bc2ef7ce39de20e34608f3f829db727a93fb82c5
MD5 1942acbe1663ef42ea17e2b5aa5f5aff
BLAKE2b-256 474196b770475c46590bfd051ca0c5f797b2d45f2638c45f3a9daf1ae55b96d6

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.1.15-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 b17b93c02cdb6aeb696effecea1095ac93f3884a49a554a9afa76bb125c114c1
MD5 4b8ace2605d5f4855e203555511a5f5b
BLAKE2b-256 39758dea2fc156ae525971fdada8723f78e605dcf89428f5686728438b12f9ef

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.1.15-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl
Algorithm Hash digest
SHA256 fd4025ac5e87d9b80e1f300207eb2fd099ff8200fa2320d7dc066a3f4622dc6b
MD5 24a732c853aabc720b21cb4e57aa8310
BLAKE2b-256 0c57dbc885f94450335fcff82301c4b25cf614894e79d9afbd249714e709ab42

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.1.15-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl
Algorithm Hash digest
SHA256 86811954eec63e9ea162af0ffa9f8d09088bab51b7438e8b6488b9401863c25e
MD5 0c4791015a86e4658018ae8126719509
BLAKE2b-256 7248c9dfc2c87dc6b92446d8092c2be25b42ca4fb201cecb2499996ccf483c34

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.1.15-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl
Algorithm Hash digest
SHA256 6f8ad828f01e8dd32cc58bc28375150171d198491fc901f6f98d2a39ba8e3ff5
MD5 a15465fc74885264a5b53269d3d1179e
BLAKE2b-256 5509c09d0f9b41d1f5e3de117579f2fcdb7063fd76cd92d6614eae1b77ccbccb

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.1.15-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 c66ec24fe36841636e814b8f90f572a8c0cb0e54d8b5c2d0e300d28a0d7bffec
MD5 264f744df65fec805876011c43975457
BLAKE2b-256 98fa2a627747a5a5f7e1d3447704f795fd35d486460838485762cd569ef8eb0e

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.1.15-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl
Algorithm Hash digest
SHA256 9405fa9ac0e97f35aaddf185a1be194a589424b8713e3b97b762336ec79ff807
MD5 79b50e242578817452f963bec7e92a09
BLAKE2b-256 bbe08a6f9db2c5b8c7108c7e7347cd6beca805d1b2ae618569c72f2515d11e52

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.1.15-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 e0d432aec35bfc0d800d4f70eba26e23a352386be3a6cf157083d18f6f5881c8
MD5 4d3147bb65c0d7121f5104e4d707b5fb
BLAKE2b-256 18d72199ecb42cef4d70de0e72ce4ca8878d060e25fe4434cb66f51e26158a2a

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.1.15-py3-none-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 6f0bfbb53c4b4de117ac4d6ddfd33aa5fc31beeaa21d23c45c6dd249faf9126f
MD5 4e02388d1ed3d264362cf0f89c80767c
BLAKE2b-256 5bc12116927385c761ffb786dfb77654a634ecd7803dee4de3b47b59536374f1

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.1.15-py3-none-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl
Algorithm Hash digest
SHA256 5fe8d54df166ecc24106db7dd6a68d44852d14eb0729ea4672bb4d96c320b7df
MD5 7240b340634f109d6a874a935a36b4e0
BLAKE2b-256 112cfac0658910ea3ea87a23583e58277533154261b73f9460388eb2e6e02e8f

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