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.

Read the launch blog post or the most recent project update.

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/charliermarsh/ruff-pre-commit
  # Ruff version.
  rev: 'v0.0.256'
  hooks:
    - id: ruff

Ruff can also be used as a VS Code extension or alongside any other editor through the Ruff LSP.

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", "..."]
unfixable = []

# Exclude a variety of commonly ignored directories.
exclude = [
    ".bzr",
    ".direnv",
    ".eggs",
    ".git",
    ".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.

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 in a number of major open-source projects, including:

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.256.tar.gz (787.5 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.256-py3-none-win_arm64.whl (3.5 MB view details)

Uploaded Python 3Windows ARM64

ruff-0.0.256-py3-none-win_amd64.whl (3.7 MB view details)

Uploaded Python 3Windows x86-64

ruff-0.0.256-py3-none-win32.whl (3.6 MB view details)

Uploaded Python 3Windows x86

ruff-0.0.256-py3-none-musllinux_1_2_x86_64.whl (4.2 MB view details)

Uploaded Python 3musllinux: musl 1.2+ x86-64

ruff-0.0.256-py3-none-musllinux_1_2_i686.whl (3.9 MB view details)

Uploaded Python 3musllinux: musl 1.2+ i686

ruff-0.0.256-py3-none-musllinux_1_2_armv7l.whl (3.6 MB view details)

Uploaded Python 3musllinux: musl 1.2+ ARMv7l

ruff-0.0.256-py3-none-musllinux_1_2_aarch64.whl (3.8 MB view details)

Uploaded Python 3musllinux: musl 1.2+ ARM64

ruff-0.0.256-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (4.2 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ x86-64

ruff-0.0.256-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl (4.8 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ s390x

ruff-0.0.256-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl (4.5 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ ppc64le

ruff-0.0.256-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl (4.6 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ ppc64

ruff-0.0.256-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl (4.1 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ i686

ruff-0.0.256-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl (3.6 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ ARMv7l

ruff-0.0.256-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (3.9 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ ARM64

ruff-0.0.256-py3-none-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl (7.7 MB view details)

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

ruff-0.0.256-py3-none-macosx_10_7_x86_64.whl (4.1 MB view details)

Uploaded Python 3macOS 10.7+ x86-64

File details

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

File metadata

  • Download URL: ruff-0.0.256.tar.gz
  • Upload date:
  • Size: 787.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.2 CPython/3.10.6

File hashes

Hashes for ruff-0.0.256.tar.gz
Algorithm Hash digest
SHA256 f9a96b34a4870ee8cf2f3779cd7854620d1788a83b52374771266cf800541bb7
MD5 467e64c5ad69f1f4bff5718d833cf091
BLAKE2b-256 2d1c284e5f825d20dedffbb3ae02cba56cdbaae9f45dc60fccb6d83f5dffb6b4

See more details on using hashes here.

File details

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

File metadata

  • Download URL: ruff-0.0.256-py3-none-win_arm64.whl
  • Upload date:
  • Size: 3.5 MB
  • Tags: Python 3, Windows ARM64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.2 CPython/3.10.6

File hashes

Hashes for ruff-0.0.256-py3-none-win_arm64.whl
Algorithm Hash digest
SHA256 64b276149e86c3d234608d3fe1da77535865e03debd3a1d5d04576f7f5031bbb
MD5 8a5a1fdb9efd3d3709ded24a27720a03
BLAKE2b-256 ac1b05d0f63ea2658ba0c18ae45818156a001db5b2c747bf768dc94394d75e7b

See more details on using hashes here.

File details

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

File metadata

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

File hashes

Hashes for ruff-0.0.256-py3-none-win_amd64.whl
Algorithm Hash digest
SHA256 859c8ffb1801895fe043a2b85a45cd0ff35667ddea4b465ba2a29d275550814a
MD5 63da3ea67e2dc9cd4956dccf90f4306e
BLAKE2b-256 c89cd84025881d25c86e8062d50c737f5f388f69ca5cf631b19ecb48357799fc

See more details on using hashes here.

File details

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

File metadata

  • Download URL: ruff-0.0.256-py3-none-win32.whl
  • Upload date:
  • Size: 3.6 MB
  • Tags: Python 3, Windows x86
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.2 CPython/3.10.6

File hashes

Hashes for ruff-0.0.256-py3-none-win32.whl
Algorithm Hash digest
SHA256 d63e5320bc2d91e94925cd1863e381a48edf087041035967faf2614bb36a6a0d
MD5 5500a28c9fe31f00c8d2699d5b1a1ba4
BLAKE2b-256 47189f739772292fa53844ffb33e990be6108ddb2e92fbcedbe000816db304bc

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.0.256-py3-none-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 93a0cfec812b2ba57bff22b176901e0ddf44e4d42a9bd7da7ffb5e53df13fd6e
MD5 3893b676e69edd1e02d02a91b2d94b73
BLAKE2b-256 b32b5af6f26a858c05669303324fb268f1526cdebb3762a606dcc60d530ad9bd

See more details on using hashes here.

File details

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

File metadata

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

File hashes

Hashes for ruff-0.0.256-py3-none-musllinux_1_2_i686.whl
Algorithm Hash digest
SHA256 f310bfc76c0404a487759c8904f57bf51653c46e686c800efc1ff1d165a59a04
MD5 ffab7422c9cd8573f842fa8d3f80ca68
BLAKE2b-256 e9f4f35b8da072a786861c89fcce3d87dd3e56444b0b9e39a33bc7649d468479

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.0.256-py3-none-musllinux_1_2_armv7l.whl
Algorithm Hash digest
SHA256 7ebb7de4e62d751b65bb15418a83ac5d555afb3eaa3ad549dea21744da34ae86
MD5 d9de7e1c767e90b9c456c383e84b8736
BLAKE2b-256 ec2b236d779520a975d71e7b1e1dc70a8aba1f725bc6d495aadad6296372e97c

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.0.256-py3-none-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 3c6e93d7818a75669328e49a0f7070c40e18676ca8e56ca9c566633bef4d8d05
MD5 1fc80d0d631d9210c58fa54b97880cae
BLAKE2b-256 8db976ea271977aeeb94450acbe185547e3b693c81073a1c5f1a303bfca76e74

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.0.256-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 2116bd67e52ade9f90e5a3a3aa511a9b179c699690221bdd5bb267dbf7e94b22
MD5 2f940bcbb0c3811e70814d8615669fb8
BLAKE2b-256 507fc11a716a11ec0eedc1f12fb5cf51888b03180e61b5cd5e86f93653d63eed

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.0.256-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl
Algorithm Hash digest
SHA256 9e052ec4d5c92663caa662b68fe1902ec10eddac2783229b1c5f20f3df62a865
MD5 06e4668dc56b2eeaa78ce692fa72006c
BLAKE2b-256 816f187ddf45beeda28c415db518bdf247b81de8c8ed261899a374d6721585db

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.0.256-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl
Algorithm Hash digest
SHA256 3878593507b281b2615702ece06426e8b27076e8fedf658bf0c5e1e5e2ad1b40
MD5 e7f739cc838f06022f492f01cf092cda
BLAKE2b-256 e92b78cf45bdcfbf83d22fcc8b0b3b6b4f30c5043b21a14f76a9ce68afa0b152

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.0.256-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl
Algorithm Hash digest
SHA256 fe6d77a43b2d52f45ee42f6f682198ed1c34cd0165812e276648981dfd50ad36
MD5 588fafedbe48098c1d1d316649549f88
BLAKE2b-256 8d5aa22cbaad3c5acaac11dbb142127631f0ee76849836ca8fc0f513aa2a5fd0

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.0.256-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 a0f88839b886db3577136375865bd080b9ed6f9b85bb990d897780e5a30ca3c2
MD5 a803224df4c14043732756da9a7d5d0c
BLAKE2b-256 3ea5292ad9fd4d60ff8f18047a857e6c87cd8339d57f6bac3ccab9397aa89cb1

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.0.256-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl
Algorithm Hash digest
SHA256 80fa5d3a40dd0b65c6d6adea4f825984d5d3a215a25d90cc6139978cb22ea1cd
MD5 4a49895e8405bdb97c66b8ec46c479cd
BLAKE2b-256 36abf26dadc7e8e9a28fe35d7ab2575b4427b3cdde9c9aad6b45ad847136d605

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.0.256-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 36ca633cfc335869643a13e2006f13a63bc4cb94073aa9508ceb08a1e3afe3af
MD5 4ab7a100278f9b007a00fe1c14bbcc8c
BLAKE2b-256 de419b5ddf21c5e6fed029f2c572b3ac1f9906c00eb9a2daefa7eadcd7f3ec3a

See more details on using hashes here.

File details

Details for the file ruff-0.0.256-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.256-py3-none-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl
Algorithm Hash digest
SHA256 48a42f0ec4c5a3c3b062e947b2a5f8f7a4264761653fb0ee656a9b535ae6d8d7
MD5 a78aab04b158a80dc321054095057d61
BLAKE2b-256 52351b1bf9a19eae89077c7e69f4a21a0e02242e232fff0d9c8d689e8e7d7506

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.0.256-py3-none-macosx_10_7_x86_64.whl
Algorithm Hash digest
SHA256 eb8e949f6e7fb16f9aa163fcc13318e2b7910577513468417e5b003b984410a1
MD5 62a93bb89974888312fa22878fb3db94
BLAKE2b-256 3dfff6c8c5a139c90ee7b54163d2fee8c19f8bd4cdb661588710610639885c3e

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