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.280
  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.280.tar.gz (1.2 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.280-py3-none-win_arm64.whl (5.4 MB view details)

Uploaded Python 3Windows ARM64

ruff-0.0.280-py3-none-win_amd64.whl (5.6 MB view details)

Uploaded Python 3Windows x86-64

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

Uploaded Python 3Windows x86

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

Uploaded Python 3musllinux: musl 1.2+ x86-64

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

Uploaded Python 3musllinux: musl 1.2+ i686

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

Uploaded Python 3musllinux: musl 1.2+ ARMv7l

ruff-0.0.280-py3-none-musllinux_1_2_aarch64.whl (5.3 MB view details)

Uploaded Python 3musllinux: musl 1.2+ ARM64

ruff-0.0.280-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.280-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl (6.8 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ s390x

ruff-0.0.280-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl (6.0 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ ppc64le

ruff-0.0.280-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl (6.1 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ ppc64

ruff-0.0.280-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl (5.5 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ i686

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

Uploaded Python 3manylinux: glibc 2.17+ ARMv7l

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

Uploaded Python 3manylinux: glibc 2.17+ ARM64

ruff-0.0.280-py3-none-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl (10.5 MB view details)

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

ruff-0.0.280-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.280.tar.gz.

File metadata

  • Download URL: ruff-0.0.280.tar.gz
  • Upload date:
  • Size: 1.2 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.280.tar.gz
Algorithm Hash digest
SHA256 581c43e4ac5e5a7117ad7da2120d960a4a99e68ec4021ec3cd47fe1cf78f8380
MD5 4750d4156192daec12dc75c0efb00108
BLAKE2b-256 bd79e8157aa179ae1a73e3092360bc18e2a58052573eec20116414f6562a527c

See more details on using hashes here.

File details

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

File metadata

  • Download URL: ruff-0.0.280-py3-none-win_arm64.whl
  • Upload date:
  • Size: 5.4 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.280-py3-none-win_arm64.whl
Algorithm Hash digest
SHA256 b7de5b8689575918e130e4384ed9f539ce91d067c0a332aedef6ca7188adac2d
MD5 c3bb9d04f29de4f7282f9cb9c7097b32
BLAKE2b-256 f93dd66ffe849b1021fccc01d9bf6a53f34b695471cb1505a49e9d8e3772f470

See more details on using hashes here.

File details

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

File metadata

  • Download URL: ruff-0.0.280-py3-none-win_amd64.whl
  • Upload date:
  • Size: 5.6 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.280-py3-none-win_amd64.whl
Algorithm Hash digest
SHA256 4a7d52457b5dfcd3ab24b0b38eefaead8e2dca62b4fbf10de4cd0938cf20ce30
MD5 8bab4b5230b317d6d217c02555933711
BLAKE2b-256 8e0ab0304997e0648092736c5f74e6379a4ad23b93e12ee1671600ff96344004

See more details on using hashes here.

File details

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

File metadata

  • Download URL: ruff-0.0.280-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.280-py3-none-win32.whl
Algorithm Hash digest
SHA256 7784e3606352fcfb193f3cd22b2e2117c444cb879ef6609ec69deabd662b0763
MD5 fbc786aa654fdb1264bd35b19949df59
BLAKE2b-256 bc4dc209c33ae4ab374cb9172616832aee65bacac98d063e04664abc902727a0

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.0.280-py3-none-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 7a37dab70114671d273f203268f6c3366c035fe0c8056614069e90a65e614bfc
MD5 3096ed05c1d76b73d1e968f978d0a064
BLAKE2b-256 02e0d938bac9685633d642b84cf00fe48ff5e2b323c1a2b6bb53eccf4bbd74b9

See more details on using hashes here.

File details

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

File metadata

  • Download URL: ruff-0.0.280-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.280-py3-none-musllinux_1_2_i686.whl
Algorithm Hash digest
SHA256 8ffa7347ad11643f29de100977c055e47c988cd6d9f5f5ff83027600b11b9189
MD5 e1e252fde395ae28c830d24236a39cff
BLAKE2b-256 dbad9bea5e998234d67c1b3b8603ffc262d4736c59b93dccd7cda8420503e952

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.0.280-py3-none-musllinux_1_2_armv7l.whl
Algorithm Hash digest
SHA256 5f972567163a20fb8c2d6afc60c2ea5ef8b68d69505760a8bd0377de8984b4f6
MD5 432141d61dca2abfa9e5713bc31fc4d2
BLAKE2b-256 4a0565dcef4abe7bdb98ac9d70de2a993862af0281dff3d719507a0c4001647f

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.0.280-py3-none-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 2dae8f2d9c44c5c49af01733c2f7956f808db682a4193180dedb29dd718d7bbe
MD5 a38a95256526b3501292e55f0c1013ea
BLAKE2b-256 36f01687142c14a152454bb57fec9b1810aa650dabcf29c08b979eb06081defe

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.0.280-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 2e7c15828d09f90e97bea8feefcd2907e8c8ce3a1f959c99f9b4b3469679f33c
MD5 23e0b41282c2ab55b9d7bf5b179c235f
BLAKE2b-256 282214692982c9b85a88c510f9a514184b66e77a335ad7b520fc4910a14c0066

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.0.280-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl
Algorithm Hash digest
SHA256 bd58af46b0221efb95966f1f0f7576df711cb53e50d2fdb0e83c2f33360116a4
MD5 4432bf51f8562dca123a08ceb11b9396
BLAKE2b-256 c27293501fadae0e46f58f0e737ec10e2762e371ad9d44776da4778d8ff5f1ad

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.0.280-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl
Algorithm Hash digest
SHA256 37359cd67d2af8e09110a546507c302cbea11c66a52d2a9b6d841d465f9962d4
MD5 a6bc83670f1a78fc0007beccef68da39
BLAKE2b-256 254d6b1f7d589d20d5f5ffa63366f5094ed27e75828e6c0660caf9b852d7bbb6

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.0.280-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl
Algorithm Hash digest
SHA256 fe7118c1eae3fda17ceb409629c7f3b5a22dffa7caf1f6796776936dca1fe653
MD5 e9691945ea79a96281aa2a80b1b38d1e
BLAKE2b-256 177171a0e4be1da30205cf8d031d7868c03806e8eb6c4ee1e3614debef9b705f

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.0.280-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 7008fc6ca1df18b21fa98bdcfc711dad5f94d0fc3c11791f65e460c48ef27c82
MD5 bb097b796d70814e335dbc9b46e2e2e4
BLAKE2b-256 136731196b8a2d9515316b7f0586272cde1007fc18a4582e846843f6b2331717

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.0.280-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl
Algorithm Hash digest
SHA256 83e8f372fa5627eeda5b83b5a9632d2f9c88fc6d78cead7e2a1f6fb05728d137
MD5 b06a49335f3f0e5f84db3f9d111ef6db
BLAKE2b-256 fb93918c40e4e095737ea885af9a82bacd352a0211a98b32f08f2827883e1edc

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.0.280-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 d878370f7e9463ac40c253724229314ff6ebe4508cdb96cb536e1af4d5a9cd4f
MD5 18dba2274f5a9fed42ef8695c9c5733f
BLAKE2b-256 32040df0c1711cd30cdaa0f950d1073403d6061b38e1a3d75acc7bc5c1f7bea3

See more details on using hashes here.

File details

Details for the file ruff-0.0.280-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.280-py3-none-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl
Algorithm Hash digest
SHA256 ef6ee3e429fd29d6a5ceed295809e376e6ece5b0f13c7e703efaf3d3bcb30b96
MD5 916d3b8661676a322e2bf57de1559fee
BLAKE2b-256 6f9fa47b5ef2a8e2fd18f1c6ed018970a42de6ca93d4dcfc64dd902844b216b3

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.0.280-py3-none-macosx_10_7_x86_64.whl
Algorithm Hash digest
SHA256 48ed5aca381050a4e2f6d232db912d2e4e98e61648b513c350990c351125aaec
MD5 72dc2da3babc5218cb2d590f1635fdfb
BLAKE2b-256 dfb95080796f6f413ca54fc0fc44f5076353e7bec6160e9567cff3ff3d88ef63

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