Skip to main content

An extremely fast Python linter, written in Rust.

Project description

Ruff

Ruff image image image Actions status

Discord | Docs | Playground

An extremely fast Python linter, written in Rust.

Shows a bar chart with benchmark results.

Linting the CPython codebase from scratch.

  • ⚡️ 10-100x faster than existing linters
  • 🐍 Installable via pip
  • 🛠️ pyproject.toml support
  • 🤝 Python 3.11 compatibility
  • 📦 Built-in caching, to avoid re-analyzing unchanged files
  • 🔧 Autofix support, for automatic error correction (e.g., automatically remove unused imports)
  • 📏 Over 600 built-in rules
  • ⚖️ Near-parity with the built-in Flake8 rule set
  • 🔌 Native re-implementations of dozens of 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), isort, pydocstyle, yesqa, eradicate, pyupgrade, and autoflake, 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, 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 can also be used as a pre-commit hook:

- repo: https://github.com/astral-sh/ruff-pre-commit
  # Ruff version.
  rev: v0.0.289
  hooks:
    - id: ruff

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, the default configuration is equivalent to:

[tool.ruff]
# Enable pycodestyle (`E`) and Pyflakes (`F`) codes by default.
select = ["E", "F"]
ignore = []

# Allow autofix for all enabled rules (when `--fix`) is provided.
fixable = ["A", "B", "C", "D", "E", "F", "G", "I", "N", "Q", "S", "T", "W", "ANN", "ARG", "BLE", "COM", "DJ", "DTZ", "EM", "ERA", "EXE", "FBT", "ICN", "INP", "ISC", "NPY", "PD", "PGH", "PIE", "PL", "PT", "PTH", "PYI", "RET", "RSE", "RUF", "SIM", "SLF", "TCH", "TID", "TRY", "UP", "YTT"]
unfixable = []

# Exclude a variety of commonly ignored directories.
exclude = [
    ".bzr",
    ".direnv",
    ".eggs",
    ".git",
    ".git-rewrite",
    ".hg",
    ".mypy_cache",
    ".nox",
    ".pants.d",
    ".pytype",
    ".ruff_cache",
    ".svn",
    ".tox",
    ".venv",
    "__pypackages__",
    "_build",
    "buck-out",
    "build",
    "dist",
    "node_modules",
    "venv",
]

# Same as Black.
line-length = 88

# Allow unused variables when underscore-prefixed.
dummy-variable-rgx = "^(_+|(_+[a-zA-Z0-9_]*[a-zA-Z0-9]+?))$"

# Assume Python 3.8
target-version = "py38"

[tool.ruff.mccabe]
# Unlike Flake8, default to a complexity level of 10.
max-complexity = 10

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

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 for more on the linting command.

Rules

