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.75
    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>()
C417 UnnecessaryMap Unnecessary map usage - rewrite using a <list/set/dict> comprehension
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
D206 IndentWithSpaces Docstring should be indented with spaces, not tabs
D207 NoUnderIndentation Docstring is under-indented
D208 NoOverIndentation Docstring is over-indented
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
D416 SectionNameEndsInColon Section name should end with a colon ("Returns")
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.75.tar.gz (184.0 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.75-py3-none-win_amd64.whl (3.0 MB view details)

Uploaded Python 3Windows x86-64

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

Uploaded Python 3Windows x86

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

Uploaded Python 3musllinux: musl 1.2+ x86-64

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

Uploaded Python 3musllinux: musl 1.2+ i686

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

Uploaded Python 3musllinux: musl 1.2+ ARMv7l

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

Uploaded Python 3musllinux: musl 1.2+ ARM64

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

Uploaded Python 3manylinux: glibc 2.17+ s390x

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

Uploaded Python 3manylinux: glibc 2.17+ ppc64le

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

Uploaded Python 3manylinux: glibc 2.17+ ppc64

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

Uploaded Python 3manylinux: glibc 2.17+ i686

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

Uploaded Python 3manylinux: glibc 2.17+ ARMv7l

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

Uploaded Python 3manylinux: glibc 2.17+ ARM64

ruff-0.0.75-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.75-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.75.tar.gz.

File metadata

  • Download URL: ruff-0.0.75.tar.gz
  • Upload date:
  • Size: 184.0 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.75.tar.gz
Algorithm Hash digest
SHA256 6df3ea6343501fdcc02bc12ab45b42220dbfc5a1b202c1879eefd9695d111ef3
MD5 8955d25ca9e6c047d353b7d77d0024c9
BLAKE2b-256 49217a99cb17882dcb26413c479c717bfc9e799b85aab5107c013d4d6561df4b

See more details on using hashes here.

File details

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

File metadata

  • Download URL: ruff-0.0.75-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.75-py3-none-win_amd64.whl
Algorithm Hash digest
SHA256 9b95dd08bc90def570e206645f34bed117ba9c240c14ad80798b9637662c33e4
MD5 d395ac4d4ec0ae36786bf66b0b9e7d34
BLAKE2b-256 a6017cdd602886b1264b62a6b9e97b4efe9134dfd097a41b494326adeb419373

See more details on using hashes here.

File details

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

File metadata

  • Download URL: ruff-0.0.75-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.75-py3-none-win32.whl
Algorithm Hash digest
SHA256 dce3c5a7117b996aa3e0290f6b6d31567e8788654d4a6585e0c6f907da827d45
MD5 8d62d1d122ce6b138eae15a52aa23a4c
BLAKE2b-256 10a1b051192c6054eb5b38355b81f9288232d9b83b84627d1afa8ae5bfa9b779

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.0.75-py3-none-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 476783d8fc0d8781699d3af2b8970635c2a46494fa31b06d138f06b43a186685
MD5 1224786c89ae9b3cdcdf021cd593dd5c
BLAKE2b-256 0bfad427b023fcf4da7ef5f8ff64a2640e69f9a916e2ce88030bbc077e382fa0

See more details on using hashes here.

File details

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

File metadata

  • Download URL: ruff-0.0.75-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.75-py3-none-musllinux_1_2_i686.whl
Algorithm Hash digest
SHA256 0c9b2b368fdaee7094a0cdb9f67ae5d33b28e9619a01cd720f9c146d7a834bc6
MD5 26058aa686643d62f78077b2b175e62d
BLAKE2b-256 b7966498972404a252d0fde19d033d8e4f242c52f7ad5c4cd4ee7f48d6bd5e52

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.0.75-py3-none-musllinux_1_2_armv7l.whl
Algorithm Hash digest
SHA256 5655f93ab56c638a842013b1e3008f02a948646d57064f4e1a77574cd04df19f
MD5 526403acbbb14e509230a4b02b5022b9
BLAKE2b-256 550d1966aa0489b7e4dc34f1d8dd831b3a79f92fe397dc3bbb6d21ebb3ad6433

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.0.75-py3-none-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 2f264c9532a010ab57a6f18130f56b920195c189d1cbe37fbefd7b73e2924ab3
MD5 699893031c6c7afc8fab66b04fdcfbac
BLAKE2b-256 0b3cda04eb47779066eb7f79d0382c3cbdb70745b2d0b04765f12df1f25482ea

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.0.75-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 8f0b999e577171dbce18bcf2dbc5e688969049e7f83648088decee6062479666
MD5 c8a60a654aa320d6927b43f81d7693f9
BLAKE2b-256 1563c3ffd52b44aceb3e28e9332329023d5c2af38dece8ac68ce605518bc41c8

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.0.75-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl
Algorithm Hash digest
SHA256 b034167c9682623d6ff1418d2eb7be78a4015076422f0f00838e74c262c4129e
MD5 af8b23b57abd8a02c088e6bbe9cdd082
BLAKE2b-256 06a6c2009ec1738a8b783c8dd4f09675885d397507ccee7bcfdd7999e30e6681

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.0.75-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl
Algorithm Hash digest
SHA256 b77742b0f3366b7268b64ba703225eec7609c5bd3cb943f2d32ee6071a630d45
MD5 3153dfc54f6b24340b8255cdab3adfa8
BLAKE2b-256 7c18f235976088417782154f9983f2731266bbb96ddf6034b25d08edbc14e8c0

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.0.75-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl
Algorithm Hash digest
SHA256 0a1b2f13df00c79f2aa011162da17cfbbf25dfb5b3d9079da68b33768e916c74
MD5 fef9ca389a57367fdaf2b25a6b1bb544
BLAKE2b-256 2451fd95900d0e72cfa5f3318016d6a9b8b7f5d77477ecb8c639fbcf7e20f08f

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.0.75-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 60b0a10c7ad780eead0a6c6addc4cca5251311089b55d6efd4d23b55a564915a
MD5 eecf111e01a14020a16a7346fdad3a44
BLAKE2b-256 921a4aff562580b0e15248fbe072b95a0c8075e7efa75ce43efbae02c2fe71be

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.0.75-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl
Algorithm Hash digest
SHA256 60e47dd234832c518f90ee4882c7d1d7c1b73a746f71cd64362e6e2f250b5426
MD5 e208955b4441d49d3c9efb05175618cd
BLAKE2b-256 7f3921ffd10bafca97057c4316a399f4992c742ceb56f9f43d4c167dbc0eddb5

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.0.75-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 58ca38b64b87a76140c5bb1976285d173e90bf7d140ac2ea67dd0e012b042afa
MD5 bef72c5ab0ed98c1b7f2c9f42a945b4a
BLAKE2b-256 09c3c6815535065257abb87ad8379b47d2f3ae7538d5b230709345379728af0f

See more details on using hashes here.

File details

Details for the file ruff-0.0.75-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.75-py3-none-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl
Algorithm Hash digest
SHA256 fa8e194ba22bc93bea03e27dacec7483b98f5b57d30865a41b284c60d2b61636
MD5 c64f4581a03ad150e979517b259f759e
BLAKE2b-256 3344b49234ca1bc3ca4ac50b9e927a6bf0052ffae1a4079276e81182569858d7

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for ruff-0.0.75-py3-none-macosx_10_7_x86_64.whl
Algorithm Hash digest
SHA256 1c6066be078802ace7750bc83ddcd40ef71b0f4b406e519f56d0fd524ffbabb5
MD5 7be64abc16c5bbfdd2e908ea772efcaf
BLAKE2b-256 0904167f1474e872921eb58a14490325739a8dff93d13ab54cdd2e2148d21504

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