Deprecate ESP and move the functionality under --preview (#2789)

This commit is contained in:
Felix Hildén 2022-01-21 01:42:07 +02:00 committed by GitHub
parent 9bd4134f31
commit 6e97c5f47c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
9 changed files with 58 additions and 45 deletions

View File

@ -30,6 +30,8 @@
- Fix handling of standalone `match()` or `case()` when there is a trailing newline or a - Fix handling of standalone `match()` or `case()` when there is a trailing newline or a
comment inside of the parentheses. (#2760) comment inside of the parentheses. (#2760)
- Black now normalizes string prefix order (#2297) - Black now normalizes string prefix order (#2297)
- Deprecate `--experimental-string-processing` and move the functionality under
`--preview` (#2789)
### Packaging ### Packaging
@ -38,7 +40,8 @@
### Preview style ### Preview style
- Introduce the `--preview` flag with no style changes (#2752) - Introduce the `--preview` flag (#2752)
- Add `--experimental-string-processing` to the preview style (#2789)
### Integrations ### Integrations

View File

@ -33,7 +33,7 @@ still proposed on the issue tracker. See
Starting in 2022, the formatting output will be stable for the releases made in the same Starting in 2022, the formatting output will be stable for the releases made in the same
year (other than unintentional bugs). It is possible to opt-in to the latest formatting year (other than unintentional bugs). It is possible to opt-in to the latest formatting
styles, using the `--future` flag. styles, using the `--preview` flag.
## Why is my file not formatted? ## Why is my file not formatted?

View File

@ -10,6 +10,10 @@ with `# fmt: off` and end with `# fmt: on`, or lines that ends with `# fmt: skip
[YAPF](https://github.com/google/yapf)'s block comments to the same effect, as a [YAPF](https://github.com/google/yapf)'s block comments to the same effect, as a
courtesy for straddling code. courtesy for straddling code.
The rest of this document describes the current formatting style. If you're interested
in trying out where the style is heading, see [future style](./future_style.md) and try
running `black --preview`.
### How _Black_ wraps lines ### How _Black_ wraps lines
_Black_ ignores previous formatting and applies uniform horizontal and vertical _Black_ ignores previous formatting and applies uniform horizontal and vertical
@ -260,16 +264,6 @@ If you are adopting _Black_ in a large project with pre-existing string conventi
you can pass `--skip-string-normalization` on the command line. This is meant as an you can pass `--skip-string-normalization` on the command line. This is meant as an
adoption helper, avoid using this for new projects. adoption helper, avoid using this for new projects.
(labels/experimental-string)=
As an experimental option (can be enabled by `--experimental-string-processing`),
_Black_ splits long strings (using parentheses where appropriate) and merges short ones.
When split, parts of f-strings that don't need formatting are converted to plain
strings. User-made splits are respected when they do not exceed the line length limit.
Line continuation backslashes are converted into parenthesized strings. Unnecessary
parentheses are stripped. Because the functionality is experimental, feedback and issue
reports are highly encouraged!
_Black_ also processes docstrings. Firstly the indentation of docstrings is corrected _Black_ also processes docstrings. Firstly the indentation of docstrings is corrected
for both quotations and the text within, although relative indentation in the text is for both quotations and the text within, although relative indentation in the text is
preserved. Superfluous trailing whitespace on each line and unnecessary new lines at the preserved. Superfluous trailing whitespace on each line and unnecessary new lines at the

View File

@ -34,15 +34,18 @@ with \
Although when the target version is Python 3.9 or higher, _Black_ will use parentheses Although when the target version is Python 3.9 or higher, _Black_ will use parentheses
instead since they're allowed in Python 3.9 and higher. instead since they're allowed in Python 3.9 and higher.
## Improved string processing
Currently, _Black_ does not split long strings to fit the line length limit. Currently,
there is [an experimental option](labels/experimental-string) to enable splitting
strings. We plan to enable this option by default once it is fully stable. This is
tracked in [this issue](https://github.com/psf/black/issues/2188).
## Preview style ## Preview style
Experimental, potentially disruptive style changes are gathered under the `--preview` Experimental, potentially disruptive style changes are gathered under the `--preview`
CLI flag. At the end of each year, these changes may be adopted into the default style, CLI flag. At the end of each year, these changes may be adopted into the default style,
as described in [The Black Code Style](./index.rst). as described in [The Black Code Style](./index.rst). Because the functionality is
experimental, feedback and issue reports are highly encouraged!
### Improved string processing
_Black_ will split long string literals and merge short ones. Parentheses are used where
appropriate. When split, parts of f-strings that don't need formatting are converted to
plain strings. User-made splits are respected when they do not exceed the line length
limit. Line continuation backslashes are converted into parenthesized strings.
Unnecessary parentheses are stripped. The stability and status of this feature is
tracked in [this issue](https://github.com/psf/black/issues/2188).

View File

@ -241,10 +241,7 @@ def validate_regex(
"--experimental-string-processing", "--experimental-string-processing",
is_flag=True, is_flag=True,
hidden=True, hidden=True,
help=( help="(DEPRECATED and now included in --preview) Normalize string literals.",
"Experimental option that performs more normalization on string literals."
" Currently disabled because it leads to some crashes."
),
) )
@click.option( @click.option(
"--preview", "--preview",

View File

@ -23,8 +23,7 @@
from black.strings import normalize_string_prefix, normalize_string_quotes from black.strings import normalize_string_prefix, normalize_string_quotes
from black.trans import Transformer, CannotTransform, StringMerger from black.trans import Transformer, CannotTransform, StringMerger
from black.trans import StringSplitter, StringParenWrapper, StringParenStripper from black.trans import StringSplitter, StringParenWrapper, StringParenStripper
from black.mode import Mode from black.mode import Mode, Feature, Preview
from black.mode import Feature
from blib2to3.pytree import Node, Leaf from blib2to3.pytree import Node, Leaf
from blib2to3.pgen2 import token from blib2to3.pgen2 import token
@ -338,7 +337,7 @@ def transform_line(
and not (line.inside_brackets and line.contains_standalone_comments()) and not (line.inside_brackets and line.contains_standalone_comments())
): ):
# Only apply basic string preprocessing, since lines shouldn't be split here. # Only apply basic string preprocessing, since lines shouldn't be split here.
if mode.experimental_string_processing: if Preview.string_processing in mode:
transformers = [string_merge, string_paren_strip] transformers = [string_merge, string_paren_strip]
else: else:
transformers = [] transformers = []
@ -381,7 +380,7 @@ def _rhs(
# via type ... https://github.com/mypyc/mypyc/issues/884 # via type ... https://github.com/mypyc/mypyc/issues/884
rhs = type("rhs", (), {"__call__": _rhs})() rhs = type("rhs", (), {"__call__": _rhs})()
if mode.experimental_string_processing: if Preview.string_processing in mode:
if line.inside_brackets: if line.inside_brackets:
transformers = [ transformers = [
string_merge, string_merge,

View File

@ -7,9 +7,10 @@
import sys import sys
from dataclasses import dataclass, field from dataclasses import dataclass, field
from enum import Enum from enum import Enum, auto
from operator import attrgetter from operator import attrgetter
from typing import Dict, Set from typing import Dict, Set
from warnings import warn
if sys.version_info < (3, 8): if sys.version_info < (3, 8):
from typing_extensions import Final from typing_extensions import Final
@ -124,6 +125,13 @@ def supports_feature(target_versions: Set[TargetVersion], feature: Feature) -> b
class Preview(Enum): class Preview(Enum):
"""Individual preview style features.""" """Individual preview style features."""
string_processing = auto()
hug_simple_powers = auto()
class Deprecated(UserWarning):
"""Visible deprecation warning."""
@dataclass @dataclass
class Mode: class Mode:
@ -136,6 +144,14 @@ class Mode:
experimental_string_processing: bool = False experimental_string_processing: bool = False
preview: bool = False preview: bool = False
def __post_init__(self) -> None:
if self.experimental_string_processing:
warn(
"`experimental string processing` has been included in `preview`"
" and deprecated. Use `preview` instead.",
Deprecated,
)
def __contains__(self, feature: Preview) -> bool: def __contains__(self, feature: Preview) -> bool:
""" """
Provide `Preview.FEATURE in Mode` syntax that mirrors the ``preview`` flag. Provide `Preview.FEATURE in Mode` syntax that mirrors the ``preview`` flag.
@ -143,6 +159,8 @@ def __contains__(self, feature: Preview) -> bool:
The argument is not checked and features are not differentiated. The argument is not checked and features are not differentiated.
They only exist to make development easier by clarifying intent. They only exist to make development easier by clarifying intent.
""" """
if feature is Preview.string_processing:
return self.preview or self.experimental_string_processing
return self.preview return self.preview
def get_cache_key(self) -> str: def get_cache_key(self) -> str:

View File

@ -150,6 +150,11 @@ def test_empty_ff(self) -> None:
os.unlink(tmp_file) os.unlink(tmp_file)
self.assertFormatEqual(expected, actual) self.assertFormatEqual(expected, actual)
def test_experimental_string_processing_warns(self) -> None:
self.assertWarns(
black.mode.Deprecated, black.Mode, experimental_string_processing=True
)
def test_piping(self) -> None: def test_piping(self) -> None:
source, expected = read_data("src/black/__init__", data=False) source, expected = read_data("src/black/__init__", data=False)
result = BlackRunner().invoke( result = BlackRunner().invoke(
@ -342,7 +347,7 @@ def test_detect_pos_only_arguments(self) -> None:
@patch("black.dump_to_file", dump_to_stderr) @patch("black.dump_to_file", dump_to_stderr)
def test_string_quotes(self) -> None: def test_string_quotes(self) -> None:
source, expected = read_data("string_quotes") source, expected = read_data("string_quotes")
mode = black.Mode(experimental_string_processing=True) mode = black.Mode(preview=True)
assert_format(source, expected, mode) assert_format(source, expected, mode)
mode = replace(mode, string_normalization=False) mode = replace(mode, string_normalization=False)
not_normalized = fs(source, mode=mode) not_normalized = fs(source, mode=mode)

View File

@ -55,15 +55,6 @@
"tupleassign", "tupleassign",
] ]
EXPERIMENTAL_STRING_PROCESSING_CASES: List[str] = [
"cantfit",
"comments7",
"long_strings",
"long_strings__edge_case",
"long_strings__regression",
"percent_precedence",
]
PY310_CASES: List[str] = [ PY310_CASES: List[str] = [
"pattern_matching_simple", "pattern_matching_simple",
"pattern_matching_complex", "pattern_matching_complex",
@ -73,7 +64,15 @@
"parenthesized_context_managers", "parenthesized_context_managers",
] ]
PREVIEW_CASES: List[str] = [] PREVIEW_CASES: List[str] = [
# string processing
"cantfit",
"comments7",
"long_strings",
"long_strings__edge_case",
"long_strings__regression",
"percent_precedence",
]
SOURCES: List[str] = [ SOURCES: List[str] = [
"src/black/__init__.py", "src/black/__init__.py",
@ -136,11 +135,6 @@ def test_simple_format(filename: str) -> None:
check_file(filename, DEFAULT_MODE) check_file(filename, DEFAULT_MODE)
@pytest.mark.parametrize("filename", EXPERIMENTAL_STRING_PROCESSING_CASES)
def test_experimental_format(filename: str) -> None:
check_file(filename, black.Mode(experimental_string_processing=True))
@pytest.mark.parametrize("filename", PREVIEW_CASES) @pytest.mark.parametrize("filename", PREVIEW_CASES)
def test_preview_format(filename: str) -> None: def test_preview_format(filename: str) -> None:
check_file(filename, black.Mode(preview=True)) check_file(filename, black.Mode(preview=True))