Skip to main content

An extremely fast Python linter, written in Rust.

Project description

ruff

Actions status PyPI version

An extremely fast Python linter, written in Rust.

Bar chart with benchmark results

Linting the CPython codebase from scratch.

  • ⚡️ 10-100x faster than existing linters
  • 🐍 Installable via pip
  • 🤝 Python 3.10 compatibility
  • 🛠️ pyproject.toml support
  • 📦 ESLint-inspired cache support
  • 🔧 ESLint-inspired --fix support
  • 👀 TypeScript-inspired --watch support

ruff is a proof-of-concept and not yet intended for production use. It supports only a small subset of the Flake8 rules, and may crash on your codebase.

Read the launch blog post.

Installation and usage

Installation

Available as ruff on PyPI:

pip install ruff

Usage

To run ruff, try any of the following:

ruff path/to/code/to/check.py
ruff path/to/code/
ruff path/to/code/*.py

You can run ruff in --watch mode to automatically re-run on-change:

ruff path/to/code/ --watch

ruff also works with Pre-Commit (requires Cargo on system):

repos:
- repo: https://github.com/charliermarsh/ruff
  rev: v0.0.31
  hooks:
    - id: lint

Configuration

ruff is configurable both via pyproject.toml and the command line.

For example, you could configure ruff to only enforce a subset of rules with:

[tool.ruff]
line-length = 88
select = [
    "F401",
    "F403",
]

Alternatively, on the command-line:

ruff path/to/code/ --select F401 F403

See ruff --help for more:

ruff (v0.0.31)
An extremely fast Python linter.

USAGE:
    ruff [OPTIONS] <FILES>...

ARGS:
    <FILES>...

OPTIONS:
    -e, --exit-zero             Exit with status code "0", even upon detecting errors
    -f, --fix                   Attempt to automatically fix lint errors
    -h, --help                  Print help information
        --ignore <IGNORE>...    Comma-separated list of error codes to ignore
    -n, --no-cache              Disable cache reads
    -q, --quiet                 Disable all logging (but still exit with status code "1" upon
                                detecting errors)
        --select <SELECT>...    Comma-separated list of error codes to enable
    -v, --verbose               Enable verbose logging
    -w, --watch                 Run in watch mode by re-running whenever files change

Compatibility with Black

ruff is intended to be compatible with Black, and should be compatible out-of-the-box as long as the line-length setting is consistent between the two.

As a project, ruff is designed to be used alongside Black and, as such, will defer implementing lint rules that are obviated by Black (e.g., stylistic rules).

Parity with Flake8

ruff's goal is to achieve feature-parity with Flake8 when used (1) without any plugins, (2) alongside Black, and (3) on Python 3 code. (Using Black obviates the need for many of Flake8's stylistic checks; limiting to Python 3 obviates the need for certain compatibility checks.)

Under those conditions, Flake8 implements about 58 rules, give or take. At time of writing, ruff implements 24 rules. (Note that these 24 rules likely cover a disproportionate share of errors: unused imports, undefined variables, etc.)

Of the unimplemented rules, ruff is missing:

  • 15 rules related to string .format calls.
  • 6 rules related to misplaced yield, break, and return statements.
  • 3 rules related to syntax errors in doctests and annotations.
  • 2 rules related to redefining unused names.

...along with a variety of others that don't fit neatly into any specific category.

Beyond rule-set parity, ruff suffers from the following limitations vis-à-vis Flake8:

  1. Flake8 supports a wider range of noqa patterns, such as per-file ignores defined in .flake8.
  2. Flake8 has a plugin architecture and supports writing custom lint rules.
  3. ruff does not yet support parenthesized context managers.

Rules

Code Name Message
E402 ModuleImportNotAtTopOfFile Module level import not at top of file
E501 LineTooLong Line too long
E711 NoneComparison Comparison to None should be cond is None
E712 TrueFalseComparison Comparison to True should be cond is True
E713 NotInTest Test for membership should be not in
E714 NotIsTest Test for object identity should be is not
E731 DoNotAssignLambda Do not assign a lambda expression, use a def
E902 IOError No such file or directory: ...
F401 UnusedImport ... imported but unused
F403 ImportStarUsage Unable to detect undefined names
F541 FStringMissingPlaceholders f-string without any placeholders
F601 MultiValueRepeatedKeyLiteral Dictionary key literal repeated
F602 MultiValueRepeatedKeyVariable Dictionary key ... repeated
F631 AssertTuple Assert test is a non-empty tuple, which is always True
F634 IfTuple If test is a tuple, which is always True
F704 YieldOutsideFunction a yield or yield from statement outside of a function/method
F706 ReturnOutsideFunction a return statement outside of a function/method
F707 DefaultExceptNotLast an except: block as not the last exception handler
F821 UndefinedName Undefined name ...
F822 UndefinedExport Undefined name ... in __all__
F823 UndefinedLocal Local variable ... referenced before assignment
F831 DuplicateArgumentName Duplicate argument name in function definition
F841 UnusedVariable Local variable ... is assigned to but never used
F901 RaiseNotImplemented raise NotImplemented should be raise NotImplementedError
R001 UselessObjectInheritance Class ... inherits from object
R002 NoAssertEquals assertEquals is deprecated, use assertEqual instead

Development

ruff is written in Rust (1.63.0). You'll need to install the Rust toolchain for development.

Assuming you have cargo installed, you can run:

cargo run resources/test/fixtures
cargo fmt
cargo clippy
cargo test

Deployment

ruff is distributed on PyPI, and published via maturin.

See: .github/workflows/release.yaml.

Benchmarking

First, clone CPython. It's a large and diverse Python codebase, which makes it a good target for benchmarking.

git clone --branch 3.10 https://github.com/python/cpython.git resources/test/cpython

Add this pyproject.toml to the CPython directory:

[tool.linter]
line-length = 88
exclude = [
    "Lib/lib2to3/tests/data/bom.py",
    "Lib/lib2to3/tests/data/crlf.py",
    "Lib/lib2to3/tests/data/different_encoding.py",
    "Lib/lib2to3/tests/data/false_encoding.py",
    "Lib/lib2to3/tests/data/py2_test_grammar.py",
    "Lib/test/bad_coding2.py",
    "Lib/test/badsyntax_3131.py",
    "Lib/test/badsyntax_pep3120.py",
    "Lib/test/encoded_modules/module_iso_8859_1.py",
    "Lib/test/encoded_modules/module_koi8_r.py",
    "Lib/test/test_fstring.py",
    "Lib/test/test_grammar.py",
    "Lib/test/test_importlib/test_util.py",
    "Lib/test/test_named_expressions.py",
    "Lib/test/test_patma.py",
    "Lib/test/test_source_encoding.py",
    "Tools/c-analyzer/c_parser/parser/_delim.py",
    "Tools/i18n/pygettext.py",
    "Tools/test2to3/maintest.py",
    "Tools/test2to3/setup.py",
    "Tools/test2to3/test/test_foo.py",
    "Tools/test2to3/test2to3/hello.py",
]

Next, to benchmark the release build:

cargo build --release

hyperfine --ignore-failure --warmup 1 \
  "./target/release/ruff ./resources/test/cpython/ --no-cache" \
  "./target/release/ruff ./resources/test/cpython/"

Benchmark 1: ./target/release/ruff ./resources/test/cpython/ --no-cache
  Time (mean ± σ):     353.6 ms ±   7.6 ms    [User: 2868.8 ms, System: 171.5 ms]
  Range (min  max):   344.4 ms  367.3 ms    10 runs

Benchmark 2: ./target/release/ruff ./resources/test/cpython/
  Time (mean ± σ):      59.6 ms ±   2.5 ms    [User: 36.4 ms, System: 345.6 ms]
  Range (min  max):    55.9 ms   67.0 ms    48 runs

To benchmark against the ecosystem's existing tools:

hyperfine --ignore-failure --warmup 5 \
  "./target/release/ruff ./resources/test/cpython/ --no-cache" \
  "pylint --recursive=y resources/test/cpython/" \
  "pyflakes resources/test/cpython" \
  "autoflake --recursive --expand-star-imports --remove-all-unused-imports --remove-unused-variables --remove-duplicate-keys resources/test/cpython" \
  "pycodestyle resources/test/cpython" \
  "pycodestyle --select E501 resources/test/cpython" \
  "flake8 resources/test/cpython" \
  "flake8 --select=F831,F541,F634,F403,F706,F901,E501 resources/test/cpython" \
  "python -m scripts.run_flake8 resources/test/cpython" \
  "python -m scripts.run_flake8 resources/test/cpython --select=F831,F541,F634,F403,F706,F901,E501"

In order, these evaluate:

  • ruff
  • Pylint
  • PyFlakes
  • autoflake
  • pycodestyle
  • pycodestyle, limited to the checks supported by ruff
  • Flake8
  • Flake8, limited to the checks supported by ruff
  • Flake8, with a hack to enable multiprocessing on macOS
  • Flake8, with a hack to enable multiprocessing on macOS, limited to the checks supported by ruff

(You can poetry install from ./scripts to create a working environment for the above.)

Benchmark 1: ./target/release/ruff ./resources/test/cpython/ --no-cache
  Time (mean ± σ):     469.3 ms ±  16.3 ms    [User: 2663.0 ms, System: 972.5 ms]
  Range (min  max):   445.2 ms  494.8 ms    10 runs

Benchmark 2: pylint --recursive=y resources/test/cpython/
  Time (mean ± σ):     27.211 s ±  0.097 s    [User: 26.405 s, System: 0.799 s]
  Range (min  max):   27.056 s  27.349 s    10 runs

Benchmark 3: pyflakes resources/test/cpython
  Time (mean ± σ):     27.309 s ±  0.033 s    [User: 27.137 s, System: 0.169 s]
  Range (min  max):   27.267 s  27.372 s    10 runs

Benchmark 4: autoflake --recursive --expand-star-imports --remove-all-unused-imports --remove-unused-variables --remove-duplicate-keys resources/test/cpython
  Time (mean ± σ):      8.027 s ±  0.024 s    [User: 74.255 s, System: 0.953 s]
  Range (min  max):    7.969 s   8.052 s    10 runs

Benchmark 5: pycodestyle resources/test/cpython
  Time (mean ± σ):     41.666 s ±  0.266 s    [User: 41.531 s, System: 0.132 s]
  Range (min  max):   41.295 s  41.980 s    10 runs

Benchmark 6: pycodestyle --select E501 resources/test/cpython
  Time (mean ± σ):     14.547 s ±  0.077 s    [User: 14.466 s, System: 0.079 s]
  Range (min  max):   14.429 s  14.695 s    10 runs

Benchmark 7: flake8 resources/test/cpython
  Time (mean ± σ):     75.700 s ±  0.152 s    [User: 75.254 s, System: 0.440 s]
  Range (min  max):   75.513 s  76.014 s    10 runs

Benchmark 8: flake8 --select=F831,F541,F634,F403,F706,F901,E501 resources/test/cpython
  Time (mean ± σ):     75.122 s ±  0.532 s    [User: 74.677 s, System: 0.440 s]
  Range (min  max):   74.130 s  75.606 s    10 runs

Benchmark 9: python -m scripts.run_flake8 resources/test/cpython
  Time (mean ± σ):     12.794 s ±  0.147 s    [User: 90.792 s, System: 0.738 s]
  Range (min  max):   12.606 s  13.030 s    10 runs

Benchmark 10: python -m scripts.run_flake8 resources/test/cpython --select=F831,F541,F634,F403,F706,F901,E501
  Time (mean ± σ):     12.487 s ±  0.118 s    [User: 90.052 s, System: 0.714 s]
  Range (min  max):   12.265 s  12.665 s    10 runs

Summary
  './target/release/ruff ./resources/test/cpython/ --no-cache' ran
   17.10 ± 0.60 times faster than 'autoflake --recursive --expand-star-imports --remove-all-unused-imports --remove-unused-variables --remove-duplicate-keys resources/test/cpython'
   26.60 ± 0.96 times faster than 'python -m scripts.run_flake8 resources/test/cpython --select=F831,F541,F634,F403,F706,F901,E501'
   27.26 ± 1.00 times faster than 'python -m scripts.run_flake8 resources/test/cpython'
   30.99 ± 1.09 times faster than 'pycodestyle --select E501 resources/test/cpython'
   57.98 ± 2.03 times faster than 'pylint --recursive=y resources/test/cpython/'
   58.19 ± 2.02 times faster than 'pyflakes resources/test/cpython'
   88.77 ± 3.14 times faster than 'pycodestyle resources/test/cpython'
  160.06 ± 5.68 times faster than 'flake8 --select=F831,F541,F634,F403,F706,F901,E501 resources/test/cpython'
  161.29 ± 5.61 times faster than 'flake8 resources/test/cpython'

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.31.tar.gz (94.2 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.31-py3-none-win_amd64.whl (2.5 MB view details)

Uploaded Python 3Windows x86-64

ruff-0.0.31-py3-none-win32.whl (2.4 MB view details)

Uploaded Python 3Windows x86

ruff-0.0.31-py3-none-musllinux_1_2_x86_64.whl (2.7 MB view details)

Uploaded Python 3musllinux: musl 1.2+ x86-64

ruff-0.0.31-py3-none-musllinux_1_2_i686.whl (2.6 MB view details)

Uploaded Python 3musllinux: musl 1.2+ i686

ruff-0.0.31-py3-none-musllinux_1_2_armv7l.whl (2.4 MB view details)

Uploaded Python 3musllinux: musl 1.2+ ARMv7l

ruff-0.0.31-py3-none-musllinux_1_2_aarch64.whl (2.5 MB view details)

Uploaded Python 3musllinux: musl 1.2+ ARM64

ruff-0.0.31-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl (2.2 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ s390x

ruff-0.0.31-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl (2.0 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ ppc64le

ruff-0.0.31-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl (2.1 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ ppc64

ruff-0.0.31-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl (1.8 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ ARMv7l

ruff-0.0.31-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (2.5 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ ARM64

ruff-0.0.31-py3-none-manylinux_2_12_x86_64.manylinux2010_x86_64.whl (2.6 MB view details)

Uploaded Python 3manylinux: glibc 2.12+ x86-64

ruff-0.0.31-py3-none-manylinux_2_12_i686.manylinux2010_i686.whl (2.7 MB view details)

Uploaded Python 3manylinux: glibc 2.12+ i686

ruff-0.0.31-py3-none-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl (5.0 MB view details)

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

ruff-0.0.31-py3-none-macosx_10_7_x86_64.whl (2.6 MB view details)

Uploaded Python 3macOS 10.7+ x86-64

File details

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

File metadata

  • Download URL: ruff-0.0.31.tar.gz
  • Upload date:
  • Size: 94.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.1 CPython/3.8.10

File hashes

Hashes for ruff-0.0.31.tar.gz
Algorithm Hash digest
SHA256 1e107c7abdff9a284c8c3937bce27f0add9c8d4e0479234b3e4e4790f657c132
MD5 2942fb589209c4ad7d70df635f5b6b1c
BLAKE2b-256 4a5cf2fe2122874d0bd98c58b839a0c96b02aaa30f408223713456a63f40efd3

See more details on using hashes here.

File details

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

File metadata

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

File hashes

Hashes for ruff-0.0.31-py3-none-win_amd64.whl
Algorithm Hash digest
SHA256 ecd0f1410d8a2ca500bee485964097283ef70aef00dd236eab514b7d360f3973
MD5 b24eda88f2233f6f22b9b87ffa4230e8
BLAKE2b-256 608693463fec46bb742551317a6eac07dfc22f634378cce99109bd8f1ae6b029

See more details on using hashes here.

File details

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

File metadata

  • Download URL: ruff-0.0.31-py3-none-win32.whl
  • Upload date:
  • Size: 2.4 MB
  • Tags: Python 3, Windows x86
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.1 CPython/3.8.10

File hashes

Hashes for ruff-0.0.31-py3-none-win32.whl
Algorithm Hash digest
SHA256 a06a5261f031650a9ae02a1eaf27d9ad98256c053b777362ea939e8136cdec3b
MD5 5b5cef34ab1c83232187046fd451ea04
BLAKE2b-256 62f340af631031f3a4745e252bfb074cdabf3647d32176131e766aaedb95ac8c

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.0.31-py3-none-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 63ce6de07b612602212317d389b5eb14ce2025357972322f1e4f43544486f6b2
MD5 79d4b7431810ee58f417ca3e44d8d049
BLAKE2b-256 b8b299d318d3f5414564597f95aca76c5d39fee8a0d2ccc0c99353fb5ebf801d

See more details on using hashes here.

File details

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

File metadata

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

File hashes

Hashes for ruff-0.0.31-py3-none-musllinux_1_2_i686.whl
Algorithm Hash digest
SHA256 29194446839811e0f5896e3fefa527ce4696a7bd90a6a13abc8d5dc850ae6dd6
MD5 4a8cec30c0ce10cd5782509de4bf3310
BLAKE2b-256 7faac34cdf37996fdd9afb3f7175cd7975716fc33402b49585e72a1fc64236e0

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.0.31-py3-none-musllinux_1_2_armv7l.whl
Algorithm Hash digest
SHA256 5b61037b57c53f65e501dec9f11e49c68561a096b457c57cb6b4353a5d1991eb
MD5 0da5b335013e284dd8934bcd76120597
BLAKE2b-256 2ad74cbef8153227cf3f7ce90eb08358f34c78a606b0e346862d7dd30dab632c

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.0.31-py3-none-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 f8c96a23fffbfb827130bdc49518dc496bebdfd6efb7e45da5c64d97b6f218d0
MD5 d5df3945df78dd67fcef350f08048664
BLAKE2b-256 35b700a20f66d7552ad8e713a669961edadb196d53f73d75b11446f44476ba2b

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.0.31-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl
Algorithm Hash digest
SHA256 7fa62f3f10879cdcffb36b2e6cd5935c25e39c3f93fe17e44f277246dfaad2cb
MD5 75dd2e8f59728865fe8dc1a993d1f7e0
BLAKE2b-256 c9a0bc23b67c6fe1b3ed4dd8a45be3e22618f08ae5a62165fb0e113c47268e23

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.0.31-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl
Algorithm Hash digest
SHA256 f13cbcc8f253debedabdd0dd1e8985ebe0eb8fb0b513485b54d38ee32503c947
MD5 c102e4e90cc22e774417d660d326a730
BLAKE2b-256 7935c765966d515928566cf526c0e8423f9bd978b4d0658e0410f1507ed93db9

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.0.31-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl
Algorithm Hash digest
SHA256 194bcefdd64a512f34d4d84231e503a8debc18b164aa92a38b9bdf8c56811032
MD5 d2ac68d2135129cd6194435f924e7e8b
BLAKE2b-256 f314e782b30c14a88f188ed788dd059a4aa397539ee8a6e5bf6a97b646b70961

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.0.31-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl
Algorithm Hash digest
SHA256 b7c02edb7b2cb716f55280efccd220a3bc698549cb5fb9ad8f51f3273058a192
MD5 c2611c5be41d25b44c706fa845cad752
BLAKE2b-256 f6670e22653ab223235abe8dbe5cb30b4ad237012e752b74f70bc5a693f58f20

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.0.31-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 c273eb8e41160fb704f7a7630dd3371538c3aca982a3449f3f7f15b21811d333
MD5 4c4c09d97cf2e31436bb955b9a5cbe91
BLAKE2b-256 6252284ec555250a49c1748da9b92eda33df4c9f329f57b8612d3a35215fd4c8

See more details on using hashes here.

File details

Details for the file ruff-0.0.31-py3-none-manylinux_2_12_x86_64.manylinux2010_x86_64.whl.

File metadata

File hashes

Hashes for ruff-0.0.31-py3-none-manylinux_2_12_x86_64.manylinux2010_x86_64.whl
Algorithm Hash digest
SHA256 937956b8f8dba3b5d3acd41370d28a79fd0edaf1ea810f7a831afdeab4ace520
MD5 f2bdc384977f80db9d6021df59f689a6
BLAKE2b-256 96c2bf8d9937d473774e3170558fb739dbe70976ed033667004ac1db18fc6691

See more details on using hashes here.

File details

Details for the file ruff-0.0.31-py3-none-manylinux_2_12_i686.manylinux2010_i686.whl.

File metadata

File hashes

Hashes for ruff-0.0.31-py3-none-manylinux_2_12_i686.manylinux2010_i686.whl
Algorithm Hash digest
SHA256 e4781474e6da44af96daa1cf9df1b2e7e8d0a7458aae4bf99767b078ed527818
MD5 858b0dd4b6bbff9b6dde238fca3f4111
BLAKE2b-256 0fde7bff7633ab3d29d10da2fed836a261ffa354e8eecc2b2fff637d8ac2ef52

See more details on using hashes here.

File details

Details for the file ruff-0.0.31-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.31-py3-none-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl
Algorithm Hash digest
SHA256 41c8e0e365bfca99163b08ae058e9dbea90d175db6c2b679c8e4e22a54664108
MD5 0d57cd9049df40fbf6b35540c7d5f0de
BLAKE2b-256 d476cc560b7717ea6cdc22c2584ab1b88ae2fccd1cdba7dd8ed72527c49237bd

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.0.31-py3-none-macosx_10_7_x86_64.whl
Algorithm Hash digest
SHA256 01cf6a3cb7252b68e0d8e6cf48abbb0c1a45137c3aded4b01cdcef2b342b9895
MD5 ff71dac73e97ff50415ced6c8d2b8218
BLAKE2b-256 4a827d2b4a244aa5a58a70a0bcc6d2ce4c90de32667541b6db5b0f755aec922e

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