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.5
  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.5

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

Uploaded Python 3Windows ARM64

ruff-0.1.5-py3-none-win_amd64.whl (6.2 MB view details)

Uploaded Python 3Windows x86-64

ruff-0.1.5-py3-none-win32.whl (5.8 MB view details)

Uploaded Python 3Windows x86

ruff-0.1.5-py3-none-musllinux_1_2_x86_64.whl (6.3 MB view details)

Uploaded Python 3musllinux: musl 1.2+ x86-64

ruff-0.1.5-py3-none-musllinux_1_2_i686.whl (5.9 MB view details)

Uploaded Python 3musllinux: musl 1.2+ i686

ruff-0.1.5-py3-none-musllinux_1_2_armv7l.whl (5.6 MB view details)

Uploaded Python 3musllinux: musl 1.2+ ARMv7l

ruff-0.1.5-py3-none-musllinux_1_2_aarch64.whl (5.8 MB view details)

Uploaded Python 3musllinux: musl 1.2+ ARM64

ruff-0.1.5-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (6.3 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ x86-64

ruff-0.1.5-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl (7.6 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ s390x

ruff-0.1.5-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl (6.6 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ ppc64le

ruff-0.1.5-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl (6.7 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ ppc64

ruff-0.1.5-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl (6.0 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ i686

ruff-0.1.5-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl (5.6 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ ARMv7l

ruff-0.1.5-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (5.9 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ ARM64

ruff-0.1.5-py3-none-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl (11.6 MB view details)

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

ruff-0.1.5-py3-none-macosx_10_7_x86_64.whl (6.0 MB view details)

Uploaded Python 3macOS 10.7+ x86-64

File details

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

File metadata

  • Download URL: ruff-0.1.5.tar.gz
  • Upload date:
  • Size: 1.7 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.5.tar.gz
Algorithm Hash digest
SHA256 5cbec0ef2ae1748fb194f420fb03fb2c25c3258c86129af7172ff8f198f125ab
MD5 04fef989ed55d667cc0af6392c1f4933
BLAKE2b-256 e7f90453128f11c9ec0ec48ea125237634be3a1b8c4835282ab648373d8e6ff2

See more details on using hashes here.

File details

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

File metadata

  • Download URL: ruff-0.1.5-py3-none-win_arm64.whl
  • Upload date:
  • Size: 5.9 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.5-py3-none-win_arm64.whl
Algorithm Hash digest
SHA256 82bfcb9927e88c1ed50f49ac6c9728dab3ea451212693fe40d08d314663e412f
MD5 433b60145c5c4195f488627e73a345d5
BLAKE2b-256 2e07648e71f330cac7954268df52ad72196a6dc18a60b263af73577641c7ac25

See more details on using hashes here.

File details

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

File metadata

  • Download URL: ruff-0.1.5-py3-none-win_amd64.whl
  • Upload date:
  • Size: 6.2 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.5-py3-none-win_amd64.whl
Algorithm Hash digest
SHA256 c21fe20ee7d76206d290a76271c1af7a5096bc4c73ab9383ed2ad35f852a0087
MD5 4b8098a72d71d78d08509cd82f810b98
BLAKE2b-256 8854549cff12b6e98e873fcb5b4cf85418c5f8ca53d473f2084dd5616695e925

See more details on using hashes here.

File details

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

File metadata

  • Download URL: ruff-0.1.5-py3-none-win32.whl
  • Upload date:
  • Size: 5.8 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.5-py3-none-win32.whl
Algorithm Hash digest
SHA256 f80c73bba6bc69e4fdc73b3991db0b546ce641bdcd5b07210b8ad6f64c79f1ab
MD5 c11a7e3c83586feffe088619c4cd6f7b
BLAKE2b-256 fbf1f50c6ee75d53df3f763eb067213d2411a9d8fcc98740a84bc88c7c00aea9

See more details on using hashes here.

File details

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

File metadata

  • Download URL: ruff-0.1.5-py3-none-musllinux_1_2_x86_64.whl
  • Upload date:
  • Size: 6.3 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.5-py3-none-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 721f4b9d3b4161df8dc9f09aa8562e39d14e55a4dbaa451a8e55bdc9590e20f4
MD5 9151c6fe1881600d5975c52c991630dd
BLAKE2b-256 75d1018dc8535a3c2083e888b9ad32169dccca5ebd486d4fc30e29e1c488334e

See more details on using hashes here.

File details

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

File metadata

  • Download URL: ruff-0.1.5-py3-none-musllinux_1_2_i686.whl
  • Upload date:
  • Size: 5.9 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.5-py3-none-musllinux_1_2_i686.whl
Algorithm Hash digest
SHA256 9b97fd6da44d6cceb188147b68db69a5741fbc736465b5cea3928fdac0bc1aeb
MD5 6b8f1b829b98f57ae3259ab1d77b7d81
BLAKE2b-256 a17340b0188a03de86b24909e665274c8bc667c609c4f0a775fcc324fd5a23b5

See more details on using hashes here.

File details

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

File metadata

  • Download URL: ruff-0.1.5-py3-none-musllinux_1_2_armv7l.whl
  • Upload date:
  • Size: 5.6 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.5-py3-none-musllinux_1_2_armv7l.whl
Algorithm Hash digest
SHA256 fa29e67b3284b9a79b1a85ee66e293a94ac6b7bb068b307a8a373c3d343aa8ec
MD5 ca84985781501162dee22c850b3ac827
BLAKE2b-256 d12b3a25a022bff4114206fa52c071275ee2b97aa7be7aad9559f60f6b96db39

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.1.5-py3-none-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 a8c11206b47f283cbda399a654fd0178d7a389e631f19f51da15cbe631480c5b
MD5 e514b504e49aa955a4929276ba480d38
BLAKE2b-256 59e84839e31304c9a030fb04ae0c304c488b0bd942d3589f8314e86901138fed

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.1.5-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 a00a7ec893f665ed60008c70fe9eeb58d210e6b4d83ec6654a9904871f982a2a
MD5 732538036815c0aad187be3024485333
BLAKE2b-256 aecf95e9a2930c1a220fb2c5769d746901eea4576cc46f1200f0178a42a863ba

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.1.5-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl
Algorithm Hash digest
SHA256 a4894dddb476597a0ba4473d72a23151b8b3b0b5f958f2cf4d3f1c572cdb7af7
MD5 84ee1f1880c3ee5c81f514dd5da38ed9
BLAKE2b-256 66214b5bbf5cb3b9d5d1213f345eb932db0c94471d5000d602b80e2ee967c853

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.1.5-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl
Algorithm Hash digest
SHA256 aafb9d2b671ed934998e881e2c0f5845a4295e84e719359c71c39a5363cccc91
MD5 862fa860fe6a33cf916913c24d51e4c3
BLAKE2b-256 54db834a231e191517b0d7911147fbcb92a2206c9f74d43dd23870d81849c5fc

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.1.5-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl
Algorithm Hash digest
SHA256 f20dc5e5905ddb407060ca27267c7174f532375c08076d1a953cf7bb016f5a24
MD5 12f7ebb35f18005eda57f39f1a0ed670
BLAKE2b-256 28fd53511e2a3cd5627706e34572e9af0f61e645126d90995f1e2071364aefb2

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.1.5-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 bb408e3a2ad8f6881d0f2e7ad70cddb3ed9f200eb3517a91a245bbe27101d379
MD5 cff9e139fd0e2ab8559793aa77fde4d2
BLAKE2b-256 799dd057e791cebac3e9af27fa4b3c78daf09c7ff35a344943c0d1dd25155cc4

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.1.5-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl
Algorithm Hash digest
SHA256 b2c205827b3f8c13b4a432e9585750b93fd907986fe1aec62b2a02cf4401eee6
MD5 5eff7d746934bc8d5411fddd5332c9bc
BLAKE2b-256 81b6bd72889302e8503bfa87d190afbb6f6c7ac1345d680071e990328929c359

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.1.5-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 17ef33cd0bb7316ca65649fc748acc1406dfa4da96a3d0cde6d52f2e866c7b39
MD5 5baabc7944f49636653a70bbe1068272
BLAKE2b-256 dc2ec7f7e235fd12543ddd9f8218d59ee4b017a504d43b6a5584eebe96410ff3

See more details on using hashes here.

File details

Details for the file ruff-0.1.5-py3-none-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl.

File metadata

File hashes

Hashes for ruff-0.1.5-py3-none-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl
Algorithm Hash digest
SHA256 171276c1df6c07fa0597fb946139ced1c2978f4f0b8254f201281729981f3c17
MD5 31d0c13f482e9c8e8c2af4b2f4b08bcf
BLAKE2b-256 a12eacf77283eb23154ed2220c70d84018a179267c58b63fa944938d0f599892

See more details on using hashes here.

File details

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

File metadata

  • Download URL: ruff-0.1.5-py3-none-macosx_10_7_x86_64.whl
  • Upload date:
  • Size: 6.0 MB
  • Tags: Python 3, macOS 10.7+ x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/4.0.2 CPython/3.11.6

File hashes

Hashes for ruff-0.1.5-py3-none-macosx_10_7_x86_64.whl
Algorithm Hash digest
SHA256 32d47fc69261c21a4c48916f16ca272bf2f273eb635d91c65d5cd548bf1f3d96
MD5 ac1bbd8f4d7fed4c48bd700acc182b51
BLAKE2b-256 59e18267e29a09b59df28b4472ae4807d8db60b8e9672c5acf343e1eedc97330

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