An extremely fast Python linter, written in Rust.

Overview

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 autofix support (e.g., automatically remove unused imports)
  • 👀 TypeScript-inspired --watch support, for continuous file monitoring
  • ⚖️ Near-parity with the built-in Flake8 rule set
  • 🔌 Native re-implementations of popular Flake8 plugins, like flake8-docstrings (pydocstyle)

Ruff aims to be orders of magnitude faster than alternative tools while integrating more functionality behind a single, common interface. Ruff can be used to replace Flake8 (plus a variety of plugins), pydocstyle, yesqa, and even a subset of pyupgrade and autoflake all while executing tens or hundreds of times faster than any individual tool.

Read the launch blog post.

Table of Contents

  1. Installation and Usage
  2. Configuration
  3. Supported Rules
  4. Editor Integrations
  5. FAQ
  6. Development
  7. Releases
  8. Benchmarks
  9. License
  10. Contributing

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

Supported Rules

By default, Ruff enables all E, W, and F error codes, which correspond to those built-in to Flake8.

Pyflakes

Code Name Message
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

pycodestyle

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

pydocstyle

Code Name Message
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

pyupgrade

Code Name Message
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)

pep8-naming

Code Name Message
N801 InvalidClassName Class name ... should use CapWords convention
N802 InvalidFunctionName Function name ... should be lowercase
N803 InvalidArgumentName Argument name ... should be lowercase
N804 InvalidFirstArgumentNameForClassMethod First argument of a class method should be named cls
N805 InvalidFirstArgumentNameForMethod First argument of a method should be named self

flake8-comprehensions

Code Name Message
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

flake8-bugbear

Code Name Message
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

flake8-builtins

Code Name Message
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

flake8-print

Code Name Message
T201 PrintFound print found
T203 PPrintFound pprint found

Meta rules

Code Name Message
M001 UnusedNOQA Unused noqa directive

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

FAQ

Is Ruff compatible with Black?

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

How does Ruff compare to Flake8?

Ruff can be used as a (near) drop-in replacement for Flake8 when used (1) without or with a small number of plugins, (2) alongside Black, and (3) on Python 3 code.

Under those conditions Ruff is missing 14 rules related to string .format calls, 1 rule related to docstring parsing, and 1 rule related to redefined variables.

Ruff re-implements some of the most popular Flake8 plugins and related code quality tools 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. (To date, popular Flake8 plugins have been re-implemented within Ruff directly.)

Which tools does Ruff replace?

Today, Ruff can be used to replace Flake8 when used with any of the following plugins:

Ruff also implements the functionality that you get from yesqa, and a subset of the rules implemented in pyupgrade (8/34).

If you're looking to use Ruff, but rely on an unsupported Flake8 plugin, free to file an Issue.

Do I need to install Rust to use Ruff?

Nope! Ruff is available as ruff on PyPI:

pip install ruff

Ruff ships with wheels for all major platforms, which enables pip to install Ruff without relying on Rust at all.

Can I write my own plugins for Ruff?

Ruff does not yet support third-party plugins, though a plugin system is within-scope for the project. See #283 for more.

Does Ruff support NumPy- or Google-style docstrings?

Yes! To enable a specific docstring convention, start by enabling all pydocstyle error codes, and then selectively disabling based on your preferred convention.

For example, if you're coming from flake8-docstrings, the following configuration is equivalent to --docstring-convention numpy:

[tool.ruff]
extend-select = [
    "D100",
    "D101",
    "D102",
    "D103",
    "D104",
    "D105",
    "D106",
    "D200",
    "D201",
    "D202",
    "D204",
    "D205",
    "D206",
    "D207",
    "D208",
    "D209",
    "D210",
    "D211",
    "D214",
    "D215",
    "D300",
    "D400",
    "D402",
    "D403",
    "D404",
    "D405",
    "D406",
    "D407",
    "D408",
    "D409",
    "D410",
    "D411",
    "D412",
    "D413",
    "D418",
    "D419",
]

Similarly, the following is equivalent to --docstring-convention google:

[tool.ruff]
extend-select = [
    "D100",
    "D101",
    "D102",
    "D103",
    "D104",
    "D105",
    "D106",
    "D107",
    "D200",
    "D201",
    "D202",
    "D205",
    "D206",
    "D207",
    "D208",
    "D209",
    "D210",
    "D211",
    "D212",
    "D214",
    "D300",
    "D402",
    "D403",
    "D405",
    "D410",
    "D411",
    "D412",
    "D414",
    "D415",
    "D416",
    "D417",
    "D418",
    "D419",
]

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

Releases

Ruff is distributed on PyPI, and published via maturin.

See: .github/workflows/release.yaml.

Benchmarks

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.

