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/astral-sh/ruff-pre-commit
  # Ruff version.
  rev: v0.0.274
  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/astral-sh/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/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/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.274.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.274-py3-none-win_arm64.whl (5.1 MB view details)

Uploaded Python 3Windows ARM64

ruff-0.0.274-py3-none-win_amd64.whl (5.3 MB view details)

Uploaded Python 3Windows x86-64

ruff-0.0.274-py3-none-win32.whl (5.0 MB view details)

Uploaded Python 3Windows x86

ruff-0.0.274-py3-none-musllinux_1_2_x86_64.whl (5.4 MB view details)

Uploaded Python 3musllinux: musl 1.2+ x86-64

ruff-0.0.274-py3-none-musllinux_1_2_i686.whl (5.1 MB view details)

Uploaded Python 3musllinux: musl 1.2+ i686

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

Uploaded Python 3musllinux: musl 1.2+ ARMv7l

ruff-0.0.274-py3-none-musllinux_1_2_aarch64.whl (5.0 MB view details)

Uploaded Python 3musllinux: musl 1.2+ ARM64

ruff-0.0.274-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (5.4 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ x86-64

ruff-0.0.274-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl (6.5 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ s390x

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

Uploaded Python 3manylinux: glibc 2.17+ ppc64le

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

Uploaded Python 3manylinux: glibc 2.17+ ppc64

ruff-0.0.274-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl (5.2 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ i686

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

Uploaded Python 3manylinux: glibc 2.17+ ARMv7l

ruff-0.0.274-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (5.0 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ ARM64

ruff-0.0.274-py3-none-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl (9.9 MB view details)

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

ruff-0.0.274-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.274.tar.gz.

File metadata

  • Download URL: ruff-0.0.274.tar.gz
  • Upload date:
  • Size: 1.0 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/4.0.1 CPython/3.11.4

File hashes

Hashes for ruff-0.0.274.tar.gz
Algorithm Hash digest
SHA256 c7e5f9deffbd02d8054f90b565a1106faee64e16cedf50f3aa05c14b59ff8727
MD5 ededa267fa0b4c6aaf45d2ba667471f9
BLAKE2b-256 73313cc256943d29025793279244fd6837240382edd3c585f3b562a62b66deb6

See more details on using hashes here.

File details

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

File metadata

  • Download URL: ruff-0.0.274-py3-none-win_arm64.whl
  • Upload date:
  • Size: 5.1 MB
  • Tags: Python 3, Windows ARM64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/4.0.1 CPython/3.11.4

File hashes

Hashes for ruff-0.0.274-py3-none-win_arm64.whl
Algorithm Hash digest
SHA256 8b99ce776fc60fb938791f558b297e53ed634adeef1a7b84a33455924948c9af
MD5 86b8ce99ee521fae4ebe9aef21f5526b
BLAKE2b-256 cf0bbf76ae7566952fb0675537ea8730a567c416ba35cd23c95e70b3ea07139f

See more details on using hashes here.

File details

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

File metadata

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

File hashes

Hashes for ruff-0.0.274-py3-none-win_amd64.whl
Algorithm Hash digest
SHA256 e80aa0c7e1347a96db846287695971925eb56760c019a7d66312fbca389a6800
MD5 c625cc6997a7716fb52b4fae7eff562b
BLAKE2b-256 c6ecfdd733bddd74cee9293cf235505f7e865d435306e24543ca590910f1260c

See more details on using hashes here.

File details

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

File metadata

  • Download URL: ruff-0.0.274-py3-none-win32.whl
  • Upload date:
  • Size: 5.0 MB
  • Tags: Python 3, Windows x86
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/4.0.1 CPython/3.11.4

File hashes

Hashes for ruff-0.0.274-py3-none-win32.whl
Algorithm Hash digest
SHA256 09c87fa2c4f53bd63c1d8a35150683794b022f4f2fbd6ef2fe383ce21ab53fec
MD5 4728eb61f346a5ffc729e6d66acc1e63
BLAKE2b-256 e64ac09cde430f6aa48e98f0384d49e9612e4f22e2429f745e3e9eca30075f53

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.0.274-py3-none-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 461bda8c3a4c1591fd7a09960b86e2ffc9a59a1c42cf14d725077314c12b60b0
MD5 73832a1c0cd9df08550e8f6b0076c55a
BLAKE2b-256 b9d92dd3f535a211a73754c764212a52d7db70e9d55f9263a963b9b95e779dfe

See more details on using hashes here.

File details

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

File metadata

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

File hashes

Hashes for ruff-0.0.274-py3-none-musllinux_1_2_i686.whl
Algorithm Hash digest
SHA256 b13e765b64487143f05e6ad6f624388b9ac5a6ff8657ff801091c9282de3ca52
MD5 a162689f93ee3021689d2ff30493c0ce
BLAKE2b-256 847c21841a330cd8e162ccc848d99e84a3cb27416cd7eb983cc17b082a6469ec

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.0.274-py3-none-musllinux_1_2_armv7l.whl
Algorithm Hash digest
SHA256 86d943107f20fec924f56dc4933cefb0efbc1ec8b729e0a1afabac598c5586ca
MD5 5c8001c82289b13a5c5ab288f47fdebb
BLAKE2b-256 7bd1029f18d1ad0456c01e23ec40c99c817be7593ce345711ec02683ff8092bf

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.0.274-py3-none-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 39b80156ef57b33ab7bfc454b7c2678eaae07f43a7dcf2e7c058f72d87b49538
MD5 14706c1784d6365b1d88f91a36c728c1
BLAKE2b-256 e1951debc53b970c97a991f15c01e6650e76b7e35c8cd4945b0a9a33ec2c53cc

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.0.274-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 587130943110e9536018ce139158e2962d46623f379a4486aabfd525e9714b0e
MD5 561be94a00f96415ecc10453de5a8e12
BLAKE2b-256 7f60f8d4966112555805366ec2df37e3653d4d80adbc1b00bf4254dbbd9e340d

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.0.274-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl
Algorithm Hash digest
SHA256 dca36d651f88b4b24f17df5db54487057ce0ccd3599cbf38d237cf4d9f0d63c2
MD5 cd8ec860e796e12f3e7372c36de6faaf
BLAKE2b-256 30ad9dc28c29b8fbb390f2f08c5e2e961c9b2adf2d71549f78ac4f310f392b30

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.0.274-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl
Algorithm Hash digest
SHA256 044084f039a679e557240fefcf521e057941b163014cf969ac6d04620861e04a
MD5 99e4f7f6db8ac40eb043b24b1f3b4908
BLAKE2b-256 18263ee1c9717fa206318be9eb892b8326ac415f1a57952aa996fd7b88435126

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.0.274-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl
Algorithm Hash digest
SHA256 5137f853fffa7352901038a1b5e36a97058380a554763e534aae9f6c0734fdab
MD5 3456103ccc9827823460426782293cf7
BLAKE2b-256 bd7d57ccbca1428cd4876bf68decfc465b2725ce5234da91fb4c4910443de0f5

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.0.274-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 34e71a06a4e27554ca2f1c2b1749a802e3e76cac41481cfc2cb86936c1e37d3c
MD5 d297ea6e055129222c814dba3fdf595c
BLAKE2b-256 b5da694e37da2604444f0c5a4dc5eb5cf23af02622d9b4638dc343997a84d3fd

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.0.274-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl
Algorithm Hash digest
SHA256 023cdc5e64b3f34244e12bd236ab412c6056061a2415d50fb862cab333b4ab7c
MD5 c2be5acc992a4c02a1b7b07c0972e423
BLAKE2b-256 36a27b226d7586607e3991646961b29a15d1f923fa8459f0015114c80394e82c

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.0.274-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 6133fa856b230a0281197aeba3e89ce9595f9d8a7265113520ad259d416c9f4b
MD5 12ba1ae170d697bdd45aff910dde2a20
BLAKE2b-256 b94b25f1f00393db9a4d018039b7a39fca5164c6cb5b251caba7abd8ccd8f957

See more details on using hashes here.

File details

Details for the file ruff-0.0.274-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.274-py3-none-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl
Algorithm Hash digest
SHA256 fa9ad8776cb92f2739b8eee316cde841d6012d0eafbf06bae09166203ddf9bb8
MD5 2ec62e3596e6ea03fae475693a9f8dd0
BLAKE2b-256 07597b043efe280a7f6815c87fda4bf1e43e51c87b181f3b461bd761e29377f7

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.0.274-py3-none-macosx_10_7_x86_64.whl
Algorithm Hash digest
SHA256 6d7069157a5674be8090c7d89fa69dbb2478f333a80b1312d20ade2a870cca3e
MD5 d7e99b467706634a38e3f341cbacffc2
BLAKE2b-256 3924e60dfe0b610a13a716bb4fb574c6e4365c7404a16d8352b27edf6d6b1ee9

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