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.48
    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 --select F403

See ruff --help for more:

ruff: An extremely fast Python linter.

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

Arguments:
  <FILES>...

Options:
  -v, --verbose
          Enable verbose logging
  -q, --quiet
          Disable all logging (but still exit with status code "1" upon detecting errors)
  -e, --exit-zero
          Exit with status code "0", even upon detecting errors
  -w, --watch
          Run in watch mode by re-running whenever files change
  -f, --fix
          Attempt to automatically fix lint errors
  -n, --no-cache
          Disable cache reads
      --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
      --per-file-ignores <PER_FILE_IGNORES>
          List of mappings from file pattern to code to exclude
      --format <FORMAT>
          Output serialization format for error messages [default: text] [possible values: text, json]
      --show-files
          See the files ruff will be run against with the current settings
      --show-settings
          See ruff's settings
      --add-noqa
          Enable automatic additions of noqa directives to failing lines
      --dummy-variable-rgx <DUMMY_VARIABLE_RGX>
          Regular expression matching the name of dummy variables
      --target-version <TARGET_VERSION>
          The minimum Python version that should be supported
  -h, --help
          Print help information
  -V, --version
          Print version information

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.)

ruff also implements some of the most popular Flake8 plugins natively, including:

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

  1. ruff does not yet support a few Python 3.9 and 3.10 language features, including structural pattern matching and parenthesized context managers.
  2. Flake8 has a plugin architecture and supports writing custom lint rules.

Rules

The โœ… emoji indicates a rule is enabled by default.

The ๐Ÿ›  emoji indicates that a rule is automatically fixable by the --fix command-line option.

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 IOError: ... โœ…
E999 SyntaxError SyntaxError: ... โœ…
W292 NoNewLineAtEndOfFile No newline at end of file โœ…
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 ExpressionsInStarAssignment 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 == and != 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 yield or yield from statement outside of a function/method โœ…
F706 ReturnOutsideFunction 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 โœ…
A001 BuiltinVariableShadowing Variable ... is shadowing a python builtin
A002 BuiltinArgumentShadowing Argument ... is shadowing a python builtin
A003 BuiltinAttributeShadowing Class attribute ... is shadowing a python builtin
B011 DoNotAssertFalse Do not assert False (python -O removes these calls), raise AssertionError() ๐Ÿ› 
B014 DuplicateHandlerException Exception handler with duplicate exception: ValueError ๐Ÿ› 
B025 DuplicateTryBlockException try-except block with duplicate exception Exception
C400 UnnecessaryGeneratorList Unnecessary generator - rewrite as a list comprehension
C401 UnnecessaryGeneratorSet Unnecessary generator - rewrite as a set comprehension
C402 UnnecessaryGeneratorDict Unnecessary generator - rewrite as a dict comprehension
C403 UnnecessaryListComprehensionSet Unnecessary list comprehension - rewrite as a set comprehension
C404 UnnecessaryListComprehensionDict Unnecessary list comprehension - rewrite as a dict comprehension
C405 UnnecessaryLiteralSet Unnecessary <list/tuple> literal - rewrite as a set literal
C406 UnnecessaryLiteralDict Unnecessary <list/tuple> literal - rewrite as a dict literal
C408 UnnecessaryCollectionCall Unnecessary <dict/list/tuple> call - rewrite as a literal
C409 UnnecessaryLiteralWithinTupleCall Unnecessary <list/tuple> literal passed to tuple() - remove the outer call to tuple()
C410 UnnecessaryLiteralWithinListCall Unnecessary <list/tuple> literal passed to list() - rewrite as a list literal
C415 UnnecessarySubscriptReversal Unnecessary subscript reversal of iterable within <reversed/set/sorted>()
T201 PrintFound print found ๐Ÿ› 
T203 PPrintFound pprint found ๐Ÿ› 
U001 UselessMetaclassType __metaclass__ = type is implied ๐Ÿ› 
U002 UnnecessaryAbspath abspath(__file__) is unnecessary in Python 3.9 and later ๐Ÿ› 
U003 TypeOfPrimitive Use str instead of type(...) ๐Ÿ› 
U004 UselessObjectInheritance Class ... inherits from object ๐Ÿ› 
U005 DeprecatedUnittestAlias assertEquals is deprecated, use assertEqual instead ๐Ÿ› 
U006 UsePEP585Annotation Use list instead of List for type annotations ๐Ÿ› 
U007 UsePEP604Annotation Use X | Y for type annotations ๐Ÿ› 
U008 SuperCallWithParameters Use super() instead of super(__class__, self) ๐Ÿ› 
D200 FitsOnOneLine One-line docstring should fit on one line
D205 NoBlankLineAfterSummary 1 blank line required between summary line and description
D209 NewLineAfterLastParagraph Multi-line docstring closing quotes should be on a separate line
D210 NoSurroundingWhitespace No whitespaces allowed surrounding docstring text
D212 MultiLineSummaryFirstLine Multi-line docstring summary should start at the first line
D213 MultiLineSummarySecondLine Multi-line docstring summary should start at the second line
D300 UsesTripleQuotes Use """triple double quotes"""
D400 EndsInPeriod First line should end with a period
D403 FirstLineCapitalized First word of the first line should be properly capitalized
D415 EndsInPunctuation First line should end with a period, question mark, or exclamation point
D419 NonEmpty Docstring is empty
M001 UnusedNOQA Unused noqa directive ๐Ÿ› 

