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 600 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/astral-sh/ruff-pre-commit
  # Ruff version.
  rev: v0.0.288
  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.8
target-version = "py38"

[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 600 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 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.0.288.tar.gz (1.6 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.288-py3-none-win_arm64.whl (5.8 MB view details)

Uploaded Python 3Windows ARM64

ruff-0.0.288-py3-none-win_amd64.whl (6.0 MB view details)

Uploaded Python 3Windows x86-64

ruff-0.0.288-py3-none-win32.whl (5.7 MB view details)

Uploaded Python 3Windows x86

ruff-0.0.288-py3-none-musllinux_1_2_x86_64.whl (6.2 MB view details)

Uploaded Python 3musllinux: musl 1.2+ x86-64

ruff-0.0.288-py3-none-musllinux_1_2_i686.whl (5.8 MB view details)

Uploaded Python 3musllinux: musl 1.2+ i686

ruff-0.0.288-py3-none-musllinux_1_2_armv7l.whl (5.5 MB view details)

Uploaded Python 3musllinux: musl 1.2+ ARMv7l

ruff-0.0.288-py3-none-musllinux_1_2_aarch64.whl (5.8 MB view details)

Uploaded Python 3musllinux: musl 1.2+ ARM64

ruff-0.0.288-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (6.2 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ x86-64

ruff-0.0.288-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl (7.6 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ s390x

ruff-0.0.288-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl (6.5 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ ppc64le

ruff-0.0.288-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl (6.6 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ ppc64

ruff-0.0.288-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl (6.0 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ i686

ruff-0.0.288-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl (5.5 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ ARMv7l

ruff-0.0.288-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (5.8 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ ARM64

ruff-0.0.288-py3-none-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl (11.4 MB view details)

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

ruff-0.0.288-py3-none-macosx_10_7_x86_64.whl (5.9 MB view details)

Uploaded Python 3macOS 10.7+ x86-64

File details

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

File metadata

  • Download URL: ruff-0.0.288.tar.gz
  • Upload date:
  • Size: 1.6 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/4.0.2 CPython/3.11.5

File hashes

Hashes for ruff-0.0.288.tar.gz
Algorithm Hash digest
SHA256 71eb3e09cb47cc02c13c6dc5561055b913572995cf5fa8286948f938bc464621
MD5 8278dcd87f3e5df6f63636a658ff2d44
BLAKE2b-256 86bb28022b3852853080a7b5695c4c536aff5dc277f4de4b5b2d83b41da3b2e9

See more details on using hashes here.

File details

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

File metadata

  • Download URL: ruff-0.0.288-py3-none-win_arm64.whl
  • Upload date:
  • Size: 5.8 MB
  • Tags: Python 3, Windows ARM64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/4.0.2 CPython/3.11.5

File hashes

Hashes for ruff-0.0.288-py3-none-win_arm64.whl
Algorithm Hash digest
SHA256 6ca84861bf046e4365e20f4d664dc0aa02b377a6896a393dad716e033ac47a65
MD5 5fe5d77d89d6da1402e4505b5126642e
BLAKE2b-256 783f312ec452a57cf91c18e9ffdb3e76fdecfd60977a3875ac31f25abd952b34

See more details on using hashes here.

File details

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

File metadata

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

File hashes

Hashes for ruff-0.0.288-py3-none-win_amd64.whl
Algorithm Hash digest
SHA256 73066b1da66b3d4942cce8c90fd6e09108851e0867a5f7071255d1b99aee3e75
MD5 f67853226ec4e78a496a68c87a6a5770
BLAKE2b-256 6e71b1a6b42aa01bddd61ff67600c5ae6e339fafbbd59c881092e5c8237cf936

See more details on using hashes here.

File details

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

File metadata

  • Download URL: ruff-0.0.288-py3-none-win32.whl
  • Upload date:
  • Size: 5.7 MB
  • Tags: Python 3, Windows x86
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/4.0.2 CPython/3.11.5

File hashes

Hashes for ruff-0.0.288-py3-none-win32.whl
Algorithm Hash digest
SHA256 7534da2f1e724b87a5041615652bca7c6e721f90ae3a01d1d8e965d08a615038
MD5 c871b80adb3c3c6787808784aa7a316b
BLAKE2b-256 2c233e49a38bb66ead4b92cffe720b183544ecb4fb81fc70a3d89b1f815544ed

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.0.288-py3-none-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 13d1e6cef389dc0238ef0e97e25561c925bf255d0f59f70ed2d6bd0a13fdd7b0
MD5 124922df5dbb924e6197893f09cb2c72
BLAKE2b-256 40b246c4ff45b0208f476855ac7c2d271b29d8b861690f61d9290de58e4e979c

See more details on using hashes here.

File details

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

File metadata

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

File hashes

Hashes for ruff-0.0.288-py3-none-musllinux_1_2_i686.whl
Algorithm Hash digest
SHA256 28ee03358e4eb89e843cb4fd9cf0406eb603a7e060436ffc623b29544e374c2b
MD5 91ac920f0b9699185b87522aa2d83cb9
BLAKE2b-256 58674a237819b11e0d4d09ef13383db617e7b6be931bf43e1fb0c12fd07956c2

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.0.288-py3-none-musllinux_1_2_armv7l.whl
Algorithm Hash digest
SHA256 e450e50a936409439bf4e28e85412622693350cf4da89c69e1f14af21ddbc467
MD5 429c15fd118686b8634cf9bbaace216d
BLAKE2b-256 8339bf28033c42613da9794dccfe1eaf974b8ca7a2cbf669b994a19b02c30441

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.0.288-py3-none-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 ea0535d48f674d6a6bf1e6fb1a18c40622cb6496b0994cfdcd7aec763ef8b589
MD5 648e2589c7324ce9af40fde65f62c3cc
BLAKE2b-256 34c6590f13f2bfab3e2eef3f598aae008d6dc865e53feb44145d0105fae2d8ce

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.0.288-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 ef9a6563bbacfc7afdba04722d742db4f1961ab6f398a2e305b43c21d418c149
MD5 ceda1e3206835b772895250b9d772773
BLAKE2b-256 2f382b67bd3f92865379bc1f17a0ddb3403616bfaf904a75da3babd4e2c465a9

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.0.288-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl
Algorithm Hash digest
SHA256 0496556da7b413279370cae7de001a0415279e9318dc1fabd447a3ca7b398bce
MD5 a669f72ce3cf93288b88c02b70d1b505
BLAKE2b-256 0f07d7f0aa7ca227c660cbf0e4bc924d221515213b51dac0ec49d29b7616c28c

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.0.288-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl
Algorithm Hash digest
SHA256 10feeabd15e2c6e06bce75aa97e806009cf909261cd124f24ef832385914aae9
MD5 d49cb56e92d23ec4cf820883fc495380
BLAKE2b-256 fba03d6faf1d634a2e15859ab1cd9854fe836c2bfffb22bf9cc3e140dc081657

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.0.288-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl
Algorithm Hash digest
SHA256 2d5df4a49eaa11536776b1efcc4e88e373b205a958712185de8e4ae287397614
MD5 a52f4778d9475aec23cbcff5cbcb0889
BLAKE2b-256 a37f27acc2898ba53e3d1962569febacefbe6453916633fb92c58f8eee063c55

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.0.288-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 bd9977eee17d7f29beca74b478f6930c7dd006d486bac615c849a3436384fc28
MD5 0d30202717d93358f748a5f407606908
BLAKE2b-256 b733a6ed6140a0a3d10660585c3d615a91a2534eead30cea07bd552a475ec7d8

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.0.288-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl
Algorithm Hash digest
SHA256 db1de2ac1de219f29c12940b429fe365974c3d9f69464c4660c06e4b4b284dba
MD5 c081bcc0708add113e0fd798ea85da16
BLAKE2b-256 46f3a82d143bc8f63c2e6203bd23e94f1c5c08856aa35e01b6c0d2ee6afbf9b3

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.0.288-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 e08c81394ae272b1595580dad1bfc62de72d9356c51e76b5c2fdd546f84e6168
MD5 bdd9fcf2d0e2adae1ffdf8cf90f3e7f7
BLAKE2b-256 7f73b569cc8b3beb2f149aa88059124a091f1d14c08abb19f6dd6111f0099a3d

See more details on using hashes here.

File details

Details for the file ruff-0.0.288-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.288-py3-none-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl
Algorithm Hash digest
SHA256 84691fd3c8edd705c27eb7ccf745a3530c31e4c83010f9ce20e0b9eb0578f099
MD5 f1d1a93f45aeed9e499ec7d4d9f6e54b
BLAKE2b-256 e0c58b44104854be5110b5604b1583c5648a0ba2b23773be33104dccadab3e18

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.0.288-py3-none-macosx_10_7_x86_64.whl
Algorithm Hash digest
SHA256 64c01615b8640c703a56a1eac3114a653166eafa5d416ffc9e6cafbfb86ab927
MD5 c140c53b1c48b8af43c0d578e890cfde
BLAKE2b-256 e02c88e0ec30bd24fed1512347c9498a59fed1a5641e97b3d2671c24ecb8f19f

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