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) - Tuple unpacking on `return` and `yield` constructs now implies 3.8+ (#2700)
- Unparenthesized tuples on annotated assignments (e.g - Unparenthesized tuples on annotated assignments (e.g
`values: Tuple[int, ...] = 1, 2, 3`) now implies 3.8+ (#2708) `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 ### Packaging

View File

@ -448,7 +448,14 @@ def _maybe_empty_lines(self, current_line: Line) -> Tuple[int, int]:
depth = current_line.depth depth = current_line.depth
while self.previous_defs and self.previous_defs[-1] >= depth: while self.previous_defs and self.previous_defs[-1] >= depth:
if self.is_pyi: 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: else:
if depth: if depth:
before = 1 before = 1
@ -532,9 +539,15 @@ def _maybe_empty_lines_for_class_or_def(
elif ( elif (
current_line.is_def or current_line.is_decorator current_line.is_def or current_line.is_decorator
) and not self.previous_line.is_def: ) and not self.previous_line.is_def:
if not current_line.depth:
# Blank line between a block of functions (maybe with preceding # Blank line between a block of functions (maybe with preceding
# decorators) and a block of non-functions # decorators) and a block of non-functions
newlines = 1 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: else:
newlines = 0 newlines = 0
else: else:

View File

@ -2,32 +2,55 @@ X: int
def f(): ... def f(): ...
class D:
...
class C: 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: class A:
attr: int
attr2: str
def f(self) -> int: def f(self) -> int:
... ...
def g(self) -> str: ... def g(self) -> str: ...
def g(): def g():
... ...
def h(): ... def h(): ...
# output # output
X: int X: int
def f(): ... def f(): ...
class D: ...
class C: ... 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: class A:
attr: int
attr2: str
def f(self) -> int: ... def f(self) -> int: ...
def g(self) -> str: ... def g(self) -> str: ...