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.11
  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",
    ".ipynb_checkpoints",
    ".mypy_cache",
    ".nox",
    ".pants.d",
    ".pyenv",
    ".pytest_cache",
    ".pytype",
    ".ruff_cache",
    ".svn",
    ".tox",
    ".venv",
    ".vscode",
    "__pypackages__",
    "_build",
    "buck-out",
    "build",
    "dist",
    "node_modules",
    "site-packages",
    "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

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

Uploaded Python 3Windows ARM64

ruff-0.1.11-py3-none-win_amd64.whl (7.2 MB view details)

Uploaded Python 3Windows x86-64

ruff-0.1.11-py3-none-win32.whl (6.6 MB view details)

Uploaded Python 3Windows x86

ruff-0.1.11-py3-none-musllinux_1_2_x86_64.whl (7.5 MB view details)

Uploaded Python 3musllinux: musl 1.2+ x86-64

ruff-0.1.11-py3-none-musllinux_1_2_i686.whl (7.1 MB view details)

Uploaded Python 3musllinux: musl 1.2+ i686

ruff-0.1.11-py3-none-musllinux_1_2_armv7l.whl (6.4 MB view details)

Uploaded Python 3musllinux: musl 1.2+ ARMv7l

ruff-0.1.11-py3-none-musllinux_1_2_aarch64.whl (6.9 MB view details)

Uploaded Python 3musllinux: musl 1.2+ ARM64

