Skip to main content

An extremely fast Python linter and code formatter, 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:

- repo: https://github.com/astral-sh/ruff-pre-commit
  # Ruff version.
  rev: v0.1.7
  hooks:
    # Run the linter.
    - id: ruff
      args: [ --fix ]
    # Run the 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

This version

0.1.7

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

Uploaded Python 3Windows ARM64

ruff-0.1.7-py3-none-win_amd64.whl (6.3 MB view details)

Uploaded Python 3Windows x86-64

ruff-0.1.7-py3-none-win32.whl (5.9 MB view details)

Uploaded Python 3Windows x86

ruff-0.1.7-py3-none-musllinux_1_2_x86_64.whl (6.4 MB view details)

Uploaded Python 3musllinux: musl 1.2+ x86-64

ruff-0.1.7-py3-none-musllinux_1_2_i686.whl (6.0 MB view details)

Uploaded Python 3musllinux: musl 1.2+ i686

ruff-0.1.7-py3-none-musllinux_1_2_armv7l.whl (5.7 MB view details)

Uploaded Python 3musllinux: musl 1.2+ ARMv7l

ruff-0.1.7-py3-none-musllinux_1_2_aarch64.whl (5.9 MB view details)

Uploaded Python 3musllinux: musl 1.2+ ARM64

