Skip to main content

An extremely fast Python linter, written in Rust.

Project description

Ruff

Ruff image image image Actions status

Discord | Docs | Playground

An extremely fast Python linter, written in Rust.

Shows a bar chart with benchmark results.

Linting the CPython codebase from scratch.

  • ⚡️ 10-100x faster than existing linters
  • 🐍 Installable via pip
  • 🛠️ pyproject.toml support
  • 🤝 Python 3.11 compatibility
  • 📦 Built-in caching, to avoid re-analyzing unchanged files
  • 🔧 Autofix support, for automatic error correction (e.g., automatically remove unused imports)
  • 📏 Over 500 built-in rules
  • ⚖️ Near-parity with the built-in Flake8 rule set
  • 🔌 Native re-implementations of dozens of 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), isort, pydocstyle, yesqa, eradicate, pyupgrade, and autoflake, 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, 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 can also be used as a pre-commit hook:

- repo: https://github.com/charliermarsh/ruff-pre-commit
  # Ruff version.
  rev: 'v0.0.267'
  hooks:
    - id: ruff

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, the default configuration is equivalent to:

[tool.ruff]
# Enable pycodestyle (`E`) and Pyflakes (`F`) codes by default.
select = ["E", "F"]
ignore = []

# Allow autofix for all enabled rules (when `--fix`) is provided.
fixable = ["A", "B", "C", "D", "E", "F", "G", "I", "N", "Q", "S", "T", "W", "ANN", "ARG", "BLE", "COM", "DJ", "DTZ", "EM", "ERA", "EXE", "FBT", "ICN", "INP", "ISC", "NPY", "PD", "PGH", "PIE", "PL", "PT", "PTH", "PYI", "RET", "RSE", "RUF", "SIM", "SLF", "TCH", "TID", "TRY", "UP", "YTT"]
unfixable = []

# 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

# Allow unused variables when underscore-prefixed.
dummy-variable-rgx = "^(_+|(_+[a-zA-Z0-9_]*[a-zA-Z0-9]+?))$"

# Assume Python 3.10.
target-version = "py310"

[tool.ruff.mccabe]
# Unlike Flake8, default to a complexity level of 10.
max-complexity = 10

Some configuration options can be provided via the command-line, such as those related to rule enablement and disablement, file discovery, logging level, and more:

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 for more on the linting command.

Rules

