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.263'
  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",
    ".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:

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.263.tar.gz (1.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.0.263-py3-none-win_arm64.whl (5.3 MB view details)

Uploaded Python 3Windows ARM64

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

Uploaded Python 3Windows x86-64

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

Uploaded Python 3Windows x86

ruff-0.0.263-py3-none-musllinux_1_2_x86_64.whl (5.5 MB view details)

Uploaded Python 3musllinux: musl 1.2+ x86-64

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

Uploaded Python 3musllinux: musl 1.2+ i686

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

Uploaded Python 3musllinux: musl 1.2+ ARMv7l

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

Uploaded Python 3musllinux: musl 1.2+ ARM64

ruff-0.0.263-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.263-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl (6.3 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ s390x

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

Uploaded Python 3manylinux: glibc 2.17+ ppc64le

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

Uploaded Python 3manylinux: glibc 2.17+ ppc64

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

Uploaded Python 3manylinux: glibc 2.17+ i686

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

Uploaded Python 3manylinux: glibc 2.17+ ARMv7l

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

Uploaded Python 3manylinux: glibc 2.17+ ARM64

ruff-0.0.263-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.263-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.263.tar.gz.

File metadata

  • Download URL: ruff-0.0.263.tar.gz
  • Upload date:
  • Size: 1.0 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.263.tar.gz
Algorithm Hash digest
SHA256 1008f211ad8aa1d998517ac5bf3d68fbc68ec516d1da89b6081f25ff2f30b687
MD5 d9a4c642652fc29e1b480c9d7d60eef5
BLAKE2b-256 b7cf9b6e460cbc5e6c32433b3d95898b2b295f210bd5777e1a0425f076d335bc

See more details on using hashes here.

File details

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

File metadata

  • Download URL: ruff-0.0.263-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.263-py3-none-win_arm64.whl
Algorithm Hash digest
SHA256 ddf4503595b560bfa5fae92fa2e4cb09ec465ee4cf88cc248f10ad2e956deec3
MD5 93b417aa5876890d4bd2c1afd2c5c6d3
BLAKE2b-256 0801e553109ab71bcef7dbf994b7c935f683857cdd7cef8353a76d6fad962014

See more details on using hashes here.

File details

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

File metadata

  • Download URL: ruff-0.0.263-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.263-py3-none-win_amd64.whl
Algorithm Hash digest
SHA256 9af932f665e177de62e172901704257fd6e5bfabb95893867ff7382a851459d3
MD5 3e5b4dfe4c621ea9d8bd835ccacd7f5c
BLAKE2b-256 2a4bbea4dc1790bff48b0f5e1fa9e0b1f6d4cdff4eb76b8aa241e4c9ac73261d

See more details on using hashes here.

File details

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

File metadata

  • Download URL: ruff-0.0.263-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.263-py3-none-win32.whl
Algorithm Hash digest
SHA256 c2b79919ebd93674b93dfc2c843e264bf8e52fbe737467e9b58521775c85f4ad
MD5 99a53e73d2fa1bff46de29cf1649eb25
BLAKE2b-256 ec8e23588cb311081bed6c1771fddfe811148a5160d2f3a80793713019c23d4b

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.0.263-py3-none-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 7890499c2c3dcb1e60de2a8b4c5f5775b2bfcdff7d3e68e38db5cb2d65b12006
MD5 4c29d79d69b743381caeaf7fc4c6592e
BLAKE2b-256 aa17cc39e9bede6626d6d2497f8034f0292c5c88c4646d95ae816ad077bedf56

See more details on using hashes here.

File details

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

File metadata

  • Download URL: ruff-0.0.263-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.263-py3-none-musllinux_1_2_i686.whl
Algorithm Hash digest
SHA256 bed1d3fba306e3f7e13ce226927b84200350e25abd1e754e06ee361c6d41de15
MD5 96f21c7b2205a5b8367a3f42c250690f
BLAKE2b-256 74c87c61be29a2d454ff1ba9f5f0ac17f3cc3ddb5f3d59219d271e549d94ccb3

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.0.263-py3-none-musllinux_1_2_armv7l.whl
Algorithm Hash digest
SHA256 981e3c4d773f7ff52479c4fd74a65e408f1e13fa5f889b72214d400cd1299ce4
MD5 06f5c30957614c5dd944b994bcf43647
BLAKE2b-256 dc302a44532db86e557a559284b442111d18ad1b140994f55713e9798c2a891f

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.0.263-py3-none-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 3e9fcee3f81129eabc75da005d839235e32d7d374f2d4c0db0c708dad4703d6e
MD5 beaa480fc508160f8456ca5e65f9c445
BLAKE2b-256 7a228b20958ec2c03ce20b7b335ec20b27875b0890d2ab45871ee0bc7a51eeae

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.0.263-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 82c41f276106017b6f075dd2f2cc68e1a0b434cc75488f816fc98bd41982628d
MD5 4f126174142b22fa5b6662a1d7b5f78f
BLAKE2b-256 14c95470c9324095f3b3f603b4f2533e89594ebdd17579f6e1111bb0712aee30

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.0.263-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl
Algorithm Hash digest
SHA256 04e0b280dd246448564c892bce5607d820ad1f14944f3d535db98692e2a7ac07
MD5 4e4321a03a43aada09134a304d6df1e6
BLAKE2b-256 610fc3936d988d83bd0d6b705982779a2a254f6f1d9cc5431cb2e01e6d5c461b

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.0.263-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl
Algorithm Hash digest
SHA256 15386933dd8e03aafa3186f9e996d6823105492817311338fbcb64d0ecbcd95f
MD5 23432dd0fa71fc42baf135a57fce01ed
BLAKE2b-256 2e8e084839c7b3f3548f1985cdb6536770dee4dabab8f40d2ca181c1107b549a

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.0.263-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl
Algorithm Hash digest
SHA256 4010b156f2e9fa6e74b5581098467f6ff68beac48945599b3a9239481e578ab4
MD5 b66d3c2e2cd438acc596de12d95a5820
BLAKE2b-256 91302c5c72c3dd7a3a2263675dcb0fd00bac6e2743d9f7e83d646342d6b15683

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.0.263-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 ddcee0d91629a4fa4bc9faebf5b94d4615d50d1cd76d1098fa71fbe1c54f4104
MD5 09a68a2524af6e4a72cb4a02a6f75667
BLAKE2b-256 4cbd0e66ad872dc598aaead4f9b8cf3e7de07ad97435448be662853dafd6d293

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.0.263-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl
Algorithm Hash digest
SHA256 4f75fa1632ea065b8f10678e7b6ae9873f84d5046bdf146990112751e98af42a
MD5 917740e67336a51934e2e5550485cfd3
BLAKE2b-256 5fc88a17037c7a7a604a1eb25332a7b7e425b02c41500c13f7b1ddd8ffd46217

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.0.263-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 ebc778d95f29c9917e6e7608b2b67815707e6ab8eb5af9341617beda479c3edf
MD5 410e716d74b4bb04dcfd84c433d2c78c
BLAKE2b-256 9048ff8008dc66a523fc604954833ca3813bcf3265e2554af9cbeba023079de4

See more details on using hashes here.

File details

Details for the file ruff-0.0.263-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.263-py3-none-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl
Algorithm Hash digest
SHA256 c3b7d4b365207f3e4c40d235127091478e595b31e35b6cd57d940920cdfae68b
MD5 783d2a7d29a8abedf09c698cca3f9fa2
BLAKE2b-256 6424d4bfd6f8e08246d96f5b46f1961f7678767c62aa370a7cfeaa76c6db8c85

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.0.263-py3-none-macosx_10_7_x86_64.whl
Algorithm Hash digest
SHA256 ee6c7a77f142c427fa73e1f5f603fc1a39413a36fe6966ed0fc55e97f6921d9c
MD5 03369d34a33928f40257e21b9569c20f
BLAKE2b-256 fd176f6560d8307525839dc11eca7f43a5ab652442b2945c5c31ec2f6261522b

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