Skip to content

fix: make sorted __all__ and literals black-compatible (#2280) - #2576

Merged
DanielNoord merged 6 commits into
PyCQA:mainfrom
lord-haffi:issue/2280
Jul 12, 2026
Merged

fix: make sorted __all__ and literals black-compatible (#2280)#2576
DanielNoord merged 6 commits into
PyCQA:mainfrom
lord-haffi:issue/2280

Conversation

@lord-haffi

@lord-haffi lord-haffi commented Jul 6, 2026

Copy link
Copy Markdown
Contributor

Resolves: #2280, #1815

Problem

--sort-reexports (and the # isort: list/dict/tuple/… comments) format the sorted result with stdlib pprint. Under --profile=black the result is single-quoted, packed in pprint's wrap style and lacks a trailing comma — output black immediately reformats, so isort + black never reach a fixpoint.

Fix

Format the sorted literal to be black-compatible: double quotes, a single line when it fits line_length, otherwise one item per line (vertical-hanging-indent) with a trailing comma when include_trailing_comma is set, keeping the literal's own bracket type. It's a fixed black/PEP 8 layout — it deliberately does not reproduce every multi_line_output mode for literals (VHI is what black uses).

isort's output for a long __all__ under --profile=black, before → after this fix:

-__all__ = ['Address', 'AliasAddress', 'BankAccountConnection', 'Certificate',
- 'ConcessionFee']
+__all__ = [
+    "Address",
+    "AliasAddress",
+    "BankAccountConnection",
+    "Certificate",
+    "ConcessionFee",
+]

Why drop pprint

pprint exposes only width; quote style, wrap mode and trailing comma are hardcoded to non-black output, so it could never satisfy --profile=black. It was the sole cause of the bug, so it's removed entirely — dict sorting now uses the same formatter and gets the same fix.

Also fixes a --check crash on multi-line __all__

Emitting multi-line __all__ exposed a latent bug in the --sort-reexports rollback: it wrote the __all__ opening line then did output_stream.seek(output_stream.tell() - reexport_rollback) to overwrite it with the sorted literal. In check mode the output is a no-op stream whose tell() is always 0, so the seek went to a negative position and raised ValueError: Negative seek position. The seek target is now clamped to 0; real seekable output is unaffected.

Note: sorted string literals are now double-quoted by default (isort has no quote setting); existing literal-sort test expectations are updated to match.

isort sorted __all__ (--sort-reexports) and inline literals (# isort: list,
# isort: dict, # isort: tuple, ...) through stdlib pprint, which reads only
line_length and ignores quote style, wrapping mode and trailing commas. Under
--profile=black this produced single-quoted, pprint-wrapped, comma-less output
that black immediately reformatted, so isort + black never reached a fixpoint.

Replace the pprint path with a small black-compatible formatter in isort.literal:

- black-style quoting: prefer double quotes, fall back to single only to avoid
  escaping, and defer to repr() for backslash/control chars and non-strings;
- a single line when it fits line_length, otherwise vertical-hanging-indent
  with a trailing comma controlled by include_trailing_comma;
- the literal's own bracket type is preserved, keeping the mandatory trailing
  comma that a one-element tuple needs.

pprint and ISortPrettyPrinter are removed entirely; dict sorting is formatted
the same way, fixing the identical black incompatibility for # isort: dict.

Closes PyCQA#2280
# Conflicts:
#	tests/unit/test_literal.py
#	tests/unit/test_regressions.py
…tive (PyCQA#2280)

The reexport handler wrote the `__all__` opening line to the output and then did
`output_stream.seek(output_stream.tell() - reexport_rollback)` to overwrite it with
the sorted literal. In check mode the output is a no-op stream (`_EmptyIO`) whose
`tell()` is always 0, so a multi-line `__all__` made the seek target negative and
raised `ValueError: Negative seek position`. Because the black-compatible formatter
now emits multi-line `__all__`, `isort --check` crashed on isort's own output.

Clamp the seek target to 0. Real seekable output is unaffected: there `tell()` is
always >= the rollback length, so the clamp is a no-op.
@lord-haffi

Copy link
Copy Markdown
Contributor Author

@Helveg Please take a look. For me it would work. I deliberately did not try to merge it with the formatting logic for the imports. In my head it made sense to keep that seperated from this logic here even though it is very similar at some parts. What are your thoughts on this?

@lord-haffi

Copy link
Copy Markdown
Contributor Author

I just realized, it probably addresses the same problem as #2573.

@lord-haffi

Copy link
Copy Markdown
Contributor Author

Claude says:

Overlap with #2573

Heads-up that #2573 (thanks @HarperZ9) targets the same area and also closes #1815, so these two should be reconciled. This PR also resolves #1815 and is a superset of #2573 — I ran #2573 locally against the relevant cases to compare fairly:

Case #2573 this PR (#2576)
# isort: tuple under --profile=black (#1815) wraps to VHI but keeps single quotes (via pprint.pformat), so black --check still reformats it double-quoted, black --check clean
Long __all__ under --profile=black single-quoted VHI → not black-stable black-stable (verified on a real 196-entry __all__)
isort --check on a multi-line __all__ preceded by imports still raises ValueError: Negative seek position fixed
# isort: dict unchanged (still pprint) same config-aware formatting

Root differences:

  • Wrap sorted literals with black profile settings #2573 adds VHI wrapping only for the over-length + use_parentheses + VERTICAL_HANGING_INDENT path and otherwise keeps pprint, which emits single quotes — so the output isn't black-stable (black renormalizes the quotes).
  • This PR removes pprint from literal sorting entirely and applies black's quote rule + single-line-or-VHI to every literal type, and additionally clamps the sort_reexports rollback seek in core.py (isort --check on a multi-line __all__ currently crashes — see the check-mode note above).

@codecov

codecov Bot commented Jul 6, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 99.39%. Comparing base (fd8bd07) to head (339aaba).

Additional details and impacted files
@@            Coverage Diff             @@
##             main    #2576      +/-   ##
==========================================
+ Coverage   99.32%   99.39%   +0.06%     
==========================================
  Files          41       41              
  Lines        3111     3137      +26     
  Branches      674      680       +6     
==========================================
+ Hits         3090     3118      +28     
  Misses         11       11              
+ Partials       10        8       -2     
🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

@Helveg

Helveg commented Jul 7, 2026

Copy link
Copy Markdown
Contributor

Hi, I'm not a maintainer of this repo so I can't merge it, but FWIW I approve these changes :D

@DanielNoord DanielNoord left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks

@DanielNoord
DanielNoord added this pull request to the merge queue Jul 12, 2026
Merged via the queue into PyCQA:main with commit 7f321d3 Jul 12, 2026
26 checks passed
@lord-haffi
lord-haffi deleted the issue/2280 branch July 12, 2026 22:44
This was referenced Jul 23, 2026
mergify Bot added a commit to ArcadeData/arcadedb that referenced this pull request Aug 30, 2026
…[skip ci]

Bumps [https://github.com/pycqa/isort](https://github.com/pycqa/isort) from 8.0.1 to 9.0.0.
Release notes

*Sourced from [https://github.com/pycqa/isort's releases](https://github.com/pycqa/isort/releases).*

> 9.0.0
> -----
>
> `isort` `9.0.0` is the result of several alpha and beta releases, as well as a small number of fixes added after the last beta. For release notes for the individual alphas and betas we would like to refer to:
>
> * [9.0.0a2](https://github.com/PyCQA/isort/releases/tag/9.0.0a2)
> * [9.0.0a3](https://github.com/PyCQA/isort/releases/tag/9.0.0a3)
> * [9.0.0b1](https://github.com/PyCQA/isort/releases/tag/9.0.0b1)
> * [9.0.0b2](https://github.com/PyCQA/isort/releases/tag/9.0.0b2)
> * [9.0.0b5](https://github.com/PyCQA/isort/releases/tag/9.0.0b5)
>
> *Skipped version numbers are the result of changes to our release infrastructure that broke while creating the actual releases.*
>
> Please find below the full release notes for version `9.0.0`, the newest release of `isort` after version `8.0.1`.
>
> ---
>
> `isort` `9.0.0` contains some significant changes and improvements. Most notably there is now support for Python 3.15 and its `lazy` imports and we have included several performance improvements as well as providing `mypyc` compiled wheels for all major platforms and supported versions of Python. In our own tests we saw speeds ups of more than 2x and 3x times, but this is highly dependent on the codebase `isort` needs to inspect.
>
> The full list of changes is as follows:
>
> 💥 Breaking Changes
> -----------------------
>
> * Remove logic for deprecated options ([#2498](https://redirect.github.com/pycqa/isort/issues/2498)) [`@​DanielNoord`](https://github.com/DanielNoord)
>
> 🚀 Features
> -----------------
>
> * Sort lazy import statements ([#2503](https://redirect.github.com/pycqa/isort/issues/2503)) [`@​DanielNoord`](https://github.com/DanielNoord)
> * Add initial support for Python 3.15 ([#2466](https://redirect.github.com/pycqa/isort/issues/2466)) [`@​DanielNoord`](https://github.com/DanielNoord)
> * Compile with `mypyc` by [`@​DanielNoord`](https://github.com/DanielNoord) in [PyCQA/isort#2586](https://redirect.github.com/PyCQA/isort/pull/2586)
> * Cache calls to `posixpath.abspath` by [`@​DanielNoord`](https://github.com/DanielNoord) in [PyCQA/isort#2606](https://redirect.github.com/PyCQA/isort/pull/2606)
> * Consider private `stdlib` modules to be `stdlib` ([#2295](https://redirect.github.com/pycqa/isort/issues/2295)) [`@​devdanzin`](https://github.com/devdanzin)
> * Add CLI Flag for --forced-separate ([PyCQA/isort#2367](https://redirect.github.com/PyCQA/isort/pull/2367)) [`@​hirak99`](https://github.com/hirak99)
> * Add separate\_packages option ([#2313](https://redirect.github.com/pycqa/isort/issues/2313)) [`@​alex-liang3`](https://github.com/alex-liang3)
>
> 🪲 Fixes
> --------------
>
> * Fix inline comment duplication across merged `from X import` lines ([#2499](https://redirect.github.com/pycqa/isort/issues/2499)) [`@​copilot-swe-agent`](https://github.com/copilot-swe-agent)
> * Fix src glob patterns passed via CLI ([#2497](https://redirect.github.com/pycqa/isort/issues/2497)) [`@​ReinerBRO`](https://github.com/ReinerBRO)
> * Fix opening-line comment moving to alias attribute line on wrapped imports ([#2491](https://redirect.github.com/pycqa/isort/issues/2491)) [`@​copilot-swe-agent`](https://github.com/copilot-swe-agent)
> * Fix multi\_line\_output=3/5 ignored when wrapping single imports with inline comments ([#2474](https://redirect.github.com/pycqa/isort/issues/2474)) [`@​copilot-swe-agent`](https://github.com/copilot-swe-agent)
> * Fix false positive in `check_code` when using `float_to_top` + `add_imports` ([#2492](https://redirect.github.com/pycqa/isort/issues/2492)) [`@​copilot-swe-agent`](https://github.com/copilot-swe-agent)
> * Fix: preserve bare `#` inline comments on imports ([#2488](https://redirect.github.com/pycqa/isort/issues/2488)) [`@​copilot-swe-agent`](https://github.com/copilot-swe-agent)
> * Fix grouping of non-aliased imports when mixed with aliased imports from the same module ([#2470](https://redirect.github.com/pycqa/isort/issues/2470)) [`@​copilot-swe-agent`](https://github.com/copilot-swe-agent)
> * Fix [PyCQA/isort#2500](https://redirect.github.com/PyCQA/isort/issues/2500): trusted publishing by [`@​staticdev`](https://github.com/staticdev) in [PyCQA/isort#2521](https://redirect.github.com/PyCQA/isort/pull/2521)
> * Fix git\_hook lazy=True option by [`@​sparrowt`](https://github.com/sparrowt) in [PyCQA/isort#2542](https://redirect.github.com/PyCQA/isort/pull/2542)
> * Honor `# isort: off/on/split` during `float_to_top` preprocessing with CRLF input by [`@​DanielNoord`](https://github.com/DanielNoord) with [`@​Copilot`](https://github.com/Copilot) in [PyCQA/isort#2553](https://redirect.github.com/PyCQA/isort/pull/2553)
> * Fix --sort-reexports crash with non-seekable streams (e.g. stdin) by [`@​Abdu-Ahmed`](https://github.com/Abdu-Ahmed) in [PyCQA/isort#2547](https://redirect.github.com/PyCQA/isort/pull/2547)
> * Fix non-idempotent output with split\_on\_trailing\_comma and a non-default wrap mode by [`@​sarathfrancis90`](https://github.com/sarathfrancis90) in [PyCQA/isort#2554](https://redirect.github.com/PyCQA/isort/pull/2554)
> * Fix non-idempotent NOQA wrap mode with imports that carry their own comment by [`@​sarathfrancis90`](https://github.com/sarathfrancis90) in [PyCQA/isort#2556](https://redirect.github.com/PyCQA/isort/pull/2556)
> * Fix NOQA wrap mode accumulating spaces before the comment on each run by [`@​sarathfrancis90`](https://github.com/sarathfrancis90) in [PyCQA/isort#2558](https://redirect.github.com/PyCQA/isort/pull/2558)
> * Fix NOQA not added to long imports in several output paths by [`@​urayoru113`](https://github.com/urayoru113) in [PyCQA/isort#2568](https://redirect.github.com/PyCQA/isort/pull/2568)
> * Honor `# isort: skip` when a `__future__` import is present ([#2092](https://redirect.github.com/pycqa/isort/issues/2092)) by [`@​apoorvdarshan`](https://github.com/apoorvdarshan) in [PyCQA/isort#2574](https://redirect.github.com/PyCQA/isort/pull/2574)

... (truncated)


Changelog

*Sourced from [https://github.com/pycqa/isort's changelog](https://github.com/PyCQA/isort/blob/main/CHANGELOG.md).*

> ### 9.0.0 August 26 2026
>
> * Remove logic for deprecated options ([#2498](https://redirect.github.com/pycqa/isort/issues/2498)) [`@​DanielNoord`](https://github.com/DanielNoord)
> * Sort lazy import statements ([#2503](https://redirect.github.com/pycqa/isort/issues/2503)) [`@​DanielNoord`](https://github.com/DanielNoord)
> * Add initial support for Python 3.15 ([#2466](https://redirect.github.com/pycqa/isort/issues/2466)) [`@​DanielNoord`](https://github.com/DanielNoord)
> * Compile with `mypyc` by [`@​DanielNoord`](https://github.com/DanielNoord) in [PyCQA/isort#2586](https://redirect.github.com/PyCQA/isort/pull/2586)
> * Cache calls to `posixpath.abspath` by [`@​DanielNoord`](https://github.com/DanielNoord) in [PyCQA/isort#2606](https://redirect.github.com/PyCQA/isort/pull/2606)
> * Consider private `stdlib` modules to be `stdlib` ([#2295](https://redirect.github.com/pycqa/isort/issues/2295)) [`@​devdanzin`](https://github.com/devdanzin)
> * Add CLI Flag for --forced-separate ([PyCQA/isort#2367](https://redirect.github.com/PyCQA/isort/pull/2367)) [`@​hirak99`](https://github.com/hirak99)
> * Add separate\_packages option ([#2313](https://redirect.github.com/pycqa/isort/issues/2313)) [`@​alex-liang3`](https://github.com/alex-liang3)
> * Fix inline comment duplication across merged `from X import` lines ([#2499](https://redirect.github.com/pycqa/isort/issues/2499)) [`@​copilot-swe-agent`](https://github.com/copilot-swe-agent)
> * Fix src glob patterns passed via CLI ([#2497](https://redirect.github.com/pycqa/isort/issues/2497)) [`@​ReinerBRO`](https://github.com/ReinerBRO)
> * Fix opening-line comment moving to alias attribute line on wrapped imports ([#2491](https://redirect.github.com/pycqa/isort/issues/2491)) [`@​copilot-swe-agent`](https://github.com/copilot-swe-agent)
> * Fix multi\_line\_output=3/5 ignored when wrapping single imports with inline comments ([#2474](https://redirect.github.com/pycqa/isort/issues/2474)) [`@​copilot-swe-agent`](https://github.com/copilot-swe-agent)
> * Fix false positive in `check_code` when using `float_to_top` + `add_imports` ([#2492](https://redirect.github.com/pycqa/isort/issues/2492)) [`@​copilot-swe-agent`](https://github.com/copilot-swe-agent)
> * Fix: preserve bare `#` inline comments on imports ([#2488](https://redirect.github.com/pycqa/isort/issues/2488)) [`@​copilot-swe-agent`](https://github.com/copilot-swe-agent)
> * Fix grouping of non-aliased imports when mixed with aliased imports from the same module ([#2470](https://redirect.github.com/pycqa/isort/issues/2470)) [`@​copilot-swe-agent`](https://github.com/copilot-swe-agent)
> * Fix [PyCQA/isort#2500](https://redirect.github.com/PyCQA/isort/issues/2500): trusted publishing by [`@​staticdev`](https://github.com/staticdev) in [PyCQA/isort#2521](https://redirect.github.com/PyCQA/isort/pull/2521)
> * Fix git\_hook lazy=True option by [`@​sparrowt`](https://github.com/sparrowt) in [PyCQA/isort#2542](https://redirect.github.com/PyCQA/isort/pull/2542)
> * Honor `# isort: off/on/split` during `float_to_top` preprocessing with CRLF input by [`@​DanielNoord`](https://github.com/DanielNoord) with [`@​Copilot`](https://github.com/Copilot) in [PyCQA/isort#2553](https://redirect.github.com/PyCQA/isort/pull/2553)
> * Fix --sort-reexports crash with non-seekable streams (e.g. stdin) by [`@​Abdu-Ahmed`](https://github.com/Abdu-Ahmed) in [PyCQA/isort#2547](https://redirect.github.com/PyCQA/isort/pull/2547)
> * Fix non-idempotent output with split\_on\_trailing\_comma and a non-default wrap mode by [`@​sarathfrancis90`](https://github.com/sarathfrancis90) in [PyCQA/isort#2554](https://redirect.github.com/PyCQA/isort/pull/2554)
> * Fix non-idempotent NOQA wrap mode with imports that carry their own comment by [`@​sarathfrancis90`](https://github.com/sarathfrancis90) in [PyCQA/isort#2556](https://redirect.github.com/PyCQA/isort/pull/2556)
> * Fix NOQA wrap mode accumulating spaces before the comment on each run by [`@​sarathfrancis90`](https://github.com/sarathfrancis90) in [PyCQA/isort#2558](https://redirect.github.com/PyCQA/isort/pull/2558)
> * Fix NOQA not added to long imports in several output paths by [`@​urayoru113`](https://github.com/urayoru113) in [PyCQA/isort#2568](https://redirect.github.com/PyCQA/isort/pull/2568)
> * Honor `# isort: skip` when a `__future__` import is present ([#2092](https://redirect.github.com/pycqa/isort/issues/2092)) by [`@​apoorvdarshan`](https://github.com/apoorvdarshan) in [PyCQA/isort#2574](https://redirect.github.com/PyCQA/isort/pull/2574)
> * fix: make sorted `__all__` and literals black-compatible ([#2280](https://redirect.github.com/pycqa/isort/issues/2280)) by [`@​lord-haffi`](https://github.com/lord-haffi) in [PyCQA/isort#2576](https://redirect.github.com/PyCQA/isort/pull/2576)
> * Honor skip comments when sorting reexports by [`@​sakshichitnis27`](https://github.com/sakshichitnis27) in [PyCQA/isort#2581](https://redirect.github.com/PyCQA/isort/pull/2581)
> * Keep aliased import when the plain name carries a comment by [`@​sarathfrancis90`](https://github.com/sarathfrancis90) in [PyCQA/isort#2567](https://redirect.github.com/PyCQA/isort/pull/2567)
> * fix: don't crash on --config-root without --resolve-all-configs by [`@​Gooh456`](https://github.com/Gooh456) in [PyCQA/isort#2597](https://redirect.github.com/PyCQA/isort/pull/2597)
> * fix: check\_code misses lines\_before\_imports-only changes ([#2242](https://redirect.github.com/pycqa/isort/issues/2242)) by [`@​gaoflow`](https://github.com/gaoflow) in [PyCQA/isort#2563](https://redirect.github.com/PyCQA/isort/pull/2563)
> * Fix preservation of form-feed blank lines by [`@​utkarshalpha`](https://github.com/utkarshalpha) in [PyCQA/isort#2599](https://redirect.github.com/PyCQA/isort/pull/2599)
> * Small clean up and fix inconsistency in handling of `*` imports by [`@​DanielNoord`](https://github.com/DanielNoord) in [PyCQA/isort#2619](https://redirect.github.com/PyCQA/isort/pull/2619)
> * Fix word-wrapping of 'from ... import \*' into invalid Python ([#2267](https://redirect.github.com/pycqa/isort/issues/2267)) by [`@​sudorm-rf0`](https://github.com/sudorm-rf0) in [PyCQA/isort#2624](https://redirect.github.com/PyCQA/isort/pull/2624)
> * Fix pylint disable-next comments at the start of imports by [`@​Neallin-917`](https://github.com/Neallin-917) in [PyCQA/isort#2628](https://redirect.github.com/PyCQA/isort/pull/2628)
> * Keep add\_imports below a prefixed module docstring by [`@​Eljees`](https://github.com/Eljees) in [PyCQA/isort#2626](https://redirect.github.com/PyCQA/isort/pull/2626)
> * Add read the docs configuration ([#2504](https://redirect.github.com/pycqa/isort/issues/2504)) [`@​DanielNoord`](https://github.com/DanielNoord)
> * Remove unused and broken dependencies ([#2517](https://redirect.github.com/pycqa/isort/issues/2517)) [`@​DanielNoord`](https://github.com/DanielNoord)
> * Remove `Any` from `parse.py` ([#2516](https://redirect.github.com/pycqa/isort/issues/2516)) [`@​DanielNoord`](https://github.com/DanielNoord)
> * Bring documentation in line with old documentation ([#2507](https://redirect.github.com/pycqa/isort/issues/2507)) [`@​DanielNoord`](https://github.com/DanielNoord)
> * Sync profile docs with implementation ([#2495](https://redirect.github.com/pycqa/isort/issues/2495)) [`@​copilot-swe-agent`](https://github.com/copilot-swe-agent)
> * Fix the playground ([#2494](https://redirect.github.com/pycqa/isort/issues/2494)) [`@​DanielNoord7`](https://github.com/DanielNoord7)) [`@​hirak99`](https://github.com/hirak99)
> * Remove unused \_ENCODING\_PATTERN regex and re import by [`@​duriantaco`](https://github.com/duriantaco) in [PyCQA/isort#2525](https://redirect.github.com/PyCQA/isort/pull/2525)
> * Remove references to defunct `git_ignore` config by [`@​sparrowt`](https://github.com/sparrowt) in [PyCQA/isort#2531](https://redirect.github.com/PyCQA/isort/pull/2531)
> * Fix broken relative links in README and CHANGELOG for both GitHub and Sphinx by [`@​rohitshinde08`](https://github.com/rohitshinde08) in [PyCQA/isort#2530](https://redirect.github.com/PyCQA/isort/pull/2530)
> * Bump vendored `tomli` by [`@​DanielNoord`](https://github.com/DanielNoord) in [PyCQA/isort#2579](https://redirect.github.com/PyCQA/isort/pull/2579)
> * Document temporary .isorted files by [`@​sapunyangkut`](https://github.com/sapunyangkut) in [PyCQA/isort#2580](https://redirect.github.com/PyCQA/isort/pull/2580)
> * Remove `cruft` by [`@​DanielNoord`](https://github.com/DanielNoord) in [PyCQA/isort#2610](https://redirect.github.com/PyCQA/isort/pull/2610)
> * Small fixes in preparation for `mypyc` compiled wheels by [`@​DanielNoord`](https://github.com/DanielNoord) in [PyCQA/isort#2623](https://redirect.github.com/PyCQA/isort/pull/2623)
> * Small fixes in preparation for compiling with `mypyc` by [`@​DanielNoord`](https://github.com/DanielNoord) in [PyCQA/isort#2625](https://redirect.github.com/PyCQA/isort/pull/2625)

... (truncated)


Commits

* [`727d119`](PyCQA/isort@727d119) Name the predicate and drive the prefix test off STRING\_PREFIXES
* [`dec76bc`](PyCQA/isort@dec76bc) Fix multiline docstring style
* [`cb179db`](PyCQA/isort@cb179db) Keep add\_imports below a prefixed module docstring
* [`7542f76`](PyCQA/isort@7542f76) test: distinguish pylint disable-next comments
* [`9f56767`](PyCQA/isort@9f56767) Fix pylint disable-next comments at top of imports
* [`0cba6f6`](PyCQA/isort@0cba6f6) Delete .cruft.json
* [`dcdda58`](PyCQA/isort@dcdda58) Remove `if` completely
* [`03d3878`](PyCQA/isort@03d3878) Fix check in CI
* [`926a147`](PyCQA/isort@926a147) Run less Builds
* [`c4ab2e9`](PyCQA/isort@c4ab2e9) Fix `test_importable` for local dev
* Additional commits viewable in [compare view](PyCQA/isort@8.0.1...9.0.0)
  
[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility\_score?dependency-name=https://github.com/pycqa/isort&package-manager=pre\_commit&previous-version=8.0.1&new-version=9.0.0)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)
Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`.
[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)
---
Dependabot commands and options
  
You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it
- `@dependabot show  ignore conditions` will show all of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
netbsd-srcmastr pushed a commit to NetBSD/pkgsrc that referenced this pull request Aug 30, 2026
### 9.0.0 August 26 2026

   - Remove logic for deprecated options (#2498) @DanielNoord
   - Sort lazy import statements (#2503) @DanielNoord
   - Add initial support for Python 3.15 (#2466) @DanielNoord
   - Compile with `mypyc` by @DanielNoord in PyCQA/isort#2586
   - Cache calls to `posixpath.abspath` by @DanielNoord in PyCQA/isort#2606
   - Consider private `stdlib` modules to be `stdlib` (#2295) @devdanzin
   - Add CLI Flag for --forced-separate (PyCQA/isort#2367) @hirak99
   - Add separate_packages option (#2313) @alex-liang3
   - Fix inline comment duplication across merged `from X import` lines (#2499) @copilot-swe-agent
   - Fix src glob patterns passed via CLI (#2497) @ReinerBRO
   - Fix opening-line comment moving to alias attribute line on wrapped imports (#2491) @copilot-swe-agent
   - Fix multi_line_output=3/5 ignored when wrapping single imports with inline comments (#2474) @copilot-swe-agent
   - Fix false positive in `check_code` when using `float_to_top` + `add_imports` (#2492) @copilot-swe-agent
   - Fix: preserve bare `#` inline comments on imports (#2488) @copilot-swe-agent
   - Fix grouping of non-aliased imports when mixed with aliased imports from the same module (#2470) @copilot-swe-agent
   - Fix PyCQA/isort#2500: trusted publishing by @staticdev in PyCQA/isort#2521
   - Fix git_hook lazy=True option by @sparrowt in PyCQA/isort#2542
   - Honor `# isort: off/on/split` during `float_to_top` preprocessing with CRLF input by @DanielNoord with @Copilot in PyCQA/isort#2553
   - Fix --sort-reexports crash with non-seekable streams (e.g. stdin) by @Abdu-Ahmed in PyCQA/isort#2547
   - Fix non-idempotent output with split_on_trailing_comma and a non-default wrap mode by @sarathfrancis90 in PyCQA/isort#2554
   - Fix non-idempotent NOQA wrap mode with imports that carry their own comment by @sarathfrancis90 in PyCQA/isort#2556
   - Fix NOQA wrap mode accumulating spaces before the comment on each run by @sarathfrancis90 in PyCQA/isort#2558
   - Fix NOQA not added to long imports in several output paths by @urayoru113 in PyCQA/isort#2568
   - Honor `# isort: skip` when a `__future__` import is present (#2092) by @apoorvdarshan in PyCQA/isort#2574
   - fix: make sorted `__all__` and literals black-compatible (#2280) by @lord-haffi in PyCQA/isort#2576
   - Honor skip comments when sorting reexports by @sakshichitnis27 in PyCQA/isort#2581
   - Keep aliased import when the plain name carries a comment by @sarathfrancis90 in PyCQA/isort#2567
   - fix: don't crash on --config-root without --resolve-all-configs by @Gooh456 in PyCQA/isort#2597
   - fix: check_code misses lines_before_imports-only changes (#2242) by @gaoflow in PyCQA/isort#2563
   - Fix preservation of form-feed blank lines by @utkarshalpha in PyCQA/isort#2599
   - Small clean up and fix inconsistency in handling of `*` imports by @DanielNoord in PyCQA/isort#2619
   - Fix word-wrapping of 'from ... import *' into invalid Python (#2267) by @sudorm-rf0 in PyCQA/isort#2624
   - Fix pylint disable-next comments at the start of imports by @Neallin-917 in PyCQA/isort#2628
   - Keep add_imports below a prefixed module docstring by @Eljees in PyCQA/isort#2626
   - Add read the docs configuration (#2504) @DanielNoord
   - Remove unused and broken dependencies (#2517) @DanielNoord
   - Remove `Any` from `parse.py` (#2516) @DanielNoord
   - Bring documentation in line with old documentation (#2507) @DanielNoord
   - Sync profile docs with implementation (#2495) @copilot-swe-agent
   - Fix the playground (#2494) @DanielNoord7) @hirak99
   - Remove unused _ENCODING_PATTERN regex and re import by @duriantaco in PyCQA/isort#2525
   - Remove references to defunct `git_ignore` config by @sparrowt in PyCQA/isort#2531
   - Fix broken relative links in README and CHANGELOG for both GitHub and Sphinx by @rohitshinde08 in PyCQA/isort#2530
   - Bump vendored `tomli` by @DanielNoord in PyCQA/isort#2579
   - Document temporary .isorted files by @sapunyangkut in PyCQA/isort#2580
   - Remove `cruft` by @DanielNoord in PyCQA/isort#2610
   - Small fixes in preparation for `mypyc` compiled wheels by @DanielNoord in PyCQA/isort#2623
   - Small fixes in preparation for compiling with `mypyc` by @DanielNoord in PyCQA/isort#2625
   - Fix `test_importable` for local dev by @DanielNoord in PyCQA/isort#2635
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

--sort-reexports does not respect --profile=black

3 participants