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

Uploaded Python 3Windows ARM64

ruff-0.1.8-py3-none-win_amd64.whl (6.4 MB view details)

Uploaded Python 3Windows x86-64

ruff-0.1.8-py3-none-win32.whl (6.0 MB view details)

Uploaded Python 3Windows x86

ruff-0.1.8-py3-none-musllinux_1_2_x86_64.whl (6.5 MB view details)

Uploaded Python 3musllinux: musl 1.2+ x86-64

ruff-0.1.8-py3-none-musllinux_1_2_i686.whl (6.1 MB view details)

Uploaded Python 3musllinux: musl 1.2+ i686

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

Uploaded Python 3musllinux: musl 1.2+ ARMv7l

ruff-0.1.8-py3-none-musllinux_1_2_aarch64.whl (6.0 MB view details)

Uploaded Python 3musllinux: musl 1.2+ ARM64

ruff-0.1.8-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.8-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl (7.9 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ s390x

ruff-0.1.8-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl (6.8 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ ppc64le

ruff-0.1.8-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl (6.9 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ ppc64

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

Uploaded Python 3manylinux: glibc 2.17+ i686

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

Uploaded Python 3manylinux: glibc 2.17+ ARMv7l

ruff-0.1.8-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (6.1 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ ARM64

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

Uploaded Python 3macOS 10.12+ x86-64

ruff-0.1.8-py3-none-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl (11.9 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.8.tar.gz.

File metadata

  • Download URL: ruff-0.1.8.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.8.tar.gz
Algorithm Hash digest
SHA256 f7ee467677467526cfe135eab86a40a0e8db43117936ac4f9b469ce9cdb3fb62
MD5 ffa661fc6425734c3eed63030cde784c
BLAKE2b-256 50a9ec05a652115645c76cc61b8df95a410fe9e30c858d36bbad305010f292ff

See more details on using hashes here.

File details

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

File metadata

  • Download URL: ruff-0.1.8-py3-none-win_arm64.whl
  • Upload date:
  • Size: 6.1 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.8-py3-none-win_arm64.whl
Algorithm Hash digest
SHA256 aa8ee4f8440023b0a6c3707f76cadce8657553655dcbb5fc9b2f9bb9bee389f6
MD5 cb28d84a008abb2e03b59d514cead0ce
BLAKE2b-256 f2b5142307cffba5033b35efd0d6c7f2b52b442ef7a6fdd6d92cf6f3fc385cb2

See more details on using hashes here.

File details

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

File metadata

  • Download URL: ruff-0.1.8-py3-none-win_amd64.whl
  • Upload date:
  • Size: 6.4 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.8-py3-none-win_amd64.whl
Algorithm Hash digest
SHA256 f41f692f1691ad87f51708b823af4bb2c5c87c9248ddd3191c8f088e66ce590a
MD5 a233b68526127cb06f48f8c953eae64b
BLAKE2b-256 100af5c0a22c3d8ac86d9481b4c3dc86f4c722ce9c544c68d9382afd46cefb06

See more details on using hashes here.

File details

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

File metadata

  • Download URL: ruff-0.1.8-py3-none-win32.whl
  • Upload date:
  • Size: 6.0 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.8-py3-none-win32.whl
Algorithm Hash digest
SHA256 e49fbdfe257fa41e5c9e13c79b9e79a23a79bd0e40b9314bc53840f520c2c0b3
MD5 972d699abfa6ed31cea1b71c88538c2b
BLAKE2b-256 f4ff3ad7a399660b308d662ecc6444749f2f97034ecc0bdf8def8a73444d8fe5

See more details on using hashes here.

File details

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

File metadata

  • Download URL: ruff-0.1.8-py3-none-musllinux_1_2_x86_64.whl
  • Upload date:
  • Size: 6.5 MB
  • Tags: Python 3, musllinux: musl 1.2+ x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/4.0.2 CPython/3.11.7

File hashes

Hashes for ruff-0.1.8-py3-none-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 5daaeaf00ae3c1efec9742ff294b06c3a2a9db8d3db51ee4851c12ad385cda30
MD5 91f08c4baf3162143d8080d4b64ea7dc
BLAKE2b-256 45b8ff1793ecb053962d14411712c6630188a0780f56d92220ce298dcfa74549

See more details on using hashes here.

File details

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

File metadata

  • Download URL: ruff-0.1.8-py3-none-musllinux_1_2_i686.whl
  • Upload date:
  • Size: 6.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.8-py3-none-musllinux_1_2_i686.whl
Algorithm Hash digest
SHA256 05ffe9dbd278965271252704eddb97b4384bf58b971054d517decfbf8c523f05
MD5 c2d37b5f63c8478770d20fedafd99c95
BLAKE2b-256 ca4945b19fd2e0fbc8881ae11fb81f02698efd3944060b7559ee0abeb29253ab

See more details on using hashes here.

File details

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

File metadata

  • Download URL: ruff-0.1.8-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.7

File hashes

Hashes for ruff-0.1.8-py3-none-musllinux_1_2_armv7l.whl
Algorithm Hash digest
SHA256 db6cedd9ffed55548ab313ad718bc34582d394e27a7875b4b952c2d29c001b26
MD5 048ecb3a7f2a4c71b32b78b8227b915a
BLAKE2b-256 878eca2b39d435121c69ec3fa44704bf538d4337a92cf1684cdec47e37bed929

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.1.8-py3-none-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 ce697c463458555027dfb194cb96d26608abab920fa85213deb5edf26e026664
MD5 1f1cbd7f5506327679c891cb73513ac7
BLAKE2b-256 4169267b517c494c193a0eea5d06ce9bec089cebe4d146a04f04fcfcb3d9f41d

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.1.8-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 b6a21ab023124eafb7cef6d038f835cb1155cd5ea798edd8d9eb2f8b84be07d9
MD5 66e6ae5646aeecf72a0739c352b8edf1
BLAKE2b-256 212d64aeb4dc019b78866a657e395c1d4a8445690fde792a5e70f2694effaef0

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.1.8-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl
Algorithm Hash digest
SHA256 7d076717c67b34c162da7c1a5bda16ffc205e0e0072c03745275e7eab888719f
MD5 6bf28f6cbfa23963b38c2019c4353df4
BLAKE2b-256 724a6b86bc7923361d5ee4be0c62642660c43492a58f4ba46c6527e6b194c475

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.1.8-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl
Algorithm Hash digest
SHA256 f35960b02df6b827c1b903091bb14f4b003f6cf102705efc4ce78132a0aa5af3
MD5 76d5cd1acd2cc419c3347fb1128e0b24
BLAKE2b-256 6783fea0fc59c54e340aa512f4e2f1ec9b6ebfddcade0f416e93f67b1bcbeeba

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.1.8-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl
Algorithm Hash digest
SHA256 e6f08ca730f4dc1b76b473bdf30b1b37d42da379202a059eae54ec7fc1fbcfed
MD5 bb034f1c2cce47349a07542b15f63b80
BLAKE2b-256 29f935dc0a9cef5cbc09db73da372c52c9a282b6e16ae4c30dce7b171b27eb64

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.1.8-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 a05b0ddd7ea25495e4115a43125e8a7ebed0aa043c3d432de7e7d6e8e8cd6448
MD5 df01360592457e405f5e71ab72158cdd
BLAKE2b-256 fadc9c80f9ea623adfe186f19136186a1b5fb8f6aedd389b627fc68729ce27ba

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.1.8-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl
Algorithm Hash digest
SHA256 bd8ee69b02e7bdefe1e5da2d5b6eaaddcf4f90859f00281b2333c0e3a0cc9cd6
MD5 908e209f9313074f7f0b2ea30562c616
BLAKE2b-256 a132449041d032be73561c7d94cfcd9e0e04c308abc3e290b4236e6a3c414ed6

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.1.8-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 ff78a7583020da124dd0deb835ece1d87bb91762d40c514ee9b67a087940528b
MD5 1c50d9cfdd7c9215fe534af8edd7848d
BLAKE2b-256 38d31959c76f38a283d7662271f51da166f875a5fc3765fc5646005ec1544417

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.1.8-py3-none-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 c8e3255afd186c142eef4ec400d7826134f028a85da2146102a1172ecc7c3696
MD5 bc41160060e0a75dba79012bebdbde20
BLAKE2b-256 4bbb2379f069bc51530bb625423f2ebc694db542a123a1132e26e2142e532bea

See more details on using hashes here.

File details

Details for the file ruff-0.1.8-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.8-py3-none-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl
Algorithm Hash digest
SHA256 7de792582f6e490ae6aef36a58d85df9f7a0cfd1b0d4fe6b4fb51803a3ac96fa
MD5 110a29d88a8cebf1ce5ca130cab48728
BLAKE2b-256 daf5c09835322bc9010849f579aa62df1a286508e4288cf39e0622546b113f4b

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