Stubs: preserve blank line between attributes and methods (#2736)

This commit is contained in:
Richard Si 2022-01-07 11:38:03 -05:00 committed by GitHub
parent 668bace2ab
commit 05e1fbf27d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 44 additions and 6 deletions

View File

@ -17,6 +17,8 @@
- Tuple unpacking on `return` and `yield` constructs now implies 3.8+ (#2700)
- Unparenthesized tuples on annotated assignments (e.g
`values: Tuple[int, ...] = 1, 2, 3`) now implies 3.8+ (#2708)
- For stubs, one blank line between class attributes and methods is now kept if there's
at least one pre-existing blank line (#2736)
### Packaging

View File

@ -448,7 +448,14 @@ def _maybe_empty_lines(self, current_line: Line) -> Tuple[int, int]:
depth = current_line.depth
while self.previous_defs and self.previous_defs[-1] >= depth:
if self.is_pyi:
before = 0 if depth else 1
assert self.previous_line is not None
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)
elif depth:
before = 0
else:
before = 1
else:
if depth:
before = 1
@ -532,9 +539,15 @@ def _maybe_empty_lines_for_class_or_def(
elif (
current_line.is_def or current_line.is_decorator
) and not self.previous_line.is_def:
# Blank line between a block of functions (maybe with preceding
# decorators) and a block of non-functions
newlines = 1
if not current_line.depth:
# Blank line between a block of functions (maybe with preceding
# decorators) and a block of non-functions
newlines = 1
else:
# In classes empty lines between attributes and methods should
# be preserved. The +1 offset is to negate the -1 done later as
# this function is indented.
newlines = min(2, before + 1)
else:
newlines = 0
else:

View File

@ -2,32 +2,55 @@ X: int
def f(): ...
class D:
...
class C:
...
class B:
...
this_lack_of_newline_should_be_kept: int
def b(self) -> None: ...
but_this_newline_should_also_be_kept: int
class A:
attr: int
attr2: str
def f(self) -> int:
...
def g(self) -> str: ...
def g():
...
def h(): ...
# output
X: int
def f(): ...
class D: ...
class C: ...
class B: ...
class B:
this_lack_of_newline_should_be_kept: int
def b(self) -> None: ...
but_this_newline_should_also_be_kept: int
class A:
attr: int
attr2: str
def f(self) -> int: ...
def g(self) -> str: ...