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 500 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.282
  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.10.
target-version = "py310"

[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 500 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.282.tar.gz (1.4 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.282-py3-none-win_arm64.whl (5.3 MB view details)

Uploaded Python 3Windows ARM64

ruff-0.0.282-py3-none-win_amd64.whl (5.5 MB view details)

Uploaded Python 3Windows x86-64

ruff-0.0.282-py3-none-win32.whl (5.2 MB view details)

Uploaded Python 3Windows x86

ruff-0.0.282-py3-none-musllinux_1_2_x86_64.whl (5.7 MB view details)

Uploaded Python 3musllinux: musl 1.2+ x86-64

ruff-0.0.282-py3-none-musllinux_1_2_i686.whl (5.3 MB view details)

Uploaded Python 3musllinux: musl 1.2+ i686

ruff-0.0.282-py3-none-musllinux_1_2_armv7l.whl (5.0 MB view details)

Uploaded Python 3musllinux: musl 1.2+ ARMv7l

ruff-0.0.282-py3-none-musllinux_1_2_aarch64.whl (5.2 MB view details)

Uploaded Python 3musllinux: musl 1.2+ ARM64

ruff-0.0.282-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (5.6 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ x86-64

ruff-0.0.282-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl (6.7 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ s390x

ruff-0.0.282-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl (5.9 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ ppc64le

ruff-0.0.282-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl (6.0 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ ppc64

ruff-0.0.282-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl (5.4 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ i686

ruff-0.0.282-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl (5.0 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ ARMv7l

ruff-0.0.282-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (5.3 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ ARM64

ruff-0.0.282-py3-none-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl (10.4 MB view details)

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

ruff-0.0.282-py3-none-macosx_10_7_x86_64.whl (5.4 MB view details)

Uploaded Python 3macOS 10.7+ x86-64

File details

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

File metadata

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

File hashes

Hashes for ruff-0.0.282.tar.gz
Algorithm Hash digest
SHA256 ef677c26bae756e4c98af6d8972da83caea550bc92ffef97a6e939ca5b24ad06
MD5 31d8acf4b4816cce9a65383395582a00
BLAKE2b-256 61d63518c4fe7adf814e72588927cfe1019ecd609d715bde54578c4aa9154ade

See more details on using hashes here.

File details

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

File metadata

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

File hashes

Hashes for ruff-0.0.282-py3-none-win_arm64.whl
Algorithm Hash digest
SHA256 f03fba9621533d67d7ab995847467d78b9337e3697779ef2cea6f1deaee5fbef
MD5 1aa6ab38ae45b2d507ce7d660f82747e
BLAKE2b-256 54c6b5365616c1565297887e59f1a4dc48598e256cb1b2f78abf499e1cac998d

See more details on using hashes here.

File details

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

File metadata

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

File hashes

Hashes for ruff-0.0.282-py3-none-win_amd64.whl
Algorithm Hash digest
SHA256 bd25085c42ebaffe336ed7bda8a0ae7b6c454a5f386ec8b2299503f79bd12bdf
MD5 644b7a8b53e92048534d4a75ef209f0a
BLAKE2b-256 91c45cd1b703f12a5182a33991ea3118b8cd714e0494211aa5ab1ec4f3cff8cc

See more details on using hashes here.

File details

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

File metadata

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

File hashes

Hashes for ruff-0.0.282-py3-none-win32.whl
Algorithm Hash digest
SHA256 f51bbb64f8f29e444c16d21b269ba82e25f8d536beda3df7c9fe1816297e508e
MD5 6109695c7ccdaf74dd1735bc25cccb40
BLAKE2b-256 ec8db73616c8d5619a62495a988e50e8a808e29bc33bc9626c84864c007cca50

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.0.282-py3-none-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 aab9ed5bfba6b0a2242a7ec9a72858c802ceeaf0076fe72b2ad455639275f22c
MD5 1cd8c6d35e193f57ebe69b9b3881e140
BLAKE2b-256 c61327b682c2b11c20938bb80d1ff4bb8fa2d445ac610026b85631ff7d760860

See more details on using hashes here.

File details

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

File metadata

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

File hashes

Hashes for ruff-0.0.282-py3-none-musllinux_1_2_i686.whl
Algorithm Hash digest
SHA256 2ca52536e1c7603fe4cbb5ad9dc141df47c3200df782f5ec559364716ea27f96
MD5 e4cc7eb96f9a72932f5aff44b30a1312
BLAKE2b-256 eef2d718aaa6988bec0ef932d891ef72b2d6b7cd2656f3fb972f70f6b8fcb81e

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.0.282-py3-none-musllinux_1_2_armv7l.whl
Algorithm Hash digest
SHA256 0710ea2cadc504b96c1d94c414a7802369d0fff2ab7c94460344bba69135cb40
MD5 518dd701969ec064f3e30f353acac23b
BLAKE2b-256 d772d9ce10ad9a66e1fd68f3c2f1b03ab750a389a905143e7310c687e1288b00

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.0.282-py3-none-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 1f05f5e6d6df6f8b1974c08f963c33f0a4d8cfa15cba12d35ca3ece8e9be5b1f
MD5 cc12ad8e19fdfcbcf82895c851c925ea
BLAKE2b-256 113a1d839849db43ac9e83480b131f7c922c7efdb71ad3f5fbbf297f3f8feb7a

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.0.282-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 47a7a9366ab8e4ee20df9339bef172eec7b2e9e123643bf3ede005058f5b114e
MD5 85e31f7723b8e2a824d665a594e6961b
BLAKE2b-256 f58dc26fd0eb199f21eeb49138371b28f70ace1185a1a0709b117ceb97f069f9

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.0.282-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl
Algorithm Hash digest
SHA256 3f30c9958ab9cb02bf0c574c629e87c19454cbbdb82750e49e3d1559a5a8f216
MD5 a98a6eb58341aadf65182240eda597ef
BLAKE2b-256 6cb013bad6945f78160d932cbaab57355808f4cc282efcaaac594d65218bd6fd

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.0.282-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl
Algorithm Hash digest
SHA256 d99758f8bbcb8f8da99acabf711ffad5e7a015247adf27211100b3586777fd56
MD5 acfc314f7c784ea5e0a4e0091773d03d
BLAKE2b-256 f11cd6f02b8d345ae879d2ffeb321870068da861aeb19268eecc0b957039a4d1

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.0.282-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl
Algorithm Hash digest
SHA256 826e4de98e91450a6fe699a4e4a7cf33b9a90a2c5c270dc5b202241c37359ff8
MD5 4363da804eeb729192e0daefb56aec7c
BLAKE2b-256 968591f305ea195e4f32d2611aa40180538a3542285ec5b437bbf552d27f02b4

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.0.282-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 eee9c8c50bc77eb9c0811c91d9d67ff39fe4f394c2f44ada37dac6d45e50c9f1
MD5 19dd433476bb86591759818b9826402e
BLAKE2b-256 c8aa60319d15ebb0d00a34946109affc2ae9cb6da9df831e1043ea7868d6245e

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.0.282-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl
Algorithm Hash digest
SHA256 d1ccbceb44e94fe2205b63996166e98a513a19ed23ec01d7193b7494b94ba30d
MD5 298c5b4da7c753a6f7ff26005d7a8b9a
BLAKE2b-256 ef1a33715cb2e3d69ad7f65bf6cff8e92f30005aff486670a17d1edeae2b03b0

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.0.282-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 5374b40b6d860d334d28678a53a92f0bf04b53acdf0395900361ad54ce71cd1d
MD5 5f8a30a2e2055c08ff6809faa8d973a2
BLAKE2b-256 031c45c15a8fb27a3ca595f83f948f204b8fa32020f1d2a15daa64c6540a940a

See more details on using hashes here.

File details

Details for the file ruff-0.0.282-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.282-py3-none-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl
Algorithm Hash digest
SHA256 e177cbb6dc0b1dbef5e999900d798b73e33602abf9b6c62d5d2cbe101026d931
MD5 33c6dab07f79868da6734dd8a96e8759
BLAKE2b-256 aabeae21e67bcbcc0ec9e64d3a4e6a90583abe6c19c6339962c1f5c7f9a1654b

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.0.282-py3-none-macosx_10_7_x86_64.whl
Algorithm Hash digest
SHA256 01b76309ddab16eb258dabc5e86e73e6542f59f3ea6b4ab886ecbcfc80ce062c
MD5 004942d99389422951f13764ed79933a
BLAKE2b-256 2f5773739cd3a5b27a8d0433247ced04f754927bee15872239a84067189da518

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