22.1.0
At long last, Black is no longer a beta product! This is the first non-beta release and the first release covered by our new stability policy.
Highlights
Style
- Deprecate
--experimental-string-processing
and move the functionality under--preview
(#2789) - For stubs, one blank line between class attributes and methods is now kept if there's at least one pre-existing blank line (#2736)
- Black now normalizes string prefix order (#2297)
- Remove spaces around power operators if both operands are simple (#2726)
- Work around bug that causes unstable formatting in some cases in the presence of the magic trailing comma (#2807)
- Use parentheses for attribute access on decimal float and int literals (#2799)
- Don't add whitespace for attribute access on hexadecimal, binary, octal, and complex literals (#2799)
- Treat blank lines in stubs the same inside top-level if statements (#2820)
- Fix unstable formatting with semicolons and arithmetic expressions (#2817)
- Fix unstable formatting around magic trailing comma (#2572)
Parser
- Fix mapping cases that contain as-expressions, like
case {"key": 1 | 2 as password}
(#2686) - Fix cases that contain multiple top-level as-expressions, like
case 1 as a, 2 as b
(#2716) - Fix call patterns that contain as-expressions with keyword arguments, like
case Foo(bar=baz as quux)
(#2749) - Tuple unpacking on
return
andyield
constructs now implies 3.8+ (#2700) - Unparenthesized tuples on annotated assignments (e.g
values: Tuple[int, ...] = 1, 2, 3
) now implies 3.8+ (#2708) - Fix handling of standalone
match()
orcase()
when there is a trailing newline or a comment inside of the parentheses. (#2760) from __future__ import annotations
statement now implies Python 3.7+ (#2690)
Performance
- Speed-up the new backtracking parser about 4X in general (enabled when
--target-version
is set to 3.10 and higher). (#2728) - Black is now compiled with mypyc for an overall 2x speed-up. 64-bit Windows, MacOS, and Linux (not including musl) are supported. (#1009, #2431)
Configuration
- Do not accept bare carriage return line endings in pyproject.toml (#2408)
- Add configuration option (
python-cell-magics
) to format cells with custom magics in Jupyter Notebooks (#2744) - Allow setting custom cache directory on all platforms with environment variable
BLACK_CACHE_DIR
(#2739). - Enable Python 3.10+ by default, without any extra need to specify -
-target-version=py310
. (#2758) - Make passing
SRC
or--code
mandatory and mutually exclusive (#2804)
Output
- Improve error message for invalid regular expression (#2678)
- Improve error message when parsing fails during AST safety check by embedding the underlying SyntaxError (#2693)
- No longer color diff headers white as it's unreadable in light themed terminals (#2691)
- Text coloring added in the final statistics (#2712)
- Verbose mode also now describes how a project root was discovered and which paths will be formatted. (#2526)
Packaging
- All upper version bounds on dependencies have been removed (#2718)
typing-extensions
is no longer a required dependency in Python 3.10+ (#2772)- Set
click
lower bound to8.0.0
as Black crashes on7.1.2
(#2791)
Integrations
- Update GitHub action to support containerized runs (#2748)
Documentation
- Change protocol in pip installation instructions to
https://
(#2761) - Change HTML theme to Furo primarily for its responsive design and mobile support (#2793)
- Deprecate the
black-primer
tool (#2809) - Document Python support policy (#2819)
Full Changelog: 21.12b0...22.1.0
Thank you!
- @isidentical for their continued work on making our Python 3.10 support better than ever (we made them a co-maintainer 🎉)
- @hauntsaninja for their help improving our stub style
- @nipunn1313 making Black more stable (which has been a long running battle)
- .. and all of my fellow co-maintainers who have made working on this project a wonderful ride @JelleZijlstra @cooperlees @felix-hilden @ambv @zsol
And also congrats to first contributors!
- @mwtoews made their first contribution in #2701
- @gunungpw made their first contribution in #2733
- @joshowen made their first contribution in #2748
- @Shivansh-007 made their first contribution in #2526
- @cbows made their first contribution in #2761
- @jlazar17 made their first contribution in #2765
- @VanSHOE made their first contribution in #2712
- @emfdavid made their first contribution in #2786
- @mgmarino made their first contribution in #2744
- @RHammond2 made their first contribution in #2792
- @percurnicus made their first contribution in #2739
- @sobolevn made their first contribution in #2802