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.12 compatibility
  • 📦 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
  • ⚖️ 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.292
  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 fix 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 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 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.292.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.292-py3-none-win_arm64.whl (6.1 MB view details)

Uploaded Python 3Windows ARM64

ruff-0.0.292-py3-none-win_amd64.whl (6.4 MB view details)

Uploaded Python 3Windows x86-64

ruff-0.0.292-py3-none-win32.whl (6.0 MB view details)

Uploaded Python 3Windows x86

ruff-0.0.292-py3-none-musllinux_1_2_x86_64.whl (6.5 MB view details)

Uploaded Python 3musllinux: musl 1.2+ x86-64

ruff-0.0.292-py3-none-musllinux_1_2_i686.whl (6.2 MB view details)

Uploaded Python 3musllinux: musl 1.2+ i686

ruff-0.0.292-py3-none-musllinux_1_2_armv7l.whl (5.8 MB view details)

Uploaded Python 3musllinux: musl 1.2+ ARMv7l

ruff-0.0.292-py3-none-musllinux_1_2_aarch64.whl (6.0 MB view details)

Uploaded Python 3musllinux: musl 1.2+ ARM64

ruff-0.0.292-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (6.5 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ x86-64

ruff-0.0.292-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl (7.9 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ s390x

ruff-0.0.292-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl (6.8 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ ppc64le

ruff-0.0.292-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl (6.9 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ ppc64

ruff-0.0.292-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl (6.3 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ i686

ruff-0.0.292-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl (5.8 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ ARMv7l

ruff-0.0.292-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (6.1 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ ARM64

ruff-0.0.292-py3-none-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl (12.0 MB view details)

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

ruff-0.0.292-py3-none-macosx_10_7_x86_64.whl (6.2 MB view details)

Uploaded Python 3macOS 10.7+ x86-64

File details

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

File metadata

  • Download URL: ruff-0.0.292.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.292.tar.gz
Algorithm Hash digest
SHA256 1093449e37dd1e9b813798f6ad70932b57cf614e5c2b5c51005bf67d55db33ac
MD5 045f5346969be61d4cc8ba7dfbaba18e
BLAKE2b-256 07899e6c32d4e7b95c0a75c33191d41d762350cadfe8ce9a12bd109031bc6457

See more details on using hashes here.

File details

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

File metadata

  • Download URL: ruff-0.0.292-py3-none-win_arm64.whl
  • Upload date:
  • Size: 6.1 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.292-py3-none-win_arm64.whl
Algorithm Hash digest
SHA256 7f67a69c8f12fbc8daf6ae6d36705037bde315abf8b82b6e1f4c9e74eb750f68
MD5 1ec523cb3c94bf1939924598e8e30cab
BLAKE2b-256 1386d4c5ec1c65bb34ecd71ea909484b3a1d529955bb772ce01128bc1da41134

See more details on using hashes here.

File details

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

File metadata

  • Download URL: ruff-0.0.292-py3-none-win_amd64.whl
  • Upload date:
  • Size: 6.4 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.292-py3-none-win_amd64.whl
Algorithm Hash digest
SHA256 f27282bedfd04d4c3492e5c3398360c9d86a295be00eccc63914438b4ac8a83c
MD5 be4108ac7e79fc6754d9a728817cb864
BLAKE2b-256 ea838e8d96d64c9eb5e5bf0ddbdd240f0ed78c912e76d353feef069049e8ac07

See more details on using hashes here.

File details

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

File metadata

  • Download URL: ruff-0.0.292-py3-none-win32.whl
  • Upload date:
  • Size: 6.0 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.292-py3-none-win32.whl
Algorithm Hash digest
SHA256 e854b05408f7a8033a027e4b1c7f9889563dd2aca545d13d06711e5c39c3d003
MD5 a1481d2f5d3169bf085af77d95f655ff
BLAKE2b-256 e2f0fe9a7cb3b5c767f76ccd005c18916a50aced0d7e4df7b2e64ff9463dfc74

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.0.292-py3-none-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 b76deb3bdbea2ef97db286cf953488745dd6424c122d275f05836c53f62d4016
MD5 ea4651484caae4894a2fda7f8282ee2c
BLAKE2b-256 97348b7d1277c50acbc7f71f8b6b0a89bc7c13c3c42c63c435c4db7427f8c891

See more details on using hashes here.

File details

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

File metadata

  • Download URL: ruff-0.0.292-py3-none-musllinux_1_2_i686.whl
  • Upload date:
  • Size: 6.2 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.292-py3-none-musllinux_1_2_i686.whl
Algorithm Hash digest
SHA256 87616771e72820800b8faea82edd858324b29bb99a920d6aa3d3949dd3f88fb0
MD5 bcb9a9047870726b9e7a43174499783e
BLAKE2b-256 83cea57539b63b49c8f6f04759af7ec004b50582630aaffae8a54a96c2af9438

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.0.292-py3-none-musllinux_1_2_armv7l.whl
Algorithm Hash digest
SHA256 ac153eee6dd4444501c4bb92bff866491d4bfb01ce26dd2fff7ca472c8df9ad0
MD5 795fb9de72ed76b635e24403925438eb
BLAKE2b-256 29b01f854d95bd8873128720695b1233c2821a22fb9c56dfb32f23b38f3530d1

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.0.292-py3-none-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 f160b5ec26be32362d0774964e218f3fcf0a7da299f7e220ef45ae9e3e67101a
MD5 aa9c473bafd2a25022cff71950f16aeb
BLAKE2b-256 5982f2bb834cf3baba9e34abaf35ed3172cf6b765b1fd5d377cf261d17882867

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.0.292-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 8e087b24d0d849c5c81516ec740bf4fd48bf363cfb104545464e0fca749b6af9
MD5 72e761ad77897e1b5cc44952494883c5
BLAKE2b-256 9188ffa8b84d023dd815ab53ece66522acdafdfc0702dd36a7a6766ab990ef1e

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.0.292-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl
Algorithm Hash digest
SHA256 aa7c77c53bfcd75dbcd4d1f42d6cabf2485d2e1ee0678da850f08e1ab13081a8
MD5 bc6b56846650931ba92789bc46c7911d
BLAKE2b-256 1b4bfe248afb24d2a8b410db62d9d42464a0ea404f007834bfa8529a8ba2fa0c

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.0.292-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl
Algorithm Hash digest
SHA256 6bdfabd4334684a4418b99b3118793f2c13bb67bf1540a769d7816410402a205
MD5 e2b51995b349be9698f9a12e6bf8c879
BLAKE2b-256 5457140a0653199bc747522e439765157ae627bd33f6bb6d8c6c7215234b64db

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.0.292-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl
Algorithm Hash digest
SHA256 9889bac18a0c07018aac75ef6c1e6511d8411724d67cb879103b01758e110a81
MD5 e0e278ee7d0260c9c934d82a161bb85b
BLAKE2b-256 08deb6b95f3888d65167ba36434009e872ae601c015a8a05c33876180cb79299

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.0.292-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 be8eb50eaf8648070b8e58ece8e69c9322d34afe367eec4210fdee9a555e4ca7
MD5 fd01d2d3985f66d02b41acb9fafde095
BLAKE2b-256 1fd4e890a0a4db0317cdedca249b3ed8d6c2ffc66924d21facea20b9d50d98f6

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.0.292-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl
Algorithm Hash digest
SHA256 f4476f1243af2d8c29da5f235c13dca52177117935e1f9393f9d90f9833f69e4
MD5 8fda58380000be06c864a7521ad74240
BLAKE2b-256 f86d7572013a436ad568ef126bd61e2b9c59f4194e3630313f475b5dd560ccf0

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.0.292-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 6c3c91859a9b845c33778f11902e7b26440d64b9d5110edd4e4fa1726c41e0a4
MD5 32513593b361e172d334abc2b7c742fe
BLAKE2b-256 580482916bef73bb94b20153a696782b0ee23e2cd27db54fd9fa05275083ff89

See more details on using hashes here.

File details

Details for the file ruff-0.0.292-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.292-py3-none-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl
Algorithm Hash digest
SHA256 69654e564342f507edfa09ee6897883ca76e331d4bbc3676d8a8403838e9fade
MD5 8979743120f069da534f431c9de6f545
BLAKE2b-256 33253cf24c466c609b95f2a790b9f7972deb995eca42edb576c6551fc568d600

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.0.292-py3-none-macosx_10_7_x86_64.whl
Algorithm Hash digest
SHA256 02f29db018c9d474270c704e6c6b13b18ed0ecac82761e4fcf0faa3728430c96
MD5 93c28d8ece04ad0c4e0d112d3efc4baf
BLAKE2b-256 2c23abd37eb774a65b3a6fc57cbd56fdde91d8017860b5307a6eea2afd5b5378

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