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.73
    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:
      --config <CONFIG>
          Path to the `pyproject.toml` file to use for configuration
  -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
      --stdin-filename <STDIN_FILENAME>
          The name of the file when passing it through stdin
  -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
C411 UnnecessaryListCall Unnecessary list call - remove the outer call to list()
C413 UnnecessaryCallAroundSorted Unnecessary <list/reversed> call around sorted()
C414 UnnecessaryDoubleCastOrProcess Unnecessary <list/reversed/set/sorted/tuple> call within <list/set/sorted/tuple>().
C415 UnnecessarySubscriptReversal Unnecessary subscript reversal of iterable within <reversed/set/sorted>()
C416 UnnecessaryComprehension Unnecessary <list/set> comprehension - rewrite using <list/set>()
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) ๐Ÿ› 
D100 PublicModule Missing docstring in public module
D101 PublicClass Missing docstring in public class
D102 PublicMethod Missing docstring in public method
D103 PublicFunction Missing docstring in public function
D104 PublicPackage Missing docstring in public package
D105 MagicMethod Missing docstring in magic method
D106 PublicNestedClass Missing docstring in public nested class
D107 PublicInit Missing docstring in init
D200 FitsOnOneLine One-line docstring should fit on one line
D201 NoBlankLineBeforeFunction No blank lines allowed before function docstring (found 1)
D202 NoBlankLineAfterFunction No blank lines allowed after function docstring (found 1)
D203 OneBlankLineBeforeClass 1 blank line required before class docstring
D204 OneBlankLineAfterClass 1 blank line required after class docstring
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
D211 NoBlankLineBeforeClass No blank lines allowed before class docstring
D212 MultiLineSummaryFirstLine Multi-line docstring summary should start at the first line
D213 MultiLineSummarySecondLine Multi-line docstring summary should start at the second line
D214 SectionNotOverIndented Section is over-indented ("Returns")
D215 SectionUnderlineNotOverIndented Section underline is over-indented ("Returns")
D300 UsesTripleQuotes Use """triple double quotes"""
D400 EndsInPeriod First line should end with a period
D402 NoSignature First line should not be the function's 'signature'
D403 FirstLineCapitalized First word of the first line should be properly capitalized
D404 NoThisPrefix First word of the docstring should not be This
D405 CapitalizeSectionName Section name should be properly capitalized ("returns")
D406 NewLineAfterSectionName Section name should end with a newline ("Returns")
D407 DashedUnderlineAfterSection Missing dashed underline after section ("Returns")
D408 SectionUnderlineAfterName Section underline should be in the line following the section's name ("Returns")
D409 SectionUnderlineMatchesSectionLength Section underline should match the length of its name ("Returns")
D410 BlankLineAfterSection Missing blank line after section ("Returns")
D411 BlankLineBeforeSection Missing blank line before section ("Returns")
D412 NoBlankLinesBetweenHeaderAndContent No blank lines allowed between a section header and its content ("Returns")
D413 BlankLineAfterLastSection Missing blank line after last section ("Returns")
D414 NonEmptySection Section has no content ("Returns")
D415 EndsInPunctuation First line should end with a period, question mark, or exclamation point
D417 DocumentAllArguments Missing argument descriptions in the docstring: x, y
D418 SkipDocstring Function decorated with @overload shouldn't contain a docstring
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.73.tar.gz (179.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.73-py3-none-win_amd64.whl (3.0 MB view details)

Uploaded Python 3Windows x86-64

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

Uploaded Python 3Windows x86

ruff-0.0.73-py3-none-musllinux_1_2_x86_64.whl (3.3 MB view details)

Uploaded Python 3musllinux: musl 1.2+ x86-64

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

Uploaded Python 3musllinux: musl 1.2+ i686

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

Uploaded Python 3musllinux: musl 1.2+ ARMv7l

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

Uploaded Python 3musllinux: musl 1.2+ ARM64

ruff-0.0.73-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.73-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl (2.9 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ s390x

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

Uploaded Python 3manylinux: glibc 2.17+ ppc64le

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

Uploaded Python 3manylinux: glibc 2.17+ ppc64

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

Uploaded Python 3manylinux: glibc 2.17+ i686

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

Uploaded Python 3manylinux: glibc 2.17+ ARMv7l

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

Uploaded Python 3manylinux: glibc 2.17+ ARM64

ruff-0.0.73-py3-none-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl (6.1 MB view details)

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

ruff-0.0.73-py3-none-macosx_10_7_x86_64.whl (3.2 MB view details)

Uploaded Python 3macOS 10.7+ x86-64

File details

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

File metadata

  • Download URL: ruff-0.0.73.tar.gz
  • Upload date:
  • Size: 179.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.73.tar.gz
Algorithm Hash digest
SHA256 89fd1e7a12cb8d5c98cc80ced37d2c13d7c5e317171f0f896850a5706c035945
MD5 ebb050479e153f7b454490d598fe5754
BLAKE2b-256 5cbf9d3e9fa439dcc730ff4b00e151f3446427625208a0e4a9804ccacd1d31d3

See more details on using hashes here.

File details

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

File metadata

  • Download URL: ruff-0.0.73-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.73-py3-none-win_amd64.whl
Algorithm Hash digest
SHA256 ac45471d882d869259e356bc6e271f123d719b20a51bef3df53843e919188aeb
MD5 86ba1b2af96675c0a886f76d8aa66b6a
BLAKE2b-256 594f43930c9418829dc6723315ff24451fc7be9a08e309a98a113c067beb97e7

See more details on using hashes here.

File details

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

File metadata

  • Download URL: ruff-0.0.73-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.73-py3-none-win32.whl
Algorithm Hash digest
SHA256 3956cde0741168a58d4a6581b7df5471b3d7d8bbf1d41af95e894aca041e4469
MD5 db8ad4987350569e883507c5a40b4454
BLAKE2b-256 fbfc7c3a4f6dbaec98825e81fe38ba6a1c34859c90bd55f9eb9f60bfccb2ec20

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.0.73-py3-none-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 c5d5961af8f976472abf6ea516d25d3728931882e22718e8c7bc19394ee933fe
MD5 31b4005cedec3d47e6cbf47f4ea651e9
BLAKE2b-256 44195090b57f0075ff10b3eef73c815d1cb64a8c3fa4b045938110e91c5daeca

See more details on using hashes here.

File details

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

File metadata

  • Download URL: ruff-0.0.73-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.73-py3-none-musllinux_1_2_i686.whl
Algorithm Hash digest
SHA256 8a88322acd2f1b8c3d2addc0b42d4f73f3a3e4864d8d266d5f25a22c581bd5fb
MD5 ed816c5a4b1997cc19565281f9646b16
BLAKE2b-256 79a9fef25e23cca6639d1a01014b0495eb25249463cd822cc57472b2e052da29

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.0.73-py3-none-musllinux_1_2_armv7l.whl
Algorithm Hash digest
SHA256 1e8f00e2cf4cfb1037f30d0d4ceca0118c446755622b238cbdf9d43e367aec56
MD5 3093522e4d752cd4784422c5fffe68c3
BLAKE2b-256 92415d698d3240012c854beb6f9356ca05d454352868b078d7c3f8e1f9059200

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.0.73-py3-none-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 d8f6ae4a3a611b1c2170cf3a26e85d653bfcc86b23868599f3f5864b6173a4c7
MD5 e3cef5a07af79f0b97a7dc6f480a987d
BLAKE2b-256 24b7c1c2215a8186c47293865c52866cff91a160d3178ce498e2f1a8db26331b

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.0.73-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 dd492c4d5aa4477a032597afbf85f1d1fd89aa7d4d357908dda0c7f4b18cedd4
MD5 573e3d7f42cb84cc76a3e7d20a44fcff
BLAKE2b-256 5037c0bf3a2219f212ab98f74229b3f545e91df988ba7963d199c661d4201844

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.0.73-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl
Algorithm Hash digest
SHA256 5e199a01726453ee0e744af52f4667be5b807ccd5a0312f0c624a09ce7e64648
MD5 54b0a354b712c2ed4ea9be6797200442
BLAKE2b-256 3d335ddc0bc4dc91fa50540d2de55a56e82bf9016ba10e81aff8840c1f6f7af0

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.0.73-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl
Algorithm Hash digest
SHA256 aba4560541f049c76de0f6591d0c32b6447b7f06510806b88b4a9cb9f36aa06c
MD5 c544df51cb8bf86a63fb013287d14cbd
BLAKE2b-256 f1e10cd7b5fabdcb7cb2603604be569508c7e9b62730643c52035f71141c825b

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.0.73-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl
Algorithm Hash digest
SHA256 2cc097031f4fd1c8f4a3906056479fd64851ec58c5b8e51243cef8aa8e546504
MD5 4473aa89582247fbe9473949e502e303
BLAKE2b-256 5ae81f50c6c7b33415ac867318e26f623c67b766c68f67622bb92f0679d60e87

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.0.73-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 06045907f8464ed7400a9397d99a82540bfa8d053e83880fb2791750ffeaafa3
MD5 a5fe7901b47b63fae2b020456a271f0a
BLAKE2b-256 49e90e07c746bd2960a105aaa156bf1116a3a670976f57be43e10ea2c97f4213

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.0.73-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl
Algorithm Hash digest
SHA256 bd451190cc2267ac9656217d09638d0356db588c2ff1e1d6d01410f697763f39
MD5 31ff2ba0c4fc9f206720693825cd2bb4
BLAKE2b-256 3d68b42c1d0e5f743d87e9f54901a2c5cd088ae9cb78b5821cce20945ac56a38

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.0.73-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 10fafcf92ec55124a59738e287bfcb5f9e656a32fe95dac2d7172e80d5d15fee
MD5 dc275cdeddf3d52bf6919b7e290d5317
BLAKE2b-256 3d45fd1cd955f9f701fb52e98cb8d4b41235073fedb3894a3a63698695430717

See more details on using hashes here.

File details

Details for the file ruff-0.0.73-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.73-py3-none-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl
Algorithm Hash digest
SHA256 56ec6e770926f72dbd2dcaf15a19d17573b7addc4bb8ebe7dc92d96a358d26ca
MD5 58e1f5f613c90b42bff7548506a91625
BLAKE2b-256 4819b2a7789babc257f8dc5cdca49d9bc2182dfc78766af873e0474646424094

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.0.73-py3-none-macosx_10_7_x86_64.whl
Algorithm Hash digest
SHA256 e979b0580140a94fc78e55460951f51034d3d30291c631eb65cf24c262653ded
MD5 6e4f0d65404b1c825ea5d840a1642d8a
BLAKE2b-256 7cb15b710206474ccd291848b4d0f3b6aadb91c92ef1c883f488e9a89059c6f6

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