+ Python 3.11 is now supported, except for blackd as aiohttp does not support 3.11 as of publishing (#3234)
+ This is the last release that supports running Black on Python 3.6 (formatting 3.6 code will continue to be supported until further notice)
+ Reword the stability policy to say that we may, in rare cases, make changes that affect code that was not previously formatted by Black (#3155)
* Stable style
+ Fix an infinite loop when using # fmt: on/off in the middle of an expression or code block (#3158)
+ Fix incorrect handling of # fmt: skip on colon (:) lines (#3148)
+ Comments are no longer deleted when a line had spaces removed around power operators (#2874)
* Preview style
+ Single-character closing docstring quotes are no longer moved to their own line as this is invalid. This was a bug introduced in version 22.6.0. (#3166)
+ --skip-string-normalization / -S now prevents docstring prefixes from being normalized as expected (#3168)
+ When using --skip-magic-trailing-comma or -C, trailing commas are stripped from subscript expressions with more than 1 element (#3209)
+ Implicitly concatenated strings inside a list, set, or tuple are now wrapped inside parentheses (#3162)
+ Fix a string merging/split issue when a comment is present in the middle of implicitly concatenated strings on its own line (#3227)
* Blackd
+ blackd now supports enabling the preview style via the X-Preview header (#3217)
* Configuration
+ Black now uses the presence of debug f-strings to detect target version (#3215)
+ Fix misdetection of project root and verbose logging of sources in cases involving --stdin-filename (#3216)
* Fix determination of f-string expression spans (#2654)
* Fix bad formatting of error messages about EOF in multi-line statements (#2343)
* Functions and classes in blocks now have more consistent surrounding spacing (#2472)
* from __future__ import annotations statement now implies Python 3.7+ (#2690)
* Fix assignment to environment variables in Jupyter Notebooks (#2642)
* Point users to using --target-version py310 if we detect 3.10-only syntax (#2668)
* Fix match statements with open sequence subjects, like match a, b: or match a, *b: (#2639) (#2659)
* Fix match/case statements that contain match/case soft keywords multiple times, like match re.match() (#2661)
* Fix case statements with an inline body (#2665)
* Fix styling of starred expressions inside match subject (#2667)
* Fix parser error location on invalid syntax in a match statement (#2649)
* Fix Python 3.10 support on platforms without ProcessPoolExecutor (#2631)
* Improve parsing performance on code that uses match under --target-version py310 up to ~50% (#2670)
* Remove dependency on regex (#2644) (#2663)
* Warn about Python 2 deprecation in more cases by improving Python 2 only syntax detection (#2592)
* Add experimental PyPy support (#2559)
* Add partial support for the match statement. As it's experimental, it's only enabled when --target-version py310 is explicitly specified (#2586)
* Add support for parenthesized with (#2586)
* Declare support for Python 3.10 for running Black (#2562)
* Add new --workers parameter (#2514)
* Fixed feature detection for positional-only arguments in lambdas (#2532)
* Fixed a Python 3.10 compatibility issue where the loop argument was still being passed even though it has been removed (#2580)
* Deprecate Python 2 formatting support (#2523)
* Fix missing modules in self-contained binaries (#2466)
* Fix missing toml extra used during installation (#2475)
* Add support for formatting Jupyter Notebook files (#2357)
* Move from appdirs dependency to platformdirs (#2375)
* Present a more user-friendly error if .gitignore is invalid (#2414)
* Pin setuptools-scm build-time dependency version (#2457)
* Configuration files using TOML features higher than spec v0.5.0 are now supported (#2301)
* Accept empty stdin (#2346)
* Provide a more useful error when parsing fails during AST safety checks (#2304)
* Fix failure caused by fmt: skip and indentation (#2281)
* Account for += assignment when deciding whether to split string (#2312)
* Correct max string length calculation when there are string operators (#2292)
* Fixed option usage when using the --code flag (#2259)
* Do not call uvloop.install() when Black is used as a library (#2303)
* Added --required-version option to require a specific version to be running (#2300)
* Fix incorrect custom breakpoint indices when string group contains fake f-strings (#2311)
* Fix regression where R prefixes would be lowercased for docstrings (#2285)
* Fix handling of named escapes (\N{...}) when --experimental-string-processing is used (#2319)
* Restored compatibility with Click 8.0 on Python 3.6 when LANG=C used (#2227)
* Add extra uvloop install + import support if in python env (#2258)
* Fix --experimental-string-processing crash when matching parens are not found (#2283)
* Make sure to split lines that start with a string operator (#2286)
* Fix regular expression that black uses to identify f-expressions (#2287)
* Blackd
* Add a lower bound for the aiohttp-cors dependency. Only 0.4.0 or higher is supported. (#2231)
* Refactor src/black/__init__.py into many files (#2206)
* Set --pyi mode if --stdin-filename ends in .pyi (#2169)
* Stop detecting target version as Python 3.9+ with pre-PEP-614 decorators that are being called but with no arguments (#2182)
* Fix crash if the user configuration directory is inaccessible. (#2158)
* Clarify circumstances in which Black may change the AST (#2159)
* Fix crash on docstrings ending with "\ ". (#2142)
* Fix crash when atypical whitespace is cleaned out of dostrings (#2120)
* Reflect the --skip-magic-trailing-comma and --experimental-string-processing flags in the name of the cache file. Without this fix, changes in these flags would not take effect if the cache had already been populated. (#2131)
* Fixed a rare but annoying formatting instability created by the combination of optional trailing commas inserted by Black and optional parentheses looking at pre-existing "magic" trailing commas. This fixes issue #1629 and all of its many many duplicates. (#2126)
* Black now cleans up leading non-breaking spaces in comments (#2092)
* Black no longer removes all empty lines between non-function code and decorators when formatting typing stubs. Now Black enforces a single empty line. (#1646)
* Black no longer adds an incorrect space after a parenthesized assignment expression in if/while statements (#1655)
* Added --skip-magic-trailing-comma / -C to avoid using trailing commas as a reason to split lines (#1824)
* fixed a crash when PWD=/ on POSIX (#1631)
* fixed "I/O operation on closed file" when using --diff (#1664)
* Prevent coloured diff output being interleaved with multiple files (#1673)
* Added support for PEP 614 relaxed decorator syntax on python 3.9 (#1711)
* Added parsing support for unparenthesized tuples and yield expressions in annotated assignments (#1835)
* --diff correctly indicates when a file doesn't end in a newline (#1662)
* Added --stdin-filename argument to allow stdin to respect --force-exclude rules (#1780)
* Lines ending with fmt: skip will now be not formatted (#1800)
* PR #2053: Black no longer relies on typed-ast for Python 3.8 and higher