mirror of
https://github.com/astral-sh/ruff.git
synced 2025-07-24 05:26:23 +00:00
Parenthesize long type annotations in annotated assignments (#9210)
This commit is contained in:
parent
3cc719bd74
commit
fa2c37b411
8 changed files with 777 additions and 47 deletions
|
@ -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()
|
||||
|
|
|
@ -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
|
||||
+ )
|
||||
```
|
||||
|
||||
|
||||
|
|
|
@ -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
|
||||
+ )
|
||||
|
||||
|
||||
##########
|
||||
```
|
||||
|
||||
|
||||
|
Loading…
Add table
Add a link
Reference in a new issue