Skip to main content
Yanked

This release has been yanked by its maintainers, and will be ignored by installers, except when explicitly specified.
Consider using release 0.16.9 instead.
Reason given by maintainers: Error on fresh install.

ruff

Actions status PyPI version

An extremely fast Python linter, written in Rust.

Bar chart with benchmark results

Linting the CPython codebase from scratch.

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

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

Read the launch blog post.

Installation and usage

Installation

Available as ruff on PyPI:

pip install ruff

Usage

To run ruff, try any of the following:

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

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

ruff path/to/code/ --watch

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

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

Configuration

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

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

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

Alternatively, on the command-line:

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

See ruff --help for more:

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

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

ARGS:
    <FILES>...

OPTIONS:
    -e, --exit-zero
            Exit with status code "0", even upon detecting errors
        --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
    -f, --fix
            Attempt to automatically fix lint errors
        --format <FORMAT>
            Output serialization format for error messages [default: text] [possible values: text,
            json]
    -h, --help
            Print help information
        --ignore <IGNORE>...
            List of error codes to ignore
    -n, --no-cache
            Disable cache reads
    -q, --quiet
            Disable all logging (but still exit with status code "1" upon detecting errors)
        --select <SELECT>...
            List of error codes to enable
    -v, --verbose
            Enable verbose logging
    -w, --watch
            Run in watch mode by re-running whenever files change

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 directory from which you execute ruff, and not the directory of the pyproject.toml.

Compatibility with Black

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

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

Parity with Flake8

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

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

The unimplemented rules are tracked in #170, and include:

  • 14 rules related to string .format calls.
  • 4 logical rules.
  • 1 rule related to parsing.

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

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

Rules

