Ruff extremely fast Python linter written in rust supperseding many other linting tools
Provides
Requires
License
MIT
Changelog
* Sun Jan 25 2026 Ondřej Súkup <mimi.vx@gmail.com>
- update to 0.14.14
* Preview features
* Preserve required parentheses in lambda bodies
* Combine range suppression code diagnostics
* [airflow] Second positional argument to Asset/Dataset should not be a dictionary (AIR303)
* [ruff] Detect duplicate entries in __all__ (RUF068)
* Bug fixes
* [pyupgrade] Allow shadowing non-builtin bindings (UP029)
* [pyupgrade] Apply UP045 to string arguments of typing.cast
* [flake8-pie] Detect duplicated declared class fields in PIE794
* Rule changes
* [flake8-pyi] Fix inconsistent handling of forward references for __new__, __enter__, __aenter__ in PYI034
* [flake8-pytest-style] Support check parameter in PT011
* [ruff] Add exception for ctypes.Structure._fields_ (RUF012)
* Many fixes are now marked unsafe if they would remove comments:
* [flake8-bugbear] B009, B010, B013, B014, B033
* [flake8-simplify] SIM910, SIM911
* [pyupgrade] UP007, UP039, UP041, UP045
* [refurb] FURB105, FURB116, FURB136, FURB140, FURB145, FURB154, FURB157, FURB164,FURB181, FURB188
* [ruff] RUF019, RUF020
* Documentation
* Add --exit-non-zero-on-format to formatter exit codes section
* Update contributing guide for adding a new rule
* [FastAPI] Document fix safety for FAST001
* [flake8-async] Tweak explanation to focus on latency/efficiency tradeoff (ASYNC110)
* [pandas-vet] Make example error out-of-the-box (PD002)
* [refurb] Make the example work out of box (FURB101)
* [refurb] Make the example work out of box (FURB103)
* Fri Jan 16 2026 Ondřej Súkup <mimi.vx@gmail.com>
- update to 0.14.13
* Preview features
* [flake8-blind-except] Allow more logging methods (BLE001)
* [ruff] Respect lint.pydocstyle.property-decorators in RUF066
* Bug fixes
* Fix configuration path in --show-settings
* Respect fmt: skip for multiple statements on the same logical line
* Rule changes
* [pydocstyle] Update Rust crate imperative to v1.0.7 (D401)
* [isort] Insert imports in alphabetical order (I002)
* Documentation
* Add llms.txt support for documentation
* Use prek in documentation and CI
* [flake8-pytest-style] Add check parameter example to PT017 docs
* [ruff] Make example error out-of-the-box (RUF103)
* [ruff] document RUF100 trailing comment fix behavior
* Other changes
* wasm: Require explicit logging initialization
* Sun Jan 11 2026 Ondřej Súkup <mimi.vx@gmail.com>
- update to 0.14.11
* Preview features
* Consolidate diagnostics for matched disable/enable suppression comments
* Report diagnostics for invalid/unmatched range suppression comments
* [airflow] Passing positional argument into airflow.lineage.hook.HookLineageCollector.create_asset is not allowed (AIR303)
* [refurb] Mark FURB192 fix as always unsafe
* [ruff] Add non-empty-init-module (RUF067)
* Bug fixes
* [flake8-unused-arguments] Mark **kwargs in TypeVar as used (ARG001)
* Rule changes
* Add help: subdiagnostics for several Ruff rules that can sometimes appear to disagree with ty
* [pylint] Demote PLW1510 fix to display-only
* [pylint] Ignore identical members (PLR1714)
* [pylint] Improve diagnostic range for PLC0206
* [ruff] Improve fix title for RUF102 invalid rule code
* [flake8-simplify]: Avoid unnecessary builtins import for SIM105
* Configuration
* Allow Python 3.15 as valid target-version value in preview
* Check required-version before parsing rules
* Include configured src directories when resolving graphs
* Documentation
* Update T201 suggestion to not use root logger to satisfy LOG015
* Fix iter example in unsafe fixes doc
* [flake8_print] better suggestion for basicConfig in T201 docs
* [pylint] Restore the fix safety docs for PLW0133
* Fix Jupyter notebook discovery info for editors
* Sun Dec 21 2025 Ondřej Súkup <mimi.vx@gmail.com>
- update to 0.14.10:
* Preview feature
* [formatter] Fluent formatting of method chains
* [formatter] Keep lambda parameters on one line and parenthesize the body if it expands
* [flake8-implicit-str-concat] New rule to prevent implicit string concatenation in collections (ISC004)
* [flake8-use-pathlib] Make fixes unsafe when types change in compound statements (PTH104, PTH105, PTH109, PTH115)
* [refurb] Extend support for Path.open (FURB101, FURB103)
* Bug fixes
* [pyupgrade] Fix parsing named Unicode escape sequences (UP032)
* Rule changes
* [eradicate] Ignore ruff:disable and ruff:enable comments in ERA001
* [flake8-pytest-style] Allow match and check keyword arguments without an expected exception type (PT010)
* [syntax-errors] Annotated name cannot be global
* Documentation
* Add uv and ty to the Ruff README
* Document known lambda formatting deviations from Black
* Update setup.md
* [flake8-bandit] Fix broken link (S704)
* Sun Dec 14 2025 Ondřej Súkup <mimi.vx@gmail.com>
- update to 0.14.9
* Preview features
* [ruff] New RUF100 diagnostics for unused range suppressions
* [pylint] Detect subclasses of builtin exceptions (PLW0133)
* Bug fixes
* Fix comment placement in lambda parameters
* Skip over trivia tokens after re-lexing
* [flake8-bandit] Fix false positive when using non-standard CSafeLoader path (S506).
* [flake8-bugbear] Accept immutable slice default arguments (B008)
* Rule changes
* [pydocstyle] Suppress D417 for parameters with Unpack annotations
* Performance
* Use memchr for computing line indexes
* Documentation
* Document *.pyw is included by default in preview
* Document range suppressions, reorganize suppression docs
* Update mkdocs-material to 9.7.0 (Insiders now free)
* Fri Dec 05 2025 Ondřej Súkup <mimi.vx@gmail.com>
- update 0.14.8
* Preview features
* [flake8-bugbear] Catch yield expressions within other statements (B901)
* [flake8-use-pathlib] Mark fixes unsafe for return type changes (PTH104, PTH105, PTH109, PTH115)
* Bug fixes
* Fix syntax error false positives for await outside functions
* [flake8-simplify] Fix truthiness assumption for non-iterable arguments in tuple/list/set calls (SIM222, SIM223)
* Documentation
* Suggest using --output-file option in GitLab integration
* Other changes
* [syntax-error] Default type parameter followed by non-default type parameter
* Sat Nov 29 2025 Ondřej Súkup <mimi.vx@gmail.com>
- update to 0.14.7
* Preview features
* [flake8-bandit] Handle string literal bindings in suspicious-url-open-usage (S310)
* [pylint] Fix PLR1708 false positives on nested functions
* [pylint] Fix suppression for empty dict without tuple key annotation (PLE1141)
* [ruff] Add rule RUF066 to detect unnecessary class properties
* [ruff] Catch more dummy variable uses (RUF052)
* Bug fixes
* [server] Set severity for non-rule diagnostics
* [flake8-implicit-str-concat] Avoid invalid fix in (ISC003)
* [parser] Fix panic when parsing IPython escape command expressions
* CLI
* Show partial fixability indicator in statistics output
* Mon Nov 24 2025 Ondřej Súkup <mimi.vx@gmail.com>
- update to 0.14.6
* Preview features
* [flake8-bandit] Support new PySNMP API paths (S508, S509)
* Bug fixes
* Adjust own-line comment placement between branches
* Avoid syntax error when formatting attribute expressions with outer parentheses,
parenthesized value, and trailing comment on value
* Fix panic when formatting comments in unary expressions
* Respect fmt: skip for compound statements on a single line
* [refurb] Fix FURB103 autofix
* [ruff] Fix false positive for complex conversion specifiers in logging-eager-conversion (RUF065)
* Rule changes
* [ruff] Avoid false positive on ClassVar reassignment (RUF012)
* CLI
* Render hyperlinks for lint errors
* Add a ruff analyze option to skip over imports in TYPE_CHECKING blocks
* Documentation
* Limit eglot-format hook to eglot-managed Python buffers
* Mention force-exclude in "Configuration > Python file discovery"
* Sat Nov 15 2025 Ondřej Súkup <mimi.vx@gmail.com>
- update to 0.14.5
* Preview features
* [flake8-simplify] Apply SIM113 when index variable is of type int
* [pydoclint] Fix false positive when Sphinx directives follow a "Raises" section (DOC502)
* [pydoclint] Support NumPy-style comma-separated parameters (DOC102)
* [refurb] Auto-fix annotated assignments (FURB101)
* [ruff] Ignore str() when not used for simple conversion (RUF065)
* Bug fixes
* Fix syntax error false positive on alternative match patterns
* [flake8-simplify] Fix false positive for iterable initializers with generator arguments (SIM222)
* [pyupgrade] Fix false positive on relative imports from local .builtins module (UP029)
* [pyupgrade] Consistently set the deprecated tag (UP035)
* Rule changes
* [refurb] Detect empty f-strings (FURB105)
* CLI
* Add option to provide a reason to --add-noqa
* Add upstream linter URL to ruff linter --output-format=json
* Add color to --help
* Documentation
* Add a new "Opening a PR" section to the contribution guide
* Added the PyScripter IDE to the list of "Who is using Ruff?"
* Update PyCharm setup instructions
* [flake8-annotations] Add link to allow-star-arg-any option (ANN401)
* Other changes
* [configuration] Improve error message when line-length exceeds u16::MAX
* Fri Nov 07 2025 Ondřej Súkup <mimi.vx@gmail.com>
- update to 0.14.4
* Preview features
* [formatter] Allow newlines after function headers without docstrings
* [formatter] Avoid extra parentheses for long match patterns with as captures
* [refurb] Expand fix safety for keyword arguments and Decimals (FURB164)
* [refurb] Preserve argument ordering in autofix (FURB103)
* Bug fixes
* [server] Fix missing diagnostics for notebooks
* [flake8-bugbear] Ignore non-NFKC attribute names in B009 and B010
* [refurb] Fix false negative for underscores before sign in Decimal constructor (FURB157)
* [ruff] Fix false positives on starred arguments (RUF057)
* Rule changes
* [airflow] extend deprecated argument concurrency in airflow..DAG (AIR301)
* Documentation
* Improve extend docs
* [flake8-comprehensions] Fix typo in C416 documentation
* Revise Ruff setup instructions for Zed editor
* Other changes
* Make ruff analyze graph work with jupyter notebooks
* Fri Oct 31 2025 Dirk Müller <dmueller@suse.com>
- update to 0.14.3:
* Respect `--output-format` with `--watch`
* [`pydoclint`] Fix false positive on explicit exception re-
raising (`DOC501`, `DOC502`)
* [`pyflakes`] Revert to stable behavior if imports for
module lie in alternate branches for `F401`
* [`pylint`] Implement `stop-iteration-return` (`PLR1708`)
* [`ruff`] Add support for additional eager conversion
patterns (`RUF065`)
* Fix finding keyword range for clause header after statement
ending with semicolon
* Fix syntax error false positive on nested alternative
patterns
* [`ISC001`] Fix panic when string literals are unclosed
* [`flake8-django`] Apply `DJ001` to annotated fields
* [`flake8-pyi`] Fix `PYI034` to not trigger on metaclasses
(`PYI034`)
* [`flake8-type-checking`] Fix `TC003` false positive with
`future-annotations`
* [`pyflakes`] Fix false positive for `__class__` in lambda
expressions within class definitions (`F821`)
* [`pyupgrade`] Fix false positive for `TypeVar` with default
on Python \<3.13 (`UP046`,`UP047`)
* Fri Oct 24 2025 Ondřej Súkup <mimi.vx@gmail.com>
- update to 0.14.2
* Preview features
* [flake8-gettext] Resolve qualified names and built-in bindings (INT001, INT002, INT003)
* Bug fixes
* Avoid reusing nested, interpolated quotes before Python 3.12
* Catch syntax errors in nested interpolations before Python 3.12
* [fastapi] Handle ellipsis defaults in FAST002 autofix
* [flake8-simplify] Skip SIM911 when unknown arguments are present
* [pyupgrade] Always parenthesize assignment expressions in fix for f-string (UP032)
* [pyupgrade] Fix UP032 conversion for decimal ints with underscores
* [fastapi] Skip autofix for keyword and __debug__ path params (FAST003)
* Rule changes
* [flake8-bugbear] Skip B905 and B912 for fewer than two iterables and no starred arguments
* [ruff] Use DiagnosticTag for more pyflakes and pandas rules
* CLI
* Improve JSON output from ruff rule
* Documentation
* Add source to testimonial
* Document when a rule was added
* Other changes
* [syntax-errors] Name is parameter and global
* [syntax-errors] Alternative match patterns bind different names
* Thu Oct 16 2025 Ondřej Súkup <mimi.vx@gmail.com>
- update to 0.14.1
* Preview features
* [formatter] Remove parentheses around multiple exception types on Python 3.14+
* [flake8-bugbear] Omit annotation in preview fix for B006
* [flake8-logging-format] Avoid dropping implicitly concatenated pieces in the G004 fix
* [pydoclint] Implement docstring-extraneous-parameter (DOC102)
* [pyupgrade] Extend UP019 to detect typing_extensions.Text (UP019)
* [pyupgrade] Fix false negative for TypeVar with default argument in non-pep695-generic-class (UP046)
* Bug fixes
* Fix false negatives in Truthiness::from_expr for lambdas, generators, and f-strings
* Fix syntax error false positives for escapes and quotes in f-strings
* Fix syntax error false positives on parenthesized context managers
* [fastapi] Fix false positives for path parameters that FastAPI doesn't recognize (FAST003)
* [flake8-pyi] Fix operator precedence by adding parentheses when needed (PYI061)
* [ruff] Suppress diagnostic for f-string interpolations with debug text (RUF010)
* Rule changes
* [airflow] Add warning to airflow.datasets.DatasetEvent usage (AIR301)
* [flake8-bugbear] Mark B905 and B912 fixes as unsafe
* Use DiagnosticTag for more rules - changes display in editors
* Documentation
* Update Python compatibility from 3.13 to 3.14 in README.md
* Update lint.flake8-type-checking.quoted-annotations docs
* Update setup instructions for Zed 0.208.0+
* [flake8-datetimez] Clarify docs for several rules
* Fix