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.

Read the launch blog post or the most recent project update.

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.260'
  hooks:
    - id: ruff

Ruff can also be used as a VS Code extension or alongside any other editor through the Ruff LSP.

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 in a number of major open-source projects, 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.260.tar.gz (844.4 kB 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.260-py3-none-win_arm64.whl (5.1 MB view details)

Uploaded Python 3Windows ARM64

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

Uploaded Python 3Windows x86-64

ruff-0.0.260-py3-none-win32.whl (4.9 MB view details)

Uploaded Python 3Windows x86

ruff-0.0.260-py3-none-musllinux_1_2_x86_64.whl (5.3 MB view details)

Uploaded Python 3musllinux: musl 1.2+ x86-64

ruff-0.0.260-py3-none-musllinux_1_2_i686.whl (5.0 MB view details)

Uploaded Python 3musllinux: musl 1.2+ i686

ruff-0.0.260-py3-none-musllinux_1_2_armv7l.whl (4.6 MB view details)

Uploaded Python 3musllinux: musl 1.2+ ARMv7l

ruff-0.0.260-py3-none-musllinux_1_2_aarch64.whl (4.9 MB view details)

Uploaded Python 3musllinux: musl 1.2+ ARM64

ruff-0.0.260-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (5.2 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ x86-64

ruff-0.0.260-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl (6.1 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ s390x

ruff-0.0.260-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl (5.5 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ ppc64le

ruff-0.0.260-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl (5.6 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ ppc64

ruff-0.0.260-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl (5.1 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ i686

ruff-0.0.260-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl (4.6 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ ARMv7l

ruff-0.0.260-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (4.9 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ ARM64

ruff-0.0.260-py3-none-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl (9.6 MB view details)

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

ruff-0.0.260-py3-none-macosx_10_7_x86_64.whl (5.0 MB view details)

Uploaded Python 3macOS 10.7+ x86-64

File details

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

File metadata

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

File hashes

Hashes for ruff-0.0.260.tar.gz
Algorithm Hash digest
SHA256 ea8f94262f33b81c47ee9d81f455b144e94776f5c925748cb0c561a12206eae1
MD5 3df0a43878dda840c4708472cc71f6b4
BLAKE2b-256 42b0dab6b854f45b7709d21cbb9658fb5027a8ad0f594673f16691032be3fe03

See more details on using hashes here.

File details

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

File metadata

  • Download URL: ruff-0.0.260-py3-none-win_arm64.whl
  • Upload date:
  • Size: 5.1 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.260-py3-none-win_arm64.whl
Algorithm Hash digest
SHA256 12542a26f189a5a10c719bfa14d415d0511ac05e5c9ff5e79cc9d5cc50b81bc8
MD5 5008a489275bbbf233f0d31bc8fd7f87
BLAKE2b-256 a38978e78b2af514c2960a684a0b1deb4b8b21368541b7c82e18a2599002a443

See more details on using hashes here.

File details

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

File metadata

  • Download URL: ruff-0.0.260-py3-none-win_amd64.whl
  • Upload date:
  • Size: 5.3 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.260-py3-none-win_amd64.whl
Algorithm Hash digest
SHA256 0733d524946decbd4f1e63f7dc26820f5c1e6c31da529ba20fb995057f8e79b1
MD5 e4484b88e5cc1303ed8cdfc75add89d3
BLAKE2b-256 b9f91b355d585b971a77687d6dc2cd680e7e5af66394a8c75a25ac73d8dd3243

See more details on using hashes here.

File details

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

File metadata

  • Download URL: ruff-0.0.260-py3-none-win32.whl
  • Upload date:
  • Size: 4.9 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.260-py3-none-win32.whl
Algorithm Hash digest
SHA256 3866a96b2ef92c7d837ba6bf8fc9dd125a67886f1c5512ad6fa5d5fefaceff87
MD5 1d4a00deecf7f967144b38147612dde8
BLAKE2b-256 6fc56753f698c20ee047e0ccf37699c428cee27bdd686d66d7b7fbf0d8f64064

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.0.260-py3-none-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 6dd705d4eff405c2b70513188fbff520f49db6df91f0d5e8258c5d469efa58bc
MD5 7fb3666475a38658c67291cb8a74bca3
BLAKE2b-256 9354fad086cfd66eaa611549da82f381a77e752c283e34c3548cd650ac27369e

See more details on using hashes here.

File details

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

File metadata

  • Download URL: ruff-0.0.260-py3-none-musllinux_1_2_i686.whl
  • Upload date:
  • Size: 5.0 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.260-py3-none-musllinux_1_2_i686.whl
Algorithm Hash digest
SHA256 5f847b72ef994ab88e9da250c7eb5cbb3f1555b92a9f22c5ed1c27a44b7e98d6
MD5 a26cc6ffbbadbcfac3a9b974b4ecaf0d
BLAKE2b-256 a25d261b7a1d795fe097c4b11dcd8336acce43ac4a3e73f0f7f86cc609fd8745

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.0.260-py3-none-musllinux_1_2_armv7l.whl
Algorithm Hash digest
SHA256 aae2170a7ec6f7fc4a73db30aa7aa7fce936176bf66bf85f77f69ddd1dd4a665
MD5 067ce89d33d735712eea7dda6e812331
BLAKE2b-256 9001e9b06ec57caa0c36a90ede26b86a8603f4eee61d0da4a2e5f597cc7f5c43

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.0.260-py3-none-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 3ec1f77219ba5adaa194289cb82ba924ff2ed931fd00b8541d66a1724c89fbc9
MD5 bf286cad1760ae2705247362eacb5a77
BLAKE2b-256 fcca1c9fe9d576405cf5883c041c7693f2c8de828a7aa1b5dd80ea473f85b9bc

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.0.260-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 57d9f0bfdef739b76aa3112b9182a214f0f34589a2659f88353492c7670fe2fe
MD5 203f84ed61333e03b357c2cf3c3b90ee
BLAKE2b-256 09e03ba8f02041ac5a1b466364ff96abae4838f4852d56177a079075b35885d6

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.0.260-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl
Algorithm Hash digest
SHA256 f8678f54eb2696481618902a10c3cb28325f3323799af99997ad6f06005ea4f5
MD5 9e25dd3d1f850fbbb7b2b2fa18ef3387
BLAKE2b-256 b6f2d996c980b9eeb644d312376bf00e4831a04720f3bfd6fa3c474dc536a416

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.0.260-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl
Algorithm Hash digest
SHA256 3e075a61aaff8ebe56172217f0ac14c5df9637b289bf161ac697445a9003d5c2
MD5 d16585dd1f8f955c1c38cd7dfd5fbe38
BLAKE2b-256 18c0c2c3efcddff1ec814bac21e06b6892e09b7304b710b163605a24002d4215

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.0.260-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl
Algorithm Hash digest
SHA256 8bec0271e2c8cd36bcf915cb9f6a93e40797a3ff3d2cda4ca87b7bed9e598472
MD5 109d75dc7c647fa1833cd68c6608cf2b
BLAKE2b-256 14d3517080b9623d86aabc550d77cd118cc78156836894832917cf5a6d2ff89f

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.0.260-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 1e4fa7293f97c021825b3b72f2bf53f0eb4f59625608a889678c1fc6660f412d
MD5 4fc733040d6e0fb8e55ee18bc857d912
BLAKE2b-256 0e1acde78a0c594a0a07adcc0f5b191587dd28e29524022502b92f0b8c0324bb

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.0.260-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl
Algorithm Hash digest
SHA256 8032e35357384a29791c75194a71e314031171eb0731fcaa872dfaf4c1f4470a
MD5 9daa772fc56a5cb33f7616f624dbeadc
BLAKE2b-256 feabaa9d7d785b1bcc9e34cfe85e27a2e21a508bfce447856f876d6c3ccb294d

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.0.260-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 25584d1b9f445fde72651caab97e7430a4c5bfd2a0ce9af39868753826cba10d
MD5 cad2ac759f00de1fed94a25091f5713e
BLAKE2b-256 8a979162045353f3c162e32a00a0cc6f8026600daac453939f256e04e9b81bcf

See more details on using hashes here.

File details

Details for the file ruff-0.0.260-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.260-py3-none-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl
Algorithm Hash digest
SHA256 90ff1479e292a84c388a8a035d223247ddeea5f6760752a9142b88b6d59ac334
MD5 79d6473c539c9e539087cd1bb88818dd
BLAKE2b-256 9ebaad56a4f7c7c9213e62ba50c6d6c24a1a35d184d40620876c8fa6848693e3

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.0.260-py3-none-macosx_10_7_x86_64.whl
Algorithm Hash digest
SHA256 c559650b623f3fbdc39c7ed1bcb064765c666a53ee738c53d1461afbf3f23db2
MD5 17d2e7bd570cc5de990cfa798e4541ff
BLAKE2b-256 c13ecb041a9d5bd90173e8050c2740bde3080388604ea60b8e66348f52e6a72d

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