Skip to content

Commit

Permalink
Merge branch 'main' into arithmetic-stability
Browse files Browse the repository at this point in the history
  • Loading branch information
hauntsaninja committed Jan 29, 2022
2 parents 69e10a8 + 3437950 commit 81d2bc8
Show file tree
Hide file tree
Showing 4 changed files with 110 additions and 6 deletions.
2 changes: 2 additions & 0 deletions CHANGES.md
Expand Up @@ -23,6 +23,7 @@ and the first release covered by our new stability policy.
- Use parentheses for attribute access on decimal float and int literals (#2799)
- Don't add whitespace for attribute access on hexadecimal, binary, octal, and complex
literals (#2799)
- Treat blank lines in stubs the same inside top-level `if` statements (#2820)
- Fix unstable formatting with semicolons and arithmetic expressions (#2817)

### Parser
Expand Down Expand Up @@ -85,6 +86,7 @@ and the first release covered by our new stability policy.
- Change HTML theme to Furo primarily for its responsive design and mobile support
(#2793)
- Deprecate the `black-primer` tool (#2809)
- Document Python support policy (#2819)

## 21.12b0

Expand Down
11 changes: 9 additions & 2 deletions docs/faq.md
Expand Up @@ -71,9 +71,16 @@ readability because operators are misaligned. Disable W503 and enable the
disabled-by-default counterpart W504. E203 should be disabled while changes are still
[discussed](https://github.com/PyCQA/pycodestyle/issues/373).

## Does Black support Python 2?
## Which Python versions does Black support?

Support for formatting Python 2 code was removed in version 22.0.
Currently the runtime requires Python 3.6-3.10. Formatting is supported for files
containing syntax from Python 3.3 to 3.10. We promise to support at least all Python
versions that have not reached their end of life. This is the case for both running
_Black_ and formatting code.

Support for formatting Python 2 code was removed in version 22.0. While we've made no
plans to stop supporting older Python 3 minor versions immediately, their support might
also be removed some time in the future without a deprecation period.

## Why does my linter or typechecker complain after I format my code?

Expand Down
10 changes: 6 additions & 4 deletions src/black/lines.py
Expand Up @@ -530,11 +530,11 @@ def _maybe_empty_lines_for_class_or_def(
return 0, 0

if self.is_pyi:
if self.previous_line.depth > current_line.depth:
newlines = 0 if current_line.depth else 1
elif current_line.is_class or self.previous_line.is_class:
if current_line.depth:
if current_line.is_class or self.previous_line.is_class:
if self.previous_line.depth < current_line.depth:
newlines = 0
elif self.previous_line.depth > current_line.depth:
newlines = 1
elif current_line.is_stub_class and self.previous_line.is_stub_class:
# No blank line between classes with an empty body
newlines = 0
Expand All @@ -551,6 +551,8 @@ def _maybe_empty_lines_for_class_or_def(
# Blank line between a block of functions (maybe with preceding
# decorators) and a block of non-functions
newlines = 1
elif self.previous_line.depth > current_line.depth:
newlines = 1
else:
newlines = 0
else:
Expand Down
93 changes: 93 additions & 0 deletions tests/data/stub.pyi
Expand Up @@ -32,6 +32,48 @@ def g():

def h(): ...

if sys.version_info >= (3, 8):
class E:
def f(self): ...
class F:

def f(self): ...
class G: ...
class H: ...
else:
class I: ...
class J: ...
def f(): ...

class K:
def f(self): ...
def f(): ...

class Nested:
class dirty: ...
class little: ...
class secret:
def who_has_to_know(self): ...
def verse(self): ...

class Conditional:
def f(self): ...
if sys.version_info >= (3, 8):
def g(self): ...
else:
def g(self): ...
def h(self): ...
def i(self): ...
if sys.version_info >= (3, 8):
def j(self): ...
def k(self): ...
if sys.version_info >= (3, 8):
class A: ...
class B: ...
class C:
def l(self): ...
def m(self): ...


# output
X: int
Expand All @@ -56,3 +98,54 @@ class A:

def g(): ...
def h(): ...

if sys.version_info >= (3, 8):
class E:
def f(self): ...

class F:
def f(self): ...

class G: ...
class H: ...

else:
class I: ...
class J: ...

def f(): ...

class K:
def f(self): ...

def f(): ...

class Nested:
class dirty: ...
class little: ...

class secret:
def who_has_to_know(self): ...

def verse(self): ...

class Conditional:
def f(self): ...
if sys.version_info >= (3, 8):
def g(self): ...
else:
def g(self): ...

def h(self): ...
def i(self): ...
if sys.version_info >= (3, 8):
def j(self): ...

def k(self): ...
if sys.version_info >= (3, 8):
class A: ...
class B: ...

class C:
def l(self): ...
def m(self): ...

0 comments on commit 81d2bc8

Please sign in to comment.