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.265'
  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.265.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.265-py3-none-win_arm64.whl (5.3 MB view details)

Uploaded Python 3Windows ARM64

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

Uploaded Python 3Windows x86-64

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

Uploaded Python 3Windows x86

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

Uploaded Python 3musllinux: musl 1.2+ x86-64

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

Uploaded Python 3musllinux: musl 1.2+ i686

ruff-0.0.265-py3-none-musllinux_1_2_armv7l.whl (4.7 MB view details)

Uploaded Python 3musllinux: musl 1.2+ ARMv7l

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

Uploaded Python 3musllinux: musl 1.2+ ARM64

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

Uploaded Python 3manylinux: glibc 2.17+ s390x

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

Uploaded Python 3manylinux: glibc 2.17+ ppc64le

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

Uploaded Python 3manylinux: glibc 2.17+ ppc64

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

Uploaded Python 3manylinux: glibc 2.17+ i686

ruff-0.0.265-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl (4.7 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ ARMv7l

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

Uploaded Python 3manylinux: glibc 2.17+ ARM64

ruff-0.0.265-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.265-py3-none-macosx_10_7_x86_64.whl (5.2 MB view details)

Uploaded Python 3macOS 10.7+ x86-64

File details

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

File metadata

  • Download URL: ruff-0.0.265.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.265.tar.gz
Algorithm Hash digest
SHA256 53c17f0dab19ddc22b254b087d1381b601b155acfa8feed514f0d6a413d0ab3a
MD5 5e96926300bae8f6456c323f9c788c54
BLAKE2b-256 d1c32aeec2adaff3cfa95d713283089568ee905f759e18d034646e3aa85a6282

See more details on using hashes here.

File details

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

File metadata

  • Download URL: ruff-0.0.265-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.265-py3-none-win_arm64.whl
Algorithm Hash digest
SHA256 c78470656e33d32ddc54e8482b1b0fc6de58f1195586731e5ff1405d74421499
MD5 4bd9c7a0a730d546c5684a5c8bb37d9e
BLAKE2b-256 77cc8806e6aaf8dc0cd4f41444f5423c31d691b7acf0386665406823f9528e45

See more details on using hashes here.

File details

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

File metadata

  • Download URL: ruff-0.0.265-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.265-py3-none-win_amd64.whl
Algorithm Hash digest
SHA256 f54facf286103006171a00ce20388d88ed1d6732db3b49c11feb9bf3d46f90e9
MD5 546d935c45a586288ae62a07d242ccaf
BLAKE2b-256 4133f9043ba8a20a667d888adc81768ebdaadaa0d2b760da61912682d62bbff8

See more details on using hashes here.

File details

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

File metadata

  • Download URL: ruff-0.0.265-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.265-py3-none-win32.whl
Algorithm Hash digest
SHA256 9e9db5ccb810742d621f93272e3cc23b5f277d8d00c4a79668835d26ccbe48dd
MD5 0fe3c73d6d3c155f28be66395d36a647
BLAKE2b-256 e3d1433db20e8ef8f67ff7cfa32fdf6b9adb0592a1269fd93e230fd0dfbf64f2

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.0.265-py3-none-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 1d5a8de2fbaf91ea5699451a06f4074e7a312accfa774ad9327cde3e4fda2081
MD5 8acd98088846669534399f3953e65265
BLAKE2b-256 408dfbd44882b6ef61c8be8fa9ce6448bb99ff105816ac22e2f2116473809c6d

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.0.265-py3-none-musllinux_1_2_i686.whl
Algorithm Hash digest
SHA256 d0f9967f84da42d28e3d9d9354cc1575f96ed69e6e40a7d4b780a7a0418d9409
MD5 2902ef2151367fbf5e68e8dbe2bb069d
BLAKE2b-256 b2bcb14c0de95721ef6bd3a1dcfe7b4ce9f368c72a2d5aed7c98e767771c860c

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.0.265-py3-none-musllinux_1_2_armv7l.whl
Algorithm Hash digest
SHA256 62a9578b48cfd292c64ea3d28681dc16b1aa7445b7a7709a2884510fc0822118
MD5 fb3938f4d30b42cdf0729227306c41e0
BLAKE2b-256 b4c47b8b05279a11ba30cf99eb628dbfd2fbf7219c192eb78f9585280bc3ae69

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.0.265-py3-none-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 9ac13b11d9ad3001de9d637974ec5402a67cefdf9fffc3929ab44c2fcbb850a1
MD5 09c1533808239a1e2ec88bf29291edea
BLAKE2b-256 a100135639453182b6c64c507f448764d78f8df90bcd19e4b0e16427407709e0

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.0.265-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 aa17b13cd3f29fc57d06bf34c31f21d043735cc9a681203d634549b0e41047d1
MD5 8d7cb624e043fdc93b3c877726b35ac8
BLAKE2b-256 f41c5161404f7231c37e951f7dce3a4f623733a6563c17724189d003602ce55f

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.0.265-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl
Algorithm Hash digest
SHA256 d586e69ab5cbf521a1910b733412a5735936f6a610d805b89d35b6647e2a66aa
MD5 dd3593d5a49f68aaa2bed7d458d36614
BLAKE2b-256 b31d0e544e4b73bafbe88f6c39bce5306fdbf5af07e9d004fe023eeedf9ee548

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.0.265-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl
Algorithm Hash digest
SHA256 4057eb539a1d88eb84e9f6a36e0a999e0f261ed850ae5d5817e68968e7b89ed9
MD5 aacf72be07057d3c5c35713bfea3bf61
BLAKE2b-256 c7879b9d14b1778edb4ce03e0e80ab9378e12e402dce2b5cd27403b6670b6ed6

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.0.265-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl
Algorithm Hash digest
SHA256 5028950f7af9b119d43d91b215d5044976e43b96a0d1458d193ef0dd3c587bf8
MD5 c40f016627342132bc937b410904d2ec
BLAKE2b-256 9467f875768b8ecfbc6264a9fc5e10735359f23b2ac98194bf0512555225b987

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.0.265-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 b279fa55ea175ef953208a6d8bfbcdcffac1c39b38cdb8c2bfafe9222add70bb
MD5 00246a957760ad606a95212382e24027
BLAKE2b-256 9d077178c1b251c2bfed0676e7f8cd76d6107a5e89b2d1b7b464c084b311dfe6

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.0.265-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl
Algorithm Hash digest
SHA256 a8b44a245b60512403a6a03a5b5212da274d33862225c5eed3bcf12037eb19bb
MD5 1312e33ee5723b9ac5b97e4e9bbdaea2
BLAKE2b-256 9e35fb24000483a56339ffe3c00c8b0d12c4ca99201f7f2f30f4799202a20a83

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.0.265-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 2a9b38bdb40a998cbc677db55b6225a6c4fadcf8819eb30695e1b8470942426b
MD5 46f69d679804a1584e29f07cc69333c6
BLAKE2b-256 e7c3157c421412809780430110b766f8bdad65b55f0671c00c778d827dbb6f35

See more details on using hashes here.

File details

Details for the file ruff-0.0.265-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.265-py3-none-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl
Algorithm Hash digest
SHA256 a11bd0889e88d3342e7bc514554bb4461bf6cc30ec115821c2425cfaac0b1b6a
MD5 9c3b7f779f2db57930658cecc9e94181
BLAKE2b-256 fdac1c40dc44ed92744c3a9ca6f07ed2d83f0431d71a02766a7a478e2112fb59

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.0.265-py3-none-macosx_10_7_x86_64.whl
Algorithm Hash digest
SHA256 30ddfe22de6ce4eb1260408f4480bbbce998f954dbf470228a21a9b2c45955e4
MD5 afd65b0dd25c6a6ffd3a7cd29f4a5fa5
BLAKE2b-256 27ee674d3816cbffa55e4fad4446e2815c783ca0648180a905418edfd664bc50

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