Ruff supports over 600 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 E and F rules. Ruff supports all rules from the F category, and a subset of the E category, omitting those stylistic rules made obsolete by the use of an autoformatter, like 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 autoformatter 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.0.289.tar.gz (1.6 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.0.289-py3-none-win_arm64.whl (5.8 MB view details)

Uploaded Python 3Windows ARM64

ruff-0.0.289-py3-none-win_amd64.whl (6.0 MB view details)

Uploaded Python 3Windows x86-64

ruff-0.0.289-py3-none-win32.whl (5.7 MB view details)

Uploaded Python 3Windows x86

ruff-0.0.289-py3-none-musllinux_1_2_x86_64.whl (6.2 MB view details)

Uploaded Python 3musllinux: musl 1.2+ x86-64

ruff-0.0.289-py3-none-musllinux_1_2_i686.whl (5.8 MB view details)

Uploaded Python 3musllinux: musl 1.2+ i686

ruff-0.0.289-py3-none-musllinux_1_2_armv7l.whl (5.5 MB view details)

Uploaded Python 3musllinux: musl 1.2+ ARMv7l

ruff-0.0.289-py3-none-musllinux_1_2_aarch64.whl (5.8 MB view details)

Uploaded Python 3musllinux: musl 1.2+ ARM64

ruff-0.0.289-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (6.2 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ x86-64

ruff-0.0.289-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl (7.6 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ s390x

ruff-0.0.289-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl (6.5 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ ppc64le

ruff-0.0.289-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl (6.6 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ ppc64

ruff-0.0.289-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl (6.0 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ i686

ruff-0.0.289-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl (5.5 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ ARMv7l

ruff-0.0.289-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (5.8 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ ARM64

ruff-0.0.289-py3-none-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl (11.4 MB view details)

Uploaded Python 3macOS 10.9+ universal2 (ARM64, x86-64)macOS 10.9+ x86-64macOS 11.0+ ARM64

ruff-0.0.289-py3-none-macosx_10_7_x86_64.whl (5.9 MB view details)

Uploaded Python 3macOS 10.7+ x86-64

File details

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

File metadata

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

File hashes

Hashes for ruff-0.0.289.tar.gz
Algorithm Hash digest
SHA256 2513f853b0fc42f0339b7ab0d2751b63ce7a50a0032d2689b54b2931b3b866d7
MD5 34f33820fa948689c9d2f388685540c8
BLAKE2b-256 aae49b29a399dc98998d59cd99690bd35433a00c9422968b633651367fa65993

See more details on using hashes here.

File details

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

File metadata

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

File hashes

Hashes for ruff-0.0.289-py3-none-win_arm64.whl
Algorithm Hash digest
SHA256 04a720bcca5e987426bb14ad8b9c6f55e259ea774da1cbeafe71569744cfd20a
MD5 df69a796df83c8b8711d6276a4692ebe
BLAKE2b-256 3b5bc334788baa2c731e3319711a219e1493599de4c83d01967d4ede2c8bb6a9

See more details on using hashes here.

File details

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

File metadata

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

File hashes

Hashes for ruff-0.0.289-py3-none-win_amd64.whl
Algorithm Hash digest
SHA256 6d043c5456b792be2615a52f16056c3cf6c40506ce1f2d6f9d3083cfcb9eeab6
MD5 b63d05c0ece99fadbe37cd992979fe69
BLAKE2b-256 c6560287e5605e84836bd7ea34a8ed25346a4d8dcb84fb4ee7d3fc87d46c9fdd

See more details on using hashes here.

File details

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

File metadata

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

File hashes

Hashes for ruff-0.0.289-py3-none-win32.whl
Algorithm Hash digest
SHA256 bbb3044f931c09cf17dbe5b339896eece0d6ac10c9a86e172540fcdb1974f2b7
MD5 84ffced1f9a9c867573370d6eb61826e
BLAKE2b-256 ed31548110dac6685d8c4098f9d07c732eaa6fb0664520581c6d7d6d8d43dfd7

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.0.289-py3-none-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 6e4e6eccb753efe760ba354fc8e9f783f6bba71aa9f592756f5bd0d78db898ed
MD5 c64b8295f318f87f12c811c2a13786ba
BLAKE2b-256 1ff7fb9e8bd8798fdec0f19fef20db3c5c39d714ef4aa0e31dac01afb84e0e72

See more details on using hashes here.

File details

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

File metadata

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

File hashes

Hashes for ruff-0.0.289-py3-none-musllinux_1_2_i686.whl
Algorithm Hash digest
SHA256 ebc7af550018001a7fb39ca22cdce20e1a0de4388ea4a007eb5c822f6188c297
MD5 5db5536de300f45c3156e1a15386449f
BLAKE2b-256 0a9ffee01463786e7c2994a3a06d0578d963668dfa3533d952fdad1a102e5629

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.0.289-py3-none-musllinux_1_2_armv7l.whl
Algorithm Hash digest
SHA256 7eebfab2e6a6991908ff1bf82f2dc1e5095fc7e316848e62124526837b445f4d
MD5 0acb30fe0ad3a76843351fad50d3e7c2
BLAKE2b-256 94dc79a73411991d50d0f81fa2a820180d0cdeb374e8707adab042f230d19e8c

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.0.289-py3-none-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 8057e8ab0016c13b9419bad119e854f881e687bd96bc5e2d52c8baac0f278a44
MD5 03b078824d6b28f70a7bf5ae349b5e1b
BLAKE2b-256 a81df7a276ed36ff4cb5c966ec079986b2ee252506cb5ed7ba1cee3a417b1857

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.0.289-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 4daa90865796aedcedf0d8897fdd4cd09bf0ddd3504529a4ccf211edcaff3c7d
MD5 cab8f3f077dafb539e9ad2c0631525cb
BLAKE2b-256 789b8a06073677e02714996e9dc60351b3b61371f8c7246e350248167e03d29f

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.0.289-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl
Algorithm Hash digest
SHA256 c5424318c254bcb091cb67e140ec9b9f7122074e100b06236f252923fb41e767
MD5 3fa5c77c045bc9dbf8f022a01cb1b520
BLAKE2b-256 abacccda5305dee34fe80f036ef5a3098ce8de6aa5214aca1b7f600212af752e

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.0.289-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl
Algorithm Hash digest
SHA256 6479b8c4be3c36046c6c92054762b276fa0fddb03f6b9a310fbbf4c4951267fd
MD5 0cb6121fe83db523809cde05ba80a394
BLAKE2b-256 bcae4864586beea01886bfea8980f9b3217c294d1d8f00a41c7a4ba9f169a143

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.0.289-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl
Algorithm Hash digest
SHA256 91b6d63b6b46d4707916472c91baa87aa0592e73f62a80ff55efdf6c0668cfd6
MD5 a99472ac7863b5fa310cba15a7ae84ee
BLAKE2b-256 e85a24e2c877d7270f8b689a7583baa1ba41907a69208dc8978b01a62f88e503

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.0.289-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 1c14abcd7563b5c80be2dd809eeab20e4aa716bf849860b60a22d87ddf19eb88
MD5 bce38d0974f32bde78ab966194189c19
BLAKE2b-256 2002474e67c90f73b6112d2f4dba2787e369ac157e50615b4e5358549f3d6714

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.0.289-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl
Algorithm Hash digest
SHA256 73f37c65508203dd01a539926375a10243769c20d4fcab3fa6359cd3fbfc54b7
MD5 8b3bd4f4508b52772cfcc2b21b8f9886
BLAKE2b-256 1734a65515cce52b5f2e0a3de4a11820ef56b5bf409325e3550a990c57747e6b

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.0.289-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 7180de86c8ecd39624dec1699136f941c07e723201b4ce979bec9e7c67b40ad2
MD5 71270cd48e0d1da5f6a64b02f1ee7b34
BLAKE2b-256 656f67224955c96ddebf8b93133f174dcf6e7a6fa9e6a37ebc89f781105ec01f

See more details on using hashes here.

File details

Details for the file ruff-0.0.289-py3-none-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl.

File metadata

File hashes

Hashes for ruff-0.0.289-py3-none-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl
Algorithm Hash digest
SHA256 7f7396c6ea01ba332a6ad9d47642bac25d16bd2076aaa595b001f58b2f32ff05
MD5 f0dea7b22dd03c385439bcece552416a
BLAKE2b-256 a88573e22fb065d5738e3558c92d3d7d692b5b297ba27412785246545a02e12d

See more details on using hashes here.

File details

Details for the file ruff-0.0.289-py3-none-macosx_10_7_x86_64.whl.

File metadata

File hashes

Hashes for ruff-0.0.289-py3-none-macosx_10_7_x86_64.whl
Algorithm Hash digest
SHA256 c9a89d748e90c840bac9c37afe90cf13a5bfd460ca02ea93dad9d7bee3af03b4
MD5 04e98954d12d6fb1b4dff75bce80be51
BLAKE2b-256 1941e7248ae687329d08fb05524241ad223fbd72eeb9ae928aedec869bab93bf

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