Skip to content

Commit

Permalink
Merge branch 'main' into improve-caching
Browse files Browse the repository at this point in the history
  • Loading branch information
JelleZijlstra authored Aug 19, 2023
2 parents 4278c86 + 793c2b5 commit 6e1a57b
Show file tree
Hide file tree
Showing 14 changed files with 163 additions and 22 deletions.
2 changes: 1 addition & 1 deletion .github/workflows/pypi_upload.yml
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@ jobs:
- uses: actions/checkout@v3

- name: Build wheels via cibuildwheel
uses: pypa/cibuildwheel@v2.14.1
uses: pypa/cibuildwheel@v2.15.0
env:
CIBW_ARCHS_MACOS: "${{ matrix.macos_arch }}"

Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ jobs:
- name: Install tox
run: |
python -m pip install --upgrade pip
python -m pip install --upgrade tox
python -m pip install --upgrade 'tox<4.7'
- name: Unit tests
if: "!startsWith(matrix.python-version, 'pypy')"
Expand Down
9 changes: 6 additions & 3 deletions .pre-commit-config.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ repos:
- id: isort

- repo: https://github.com/pycqa/flake8
rev: 6.0.0
rev: 6.1.0
hooks:
- id: flake8
additional_dependencies:
Expand All @@ -39,7 +39,7 @@ repos:
exclude: ^src/blib2to3/

- repo: https://github.com/pre-commit/mirrors-mypy
rev: v1.4.1
rev: v1.5.0
hooks:
- id: mypy
exclude: ^docs/conf.py
Expand All @@ -53,7 +53,7 @@ repos:
- hypothesis

- repo: https://github.com/pre-commit/mirrors-prettier
rev: v3.0.0
rev: v3.0.1
hooks:
- id: prettier
exclude: \.github/workflows/diff_shades\.yml
Expand All @@ -63,3 +63,6 @@ repos:
hooks:
- id: end-of-file-fixer
- id: trailing-whitespace

ci:
autoupdate_schedule: quarterly
2 changes: 2 additions & 0 deletions .pre-commit-hooks.yaml
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
# Note that we recommend using https://github.com/psf/black-pre-commit-mirror instead
# This will work about 2x as fast as using the hooks in this repository
- id: black
name: black
description: "Black: The uncompromising Python code formatter"
Expand Down
9 changes: 9 additions & 0 deletions CHANGES.md
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,8 @@

<!-- Changes that affect Black's preview style -->