Ruff supports over 500 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 E and F rules. Ruff supports all rules from the F category, and a subset of the E category, omitting those stylistic rules made obsolete by the use of an autoformatter, like 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 autoformatter is built on a fork of Rome's rome_formatter, and again draws on both the APIs and implementation details of Rome, Prettier, and Black.

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/charliermarsh/ruff/main/assets/badge/v2.json)](https://github.com/charliermarsh/ruff)

...or README.rst:

.. image:: https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/charliermarsh/ruff/main/assets/badge/v2.json
    :target: https://github.com/charliermarsh/ruff
    :alt: Ruff

...or, as HTML:

<a href="https://github.com/charliermarsh/ruff"><img src="https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/charliermarsh/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.0.267.tar.gz (1.1 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.0.267-py3-none-win_arm64.whl (5.3 MB view details)

Uploaded Python 3Windows ARM64

ruff-0.0.267-py3-none-win_amd64.whl (5.5 MB view details)

Uploaded Python 3Windows x86-64

ruff-0.0.267-py3-none-win32.whl (5.1 MB view details)

Uploaded Python 3Windows x86

ruff-0.0.267-py3-none-musllinux_1_2_x86_64.whl (5.6 MB view details)

Uploaded Python 3musllinux: musl 1.2+ x86-64

ruff-0.0.267-py3-none-musllinux_1_2_i686.whl (5.2 MB view details)

Uploaded Python 3musllinux: musl 1.2+ i686

ruff-0.0.267-py3-none-musllinux_1_2_armv7l.whl (4.8 MB view details)

Uploaded Python 3musllinux: musl 1.2+ ARMv7l

ruff-0.0.267-py3-none-musllinux_1_2_aarch64.whl (5.1 MB view details)

Uploaded Python 3musllinux: musl 1.2+ ARM64

ruff-0.0.267-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (5.5 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ x86-64

ruff-0.0.267-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl (6.4 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ s390x

ruff-0.0.267-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl (5.7 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ ppc64le

ruff-0.0.267-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl (5.8 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ ppc64

ruff-0.0.267-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl (5.3 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ i686

ruff-0.0.267-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl (4.8 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ ARMv7l

ruff-0.0.267-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (5.1 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ ARM64

ruff-0.0.267-py3-none-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl (10.1 MB view details)

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

ruff-0.0.267-py3-none-macosx_10_7_x86_64.whl (5.3 MB view details)

Uploaded Python 3macOS 10.7+ x86-64

File details

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

File metadata

  • Download URL: ruff-0.0.267.tar.gz
  • Upload date:
  • Size: 1.1 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.2 CPython/3.10.6

File hashes

Hashes for ruff-0.0.267.tar.gz
Algorithm Hash digest
SHA256 632cec7bbaf3c06fcf0a72a1dd029b7d8b7f424ba95a574aaa135f5d20a00af7
MD5 e9aad9a0bd8d6f5ab1131e75ba337932
BLAKE2b-256 d9daee9b62a02de95d716522095e62e7b2fb94dba13d9943e27400c59813bfb5

See more details on using hashes here.

File details

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

File metadata

  • Download URL: ruff-0.0.267-py3-none-win_arm64.whl
  • Upload date:
  • Size: 5.3 MB
  • Tags: Python 3, Windows ARM64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.2 CPython/3.10.6

File hashes

Hashes for ruff-0.0.267-py3-none-win_arm64.whl
Algorithm Hash digest
SHA256 7df7eb5f8d791566ba97cc0b144981b9c080a5b861abaf4bb35a26c8a77b83e9
MD5 fc8ebdc016271ff0560f7186ebbaac79
BLAKE2b-256 6785249e6d52ed6272cdb9785e00bd8f1f7b7ac9ed3285c42300137faabb50ae

See more details on using hashes here.

File details

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

File metadata

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

File hashes

Hashes for ruff-0.0.267-py3-none-win_amd64.whl
Algorithm Hash digest
SHA256 d09aecc9f5845586ba90911d815f9772c5a6dcf2e34be58c6017ecb124534ac4
MD5 eceb3a2710740397d2701c4927234c26
BLAKE2b-256 54e3eaa63e3a5c03613088ca00857ba4cf6e6e0e7463a183633a2083b167d02f

See more details on using hashes here.

File details

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

File metadata

  • Download URL: ruff-0.0.267-py3-none-win32.whl
  • Upload date:
  • Size: 5.1 MB
  • Tags: Python 3, Windows x86
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.2 CPython/3.10.6

File hashes

Hashes for ruff-0.0.267-py3-none-win32.whl
Algorithm Hash digest
SHA256 d12ab329474c46b96d962e2bdb92e3ad2144981fe41b89c7770f370646c0101f
MD5 8986f2044a83362a17e7fe16860dd222
BLAKE2b-256 568f0ea8e8023f2005e86d9177a250ac0bda008143e5d38f3c21301d81fc09ac

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.0.267-py3-none-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 5a898953949e37c109dd242cfcf9841e065319995ebb7cdfd213b446094a942f
MD5 2d1c9c55e212c5d634673feb90331094
BLAKE2b-256 1e6ca5a28b7c4df1316ff0ede0ce51af3a9af76b23c6f19a2d9edcd28036aa8d

See more details on using hashes here.

File details

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

File metadata

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

File hashes

Hashes for ruff-0.0.267-py3-none-musllinux_1_2_i686.whl
Algorithm Hash digest
SHA256 786de30723c71fc46b80a173c3313fc0dbe73c96bd9da8dd1212cbc2f84cdfb2
MD5 c1f564a30f9c1f6758c9d7743f10e100
BLAKE2b-256 3e52d1015fa5a13e9bd11b7a4e1147f541e52fe666b550f14e9ca1249bdc447b

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.0.267-py3-none-musllinux_1_2_armv7l.whl
Algorithm Hash digest
SHA256 2107cec3699ca4d7bd41543dc1d475c97ae3a21ea9212238b5c2088fa8ee7722
MD5 fe43a543df4d60848ee12c5583a2ffc7
BLAKE2b-256 451ef423a80da2217137ef3d287aec70d978ae71038cce92cdc61659ebb4a063

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.0.267-py3-none-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 45d61a2b01bdf61581a2ee039503a08aa603dc74a6bbe6fb5d1ce3052f5370e5
MD5 bdb882b9059ad142643b0236dd3dc308
BLAKE2b-256 5349fe3e44b5ebd9456e4e0acf79d9c0a777da59f170b7b95e2438f7e10deb15

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.0.267-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 20c594eb56c19063ef5a57f89340e64c6550e169d6a29408a45130a8c3068adc
MD5 e5b52e367a2c6660c831797ec9c0d80f
BLAKE2b-256 b83eef28832b87a177b3815c6e1fbe314498359122d671e8d80eca22a933784f

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.0.267-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl
Algorithm Hash digest
SHA256 f731d81cb939e757b0335b0090f18ca2e9ff8bcc8e6a1cf909245958949b6e11
MD5 7171d8a80c9d5638e67358b0964f70d6
BLAKE2b-256 5dba5dfcde964c63c37e825889dc706afd8641c5460a01eeb6764b2440d1ba25

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.0.267-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl
Algorithm Hash digest
SHA256 2972241065b1c911bce3db808837ed10f4f6f8a8e15520a4242d291083605ab6
MD5 e601c95fe57707d4fa37c224173ebb32
BLAKE2b-256 fa25cd00b70d749cff37dc567e7267926211ddfaeb8b4eb05aed43d0decfceea

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.0.267-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl
Algorithm Hash digest
SHA256 0afca3633c8e2b6c0a48ad0061180b641b3b404d68d7e6736aab301c8024c424
MD5 8eced3f9b3dd2a7139551df4489baf76
BLAKE2b-256 96e4c9a745407e204e755fa39a1819dc602662fef90fd9b00f44aac3b4d67176

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.0.267-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 9adf1307fa9d840d1acaa477eb04f9702032a483214c409fca9dc46f5f157fe3
MD5 bb8100d8abbd1207ecbf13588f49a070
BLAKE2b-256 2180c68a5d5117f84b6d4892cf8a5e1b164bd5b14bc0894ce0cba5343e40f132

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.0.267-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl
Algorithm Hash digest
SHA256 db33deef2a5e1cf528ca51cc59dd764122a48a19a6c776283b223d147041153f
MD5 193208ce7d66ffcb3599e67b0fc38f2e
BLAKE2b-256 f17a08f4803d440ee8fac3f007ca41e1a061fa529833c90b3b8dd37662393bbf

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.0.267-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 bbe104f21a429b77eb5ac276bd5352fd8c0e1fbb580b4c772f77ee8c76825654
MD5 f411f49e60c2464266bd9b6282da2fcb
BLAKE2b-256 530c8897fc309498b48fc60552c714264e91fda10c44defa9401a5c6288cb198

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.0.267-py3-none-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl
Algorithm Hash digest
SHA256 67254ae34c38cba109fdc52e4a70887de1f850fb3971e5eeef343db67305d1c1
MD5 730d859918a8d0b7b8a348d527ea7daa
BLAKE2b-256 6d7d1c3a89baa73a7880db0706092b668061c172cda6a7ac510646af54bd746a

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.0.267-py3-none-macosx_10_7_x86_64.whl
Algorithm Hash digest
SHA256 4adbbbe314d8fcc539a245065bad89446a3cef2e0c9cf70bf7bb9ed6fe31856d
MD5 c7b6308317d6d8d5f15709c9ce1349d5
BLAKE2b-256 fb096db9f4e8f5dbbe82a72abf2b89cc2bd5033ebee9767187428061e93b4e17

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