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.271
  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 the APIs and implementation details of Rome, Prettier, and Black.

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/charliermarsh/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/charliermarsh/ruff
    :alt: Ruff

...or, as HTML:

<a href="https://github.com/charliermarsh/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.271.tar.gz (930.4 kB 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.271-py3-none-win_arm64.whl (5.6 MB view details)

Uploaded Python 3Windows ARM64

ruff-0.0.271-py3-none-win_amd64.whl (5.7 MB view details)

Uploaded Python 3Windows x86-64

ruff-0.0.271-py3-none-win32.whl (5.3 MB view details)

Uploaded Python 3Windows x86

ruff-0.0.271-py3-none-musllinux_1_2_x86_64.whl (5.8 MB view details)

Uploaded Python 3musllinux: musl 1.2+ x86-64

ruff-0.0.271-py3-none-musllinux_1_2_i686.whl (5.5 MB view details)

Uploaded Python 3musllinux: musl 1.2+ i686

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

Uploaded Python 3musllinux: musl 1.2+ ARMv7l

ruff-0.0.271-py3-none-musllinux_1_2_aarch64.whl (5.4 MB view details)

Uploaded Python 3musllinux: musl 1.2+ ARM64

ruff-0.0.271-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (5.8 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ x86-64

ruff-0.0.271-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl (6.8 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ s390x

ruff-0.0.271-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl (6.1 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ ppc64le

ruff-0.0.271-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl (6.2 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ ppc64

ruff-0.0.271-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl (5.6 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ i686

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

Uploaded Python 3manylinux: glibc 2.17+ ARMv7l

ruff-0.0.271-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (5.4 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ ARM64

ruff-0.0.271-py3-none-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl (10.7 MB view details)

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

ruff-0.0.271-py3-none-macosx_10_7_x86_64.whl (5.6 MB view details)

Uploaded Python 3macOS 10.7+ x86-64

File details

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

File metadata

  • Download URL: ruff-0.0.271.tar.gz
  • Upload date:
  • Size: 930.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/4.0.1 CPython/3.11.3

File hashes

Hashes for ruff-0.0.271.tar.gz
Algorithm Hash digest
SHA256 be4590137a31c47e7f6ef4488d60102c68102f842453355d8073193a30199aa7
MD5 3ba6d67e924f202cf4d19373eb29ec7a
BLAKE2b-256 f9392888b3baad15b7930c084da2a2c6f3cac669c4add9b98ac2f74c8378d64a

See more details on using hashes here.

File details

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

File metadata

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

File hashes

Hashes for ruff-0.0.271-py3-none-win_arm64.whl
Algorithm Hash digest
SHA256 45b3c3551a798d9786779c6dd7ad2224af6e06162e17f4a0e7678d3e9115ae56
MD5 02a8ddf851541a685ad7571b67bf84bb
BLAKE2b-256 aee58d3c2a3a507ecb6b161a7838da601d623bb25f2b366f0aadd2f2ddeabfc4

See more details on using hashes here.

File details

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

File metadata

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

File hashes

Hashes for ruff-0.0.271-py3-none-win_amd64.whl
Algorithm Hash digest
SHA256 140e912a18a662062b04b489861e5aebdbe1a1668bf416e5a951f2347aa65907
MD5 935c545f452866ec525f181014940e64
BLAKE2b-256 865439c28366ee871c955a9beeb092aed3b632a466b8811865aaa78aa7d94cd3

See more details on using hashes here.

File details

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

File metadata

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

File hashes

Hashes for ruff-0.0.271-py3-none-win32.whl
Algorithm Hash digest
SHA256 403e8f9de18b2279d65015a45e0e0d98d60ad878d52f46904f502a4d09465815
MD5 df79a4c533ec7fa6c7105d85b6779151
BLAKE2b-256 006aeb0f14b8942522797b3bcaa468528ab9492b7d200a76af222d76dd3a89ea

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.0.271-py3-none-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 cd43c1aff3eefb2193a125a12124438f65a8d1a6da0e86f8545141d48f6a39fa
MD5 64633fa3009f97c63b419de7ed11d905
BLAKE2b-256 09424a175bfb99a1db67bd0ce2e9f18afa0b82f804b9dbc572a099931d4f86ae

See more details on using hashes here.

File details

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

File metadata

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

File hashes

Hashes for ruff-0.0.271-py3-none-musllinux_1_2_i686.whl
Algorithm Hash digest
SHA256 efdfe7fea656eb2ed54f123135c04f71744ad6e4c0c6be156d46e7a2f4730d48
MD5 d0453892104f115406b20f2f2ee6cc31
BLAKE2b-256 5c9911d8d05cd4186fd6e852d46f47a27de5c6da9f0c2045e6eeb24db136bad5

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.0.271-py3-none-musllinux_1_2_armv7l.whl
Algorithm Hash digest
SHA256 f3fd9e7c7afb7740d2734af3348e6c88226b42acba2e10a3d1e449caa67e4652
MD5 7dd54f8f640fba55d47a65ca1edb09bd
BLAKE2b-256 0e55e6c1af8dc0ac3ea8e078ab7323567ff58ce02c8205b87716e156e5f48f9b

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.0.271-py3-none-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 67525aa821ff0f8371eaa28c73dc467b8eea18931a8bd749775ad538fe1f35e6
MD5 a6e27f2beeadddca8e19b2d4724bc055
BLAKE2b-256 fbde7647175d1889f29ffbfa7dcbc8a0ed3e007ecc955a01a158d562a6ad37ec

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.0.271-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 5a73ffda5548ea8e28e0afcfa698a8675bb17f7048299327f4c1a1287b6e36a2
MD5 46071941c1293d3ead345795b0903512
BLAKE2b-256 489a99858a13725552d2364ba8ae7f89b35a7b974e4ad8eba7bf9965469dbe39

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.0.271-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl
Algorithm Hash digest
SHA256 f445c56cdc8c12fc28a0b16588ba33abebb6340cb5b1b5a7d5668d4c0b31ad33
MD5 09dd658e12eb1ee9a753a7967bf9a951
BLAKE2b-256 86358a339e8740a7988bdab0adcb016ff0b4a390ee9e7801e2fa071e944e4885

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.0.271-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl
Algorithm Hash digest
SHA256 fca503741f4b23a7179fd7a9bc50fc2cca637e9a4da027776f38690c50ae559f
MD5 243d939809c16960ee6c08e4efefdacc
BLAKE2b-256 a6c0359fa555e0a5ce87e66319c4b6f4035bba75626d39ae133deeff86ca5769

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.0.271-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl
Algorithm Hash digest
SHA256 7543b8a32e000ed30727ca6e570a90ab26f8899ee23dffb28806dfc2618782fb
MD5 5f682944ada58f133f0445f4acc5a4b8
BLAKE2b-256 ebd0bc63f1baa7e6d7698a857591fe215cc3bac174b309de15bdd2e1b3fe0bd4

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.0.271-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 7e34ca86329a542ab5d31f4fc2702f556d62748f4217e2f6951aef93176190f0
MD5 d5808d620b7a682e1420c04b6be78c9b
BLAKE2b-256 b96c5353a2267cc1a4b72fba83ea4093a57a10a1bcf058f0fbf2557f5c6fff65

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.0.271-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl
Algorithm Hash digest
SHA256 191cdddfc82165afd63ab29ad671419a90a5e699b026ac2d9c61232543965de6
MD5 3ca4bddd5bb97464945f6742ece097de
BLAKE2b-256 a0e81f5116a0b4d6349b8682497287a22ea7b3c13c01b82aab407f213f8289fa

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.0.271-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 9e5de841e09ea75a26956a2cda930d1260c9d8d94cbe57c13b3e881d96526860
MD5 36f4dafbc87d32f77533555dff50cf62
BLAKE2b-256 053a4cf1193c3fef061cf719e6e60291796ed189f251843e0b2c88479da8e596

See more details on using hashes here.

File details

Details for the file ruff-0.0.271-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.271-py3-none-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl
Algorithm Hash digest
SHA256 f47d8a192f6869e95896dc5bb7e825a4f9c554136b9c3bddd38389e43d4db08b
MD5 1dbabbf7c5e61ad57088cbc9046247e7
BLAKE2b-256 b29599f3884f93dbc909662362253b84d29923e379f5ad6032f7720ea69c12b0

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.0.271-py3-none-macosx_10_7_x86_64.whl
Algorithm Hash digest
SHA256 1a627978df924635f7d1a169a98abb2ea488c2d409da56a3f9e44a82d30606ac
MD5 381efb5a5e17107942ebd661990deaec
BLAKE2b-256 9b50cd5fec53ae4670b9d409a3f9e99c85016980fb594fb5e1ab354f3171853c

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