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 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:

# Run the Ruff linter.
- repo: https://github.com/astral-sh/ruff-pre-commit
  # Ruff version.
  rev: v0.1.3
  hooks:
    # Run the Ruff linter.
    - id: ruff
    # Run the Ruff 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",
    ".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
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.3.tar.gz (1.7 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.3-py3-none-win_arm64.whl (5.9 MB view details)

Uploaded Python 3Windows ARM64

ruff-0.1.3-py3-none-win_amd64.whl (6.1 MB view details)

Uploaded Python 3Windows x86-64

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

Uploaded Python 3Windows x86

ruff-0.1.3-py3-none-musllinux_1_2_x86_64.whl (6.3 MB view details)

Uploaded Python 3musllinux: musl 1.2+ x86-64

ruff-0.1.3-py3-none-musllinux_1_2_i686.whl (5.9 MB view details)

Uploaded Python 3musllinux: musl 1.2+ i686

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

Uploaded Python 3musllinux: musl 1.2+ ARMv7l

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

Uploaded Python 3musllinux: musl 1.2+ ARM64

ruff-0.1.3-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.1.3-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl (7.5 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ s390x

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

Uploaded Python 3manylinux: glibc 2.17+ ppc64le

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

Uploaded Python 3manylinux: glibc 2.17+ ppc64

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

Uploaded Python 3manylinux: glibc 2.17+ i686

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

Uploaded Python 3manylinux: glibc 2.17+ ARMv7l

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

Uploaded Python 3manylinux: glibc 2.17+ ARM64

ruff-0.1.3-py3-none-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl (11.5 MB view details)

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

ruff-0.1.3-py3-none-macosx_10_7_x86_64.whl (6.0 MB view details)

Uploaded Python 3macOS 10.7+ x86-64

File details

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

File metadata

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

File hashes

Hashes for ruff-0.1.3.tar.gz
Algorithm Hash digest
SHA256 3ba6145369a151401d5db79f0a47d50e470384d0d89d0d6f7fab0b589ad07c34
MD5 ea790c4a71048b81ceb278008fb52625
BLAKE2b-256 78e5cb9cef0dafdcfd51941d145df0a8ce9ea930e1f85da7f25bb6886d4681b2

See more details on using hashes here.

File details

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

File metadata

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

File hashes

Hashes for ruff-0.1.3-py3-none-win_arm64.whl
Algorithm Hash digest
SHA256 12fd53696c83a194a2db7f9a46337ce06445fb9aa7d25ea6f293cf75b21aca9f
MD5 6dd653f01c007719b42471bd0f547aa6
BLAKE2b-256 9df7e8c6a715abab1d8b8f8fc3b65e51a33eb8cdf39c42358de0ad6125299be1

See more details on using hashes here.

File details

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

File metadata

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

File hashes

Hashes for ruff-0.1.3-py3-none-win_amd64.whl
Algorithm Hash digest
SHA256 7a18df6638cec4a5bd75350639b2bb2a2366e01222825562c7346674bdceb7ea
MD5 aab19f7a26c2a7604233177be1f6cceb
BLAKE2b-256 32ec860ac4dc8ee5c3c59222ac1f0bf1ed4c00e5311b4ef0471e7db8863d3b40

See more details on using hashes here.

File details

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

File metadata

  • Download URL: ruff-0.1.3-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.6

File hashes

Hashes for ruff-0.1.3-py3-none-win32.whl
Algorithm Hash digest
SHA256 3e7afcbdcfbe3399c34e0f6370c30f6e529193c731b885316c5a09c9e4317eef
MD5 193fa8a9c875e4e35dcba6f5aae9962f
BLAKE2b-256 dd422a0d4abb0a7050d0267336d6ff2eb8f3b08ea90908e40712892abc10a399

See more details on using hashes here.

File details

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

File metadata

  • Download URL: ruff-0.1.3-py3-none-musllinux_1_2_x86_64.whl
  • Upload date:
  • Size: 6.3 MB
  • Tags: Python 3, musllinux: musl 1.2+ x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/4.0.2 CPython/3.11.6

File hashes

Hashes for ruff-0.1.3-py3-none-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 0b6c55f5ef8d9dd05b230bb6ab80bc4381ecb60ae56db0330f660ea240cb0d4a
MD5 23bff0425a000005da650b3e54206625
BLAKE2b-256 ee4d7dd94caca7b5e7ac1cdc395f65c9220f5fc6e5825b7d205ed711296e9475

See more details on using hashes here.

File details

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

File metadata

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

File hashes

Hashes for ruff-0.1.3-py3-none-musllinux_1_2_i686.whl
Algorithm Hash digest
SHA256 d8859605e729cd5e53aa38275568dbbdb4fe882d2ea2714c5453b678dca83784
MD5 524131e7deaa72886f269f5c4692099a
BLAKE2b-256 9ed541dc69d92550309d7f00662444bf62aeea27b0399c1a3be6ffa12a8a96b9

See more details on using hashes here.

File details

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

File metadata

  • Download URL: ruff-0.1.3-py3-none-musllinux_1_2_armv7l.whl
  • Upload date:
  • Size: 5.5 MB
  • Tags: Python 3, musllinux: musl 1.2+ ARMv7l
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/4.0.2 CPython/3.11.6

File hashes

Hashes for ruff-0.1.3-py3-none-musllinux_1_2_armv7l.whl
Algorithm Hash digest
SHA256 918b454bc4f8874a616f0d725590277c42949431ceb303950e87fef7a7d94cb3
MD5 80825d9a994cdedc1bf62ab752c09eea
BLAKE2b-256 cbc14e35bdfce766d6270611263950c31c43011109dd4a1f6b920eff0a8f4a12

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.1.3-py3-none-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 76dd49f6cd945d82d9d4a9a6622c54a994689d8d7b22fa1322983389b4892e20
MD5 f355f7d86fb02f03a08d9b757a0e59d9
BLAKE2b-256 dcd6efe8693e2ba03d4872eb510cf3f0a82e9be1b75ff7cbcd7033287a511c30

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.1.3-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 0f75e670d529aa2288cd00fc0e9b9287603d95e1536d7a7e0cafe00f75e0dd9d
MD5 304f1fc708b92d54f01aa48183e0b91d
BLAKE2b-256 acc78bbeb18581fa94beb01646a8434e58ea48e9cec45d7768e258e16d43f247

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.1.3-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl
Algorithm Hash digest
SHA256 1c595193881922cc0556a90f3af99b1c5681f0c552e7a2a189956141d8666fe8
MD5 64451580a517ce3c8e46275aec9d2674
BLAKE2b-256 4eb74f6317a42d2a2e68a5dafa9366849ca7eb11e7292e8f9ad2142d9c086fcb

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.1.3-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl
Algorithm Hash digest
SHA256 2e3de9ed2e39160800281848ff4670e1698037ca039bda7b9274f849258d26ce
MD5 7cb40bde7237c7e4ae21d27d8b698567
BLAKE2b-256 4a70861d979161e956ef679ad4b21026fae678170a1d3b71697aafd617ac6aea

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.1.3-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl
Algorithm Hash digest
SHA256 dc3ec4edb3b73f21b4aa51337e16674c752f1d76a4a543af56d7d04e97769613
MD5 a2f26ea246b4700bd625b8e67506f6ef
BLAKE2b-256 ba59cc7fbefcf7e0cccae177f18486af74be8a79b8d4b73679b8f2dca7dc86db

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.1.3-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 eec2dd31eed114e48ea42dbffc443e9b7221976554a504767ceaee3dd38edeb8
MD5 bb5ce33f2c86b99ccedb9a8ac03b5337
BLAKE2b-256 1de767d70e1ca3faaaa644aeb411bf8ebdc56e1e9ec8755c201eb524ace9d258

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.1.3-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl
Algorithm Hash digest
SHA256 4874c165f96c14a00590dcc727a04dca0cfd110334c24b039458c06cf78a672e
MD5 9bddaed258807b2f191f94203f9c804f
BLAKE2b-256 7852870699377b0ba4f6328c0d9c5360c34f47fdecb236890219d6bdb95c9ef1

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.1.3-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 ca3cf365bf32e9ba7e6db3f48a4d3e2c446cd19ebee04f05338bc3910114528b
MD5 095c33da25290e2428a77bff77b6d892
BLAKE2b-256 464865fdda6019ee65b671a8ea20e418bc482472d49631a48143158838370094

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.1.3-py3-none-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl
Algorithm Hash digest
SHA256 b8afeb9abd26b4029c72adc9921b8363374f4e7edb78385ffaa80278313a15f9
MD5 a5daecd66a70269e0a3e7500f4c69d07
BLAKE2b-256 f4c7b7127a11b84e4b813056dffe0281d7a808087dcdbe55bd03dddd9269ed92

See more details on using hashes here.

File details

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

File metadata

  • Download URL: ruff-0.1.3-py3-none-macosx_10_7_x86_64.whl
  • Upload date:
  • Size: 6.0 MB
  • Tags: Python 3, macOS 10.7+ x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/4.0.2 CPython/3.11.6

File hashes

Hashes for ruff-0.1.3-py3-none-macosx_10_7_x86_64.whl
Algorithm Hash digest
SHA256 b46d43d51f7061652eeadb426a9e3caa1e0002470229ab2fc19de8a7b0766901
MD5 3e90bdb69a1216d32c6df1f9279bd08e
BLAKE2b-256 2c0280015e8c9071ba62a3baba5349a6491facf2ed06a95e8abdc8bd066c4c21

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