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
ALLnow excludes deprecated rules - The released archives now include an extra level of nesting, which can be removed with
--strip-components=1when untarring. - The release artifact's file name no longer includes the version tag. This enables users to install via
/latestURLs on GitHub. - The diagnostic ranges for some
flake8-banditrules 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:ASYNC100toASYNC210open-sleep-or-subprocess-in-async-function:ASYNC101split intoASYNC220,ASYNC221,ASYNC230, andASYNC251blocking-os-call-in-async-function:ASYNC102has been merged intoASYNC220andASYNC221trio-timeout-without-await:TRIO100toASYNC100trio-sync-call:TRIO105toASYNC105trio-async-function-with-timeout:TRIO109toASYNC109trio-unneeded-sleep:TRIO110toASYNC110trio-zero-sleep-call:TRIO115toASYNC115repeated-isinstance-calls:PLR1701toSIM101
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 detectsifexpressions with implicitelsebranchesmodule-import-not-at-top-of-file(E402) now allowsos.environmodifications between import statementstype-comparison(E721) now allows idioms such astype(x) is intyoda-condition(SIM300) now flags a wider range of expressions
Removals
The following deprecated settings have been removed:
output-format=text; useoutput-format=conciseoroutput-format=fulltab-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 cleanruff --generate-shell-completion; useruff generate-shell-completion
Preview features
- [
ruff] Addassert-with-print-messagerule (#11981)
CLI
- Use rule name rather than message in
--statistics(#11697) - Use the output format
fullby default (#12010) - Don't log syntax errors to the console (#11902)
Rule changes
- [
ruff] Fix false positives ifgettextis imported using an alias (RUF027) (#12025) - [
numpy] Updatetrapzandin1ddeprecation (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] AvoidE203for 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] ReversePT001andPT0023defaults (#12106)
Rule changes
- Enable token-based rules on source with syntax errors (#11950)
- [
flake8-bandit] DetecthttpxforS113(#12174) - [
numpy] UpdateNPY201to 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-pythoninference robust to==(#12091) - Use char-wise width instead of
str-width (#12135) - [
pycodestyle] AvoidE275if keyword followed by comma (#12136) - [
pycodestyle] AvoidE275if keyword is followed by a semicolon (#12095) - [
pylint] Skip dummy variables forPLR1704(#12190)
Performance
0.5.2
Preview features
- Use
spaceseparator before parenthesized expressions in comprehensions with leading comments (#12282) - [
flake8-async] UpdateASYNC100to includeanyioandasyncio(#12221) - [
flake8-async] UpdateASYNC109to includeanyioandasyncio(#12236) - [
flake8-async] UpdateASYNC110to includeanyioandasyncio(#12261) - [
flake8-async] UpdateASYNC115to includeanyioandasyncio(#12262) - [
flake8-async] UpdateASYNC116to includeanyioandasyncio(#12266)
Rule changes
- [
flake8-return] Exempt properties from explicit return rule (RET501) (#12243) - [
numpy] Addnp.NAN-to-np.nandiagnostic (#12292) - [
refurb] Makelist-reverse-copyan unsafe fix (#12303)
Server
- Consider
includeandextend-includesettings 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
notoperations as boolean tests (#12301) - [
flake8-bandit] AvoidS310violations 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 withouttimeoutargument (#12213) - [
pycodestyle] Remove "non-obvious" allowance for E721 (#12300) - [
pyflakes] Considerwithblocks as single-item branches for redefinition analysis (#12311) - [
refurb] Restrict forwarding fornewlineargument inopen()calls to Python versions >= 3.10 (#12244)
Documentation
- Update help and documentation to reflect
--output-format fulldefault (#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, andpopallowance forloop-iterator-mutation(B909) (#12365) - [
pylint] Allowrepeated-equality-comparisonfor mixed operations (PLR1714) (#12369) - [
pylint] Ignoreselfandclswhen counting arguments (PLR0913) (#12367) - [
pylint] Use UTF-8 as default encoding inunspecified-encodingfix (PLW1514) (#12370)
Server
- Build settings index in parallel for the native server (#12299)
- Use fallback settings when indexing the project (#12362)
- Consider
--previewflag forserversubcommand for the linter and formatter (#12208)
Bug fixes
- [
flake8-comprehensions] Allow additional arguments forsumandmaxcomprehensions (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] RenameRUF007tozip-instead-of-pairwise(#12399)
Bug fixes
- [
flake8-builtins] Avoid shadowing diagnostics for@overridemethods (#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.alltrueandnp.sometrue(#12473) - [
numpy] IgnoreNPY201insideexceptblocks for compatibility with older numpy versions (#12490) - [
pep8-naming] Avoid applyingignore-namestoselfandclsfunction 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
Ordimplementation ofcmp_fix(#12471) - Raise syntax error for unparenthesized generator expression in multi-argument call (#12445)
- [
pydoclint] Fix panic inDOC501reported 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
$/logTracefor 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.timeouts 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 inF401when attempting to autofix unused first-party submodule imports in an__init__.pyfile (#12569) - [
pylint] Respect start index inunnecessary-list-index-lookup(#12603) - [
pyupgrade] Avoid recommending no-argument super inslots=Truedataclasses (#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-fixingRET505with mixed indentation (space and tabs) (#12740) - [
pydoclint] Adddocstring-missing-yields(DOC402) anddocstring-extraneous-yields(DOC403) (#12538) - [
pydoclint] AvoidDOC201if docstring begins with "Return", "Returns", "Yield", or "Yields" (#12675) - [
pydoclint] Deduplicate collected exceptions after traversing function bodies (DOC501) (#12642) - [
pydoclint] IgnoreDOCerrors 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] MarkRUF023fix 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] AddBaseExceptiontoraise-vanilla-classrule (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.tomlfiles (#12727)
Bug fixes
- [
flake8-async] Fix false positives with multipleasync withitems (ASYNC100) (#12643) - [
flake8-bandit] Avoid false-positives for list concatenations in SQL construction (S608) (#12720) - [
flake8-bugbear] Treatreturnas equivalent tobreak(B909) (#12646) - [
flake8-comprehensions] Set comprehensions not a violation forsuminunnecessary-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)