Integrations

PyCharm

ruff can be installed as an External Tool in PyCharm. Open the Preferences pane, then navigate to "Tools", then "External Tools". From there, add a new tool with the following configuration:

Install ruff as an External Tool

ruff should then appear as a runnable action:

ruff as a runnable action

GitHub Actions

GitHub Actions has everything you need to run ruff out-of-the-box:

name: CI
on: push
jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - name: Install Python
        uses: actions/setup-python@v4
        with:
          python-version: "3.10"
      - name: Install dependencies
        run: |
          python -m pip install --upgrade pip
          pip install ruff
      - name: Run ruff
        run: ruff .

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

Contributing

Contributions are welcome and hugely appreciated. To get started, check out the contributing guidelines.

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.69.tar.gz (163.3 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.69-py3-none-win_amd64.whl (3.0 MB view details)

Uploaded Python 3Windows x86-64

ruff-0.0.69-py3-none-win32.whl (2.9 MB view details)

Uploaded Python 3Windows x86

ruff-0.0.69-py3-none-musllinux_1_2_x86_64.whl (3.2 MB view details)

Uploaded Python 3musllinux: musl 1.2+ x86-64

ruff-0.0.69-py3-none-musllinux_1_2_i686.whl (3.2 MB view details)

Uploaded Python 3musllinux: musl 1.2+ i686

ruff-0.0.69-py3-none-musllinux_1_2_armv7l.whl (2.9 MB view details)

Uploaded Python 3musllinux: musl 1.2+ ARMv7l

ruff-0.0.69-py3-none-musllinux_1_2_aarch64.whl (3.0 MB view details)

Uploaded Python 3musllinux: musl 1.2+ ARM64

ruff-0.0.69-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (3.2 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ x86-64

ruff-0.0.69-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl (2.8 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ s390x

ruff-0.0.69-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl (2.6 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ ppc64le

ruff-0.0.69-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl (2.6 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ ppc64

ruff-0.0.69-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl (3.3 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ i686

ruff-0.0.69-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl (2.3 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ ARMv7l

ruff-0.0.69-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (3.0 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ ARM64

ruff-0.0.69-py3-none-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl (6.0 MB view details)

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

ruff-0.0.69-py3-none-macosx_10_7_x86_64.whl (3.1 MB view details)

Uploaded Python 3macOS 10.7+ x86-64

File details

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

File metadata

  • Download URL: ruff-0.0.69.tar.gz
  • Upload date:
  • Size: 163.3 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.69.tar.gz
Algorithm Hash digest
SHA256 6eb0ead7db04144ed601891197b533cb81efa421dd69233228feb66570366279
MD5 4d2a76d0b787e3434a1f3cb5ebda2f32
BLAKE2b-256 c600a08ae4e064b96b722e9fd166ac432d4e5be86dcca8e6b4707729d0706f63

See more details on using hashes here.

File details

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

File metadata

  • Download URL: ruff-0.0.69-py3-none-win_amd64.whl
  • Upload date:
  • Size: 3.0 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.69-py3-none-win_amd64.whl
Algorithm Hash digest
SHA256 9545f7ef9fe830a1ed59e6ff48e3f0f8b4cb0ed6f11e6a60cc9a8f1f150608cd
MD5 8b9031995e9b09412821fa05065049ed
BLAKE2b-256 c820595518df9d0e47a45fde1ce1bff4ec85e2397ebabacbdbeb256579a2b7ee

See more details on using hashes here.

File details

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

File metadata

  • Download URL: ruff-0.0.69-py3-none-win32.whl
  • Upload date:
  • Size: 2.9 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.69-py3-none-win32.whl
Algorithm Hash digest
SHA256 b316ac8f51bde07a2566cb9b775019cd18d4c82ca71362176be98a77ee41de26
MD5 ce6c25d7e3aec2d44ec1859f7f229b54
BLAKE2b-256 f8158854b6909ee9df995e4fdb883df0584c336b12c02044d452ba3679b01aef

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.0.69-py3-none-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 b2a769fa5d3d4562c920bb112b3bad5c8338e178b433b007e1d5dc5b15fce003
MD5 4d545349d6280899120eaeb06ac5c783
BLAKE2b-256 83a73b653f2677b032456ce4f74dd1fa54d6e9880d14566f110835678c6b6ed3

See more details on using hashes here.

File details

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

File metadata

  • Download URL: ruff-0.0.69-py3-none-musllinux_1_2_i686.whl
  • Upload date:
  • Size: 3.2 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.69-py3-none-musllinux_1_2_i686.whl
Algorithm Hash digest
SHA256 77558ea22ecf3a8f3d26a109a4b16c0d436988073de09f9963ae6fff387c60a0
MD5 163cb1da212ddeae132afad47757c1d1
BLAKE2b-256 4cbdb8c7960ae19166e83d191a535c7b38b54ea0795598f3d3d9ac1b8373f907

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.0.69-py3-none-musllinux_1_2_armv7l.whl
Algorithm Hash digest
SHA256 e5ca8268343b2f1957cbab4c6203451940e601b3fd01632978c20eb86c52ac85
MD5 cf4bded2033fbe21f4fa778c903efb87
BLAKE2b-256 9ff7006bf4fcfe7d8c2c91115004d68a9d493540974357b81e88c4a8de8c8c73

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.0.69-py3-none-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 79f0497d3b79428b73c937fca7dcf8db6bf1efb388e2be44142a990eb6dd206c
MD5 f01c7a8ab7db1177f30963cba241f255
BLAKE2b-256 81fd6ff05238df89f1d92005ea286df61aedfdddfab71cc828c9725987df2c4a

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.0.69-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 cd8c0fef0fb6f6dd71dd07e5b98d7df7ffd6fdbd229f39d0d408e0f1868e3b6f
MD5 4210cbed50f612e9f82ee45be0c0fac0
BLAKE2b-256 1584011a54e4107429023fdcb6396fbb0e82132f0ac26411559861a9c80e8e6d

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.0.69-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl
Algorithm Hash digest
SHA256 f26ac7ef0d0a79f767cc5fda4b18cbd6c0956f1e410add3b5d7942898b7f655e
MD5 d40fa70eabd6b20dabc0702756968c4d
BLAKE2b-256 29d235c2a0c981142b350b5997d9deabfed5984f034e7664c9eb92b34c502f5d

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.0.69-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl
Algorithm Hash digest
SHA256 2d581fde100567c17ab87fabe482477d6357f2495f70160d7d98dffdc0879c98
MD5 692cc6c1b813ef79cb2311714e15b40e
BLAKE2b-256 c5e6140175ba1820a9e95f011669502e4ecd74298e16d58964f796edea35b55f

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.0.69-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl
Algorithm Hash digest
SHA256 32be9cfeacff12ada6d13d70e584d97effa22a52311aaec4310c003dc0bbcf42
MD5 35559e12c0945462ecef62f3bc12de76
BLAKE2b-256 3e22f9d25ddb917b2a5e2d470e1aa9af67dd2658336ae21e68f65dce3976d89c

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.0.69-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 4e3690d7bc25c9d62fc1128165f34f0a7cb6079bf1d0191c086cd166cc19aa01
MD5 849b3aabf3445d8b899da9bf2caffd0c
BLAKE2b-256 29db4c85a006209f6be59368c5d3b4290f831b5fe2e3e5653d8c8760ba54c254

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.0.69-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl
Algorithm Hash digest
SHA256 7163a294c2e5ad37933950337f83d40253d99dcd3da6618b2fc7142db475c154
MD5 f6830e853de7a6e2020a2297695a7573
BLAKE2b-256 8070be8ba502a50db080bb5c471cd32419064af1795d6045c774ad1e30058b3a

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.0.69-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 584660d5c4649c720fdfe3c656802c3888551a882abfae5c633f3591782f2cff
MD5 380f25fb3452c76ef3728db8b190eedb
BLAKE2b-256 1692a6a32212818d9f5e0c3e098a45382e22b5f36a65343ae93cdc5d65b1f6cd

See more details on using hashes here.

File details

Details for the file ruff-0.0.69-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.69-py3-none-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl
Algorithm Hash digest
SHA256 79264e5dace5b4d0f4e15ffc4ff1cb1ab611eefc4dced2b19a89170770d10473
MD5 afeca267b20870ffc3f4f07095e2d624
BLAKE2b-256 4fb4b27322e73bdfd7877a217f4e10ba0bcea36b18064e8969e49c930e80ec44

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.0.69-py3-none-macosx_10_7_x86_64.whl
Algorithm Hash digest
SHA256 83da95d4f6f81aa850e629f6b56c2f131b299eaf582c966d625e4d8e49b09088
MD5 6bc4a69d68dc8de77638cfc44e1aa5ac
BLAKE2b-256 03cfcf442dce0297135a98c721a14f8366ea511b230d23c9965e0ffa8d9ea398

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