[go: up one dir, main page]

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

Uploaded Python 3Windows ARM64

ruff-0.1.14-py3-none-win_amd64.whl (7.3 MB view details)

Uploaded Python 3Windows x86-64

ruff-0.1.14-py3-none-win32.whl (6.7 MB view details)

Uploaded Python 3Windows x86

ruff-0.1.14-py3-none-musllinux_1_2_x86_64.whl (7.6 MB view details)

Uploaded Python 3musllinux: musl 1.2+ x86-64

ruff-0.1.14-py3-none-musllinux_1_2_i686.whl (7.2 MB view details)

Uploaded Python 3musllinux: musl 1.2+ i686

ruff-0.1.14-py3-none-musllinux_1_2_armv7l.whl (6.5 MB view details)

Uploaded Python 3musllinux: musl 1.2+ ARMv7l

ruff-0.1.14-py3-none-musllinux_1_2_aarch64.whl (7.0 MB view details)

Uploaded Python 3musllinux: musl 1.2+ ARM64

ruff-0.1.14-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (7.5 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ x86-64

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

Uploaded Python 3manylinux: glibc 2.17+ s390x

ruff-0.1.14-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl (7.9 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ ppc64le

ruff-0.1.14-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl (8.2 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ ppc64

ruff-0.1.14-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl (7.5 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ i686

ruff-0.1.14-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl (6.5 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ ARMv7l

ruff-0.1.14-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (7.1 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ ARM64

ruff-0.1.14-py3-none-macosx_10_12_x86_64.whl (7.3 MB view details)

Uploaded Python 3macOS 10.12+ x86-64

ruff-0.1.14-py3-none-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl (14.4 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.14.tar.gz.

File metadata

  • Download URL: ruff-0.1.14.tar.gz
  • Upload date:
  • Size: 2.0 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.14.tar.gz
Algorithm Hash digest
SHA256 ad3f8088b2dfd884820289a06ab718cde7d38b94972212cc4ba90d5fbc9955f3
MD5 b993876eeaeaf1379326799082d7a1da
BLAKE2b-256 5c76f1fbd0a6625d1f3044854b540642171acd02bd91c592001aac9f9606474c

See more details on using hashes here.

File details

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

File metadata

  • Download URL: ruff-0.1.14-py3-none-win_arm64.whl
  • Upload date:
  • Size: 7.0 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.14-py3-none-win_arm64.whl
Algorithm Hash digest
SHA256 269302b31ade4cde6cf6f9dd58ea593773a37ed3f7b97e793c8594b262466b67
MD5 3e9af22f8846948df960e82603d2df7f
BLAKE2b-256 22e5ca6754d8a32a5a9e061d78d7c1491ec0c01f64b36125a6a27e2c5bf4f109

See more details on using hashes here.

File details

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

File metadata

  • Download URL: ruff-0.1.14-py3-none-win_amd64.whl
  • Upload date:
  • Size: 7.3 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.14-py3-none-win_amd64.whl
Algorithm Hash digest
SHA256 e3d241aa61f92b0805a7082bd89a9990826448e4d0398f0e2bc8f05c75c63d99
MD5 b4fe540d25feedd293144593f046acb4
BLAKE2b-256 5b72bee209a32ef942bd884a80582de467d9cae98f8db0756c014dda16659541

See more details on using hashes here.

File details

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

File metadata

  • Download URL: ruff-0.1.14-py3-none-win32.whl
  • Upload date:
  • Size: 6.7 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.14-py3-none-win32.whl
Algorithm Hash digest
SHA256 722bafc299145575a63bbd6b5069cb643eaa62546a5b6398f82b3e4403329cab
MD5 5a16ee7a73396a347c6a56c81d1c5de9
BLAKE2b-256 86d97412e381f1d17e1438c2f513d4ff36dc6b5df3a1a62cb146d00017e9a54e

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.1.14-py3-none-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 b2027dde79d217b211d725fc833e8965dc90a16d0d3213f1298f97465956661b
MD5 eed450f90f1134f4e18a79c5185ac034
BLAKE2b-256 2cb02d296522922a4d2f55ecf9ad496dee134bcffe29a72a8c0fefe738a82ea9

See more details on using hashes here.

File details

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

File metadata

  • Download URL: ruff-0.1.14-py3-none-musllinux_1_2_i686.whl
  • Upload date:
  • Size: 7.2 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.14-py3-none-musllinux_1_2_i686.whl
Algorithm Hash digest
SHA256 62ce2ae46303ee896fc6811f63d6dabf8d9c389da0f3e3f2bce8bc7f15ef5488
MD5 5103c6f057eb659e85a740e8b74b944a
BLAKE2b-256 e93fc701e4fe507fc72900c6d72f797ab5f0b8cd3e5c32b8d1645a5e1c5f9b8e

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.1.14-py3-none-musllinux_1_2_armv7l.whl
Algorithm Hash digest
SHA256 1c8eca1a47b4150dc0fbec7fe68fc91c695aed798532a18dbb1424e61e9b721f
MD5 1bd2ef106ce4a1886a1b02ff91795be4
BLAKE2b-256 bff78a1436adeb00f7942dbd7645c26921654cdb938024fb249eb959c5446907

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.1.14-py3-none-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 6b3dadc9522d0eccc060699a9816e8127b27addbb4697fc0c08611e4e6aeb8b5
MD5 07435514930cf6b963585401fe1c597a
BLAKE2b-256 c09af007e17874498e92ed28a85878d801b03c7ce3affb8a7dbfb1013b98eee9

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.1.14-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 87b3acc6c4e6928459ba9eb7459dd4f0c4bf266a053c863d72a44c33246bfdbf
MD5 042d23b1ca158380d8561d79648476fb
BLAKE2b-256 8d57936030481a19d95a4a3171b259c8c81e224e6c7eabf1c6fbdb1479704548

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.1.14-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl
Algorithm Hash digest
SHA256 653230dd00aaf449eb5ff25d10a6e03bc3006813e2cb99799e568f55482e5cae
MD5 c5fa585f2831d7dd687fbf9e14f27a78
BLAKE2b-256 19639b4a6e3ffbc54f5a240755bfb407e3b9a30efe2b4f1f76aa9d4c0db93a91

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.1.14-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl
Algorithm Hash digest
SHA256 80258bb3b8909b1700610dfabef7876423eed1bc930fe177c71c414921898efa
MD5 57c327480dfe198e38c1287de2dc588c
BLAKE2b-256 7bdcc16b4db432d8f5250e0cc50d0ffcf1ab0ba7484933e24c84165af9e23706

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.1.14-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl
Algorithm Hash digest
SHA256 2270504d629a0b064247983cbc495bed277f372fb9eaba41e5cf51f7ba705a6a
MD5 6cddaeee8ab12314907f72bbc1ad0f8f
BLAKE2b-256 4a6c272fb422375572e9a005baacfa8949c1a2c4445c972974c96dc7f8e5b186

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.1.14-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 bea9be712b8f5b4ebed40e1949379cfb2a7d907f42921cf9ab3aae07e6fba9eb
MD5 3063d230a4c850b9ac52f4b749ec57f9
BLAKE2b-256 0287f474a50ddde6bb7cd6aeaf97c3368d68aefd112f9475cf3f1c51e27175ab

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.1.14-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl
Algorithm Hash digest
SHA256 a53d8e35313d7b67eb3db15a66c08434809107659226a90dcd7acb2afa55faea
MD5 2033cea55fd5408fa9662c8f536a1bad
BLAKE2b-256 d2c16673c34a491176cb93f9c1c49fbff0281981e3ca6814ba8bbb2e0def5a68

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.1.14-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 7060156ecc572b8f984fd20fd8b0fcb692dd5d837b7606e968334ab7ff0090ab
MD5 4f25f9941f5ca85d476da55a0f747a57
BLAKE2b-256 cf6b152672e4a5b990aa0796377348d40729cad51644bf94d72f46e606461f41

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.1.14-py3-none-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 ab3f71f64498c7241123bb5a768544cf42821d2a537f894b22457a543d3ca7a9
MD5 9524c49e6b9a4c7990511aa6e6afcaee
BLAKE2b-256 60f8d579ca257d26a5e6cc309298698340720e52115774253a73946182f106fa

See more details on using hashes here.

File details

Details for the file ruff-0.1.14-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.14-py3-none-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl
Algorithm Hash digest
SHA256 96f76536df9b26622755c12ed8680f159817be2f725c17ed9305b472a757cdbb
MD5 970089f8e5e954979124d20ca55b4848
BLAKE2b-256 e97b0f9cc50fd6936f7b125f8682d6ece05826573fd5cbc9f4e40ddd9e2175cb

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