- More concise formatting for dummy implementations (#3796)

### Configuration

<!-- Changes to how Black can be configured -->
Expand Down Expand Up @@ -45,6 +47,13 @@

<!-- For example, Docker, GitHub Actions, pre-commit, editors -->

- Black now has an
[official pre-commit mirror](https://github.com/psf/black-pre-commit-mirror). Swapping
`https://github.com/psf/black` to `https://github.com/psf/black-pre-commit-mirror` in
your `.pre-commit-config.yaml` will make Black about 2x faster (#3828)
- The `.black.env` folder specified by `ENV_PATH` will now be removed on the completion
of the GitHub Action. (#3759)

### Documentation

<!-- Major changes to documentation and policies. Small docs changes
Expand Down
2 changes: 2 additions & 0 deletions action/main.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import os
import shlex
import shutil
import sys
from pathlib import Path
from subprocess import PIPE, STDOUT, run
Expand Down Expand Up @@ -73,5 +74,6 @@
stderr=STDOUT,
encoding="utf-8",
)
shutil.rmtree(ENV_PATH, ignore_errors=True)
print(proc.stdout)
sys.exit(proc.returncode)
13 changes: 8 additions & 5 deletions docs/integrations/source_version_control.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,8 @@ Use [pre-commit](https://pre-commit.com/). Once you

```yaml
repos:
- repo: https://github.com/psf/black
# Using this mirror lets us use mypyc-compiled black, which is about 2x faster
- repo: https://github.com/psf/black-pre-commit-mirror
rev: 23.7.0
hooks:
- id: black
Expand All @@ -17,8 +18,10 @@ repos:
language_version: python3.11
```
Feel free to switch out the `rev` value to something else, like another
[tag/version][black-tags] or even a specific commit. Although we discourage the use of
Feel free to switch out the `rev` value to a different version of Black.

Note if you'd like to use a specific commit in `rev`, you'll need to swap the repo
specified from the mirror to https://github.com/psf/black. We discourage the use of
branches or other mutable refs since the hook [won't auto update as you may
expect][pre-commit-mutable-rev].

Expand All @@ -30,7 +33,8 @@ include Jupyter Notebooks. To use this hook, simply replace the hook's `id: blac

```yaml
repos:
- repo: https://github.com/psf/black
# Using this mirror lets us use mypyc-compiled black, which is about 2x faster
- repo: https://github.com/psf/black-pre-commit-mirror
rev: 23.7.0
hooks:
- id: black-jupyter
Expand All @@ -45,6 +49,5 @@ repos:
The `black-jupyter` hook became available in version 21.8b0.
```

[black-tags]: https://github.com/psf/black/tags
[pre-commit-mutable-rev]:
https://pre-commit.com/#using-the-latest-version-for-a-repository
2 changes: 1 addition & 1 deletion docs/requirements.txt
Original file line number Diff line number Diff line change
Expand Up @@ -6,4 +6,4 @@ Sphinx==6.1.3
docutils==0.19
sphinxcontrib-programoutput==0.17
sphinx_copybutton==0.5.2
furo==2023.5.20
furo==2023.7.26
10 changes: 7 additions & 3 deletions src/black/linegen.py
Original file line number Diff line number Diff line change
Expand Up @@ -281,7 +281,9 @@ def visit_match_case(self, node: Node) -> Iterator[Line]:

def visit_suite(self, node: Node) -> Iterator[Line]:
"""Visit a suite."""
if self.mode.is_pyi and is_stub_suite(node):
if (
self.mode.is_pyi or Preview.dummy_implementations in self.mode
) and is_stub_suite(node):
yield from self.visit(node.children[2])
else:
yield from self.visit_default(node)
Expand All @@ -296,7 +298,9 @@ def visit_simple_stmt(self, node: Node) -> Iterator[Line]:

is_suite_like = node.parent and node.parent.type in STATEMENT
if is_suite_like:
if self.mode.is_pyi and is_stub_body(node):
if (
self.mode.is_pyi or Preview.dummy_implementations in self.mode
) and is_stub_body(node):
yield from self.visit_default(node)
else:
yield from self.line(+1)
Expand All @@ -305,7 +309,7 @@ def visit_simple_stmt(self, node: Node) -> Iterator[Line]:

else:
if (
not self.mode.is_pyi
not (self.mode.is_pyi or Preview.dummy_implementations in self.mode)
or not node.parent
or not is_stub_suite(node.parent)
):
Expand Down
27 changes: 23 additions & 4 deletions src/black/lines.py
Original file line number Diff line number Diff line change
Expand Up @@ -165,6 +165,13 @@ def is_def(self) -> bool:
and second_leaf.value == "def"
)

@property
def is_stub_def(self) -> bool:
"""Is this line a function definition with a body consisting only of "..."?"""
return self.is_def and self.leaves[-4:] == [Leaf(token.COLON, ":")] + [
Leaf(token.DOT, ".") for _ in range(3)
]

@property
def is_class_paren_empty(self) -> bool:
"""Is this a class with no base classes but using parentheses?
Expand Down Expand Up @@ -578,6 +585,8 @@ def _maybe_empty_lines(self, current_line: Line) -> Tuple[int, int]:
first_leaf.prefix = ""
else:
before = 0

user_had_newline = bool(before)
depth = current_line.depth

previous_def = None
Expand All @@ -589,7 +598,7 @@ def _maybe_empty_lines(self, current_line: Line) -> Tuple[int, int]:
if self.mode.is_pyi:
if depth and not current_line.is_def and self.previous_line.is_def:
# Empty lines between attributes and methods should be preserved.
before = min(1, before)
before = 1 if user_had_newline else 0
elif (
Preview.blank_line_after_nested_stub_class in self.mode
and previous_def.is_class
Expand Down Expand Up @@ -624,7 +633,9 @@ def _maybe_empty_lines(self, current_line: Line) -> Tuple[int, int]:
before = 2

if current_line.is_decorator or current_line.is_def or current_line.is_class:
return self._maybe_empty_lines_for_class_or_def(current_line, before)
return self._maybe_empty_lines_for_class_or_def(
current_line, before, user_had_newline
)

if (
self.previous_line
Expand All @@ -648,8 +659,8 @@ def _maybe_empty_lines(self, current_line: Line) -> Tuple[int, int]:
return 0, 0
return before, 0

def _maybe_empty_lines_for_class_or_def(
self, current_line: Line, before: int
def _maybe_empty_lines_for_class_or_def( # noqa: C901
self, current_line: Line, before: int, user_had_newline: bool
) -> Tuple[int, int]:
if not current_line.is_decorator:
self.previous_defs.append(current_line)
Expand Down Expand Up @@ -715,6 +726,14 @@ def _maybe_empty_lines_for_class_or_def(
newlines = 0
else:
newlines = 1 if current_line.depth else 2
# If a user has left no space after a dummy implementation, don't insert
# new lines. This is useful for instance for @overload or Protocols.
if (
Preview.dummy_implementations in self.mode
and self.previous_line.is_stub_def
and not user_had_newline
):
newlines = 0
if comment_to_add_newlines is not None:
previous_block = comment_to_add_newlines.previous_block
if previous_block is not None:
Expand Down
1 change: 1 addition & 0 deletions src/black/mode.py
Original file line number Diff line number Diff line change
Expand Up @@ -182,6 +182,7 @@ class Preview(Enum):
skip_magic_trailing_comma_in_subscript = auto()
wrap_long_dict_values_in_parens = auto()
wrap_multiple_context_managers_in_parens = auto()
dummy_implementations = auto()


class Deprecated(UserWarning):
Expand Down
4 changes: 2 additions & 2 deletions tests/data/miscellaneous/force_py36.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# The input source must not contain any Py36-specific syntax (e.g. argument type
# annotations, trailing comma after *rest) or this test becomes invalid.
def long_function_name(argument_one, argument_two, argument_three, argument_four, argument_five, argument_six, *rest): ...
def long_function_name(argument_one, argument_two, argument_three, argument_four, argument_five, argument_six, *rest): pass
# output
# The input source must not contain any Py36-specific syntax (e.g. argument type
# annotations, trailing comma after *rest) or this test becomes invalid.
Expand All @@ -13,4 +13,4 @@ def long_function_name(
argument_six,
*rest,
):
...
pass
3 changes: 1 addition & 2 deletions tests/data/preview/comments7.py
Original file line number Diff line number Diff line change
Expand Up @@ -278,8 +278,7 @@ class C:
)
def test_fails_invalid_post_data(
self, pyramid_config, db_request, post_data, message
):
...
): ...


square = Square(4) # type: Optional[Square]
99 changes: 99 additions & 0 deletions tests/data/preview/dummy_implementations.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,99 @@
from typing import NoReturn, Protocol, Union, overload


def dummy(a): ...
def other(b): ...


@overload
def a(arg: int) -> int: ...
@overload
def a(arg: str) -> str: ...
@overload
def a(arg: object) -> NoReturn: ...
def a(arg: Union[int, str, object]) -> Union[int, str]:
if not isinstance(arg, (int, str)):
raise TypeError
return arg

class Proto(Protocol):
def foo(self, a: int) -> int:
...

def bar(self, b: str) -> str: ...
def baz(self, c: bytes) -> str:
...


def dummy_two():
...
@dummy
def dummy_three():
...

def dummy_four():
...

@overload
def b(arg: int) -> int: ...

@overload
def b(arg: str) -> str: ...
@overload
def b(arg: object) -> NoReturn: ...

def b(arg: Union[int, str, object]) -> Union[int, str]:
if not isinstance(arg, (int, str)):
raise TypeError
return arg

# output

from typing import NoReturn, Protocol, Union, overload


def dummy(a): ...
def other(b): ...


@overload
def a(arg: int) -> int: ...
@overload
def a(arg: str) -> str: ...
@overload
def a(arg: object) -> NoReturn: ...
def a(arg: Union[int, str, object]) -> Union[int, str]:
if not isinstance(arg, (int, str)):
raise TypeError
return arg


class Proto(Protocol):
def foo(self, a: int) -> int: ...

def bar(self, b: str) -> str: ...
def baz(self, c: bytes) -> str: ...


def dummy_two(): ...
@dummy
def dummy_three(): ...


def dummy_four(): ...


@overload
def b(arg: int) -> int: ...


@overload
def b(arg: str) -> str: ...
@overload
def b(arg: object) -> NoReturn: ...


def b(arg: Union[int, str, object]) -> Union[int, str]:
if not isinstance(arg, (int, str)):
raise TypeError
return arg

0 comments on commit 6e1a57b

Please sign in to comment.