ruff-0.1.11-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (7.4 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ x86-64

ruff-0.1.11-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl (8.5 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ s390x

ruff-0.1.11-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl (7.8 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ ppc64le

ruff-0.1.11-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl (8.1 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ ppc64

ruff-0.1.11-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl (7.4 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ i686

ruff-0.1.11-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl (6.4 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ ARMv7l

ruff-0.1.11-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (7.0 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ ARM64

ruff-0.1.11-py3-none-macosx_10_12_x86_64.whl (7.2 MB view details)

Uploaded Python 3macOS 10.12+ x86-64

ruff-0.1.11-py3-none-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl (14.2 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.11.tar.gz.

File metadata

  • Download URL: ruff-0.1.11.tar.gz
  • Upload date:
  • Size: 1.9 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/4.0.2 CPython/3.11.7

File hashes

Hashes for ruff-0.1.11.tar.gz
Algorithm Hash digest
SHA256 f9d4d88cb6eeb4dfe20f9f0519bd2eaba8119bde87c3d5065c541dbae2b5a2cb
MD5 f7dedd6ee574209ccafa6ab76e0556c3
BLAKE2b-256 b3a3a9a504171d286bbe10c7e5cd09110250c01ebca7acede4352211d5372a0e

See more details on using hashes here.

File details

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

File metadata

  • Download URL: ruff-0.1.11-py3-none-win_arm64.whl
  • Upload date:
  • Size: 6.8 MB
  • Tags: Python 3, Windows ARM64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/4.0.2 CPython/3.11.7

File hashes

Hashes for ruff-0.1.11-py3-none-win_arm64.whl
Algorithm Hash digest
SHA256 97ce4d752f964ba559c7023a86e5f8e97f026d511e48013987623915431c7ea9
MD5 3397b95eeec1a88084f7115288eff5c7
BLAKE2b-256 a99b770da4f22ea69fdd19ac6cb183f02abf8fc6f8d16a9dc00dfaf667649ee7

See more details on using hashes here.

File details

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

File metadata

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

File hashes

Hashes for ruff-0.1.11-py3-none-win_amd64.whl
Algorithm Hash digest
SHA256 eb85ee287b11f901037a6683b2374bb0ec82928c5cbc984f575d0437979c521a
MD5 d12484f0194cdb51a9cfc1814a319faa
BLAKE2b-256 a2dc4d03f5b57e9a039858effc1c7ed738860e657cf6c694f44d75347c1d3b82

See more details on using hashes here.

File details

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

File metadata

  • Download URL: ruff-0.1.11-py3-none-win32.whl
  • Upload date:
  • Size: 6.6 MB
  • Tags: Python 3, Windows x86
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/4.0.2 CPython/3.11.7

File hashes

Hashes for ruff-0.1.11-py3-none-win32.whl
Algorithm Hash digest
SHA256 9b8f397902f92bc2e70fb6bebfa2139008dc72ae5177e66c383fa5426cb0bf2c
MD5 d3288c29a2585b17d0ef642d4b0d90ea
BLAKE2b-256 099012b4dafc75c0e545c31d1e06732214e93395290f98377eb9a6e074746b33

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.1.11-py3-none-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 6464289bd67b2344d2a5d9158d5eb81025258f169e69a46b741b396ffb0cda95
MD5 9fda794b4a97e528c3a2a5387773319e
BLAKE2b-256 626ce74b0273f6343ecd6b73d030aeb8116badedd9cda3720f0bb44087eeb596

See more details on using hashes here.

File details

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

File metadata

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

File hashes

Hashes for ruff-0.1.11-py3-none-musllinux_1_2_i686.whl
Algorithm Hash digest
SHA256 190a566c8f766c37074d99640cd9ca3da11d8deae2deae7c9505e68a4a30f740
MD5 50276e5dc1dadb358c52657b02fa149b
BLAKE2b-256 3fdd63795c0e8b59f5da4d98583eca79a87a8a9b028603fc43a9744debafc3cd

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.1.11-py3-none-musllinux_1_2_armv7l.whl
Algorithm Hash digest
SHA256 0f58948c6d212a6b8d41cd59e349751018797ce1727f961c2fa755ad6208ba45
MD5 ff1195f654e516ed5cf435e09732b611
BLAKE2b-256 debb75627e0294174b8d8e220ade1ea7a6c23c421874b9aceb5aaa80e4f85428

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.1.11-py3-none-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 09c415716884950080921dd6237767e52e227e397e2008e2bed410117679975b
MD5 7fe532974ca5c2705a147a892a22c0ab
BLAKE2b-256 5187dc59414f9ffa23c68b53b44494e8fb996f0f967b41f9470bff1e5472daba

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.1.11-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 231d8fb11b2cc7c0366a326a66dafc6ad449d7fcdbc268497ee47e1334f66f77
MD5 60bbf3adad1c9b3358dfd4709cf58352
BLAKE2b-256 462704785edd5c57eb11b9348287278b796a901969f019adb203ec6b8d411b94

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.1.11-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl
Algorithm Hash digest
SHA256 5b25093dad3b055667730a9b491129c42d45e11cdb7043b702e97125bcec48a1
MD5 40cb4a54d8f4228777a397443387effa
BLAKE2b-256 1fb82a995fd93945a47f8184b37349864d7b4c39c1b72c06901018d5ec32100a

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.1.11-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl
Algorithm Hash digest
SHA256 c4a88efecec23c37b11076fe676e15c6cdb1271a38f2b415e381e87fe4517f18
MD5 8b9958d3c9e395f98d1ca402b5cd7fc7
BLAKE2b-256 e73c9418a9ebf8b578127672670aeda967f28cedfea3145023be3281c92ae4b3

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.1.11-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl
Algorithm Hash digest
SHA256 4b077ce83f47dd6bea1991af08b140e8b8339f0ba8cb9b7a484c30ebab18a23f
MD5 35e9d48355e818da93e5c9c1a111de92
BLAKE2b-256 8df9d96520fa3a484a0359e1fce0794c035621435993c2064eab0c0a75a23341

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.1.11-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 e1ad00662305dcb1e987f5ec214d31f7d6a062cae3e74c1cbccef15afd96611d
MD5 79ffa736942e860660405bad5b8d6090
BLAKE2b-256 45d5fa7664f40068840ee16d2d1304d6da6021a5d501cb0fc6a8295699c5cf94

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.1.11-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl
Algorithm Hash digest
SHA256 9bd4025b9c5b429a48280785a2b71d479798a69f5c2919e7d274c5f4b32c3607
MD5 8a9b65cc03ba58190fdcd870e925cd8b
BLAKE2b-256 190ffcf53815605514a57a60d66686e2bc9144df1055b1b146a630f7681df0ae

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.1.11-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 ea0d3e950e394c4b332bcdd112aa566010a9f9c95814844a7468325290aabfd9
MD5 bec64be730e86009e14cd77c5b3223cd
BLAKE2b-256 b7eae16021ecc7f91ccd566ef8196d99fb671a0cb2f677fc626239e1f465fbc0

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.1.11-py3-none-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 934832f6ed9b34a7d5feea58972635c2039c7a3b434fe5ba2ce015064cb6e955
MD5 082694dd4c1751c07c7686c2e894905e
BLAKE2b-256 f1733ce8bc3781b63e704589ea950842e01bb7fc84b524d9d1806392d4d39cf9

See more details on using hashes here.

File details

Details for the file ruff-0.1.11-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.11-py3-none-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl
Algorithm Hash digest
SHA256 a7f772696b4cdc0a3b2e527fc3c7ccc41cdcb98f5c80fdd4f2b8c50eb1458196
MD5 ce3921d32a25d87f961a89b7493055c5
BLAKE2b-256 e7a6f0e37c389eaa569547a4bd37a81b3fa9f809931aace6323ead201eae45cc

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