Code Name Message
E402 ModuleImportNotAtTopOfFile Module level import not at top of file
E501 LineTooLong Line too long (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 No such file or directory: ...
E999 SyntaxError SyntaxError: ...
F401 UnusedImport ... imported but unused
F403 ImportStarUsage from ... import * used; unable to detect undefined names
F404 LateFutureImport from future imports must occur at the beginning of the file
F406 ImportStarNotPermitted from ... import * only allowed at module level
F407 FutureFeatureNotDefined future feature '...' is not defined
F541 FStringMissingPlaceholders f-string without any placeholders
F601 MultiValueRepeatedKeyLiteral Dictionary key literal repeated
F602 MultiValueRepeatedKeyVariable Dictionary key ... repeated
F621 TooManyExpressionsInStarredAssignment too many expressions in star-unpacking assignment
F622 TwoStarredExpressions two starred expressions in assignment
F631 AssertTuple Assert test is a non-empty tuple, which is always True
F632 IsLiteral use ==/!= to compare constant literals
F633 InvalidPrintSyntax use of >> is invalid with print function
F634 IfTuple If test is a tuple, which is always True
F701 BreakOutsideLoop break outside loop
F702 ContinueOutsideLoop continue not properly in loop
F704 YieldOutsideFunction a yield or yield from statement outside of a function/method
F706 ReturnOutsideFunction a return statement outside of a function/method
F707 DefaultExceptNotLast an except: block as not the last exception handler
F722 ForwardAnnotationSyntaxError syntax error in forward annotation '...'
F821 UndefinedName Undefined name ...
F822 UndefinedExport Undefined name ... in __all__
F823 UndefinedLocal Local variable ... referenced before assignment
F831 DuplicateArgumentName Duplicate argument name in function definition
F841 UnusedVariable Local variable ... is assigned to but never used
F901 RaiseNotImplemented raise NotImplemented should be raise NotImplementedError
R001 UselessObjectInheritance Class ... inherits from object
R002 NoAssertEquals assertEquals is deprecated, use assertEqual instead

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
exclude = [
    "./resources/test/cpython/Lib/lib2to3/tests/data/bom.py",
    "./resources/test/cpython/Lib/lib2to3/tests/data/crlf.py",
    "./resources/test/cpython/Lib/lib2to3/tests/data/different_encoding.py",
    "./resources/test/cpython/Lib/lib2to3/tests/data/false_encoding.py",
    "./resources/test/cpython/Lib/lib2to3/tests/data/py2_test_grammar.py",
    "./resources/test/cpython/Lib/test/bad_coding2.py",
    "./resources/test/cpython/Lib/test/badsyntax_3131.py",
    "./resources/test/cpython/Lib/test/badsyntax_pep3120.py",
    "./resources/test/cpython/Lib/test/encoded_modules/module_iso_8859_1.py",
    "./resources/test/cpython/Lib/test/encoded_modules/module_koi8_r.py",
    "./resources/test/cpython/Lib/test/test_fstring.py",
    "./resources/test/cpython/Lib/test/test_grammar.py",
    "./resources/test/cpython/Lib/test/test_importlib/test_util.py",
    "./resources/test/cpython/Lib/test/test_named_expressions.py",
    "./resources/test/cpython/Lib/test/test_patma.py",
    "./resources/test/cpython/Lib/test/test_source_encoding.py",
    "./resources/test/cpython/Tools/c-analyzer/c_parser/parser/_delim.py",
    "./resources/test/cpython/Tools/i18n/pygettext.py",
    "./resources/test/cpython/Tools/test2to3/maintest.py",
    "./resources/test/cpython/Tools/test2to3/setup.py",
    "./resources/test/cpython/Tools/test2to3/test/test_foo.py",
    "./resources/test/cpython/Tools/test2to3/test2to3/hello.py",
]

Next, to benchmark the release build:

cargo build --release

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

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

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

To benchmark against the ecosystem's existing tools:

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

In order, these evaluate:

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

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

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

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

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

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

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

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

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

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

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

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

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

License

MIT

Release files for ruff 0.0.39

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for ruff 0.0.39
File Size Uploaded
ruff-0.0.39.tar.gz 106.5 kB Details

Built distributions (wheels)

Table of built distributions (wheels) for ruff 0.0.39
File
ruff-0.0.39-py3-none-win_amd64.whl Python 3 none Windows x86-64 Details
ruff-0.0.39-py3-none-win32.whl Python 3 none Windows x86-32 Details
ruff-0.0.39-py3-none-musllinux_1_2_x86_64.whl Python 3 none Linux musl 1.2+ x86-64 Details
ruff-0.0.39-py3-none-musllinux_1_2_i686.whl Python 3 none Linux musl 1.2+ x86-32 Details
ruff-0.0.39-py3-none-musllinux_1_2_armv7l.whl Python 3 none Linux musl 1.2+ ARMv7l Details
ruff-0.0.39-py3-none-musllinux_1_2_aarch64.whl Python 3 none Linux musl 1.2+ ARM64 Details
ruff-0.0.39-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl Python 3 none Linux glibc 2.17+ IBM System/390x Details
ruff-0.0.39-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl Python 3 none Linux glibc 2.17+ PowerPC 64-le Details
ruff-0.0.39-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl Python 3 none Linux glibc 2.17+ PowerPC 64-be Details
ruff-0.0.39-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl Python 3 none Linux glibc 2.17+ ARMv7l Details
ruff-0.0.39-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl Python 3 none Linux glibc 2.17+ ARM64 Details
ruff-0.0.39-py3-none-manylinux_2_12_x86_64.manylinux2010_x86_64.whl Python 3 none Linux glibc 2.12+ x86-64 Details
ruff-0.0.39-py3-none-manylinux_2_12_i686.manylinux2010_i686.whl Python 3 none Linux glibc 2.12+ x86-32 Details
ruff-0.0.39-py3-none-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl Python 3 none macOS 10.9+ x86-64, macOS 11.0+ ARM64, macOS 10.9+ universal2 (ARM64, x86-64) Details
ruff-0.0.39-py3-none-macosx_10_7_x86_64.whl Python 3 none macOS 10.7+ x86-64 Details

Total release size: 39.2 MB

Release files / ruff-0.0.39.tar.gz

Download URL ruff-0.0.39.tar.gz
Size 106.5 kB
Tags Source
SHA-256 checksum
How to use checksums
58db51279a0074c39b1b3b2de5aed35f02b68e55231505bf18be57252938db9f
BLAKE2b-256 checksum
How to use checksums
81f00a9cc66c729e1aa7d16ab851954a8a1586b911dec58d44d7cae3db285f24
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/4.0.1 CPython/3.8.10

Release files / ruff-0.0.39-py3-none-win_amd64.whl

Download URL ruff-0.0.39-py3-none-win_amd64.whl
Size 2.5 MB
Tags Python 3 Windows x86-64
SHA-256 checksum
How to use checksums
6c6da0aff2a504f99e7852e23d78cd442967240d8bbdfb19cd00335762894e84
BLAKE2b-256 checksum
How to use checksums
a160721c5a03215a7929a926dc2fee93df9486571083a5988f4ed16b5e70da50
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/4.0.1 CPython/3.8.10

Release files / ruff-0.0.39-py3-none-win32.whl

Download URL ruff-0.0.39-py3-none-win32.whl
Size 2.4 MB
Tags Python 3 Windows x86-32
SHA-256 checksum
How to use checksums
5e25dfeafc4557d176861bc15646e559312200fca699f134ac52809e3a5a609b
BLAKE2b-256 checksum
How to use checksums
a30c44cd012e0305a36b72d1f81a26a1fcaa88052c2e1f125790965625c434b7
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/4.0.1 CPython/3.8.10

Release files / ruff-0.0.39-py3-none-musllinux_1_2_x86_64.whl

Download URL ruff-0.0.39-py3-none-musllinux_1_2_x86_64.whl
Size 2.7 MB
Tags Linux musl 1.2+ x86-64 Python 3
SHA-256 checksum
How to use checksums
46e3ee71d9bc03174648024d469d48b3de7e066c5056e34bdc683f634a7e92e2
BLAKE2b-256 checksum
How to use checksums
683db128a5b5ccfa39b32dcb4c2786d5b26e6a09a537fcda820b558232737e01
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/4.0.1 CPython/3.8.10

Release files / ruff-0.0.39-py3-none-musllinux_1_2_i686.whl

Download URL ruff-0.0.39-py3-none-musllinux_1_2_i686.whl
Size 2.7 MB
Tags Linux musl 1.2+ x86-32 Python 3
SHA-256 checksum
How to use checksums
a9376952bfb2d63b9cbde3d650843753c2526783eca867d00bda008ced2f9f46
BLAKE2b-256 checksum
How to use checksums
d22965798d9a8141caf404c7eb0bf6364f45b7f2cdb6bad2a123f8d1a4c33d91
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/4.0.1 CPython/3.8.10

Release files / ruff-0.0.39-py3-none-musllinux_1_2_armv7l.whl

Download URL ruff-0.0.39-py3-none-musllinux_1_2_armv7l.whl
Size 2.4 MB
Tags Linux musl 1.2+ ARMv7l Python 3
SHA-256 checksum
How to use checksums
981e298ff820b48581558e0fdb8234ec842233b0444307039d65b156a863febc
BLAKE2b-256 checksum
How to use checksums
7f1f2c496e392771691e40eeda6052105cb75ee5bfeba413a6d4b7c737b94545
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/4.0.1 CPython/3.8.10

Release files / ruff-0.0.39-py3-none-musllinux_1_2_aarch64.whl

Download URL ruff-0.0.39-py3-none-musllinux_1_2_aarch64.whl
Size 2.5 MB
Tags Linux musl 1.2+ ARM64 Python 3
SHA-256 checksum
How to use checksums
1b2e01a83731704b07fd19ac69ff2e0fc900e341a79c37387e50425a81cb41f8
BLAKE2b-256 checksum
How to use checksums
9be272524b7f620a9db53abf19ac5357244ec55c7bd001ddaff2377d6b7460a2
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/4.0.1 CPython/3.8.10

Release files / ruff-0.0.39-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl

Download URL ruff-0.0.39-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl
Size 2.2 MB
Tags Linux glibc 2.17+ IBM System/390x Python 3
SHA-256 checksum
How to use checksums
25254c5b98b87f25fdca66194b43987d2b13d68f2df365aeb4d715dad7a724de
BLAKE2b-256 checksum
How to use checksums
bac127577cbbabdf7250f066ac670ab1d92ba46b69fcab1f3296993cb50ad241
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/4.0.1 CPython/3.8.10

Release files / ruff-0.0.39-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl

Download URL ruff-0.0.39-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl
Size 2.0 MB
Tags Linux glibc 2.17+ PowerPC 64-le Python 3
SHA-256 checksum
How to use checksums
af7635d14e0893b041c3a445f24987c2b4a468371bcd336e5af6c4d55a70b545
BLAKE2b-256 checksum
How to use checksums
ccd7c895d98aea339e8fc9f709316a75915603d3c2590bef201732a390544210
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/4.0.1 CPython/3.8.10

Release files / ruff-0.0.39-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl

Download URL ruff-0.0.39-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl
Size 2.1 MB
Tags Linux glibc 2.17+ PowerPC 64-be Python 3
SHA-256 checksum
How to use checksums
67bbbc177b6e15dba44e534f35bc44d6a24b6aa2fea4ac3672e6447473ef249d
BLAKE2b-256 checksum
How to use checksums
88c475e8d179e2f0c90b29420c05ed6ce45541f1c09c2a1238a7967bb4a70b57
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/4.0.1 CPython/3.8.10

Release files / ruff-0.0.39-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl

Download URL ruff-0.0.39-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl
Size 1.8 MB
Tags Linux glibc 2.17+ ARMv7l Python 3
SHA-256 checksum
How to use checksums
4e0f3bfb93487bb21b195f52b2e3f6fcd8972d1f168a85ca7ecd62f92e59a27e
BLAKE2b-256 checksum
How to use checksums
802e24753f406663ce79e9c19777b31ead1bdaea7a134da9312fc62c4ee29db3
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/4.0.1 CPython/3.8.10

Release files / ruff-0.0.39-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl

Download URL ruff-0.0.39-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Size 2.5 MB
Tags Linux glibc 2.17+ ARM64 Python 3
SHA-256 checksum
How to use checksums
a4c9ac4de6d7e4d017ab45e6cde36005679b7917b8113ba8044f342b8335ee29
BLAKE2b-256 checksum
How to use checksums
13d7fff72c20fd3b8faa6a5577201536b19d7a003d969141d857b4b630a36583
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/4.0.1 CPython/3.8.10

Release files / ruff-0.0.39-py3-none-manylinux_2_12_x86_64.manylinux2010_x86_64.whl

Download URL ruff-0.0.39-py3-none-manylinux_2_12_x86_64.manylinux2010_x86_64.whl
Size 2.7 MB
Tags Linux glibc 2.12+ x86-64 Python 3
SHA-256 checksum
How to use checksums
4fc09c21b1e48584c6a5bcd58e3a67fb156a772f00d99c79a9bbeb1201c5015a
BLAKE2b-256 checksum
How to use checksums
4ab04b52178e30ff671aef542cfe96e02da545e26afb06574c8e583978f0f807
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/4.0.1 CPython/3.8.10

Release files / ruff-0.0.39-py3-none-manylinux_2_12_i686.manylinux2010_i686.whl

Download URL ruff-0.0.39-py3-none-manylinux_2_12_i686.manylinux2010_i686.whl
Size 2.8 MB
Tags Linux glibc 2.12+ x86-32 Python 3
SHA-256 checksum
How to use checksums
e5a727c732002057129b5c3fccc9f1b41719303b0c1382354ff6824137d1f795
BLAKE2b-256 checksum
How to use checksums
d83a4b2f4d07370d12a3d15110383278e3cd0eed058b9809a8bd67b5af77b8cf
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/4.0.1 CPython/3.8.10

Release files / ruff-0.0.39-py3-none-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl

Download URL ruff-0.0.39-py3-none-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl
Size 5.1 MB
Tags Python 3 macOS 10.9+ universal2 (ARM64, x86-64) macOS 10.9+ x86-64 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
7077f8e7defc72addfc952311a8ac05a5344027188f39a5fca00354041a470e1
BLAKE2b-256 checksum
How to use checksums
55cc0217b5440b466e5d5b2b926cfea2099e6fdbbda7679e406ee09cd845bc63
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/4.0.1 CPython/3.8.10

Release files / ruff-0.0.39-py3-none-macosx_10_7_x86_64.whl

Download URL ruff-0.0.39-py3-none-macosx_10_7_x86_64.whl
Size 2.6 MB
Tags Python 3 macOS 10.7+ x86-64
SHA-256 checksum
How to use checksums
51245f90071abb0e7b465738eb95a7e819e61607a67fa2e8f99ca816db8bbb55
BLAKE2b-256 checksum
How to use checksums
42839bfdb3e62a77901c6728b1c52307831eb59b432719f862097265bdfdaad1
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/4.0.1 CPython/3.8.10

Release history Release notifications | RSS feed

0.9.9

18 release files

0.9.8

18 release files

0.9.7

18 release files

0.9.6

18 release files

0.9.4

18 release files

0.9.3

18 release files

0.9.2

18 release files

0.9.1

18 release files

0.8.4

18 release files

0.8.3

18 release files

0.8.1

18 release files

0.8.0

18 release files

0.7.4

18 release files

0.7.1

18 release files

0.7.0

18 release files

0.6.8

18 release files

0.6.7

18 release files

0.6.6

18 release files

0.6.5

18 release files

0.6.3

18 release files

0.6.2

18 release files

0.6.1

18 release files

0.6.0

18 release files

0.5.5

18 release files

0.5.4

18 release files

0.5.3

18 release files

0.5.2

18 release files

0.5.0

18 release files

0.4.9

17 release files

0.4.7

17 release files

0.4.6

17 release files

0.4.5

17 release files

0.4.2

17 release files

0.4.1

17 release files

0.4.0

17 release files

0.3.7

17 release files

0.3.6

17 release files

0.3.4

17 release files

0.3.3

17 release files

0.3.0

17 release files

0.2.2

17 release files

0.1.9

17 release files

0.1.8

17 release files

0.1.6

17 release files

0.1.3

17 release files

0.1.2

17 release files

0.1.1

17 release files

0.1.0

17 release files

This release

0.0.39 This release

16 release files

0.0.16

9 release files

0.0.15

3 release files

0.0.14

3 release files

0.0.13

3 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page