mirror of
https://github.com/astral-sh/ruff.git
synced 2025-08-04 18:58:04 +00:00
Add support for PEP 701 (#7376)
## Summary This PR adds support for PEP 701 in Ruff. This is a rollup PR of all the other individual PRs. The separate PRs were created for logic separation and code reviews. Refer to each pull request for a detail description on the change. Refer to the PR description for the list of pull requests within this PR. ## Test Plan ### Formatter ecosystem checks Explanation for the change in ecosystem check: https://github.com/astral-sh/ruff/pull/7597#issue-1908878183 #### `main` ``` | project | similarity index | total files | changed files | |--------------|------------------:|------------------:|------------------:| | cpython | 0.76083 | 1789 | 1631 | | django | 0.99983 | 2760 | 36 | | transformers | 0.99963 | 2587 | 319 | | twine | 1.00000 | 33 | 0 | | typeshed | 0.99983 | 3496 | 18 | | warehouse | 0.99967 | 648 | 15 | | zulip | 0.99972 | 1437 | 21 | ``` #### `dhruv/pep-701` ``` | project | similarity index | total files | changed files | |--------------|------------------:|------------------:|------------------:| | cpython | 0.76051 | 1789 | 1632 | | django | 0.99983 | 2760 | 36 | | transformers | 0.99963 | 2587 | 319 | | twine | 1.00000 | 33 | 0 | | typeshed | 0.99983 | 3496 | 18 | | warehouse | 0.99967 | 648 | 15 | | zulip | 0.99972 | 1437 | 21 | ```
This commit is contained in:
parent
78b8741352
commit
e62e245c61
115 changed files with 44780 additions and 31370 deletions
|
@ -59,3 +59,23 @@ _ = "abc" + "def" + foo
|
|||
_ = foo + bar + "abc"
|
||||
_ = "abc" + foo + bar
|
||||
_ = foo + "abc" + bar
|
||||
|
||||
# Multiple strings nested inside a f-string
|
||||
_ = f"a {'b' 'c' 'd'} e"
|
||||
_ = f"""abc {"def" "ghi"} jkl"""
|
||||
_ = f"""abc {
|
||||
"def"
|
||||
"ghi"
|
||||
} jkl"""
|
||||
|
||||
# Nested f-strings
|
||||
_ = "a" f"b {f"c" f"d"} e" "f"
|
||||
_ = f"b {f"c" f"d {f"e" f"f"} g"} h"
|
||||
_ = f"b {f"abc" \
|
||||
f"def"} g"
|
||||
|
||||
# Explicitly concatenated nested f-strings
|
||||
_ = f"a {f"first"
|
||||
+ f"second"} d"
|
||||
_ = f"a {f"first {f"middle"}"
|
||||
+ f"second"} d"
|
||||
|
|
|
@ -9,3 +9,33 @@ this_should_raise = (
|
|||
'This is a'
|
||||
'\'string\''
|
||||
)
|
||||
|
||||
# Same as above, but with f-strings
|
||||
f'This is a \'string\'' # Q003
|
||||
f'This is \\ a \\\'string\'' # Q003
|
||||
f'"This" is a \'string\''
|
||||
f"This is a 'string'"
|
||||
f"\"This\" is a 'string'"
|
||||
fr'This is a \'string\''
|
||||
fR'This is a \'string\''
|
||||
foo = (
|
||||
f'This is a'
|
||||
f'\'string\'' # Q003
|
||||
)
|
||||
|
||||
# Nested f-strings (Python 3.12+)
|
||||
#
|
||||
# The first one is interesting because the fix for it is valid pre 3.12:
|
||||
#
|
||||
# f"'foo' {'nested'}"
|
||||
#
|
||||
# but as the actual string itself is invalid pre 3.12, we don't catch it.
|
||||
f'\'foo\' {'nested'}' # Q003
|
||||
f'\'foo\' {f'nested'}' # Q003
|
||||
f'\'foo\' {f'\'nested\''} \'\'' # Q003
|
||||
|
||||
f'normal {f'nested'} normal'
|
||||
f'\'normal\' {f'nested'} normal' # Q003
|
||||
f'\'normal\' {f'nested'} "double quotes"'
|
||||
f'\'normal\' {f'\'nested\' {'other'} normal'} "double quotes"' # Q003
|
||||
f'\'normal\' {f'\'nested\' {'other'} "double quotes"'} normal' # Q00l
|
||||
|
|
|
@ -8,3 +8,32 @@ this_should_raise = (
|
|||
"This is a"
|
||||
"\"string\""
|
||||
)
|
||||
|
||||
# Same as above, but with f-strings
|
||||
f"This is a \"string\""
|
||||
f"'This' is a \"string\""
|
||||
f'This is a "string"'
|
||||
f'\'This\' is a "string"'
|
||||
fr"This is a \"string\""
|
||||
fR"This is a \"string\""
|
||||
foo = (
|
||||
f"This is a"
|
||||
f"\"string\""
|
||||
)
|
||||
|
||||
# Nested f-strings (Python 3.12+)
|
||||
#
|
||||
# The first one is interesting because the fix for it is valid pre 3.12:
|
||||
#
|
||||
# f'"foo" {"nested"}'
|
||||
#
|
||||
# but as the actual string itself is invalid pre 3.12, we don't catch it.
|
||||
f"\"foo\" {"foo"}" # Q003
|
||||
f"\"foo\" {f"foo"}" # Q003
|
||||
f"\"foo\" {f"\"foo\""} \"\"" # Q003
|
||||
|
||||
f"normal {f"nested"} normal"
|
||||
f"\"normal\" {f"nested"} normal" # Q003
|
||||
f"\"normal\" {f"nested"} 'single quotes'"
|
||||
f"\"normal\" {f"\"nested\" {"other"} normal"} 'single quotes'" # Q003
|
||||
f"\"normal\" {f"\"nested\" {"other"} 'single quotes'"} normal" # Q003
|
||||
|
|
|
@ -84,3 +84,8 @@ spam[ ~ham]
|
|||
x = [ #
|
||||
'some value',
|
||||
]
|
||||
|
||||
# F-strings
|
||||
f"{ {'a': 1} }"
|
||||
f"{[ { {'a': 1} } ]}"
|
||||
f"normal { {f"{ { [1, 2] } }" } } normal"
|
||||
|
|
|
@ -29,5 +29,16 @@ mdtypes_template = {
|
|||
'tag_smalldata':[('byte_count_mdtype', 'u4'), ('data', 'S4')],
|
||||
}
|
||||
|
||||
# E231
|
||||
f"{(a,b)}"
|
||||
|
||||
# Okay because it's hard to differentiate between the usages of a colon in a f-string
|
||||
f"{a:=1}"
|
||||
f"{ {'a':1} }"
|
||||
f"{a:.3f}"
|
||||
f"{(a:=1)}"
|
||||
f"{(lambda x:x)}"
|
||||
f"normal{f"{a:.3f}"}normal"
|
||||
|
||||
#: Okay
|
||||
a = (1,
|
||||
|
|
|
@ -48,3 +48,9 @@ def add(a: int=0, b: int =0, c: int= 0) -> int:
|
|||
#: Okay
|
||||
def add(a: int = _default(name='f')):
|
||||
return a
|
||||
|
||||
# F-strings
|
||||
f"{a=}"
|
||||
f"{a:=1}"
|
||||
f"{foo(a=1)}"
|
||||
f"normal {f"{a=}"} normal"
|
||||
|
|
|
@ -152,3 +152,11 @@ x = [
|
|||
multiline string with tab in it, different lines
|
||||
'''
|
||||
" single line string with tab in it"
|
||||
|
||||
f"test{
|
||||
tab_indented_should_be_flagged
|
||||
} <- this tab is fine"
|
||||
|
||||
f"""test{
|
||||
tab_indented_should_be_flagged
|
||||
} <- this tab is fine"""
|
||||
|
|
54
crates/ruff_linter/resources/test/fixtures/pycodestyle/W605_2.py
vendored
Normal file
54
crates/ruff_linter/resources/test/fixtures/pycodestyle/W605_2.py
vendored
Normal file
|
@ -0,0 +1,54 @@
|
|||
# Same as `W605_0.py` but using f-strings instead.
|
||||
|
||||
#: W605:1:10
|
||||
regex = f'\.png$'
|
||||
|
||||
#: W605:2:1
|
||||
regex = f'''
|
||||
\.png$
|
||||
'''
|
||||
|
||||
#: W605:2:6
|
||||
f(
|
||||
f'\_'
|
||||
)
|
||||
|
||||
#: W605:4:6
|
||||
f"""
|
||||
multi-line
|
||||
literal
|
||||
with \_ somewhere
|
||||
in the middle
|
||||
"""
|
||||
|
||||
#: W605:1:38
|
||||
value = f'new line\nand invalid escape \_ here'
|
||||
|
||||
|
||||
#: Okay
|
||||
regex = fr'\.png$'
|
||||
regex = f'\\.png$'
|
||||
regex = fr'''
|
||||
\.png$
|
||||
'''
|
||||
regex = fr'''
|
||||
\\.png$
|
||||
'''
|
||||
s = f'\\'
|
||||
regex = f'\w' # noqa
|
||||
regex = f'''
|
||||
\w
|
||||
''' # noqa
|
||||
|
||||
regex = f'\\\_'
|
||||
value = f'\{{1}}'
|
||||
value = f'\{1}'
|
||||
value = f'{1:\}'
|
||||
value = f"{f"\{1}"}"
|
||||
value = rf"{f"\{1}"}"
|
||||
|
||||
# Okay
|
||||
value = rf'\{{1}}'
|
||||
value = rf'\{1}'
|
||||
value = rf'{1:\}'
|
||||
value = f"{rf"\{1}"}"
|
|
@ -40,7 +40,5 @@ f"{{{{x}}}}"
|
|||
""f""
|
||||
''f""
|
||||
(""f""r"")
|
||||
|
||||
# To be fixed
|
||||
# Error: f-string: single '}' is not allowed at line 41 column 8
|
||||
# f"\{{x}}"
|
||||
f"{v:{f"0.2f"}}"
|
||||
f"\{{x}}"
|
||||
|
|
Binary file not shown.
|
@ -29,3 +29,19 @@ x = "βα Bαd"
|
|||
# consisting of a single ambiguous character, while the second character is a "word
|
||||
# boundary" (whitespace) that it itself ambiguous.
|
||||
x = "Р усский"
|
||||
|
||||
# Same test cases as above but using f-strings instead:
|
||||
x = f"𝐁ad string"
|
||||
x = f"−"
|
||||
x = f"Русский"
|
||||
x = f"βα Bαd"
|
||||
x = f"Р усский"
|
||||
|
||||
# Nested f-strings
|
||||
x = f"𝐁ad string {f" {f"Р усский"}"}"
|
||||
|
||||
# Comments inside f-strings
|
||||
x = f"string { # And here's a comment with an unusual parenthesis: )
|
||||
# And here's a comment with a greek alpha: ∗
|
||||
foo # And here's a comment with an unusual punctuation mark: ᜵
|
||||
}"
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue