Skip to main content

An extremely fast Python linter, written in Rust.

Project description

ruff

image image image Actions status

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
  • ⚖️ Near-complete parity with the built-in Flake8 rule set

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:

repos:
  - repo: https://github.com/charliermarsh/ruff-pre-commit
    rev: v0.0.40
    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.46)
An extremely fast Python linter.

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

ARGS:
    <FILES>...

OPTIONS:
        --select <SELECT>...
            List of error codes to enable
        --extend-select <EXTEND_SELECT>...
            Like --select, but adds additional error codes on top of the selected ones
        --ignore <IGNORE>...
            List of error codes to ignore
        --extend-ignore <EXTEND_IGNORE>...
            Like --ignore, but adds additional error codes on top of the ignored ones
        --exclude <EXCLUDE>...
            List of paths, used to exclude files and/or directories from checks
        --extend-exclude <EXTEND_EXCLUDE>...
            Like --exclude, but adds additional files and directories on top of the excluded ones
    -e, --exit-zero
            Exit with status code "0", even upon detecting errors
    -f, --fix
            Attempt to automatically fix lint errors
        --format <FORMAT>
            Output serialization format for error messages [default: text] [possible values: text,
            json]
    -h, --help
            Print help information
    -n, --no-cache
            Disable cache reads
        --per-file-ignores <PER_FILE_IGNORES>...
            List of mappings from file pattern to code to exclude
    -q, --quiet
            Disable all logging (but still exit with status code "1" upon detecting errors)
        --add-noqa
            Enable automatic additions of noqa directives to failing lines
        --show-files
            See the files ruff will be run against with the current settings
        --show-settings
            See ruff's settings
    -v, --verbose
            Enable verbose logging
    -V, --version
            Print version information
    -w, --watch
            Run in watch mode by re-running whenever files change

Excluding files

