mirror of
https://github.com/astral-sh/ruff.git
synced 2025-08-04 02:39:12 +00:00
Hug closing }
when f-string expression has a format specifier (#18704)
This commit is contained in:
parent
2b731d19b9
commit
c22f809049
11 changed files with 323 additions and 198 deletions
|
@ -1,7 +1,6 @@
|
|||
---
|
||||
source: crates/ruff_python_formatter/tests/fixtures.rs
|
||||
input_file: crates/ruff_python_formatter/resources/test/fixtures/black/cases/pep_701.py
|
||||
snapshot_kind: text
|
||||
---
|
||||
## Input
|
||||
|
||||
|
@ -170,7 +169,7 @@ rf"\{"a"}"
|
|||
|
||||
x = """foo {{ {2 + 2}bar
|
||||
baz"""
|
||||
@@ -28,74 +26,62 @@
|
||||
@@ -28,55 +26,48 @@
|
||||
|
||||
x = f"""foo {{ {2 + 2}bar {{ baz"""
|
||||
|
||||
|
@ -242,12 +241,7 @@ rf"\{"a"}"
|
|||
|
||||
f"{2+2=}"
|
||||
f"{2+2 = }"
|
||||
f"{ 2 + 2 = }"
|
||||
|
||||
-f"""foo {
|
||||
- datetime.datetime.now():%Y
|
||||
+f"""foo {datetime.datetime.now():%Y
|
||||
%m
|
||||
@@ -88,14 +79,10 @@
|
||||
%d
|
||||
}"""
|
||||
|
||||
|
@ -264,7 +258,7 @@ rf"\{"a"}"
|
|||
)
|
||||
|
||||
f"`escape` only permitted in {{'html', 'latex', 'latex-math'}}, \
|
||||
@@ -105,8 +91,10 @@
|
||||
@@ -105,8 +92,10 @@
|
||||
rf"\{{\}}"
|
||||
|
||||
f"""
|
||||
|
@ -277,7 +271,7 @@ rf"\{"a"}"
|
|||
"""
|
||||
|
||||
value: str = f"""foo
|
||||
@@ -124,13 +112,15 @@
|
||||
@@ -124,13 +113,15 @@
|
||||
|
||||
f'{{\\"kind\\":\\"ConfigMap\\",\\"metadata\\":{{\\"annotations\\":{{}},\\"name\\":\\"cluster-info\\",\\"namespace\\":\\"amazon-cloudwatch\\"}}}}'
|
||||
|
||||
|
@ -378,7 +372,8 @@ f"{2+2=}"
|
|||
f"{2+2 = }"
|
||||
f"{ 2 + 2 = }"
|
||||
|
||||
f"""foo {datetime.datetime.now():%Y
|
||||
f"""foo {
|
||||
datetime.datetime.now():%Y
|
||||
%m
|
||||
%d
|
||||
}"""
|
||||
|
|
|
@ -248,18 +248,22 @@ f"{ # comment 15
|
|||
}" # comment 19
|
||||
# comment 20
|
||||
|
||||
# Single-quoted f-strings with a format specificer can be multiline
|
||||
f"aaaaaaaaaaaaaaaa bbbbbbbbbbbbbbbbbb ccccccccccc {
|
||||
variable:.3f} ddddddddddddddd eeeeeeee"
|
||||
# The specifier of an f-string must hug the closing `}` because a multiline format specifier is invalid syntax in a single
|
||||
# quoted f-string.
|
||||
f"aaaaaaaaaaaaaaaa bbbbbbbbbbbbbbbbbb ccccccccccc {variable
|
||||
:.3f} ddddddddddddddd eeeeeeee"
|
||||
|
||||
# But, if it's triple-quoted then we can't or the format specificer will have a
|
||||
# trailing newline
|
||||
f"""aaaaaaaaaaaaaaaa bbbbbbbbbbbbbbbbbb ccccccccccc {
|
||||
variable:.3f} ddddddddddddddd eeeeeeee"""
|
||||
# The same applies for triple quoted f-strings, except that we need to preserve the newline before the closing `}`.
|
||||
# or we risk altering the meaning of the f-string.
|
||||
f"""aaaaaaaaaaaaaaaa bbbbbbbbbbbbbbbbbb ccccccccccc {variable
|
||||
:.3f} ddddddddddddddd eeeeeeee"""
|
||||
f"""aaaaaaaaaaaaaaaa bbbbbbbbbbbbbbbbbb ccccccccccc {variable:.3f
|
||||
} ddddddddddddddd eeeeeeee"""
|
||||
|
||||
# But, we can break the ones which don't have a format specifier
|
||||
f"""fooooooooooooooooooo barrrrrrrrrrrrrrrrrrr {
|
||||
xxxxxxxxxxxxxxx:.3f} aaaaaaaaaaaaaaaaa { xxxxxxxxxxxxxxxxxxxx } bbbbbbbbbbbb"""
|
||||
aaaaaaaaaaa = f"""asaaaaaaaaaaaaaaaa {
|
||||
aaaaaaaaaaaa + bbbbbbbbbbbb + ccccccccccccccc + dddddddd
|
||||
# comment
|
||||
:.3f} cccccccccc"""
|
||||
|
||||
# Throw in a random comment in it but surprise, this is not a comment but just a text
|
||||
# which is part of the format specifier
|
||||
|
@ -291,6 +295,13 @@ x = f"{x !s
|
|||
# comment 21
|
||||
}"
|
||||
|
||||
x = f"{
|
||||
x!s:>{
|
||||
0
|
||||
# comment 21-2
|
||||
}}"
|
||||
|
||||
|
||||
x = f"""
|
||||
{ # comment 22
|
||||
x = :.0{y # comment 23
|
||||
|
@ -315,6 +326,21 @@ f"{ # comment 26
|
|||
# comment 28
|
||||
} woah {x}"
|
||||
|
||||
|
||||
f"""{foo
|
||||
:a{
|
||||
a # comment 29
|
||||
# comment 30
|
||||
}
|
||||
}"""
|
||||
|
||||
# Regression test for https://github.com/astral-sh/ruff/issues/18672
|
||||
f"{
|
||||
# comment 31
|
||||
foo
|
||||
:>
|
||||
}"
|
||||
|
||||
# Assignment statement
|
||||
|
||||
# Even though this f-string has multiline expression, thus allowing us to break it at the
|
||||
|
@ -1008,26 +1034,32 @@ f"{ # comment 15
|
|||
}" # comment 19
|
||||
# comment 20
|
||||
|
||||
# Single-quoted f-strings with a format specificer can be multiline
|
||||
# The specifier of an f-string must hug the closing `}` because a multiline format specifier is invalid syntax in a single
|
||||
# quoted f-string.
|
||||
f"aaaaaaaaaaaaaaaa bbbbbbbbbbbbbbbbbb ccccccccccc {
|
||||
variable:.3f} ddddddddddddddd eeeeeeee"
|
||||
|
||||
# The same applies for triple quoted f-strings, except that we need to preserve the newline before the closing `}`.
|
||||
# or we risk altering the meaning of the f-string.
|
||||
f"""aaaaaaaaaaaaaaaa bbbbbbbbbbbbbbbbbb ccccccccccc {
|
||||
variable:.3f} ddddddddddddddd eeeeeeee"""
|
||||
f"""aaaaaaaaaaaaaaaa bbbbbbbbbbbbbbbbbb ccccccccccc {
|
||||
variable:.3f
|
||||
} ddddddddddddddd eeeeeeee"
|
||||
} ddddddddddddddd eeeeeeee"""
|
||||
|
||||
# But, if it's triple-quoted then we can't or the format specificer will have a
|
||||
# trailing newline
|
||||
f"""aaaaaaaaaaaaaaaa bbbbbbbbbbbbbbbbbb ccccccccccc {variable:.3f} ddddddddddddddd eeeeeeee"""
|
||||
|
||||
# But, we can break the ones which don't have a format specifier
|
||||
f"""fooooooooooooooooooo barrrrrrrrrrrrrrrrrrr {xxxxxxxxxxxxxxx:.3f} aaaaaaaaaaaaaaaaa {
|
||||
xxxxxxxxxxxxxxxxxxxx
|
||||
} bbbbbbbbbbbb"""
|
||||
aaaaaaaaaaa = f"""asaaaaaaaaaaaaaaaa {
|
||||
aaaaaaaaaaaa + bbbbbbbbbbbb + ccccccccccccccc + dddddddd
|
||||
# comment
|
||||
:.3f} cccccccccc"""
|
||||
|
||||
# Throw in a random comment in it but surprise, this is not a comment but just a text
|
||||
# which is part of the format specifier
|
||||
aaaaaaaaaaa = f"""asaaaaaaaaaaaaaaaa {aaaaaaaaaaaa + bbbbbbbbbbbb + ccccccccccccccc + dddddddd:.3f
|
||||
aaaaaaaaaaa = f"""asaaaaaaaaaaaaaaaa {
|
||||
aaaaaaaaaaaa + bbbbbbbbbbbb + ccccccccccccccc + dddddddd:.3f
|
||||
# comment
|
||||
} cccccccccc"""
|
||||
aaaaaaaaaaa = f"""asaaaaaaaaaaaaaaaa {aaaaaaaaaaaa + bbbbbbbbbbbb + ccccccccccccccc + dddddddd:.3f
|
||||
aaaaaaaaaaa = f"""asaaaaaaaaaaaaaaaa {
|
||||
aaaaaaaaaaaa + bbbbbbbbbbbb + ccccccccccccccc + dddddddd:.3f
|
||||
# comment} cccccccccc"""
|
||||
|
||||
# Conversion flags
|
||||
|
@ -1047,6 +1079,13 @@ x = f"{
|
|||
# comment 21
|
||||
}"
|
||||
|
||||
x = f"{
|
||||
x!s:>{
|
||||
0
|
||||
# comment 21-2
|
||||
}}"
|
||||
|
||||
|
||||
x = f"""
|
||||
{ # comment 22
|
||||
x = :.0{y # comment 23
|
||||
|
@ -1071,6 +1110,19 @@ f"{ # comment 26
|
|||
# comment 28
|
||||
} woah {x}"
|
||||
|
||||
|
||||
f"""{
|
||||
foo:a{
|
||||
a # comment 29
|
||||
# comment 30
|
||||
}
|
||||
}"""
|
||||
|
||||
# Regression test for https://github.com/astral-sh/ruff/issues/18672
|
||||
f"{
|
||||
# comment 31
|
||||
foo:>}"
|
||||
|
||||
# Assignment statement
|
||||
|
||||
# Even though this f-string has multiline expression, thus allowing us to break it at the
|
||||
|
@ -1236,10 +1288,12 @@ aaaaaaaaaaaaaaaaaa = (
|
|||
)
|
||||
|
||||
# The newline is only considered when it's a tripled-quoted f-string.
|
||||
aaaaaaaaaaaaaaaaaa = f"""testeeeeeeeeeeeeeeeeeeeeeeeee{a:.3f
|
||||
aaaaaaaaaaaaaaaaaa = f"""testeeeeeeeeeeeeeeeeeeeeeeeee{
|
||||
a:.3f
|
||||
}moreeeeeeeeeeeeeeeeeetest""" # comment
|
||||
|
||||
aaaaaaaaaaaaaaaaaa = f"""testeeeeeeeeeeeeeeeeeeeeeeeee{a:.3f
|
||||
aaaaaaaaaaaaaaaaaa = f"""testeeeeeeeeeeeeeeeeeeeeeeeee{
|
||||
a:.3f
|
||||
}moreeeeeeeeeeeeeeeeeetest""" # comment
|
||||
|
||||
# Remove the parentheses here
|
||||
|
@ -1804,26 +1858,32 @@ f"{ # comment 15
|
|||
}" # comment 19
|
||||
# comment 20
|
||||
|
||||
# Single-quoted f-strings with a format specificer can be multiline
|
||||
# The specifier of an f-string must hug the closing `}` because a multiline format specifier is invalid syntax in a single
|
||||
# quoted f-string.
|
||||
f"aaaaaaaaaaaaaaaa bbbbbbbbbbbbbbbbbb ccccccccccc {
|
||||
variable:.3f} ddddddddddddddd eeeeeeee"
|
||||
|
||||
# The same applies for triple quoted f-strings, except that we need to preserve the newline before the closing `}`.
|
||||
# or we risk altering the meaning of the f-string.
|
||||
f"""aaaaaaaaaaaaaaaa bbbbbbbbbbbbbbbbbb ccccccccccc {
|
||||
variable:.3f} ddddddddddddddd eeeeeeee"""
|
||||
f"""aaaaaaaaaaaaaaaa bbbbbbbbbbbbbbbbbb ccccccccccc {
|
||||
variable:.3f
|
||||
} ddddddddddddddd eeeeeeee"
|
||||
} ddddddddddddddd eeeeeeee"""
|
||||
|
||||
# But, if it's triple-quoted then we can't or the format specificer will have a
|
||||
# trailing newline
|
||||
f"""aaaaaaaaaaaaaaaa bbbbbbbbbbbbbbbbbb ccccccccccc {variable:.3f} ddddddddddddddd eeeeeeee"""
|
||||
|
||||
# But, we can break the ones which don't have a format specifier
|
||||
f"""fooooooooooooooooooo barrrrrrrrrrrrrrrrrrr {xxxxxxxxxxxxxxx:.3f} aaaaaaaaaaaaaaaaa {
|
||||
xxxxxxxxxxxxxxxxxxxx
|
||||
} bbbbbbbbbbbb"""
|
||||
aaaaaaaaaaa = f"""asaaaaaaaaaaaaaaaa {
|
||||
aaaaaaaaaaaa + bbbbbbbbbbbb + ccccccccccccccc + dddddddd
|
||||
# comment
|
||||
:.3f} cccccccccc"""
|
||||
|
||||
# Throw in a random comment in it but surprise, this is not a comment but just a text
|
||||
# which is part of the format specifier
|
||||
aaaaaaaaaaa = f"""asaaaaaaaaaaaaaaaa {aaaaaaaaaaaa + bbbbbbbbbbbb + ccccccccccccccc + dddddddd:.3f
|
||||
aaaaaaaaaaa = f"""asaaaaaaaaaaaaaaaa {
|
||||
aaaaaaaaaaaa + bbbbbbbbbbbb + ccccccccccccccc + dddddddd:.3f
|
||||
# comment
|
||||
} cccccccccc"""
|
||||
aaaaaaaaaaa = f"""asaaaaaaaaaaaaaaaa {aaaaaaaaaaaa + bbbbbbbbbbbb + ccccccccccccccc + dddddddd:.3f
|
||||
aaaaaaaaaaa = f"""asaaaaaaaaaaaaaaaa {
|
||||
aaaaaaaaaaaa + bbbbbbbbbbbb + ccccccccccccccc + dddddddd:.3f
|
||||
# comment} cccccccccc"""
|
||||
|
||||
# Conversion flags
|
||||
|
@ -1843,6 +1903,13 @@ x = f"{
|
|||
# comment 21
|
||||
}"
|
||||
|
||||
x = f"{
|
||||
x!s:>{
|
||||
0
|
||||
# comment 21-2
|
||||
}}"
|
||||
|
||||
|
||||
x = f"""
|
||||
{ # comment 22
|
||||
x = :.0{y # comment 23
|
||||
|
@ -1867,6 +1934,19 @@ f"{ # comment 26
|
|||
# comment 28
|
||||
} woah {x}"
|
||||
|
||||
|
||||
f"""{
|
||||
foo:a{
|
||||
a # comment 29
|
||||
# comment 30
|
||||
}
|
||||
}"""
|
||||
|
||||
# Regression test for https://github.com/astral-sh/ruff/issues/18672
|
||||
f"{
|
||||
# comment 31
|
||||
foo:>}"
|
||||
|
||||
# Assignment statement
|
||||
|
||||
# Even though this f-string has multiline expression, thus allowing us to break it at the
|
||||
|
@ -2032,10 +2112,12 @@ aaaaaaaaaaaaaaaaaa = (
|
|||
)
|
||||
|
||||
# The newline is only considered when it's a tripled-quoted f-string.
|
||||
aaaaaaaaaaaaaaaaaa = f"""testeeeeeeeeeeeeeeeeeeeeeeeee{a:.3f
|
||||
aaaaaaaaaaaaaaaaaa = f"""testeeeeeeeeeeeeeeeeeeeeeeeee{
|
||||
a:.3f
|
||||
}moreeeeeeeeeeeeeeeeeetest""" # comment
|
||||
|
||||
aaaaaaaaaaaaaaaaaa = f"""testeeeeeeeeeeeeeeeeeeeeeeeee{a:.3f
|
||||
aaaaaaaaaaaaaaaaaa = f"""testeeeeeeeeeeeeeeeeeeeeeeeee{
|
||||
a:.3f
|
||||
}moreeeeeeeeeeeeeeeeeetest""" # comment
|
||||
|
||||
# Remove the parentheses here
|
||||
|
|
|
@ -246,18 +246,20 @@ t"{ # comment 15
|
|||
}" # comment 19
|
||||
# comment 20
|
||||
|
||||
# Single-quoted t-strings with a format specificer can be multiline
|
||||
# The specifier of a t-string must hug the closing `}` because a multiline format specifier is invalid syntax in a single
|
||||
# quoted f-string.
|
||||
t"aaaaaaaaaaaaaaaa bbbbbbbbbbbbbbbbbb ccccccccccc {
|
||||
variable:.3f} ddddddddddddddd eeeeeeee"
|
||||
variable
|
||||
:.3f} ddddddddddddddd eeeeeeee"
|
||||
|
||||
# But, if it's triple-quoted then we can't or the format specificer will have a
|
||||
# trailing newline
|
||||
t"""aaaaaaaaaaaaaaaa bbbbbbbbbbbbbbbbbb ccccccccccc {
|
||||
variable:.3f} ddddddddddddddd eeeeeeee"""
|
||||
# The same applies for triple quoted t-strings, except that we need to preserve the newline before the closing `}`.
|
||||
# or we risk altering the meaning of the f-string.
|
||||
t"""aaaaaaaaaaaaaaaa bbbbbbbbbbbbbbbbbb ccccccccccc {variable
|
||||
:.3f} ddddddddddddddd eeeeeeee"""
|
||||
t"""aaaaaaaaaaaaaaaa bbbbbbbbbbbbbbbbbb ccccccccccc {variable
|
||||
:.3f
|
||||
} ddddddddddddddd eeeeeeee"""
|
||||
|
||||
# But, we can break the ones which don't have a format specifier
|
||||
t"""fooooooooooooooooooo barrrrrrrrrrrrrrrrrrr {
|
||||
xxxxxxxxxxxxxxx:.3f} aaaaaaaaaaaaaaaaa { xxxxxxxxxxxxxxxxxxxx } bbbbbbbbbbbb"""
|
||||
|
||||
# Throw in a random comment in it but surprise, this is not a comment but just a text
|
||||
# which is part of the format specifier
|
||||
|
@ -289,6 +291,12 @@ x = t"{x !s
|
|||
# comment 21
|
||||
}"
|
||||
|
||||
x = f"{
|
||||
x!s:>{
|
||||
0
|
||||
# comment 21-2
|
||||
}}"
|
||||
|
||||
x = t"""
|
||||
{ # comment 22
|
||||
x = :.0{y # comment 23
|
||||
|
@ -1004,26 +1012,28 @@ t"{ # comment 15
|
|||
}" # comment 19
|
||||
# comment 20
|
||||
|
||||
# Single-quoted t-strings with a format specificer can be multiline
|
||||
# The specifier of a t-string must hug the closing `}` because a multiline format specifier is invalid syntax in a single
|
||||
# quoted f-string.
|
||||
t"aaaaaaaaaaaaaaaa bbbbbbbbbbbbbbbbbb ccccccccccc {
|
||||
variable:.3f} ddddddddddddddd eeeeeeee"
|
||||
|
||||
# The same applies for triple quoted t-strings, except that we need to preserve the newline before the closing `}`.
|
||||
# or we risk altering the meaning of the f-string.
|
||||
t"""aaaaaaaaaaaaaaaa bbbbbbbbbbbbbbbbbb ccccccccccc {
|
||||
variable:.3f} ddddddddddddddd eeeeeeee"""
|
||||
t"""aaaaaaaaaaaaaaaa bbbbbbbbbbbbbbbbbb ccccccccccc {
|
||||
variable:.3f
|
||||
} ddddddddddddddd eeeeeeee"
|
||||
} ddddddddddddddd eeeeeeee"""
|
||||
|
||||
# But, if it's triple-quoted then we can't or the format specificer will have a
|
||||
# trailing newline
|
||||
t"""aaaaaaaaaaaaaaaa bbbbbbbbbbbbbbbbbb ccccccccccc {variable:.3f} ddddddddddddddd eeeeeeee"""
|
||||
|
||||
# But, we can break the ones which don't have a format specifier
|
||||
t"""fooooooooooooooooooo barrrrrrrrrrrrrrrrrrr {xxxxxxxxxxxxxxx:.3f} aaaaaaaaaaaaaaaaa {
|
||||
xxxxxxxxxxxxxxxxxxxx
|
||||
} bbbbbbbbbbbb"""
|
||||
|
||||
# Throw in a random comment in it but surprise, this is not a comment but just a text
|
||||
# which is part of the format specifier
|
||||
aaaaaaaaaaa = t"""asaaaaaaaaaaaaaaaa {aaaaaaaaaaaa + bbbbbbbbbbbb + ccccccccccccccc + dddddddd:.3f
|
||||
aaaaaaaaaaa = t"""asaaaaaaaaaaaaaaaa {
|
||||
aaaaaaaaaaaa + bbbbbbbbbbbb + ccccccccccccccc + dddddddd:.3f
|
||||
# comment
|
||||
} cccccccccc"""
|
||||
aaaaaaaaaaa = t"""asaaaaaaaaaaaaaaaa {aaaaaaaaaaaa + bbbbbbbbbbbb + ccccccccccccccc + dddddddd:.3f
|
||||
aaaaaaaaaaa = t"""asaaaaaaaaaaaaaaaa {
|
||||
aaaaaaaaaaaa + bbbbbbbbbbbb + ccccccccccccccc + dddddddd:.3f
|
||||
# comment} cccccccccc"""
|
||||
|
||||
# Conversion flags
|
||||
|
@ -1043,6 +1053,12 @@ x = t"{
|
|||
# comment 21
|
||||
}"
|
||||
|
||||
x = f"{
|
||||
x!s:>{
|
||||
0
|
||||
# comment 21-2
|
||||
}}"
|
||||
|
||||
x = t"""
|
||||
{ # comment 22
|
||||
x = :.0{y # comment 23
|
||||
|
@ -1232,10 +1248,12 @@ aaaaaaaaaaaaaaaaaa = (
|
|||
)
|
||||
|
||||
# The newline is only considered when it's a tripled-quoted t-string.
|
||||
aaaaaaaaaaaaaaaaaa = t"""testeeeeeeeeeeeeeeeeeeeeeeeee{a:.3f
|
||||
aaaaaaaaaaaaaaaaaa = t"""testeeeeeeeeeeeeeeeeeeeeeeeee{
|
||||
a:.3f
|
||||
}moreeeeeeeeeeeeeeeeeetest""" # comment
|
||||
|
||||
aaaaaaaaaaaaaaaaaa = t"""testeeeeeeeeeeeeeeeeeeeeeeeee{a:.3f
|
||||
aaaaaaaaaaaaaaaaaa = t"""testeeeeeeeeeeeeeeeeeeeeeeeee{
|
||||
a:.3f
|
||||
}moreeeeeeeeeeeeeeeeeetest""" # comment
|
||||
|
||||
# Remove the parentheses here
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue