Skip to content

Commit

Permalink
Create --preview CLI flag (#2752)
Browse files Browse the repository at this point in the history
  • Loading branch information
felix-hilden authored Jan 20, 2022
1 parent 98db4ab commit 8c22d23
Show file tree
Hide file tree
Showing 7 changed files with 51 additions and 7 deletions.
4 changes: 4 additions & 0 deletions CHANGES.md
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,10 @@
- All upper version bounds on dependencies have been removed (#2718)
- `typing-extensions` is no longer a required dependency in Python 3.10+ (#2772)

### Preview style

- Introduce the `--preview` flag with no style changes (#2752)

### Integrations

- Update GitHub action to support containerized runs (#2748)
Expand Down
4 changes: 3 additions & 1 deletion docs/contributing/the_basics.md
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,9 @@ go back and workout what to add to the `CHANGES.md` for each release.

If a change would affect the advertised code style, please modify the documentation (The
_Black_ code style) to reflect that change. Patches that fix unintended bugs in
formatting don't need to be mentioned separately though.
formatting don't need to be mentioned separately though. If the change is implemented
with the `--preview` flag, please include the change in the future style document
instead and write the changelog entry under a dedicated "Preview changes" heading.

### Docs Testing

Expand Down
6 changes: 6 additions & 0 deletions docs/the_black_code_style/future_style.md
Original file line number Diff line number Diff line change
Expand Up @@ -40,3 +40,9 @@ Currently, _Black_ does not split long strings to fit the line length limit. Cur
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

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,
as described in [The Black Code Style](./index.rst).
2 changes: 1 addition & 1 deletion docs/the_black_code_style/index.rst
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ versions of *Black*:
improved formatting enabled by newer Python language syntax as well as due
to improvements in the formatting logic.

- The ``--future`` flag is exempt from this policy. There are no guarantees
- The ``--preview`` flag is exempt from this policy. There are no guarantees
around the stability of the output with that flag passed into *Black*. This
flag is intended for allowing experimentation with the proposed changes to
the *Black* code style.
Expand Down
10 changes: 10 additions & 0 deletions src/black/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -246,6 +246,14 @@ def validate_regex(
" Currently disabled because it leads to some crashes."
),
)
@click.option(
"--preview",
is_flag=True,
help=(
"Enable potentially disruptive style changes that will be added to Black's main"
" functionality in the next major release."
),
)
@click.option(
"--check",
is_flag=True,
Expand Down Expand Up @@ -399,6 +407,7 @@ def main(
skip_string_normalization: bool,
skip_magic_trailing_comma: bool,
experimental_string_processing: bool,
preview: bool,
quiet: bool,
verbose: bool,
required_version: Optional[str],
Expand Down Expand Up @@ -469,6 +478,7 @@ def main(
string_normalization=not skip_string_normalization,
magic_trailing_comma=not skip_magic_trailing_comma,
experimental_string_processing=experimental_string_processing,
preview=preview,
)

if code is not None:
Expand Down
15 changes: 15 additions & 0 deletions src/black/mode.py
Original file line number Diff line number Diff line change
Expand Up @@ -121,6 +121,10 @@ def supports_feature(target_versions: Set[TargetVersion], feature: Feature) -> b
return all(feature in VERSION_TO_FEATURES[version] for version in target_versions)


class Preview(Enum):
"""Individual preview style features."""


@dataclass
class Mode:
target_versions: Set[TargetVersion] = field(default_factory=set)
Expand All @@ -130,6 +134,16 @@ class Mode:
is_ipynb: bool = False
magic_trailing_comma: bool = True
experimental_string_processing: bool = False
preview: bool = False

def __contains__(self, feature: Preview) -> bool:
"""
Provide `Preview.FEATURE in Mode` syntax that mirrors the ``preview`` flag.
The argument is not checked and features are not differentiated.
They only exist to make development easier by clarifying intent.
"""
return self.preview

def get_cache_key(self) -> str:
if self.target_versions:
Expand All @@ -147,5 +161,6 @@ def get_cache_key(self) -> str:
str(int(self.is_ipynb)),
str(int(self.magic_trailing_comma)),
str(int(self.experimental_string_processing)),
str(int(self.preview)),
]
return ".".join(parts)
17 changes: 12 additions & 5 deletions tests/test_format.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
from dataclasses import replace
from typing import Any, Iterator
from typing import Any, Iterator, List
from unittest.mock import patch

import pytest
Expand All @@ -14,7 +14,7 @@
read_data,
)

SIMPLE_CASES = [
SIMPLE_CASES: List[str] = [
"beginning_backslash",
"bracketmatch",
"class_blank_parentheses",
Expand Down Expand Up @@ -55,7 +55,7 @@
"tupleassign",
]

EXPERIMENTAL_STRING_PROCESSING_CASES = [
EXPERIMENTAL_STRING_PROCESSING_CASES: List[str] = [
"cantfit",
"comments7",
"long_strings",
Expand All @@ -64,7 +64,7 @@
"percent_precedence",
]

PY310_CASES = [
PY310_CASES: List[str] = [
"pattern_matching_simple",
"pattern_matching_complex",
"pattern_matching_extras",
Expand All @@ -73,7 +73,9 @@
"parenthesized_context_managers",
]

SOURCES = [
PREVIEW_CASES: List[str] = []

SOURCES: List[str] = [
"src/black/__init__.py",
"src/black/__main__.py",
"src/black/brackets.py",
Expand Down Expand Up @@ -139,6 +141,11 @@ def test_experimental_format(filename: str) -> None:
check_file(filename, black.Mode(experimental_string_processing=True))


@pytest.mark.parametrize("filename", PREVIEW_CASES)
def test_preview_format(filename: str) -> None:
check_file(filename, black.Mode(preview=True))


@pytest.mark.parametrize("filename", SOURCES)
def test_source_is_formatted(filename: str) -> None:
path = THIS_DIR.parent / filename
Expand Down

0 comments on commit 8c22d23

Please sign in to comment.