Exclusions are based on globs, and can be either:

  • Single-path patterns, like .mypy_cache (to exclude any directory named .mypy_cache in the tree), foo.py (to exclude any file named foo.py), or foo_*.py (to exclude any file matching foo_*.py ).
  • Relative patterns, like directory/foo.py (to exclude that specific file) or directory/*.py (to exclude any Python files in directory). Note that these paths are relative to the project root (e.g., the directory containing your pyproject.toml).

Ignoring errors

To omit a lint check entirely, add it to the "ignore" list via --ignore or --extend-ignore, either on the command-line or in your project.toml file.

To ignore an error in-line, ruff uses a noqa system similar to Flake8. To ignore an individual error, add # noqa: {code} to the end of the line, like so:

# Ignore F841.
x = 1  # noqa: F841

# Ignore E741 and F841.
i = 1  # noqa: E741, F841

# Ignore _all_ errors.
x = 1  # noqa

Note that, for multi-line strings, the noqa directive should come at the end of the string, and will apply to the entire body, like so:

"""Lorem ipsum dolor sit amet.

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
"""  # noqa: E501

ruff supports several (experimental) workflows to aid in noqa management.

First, ruff provides a special error code, M001, to enforce that your noqa directives are "valid", in that the errors they say they ignore are actually being triggered on that line (and thus suppressed). You can run ruff /path/to/file.py --extend-select M001 to flag unused noqa directives.

Second, ruff can automatically remove unused noqa directives via its autofix functionality. You can run ruff /path/to/file.py --extend-select M001 --fix to automatically remove unused noqa directives.

Third, ruff can automatically add noqa directives to all failing lines. This is useful when migrating a new codebase to ruff. You can run ruff /path/to/file.py --add-noqa to automatically add noqa directives to all failing lines, with the appropriate error codes.

Compatibility with Black

ruff is compatible with Black 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 stylistic lint rules that are obviated by autoformatting.

Parity with Flake8

ruff's goal is to achieve feature-parity with Flake8 when used (1) without plugins, (2) alongside Black, and (3) on Python 3 code.

Under those conditions, ruff implements 44 out of 60 rules. (ruff is missing: 14 rules related to string .format calls, 1 rule related to docstring parsing, and 1 rule related to redefined variables.)

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

  1. Flake8 has a plugin architecture and supports writing custom lint rules.
  2. 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 (89 > 88 characters)
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
E721 TypeComparison do not compare types, use isinstance()
E722 DoNotUseBareExcept Do not use bare except
E731 DoNotAssignLambda Do not assign a lambda expression, use a def
E741 AmbiguousVariableName ambiguous variable name '...'
E742 AmbiguousClassName ambiguous class name '...'
E743 AmbiguousFunctionName ambiguous function name '...'
E902 IOError ...
E999 SyntaxError SyntaxError: ...
F401 UnusedImport ... imported but unused
F402 ImportShadowedByLoopVar import '...' from line 1 shadowed by loop variable
F403 ImportStarUsed from ... import * used; unable to detect undefined names
F404 LateFutureImport from future imports must occur at the beginning of the file
F405 ImportStarUsage '...' may be undefined, or defined from star imports: ...
F406 ImportStarNotPermitted from ... import * only allowed at module level
F407 FutureFeatureNotDefined future feature '...' is not defined
F541 FStringMissingPlaceholders f-string without any placeholders
F601 MultiValueRepeatedKeyLiteral Dictionary key literal repeated
F602 MultiValueRepeatedKeyVariable Dictionary key ... repeated
F621 TooManyExpressionsInStarredAssignment too many expressions in star-unpacking assignment
F622 TwoStarredExpressions two starred expressions in assignment
F631 AssertTuple Assert test is a non-empty tuple, which is always True
F632 IsLiteral use ==/!= to compare constant literals
F633 InvalidPrintSyntax use of >> is invalid with print function
F634 IfTuple If test is a tuple, which is always True
F701 BreakOutsideLoop break outside loop
F702 ContinueOutsideLoop continue not properly in loop
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
F722 ForwardAnnotationSyntaxError syntax error in forward annotation '...'
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
M001 UnusedNOQA Unused noqa directive

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.ruff]
line-length = 88
extend-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 10 --runs 100 \
  "./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 ± σ):     297.4 ms ±   4.9 ms    [User: 2460.0 ms, System: 67.2 ms]
  Range (min  max):   287.7 ms  312.1 ms    100 runs

  Warning: Ignoring non-zero exit code.

Benchmark 2: ./target/release/ruff ./resources/test/cpython/
  Time (mean ± σ):      79.6 ms ±   7.3 ms    [User: 59.7 ms, System: 356.1 ms]
  Range (min  max):    62.4 ms  111.2 ms    100 runs

  Warning: Ignoring non-zero exit code.

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" \
  "flake8 resources/test/cpython" \
  "python -m scripts.run_flake8 resources/test/cpython"

In order, these evaluate:

  • ruff
  • Pylint
  • PyFlakes
  • autoflake
  • pycodestyle
  • Flake8
  • Flake8, with a hack to enable multiprocessing on macOS

(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 ± σ):     297.9 ms ±   7.0 ms    [User: 2436.6 ms, System: 65.9 ms]
  Range (min  max):   289.9 ms  314.6 ms    10 runs

  Warning: Ignoring non-zero exit code.

Benchmark 2: pylint --recursive=y resources/test/cpython/
  Time (mean ± σ):     37.634 s ±  0.225 s    [User: 36.728 s, System: 0.853 s]
  Range (min  max):   37.201 s  38.106 s    10 runs

  Warning: Ignoring non-zero exit code.

Benchmark 3: pyflakes resources/test/cpython
  Time (mean ± σ):     40.950 s ±  0.449 s    [User: 40.688 s, System: 0.229 s]
  Range (min  max):   40.348 s  41.671 s    10 runs

  Warning: Ignoring non-zero exit code.

Benchmark 4: autoflake --recursive --expand-star-imports --remove-all-unused-imports --remove-unused-variables --remove-duplicate-keys resources/test/cpython
  Time (mean ± σ):     11.562 s ±  0.160 s    [User: 107.022 s, System: 1.143 s]
  Range (min  max):   11.417 s  11.917 s    10 runs

Benchmark 5: pycodestyle resources/test/cpython
  Time (mean ± σ):     67.428 s ±  0.985 s    [User: 67.199 s, System: 0.203 s]
  Range (min  max):   65.313 s  68.496 s    10 runs

  Warning: Ignoring non-zero exit code.

Benchmark 6: flake8 resources/test/cpython
  Time (mean ± σ):     116.099 s ±  1.178 s    [User: 115.217 s, System: 0.845 s]
  Range (min  max):   114.180 s  117.724 s    10 runs

  Warning: Ignoring non-zero exit code.

Benchmark 7: python -m scripts.run_flake8 resources/test/cpython
  Time (mean ± σ):     20.477 s ±  0.349 s    [User: 142.372 s, System: 1.504 s]
  Range (min  max):   20.107 s  21.183 s    10 runs

Summary
  './target/release/ruff ./resources/test/cpython/ --no-cache' ran
   38.81 ± 1.05 times faster than 'autoflake --recursive --expand-star-imports --remove-all-unused-imports --remove-unused-variables --remove-duplicate-keys resources/test/cpython'
   68.74 ± 1.99 times faster than 'python -m scripts.run_flake8 resources/test/cpython'
  126.33 ± 3.05 times faster than 'pylint --recursive=y resources/test/cpython/'
  137.46 ± 3.55 times faster than 'pyflakes resources/test/cpython'
  226.35 ± 6.23 times faster than 'pycodestyle resources/test/cpython'
  389.73 ± 9.92 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.46.tar.gz (115.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.46-py3-none-win_amd64.whl (2.6 MB view details)

Uploaded Python 3Windows x86-64

ruff-0.0.46-py3-none-win32.whl (2.5 MB view details)

Uploaded Python 3Windows x86

ruff-0.0.46-py3-none-musllinux_1_2_x86_64.whl (2.8 MB view details)

Uploaded Python 3musllinux: musl 1.2+ x86-64

ruff-0.0.46-py3-none-musllinux_1_2_i686.whl (2.7 MB view details)

Uploaded Python 3musllinux: musl 1.2+ i686

ruff-0.0.46-py3-none-musllinux_1_2_armv7l.whl (2.5 MB view details)

Uploaded Python 3musllinux: musl 1.2+ ARMv7l

ruff-0.0.46-py3-none-musllinux_1_2_aarch64.whl (2.6 MB view details)

Uploaded Python 3musllinux: musl 1.2+ ARM64

ruff-0.0.46-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (2.7 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ x86-64

ruff-0.0.46-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl (2.3 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ s390x

ruff-0.0.46-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl (2.1 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ ppc64le

ruff-0.0.46-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl (2.2 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ ppc64

ruff-0.0.46-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl (2.8 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ i686

ruff-0.0.46-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl (1.9 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ ARMv7l

ruff-0.0.46-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (2.6 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ ARM64

ruff-0.0.46-py3-none-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl (5.2 MB view details)

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

ruff-0.0.46-py3-none-macosx_10_7_x86_64.whl (2.7 MB view details)

Uploaded Python 3macOS 10.7+ x86-64

File details

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

File metadata

  • Download URL: ruff-0.0.46.tar.gz
  • Upload date:
  • Size: 115.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.46.tar.gz
Algorithm Hash digest
SHA256 49591e207f47e82acd309623cbf81d5cfff9a6c5c18c65ce0c44043964b496ad
MD5 c790e29c99ed282fa452f93fdbc57f9a
BLAKE2b-256 a687ea1427a35a52be33822a3d43200ac2fc00fccb724dc89110df75054bbcc2

See more details on using hashes here.

File details

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

File metadata

  • Download URL: ruff-0.0.46-py3-none-win_amd64.whl
  • Upload date:
  • Size: 2.6 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.46-py3-none-win_amd64.whl
Algorithm Hash digest
SHA256 a0d1f73b4dbf441c0f7050ac79384236aa4c23925b4537b203f08263dc6f04b8
MD5 b58660f8235bab59aaa7c839a5c62273
BLAKE2b-256 71e67ba8d8f4dd739b9b01e206322e1eeb7fea284661f6bb97ded4707c2bca01

See more details on using hashes here.

File details

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

File metadata

  • Download URL: ruff-0.0.46-py3-none-win32.whl
  • Upload date:
  • Size: 2.5 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.46-py3-none-win32.whl
Algorithm Hash digest
SHA256 fa04cdb4a8d285f314ded6b03c633f09c4aeef142aa9376e305a34b01086b73c
MD5 de3c16f30566e30ebb797bc6f26c127f
BLAKE2b-256 c2d1bfe3b6fccf238b5d270be0a89ce557b6a4404c82d524a965d8fc6bb7b149

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.0.46-py3-none-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 e1a2e38af4a96d35b72a560dfde5664b846e89cb91aaa633d1bc21497c8c5ce8
MD5 8eb95010473c3f7b4d1833bcd418d6d7
BLAKE2b-256 ef077f06e10f36298051f92adb9c01253f98ebd031bf1eb794e98c26d633c9fe

See more details on using hashes here.

File details

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

File metadata

  • Download URL: ruff-0.0.46-py3-none-musllinux_1_2_i686.whl
  • Upload date:
  • Size: 2.7 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.46-py3-none-musllinux_1_2_i686.whl
Algorithm Hash digest
SHA256 469ae22277578963ae5962c1c786ed66030132c4fd2f02322c33bcbb04ea7c13
MD5 5e67d5c9fd0504d6eac32ec1e75f60ee
BLAKE2b-256 470c374e06a0bb83b666a43f5612cf58b9134d5644e2fa6d9858a7ad107ad71f

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.0.46-py3-none-musllinux_1_2_armv7l.whl
Algorithm Hash digest
SHA256 2ffec826f6db6a84d989b1f4ba3ecb0a3a5720b4ec220de9f9e84abeec5233c0
MD5 b49d7d2451e264c4250f08836e08008a
BLAKE2b-256 c752ac1c137b8404761d6173ae4df4b70138e1810916df173fcb4f73ce29b284

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.0.46-py3-none-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 1f6a81fafec2f18ff223db056706f5710eadc6ba69f8da279614fe0ea9057aaf
MD5 b2fe903038fb1d6d55b8f2006baf2059
BLAKE2b-256 55610ca9b17def9967256bf58fb797129a2639092ff032346f293fbc54542146

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.0.46-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 f09f43c6bd866bfa0d54c10223025c5b664395a7f75dcaef397d06748a92be67
MD5 8179e85778ffd2e9a38d13038e0c15fa
BLAKE2b-256 dc6198a34c18de684f7feb5eda4d6188a0b3dba2b8f6d85c15b0f077571418a5

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.0.46-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl
Algorithm Hash digest
SHA256 e4cec845ec85e1724e8cf03590ca9db9ac91b22f60621cc6256733f747125217
MD5 200d4f966966725f743c14e9ca1d8c32
BLAKE2b-256 720da826b9a4edab0a281ca73416491c21b937801f115cfdfd7699f2271605cd

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.0.46-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl
Algorithm Hash digest
SHA256 9e67bcb22ed7cea0e4c1dac0ff43e412666060df2165344bbce5d0ecf8fdbe9e
MD5 ef56b1849ff6aea87103049cbd236f33
BLAKE2b-256 9d0bf3e5084a0a5c1e1f2b43c35728b4fe9db7b7fe099aaf4d678bcace1f334a

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.0.46-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl
Algorithm Hash digest
SHA256 6566885207244dbe20af92bb1e33440eed0bdd6da6b6db0071b5c1a3b77b700e
MD5 d88916e2130fde9e8c3b6835757bb782
BLAKE2b-256 563c56ebb2a786d6abb5c46b3a42f83f12ffb45d0d30bb1c78d1c527a3d2bd14

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.0.46-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 a094878372c89eaeb83b58462c897fd93b9088a45292bf56ba72db8eef7e7502
MD5 77e0e155916ecd1bffcc3b9320bd64d5
BLAKE2b-256 f9975e800f2842d68ca2e18ab35c34a4238abbef63b7788b09677a104975f2cc

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.0.46-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl
Algorithm Hash digest
SHA256 e0b869ddcdd79771299bf42c6e9e193a5503d17ec6de9353c41984a7f8a989c8
MD5 c2ae2d48399889d1e8acde02e4e22bc1
BLAKE2b-256 afde726d118714d954226efac3919b4e212cf6550f957d844e16e2fc0a6b6375

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.0.46-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 39c02116b29f39076898f68ebdb5986385a86131ec209c3896dcc5ecc5069835
MD5 e6983b3b22b9e30e909b2822d882af73
BLAKE2b-256 665ed0d1f0eefaa0de2fd65cc592e1aff5e4ff4ee5b1bfdce4670ab37f814b72

See more details on using hashes here.

File details

Details for the file ruff-0.0.46-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.46-py3-none-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl
Algorithm Hash digest
SHA256 b45ecd5bd223b0196574f1bf8070b8122e1ba4419bd27b2f753249aabf634e8a
MD5 b7c38550beab69627a83eed28e4828c4
BLAKE2b-256 9e2c3bec88808a37edf76a8995114666c367220df31310810fc2a0e5aa91714b

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.0.46-py3-none-macosx_10_7_x86_64.whl
Algorithm Hash digest
SHA256 9d0c85fdc4b226da5d7ca96f655374daa688fd1cfb10e9e74df4aa6672aee07f
MD5 7b3152b8b6e27f6a218aba68a5bbd78b
BLAKE2b-256 3df3c5126f6e40bc41e986229af25bb196f95b554f931f72a335e2c7aee752b0

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