Stubs: preserve blank line between attributes and methods (#2736)
This commit is contained in:
parent
668bace2ab
commit
05e1fbf27d
@ -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
|
||||||
|
|
||||||
|
@ -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:
|
||||||
|
@ -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: ...
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user