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.12
  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.12.tar.gz (1.9 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.12-py3-none-win_arm64.whl (7.0 MB view details)

Uploaded Python 3Windows ARM64

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

Uploaded Python 3Windows x86-64

ruff-0.1.12-py3-none-win32.whl (6.6 MB view details)

Uploaded Python 3Windows x86

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

Uploaded Python 3musllinux: musl 1.2+ x86-64

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

Uploaded Python 3musllinux: musl 1.2+ i686

ruff-0.1.12-py3-none-musllinux_1_2_armv7l.whl (6.5 MB view details)

Uploaded Python 3musllinux: musl 1.2+ ARMv7l

ruff-0.1.12-py3-none-musllinux_1_2_aarch64.whl (7.0 MB view details)

Uploaded Python 3musllinux: musl 1.2+ ARM64

ruff-0.1.12-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.12-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl (8.5 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ s390x

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

Uploaded Python 3manylinux: glibc 2.17+ ppc64le

ruff-0.1.12-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl (8.1 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ ppc64

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

Uploaded Python 3manylinux: glibc 2.17+ i686

ruff-0.1.12-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl (6.5 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ ARMv7l

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

Uploaded Python 3manylinux: glibc 2.17+ ARM64

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

Uploaded Python 3macOS 10.12+ x86-64

ruff-0.1.12-py3-none-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl (14.2 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.12.tar.gz.

File metadata

  • Download URL: ruff-0.1.12.tar.gz
  • Upload date:
  • Size: 1.9 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.12.tar.gz
Algorithm Hash digest
SHA256 97189f38c655e573f6bea0d12e9f18aad5539fd08ab50651449450999f45383a
MD5 19ab1cdf9003db04cde67c923982c043
BLAKE2b-256 01a47197a36e008c382f779affdd73f9d08f25d874c0fa2dc2235230fa8a6b71

See more details on using hashes here.

File details

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

File metadata

  • Download URL: ruff-0.1.12-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.12-py3-none-win_arm64.whl
Algorithm Hash digest
SHA256 bb29f8e3e6c95024902eaec5a9ce1fd5ac4e77f4594f4554e67fbb0f6d9a2f37
MD5 0869e2ce5517e79c9d7624667c1811ec
BLAKE2b-256 e76effa9601da27d0d0ae83ef254f732d8a8aa039012c5f71d9b9ce41f9879f6

See more details on using hashes here.

File details

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

File metadata

  • Download URL: ruff-0.1.12-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.12-py3-none-win_amd64.whl
Algorithm Hash digest
SHA256 7fe06ba77e5b7b78db1d058478c47176810f69bb5be7c1b0d06876af59198203
MD5 6be38d5f43ae478f7c8fff0d0137ca42
BLAKE2b-256 ac7bc3736824f33e3364842910938b3f1fae600b54daa72a6547e41bd54787c4

See more details on using hashes here.

File details

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

File metadata

  • Download URL: ruff-0.1.12-py3-none-win32.whl
  • Upload date:
  • Size: 6.6 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.12-py3-none-win32.whl
Algorithm Hash digest
SHA256 fbb1c002eeacb60161e51d77b2274c968656599477a1c8c65066953276e8ee2b
MD5 214e2a0686cc4ba8ccd3d84051d53640
BLAKE2b-256 62e6abfc510eeeed027bf32f10a47a3756b54d00bc0af22830ce05f7b34ab480

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.1.12-py3-none-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 1c49e826de55d81a6ef93808b760925e492bad7cc470aaa114a3be158b2c7f99
MD5 420f66e323063cffb8c76c214f6ddc8c
BLAKE2b-256 cdd72911d186a1fc9fb78067d2bd6ce1ebc20763b995b470f1210751f2f241ad

See more details on using hashes here.

File details

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

File metadata

  • Download URL: ruff-0.1.12-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.12-py3-none-musllinux_1_2_i686.whl
Algorithm Hash digest
SHA256 718523c3a0b787590511f212d30cc9b194228ef369c8bdd72acd1282cc27c468
MD5 0e44e9fdfe11a50cb9ab7aaafd982fd9
BLAKE2b-256 e92dbe5d25a2643283df5da01f447c8b96f01e6e790b6be37882700b8d49b717

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.1.12-py3-none-musllinux_1_2_armv7l.whl
Algorithm Hash digest
SHA256 f193f460e231e63af5fc7516897cf5ab257cbda72ae83cf9a654f1c80c3b758a
MD5 b4ec42ab371054869b58ff7c25c0c589
BLAKE2b-256 b779609b4551a58ab759bae4eb09267165b33345650fae45bf1293f4d4f1d560

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.1.12-py3-none-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 b631c6a95e4b6d5c4299e599067b5a89f5b18e2f2d9a6c22b879b3c4b077c96e
MD5 0a2865fa7a0aa28e30a08cfaf94fe7f9
BLAKE2b-256 a02566f1df80f3fc2f10504301548285f6663351f5bbdab59334741924010d58

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.1.12-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 4bdf26e5a2efab4c3aaf6b61648ea47a525dc12775810a85c285dc9ca03e5ac0
MD5 2b9b82f16bc2a0f52a6708b72fb08273
BLAKE2b-256 a9c9623e4daa71ef7ee693c7eb2dfa947438cfc787cfa68cf0306ed9b1e3f14d

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.1.12-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl
Algorithm Hash digest
SHA256 cf6073749c70b616d7929897b14824ec6713a6c3a8195dfd2ffdcc66594d880c
MD5 df43dd64fd8de463e573046f117f47e2
BLAKE2b-256 d568d9cb5511f7d30ed4dfa27e96083cb4fd447fefdddc2ad0ad65dd1aeeca47

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.1.12-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl
Algorithm Hash digest
SHA256 46685ef2f106b827705df876d38617741ed4f858bbdbc0817f94476c45ab6669
MD5 5e162e9e289b79cf68b533f0071c80d9
BLAKE2b-256 10ec95638555f2a91a2eb6d8548b489ecb83a55f7386a560b32116bfc45837bb

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.1.12-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl
Algorithm Hash digest
SHA256 472a0548738d4711549c7874b43fab61aacafb1fede29c5232d4cfb8e2d13f69
MD5 a89cea2727147f639fc9c675917263ab
BLAKE2b-256 2f58e3169320c9c50fc766c077e7823fa54a12fa9149db2cd061441431367e5e

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.1.12-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 d41e9f100b50526d80b076fc9c103c729387ff3f10f63606ed1038c30a372a40
MD5 985cc5c2122fd676bb53841b7ba7e2a3
BLAKE2b-256 3f6454cc58ee806eccb1f31efc556a174fd10cf50caec9e685761528618e7ba9

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.1.12-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl
Algorithm Hash digest
SHA256 25be18abc1fc3f3d3fb55855c41ed5d52063316defde202f413493bb3888218c
MD5 108966730bb4f9c0eac7842d46fd6898
BLAKE2b-256 4614e8314e0cff410b8d1026599f7f917af3f55e8d7727d32ff6f66967e800c3

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.1.12-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 47f6d939461e3273f10f4cd059fd0b83c249d73f1736032fffbac83a62939395
MD5 e3c2a009b1461e28b4399317ad0e621b
BLAKE2b-256 dcf8e0c1ab6cf5229df73bd6bf2aef9cfc430dc9d233143d30c364a2bf73e81c

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.1.12-py3-none-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 8a0e3ef6299c4eab75a7740730e4b4bd4a36e0bd8102ded01553403cad088fd4
MD5 1a319135916b92d58e0ba8573440937b
BLAKE2b-256 c94caf3a64442d28b1288b5a2bce3fd8f0d5e96ed3e3d88e89975090ff97b021

See more details on using hashes here.

File details

Details for the file ruff-0.1.12-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.12-py3-none-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl
Algorithm Hash digest
SHA256 544038693543c11edc56bb94a9875df2dc249e3616f90c15964c720dcccf0745
MD5 1f26b0d1cbd5f9f5ab9677fed9aff1e3
BLAKE2b-256 bf71f7889c865a67c6e717ba225004e3ec6193e519f34792e41215f6d4727c3d

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