
Summary -- During the release today, I noticed that the changelog is finally too long to render at all on GitHub. This PR follows the same splitting procedure as in uv (astral-sh/uv#11510, astral-sh/uv#12099): first splitting the file into one per minor version, and then reversing the contents of each file to start with the breaking release (`changelogs/0.11.x.md` starts with 0.11.0 instead of 0.11.13 as in the old changelog). For the second part, I used [`reverse-changelog.py`](https://github.com/astral-sh/uv/blob/main/scripts/reverse-changelog.py) from the uv repo, so hopefully everything is correct. I spot-checked 0.7.0 at least.
26 KiB
Changelog 0.5.x
0.5.0
Check out the blog post for a migration guide and overview of the changes!
Breaking changes
See also, the "Remapped rules" section which may result in disabled rules.
- Follow the XDG specification to discover user-level configurations on macOS (same as on other Unix platforms)
- Selecting
ALL
now excludes deprecated rules - The released archives now include an extra level of nesting, which can be removed with
--strip-components=1
when untarring. - The release artifact's file name no longer includes the version tag. This enables users to install via
/latest
URLs on GitHub. - The diagnostic ranges for some
flake8-bandit
rules were modified (#10667).
Deprecations
The following rules are now deprecated:
syntax-error
(E999
): Syntax errors are now always shown
Remapped rules
The following rules have been remapped to new rule codes:
blocking-http-call-in-async-function
:ASYNC100
toASYNC210
open-sleep-or-subprocess-in-async-function
:ASYNC101
split intoASYNC220
,ASYNC221
,ASYNC230
, andASYNC251
blocking-os-call-in-async-function
:ASYNC102
has been merged intoASYNC220
andASYNC221
trio-timeout-without-await
:TRIO100
toASYNC100
trio-sync-call
:TRIO105
toASYNC105
trio-async-function-with-timeout
:TRIO109
toASYNC109
trio-unneeded-sleep
:TRIO110
toASYNC110
trio-zero-sleep-call
:TRIO115
toASYNC115
repeated-isinstance-calls
:PLR1701
toSIM101
Stabilization
The following rules have been stabilized and are no longer in preview:
mutable-fromkeys-value
(RUF024
)default-factory-kwarg
(RUF026
)django-extra
(S610
)manual-dict-comprehension
(PERF403
)print-empty-string
(FURB105
)readlines-in-for
(FURB129
)if-expr-min-max
(FURB136
)bit-count
(FURB161
)redundant-log-base
(FURB163
)regex-flag-alias
(FURB167
)isinstance-type-none
(FURB168
)type-none-comparison
(FURB169
)implicit-cwd
(FURB177
)hashlib-digest-hex
(FURB181
)list-reverse-copy
(FURB187
)bad-open-mode
(PLW1501
)empty-comment
(PLR2044
)global-at-module-level
(PLW0604
)misplaced-bare-raise
(PLE0744
)non-ascii-import-name
(PLC2403
)non-ascii-name
(PLC2401
)nonlocal-and-global
(PLE0115
)potential-index-error
(PLE0643
)redeclared-assigned-name
(PLW0128
)redefined-argument-from-local
(PLR1704
)repeated-keyword-argument
(PLE1132
)super-without-brackets
(PLW0245
)unnecessary-list-index-lookup
(PLR1736
)useless-exception-statement
(PLW0133
)useless-with-lock
(PLW2101
)
The following behaviors have been stabilized:
is-literal
(F632
) now warns for identity checks against list, set or dictionary literalsneedless-bool
(SIM103
) now detectsif
expressions with implicitelse
branchesmodule-import-not-at-top-of-file
(E402
) now allowsos.environ
modifications between import statementstype-comparison
(E721
) now allows idioms such astype(x) is int
yoda-condition
(SIM300
) now flags a wider range of expressions
Removals
The following deprecated settings have been removed:
output-format=text
; useoutput-format=concise
oroutput-format=full
tab-size
; useindent-width
The following deprecated CLI options have been removed:
--show-source
; use--output-format=full
--no-show-source
; use--output-format=concise
The following deprecated CLI commands have been removed:
ruff <path>
; useruff check <path>
ruff --clean
; useruff clean
ruff --generate-shell-completion
; useruff generate-shell-completion
Preview features
- [
ruff
] Addassert-with-print-message
rule (#11981)
CLI
- Use rule name rather than message in
--statistics
(#11697) - Use the output format
full
by default (#12010) - Don't log syntax errors to the console (#11902)
Rule changes
- [
ruff
] Fix false positives ifgettext
is imported using an alias (RUF027
) (#12025) - [
numpy
] Updatetrapz
andin1d
deprecation (NPY201
) (#11948) - [
flake8-bandit
] Modify diagnostic ranges for shell-related rules (#10667)
Server
- Closing an untitled, unsaved notebook document no longer throws an error (#11942)
- Support the usage of tildes and environment variables in
logFile
(#11945) - Add option to configure whether to show syntax errors (#12059)
Bug fixes
- [
pycodestyle
] AvoidE203
for f-string debug expression (#12024) - [
pep8-naming
] Match import-name ignores against both name and alias (N812
,N817
) (#12033) - [
pyflakes
] Detect assignments that shadow definitions (F811
) (#11961)
Parser
- Emit a syntax error for an empty type parameter list (#12030)
- Avoid consuming the newline for unterminated strings (#12067)
- Do not include the newline in the unterminated string range (#12017)
- Use the correct range to highlight line continuation errors (#12016)
- Consider 2-character EOL before line continuations (#12035)
- Consider line continuation character for re-lexing (#12008)
Other changes
- Upgrade the Unicode table used for measuring the line-length (#11194)
- Remove the deprecation error message for the nursery selector (#10172)
0.5.1
Preview features
- [
flake8-bugbear
] Implement mutable-contextvar-default (B039) (#12113) - [
pycodestyle
] Whitespace after decorator (E204
) (#12140) - [
pytest
] ReversePT001
andPT0023
defaults (#12106)
Rule changes
- Enable token-based rules on source with syntax errors (#11950)
- [
flake8-bandit
] Detecthttpx
forS113
(#12174) - [
numpy
] UpdateNPY201
to include exception deprecations (#12065) - [
pylint
] Generate autofix forduplicate-bases
(PLE0241
) (#12105)
Server
- Avoid syntax error notification for source code actions (#12148)
- Consider the content of the new cells during notebook sync (#12203)
- Fix replacement edit range computation (#12171)
Bug fixes
- Disable auto-fix when source has syntax errors (#12134)
- Fix cache key collisions for paths with separators (#12159)
- Make
requires-python
inference robust to==
(#12091) - Use char-wise width instead of
str
-width (#12135) - [
pycodestyle
] AvoidE275
if keyword followed by comma (#12136) - [
pycodestyle
] AvoidE275
if keyword is followed by a semicolon (#12095) - [
pylint
] Skip dummy variables forPLR1704
(#12190)
Performance
0.5.2
Preview features
- Use
space
separator before parenthesized expressions in comprehensions with leading comments (#12282) - [
flake8-async
] UpdateASYNC100
to includeanyio
andasyncio
(#12221) - [
flake8-async
] UpdateASYNC109
to includeanyio
andasyncio
(#12236) - [
flake8-async
] UpdateASYNC110
to includeanyio
andasyncio
(#12261) - [
flake8-async
] UpdateASYNC115
to includeanyio
andasyncio
(#12262) - [
flake8-async
] UpdateASYNC116
to includeanyio
andasyncio
(#12266)
Rule changes
- [
flake8-return
] Exempt properties from explicit return rule (RET501
) (#12243) - [
numpy
] Addnp.NAN
-to-np.nan
diagnostic (#12292) - [
refurb
] Makelist-reverse-copy
an unsafe fix (#12303)
Server
- Consider
include
andextend-include
settings in native server (#12252) - Include nested configurations in settings reloading (#12253)
CLI
- Omit code frames for fixes with empty ranges (#12304)
- Warn about formatter incompatibility for
D203
(#12238)
Bug fixes
- Make cache-write failures non-fatal on Windows (#12302)
- Treat
not
operations as boolean tests (#12301) - [
flake8-bandit
] AvoidS310
violations for HTTP-safe f-strings (#12305) - [
flake8-bandit
] Support explicit string concatenations in S310 HTTP detection (#12315) - [
flake8-bandit
] fix S113 false positive for httpx withouttimeout
argument (#12213) - [
pycodestyle
] Remove "non-obvious" allowance for E721 (#12300) - [
pyflakes
] Considerwith
blocks as single-item branches for redefinition analysis (#12311) - [
refurb
] Restrict forwarding fornewline
argument inopen()
calls to Python versions >= 3.10 (#12244)
Documentation
- Update help and documentation to reflect
--output-format full
default (#12248)
Performance
- Use more threads when discovering Python files (#12258)
0.5.3
Ruff 0.5.3 marks the stable release of the Ruff language server and introduces revamped documentation, including setup guides for your editor of choice and the language server itself.
Preview features
- Formatter: Insert empty line between suite and alternative branch after function/class definition (#12294)
- [
pyupgrade
] Implementunnecessary-default-type-args
(UP043
) (#12371)
Rule changes
- [
flake8-bugbear
] Detect enumerate iterations inloop-iterator-mutation
(B909
) (#12366) - [
flake8-bugbear
] Removediscard
,remove
, andpop
allowance forloop-iterator-mutation
(B909
) (#12365) - [
pylint
] Allowrepeated-equality-comparison
for mixed operations (PLR1714
) (#12369) - [
pylint
] Ignoreself
andcls
when counting arguments (PLR0913
) (#12367) - [
pylint
] Use UTF-8 as default encoding inunspecified-encoding
fix (PLW1514
) (#12370)
Server
- Build settings index in parallel for the native server (#12299)
- Use fallback settings when indexing the project (#12362)
- Consider
--preview
flag forserver
subcommand for the linter and formatter (#12208)
Bug fixes
- [
flake8-comprehensions
] Allow additional arguments forsum
andmax
comprehensions (C419
) (#12364) - [
pylint
] Avoid dropping extra boolean operations inrepeated-equality-comparison
(PLR1714
) (#12368) - [
pylint
] Consider expression before statement when determining binding kind (PLR1704
) (#12346)
Documentation
- Add docs for Ruff language server (#12344)
- Migrate to standalone docs repo (#12341)
- Update versioning policy for editor integration (#12375)
Other changes
- Publish Wasm API to npm (#12317)
0.5.4
Rule changes
- [
ruff
] RenameRUF007
tozip-instead-of-pairwise
(#12399)
Bug fixes
- [
flake8-builtins
] Avoid shadowing diagnostics for@override
methods (#12415) - [
flake8-comprehensions
] Insert parentheses for multi-argument generators (#12422) - [
pydocstyle
] Handle escaped docstrings within docstring (D301
) (#12192)
Documentation
0.5.5
Preview features
- [
fastapi
] Implementfastapi-redundant-response-model
(FAST001
) andfastapi-non-annotated-dependency
(FAST002
) (#11579) - [
pydoclint
] Implementdocstring-missing-exception
(DOC501
) anddocstring-extraneous-exception
(DOC502
) (#11471)
Rule changes
- [
numpy
] Fix NumPy 2.0 rule fornp.alltrue
andnp.sometrue
(#12473) - [
numpy
] IgnoreNPY201
insideexcept
blocks for compatibility with older numpy versions (#12490) - [
pep8-naming
] Avoid applyingignore-names
toself
andcls
function names (N804
,N805
) (#12497)
Formatter
- Fix incorrect placement of leading function comment with type params (#12447)
Server
- Do not bail code action resolution when a quick fix is requested (#12462)
Bug fixes
- Fix
Ord
implementation ofcmp_fix
(#12471) - Raise syntax error for unparenthesized generator expression in multi-argument call (#12445)
- [
pydoclint
] Fix panic inDOC501
reported in #12428 (#12435) - [
flake8-bugbear
] Allow singleton tuples with starred expressions inB013
(#12484)
Documentation
- Add Eglot setup guide for Emacs editor (#12426)
- Add note about the breaking change in
nvim-lspconfig
(#12507) - Add note to include notebook files for native server (#12449)
- Add setup docs for Zed editor (#12501)
0.5.6
Ruff 0.5.6 automatically enables linting and formatting of notebooks in preview mode.
You can opt-out of this behavior by adding *.ipynb
to the extend-exclude
setting.
[tool.ruff]
extend-exclude = ["*.ipynb"]
Preview features
- Enable notebooks by default in preview mode (#12621)
- [
flake8-builtins
] Implement import, lambda, and module shadowing (#12546) - [
pydoclint
] Adddocstring-missing-returns
(DOC201
) anddocstring-extraneous-returns
(DOC202
) (#12485)
Rule changes
- [
flake8-return
] Exempt cached properties and other property-like decorators from explicit return rule (RET501
) (#12563)
Server
- Make server panic hook more error resilient (#12610)
- Use
$/logTrace
for server trace logs in Zed and VS Code (#12564) - Keep track of deleted cells for reorder change request (#12575)
Configuration
- [
flake8-implicit-str-concat
] Always allow explicit multi-line concatenations when implicit concatenations are banned (#12532)
Bug fixes
- [
flake8-async
] Avoid flaggingasyncio.timeout
s as unused when the context manager includesasyncio.TaskGroup
(#12605) - [
flake8-slots
] Avoid recommending__slots__
for classes that inherit from more thannamedtuple
(#12531) - [
isort
] Avoid marking required imports as unused (#12537) - [
isort
] Preserve trailing inline comments on import-from statements (#12498) - [
pycodestyle
] Add newlines before comments (E305
) (#12606) - [
pycodestyle
] Don't attach comments with mismatched indents (#12604) - [
pyflakes
] Fix preview-mode bugs inF401
when attempting to autofix unused first-party submodule imports in an__init__.py
file (#12569) - [
pylint
] Respect start index inunnecessary-list-index-lookup
(#12603) - [
pyupgrade
] Avoid recommending no-argument super inslots=True
dataclasses (#12530) - [
pyupgrade
] Use colon rather than dot formatting for integer-only types (#12534) - Fix NFKC normalization bug when removing unused imports (#12571)
Other changes
- Consider more stdlib decorators to be property-like (#12583)
- Improve handling of metaclasses in various linter rules (#12579)
- Improve consistency between linter rules in determining whether a function is property (#12581)
0.5.7
Preview features
- [
flake8-comprehensions
] Account for list and set comprehensions inunnecessary-literal-within-tuple-call
(C409
) (#12657) - [
flake8-pyi
] Add autofix forfuture-annotations-in-stub
(PYI044
) (#12676) - [
flake8-return
] Avoid syntax error when auto-fixingRET505
with mixed indentation (space and tabs) (#12740) - [
pydoclint
] Adddocstring-missing-yields
(DOC402
) anddocstring-extraneous-yields
(DOC403
) (#12538) - [
pydoclint
] AvoidDOC201
if docstring begins with "Return", "Returns", "Yield", or "Yields" (#12675) - [
pydoclint
] Deduplicate collected exceptions after traversing function bodies (DOC501
) (#12642) - [
pydoclint
] IgnoreDOC
errors for stub functions (#12651) - [
pydoclint
] Teach rules to understand reraised exceptions as being explicitly raised (DOC501
,DOC502
) (#12639) - [
ruff
] Implementincorrectly-parenthesized-tuple-in-subscript
(RUF031
) (#12480) - [
ruff
] MarkRUF023
fix as unsafe if__slots__
is not a set and the binding is used elsewhere (#12692)
Rule changes
- [
refurb
] Add autofix forimplicit-cwd
(FURB177
) (#12708) - [
ruff
] Add autofix forzip-instead-of-pairwise
(RUF007
) (#12663) - [
tryceratops
] AddBaseException
toraise-vanilla-class
rule (TRY002
) (#12620)
Server
- Ignore non-file workspace URL; Ruff will display a warning notification in this case (#12725)
CLI
- Fix cache invalidation for nested
pyproject.toml
files (#12727)
Bug fixes
- [
flake8-async
] Fix false positives with multipleasync with
items (ASYNC100
) (#12643) - [
flake8-bandit
] Avoid false-positives for list concatenations in SQL construction (S608
) (#12720) - [
flake8-bugbear
] Treatreturn
as equivalent tobreak
(B909
) (#12646) - [
flake8-comprehensions
] Set comprehensions not a violation forsum
inunnecessary-comprehension-in-call
(C419
) (#12691) - [
flake8-simplify
] Parenthesize conditions based on precedence when merging if arms (SIM114
) (#12737) - [
pydoclint
] Try both 'Raises' section styles when convention is unspecified (DOC501
) (#12649)