Comments
  • Surprising config file resolution behavior

    Surprising config file resolution behavior

    Our repo has two pyproject.toml files with [tool.ruff] sections:

    • pyproject.toml ("root")
    • examples/docs_snippets/pyproject.toml ("docs_snippets")

    The logic that resolves the config file for any given invocation of ruff surprised me:

    $ ruff `git ls-files '*.py'`  # uses root config for files in `examples/docs_snippets`
    $ ruff `git ls-files 'examples/docs_snippets/*.py`  # uses docs_snippets config
    

    So, for a given file in examples/docs_snippets, different runs of ruff from the same cwd and with the same config files on disk will use different pyproject.toml files. It suprised me to have the config used for a particular file determined by whatever unrelated files also happen to be being processed instead of just (a) the cwd; and (b) location of existing config files.

    I don't have a strong opinion on how a config file is resolved, but IMO it should always resolve to the same one if the launch CWD and config files on disk are constant.

    configuration 
    opened by smackesey 41
  • Import-sorting (a `ruff` approximation of `isort`)

    Import-sorting (a `ruff` approximation of `isort`)

    isort does have some wacky heuristics to determine first v third party, but ultimately I'd love to elide the import-sorting it does with ruff :zap:

    To me, doesn't have to be 1:1, so long as the behavior is there for import sorting/grouping I'm happy :smile:

    If we want to keep this in the realm of flake8, it'd be flake8-import-order with a fixer :wink:

    opened by thejcannon 27
  • Option to enable the fixable errors only?

    Option to enable the fixable errors only?

    Is there an option to easily enable all the error codes that are fixable (and disable the non-fixable ones)?

    Something like:

    ruff --select-fixable
    

    Basically I'm looking at pairing this with black in a format command, so black --check and ruff --select-fixable could run together as format --check, and then black and ruff --fix --select-fixable could run together as format without failing on all the other ruff errors that have to be manually fixed (those will be show to the user at a different time)... Just wondering if there's an easier way to select them all than ruff --select A --select B etc.

    Thanks!

    configuration 
    opened by davegaeddert 20
  • False positive in F541 (f-string without placeholders) after v0.0.204

    False positive in F541 (f-string without placeholders) after v0.0.204

    not sure if it's #1494 or a different PR... but a F541 "f-string without placeholders" false positive is now appearing in v0.0.204 when using format specifiers in f-strings:

    v = 23.234234
    f"{v:0.2f}"  # error
    
    bug 
    opened by tlambert03 17
  • Using ruff as a drop-in replacement for flake8

    Using ruff as a drop-in replacement for flake8

    I'd love to be able to replace flake8 with ruff, and while most things are compatible, one current limitation is the configuration: flake8 can be configured via setup.cfg and .flake8, and at work it's a pretty common setup. Migrating everyone to pyproject.toml will likely not happen anytime soon. So I was wondering what could be done here. I thought of two options:

    1. make ruff support all flake8 flags and configuration files This is probably not something you'd like to have, as it becomes a layer of configuration that you don't have support for.
    2. build a "bridge" package: something that reads flake8 configuration and invokes ruff with the proper parameters (at least the supported ones) This can be done by a third party (I'm happy to do it), but in order to make it happen, ruff would need to support taking the configuration in some alternative mechanism (I can think of either (1) allow all settings to be defined via command line flags or (2) add a command line flag to allow the user to override the location of pyproject.toml - that way the "bridge" tool would generate the config file and invoke ruff with that flag)

    Let me know if you have any thoughts!

    opened by fsouza 16
  • Allow banning of certain modules and certain module members

    Allow banning of certain modules and certain module members

    Sometimes you want to assert that certain modules are never imported. Apparently Pylint and Pyflake have plugins for that (pylint-restricted-imports and flake8-tidy-imports respectively).

    I think the disallowed modules / module members could be defined in a new tool.ruff.banned-api section in pyproject.toml. So you could for example have:

    [tool.ruff.banned-api]
    argparse.msg = "Use typed_argparse instead."
    "decimal.Decimal".msg = "Use ints and floats only."
    "typing.TypedDict".msg = """Use typing_extensions.TypedDict instead.
    
    typing.TypedDict does not support typing.Generic for Python < 3.11,
    so we sometimes have to use typing_extensions.TypedDict instead.
    If we sometimes use typing_extensions.TypedDict, we however always
    want to use it because:
    
    class Foo(typing.TypedDict): ...
    class Bar(typing_extensions.TypedDict): ...
    class Baz(Foo, Bar): ...
    
    results in a runtime type error:
    
    > TypeError: metaclass conflict: the metaclass of a derived class must be a (non-strict) subclass of the metaclasses of all its bases
    """
    

    Note that banning module members is a bit challenging because we also have to account for attribute access e.g.

    import example
    example.evil_function()
    
    # or
    
    import example as other
    other.evil_function()
    

    I think it is quite clear that it is impossible for such a lint to prevent all the ways an API can be accessed, for example banned modules could still be accessed via importlib or eval and banning eval is a hopeless endeavor because there are countless ways of accessing it e.g. globals()['__builtins__'].eval or even dataclasses.builtins.eval. Completely preventing attribute access is even more difficult because you'd have to understand data flows (e.g. (lambda x: x.evil_function())(example)).

    So I just think the documentation of the lint should clarify that it's meant to prevent accidental usage of the API and can be easily circumvented.

    Aside from such false negatives the attribute access check would probably also result in false positives e.g.

    import example, other
    example = other
    example.evil_function()
    
    # or
    
    def foo(example):
        example.evil_function()
    

    So I think the error message for detected attribute access should say something like "it looks like you used a banned API" instead of using assertive language that might confuse users.

    Lastly in cases where the fix is just replacing one import for another (e.g. changing typing.TypedDict to typing_extensions.TypedDict) it would be nice if ruff could provide automatic fixing via --fix. This is also the reason why I suggested the .msg in the previous config example because then we could additionally specify e.g:

    "typing.TypedDict".fix-to = "typing_extensions.TypedDict"
    

    I have not contributed to ruff yet, but if the people here like the suggested lint, I could look into implementing it :)

    rule 
    opened by not-my-profile 15
  • Exclude option ignored when directly calling dir/file

    Exclude option ignored when directly calling dir/file

    MWE:

    [tool.ruff]
    exclude = [ "blah" ]
    

    blah/test.py:

    import os
    

    Running ruff on . returns nothing, but running ruff ./blah or ruff ./blah/test.py will return the diagnostics (F401) even if blah was excluded. Is this intentional?

    bug 
    opened by jhossbach 15
  • Ruff is removing used imports since 0.0.173 version

    Ruff is removing used imports since 0.0.173 version

    Since version 0.0.173 (up to 0.0.178 - newest when create this issue) the ruff is removing used imports

    I have two examples:

    https://github.com/4DNucleome/PartSeg/blob/fadc4f8ad9b552386de21bbc2a1ab3e0159f52e7/package/PartSegCore/analysis/io_utils.py#L10-L24

    is converted to:

    obraz

    and remove the type used in type annotation: https://github.com/4DNucleome/PartSeg/blob/fadc4f8ad9b552386de21bbc2a1ab3e0159f52e7/package/PartSegCore/mask/io_functions.py#L725

    The ProjectInfoBase is a Protocol if this information is important. In the second case, such import could be hidden under if typing.TYPE_CHECKING: but I use in code other things from this module.

    And even if it should be moved under the type checking clause, the autofix should not just remove it.

    bug 
    opened by Czaki 15
  • F821 triggers when using non-ASCII characters

    F821 triggers when using non-ASCII characters

    from time import time_ns
    
    def time_µs() -> int:
    	return time_ns() // 1000
    
    def main() -> None:
    	print(time_µs())
    
    if __name__ == "__main__":
    	main()
    
    test.py:7:9: F821 Undefined name `time_μs`
    

    (it's obviously fine with a name like time_us)

    bug 
    opened by trag1c 15
  • Support remaining Flake8 rules

    Support remaining Flake8 rules

    Summary

    Mega-issue to track support for the remaining Flake8 rules. This only includes rules that are (1) relevant for Python 3 and (2) relevant when using + compatible with Black.

    If we can cross out these checks, then we can elevate ruff to an 0.1.0 release (with additional testing).

    pycodestyle

    • [x] E721 ("do not compare types, use isinstance()")

    PyFlakes

    • [x] F402 ("import module from line N shadowed by loop variable")
    • [x] F405 ("name may be undefined, or defined from star imports: module")
    • [x] F406 ("from module import * only allowed at module level")
    • [x] F632 ("use ==/!= to compare str, bytes, and int literals")
    • [x] F633 ("use of >> is invalid with print function")
    • [x] F722 ("syntax error in forward annotation")
    • [ ] F811 ("redefinition of unused name from line N")

    String formatting

    N.B. These are the least important to me, in part because I think they're low-value while requiring a lot of custom logic. I would be fine with an 0.1.0 release that didn't include these.

    • [x] F501 ("invalid % format literal")
    • [x] F502 ("% format expected mapping but got sequence")
    • [x] F503 ("% format expected sequence but got mapping")
    • [x] F504 ("% format unused named arguments")
    • [x] F505 ("% format missing named arguments")
    • [x] F506 ("% format mixed positional and named arguments")
    • [x] F507 ("% format mismatch of placeholder and argument count")
    • [x] F508 ("% format with * specifier requires a sequence")
    • [x] F509 ("% format with unsupported format character")
    • [x] F521 (".format(...) invalid format string")
    • [x] F522 (".format(...) unused named arguments")
    • [x] F523 (".format(...) unused positional arguments")
    • [x] F524 (".format(...) missing argument")
    • [x] F525 (".format(...) mixing automatic and manual numbering")
    opened by charliermarsh 15
  • Autofix F541 (f-string without any placeholders)?

    Autofix F541 (f-string without any placeholders)?

    I think that a string like:

    f"%H:%M"
    

    Which reports:

    F541 f-string without any placeholders
    

    Can be automatically fixed by the --fix option without any side effect.

    autofix 
    opened by keul 14
  • Implement `autoflake`

    Implement `autoflake`

    • [x] Remove unused imports (F401)
    • [ ] Remove duplicate keys (F601)
    • [ ] Remove unused variables (F841)
    • [ ] Expand star imports (F403)
    • [ ] Useless pass statements
    plugin 
    opened by charliermarsh 1
  • Add isort.force-sort-within-sections setting

    Add isort.force-sort-within-sections setting

    This commit is a first attempt at addressing issue #1003.

    The default isort behavior is force-sort-within-sections = false, which places from X import Y statements after import X statements.

    When force-sort-within-sections = true all imports are sorted by module name. When module names are equivalent, the import statement comes before the from statement.

    • https://pycqa.github.io/isort/docs/configuration/options.html#force-sort-within-sections

    ~Initially I tried out an enum + match approach but I was struggling to come up with anything that didn't require Copy support.~


    ~The approach in this PR works from what I've been able to test... But it's lacking in clarity. The merge_imports function returns a vector of tuples that represent the final import order:~

    [(0 or 1, idx)]
    

    ~Where...~

    • ~0 means use the import_block.import vector with index idx~
    • ~1 means use the import_block.import_from vector with index idx~

    ~Those integers are essentially a stand-in for a type or enum, I'm just not sure what the idiomatic thing to return would be.~

    • ~An new enum like ImportType::ImportFrom / ImportType::Import defined in types.rs?~
    • ~Is there a better way to do this lazily (eg. return an iterator) rather than eagerly construct the vector in merge_imports?~

    Edit: Swapped out the previous approach with an iterator and enum match.

    opened by mattoberle 0
  • Add rule to detect type annotations as default variable assignments

    Add rule to detect type annotations as default variable assignments

    See the thread here.

    Example code that causes problems:

    from typing import Optional, TypedDict
    
    class Person(TypedDict):
        name: str
    
    def greet(person=Optional[Person]) -> str:
        if person is not None:
            return f"Hello {person['name']}"
        return "Hello stranger"
    
    greet()
    
    rule 
    opened by charliermarsh 0
  • Request: Spelling check

    Request: Spelling check

    There are seemingly two big Python code checkers: pyspelling and codespell. Codespell doesn't catch everything, and pyspelling is slow to run. It'd be great to have a version / implementation of the logic of these (eventually including PySpelling's exception syntax etc) in ruff.

    plugin 
    opened by strickvl 3
Releases(v0.0.210)
  • v0.0.210(Jan 4, 2023)

    What's Changed

    • Do not Change Quotation Style for PT006 Autofix by @saadmk11 in https://github.com/charliermarsh/ruff/pull/1600
    • Implement autofix for PT022 by @harupy in https://github.com/charliermarsh/ruff/pull/1604
    • Add isort.order-by-type boolean setting by @mattoberle in https://github.com/charliermarsh/ruff/pull/1607
    • Fix *arg and **kwarg handling for Google docstrings by @charliermarsh in https://github.com/charliermarsh/ruff/pull/1608
    • Associate inline comments with parenthesized ImportFrom statements by @charliermarsh in https://github.com/charliermarsh/ruff/pull/1609
    • Fix leftover whitespace when removing pass for PIE790 by @edgarrmondragon in https://github.com/charliermarsh/ruff/pull/1612
    • Treat .pyi files as future annotations-enabled by @charliermarsh in https://github.com/charliermarsh/ruff/pull/1616
    • Treat convention as setting ignore, rather than select by @charliermarsh in https://github.com/charliermarsh/ruff/pull/1611
    • Avoid byte-string conversions by @charliermarsh in https://github.com/charliermarsh/ruff/pull/1618
    • Implement missing fixes for PT006 by @edgarrmondragon in https://github.com/charliermarsh/ruff/pull/1622
    • Implement yield-to-yield from conversion by @colin99d in https://github.com/charliermarsh/ruff/pull/1544
    • Add some more users to the README by @charliermarsh in https://github.com/charliermarsh/ruff/pull/1623
    • Check SIM118 in comprehension by @harupy in https://github.com/charliermarsh/ruff/pull/1627

    New Contributors

    • @mattoberle made their first contribution in https://github.com/charliermarsh/ruff/pull/1607

    Full Changelog: https://github.com/charliermarsh/ruff/compare/v0.0.209...v0.0.210

    Source code(tar.gz)
    Source code(zip)
  • v0.0.209(Jan 3, 2023)

    What's Changed

    • Fix several typos in README by @jvstme in https://github.com/charliermarsh/ruff/pull/1590
    • Add flake8-pytest-style settings to hash by @charliermarsh in https://github.com/charliermarsh/ruff/pull/1595
    • Add autofix for SIM300 by @PedramNavid in https://github.com/charliermarsh/ruff/pull/1588
    • Avoid hard unwrap in PT checks by @charliermarsh in https://github.com/charliermarsh/ruff/pull/1597
    • Preserve style when generating flake8-simplify messages by @charliermarsh in https://github.com/charliermarsh/ruff/pull/1599
    • Avoid silently dropping code generator errors by @charliermarsh in https://github.com/charliermarsh/ruff/pull/1598
    • Fix PT006 autofix of parametrize name strings like ' first, , second ' by @bluetech in https://github.com/charliermarsh/ruff/pull/1591

    New Contributors

    • @jvstme made their first contribution in https://github.com/charliermarsh/ruff/pull/1590

    Full Changelog: https://github.com/charliermarsh/ruff/compare/v0.0.208...v0.0.209

    Source code(tar.gz)
    Source code(zip)
  • v0.0.208(Jan 3, 2023)

    What's Changed

    • Adds a codespell linter by @colin99d in https://github.com/charliermarsh/ruff/pull/1553
    • Avoid merging import from statements with inline comments by @charliermarsh in https://github.com/charliermarsh/ruff/pull/1562
    • Avoid PEP 604 rewrites for runtime annotations by @charliermarsh in https://github.com/charliermarsh/ruff/pull/1563
    • Implement flake8-pytest-style by @edgarrmondragon in https://github.com/charliermarsh/ruff/pull/1506
    • Always check directly-passed-in files by @charliermarsh in https://github.com/charliermarsh/ruff/pull/1564
    • Remove common-path dependency by @charliermarsh in https://github.com/charliermarsh/ruff/pull/1565
    • Rename checks.rs to registry.rs by @charliermarsh in https://github.com/charliermarsh/ruff/pull/1566
    • Remove extend- from docstring configuration examples by @charliermarsh in https://github.com/charliermarsh/ruff/pull/1571
    • Avoid invalid trailing comma fixes for mock rewrites by @charliermarsh in https://github.com/charliermarsh/ruff/pull/1570
    • Automatically set baseline D codes based on convention by @charliermarsh in https://github.com/charliermarsh/ruff/pull/1574
    • Remove need for vendored format/cformat code by @olliemath in https://github.com/charliermarsh/ruff/pull/1573
    • Warn user when D203 and D211 are enabled by @charliermarsh in https://github.com/charliermarsh/ruff/pull/1576
    • Add flake8-pie plugin with prefer_list_builtin by @charliermarsh in https://github.com/charliermarsh/ruff/pull/1578
    • Add scripts to generate plugin and check boilerplate by @charliermarsh in https://github.com/charliermarsh/ruff/pull/1579
    • Implement unnecessary-pass-statement by @charliermarsh in https://github.com/charliermarsh/ruff/pull/1580
    • Implement dupe-class-field-definitions by @charliermarsh in https://github.com/charliermarsh/ruff/pull/1581
    • Implement autofix for F541 by @harupy in https://github.com/charliermarsh/ruff/pull/1577
    • Add a link to GitHub from the playground by @charliermarsh in https://github.com/charliermarsh/ruff/pull/1583
    • Mark FStringMissingPlaceholders as fixable by @harupy in https://github.com/charliermarsh/ruff/pull/1582
    • Swap accent color for playground by @charliermarsh in https://github.com/charliermarsh/ruff/pull/1584
    • Prefer GitHub icon on mobile by @charliermarsh in https://github.com/charliermarsh/ruff/pull/1585
    • Implement and-false and or-true rules by @charliermarsh in https://github.com/charliermarsh/ruff/pull/1586

    Full Changelog: https://github.com/charliermarsh/ruff/compare/v0.0.207...v0.0.208

    Source code(tar.gz)
    Source code(zip)
  • v0.0.207(Jan 2, 2023)

    What's Changed

    • Implement list-to-tuple comprehension unpacking by @colin99d in https://github.com/charliermarsh/ruff/pull/1534
    • Avoid triggering PD errors on method calls by @charliermarsh in https://github.com/charliermarsh/ruff/pull/1537
    • Avoid PD false positives on some non-DataFrame expressions by @charliermarsh in https://github.com/charliermarsh/ruff/pull/1538
    • Correct UP027 message to “generator expression” by @andersk in https://github.com/charliermarsh/ruff/pull/1540
    • Add flake8-simplify SIM300 check for Yoda Conditions by @PedramNavid in https://github.com/charliermarsh/ruff/pull/1539
    • Print warning when running debug builds without --no-cache by @not-my-profile in https://github.com/charliermarsh/ruff/pull/1549
    • Fix typing::match_annotated_subscript matching ExprKind::Call by @not-my-profile in https://github.com/charliermarsh/ruff/pull/1554
    • Add clarification by @VictorGob in https://github.com/charliermarsh/ruff/pull/1557
    • Add explicit new-rule recommendation in CONTRIBUTING.md by @charliermarsh in https://github.com/charliermarsh/ruff/pull/1558
    • Detect unpacking assignments in eradicate by @charliermarsh in https://github.com/charliermarsh/ruff/pull/1559
    • Fix __init__.py being private by @not-my-profile in https://github.com/charliermarsh/ruff/pull/1556

    New Contributors

    • @PedramNavid made their first contribution in https://github.com/charliermarsh/ruff/pull/1539
    • @VictorGob made their first contribution in https://github.com/charliermarsh/ruff/pull/1557

    Full Changelog: https://github.com/charliermarsh/ruff/compare/v0.0.206...v0.0.207

    Source code(tar.gz)
    Source code(zip)
  • v0.0.206(Jan 1, 2023)

    What's Changed

    • PyUpgrade: Turn errors into OSError by @colin99d in https://github.com/charliermarsh/ruff/pull/1434
    • Add dark mode variant for benchmark image by @charliermarsh in https://github.com/charliermarsh/ruff/pull/1519
    • Ignore property assignments in RET504 by @charliermarsh in https://github.com/charliermarsh/ruff/pull/1520
    • Avoid some false positives for ends-in-period checks by @charliermarsh in https://github.com/charliermarsh/ruff/pull/1521
    • Pyupgrade: import mock to from unittest import mock by @colin99d in https://github.com/charliermarsh/ruff/pull/1488
    • Fix Name node range in NamedExpr node by @harupy in https://github.com/charliermarsh/ruff/pull/1526
    • Simplify unused snapshot check by @harupy in https://github.com/charliermarsh/ruff/pull/1525
    • Do not Change Quotation Style for SIM118 Autofix by @saadmk11 in https://github.com/charliermarsh/ruff/pull/1529
    • Add visit_format_spec to avoid false positives for F541 in f-string format specifier by @harupy in https://github.com/charliermarsh/ruff/pull/1528
    • Rewrite mock.mock attribute accesses by @charliermarsh in https://github.com/charliermarsh/ruff/pull/1533

    Full Changelog: https://github.com/charliermarsh/ruff/compare/v0.0.205...v0.0.206

    Source code(tar.gz)
    Source code(zip)
  • v0.0.205(Dec 31, 2022)

    What's Changed

    • Avoid flagging nested f-strings by @charliermarsh in https://github.com/charliermarsh/ruff/pull/1516
    • Use more precise error ranges for names by @harupy in https://github.com/charliermarsh/ruff/pull/1513

    Full Changelog: https://github.com/charliermarsh/ruff/compare/v0.0.204...v0.0.205

    Source code(tar.gz)
    Source code(zip)
  • v0.0.204(Dec 31, 2022)

    What's Changed

    • Trim CLI help during generation by @charliermarsh in https://github.com/charliermarsh/ruff/pull/1492
    • Escape strings when formatting check messages by @charliermarsh in https://github.com/charliermarsh/ruff/pull/1493
    • Add a "fix message" to every autofix-able check by @charliermarsh in https://github.com/charliermarsh/ruff/pull/1489
    • Stop overriding locations for expressions within f-strings by @harupy in https://github.com/charliermarsh/ruff/pull/1494
    • Remove F831 by @harupy in https://github.com/charliermarsh/ruff/pull/1495
    • Fix detection of changed imports in isort plugin by @squiddy in https://github.com/charliermarsh/ruff/pull/1504
    • Remove unused snapshots by @harupy in https://github.com/charliermarsh/ruff/pull/1497
    • Improve T20X ranges by @harupy in https://github.com/charliermarsh/ruff/pull/1502
    • Improve F811 range for function and class definitions by @harupy in https://github.com/charliermarsh/ruff/pull/1499
    • Improve PLW0120 range by @harupy in https://github.com/charliermarsh/ruff/pull/1500
    • Fix N818 range by @harupy in https://github.com/charliermarsh/ruff/pull/1503
    • Include fix commit message when showing violations together with source by @squiddy in https://github.com/charliermarsh/ruff/pull/1505
    • Fix E722 and F707 ranges by @harupy in https://github.com/charliermarsh/ruff/pull/1508
    • Adjust test_path helper to detect round-trip autofix issues by @squiddy in https://github.com/charliermarsh/ruff/pull/1501
    • Generate source code with detected line ending by @squiddy in https://github.com/charliermarsh/ruff/pull/1487
    • Check for Unsupported Files and Display Errors and Warnings by @saadmk11 in https://github.com/charliermarsh/ruff/pull/1509

    Full Changelog: https://github.com/charliermarsh/ruff/compare/v0.0.203...v0.0.204

    Source code(tar.gz)
    Source code(zip)
  • v0.0.203(Dec 30, 2022)

    What's Changed

    • Support multi-line noqa directives for 'import from' by @charliermarsh in https://github.com/charliermarsh/ruff/pull/1479
    • Simplified code for unicode fix by @colin99d in https://github.com/charliermarsh/ruff/pull/1475
    • Remove support for ur prefixes by @charliermarsh in https://github.com/charliermarsh/ruff/pull/1481
    • Detect line endings and use them during code generation by @squiddy in https://github.com/charliermarsh/ruff/pull/1482
    • Add a command to clear the Ruff cache by @charliermarsh in https://github.com/charliermarsh/ruff/pull/1484
    • Generate the README's --help output automatically via cargo +nightly dev generate-all by @squiddy in https://github.com/charliermarsh/ruff/pull/1483
    • Move some argument validation into Clap by @charliermarsh in https://github.com/charliermarsh/ruff/pull/1485
    • Remove hidden autoformat command by @charliermarsh in https://github.com/charliermarsh/ruff/pull/1486

    Full Changelog: https://github.com/charliermarsh/ruff/compare/v0.0.202...v0.0.203

    Source code(tar.gz)
    Source code(zip)
  • v0.0.202(Dec 30, 2022)

    What's Changed

    • Make banned-api config setting optional by @not-my-profile in https://github.com/charliermarsh/ruff/pull/1465
    • Small CONTRIBUTING.md improvements by @not-my-profile in https://github.com/charliermarsh/ruff/pull/1466
    • Improve CLI help for --select by @not-my-profile in https://github.com/charliermarsh/ruff/pull/1471
    • Use more precise ranges for class and function checks by @charliermarsh in https://github.com/charliermarsh/ruff/pull/1476
    • Set editor background on top-level component by @charliermarsh in https://github.com/charliermarsh/ruff/pull/1478

    Full Changelog: https://github.com/charliermarsh/ruff/compare/v0.0.201...v0.0.202

    Source code(tar.gz)
    Source code(zip)
  • v0.0.201(Dec 30, 2022)

    What's Changed

    • Rename config to settings in the playground by @charliermarsh in https://github.com/charliermarsh/ruff/pull/1450
    • docs(README): add missing flake8-simplify by @mkniewallner in https://github.com/charliermarsh/ruff/pull/1449
    • Add Sphinx to user list by @AA-Turner in https://github.com/charliermarsh/ruff/pull/1451
    • Move default options into WASM interface by @charliermarsh in https://github.com/charliermarsh/ruff/pull/1453
    • Implement dark mode by @charliermarsh in https://github.com/charliermarsh/ruff/pull/1455
    • Use trailingComma: 'all' by @charliermarsh in https://github.com/charliermarsh/ruff/pull/1457
    • Remove generated TypeScript options by @charliermarsh in https://github.com/charliermarsh/ruff/pull/1456
    • Copy URL but don't update the hash by @charliermarsh in https://github.com/charliermarsh/ruff/pull/1458
    • Removed unicode literals by @colin99d in https://github.com/charliermarsh/ruff/pull/1448
    • Implement TID251 (banning modules & module members) by @not-my-profile in https://github.com/charliermarsh/ruff/pull/1436
    • Implicit flake8-implicit-str-concat by @charliermarsh in https://github.com/charliermarsh/ruff/pull/1463

    New Contributors

    • @mkniewallner made their first contribution in https://github.com/charliermarsh/ruff/pull/1449
    • @AA-Turner made their first contribution in https://github.com/charliermarsh/ruff/pull/1451
    • @not-my-profile made their first contribution in https://github.com/charliermarsh/ruff/pull/1436

    Full Changelog: https://github.com/charliermarsh/ruff/compare/v0.0.200...v0.0.201

    Source code(tar.gz)
    Source code(zip)
  • v0.0.200(Dec 29, 2022)

    What's Changed

    • Re-style the Ruff playground by @charliermarsh in https://github.com/charliermarsh/ruff/pull/1438
    • [pygrep-hooks] Adds Check for Blanket # noqa by @saadmk11 in https://github.com/charliermarsh/ruff/pull/1440
    • Avoid caching diffs by @charliermarsh in https://github.com/charliermarsh/ruff/pull/1441
    • Make update check enablement cofnigurable by @charliermarsh in https://github.com/charliermarsh/ruff/pull/1445
    • Include docstrings for settings enum members by @charliermarsh in https://github.com/charliermarsh/ruff/pull/1446

    Full Changelog: https://github.com/charliermarsh/ruff/compare/v0.0.199...v0.0.200

    Source code(tar.gz)
    Source code(zip)
  • v0.0.199(Dec 29, 2022)

    What's Changed

    • Check for keyword arguments before the last star argument by @andersk in https://github.com/charliermarsh/ruff/pull/1420
    • Add Support for GitLab CI Code Quality Report Format by @saadmk11 in https://github.com/charliermarsh/ruff/pull/1424
    • Turn off wasm-pack tests by @charliermarsh in https://github.com/charliermarsh/ruff/pull/1427
    • Extract duplicated logic into method by @hanneskaeufler in https://github.com/charliermarsh/ruff/pull/1428
    • Rewrite xml.etree.cElementTree to xml.etree.ElementTree by @colin99d in https://github.com/charliermarsh/ruff/pull/1426
    • PyUpgrade: Replace pipes with capture_output=True by @colin99d in https://github.com/charliermarsh/ruff/pull/1415
    • Add a --diff flag to dry-run autofixes by @charliermarsh in https://github.com/charliermarsh/ruff/pull/1431
    • Split into lint and lint-and-fix methods by @charliermarsh in https://github.com/charliermarsh/ruff/pull/1432
    • Warn the user when max iteration count is reached by @charliermarsh in https://github.com/charliermarsh/ruff/pull/1433

    New Contributors

    • @saadmk11 made their first contribution in https://github.com/charliermarsh/ruff/pull/1424

    Full Changelog: https://github.com/charliermarsh/ruff/compare/v0.0.198...v0.0.199

    Source code(tar.gz)
    Source code(zip)
  • v0.0.198(Dec 28, 2022)

    What's Changed

    • Set convention in flake8-to-ruff by @charliermarsh in https://github.com/charliermarsh/ruff/pull/1410
    • Default to double quotes in code_gen.rs by @charliermarsh in https://github.com/charliermarsh/ruff/pull/1412
    • Automatically detect and respect indentation and quotation code style by @charliermarsh in https://github.com/charliermarsh/ruff/pull/1413
    • Add rule to detect keyword arguments before starred arguments by @charliermarsh in https://github.com/charliermarsh/ruff/pull/1416
    • Add nbQA support to the docs by @charliermarsh in https://github.com/charliermarsh/ruff/pull/1417
    • Support --select ALL to enable all error codes by @charliermarsh in https://github.com/charliermarsh/ruff/pull/1418

    Full Changelog: https://github.com/charliermarsh/ruff/compare/v0.0.196...v0.0.198

    Source code(tar.gz)
    Source code(zip)
  • v0.0.196(Dec 27, 2022)

    What's Changed

    • Implement pyupgrade check for io.open alias by @squiddy in https://github.com/charliermarsh/ruff/pull/1399
    • Tweak secret detection for playground releases by @charliermarsh in https://github.com/charliermarsh/ruff/pull/1402
    • Support isort's force-single-line option by @squiddy in https://github.com/charliermarsh/ruff/pull/1366
    • Replace make_tokenize with make_tokenizer_located by @harupy in https://github.com/charliermarsh/ruff/pull/1405
    • Add cargo +nightly dev generate-all by @charliermarsh in https://github.com/charliermarsh/ruff/pull/1404
    • Allow specification of explicit docstring convention by @charliermarsh in https://github.com/charliermarsh/ruff/pull/1408
    • Pyupgrade: converts universal_newlines to text in subprocess.run by @colin99d in https://github.com/charliermarsh/ruff/pull/1403
    • Fix invalid reference to ruff_options.rs by @charliermarsh in https://github.com/charliermarsh/ruff/pull/1409

    Full Changelog: https://github.com/charliermarsh/ruff/compare/v0.0.195...v0.0.196

    Source code(tar.gz)
    Source code(zip)
  • v0.0.195(Dec 27, 2022)

    What's Changed

    • Add support for ruff.toml by @charliermarsh in https://github.com/charliermarsh/ruff/pull/1378
    • Update rust python to handle files with BOM by @squiddy in https://github.com/charliermarsh/ruff/pull/1379
    • Only re-associate inline comments during normalization when necessary by @squiddy in https://github.com/charliermarsh/ruff/pull/1380
    • Magic Trailing Commas in isort by @colin99d in https://github.com/charliermarsh/ruff/pull/1363
    • Web playground with WASM by @squiddy in https://github.com/charliermarsh/ruff/pull/1279
    • Enable preview deployments for playground by @charliermarsh in https://github.com/charliermarsh/ruff/pull/1383
    • Add ESLint, Prettier, and TypeScript checks by @charliermarsh in https://github.com/charliermarsh/ruff/pull/1384
    • Add badge to playground by @charliermarsh in https://github.com/charliermarsh/ruff/pull/1393
    • Choose a more interesting example snippet by @charliermarsh in https://github.com/charliermarsh/ruff/pull/1394
    • Enable Quick Fix in the playground by @charliermarsh in https://github.com/charliermarsh/ruff/pull/1395
    • Only run playground release in main repo by @charliermarsh in https://github.com/charliermarsh/ruff/pull/1396
    • Now replace typing.Text with str by @colin99d in https://github.com/charliermarsh/ruff/pull/1391

    Full Changelog: https://github.com/charliermarsh/ruff/compare/v0.0.194...v0.0.195

    Source code(tar.gz)
    Source code(zip)
  • v0.0.194(Dec 26, 2022)

    What's Changed

    • Fix F841 (UnusedVariable) range in except handler by @harupy in https://github.com/charliermarsh/ruff/pull/1367
    • Improve excepthandler_name_range by @harupy in https://github.com/charliermarsh/ruff/pull/1368
    • Ignore unused arguments for @overload stubs by @charliermarsh in https://github.com/charliermarsh/ruff/pull/1373
    • Respect natural ordering for imports by @charliermarsh in https://github.com/charliermarsh/ruff/pull/1374
    • Add a --fix-only command-line and pyproject.toml option by @charliermarsh in https://github.com/charliermarsh/ruff/pull/1375
    • Avoid double-extending past the end when showing source by @charliermarsh in https://github.com/charliermarsh/ruff/pull/1377
    • Add --required-version by @charliermarsh in https://github.com/charliermarsh/ruff/pull/1376

    Full Changelog: https://github.com/charliermarsh/ruff/compare/v0.0.193...v0.0.194

    Source code(tar.gz)
    Source code(zip)
  • v0.0.193(Dec 24, 2022)

    What's Changed

    • Update CONTRIBUTING.md by @colin99d in https://github.com/charliermarsh/ruff/pull/1344
    • Add a link to the PyCharm plugin by @charliermarsh in https://github.com/charliermarsh/ruff/pull/1345
    • Avoid enabling all EM checks at once by @charliermarsh in https://github.com/charliermarsh/ruff/pull/1349
    • Implement "native literals" check from pyupgrade by @squiddy in https://github.com/charliermarsh/ruff/pull/1350
    • Bump compatibility to 3.11 by @charliermarsh in https://github.com/charliermarsh/ruff/pull/1352
    • Add cache-dir to command-line and pyproject.toml by @squiddy in https://github.com/charliermarsh/ruff/pull/1351
    • Update RustPython to use the correct BinOp location by @harupy in https://github.com/charliermarsh/ruff/pull/1355
    • Add autofix for W292 [NoNewLineAtEndOfFile] by @Sawbez in https://github.com/charliermarsh/ruff/pull/1354
    • Don't trigger E721 when comparing with None by @squiddy in https://github.com/charliermarsh/ruff/pull/1356
    • Fix false-positive in RET504 when referencing globals by @squiddy in https://github.com/charliermarsh/ruff/pull/1358
    • Fix B025 location by @harupy in https://github.com/charliermarsh/ruff/pull/1360
    • Add autofix for W605 [InvalidEscapeSequence] by @Sawbez in https://github.com/charliermarsh/ruff/pull/1361
    • Generate JSON schema for Ruff options by @edgarrmondragon in https://github.com/charliermarsh/ruff/pull/1329
    • Annotate RUF100 messages with unmatched, disabled, and unknown codes by @charliermarsh in https://github.com/charliermarsh/ruff/pull/1365

    New Contributors

    • @colin99d made their first contribution in https://github.com/charliermarsh/ruff/pull/1344
    • @Sawbez made their first contribution in https://github.com/charliermarsh/ruff/pull/1354

    Full Changelog: https://github.com/charliermarsh/ruff/compare/v0.0.192...v0.0.193

    Source code(tar.gz)
    Source code(zip)
  • v0.0.192(Dec 22, 2022)

    What's Changed

    • Add some more repositories to the user list by @charliermarsh in https://github.com/charliermarsh/ruff/pull/1328
    • Allow unittest methods in flake8-boolean-trap by @charliermarsh in https://github.com/charliermarsh/ruff/pull/1333
    • Set force-exclude for pre-commit in README by @charliermarsh in https://github.com/charliermarsh/ruff/pull/1337
    • Extend false-positive list for flake8-boolean-trap by @charliermarsh in https://github.com/charliermarsh/ruff/pull/1338
    • Respect --force-exclude for files passed via stdin by @charliermarsh in https://github.com/charliermarsh/ruff/pull/1342
    • Implement "datetime.UTC alias" check from pyupgrade by @squiddy in https://github.com/charliermarsh/ruff/pull/1341

    Full Changelog: https://github.com/charliermarsh/ruff/compare/v0.0.191...v0.0.192

    Source code(tar.gz)
    Source code(zip)
  • v0.0.191(Dec 22, 2022)

    What's Changed

    • Fix false positive DTZ001 on datetime(2000, 1, 1, 0, 0, 0, 0, utc) by @bluetech in https://github.com/charliermarsh/ruff/pull/1308
    • Extract line length from pyproject.toml Black section by @charliermarsh in https://github.com/charliermarsh/ruff/pull/1317
    • Support code redirects in flake8-to-ruff by @charliermarsh in https://github.com/charliermarsh/ruff/pull/1318
    • Improve debug logging in flake8-to-ruff by @charliermarsh in https://github.com/charliermarsh/ruff/pull/1320
    • Infer package roots when running via stdin by @charliermarsh in https://github.com/charliermarsh/ruff/pull/1321
    • Support shell expansion in extend paths by @charliermarsh in https://github.com/charliermarsh/ruff/pull/1323
    • Support shell expansion in src field by @charliermarsh in https://github.com/charliermarsh/ruff/pull/1324
    • Move number of errors to the bottom of the output summary by @charliermarsh in https://github.com/charliermarsh/ruff/pull/1325
    • Implement E401 ("multiple imports on one line") by @charliermarsh in https://github.com/charliermarsh/ruff/pull/1326

    New Contributors

    • @bluetech made their first contribution in https://github.com/charliermarsh/ruff/pull/1308

    Full Changelog: https://github.com/charliermarsh/ruff/compare/v0.0.190...v0.0.191

    Source code(tar.gz)
    Source code(zip)
  • v0.0.190(Dec 21, 2022)

    What's Changed

    • Avoid F821 false positives for Mypy extensions by @charliermarsh in https://github.com/charliermarsh/ruff/pull/1304
    • Avoid flagging RUF100 as a RUF100 violation by @charliermarsh in https://github.com/charliermarsh/ruff/pull/1305
    • Allow overriding cache location via RUFF_CACHE_DIR by @charliermarsh in https://github.com/charliermarsh/ruff/pull/1312
    • Avoid used-prior-global-declaration false-positives in f-strings by @charliermarsh in https://github.com/charliermarsh/ruff/pull/1314

    Full Changelog: https://github.com/charliermarsh/ruff/compare/v0.0.189...v0.0.190

    Source code(tar.gz)
    Source code(zip)
  • v0.0.189(Dec 20, 2022)

    What's Changed

    • Update Arg section checking to match latest pydocstyle by @charliermarsh in https://github.com/charliermarsh/ruff/pull/1293
    • Avoid RET504 errors for intermediary function calls by @charliermarsh in https://github.com/charliermarsh/ruff/pull/1294
    • Add --force-exclude setting to force exclusions with pre-commit by @charliermarsh in https://github.com/charliermarsh/ruff/pull/1295
    • [Stylistic/non-functional] Use an r# format string to make json easier to read by @hanneskaeufler in https://github.com/charliermarsh/ruff/pull/1299
    • Avoid DTZ007 false-positives for non-string arguments by @charliermarsh in https://github.com/charliermarsh/ruff/pull/1300

    New Contributors

    • @hanneskaeufler made their first contribution in https://github.com/charliermarsh/ruff/pull/1299

    Full Changelog: https://github.com/charliermarsh/ruff/compare/v0.0.188...v0.0.189

    Source code(tar.gz)
    Source code(zip)
  • v0.0.188(Dec 19, 2022)

    What's Changed

    • implement flake8-datetimez by @Yasu-umi in https://github.com/charliermarsh/ruff/pull/1270
    • Move flake8-debugger tests into flake8-debugger subdirectory by @charliermarsh in https://github.com/charliermarsh/ruff/pull/1286
    • Avoid T201 errors for print(..., file=fp)-like calls by @charliermarsh in https://github.com/charliermarsh/ruff/pull/1287
    • Rename PDV checks to PD by @charliermarsh in https://github.com/charliermarsh/ruff/pull/1288

    New Contributors

    • @Yasu-umi made their first contribution in https://github.com/charliermarsh/ruff/pull/1270

    Full Changelog: https://github.com/charliermarsh/ruff/compare/v0.0.187...v0.0.188

    Source code(tar.gz)
    Source code(zip)
  • v0.0.187(Dec 19, 2022)

    What's Changed

    • generate-check-code-prefix: Run rustfmt automatically; only write if changed by @andersk in https://github.com/charliermarsh/ruff/pull/1282
    • Use --stdin-filename when resolving configuration files by @cdbrendel in https://github.com/charliermarsh/ruff/pull/1281
    • pygrep-hooks - deprecated use of logging.warn & no blanket type ignore by @squiddy in https://github.com/charliermarsh/ruff/pull/1275
    • Fix inverted E501 condition by @charliermarsh in https://github.com/charliermarsh/ruff/pull/1285

    Full Changelog: https://github.com/charliermarsh/ruff/compare/v0.0.186...v0.0.187

    Source code(tar.gz)
    Source code(zip)
  • v0.0.186(Dec 18, 2022)

    What's Changed

    • Add instructions for Sublime Text installation by @charliermarsh in https://github.com/charliermarsh/ruff/pull/1271
    • Add ruff-lsp to README by @charliermarsh in https://github.com/charliermarsh/ruff/pull/1272
    • Repair corrupted PDV007, PDV009 messages by @andersk in https://github.com/charliermarsh/ruff/pull/1273
    • README: Add missing backtick by @andersk in https://github.com/charliermarsh/ruff/pull/1274
    • Update RustPython to use correct Tuple location by @harupy in https://github.com/charliermarsh/ruff/pull/1278
    • Print redirect warnings exactly once per code by @charliermarsh in https://github.com/charliermarsh/ruff/pull/1280
    • Readme : Fix incorrect exmaple. by @Honkertonken in https://github.com/charliermarsh/ruff/pull/1277
    • Add packaging status badge from repology by @andersk in https://github.com/charliermarsh/ruff/pull/1276

    New Contributors

    • @Honkertonken made their first contribution in https://github.com/charliermarsh/ruff/pull/1277

    Full Changelog: https://github.com/charliermarsh/ruff/compare/v0.0.185...v0.0.186

    Source code(tar.gz)
    Source code(zip)
  • v0.0.185(Dec 17, 2022)

    What's Changed

    • Auto-detect same-package imports by @charliermarsh in https://github.com/charliermarsh/ruff/pull/1266
    • Separate line-based checker from noqa enforcement by @charliermarsh in https://github.com/charliermarsh/ruff/pull/1267
    • Move checkers into their own module by @charliermarsh in https://github.com/charliermarsh/ruff/pull/1268

    Full Changelog: https://github.com/charliermarsh/ruff/compare/v0.0.184...v0.0.185

    Source code(tar.gz)
    Source code(zip)
  • v0.0.184(Dec 16, 2022)

    What's Changed

    • test: Fix flake8-errmsg snapshots by @edgarrmondragon in https://github.com/charliermarsh/ruff/pull/1260
    • Add ignore-variadic-names options to flake8-unused-arguments by @charliermarsh in https://github.com/charliermarsh/ruff/pull/1261
    • Fix F501 (line-too-long) start location by @harupy in https://github.com/charliermarsh/ruff/pull/1262
    • Replace ignore_noqa and autofix booleans with enums by @charliermarsh in https://github.com/charliermarsh/ruff/pull/1264
    • Enable autofix for init method with missing None-return by @charliermarsh in https://github.com/charliermarsh/ruff/pull/1265

    Full Changelog: https://github.com/charliermarsh/ruff/compare/v0.0.183...v0.0.184

    Source code(tar.gz)
    Source code(zip)
  • v0.0.183(Dec 16, 2022)

    What's Changed

    • Avoid fixing E711 and E712 issues that would cause F632 by @charliermarsh in https://github.com/charliermarsh/ruff/pull/1248
    • Implement pandas-vet by @edgarrmondragon in https://github.com/charliermarsh/ruff/pull/1235
    • Implement U016: Remove six compatibility code by @martinlehoux in https://github.com/charliermarsh/ruff/pull/1013
    • Test to prevent continious reformatting when used together with black by @squiddy in https://github.com/charliermarsh/ruff/pull/1206
    • Avoid generating invalid statements when deleting from multi-statement lines by @charliermarsh in https://github.com/charliermarsh/ruff/pull/1253
    • Implement flake8-errmsg by @edgarrmondragon in https://github.com/charliermarsh/ruff/pull/1258
    • Avoid removing partially-unused imports by @charliermarsh in https://github.com/charliermarsh/ruff/pull/1259

    Full Changelog: https://github.com/charliermarsh/ruff/compare/v0.0.182...v0.0.183

    Source code(tar.gz)
    Source code(zip)
  • v0.0.182(Dec 15, 2022)

    What's Changed

    • Ignore any pyproject.toml without a [tool.ruff] section by @charliermarsh in https://github.com/charliermarsh/ruff/pull/1243
    • Treat extend-* configuration options as "always extended" by @charliermarsh in https://github.com/charliermarsh/ruff/pull/1245
    • Use more precise ranges for function and class checks by @charliermarsh in https://github.com/charliermarsh/ruff/pull/1247

    Full Changelog: https://github.com/charliermarsh/ruff/compare/v0.0.181...v0.0.182

    Source code(tar.gz)
    Source code(zip)
  • v0.0.181(Dec 14, 2022)

    What's Changed

    • Apply fix to all errors in E711 and E712 autofix by @charliermarsh in https://github.com/charliermarsh/ruff/pull/1238
    • Avoid converting expression to statement in invald contexts by @charliermarsh in https://github.com/charliermarsh/ruff/pull/1239
    • Automatically ignore files specified in .gitignore by @charliermarsh in https://github.com/charliermarsh/ruff/pull/1234
    • Add new .gitignore behavior to BREAKING_CHANGES.md by @charliermarsh in https://github.com/charliermarsh/ruff/pull/1240
    • Always check zero-depth CLI paths by @charliermarsh in https://github.com/charliermarsh/ruff/pull/1241
    • Enable opt-out of .gitignore checks via respect-gitignore flag by @charliermarsh in https://github.com/charliermarsh/ruff/pull/1242

    Full Changelog: https://github.com/charliermarsh/ruff/compare/v0.0.180...v0.0.181

    Source code(tar.gz)
    Source code(zip)
  • v0.0.180(Dec 14, 2022)

    What's Changed

    • Apply CLI options even when no pyproject.toml is found by @cdbrendel in https://github.com/charliermarsh/ruff/pull/1232

    New Contributors

    • @cdbrendel made their first contribution in https://github.com/charliermarsh/ruff/pull/1232

    Full Changelog: https://github.com/charliermarsh/ruff/compare/v0.0.179...v0.0.180

    Source code(tar.gz)
    Source code(zip)
Owner
Charlie Marsh
Working on something new. Python, Rust, and WebAssembly. Past: Staff software engineer @ Spring Discovery, Khan Academy.
Charlie Marsh
Tools - The Rome Toolchain. A linter, compiler, bundler, and more for JavaScript, TypeScript, HTML, Markdown, and CSS.

Rome is currently being rewritten in Rust. Read more about it in our latest blog post. The documentation below is out of date and available for poster

Rome 22k Jan 3, 2023
A Faster(⚡) formatter, linter, bundler, and more for JavaScript, TypeScript, JSON, HTML, Markdown, and CSS Lapce Plugin

Lapce Plugin for Rome Lapce-rome is a Lapce plugin for rome, The Rome is faster ⚡ , A formatter, linter, compiler, bundler, and more for JavaScript, T

xiaoxin 7 Dec 16, 2022
The JavaScript Oxidation Compiler -> Linter / Prettier

The JavaScript Oxidation Compiler (oxc) Why this project? The goal of this project is to: Create a blazingly fast JavaScript Compiler written in Rust.

Boshen 125 Feb 22, 2023
Opinionated, zero-config linter for JavaScript monorepos

Sherif: Opinionated, zero-config linter for JavaScript monorepos About Sherif is an opinionated, zero-config linter for JavaScript monorepos. It runs

Tom Lienard 219 Oct 10, 2023
⚡ An extremely fast cross-compatible system information tool.

Lightfetch A extremely fast command-line system information tool written in Rust ⚡ . Gallery Sadly there isn't much to showcase right now. Download Av

bwtecode 2 Sep 12, 2022
⚡ An extremely fast cross-compatible system information tool.

Lightfetch A extremely fast command-line system information tool written in Rust ⚡ . Gallery Sadly there isn't much to showcase right now. Download Av

bwtecode 2 Sep 12, 2022
⚡ An extremely fast reimplementation of gmad.exe and gmpublish.exe

⚡ fastgmad Download An extremely fast reimplementation of gmad.exe and gmpublish.exe. Prefer to use a GUI? Check out gmpublisher! Features Up to x100

William 16 Sep 18, 2023
Rust Imaging Library's Python binding: A performant and high-level image processing library for Python written in Rust

ril-py Rust Imaging Library for Python: Python bindings for ril, a performant and high-level image processing library written in Rust. What's this? Th

Cryptex 13 Dec 6, 2022
An extremely high performance logging system for clients (iOS, Android, Desktop), written in Rust.

Pinenut Log 中文文档 ・ English An extremely high performance logging system for clients (iOS, Android, Desktop), written in Rust. Overview Compression Pin

Tangent 4 Dec 1, 2023
PyO3 bindings and Python interface to skani, a method for fast fast genomic identity calculation using sparse chaining.

?? ⛓️ ?? Pyskani PyO3 bindings and Python interface to skani, a method for fast fast genomic identity calculation using sparse chaining. ??️ Overview

Martin Larralde 13 Mar 21, 2023
Extremely simple http rust servers :snowboarder:

Snowboard ?? An extremelly simple library for fast & simple TCP servers in rust [Request a feature/Report a bug] Quick start To get started with Snowb

null 3 Oct 23, 2023
A fully modular window manager, extremely extensibile and easily approachable.

AquariWM is a fully modular window manager, allowing extreme extensibility while remaining easily approachable. Installation AquariWM is currently in

AquariWM Window Manager 8 Nov 14, 2022
RedMaple offers an oppinionated yet extremely flexible data modeling system based on events for back-end applications.

RedMaple offers an oppinionated yet extremely flexible data modeling system based on events for back-end applications.

Amir Alesheikh 4 Mar 5, 2023
Maccha is an extremely extensible and themable power menu for Windows, macOS, and Linux.

Maccha I hate coffee. Maccha is an extremely extensible and themable power menu for Windows, macOS, and Linux. Plugins Plugins are written in Rust (ot

Kyza 9 May 13, 2023
Fast DNA manipulation for Python, written in Rust.

quickdna Quickdna is a simple, fast library for working with DNA sequences. It is up to 100x faster than Biopython for some translation tasks, in part

Secure DNA 22 Dec 31, 2022
⚡ Blazing fast async/await HTTP client for Python written on Rust using reqwests

Reqsnaked Reqsnaked is a blazing fast async/await HTTP client for Python written on Rust using reqwests. Works 15% faster than aiohttp on average RAII

Yan Kurbatov 8 Mar 2, 2023
A fast python geohash library created by wrapping rust.

Pygeohash-Fast A Fast geohasher for python. Created by wrapping the rust geohash crate with pyo3. Huge shout out to the georust community :) Currently

Zach Paden 3 Aug 18, 2022
A fast, simple and lightweight Bloom filter library for Python, fully implemented in Rust.

rBloom A fast, simple and lightweight Bloom filter library for Python, fully implemented in Rust. It's designed to be as pythonic as possible, mimicki

Kenan Hanke 91 Feb 4, 2023
cpa is a cli tool for ultra fast setup of Rust & Python projects

CPA: Create-Python-App cpa is a cli tool for ultra fast setup of new Python & Rust projects. It automates the creation of config files like style & li

Yuki Sawa 56 Dec 3, 2023