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

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

Uploaded Python 3Windows ARM64

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

Uploaded Python 3Windows x86-64

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

Uploaded Python 3Windows x86

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

Uploaded Python 3musllinux: musl 1.2+ x86-64

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

Uploaded Python 3musllinux: musl 1.2+ i686

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

Uploaded Python 3musllinux: musl 1.2+ ARMv7l

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

Uploaded Python 3musllinux: musl 1.2+ ARM64

ruff-0.1.6-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.6-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl (7.7 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ s390x

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

Uploaded Python 3manylinux: glibc 2.17+ ppc64le

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

Uploaded Python 3manylinux: glibc 2.17+ ppc64

ruff-0.1.6-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl (6.1 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ i686

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

Uploaded Python 3manylinux: glibc 2.17+ ARMv7l

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

Uploaded Python 3manylinux: glibc 2.17+ ARM64

ruff-0.1.6-py3-none-macosx_10_12_x86_64.whl (6.0 MB view details)

Uploaded Python 3macOS 10.12+ x86-64

ruff-0.1.6-py3-none-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl (11.6 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.6.tar.gz.

File metadata

  • Download URL: ruff-0.1.6.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.6.tar.gz
Algorithm Hash digest
SHA256 1b09f29b16c6ead5ea6b097ef2764b42372aebe363722f1605ecbcd2b9207184
MD5 b19348d46d215a67892f76e841577cfc
BLAKE2b-256 254c2f786388acd82c295eedc4afeede7ef4b29cf27277151d8d13be906bac70

See more details on using hashes here.

File details

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

File metadata

  • Download URL: ruff-0.1.6-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.6-py3-none-win_arm64.whl
Algorithm Hash digest
SHA256 03910e81df0d8db0e30050725a5802441c2022ea3ae4fe0609b76081731accbc
MD5 e946fcc5c20a0662fe6498c83c50b312
BLAKE2b-256 21f7fdce733e594e1b274fc9232256be6a4e03e8d2cb9e354c783801191e2f4d

See more details on using hashes here.

File details

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

File metadata

  • Download URL: ruff-0.1.6-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.6-py3-none-win_amd64.whl
Algorithm Hash digest
SHA256 4558b3e178145491e9bc3b2ee3c4b42f19d19384eaa5c59d10acf6e8f8b57e33
MD5 2159214efb6dfda86bba6a7454c98ea9
BLAKE2b-256 40e355ae013087bd892dd61c25895a119ffec2f9b9f7c3d1fd0cea5f5f7bd74a

See more details on using hashes here.

File details

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

File metadata

  • Download URL: ruff-0.1.6-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.6-py3-none-win32.whl
Algorithm Hash digest
SHA256 1610e14750826dfc207ccbcdd7331b6bd285607d4181df9c1c6ae26646d6848a
MD5 5d132178181bad0a004e8b9a5e218caf
BLAKE2b-256 fc938a4b3523c4564168aab720d8361b4bf12173b099509caaac93168b72927a

See more details on using hashes here.

File details

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

File metadata

  • Download URL: ruff-0.1.6-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.6-py3-none-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 ea284789861b8b5ca9d5443591a92a397ac183d4351882ab52f6296b4fdd5462
MD5 1b8eb3a0264cb5c4767cc08f566e6b3a
BLAKE2b-256 11023a7e3101d88b113f326e0fdf3f566fba2600fc4b1fd828d56027d293e22d

See more details on using hashes here.

File details

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

File metadata

  • Download URL: ruff-0.1.6-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.6-py3-none-musllinux_1_2_i686.whl
Algorithm Hash digest
SHA256 491262006e92f825b145cd1e52948073c56560243b55fb3b4ecb142f6f0e9543
MD5 a984943db75522a59f3660349b17f042
BLAKE2b-256 81b092c4cb6bceb19ebd27cedd1f45b337f7fd5397e6b760094831266be59661

See more details on using hashes here.

File details

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

File metadata

  • Download URL: ruff-0.1.6-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.6-py3-none-musllinux_1_2_armv7l.whl
Algorithm Hash digest
SHA256 fd89b45d374935829134a082617954120d7a1470a9f0ec0e7f3ead983edc48cc
MD5 735dcfb4beda6bba274750bcc2079d90
BLAKE2b-256 bfaf25b794e750f1d74a83ce6b16625e3306beeb2161c517b9d883958de05526

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.1.6-py3-none-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 e8fd1c62a47aa88a02707b5dd20c5ff20d035d634aa74826b42a1da77861b5ff
MD5 a9163b19740269298aa78786e55313ae
BLAKE2b-256 3c4baf366db98d15efe83fd3e3aae7319d3897e3475fc53a2f1b0287c8255422

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.1.6-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 3a0cd909d25f227ac5c36d4e7e681577275fb74ba3b11d288aff7ec47e3ae745
MD5 0fd1f8313e70aead2ddc41dcecfa8b8b
BLAKE2b-256 3b2f8ef67614631622aa3ea79b27e01ac86d7f90a988520454e3a84cb2fd890f

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.1.6-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl
Algorithm Hash digest
SHA256 bd98138a98d48a1c36c394fd6b84cd943ac92a08278aa8ac8c0fdefcf7138f35
MD5 e917df424fc5f75b4fdeb846a1905eef
BLAKE2b-256 099236850598e84f75cfe8edd252dbf40442b4cc226ed2c76206a9b3cbfb9986

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.1.6-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl
Algorithm Hash digest
SHA256 137852105586dcbf80c1717facb6781555c4e99f520c9c827bd414fac67ddfb6
MD5 e8fc50e939db773e5b0375dece7397f8
BLAKE2b-256 c7f160d43182f98113156a1b21a17f30541dda9f5ffcfeedc2b54dc030a2c413

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.1.6-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl
Algorithm Hash digest
SHA256 683aa5bdda5a48cb8266fcde8eea2a6af4e5700a392c56ea5fb5f0d4bfdc0240
MD5 e5d65373009dbf97ea3d031a7292e853
BLAKE2b-256 e83362fb966eb70d9bb45ddf5023d40e26946a5e5127d99956b84c8a9a76b153

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.1.6-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 87455a0c1f739b3c069e2f4c43b66479a54dea0276dd5d4d67b091265f6fd1dc
MD5 01f5580e4e42afb69a1fe2fcb6d75cdd
BLAKE2b-256 c7c398e3d0eb92e5a2ec10f76c71067640b6f21def23c3b1ff8f08ab6348255e

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.1.6-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl
Algorithm Hash digest
SHA256 05991ee20d4ac4bb78385360c684e4b417edd971030ab12a4fbd075ff535050e
MD5 6e940977373beeba2db771aaaf7e91a2
BLAKE2b-256 927c38fd1b9cb624f5725a6a08c81bf7e823c64b28622ffcb4369c56dc0a16d0

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.1.6-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 1cf5f701062e294f2167e66d11b092bba7af6a057668ed618a9253e1e90cfd76
MD5 eb5de344056e5cba4caf66a6f5481a27
BLAKE2b-256 df1e03ef0cc5c7d03e50d4f954218551d6001f1f70e6f391cdb678efb5c6e6ab

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.1.6-py3-none-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 5c549ed437680b6105a1299d2cd30e4964211606eeb48a0ff7a93ef70b902248
MD5 9ab43ec34aa945d9a057bd9149b106e0
BLAKE2b-256 a2918b2920f6026c069ae0802fc3c44f7337e04bf2a198ce94bfab360073477a

See more details on using hashes here.

File details

Details for the file ruff-0.1.6-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.6-py3-none-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl
Algorithm Hash digest
SHA256 88b8cdf6abf98130991cbc9f6438f35f6e8d41a02622cc5ee130a02a0ed28703
MD5 2e72081266363b68cfb468501d3bfbf2
BLAKE2b-256 b6755054ec93ec0d5db26e218cb2814ddaa085ba1f29fad0ec56dd8107a97688

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