Parenthesize long type annotations in annotated assignments (#9210)

This commit is contained in:
Micha Reiser 2023-12-22 12:33:47 +09:00 committed by GitHub
parent 3cc719bd74
commit fa2c37b411
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
8 changed files with 777 additions and 47 deletions

View file

@ -95,36 +95,7 @@ def f(
```diff
--- Black
+++ Ruff
@@ -7,23 +7,13 @@
)
# "AnnAssign"s now also work
-z: (
- Loooooooooooooooooooooooong
- | Loooooooooooooooooooooooong
- | Loooooooooooooooooooooooong
- | Loooooooooooooooooooooooong
-)
-z: Short | Short2 | Short3 | Short4
-z: int
-z: int
+z: Loooooooooooooooooooooooong | Loooooooooooooooooooooooong | Loooooooooooooooooooooooong | Loooooooooooooooooooooooong
+z: (Short | Short2 | Short3 | Short4)
+z: (int)
+z: (int)
-z: (
- Loooooooooooooooooooooooong
- | Loooooooooooooooooooooooong
- | Loooooooooooooooooooooooong
- | Loooooooooooooooooooooooong
-) = 7
+z: Loooooooooooooooooooooooong | Loooooooooooooooooooooooong | Loooooooooooooooooooooooong | Loooooooooooooooooooooooong = 7
z: Short | Short2 | Short3 | Short4 = 8
z: int = 2.3
z: int = foo()
@@ -63,7 +53,7 @@
@@ -63,7 +63,7 @@
# remove unnecessary paren
@ -133,7 +104,7 @@ def f(
# this is a syntax error in the type annotation according to mypy, but it's not invalid *python* code, so make sure we don't mess with it and make it so.
@@ -72,12 +62,10 @@
@@ -72,12 +72,10 @@
def foo(
i: int,
@ -150,7 +121,7 @@ def f(
*,
s: str,
) -> None:
@@ -88,7 +76,7 @@
@@ -88,7 +86,7 @@
async def foo(
q: str | None = Query(
None, title="Some long title", description="Some long description"
@ -173,13 +144,23 @@ z = (
)
# "AnnAssign"s now also work
z: Loooooooooooooooooooooooong | Loooooooooooooooooooooooong | Loooooooooooooooooooooooong | Loooooooooooooooooooooooong
z: (Short | Short2 | Short3 | Short4)
z: (int)
z: (int)
z: (
Loooooooooooooooooooooooong
| Loooooooooooooooooooooooong
| Loooooooooooooooooooooooong
| Loooooooooooooooooooooooong
)
z: Short | Short2 | Short3 | Short4
z: int
z: int
z: Loooooooooooooooooooooooong | Loooooooooooooooooooooooong | Loooooooooooooooooooooooong | Loooooooooooooooooooooooong = 7
z: (
Loooooooooooooooooooooooong
| Loooooooooooooooooooooooong
| Loooooooooooooooooooooooong
| Loooooooooooooooooooooooong
) = 7
z: Short | Short2 | Short3 | Short4 = 8
z: int = 2.3
z: int = foo()

View file

@ -84,6 +84,16 @@ class DefaultRunner:
JSONSerializable: TypeAlias = (
"str | int | float | bool | None | list | tuple | JSONMapping"
@@ -29,6 +29,6 @@
# Regression test: Don't forget the parentheses in the annotation when breaking
class DefaultRunner:
- task_runner_cls: TaskRunnerProtocol | typing.Callable[
- [], typing.Any
- ] = DefaultTaskRunner
+ task_runner_cls: TaskRunnerProtocol | typing.Callable[[], typing.Any] = (
+ DefaultTaskRunner
+ )
```

View file

@ -0,0 +1,451 @@
---
source: crates/ruff_python_formatter/tests/fixtures.rs
input_file: crates/ruff_python_formatter/resources/test/fixtures/ruff/statement/long_type_annotations.py
---
## Input
```python
x1: A[b] | EventHandler | EventSpec | list[EventHandler | EventSpec] | Other | More | AndMore | None = None
x2: "VeryLongClassNameWithAwkwardGenericSubtype[int] |" "VeryLongClassNameWithAwkwardGenericSubtype[str]"
x6: VeryLongClassNameWithAwkwardGenericSubtype[
integeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeer,
VeryLongClassNameWithAwkwardGenericSubtype,
str
] = True
x7: CustomTrainingJob | CustomContainerTrainingJob | CustomPythonPackageTrainingJob
x8: (
None
| datasets.ImageDataset
| datasets.TabularDataset
| datasets.TextDataset
| datasets.VideoDataset
) = None
x9: None | (
datasets.ImageDataset
| datasets.TabularDataset
| datasets.TextDataset
| datasets.VideoDataset
) = None
x10: (
aaaaaaaaaaaaaaaaaaaaaaaa[
bbbbbbbbbbb,
Subscript
| None
| datasets.ImageDataset
| datasets.TabularDataset
| datasets.TextDataset
| datasets.VideoDataset,
],
bbb[other],
) = None
x11: None | [
datasets.ImageDataset,
datasets.TabularDataset,
datasets.TextDataset,
datasets.VideoDataset,
] = None
x12: None | [
datasets.ImageDataset,
datasets.TabularDataset,
datasets.TextDataset,
datasets.VideoDataset,
] | Other = None
x13: [
datasets.ImageDataset,
datasets.TabularDataset,
datasets.TextDataset,
datasets.VideoDataset,
] | Other = None
x14: [
datasets.ImageDataset,
datasets.TabularDataset,
datasets.TextDataset,
datasets.VideoDataset,
] | [
datasets.ImageDataset,
datasets.TabularDataset,
datasets.TextDataset,
datasets.VideoDataset,
] = None
x15: [
datasets.ImageDataset,
datasets.TabularDataset,
datasets.TextDataset,
datasets.VideoDataset,
] | [
datasets.ImageDataset,
datasets.TabularDataset,
datasets.TextDataset,
datasets.VideoDataset,
] | Other = None
x16: None | Literal[
"split",
"a bit longer",
"records",
"index",
"table",
"columns",
"values",
] = None
x17: None | [
datasets.ImageDataset,
datasets.TabularDataset,
datasets.TextDataset,
datasets.VideoDataset,
]
class Test:
safe_age: Decimal # the user's age, used to determine if it's safe for them to use ruff
applied_fixes: int # the number of fixes that this user applied. Used for ranking the users with the most applied fixes.
string_annotation: "Test" # a long comment after a quoted, runtime-only type annotation
##########
# Comments
leading: (
# Leading comment
None | dataset.ImageDataset
)
leading_with_value: (
# Leading comment
None
| dataset.ImageDataset
) = None
leading_open_parentheses: ( # Leading comment
None
| dataset.ImageDataset
)
leading_open_parentheses_with_value: ( # Leading comment
None
| dataset.ImageDataset
) = None
trailing: (
None | dataset.ImageDataset # trailing comment
)
trailing_with_value: (
None | dataset.ImageDataset # trailing comment
) = None
trailing_own_line: (
None | dataset.ImageDataset
# trailing own line
)
trailing_own_line_with_value: (
None | dataset.ImageDataset
# trailing own line
) = None
nested_comment: None | [
# a list of strings
str
] = None
```
## Output
```python
x1: A[b] | EventHandler | EventSpec | list[
EventHandler | EventSpec
] | Other | More | AndMore | None = None
x2: "VeryLongClassNameWithAwkwardGenericSubtype[int] |" "VeryLongClassNameWithAwkwardGenericSubtype[str]"
x6: VeryLongClassNameWithAwkwardGenericSubtype[
integeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeer,
VeryLongClassNameWithAwkwardGenericSubtype,
str,
] = True
x7: CustomTrainingJob | CustomContainerTrainingJob | CustomPythonPackageTrainingJob
x8: (
None
| datasets.ImageDataset
| datasets.TabularDataset
| datasets.TextDataset
| datasets.VideoDataset
) = None
x9: None | (
datasets.ImageDataset
| datasets.TabularDataset
| datasets.TextDataset
| datasets.VideoDataset
) = None
x10: (
aaaaaaaaaaaaaaaaaaaaaaaa[
bbbbbbbbbbb,
Subscript
| None
| datasets.ImageDataset
| datasets.TabularDataset
| datasets.TextDataset
| datasets.VideoDataset,
],
bbb[other],
) = None
x11: None | [
datasets.ImageDataset,
datasets.TabularDataset,
datasets.TextDataset,
datasets.VideoDataset,
] = None
x12: None | [
datasets.ImageDataset,
datasets.TabularDataset,
datasets.TextDataset,
datasets.VideoDataset,
] | Other = None
x13: [
datasets.ImageDataset,
datasets.TabularDataset,
datasets.TextDataset,
datasets.VideoDataset,
] | Other = None
x14: [
datasets.ImageDataset,
datasets.TabularDataset,
datasets.TextDataset,
datasets.VideoDataset,
] | [
datasets.ImageDataset,
datasets.TabularDataset,
datasets.TextDataset,
datasets.VideoDataset,
] = None
x15: [
datasets.ImageDataset,
datasets.TabularDataset,
datasets.TextDataset,
datasets.VideoDataset,
] | [
datasets.ImageDataset,
datasets.TabularDataset,
datasets.TextDataset,
datasets.VideoDataset,
] | Other = None
x16: None | Literal[
"split",
"a bit longer",
"records",
"index",
"table",
"columns",
"values",
] = None
x17: None | [
datasets.ImageDataset,
datasets.TabularDataset,
datasets.TextDataset,
datasets.VideoDataset,
]
class Test:
safe_age: Decimal # the user's age, used to determine if it's safe for them to use ruff
applied_fixes: int # the number of fixes that this user applied. Used for ranking the users with the most applied fixes.
string_annotation: "Test" # a long comment after a quoted, runtime-only type annotation
##########
# Comments
leading: (
# Leading comment
None | dataset.ImageDataset
)
leading_with_value: (
# Leading comment
None | dataset.ImageDataset
) = None
leading_open_parentheses: ( # Leading comment
None | dataset.ImageDataset
)
leading_open_parentheses_with_value: ( # Leading comment
None | dataset.ImageDataset
) = None
trailing: (
None | dataset.ImageDataset # trailing comment
)
trailing_with_value: (
None | dataset.ImageDataset # trailing comment
) = None
trailing_own_line: (
None | dataset.ImageDataset
# trailing own line
)
trailing_own_line_with_value: (
None | dataset.ImageDataset
# trailing own line
) = None
nested_comment: None | [
# a list of strings
str
] = None
```
## Preview changes
```diff
--- Stable
+++ Preview
@@ -1,8 +1,18 @@
-x1: A[b] | EventHandler | EventSpec | list[
- EventHandler | EventSpec
-] | Other | More | AndMore | None = None
+x1: (
+ A[b]
+ | EventHandler
+ | EventSpec
+ | list[EventHandler | EventSpec]
+ | Other
+ | More
+ | AndMore
+ | None
+) = None
-x2: "VeryLongClassNameWithAwkwardGenericSubtype[int] |" "VeryLongClassNameWithAwkwardGenericSubtype[str]"
+x2: (
+ "VeryLongClassNameWithAwkwardGenericSubtype[int] |"
+ "VeryLongClassNameWithAwkwardGenericSubtype[str]"
+)
x6: VeryLongClassNameWithAwkwardGenericSubtype[
integeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeer,
@@ -48,12 +58,16 @@
datasets.VideoDataset,
] = None
-x12: None | [
- datasets.ImageDataset,
- datasets.TabularDataset,
- datasets.TextDataset,
- datasets.VideoDataset,
-] | Other = None
+x12: (
+ None
+ | [
+ datasets.ImageDataset,
+ datasets.TabularDataset,
+ datasets.TextDataset,
+ datasets.VideoDataset,
+ ]
+ | Other
+) = None
x13: [
@@ -75,27 +89,34 @@
datasets.VideoDataset,
] = None
-x15: [
- datasets.ImageDataset,
- datasets.TabularDataset,
- datasets.TextDataset,
- datasets.VideoDataset,
-] | [
- datasets.ImageDataset,
- datasets.TabularDataset,
- datasets.TextDataset,
- datasets.VideoDataset,
-] | Other = None
+x15: (
+ [
+ datasets.ImageDataset,
+ datasets.TabularDataset,
+ datasets.TextDataset,
+ datasets.VideoDataset,
+ ]
+ | [
+ datasets.ImageDataset,
+ datasets.TabularDataset,
+ datasets.TextDataset,
+ datasets.VideoDataset,
+ ]
+ | Other
+) = None
-x16: None | Literal[
- "split",
- "a bit longer",
- "records",
- "index",
- "table",
- "columns",
- "values",
-] = None
+x16: (
+ None
+ | Literal[
+ "split",
+ "a bit longer",
+ "records",
+ "index",
+ "table",
+ "columns",
+ "values",
+ ]
+) = None
x17: None | [
datasets.ImageDataset,
@@ -106,9 +127,13 @@
class Test:
- safe_age: Decimal # the user's age, used to determine if it's safe for them to use ruff
+ safe_age: (
+ Decimal # the user's age, used to determine if it's safe for them to use ruff
+ )
applied_fixes: int # the number of fixes that this user applied. Used for ranking the users with the most applied fixes.
- string_annotation: "Test" # a long comment after a quoted, runtime-only type annotation
+ string_annotation: (
+ "Test" # a long comment after a quoted, runtime-only type annotation
+ )
##########
```