ruff-0.1.7-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (6.4 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ x86-64

ruff-0.1.7-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl (7.8 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ s390x

ruff-0.1.7-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl (6.7 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ ppc64le

ruff-0.1.7-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl (6.8 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ ppc64

ruff-0.1.7-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl (6.2 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ i686

ruff-0.1.7-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl (5.7 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ ARMv7l

ruff-0.1.7-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (6.0 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ ARM64

ruff-0.1.7-py3-none-macosx_10_12_x86_64.whl (6.1 MB view details)

Uploaded Python 3macOS 10.12+ x86-64

ruff-0.1.7-py3-none-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl (11.8 MB view details)

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

File details

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

File metadata

  • Download URL: ruff-0.1.7.tar.gz
  • Upload date:
  • Size: 1.8 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.7.tar.gz
Algorithm Hash digest
SHA256 dffd699d07abf54833e5f6cc50b85a6ff043715da8788c4a79bcd4ab4734d306
MD5 707f95527123e8b42b4dfefc4c2339ed
BLAKE2b-256 22e83166c7f559e2c2449af4af5203f5ce4a5d886c576152f4dfbda02430c9f1

See more details on using hashes here.

File details

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

File metadata

  • Download URL: ruff-0.1.7-py3-none-win_arm64.whl
  • Upload date:
  • Size: 6.0 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.7-py3-none-win_arm64.whl
Algorithm Hash digest
SHA256 0683b7bfbb95e6df3c7c04fe9d78f631f8e8ba4868dfc932d43d690698057e2e
MD5 2b3e6a8e17b72019ec46f2b98c464870
BLAKE2b-256 4040e5afee4d3f197a1f5da5c971092ef50439972bbc15599abf47150cf947b4

See more details on using hashes here.

File details

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

File metadata

  • Download URL: ruff-0.1.7-py3-none-win_amd64.whl
  • Upload date:
  • Size: 6.3 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.7-py3-none-win_amd64.whl
Algorithm Hash digest
SHA256 4af95fd1d3b001fc41325064336db36e3d27d2004cdb6d21fd617d45a172dd96
MD5 b20113711967ce968388f056777245c4
BLAKE2b-256 0218554a06e27125849118a33014fc658a1d689bc149940ed07e36f123aa2fed

See more details on using hashes here.

File details

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

File metadata

  • Download URL: ruff-0.1.7-py3-none-win32.whl
  • Upload date:
  • Size: 5.9 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.7-py3-none-win32.whl
Algorithm Hash digest
SHA256 416dfd0bd45d1a2baa3b1b07b1b9758e7d993c256d3e51dc6e03a5e7901c7d80
MD5 8385758214b6d554ad94b9aaac401c9a
BLAKE2b-256 adef33c8c31f09c7ee1027d0aeba48eaaf35d3b8c307e6650dbc0ff990e7ca9a

See more details on using hashes here.

File details

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

File metadata

  • Download URL: ruff-0.1.7-py3-none-musllinux_1_2_x86_64.whl
  • Upload date:
  • Size: 6.4 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.7-py3-none-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 290ecab680dce94affebefe0bbca2322a6277e83d4f29234627e0f8f6b4fa9ce
MD5 a138ff26da7dcfc46a669504d3e681ed
BLAKE2b-256 8a47a259b32ad202c9d90edf1134804a860b1d0ba72715aaa8eb19d19a370ff6

See more details on using hashes here.

File details

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

File metadata

  • Download URL: ruff-0.1.7-py3-none-musllinux_1_2_i686.whl
  • Upload date:
  • Size: 6.0 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.7-py3-none-musllinux_1_2_i686.whl
Algorithm Hash digest
SHA256 6b05e3b123f93bb4146a761b7a7d57af8cb7384ccb2502d29d736eaade0db519
MD5 811c849e6dbad37ff5df3ac651281d94
BLAKE2b-256 9717e04b89505180e4190ef5f5438ec14209736d65f80dd90ddef403f2c11643

See more details on using hashes here.

File details

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

File metadata

  • Download URL: ruff-0.1.7-py3-none-musllinux_1_2_armv7l.whl
  • Upload date:
  • Size: 5.7 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.7-py3-none-musllinux_1_2_armv7l.whl
Algorithm Hash digest
SHA256 90c958fe950735041f1c80d21b42184f1072cc3975d05e736e8d66fc377119ea
MD5 b9c8ae445d3c3409ce99e60cc2367718
BLAKE2b-256 dd9eb5e88e6a9622e48f36ae9bf9d5d39c5ab4cffc7a98491d2e6ee2ec51a39a

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.1.7-py3-none-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 276a89bcb149b3d8c1b11d91aa81898fe698900ed553a08129b38d9d6570e717
MD5 4a2afd872ddf79869e7aa897a753d87e
BLAKE2b-256 678c7c0a228b661ef4fd91dcea97fdbd75d3f3e5aca16c3697e31daaa51cf051

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.1.7-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 df2bb4bb6bbe921f6b4f5b6fdd8d8468c940731cb9406f274ae8c5ed7a78c478
MD5 466513563a7e92ad4a9b66c99be1564d
BLAKE2b-256 417fdf4c0887ec638b4b18a9cfada73db3cb6653742b49432e08d55d417c41b3

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.1.7-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl
Algorithm Hash digest
SHA256 9dcc6bb2f4df59cb5b4b40ff14be7d57012179d69c6565c1da0d1f013d29951b
MD5 4347e6eeca8634e45a33389990051035
BLAKE2b-256 7c4fc1aee31c7ac44ce8b90650e37576b5146f8b61b2c6a4601b42dd5c6c7332

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.1.7-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl
Algorithm Hash digest
SHA256 6c64cb67b2025b1ac6d58e5ffca8f7b3f7fd921f35e78198411237e4f0db8e73
MD5 a56d93d6210698e8f5d448d05be43ef8
BLAKE2b-256 73c4f20c811eb11869b39c14f4b03cf3da64092491788b9565f71ea2fa2170c9

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.1.7-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl
Algorithm Hash digest
SHA256 45b38c3f8788a65e6a2cab02e0f7adfa88872696839d9882c13b7e2f35d64c5f
MD5 4d9d2844cbd30c865830a09bef39d389
BLAKE2b-256 78a4e53ab7643eccff6ef842a4865a652e8c403a052c9a2f756f7d436839318d

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.1.7-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 de02ca331f2143195a712983a57137c5ec0f10acc4aa81f7c1f86519e52b92a1
MD5 39e76aa046dd6aac4487648dd701ceb1
BLAKE2b-256 c9f19d3f2aee19293496a72a772e62f66a8828294af0b9164a3ec6f34d1104b8

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.1.7-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl
Algorithm Hash digest
SHA256 69a4bed13bc1d5dabf3902522b5a2aadfebe28226c6269694283c3b0cecb45fd
MD5 dfc00ec04d92979a9a2661c8a6944d55
BLAKE2b-256 b6a3e740355f220ea0dd4c24449b94063a4018f62290841cf8f589e945cf274b

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.1.7-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 8b0c2de9dd9daf5e07624c24add25c3a490dbf74b0e9bca4145c632457b3b42a
MD5 9ba34199a2919fedfbfe3fac8ff00586
BLAKE2b-256 a8b2110973f5409a3a044cb0f9fe9a452a44c8e6be5e9576bbbefd4ce8e8c197

See more details on using hashes here.

File details

Details for the file ruff-0.1.7-py3-none-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for ruff-0.1.7-py3-none-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 1ea109bdb23c2a4413f397ebd8ac32cb498bee234d4191ae1a310af760e5d287
MD5 f28fe3b308bf769716398256aaee0d9f
BLAKE2b-256 a654a3f6d5f94aaaaf049ddcaf346bd2c1ed1598c54ddcc938c7eb8863a0ce91

See more details on using hashes here.

File details

Details for the file ruff-0.1.7-py3-none-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl.

File metadata

File hashes

Hashes for ruff-0.1.7-py3-none-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl
Algorithm Hash digest
SHA256 7f80496854fdc65b6659c271d2c26e90d4d401e6a4a31908e7e334fab4645aac
MD5 27c69fb52d50f5c247b07b8bf45a2904
BLAKE2b-256 ea34fa53ed50bd20797b8aa27dcf0a52548b629fd0c65008d334ab2fae9bdce8

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