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.277
  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/charliermarsh/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/charliermarsh/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/charliermarsh/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.277.tar.gz (1.1 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.277-py3-none-win_arm64.whl (5.2 MB view details)

Uploaded Python 3Windows ARM64

ruff-0.0.277-py3-none-win_amd64.whl (5.4 MB view details)

Uploaded Python 3Windows x86-64

ruff-0.0.277-py3-none-win32.whl (5.1 MB view details)

Uploaded Python 3Windows x86

ruff-0.0.277-py3-none-musllinux_1_2_x86_64.whl (5.6 MB view details)

Uploaded Python 3musllinux: musl 1.2+ x86-64

ruff-0.0.277-py3-none-musllinux_1_2_i686.whl (5.2 MB view details)

Uploaded Python 3musllinux: musl 1.2+ i686

ruff-0.0.277-py3-none-musllinux_1_2_armv7l.whl (4.8 MB view details)

Uploaded Python 3musllinux: musl 1.2+ ARMv7l

ruff-0.0.277-py3-none-musllinux_1_2_aarch64.whl (5.1 MB view details)

Uploaded Python 3musllinux: musl 1.2+ ARM64

ruff-0.0.277-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (5.5 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ x86-64

ruff-0.0.277-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl (6.6 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ s390x

ruff-0.0.277-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl (5.8 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ ppc64le

ruff-0.0.277-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl (5.9 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ ppc64

ruff-0.0.277-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl (5.3 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ i686

ruff-0.0.277-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl (4.9 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ ARMv7l

ruff-0.0.277-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (5.2 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ ARM64

ruff-0.0.277-py3-none-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl (10.2 MB view details)

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

ruff-0.0.277-py3-none-macosx_10_7_x86_64.whl (5.3 MB view details)

Uploaded Python 3macOS 10.7+ x86-64

File details

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

File metadata

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

File hashes

Hashes for ruff-0.0.277.tar.gz
Algorithm Hash digest
SHA256 2dab13cdedbf3af6d4427c07f47143746b6b95d9e4a254ac369a0edb9280a0d2
MD5 a508d6ddb04b34cfa8e091c823d1fe1a
BLAKE2b-256 f60be8bacb7d71fa6fea03f4b837be231270e0c715b4fdaf286f749d5fafbc26

See more details on using hashes here.

File details

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

File metadata

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

File hashes

Hashes for ruff-0.0.277-py3-none-win_arm64.whl
Algorithm Hash digest
SHA256 2d4444c60f2e705c14cd802b55cd2b561d25bf4311702c463a002392d3116b22
MD5 f3a5f75a571dc28d4179282d5be0397b
BLAKE2b-256 f41b2d5fede02db6d038a14e669d13f0191c872594be41ecfbed79fc907cd9e1

See more details on using hashes here.

File details

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

File metadata

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

File hashes

Hashes for ruff-0.0.277-py3-none-win_amd64.whl
Algorithm Hash digest
SHA256 6fe81732f788894a00f6ade1fe69e996cc9e485b7c35b0f53fb00284397284b2
MD5 e7eddde085283dedc985c21d73ce7849
BLAKE2b-256 9da129c9528eec851d3afd75cc3f8024ae73560545f04a1c134e822ce924f724

See more details on using hashes here.

File details

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

File metadata

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

File hashes

Hashes for ruff-0.0.277-py3-none-win32.whl
Algorithm Hash digest
SHA256 88d0f2afb2e0c26ac1120e7061ddda2a566196ec4007bd66d558f13b374b9efc
MD5 8eb1ec1693745f9426226515207818f3
BLAKE2b-256 37f0e4b508d8e64a2e108d5341f3accd015077e80323d298abc67a4395b90ffe

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.0.277-py3-none-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 734165ea8feb81b0d53e3bf523adc2413fdb76f1264cde99555161dd5a725522
MD5 b5670c000de556649e07fcbba780f5fa
BLAKE2b-256 ff1777ddf002d21fafae1e657f330e364f0b435b676ed1d9a191005100749e03

See more details on using hashes here.

File details

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

File metadata

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

File hashes

Hashes for ruff-0.0.277-py3-none-musllinux_1_2_i686.whl
Algorithm Hash digest
SHA256 3a43fbe026ca1a2a8c45aa0d600a0116bec4dfa6f8bf0c3b871ecda51ef2b5dd
MD5 6046e54ff84973fa27efe7acf6ff3a51
BLAKE2b-256 608a083f09986ac2194a3c3e575c66c51aeef35a3e1d6961f96ded3677748a33

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.0.277-py3-none-musllinux_1_2_armv7l.whl
Algorithm Hash digest
SHA256 323b674c98078be9aaded5b8b51c0d9c424486566fb6ec18439b496ce79e5998
MD5 fc912453ea9c203ebdff9d44c603a488
BLAKE2b-256 b2f9743116b600c8c20910faa19f34c67d862ea3ce4885c762d8872ed4bfcaa1

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.0.277-py3-none-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 f612e0a14b3d145d90eb6ead990064e22f6f27281d847237560b4e10bf2251f3
MD5 246ea1c5696f2dc6736a681da3cd7fa7
BLAKE2b-256 52ea54f6752074ee6ddd1fcc23de8f72df195a20d074c5b2a838e2c088849881

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.0.277-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 a9879f59f763cc5628aa01c31ad256a0f4dc61a29355c7315b83c2a5aac932b5
MD5 ccf06abb3d5acd0b2f295f728010e33d
BLAKE2b-256 b1860874886d14ca7c30cb3fdfb437db157f6ea9674339db191928590ac8808e

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.0.277-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl
Algorithm Hash digest
SHA256 14a7b2f00f149c5a295f188a643ac25226ff8a4d08f7a62b1d4b0a1dc9f9b85c
MD5 ea0a80cfe37a07515c9d0aa33b073763
BLAKE2b-256 a0814b3abfcb96a98ee88fb25f8e5f9b2524762ffa839bde2e562466ac05417b

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.0.277-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl
Algorithm Hash digest
SHA256 f32ec416c24542ca2f9cc8c8b65b84560530d338aaf247a4a78e74b99cd476b4
MD5 53de6f5fd109be50f9709569266674c7
BLAKE2b-256 eb98ba520b6132d46c05ea3290876f2ce45c5f22e650d3c9a88060b7ce8bda07

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.0.277-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl
Algorithm Hash digest
SHA256 468bfb0a7567443cec3d03cf408d6f562b52f30c3c29df19927f1e0e13a40cd7
MD5 da42c347ab21c4b64dba44d157e055be
BLAKE2b-256 edc67cd7e6fa8ac06e27d333c2e869579278ccc478c34e688c37c3617edb14b4

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.0.277-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 479864a3ccd8a6a20a37a6e7577bdc2406868ee80b1e65605478ad3b8eb2ba0b
MD5 3f031924bd36d92cac9768fd2d5b3cdc
BLAKE2b-256 4810bbf50dac3dbc4e7297038871c88e533575ba30e7781e2f30458c88a58eb4

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.0.277-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl
Algorithm Hash digest
SHA256 74e4b206cb24f2e98a615f87dbe0bde18105217cbcc8eb785bb05a644855ba50
MD5 116d046d4fb14a3379db8cc6cfcb78cd
BLAKE2b-256 07bcf557a79b392eb876f486b22fe0f3f7d46f6165f02e460d59580d904a4a05

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.0.277-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 7baa97c3d7186e5ed4d5d4f6834d759a27e56cf7d5874b98c507335f0ad5aadb
MD5 1f2aacc06f8e92832f777f50bbb1c6ec
BLAKE2b-256 bbb769b1de499d17a2ee38823f935807a331c9c3b9bdcef0e8b284f05bf76b80

See more details on using hashes here.

File details

Details for the file ruff-0.0.277-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.277-py3-none-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl
Algorithm Hash digest
SHA256 3e60605e07482183ba1c1b7237eca827bd6cbd3535fe8a4ede28cbe2a323cb97
MD5 03638d284635f41aeb700579847a892a
BLAKE2b-256 2f5858f82beac7c0d889ade77d0a103cae889a456bde5fc530ed6670777cb60b

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.0.277-py3-none-macosx_10_7_x86_64.whl
Algorithm Hash digest
SHA256 3250b24333ef419b7a232080d9724ccc4d2da1dbbe4ce85c4caa2290d83200f8
MD5 d3e11995a456b6df40e0b82f44ff75cc
BLAKE2b-256 1ea41ba8e37215ab08ca05773948cea81f4fb47dd1ce1126fa26a43ae3bf63dc

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