Compare commits
1 Commits
pythonplus
...
import-cas
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
8d54302e05 |
@@ -0,0 +1,22 @@
|
|||||||
|
x = 123456789 .bit_count()
|
||||||
|
x = (123456).__abs__()
|
||||||
|
x = .1.is_integer()
|
||||||
|
x = 1. .imag
|
||||||
|
x = 1E+1.imag
|
||||||
|
x = 1E-1.real
|
||||||
|
x = 123456789.123456789.hex()
|
||||||
|
x = 123456789.123456789E123456789 .real
|
||||||
|
x = 123456789E123456789 .conjugate()
|
||||||
|
x = 123456789J.real
|
||||||
|
x = 123456789.123456789J.__add__(0b1011.bit_length())
|
||||||
|
x = 0XB1ACC.conjugate()
|
||||||
|
x = 0B1011 .conjugate()
|
||||||
|
x = 0O777 .real
|
||||||
|
x = 0.000000006 .hex()
|
||||||
|
x = -100.0000J
|
||||||
|
|
||||||
|
if 10 .real:
|
||||||
|
...
|
||||||
|
|
||||||
|
y = 100[no]
|
||||||
|
y = 100(no)
|
||||||
@@ -0,0 +1,22 @@
|
|||||||
|
x = (123456789).bit_count()
|
||||||
|
x = (123456).__abs__()
|
||||||
|
x = (0.1).is_integer()
|
||||||
|
x = (1.0).imag
|
||||||
|
x = (1e1).imag
|
||||||
|
x = (1e-1).real
|
||||||
|
x = (123456789.123456789).hex()
|
||||||
|
x = (123456789.123456789e123456789).real
|
||||||
|
x = (123456789e123456789).conjugate()
|
||||||
|
x = 123456789j.real
|
||||||
|
x = 123456789.123456789j.__add__(0b1011.bit_length())
|
||||||
|
x = 0xB1ACC.conjugate()
|
||||||
|
x = 0b1011.conjugate()
|
||||||
|
x = 0o777.real
|
||||||
|
x = (0.000000006).hex()
|
||||||
|
x = -100.0000j
|
||||||
|
|
||||||
|
if (10).real:
|
||||||
|
...
|
||||||
|
|
||||||
|
y = 100[no]
|
||||||
|
y = 100(no)
|
||||||
7
crates/ruff_python_formatter/resources/test/fixtures/black/cases/beginning_backslash.py
vendored
Normal file
7
crates/ruff_python_formatter/resources/test/fixtures/black/cases/beginning_backslash.py
vendored
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
\
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
print("hello, world")
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
print("hello, world")
|
||||||
6
crates/ruff_python_formatter/resources/test/fixtures/black/cases/bracketmatch.py
vendored
Normal file
6
crates/ruff_python_formatter/resources/test/fixtures/black/cases/bracketmatch.py
vendored
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
for ((x in {}) or {})['a'] in x:
|
||||||
|
pass
|
||||||
|
pem_spam = lambda l, spam = {
|
||||||
|
"x": 3
|
||||||
|
}: not spam.get(l.strip())
|
||||||
|
lambda x=lambda y={1: 3}: y['x':lambda y: {1: 2}]: x
|
||||||
4
crates/ruff_python_formatter/resources/test/fixtures/black/cases/bracketmatch.py.expect
vendored
Normal file
4
crates/ruff_python_formatter/resources/test/fixtures/black/cases/bracketmatch.py.expect
vendored
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
for ((x in {}) or {})["a"] in x:
|
||||||
|
pass
|
||||||
|
pem_spam = lambda l, spam={"x": 3}: not spam.get(l.strip())
|
||||||
|
lambda x=lambda y={1: 3}: y["x" : lambda y: {1: 2}]: x
|
||||||
14
crates/ruff_python_formatter/resources/test/fixtures/black/cases/bytes_docstring.py
vendored
Normal file
14
crates/ruff_python_formatter/resources/test/fixtures/black/cases/bytes_docstring.py
vendored
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
def bitey():
|
||||||
|
b" not a docstring"
|
||||||
|
|
||||||
|
def bitey2():
|
||||||
|
b' also not a docstring'
|
||||||
|
|
||||||
|
def triple_quoted_bytes():
|
||||||
|
b""" not a docstring"""
|
||||||
|
|
||||||
|
def triple_quoted_bytes2():
|
||||||
|
b''' also not a docstring'''
|
||||||
|
|
||||||
|
def capitalized_bytes():
|
||||||
|
B" NOT A DOCSTRING"
|
||||||
18
crates/ruff_python_formatter/resources/test/fixtures/black/cases/bytes_docstring.py.expect
vendored
Normal file
18
crates/ruff_python_formatter/resources/test/fixtures/black/cases/bytes_docstring.py.expect
vendored
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
def bitey():
|
||||||
|
b" not a docstring"
|
||||||
|
|
||||||
|
|
||||||
|
def bitey2():
|
||||||
|
b" also not a docstring"
|
||||||
|
|
||||||
|
|
||||||
|
def triple_quoted_bytes():
|
||||||
|
b""" not a docstring"""
|
||||||
|
|
||||||
|
|
||||||
|
def triple_quoted_bytes2():
|
||||||
|
b""" also not a docstring"""
|
||||||
|
|
||||||
|
|
||||||
|
def capitalized_bytes():
|
||||||
|
b" NOT A DOCSTRING"
|
||||||
23
crates/ruff_python_formatter/resources/test/fixtures/black/cases/class_blank_parentheses.py
vendored
Normal file
23
crates/ruff_python_formatter/resources/test/fixtures/black/cases/class_blank_parentheses.py
vendored
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
class SimpleClassWithBlankParentheses():
|
||||||
|
pass
|
||||||
|
class ClassWithSpaceParentheses ( ):
|
||||||
|
first_test_data = 90
|
||||||
|
second_test_data = 100
|
||||||
|
def test_func(self):
|
||||||
|
return None
|
||||||
|
class ClassWithEmptyFunc(object):
|
||||||
|
|
||||||
|
def func_with_blank_parentheses():
|
||||||
|
return 5
|
||||||
|
|
||||||
|
|
||||||
|
def public_func_with_blank_parentheses():
|
||||||
|
return None
|
||||||
|
def class_under_the_func_with_blank_parentheses():
|
||||||
|
class InsideFunc():
|
||||||
|
pass
|
||||||
|
class NormalClass (
|
||||||
|
):
|
||||||
|
def func_for_testing(self, first, second):
|
||||||
|
sum = first + second
|
||||||
|
return sum
|
||||||
@@ -0,0 +1,30 @@
|
|||||||
|
class SimpleClassWithBlankParentheses:
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
class ClassWithSpaceParentheses:
|
||||||
|
first_test_data = 90
|
||||||
|
second_test_data = 100
|
||||||
|
|
||||||
|
def test_func(self):
|
||||||
|
return None
|
||||||
|
|
||||||
|
|
||||||
|
class ClassWithEmptyFunc(object):
|
||||||
|
def func_with_blank_parentheses():
|
||||||
|
return 5
|
||||||
|
|
||||||
|
|
||||||
|
def public_func_with_blank_parentheses():
|
||||||
|
return None
|
||||||
|
|
||||||
|
|
||||||
|
def class_under_the_func_with_blank_parentheses():
|
||||||
|
class InsideFunc:
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
class NormalClass:
|
||||||
|
def func_for_testing(self, first, second):
|
||||||
|
sum = first + second
|
||||||
|
return sum
|
||||||
100
crates/ruff_python_formatter/resources/test/fixtures/black/cases/class_methods_new_line.py
vendored
Normal file
100
crates/ruff_python_formatter/resources/test/fixtures/black/cases/class_methods_new_line.py
vendored
Normal file
@@ -0,0 +1,100 @@
|
|||||||
|
class ClassSimplest:
|
||||||
|
pass
|
||||||
|
class ClassWithSingleField:
|
||||||
|
a = 1
|
||||||
|
class ClassWithJustTheDocstring:
|
||||||
|
"""Just a docstring."""
|
||||||
|
class ClassWithInit:
|
||||||
|
def __init__(self):
|
||||||
|
pass
|
||||||
|
class ClassWithTheDocstringAndInit:
|
||||||
|
"""Just a docstring."""
|
||||||
|
def __init__(self):
|
||||||
|
pass
|
||||||
|
class ClassWithInitAndVars:
|
||||||
|
cls_var = 100
|
||||||
|
def __init__(self):
|
||||||
|
pass
|
||||||
|
class ClassWithInitAndVarsAndDocstring:
|
||||||
|
"""Test class"""
|
||||||
|
cls_var = 100
|
||||||
|
def __init__(self):
|
||||||
|
pass
|
||||||
|
class ClassWithDecoInit:
|
||||||
|
@deco
|
||||||
|
def __init__(self):
|
||||||
|
pass
|
||||||
|
class ClassWithDecoInitAndVars:
|
||||||
|
cls_var = 100
|
||||||
|
@deco
|
||||||
|
def __init__(self):
|
||||||
|
pass
|
||||||
|
class ClassWithDecoInitAndVarsAndDocstring:
|
||||||
|
"""Test class"""
|
||||||
|
cls_var = 100
|
||||||
|
@deco
|
||||||
|
def __init__(self):
|
||||||
|
pass
|
||||||
|
class ClassSimplestWithInner:
|
||||||
|
class Inner:
|
||||||
|
pass
|
||||||
|
class ClassSimplestWithInnerWithDocstring:
|
||||||
|
class Inner:
|
||||||
|
"""Just a docstring."""
|
||||||
|
def __init__(self):
|
||||||
|
pass
|
||||||
|
class ClassWithSingleFieldWithInner:
|
||||||
|
a = 1
|
||||||
|
class Inner:
|
||||||
|
pass
|
||||||
|
class ClassWithJustTheDocstringWithInner:
|
||||||
|
"""Just a docstring."""
|
||||||
|
class Inner:
|
||||||
|
pass
|
||||||
|
class ClassWithInitWithInner:
|
||||||
|
class Inner:
|
||||||
|
pass
|
||||||
|
def __init__(self):
|
||||||
|
pass
|
||||||
|
class ClassWithInitAndVarsWithInner:
|
||||||
|
cls_var = 100
|
||||||
|
class Inner:
|
||||||
|
pass
|
||||||
|
def __init__(self):
|
||||||
|
pass
|
||||||
|
class ClassWithInitAndVarsAndDocstringWithInner:
|
||||||
|
"""Test class"""
|
||||||
|
cls_var = 100
|
||||||
|
class Inner:
|
||||||
|
pass
|
||||||
|
def __init__(self):
|
||||||
|
pass
|
||||||
|
class ClassWithDecoInitWithInner:
|
||||||
|
class Inner:
|
||||||
|
pass
|
||||||
|
@deco
|
||||||
|
def __init__(self):
|
||||||
|
pass
|
||||||
|
class ClassWithDecoInitAndVarsWithInner:
|
||||||
|
cls_var = 100
|
||||||
|
class Inner:
|
||||||
|
pass
|
||||||
|
@deco
|
||||||
|
def __init__(self):
|
||||||
|
pass
|
||||||
|
class ClassWithDecoInitAndVarsAndDocstringWithInner:
|
||||||
|
"""Test class"""
|
||||||
|
cls_var = 100
|
||||||
|
class Inner:
|
||||||
|
pass
|
||||||
|
@deco
|
||||||
|
def __init__(self):
|
||||||
|
pass
|
||||||
|
class ClassWithDecoInitAndVarsAndDocstringWithInner2:
|
||||||
|
"""Test class"""
|
||||||
|
class Inner:
|
||||||
|
pass
|
||||||
|
cls_var = 100
|
||||||
|
@deco
|
||||||
|
def __init__(self):
|
||||||
|
pass
|
||||||
165
crates/ruff_python_formatter/resources/test/fixtures/black/cases/class_methods_new_line.py.expect
vendored
Normal file
165
crates/ruff_python_formatter/resources/test/fixtures/black/cases/class_methods_new_line.py.expect
vendored
Normal file
@@ -0,0 +1,165 @@
|
|||||||
|
class ClassSimplest:
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
class ClassWithSingleField:
|
||||||
|
a = 1
|
||||||
|
|
||||||
|
|
||||||
|
class ClassWithJustTheDocstring:
|
||||||
|
"""Just a docstring."""
|
||||||
|
|
||||||
|
|
||||||
|
class ClassWithInit:
|
||||||
|
def __init__(self):
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
class ClassWithTheDocstringAndInit:
|
||||||
|
"""Just a docstring."""
|
||||||
|
|
||||||
|
def __init__(self):
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
class ClassWithInitAndVars:
|
||||||
|
cls_var = 100
|
||||||
|
|
||||||
|
def __init__(self):
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
class ClassWithInitAndVarsAndDocstring:
|
||||||
|
"""Test class"""
|
||||||
|
|
||||||
|
cls_var = 100
|
||||||
|
|
||||||
|
def __init__(self):
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
class ClassWithDecoInit:
|
||||||
|
@deco
|
||||||
|
def __init__(self):
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
class ClassWithDecoInitAndVars:
|
||||||
|
cls_var = 100
|
||||||
|
|
||||||
|
@deco
|
||||||
|
def __init__(self):
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
class ClassWithDecoInitAndVarsAndDocstring:
|
||||||
|
"""Test class"""
|
||||||
|
|
||||||
|
cls_var = 100
|
||||||
|
|
||||||
|
@deco
|
||||||
|
def __init__(self):
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
class ClassSimplestWithInner:
|
||||||
|
class Inner:
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
class ClassSimplestWithInnerWithDocstring:
|
||||||
|
class Inner:
|
||||||
|
"""Just a docstring."""
|
||||||
|
|
||||||
|
def __init__(self):
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
class ClassWithSingleFieldWithInner:
|
||||||
|
a = 1
|
||||||
|
|
||||||
|
class Inner:
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
class ClassWithJustTheDocstringWithInner:
|
||||||
|
"""Just a docstring."""
|
||||||
|
|
||||||
|
class Inner:
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
class ClassWithInitWithInner:
|
||||||
|
class Inner:
|
||||||
|
pass
|
||||||
|
|
||||||
|
def __init__(self):
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
class ClassWithInitAndVarsWithInner:
|
||||||
|
cls_var = 100
|
||||||
|
|
||||||
|
class Inner:
|
||||||
|
pass
|
||||||
|
|
||||||
|
def __init__(self):
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
class ClassWithInitAndVarsAndDocstringWithInner:
|
||||||
|
"""Test class"""
|
||||||
|
|
||||||
|
cls_var = 100
|
||||||
|
|
||||||
|
class Inner:
|
||||||
|
pass
|
||||||
|
|
||||||
|
def __init__(self):
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
class ClassWithDecoInitWithInner:
|
||||||
|
class Inner:
|
||||||
|
pass
|
||||||
|
|
||||||
|
@deco
|
||||||
|
def __init__(self):
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
class ClassWithDecoInitAndVarsWithInner:
|
||||||
|
cls_var = 100
|
||||||
|
|
||||||
|
class Inner:
|
||||||
|
pass
|
||||||
|
|
||||||
|
@deco
|
||||||
|
def __init__(self):
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
class ClassWithDecoInitAndVarsAndDocstringWithInner:
|
||||||
|
"""Test class"""
|
||||||
|
|
||||||
|
cls_var = 100
|
||||||
|
|
||||||
|
class Inner:
|
||||||
|
pass
|
||||||
|
|
||||||
|
@deco
|
||||||
|
def __init__(self):
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
class ClassWithDecoInitAndVarsAndDocstringWithInner2:
|
||||||
|
"""Test class"""
|
||||||
|
|
||||||
|
class Inner:
|
||||||
|
pass
|
||||||
|
|
||||||
|
cls_var = 100
|
||||||
|
|
||||||
|
@deco
|
||||||
|
def __init__(self):
|
||||||
|
pass
|
||||||
71
crates/ruff_python_formatter/resources/test/fixtures/black/cases/collections.py
vendored
Normal file
71
crates/ruff_python_formatter/resources/test/fixtures/black/cases/collections.py
vendored
Normal file
@@ -0,0 +1,71 @@
|
|||||||
|
import core, time, a
|
||||||
|
|
||||||
|
from . import A, B, C
|
||||||
|
|
||||||
|
# keeps existing trailing comma
|
||||||
|
from foo import (
|
||||||
|
bar,
|
||||||
|
)
|
||||||
|
|
||||||
|
# also keeps existing structure
|
||||||
|
from foo import (
|
||||||
|
baz,
|
||||||
|
qux,
|
||||||
|
)
|
||||||
|
|
||||||
|
# `as` works as well
|
||||||
|
from foo import (
|
||||||
|
xyzzy as magic,
|
||||||
|
)
|
||||||
|
|
||||||
|
a = {1,2,3,}
|
||||||
|
b = {
|
||||||
|
1,2,
|
||||||
|
3}
|
||||||
|
c = {
|
||||||
|
1,
|
||||||
|
2,
|
||||||
|
3,
|
||||||
|
}
|
||||||
|
x = 1,
|
||||||
|
y = narf(),
|
||||||
|
nested = {(1,2,3),(4,5,6),}
|
||||||
|
nested_no_trailing_comma = {(1,2,3),(4,5,6)}
|
||||||
|
nested_long_lines = ["aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", "cccccccccccccccccccccccccccccccccccccccc", (1, 2, 3), "dddddddddddddddddddddddddddddddddddddddd"]
|
||||||
|
{"oneple": (1,),}
|
||||||
|
{"oneple": (1,)}
|
||||||
|
['ls', 'lsoneple/%s' % (foo,)]
|
||||||
|
x = {"oneple": (1,)}
|
||||||
|
y = {"oneple": (1,),}
|
||||||
|
assert False, ("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa wraps %s" % bar)
|
||||||
|
|
||||||
|
# looping over a 1-tuple should also not get wrapped
|
||||||
|
for x in (1,):
|
||||||
|
pass
|
||||||
|
for (x,) in (1,), (2,), (3,):
|
||||||
|
pass
|
||||||
|
|
||||||
|
[1, 2, 3,]
|
||||||
|
|
||||||
|
division_result_tuple = (6/2,)
|
||||||
|
print("foo %r", (foo.bar,))
|
||||||
|
|
||||||
|
if True:
|
||||||
|
IGNORED_TYPES_FOR_ATTRIBUTE_CHECKING = (
|
||||||
|
Config.IGNORED_TYPES_FOR_ATTRIBUTE_CHECKING
|
||||||
|
| {pylons.controllers.WSGIController}
|
||||||
|
)
|
||||||
|
|
||||||
|
if True:
|
||||||
|
ec2client.get_waiter('instance_stopped').wait(
|
||||||
|
InstanceIds=[instance.id],
|
||||||
|
WaiterConfig={
|
||||||
|
'Delay': 5,
|
||||||
|
})
|
||||||
|
ec2client.get_waiter("instance_stopped").wait(
|
||||||
|
InstanceIds=[instance.id],
|
||||||
|
WaiterConfig={"Delay": 5,},
|
||||||
|
)
|
||||||
|
ec2client.get_waiter("instance_stopped").wait(
|
||||||
|
InstanceIds=[instance.id], WaiterConfig={"Delay": 5,},
|
||||||
|
)
|
||||||
99
crates/ruff_python_formatter/resources/test/fixtures/black/cases/collections.py.expect
vendored
Normal file
99
crates/ruff_python_formatter/resources/test/fixtures/black/cases/collections.py.expect
vendored
Normal file
@@ -0,0 +1,99 @@
|
|||||||
|
import core, time, a
|
||||||
|
|
||||||
|
from . import A, B, C
|
||||||
|
|
||||||
|
# keeps existing trailing comma
|
||||||
|
from foo import (
|
||||||
|
bar,
|
||||||
|
)
|
||||||
|
|
||||||
|
# also keeps existing structure
|
||||||
|
from foo import (
|
||||||
|
baz,
|
||||||
|
qux,
|
||||||
|
)
|
||||||
|
|
||||||
|
# `as` works as well
|
||||||
|
from foo import (
|
||||||
|
xyzzy as magic,
|
||||||
|
)
|
||||||
|
|
||||||
|
a = {
|
||||||
|
1,
|
||||||
|
2,
|
||||||
|
3,
|
||||||
|
}
|
||||||
|
b = {1, 2, 3}
|
||||||
|
c = {
|
||||||
|
1,
|
||||||
|
2,
|
||||||
|
3,
|
||||||
|
}
|
||||||
|
x = (1,)
|
||||||
|
y = (narf(),)
|
||||||
|
nested = {
|
||||||
|
(1, 2, 3),
|
||||||
|
(4, 5, 6),
|
||||||
|
}
|
||||||
|
nested_no_trailing_comma = {(1, 2, 3), (4, 5, 6)}
|
||||||
|
nested_long_lines = [
|
||||||
|
"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
|
||||||
|
"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
|
||||||
|
"cccccccccccccccccccccccccccccccccccccccc",
|
||||||
|
(1, 2, 3),
|
||||||
|
"dddddddddddddddddddddddddddddddddddddddd",
|
||||||
|
]
|
||||||
|
{
|
||||||
|
"oneple": (1,),
|
||||||
|
}
|
||||||
|
{"oneple": (1,)}
|
||||||
|
["ls", "lsoneple/%s" % (foo,)]
|
||||||
|
x = {"oneple": (1,)}
|
||||||
|
y = {
|
||||||
|
"oneple": (1,),
|
||||||
|
}
|
||||||
|
assert False, (
|
||||||
|
"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa wraps %s"
|
||||||
|
% bar
|
||||||
|
)
|
||||||
|
|
||||||
|
# looping over a 1-tuple should also not get wrapped
|
||||||
|
for x in (1,):
|
||||||
|
pass
|
||||||
|
for (x,) in (1,), (2,), (3,):
|
||||||
|
pass
|
||||||
|
|
||||||
|
[
|
||||||
|
1,
|
||||||
|
2,
|
||||||
|
3,
|
||||||
|
]
|
||||||
|
|
||||||
|
division_result_tuple = (6 / 2,)
|
||||||
|
print("foo %r", (foo.bar,))
|
||||||
|
|
||||||
|
if True:
|
||||||
|
IGNORED_TYPES_FOR_ATTRIBUTE_CHECKING = (
|
||||||
|
Config.IGNORED_TYPES_FOR_ATTRIBUTE_CHECKING
|
||||||
|
| {pylons.controllers.WSGIController}
|
||||||
|
)
|
||||||
|
|
||||||
|
if True:
|
||||||
|
ec2client.get_waiter("instance_stopped").wait(
|
||||||
|
InstanceIds=[instance.id],
|
||||||
|
WaiterConfig={
|
||||||
|
"Delay": 5,
|
||||||
|
},
|
||||||
|
)
|
||||||
|
ec2client.get_waiter("instance_stopped").wait(
|
||||||
|
InstanceIds=[instance.id],
|
||||||
|
WaiterConfig={
|
||||||
|
"Delay": 5,
|
||||||
|
},
|
||||||
|
)
|
||||||
|
ec2client.get_waiter("instance_stopped").wait(
|
||||||
|
InstanceIds=[instance.id],
|
||||||
|
WaiterConfig={
|
||||||
|
"Delay": 5,
|
||||||
|
},
|
||||||
|
)
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
def bob(): \
|
||||||
|
# pylint: disable=W9016
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
def bobtwo(): \
|
||||||
|
\
|
||||||
|
# some comment here
|
||||||
|
pass
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
def bob(): # pylint: disable=W9016
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
def bobtwo(): # some comment here
|
||||||
|
pass
|
||||||
96
crates/ruff_python_formatter/resources/test/fixtures/black/cases/comments.py
vendored
Normal file
96
crates/ruff_python_formatter/resources/test/fixtures/black/cases/comments.py
vendored
Normal file
@@ -0,0 +1,96 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
# fmt: on
|
||||||
|
# Some license here.
|
||||||
|
#
|
||||||
|
# Has many lines. Many, many lines.
|
||||||
|
# Many, many, many lines.
|
||||||
|
"""Module docstring.
|
||||||
|
|
||||||
|
Possibly also many, many lines.
|
||||||
|
"""
|
||||||
|
|
||||||
|
import os.path
|
||||||
|
import sys
|
||||||
|
|
||||||
|
import a
|
||||||
|
from b.c import X # some noqa comment
|
||||||
|
|
||||||
|
try:
|
||||||
|
import fast
|
||||||
|
except ImportError:
|
||||||
|
import slow as fast
|
||||||
|
|
||||||
|
|
||||||
|
# Some comment before a function.
|
||||||
|
y = 1
|
||||||
|
(
|
||||||
|
# some strings
|
||||||
|
y # type: ignore
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
def function(default=None):
|
||||||
|
"""Docstring comes first.
|
||||||
|
|
||||||
|
Possibly many lines.
|
||||||
|
"""
|
||||||
|
# FIXME: Some comment about why this function is crap but still in production.
|
||||||
|
import inner_imports
|
||||||
|
|
||||||
|
if inner_imports.are_evil():
|
||||||
|
# Explains why we have this if.
|
||||||
|
# In great detail indeed.
|
||||||
|
x = X()
|
||||||
|
return x.method1() # type: ignore
|
||||||
|
|
||||||
|
# This return is also commented for some reason.
|
||||||
|
return default
|
||||||
|
|
||||||
|
|
||||||
|
# Explains why we use global state.
|
||||||
|
GLOBAL_STATE = {"a": a(1), "b": a(2), "c": a(3)}
|
||||||
|
|
||||||
|
|
||||||
|
# Another comment!
|
||||||
|
# This time two lines.
|
||||||
|
|
||||||
|
|
||||||
|
class Foo:
|
||||||
|
"""Docstring for class Foo. Example from Sphinx docs."""
|
||||||
|
|
||||||
|
#: Doc comment for class attribute Foo.bar.
|
||||||
|
#: It can have multiple lines.
|
||||||
|
bar = 1
|
||||||
|
|
||||||
|
flox = 1.5 #: Doc comment for Foo.flox. One line only.
|
||||||
|
|
||||||
|
baz = 2
|
||||||
|
"""Docstring for class attribute Foo.baz."""
|
||||||
|
|
||||||
|
def __init__(self):
|
||||||
|
#: Doc comment for instance attribute qux.
|
||||||
|
self.qux = 3
|
||||||
|
|
||||||
|
self.spam = 4
|
||||||
|
"""Docstring for instance attribute spam."""
|
||||||
|
|
||||||
|
|
||||||
|
#' <h1>This is pweave!</h1>
|
||||||
|
|
||||||
|
|
||||||
|
@fast(really=True)
|
||||||
|
async def wat():
|
||||||
|
# This comment, for some reason \
|
||||||
|
# contains a trailing backslash.
|
||||||
|
async with X.open_async() as x: # Some more comments
|
||||||
|
result = await x.method1()
|
||||||
|
# Comment after ending a block.
|
||||||
|
if result:
|
||||||
|
print("A OK", file=sys.stdout)
|
||||||
|
# Comment between things.
|
||||||
|
print()
|
||||||
|
|
||||||
|
|
||||||
|
# Some closing comments.
|
||||||
|
# Maybe Vim or Emacs directives for formatting.
|
||||||
|
# Who knows.
|
||||||
96
crates/ruff_python_formatter/resources/test/fixtures/black/cases/comments.py.expect
vendored
Normal file
96
crates/ruff_python_formatter/resources/test/fixtures/black/cases/comments.py.expect
vendored
Normal file
@@ -0,0 +1,96 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
# fmt: on
|
||||||
|
# Some license here.
|
||||||
|
#
|
||||||
|
# Has many lines. Many, many lines.
|
||||||
|
# Many, many, many lines.
|
||||||
|
"""Module docstring.
|
||||||
|
|
||||||
|
Possibly also many, many lines.
|
||||||
|
"""
|
||||||
|
|
||||||
|
import os.path
|
||||||
|
import sys
|
||||||
|
|
||||||
|
import a
|
||||||
|
from b.c import X # some noqa comment
|
||||||
|
|
||||||
|
try:
|
||||||
|
import fast
|
||||||
|
except ImportError:
|
||||||
|
import slow as fast
|
||||||
|
|
||||||
|
|
||||||
|
# Some comment before a function.
|
||||||
|
y = 1
|
||||||
|
(
|
||||||
|
# some strings
|
||||||
|
y # type: ignore
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
def function(default=None):
|
||||||
|
"""Docstring comes first.
|
||||||
|
|
||||||
|
Possibly many lines.
|
||||||
|
"""
|
||||||
|
# FIXME: Some comment about why this function is crap but still in production.
|
||||||
|
import inner_imports
|
||||||
|
|
||||||
|
if inner_imports.are_evil():
|
||||||
|
# Explains why we have this if.
|
||||||
|
# In great detail indeed.
|
||||||
|
x = X()
|
||||||
|
return x.method1() # type: ignore
|
||||||
|
|
||||||
|
# This return is also commented for some reason.
|
||||||
|
return default
|
||||||
|
|
||||||
|
|
||||||
|
# Explains why we use global state.
|
||||||
|
GLOBAL_STATE = {"a": a(1), "b": a(2), "c": a(3)}
|
||||||
|
|
||||||
|
|
||||||
|
# Another comment!
|
||||||
|
# This time two lines.
|
||||||
|
|
||||||
|
|
||||||
|
class Foo:
|
||||||
|
"""Docstring for class Foo. Example from Sphinx docs."""
|
||||||
|
|
||||||
|
#: Doc comment for class attribute Foo.bar.
|
||||||
|
#: It can have multiple lines.
|
||||||
|
bar = 1
|
||||||
|
|
||||||
|
flox = 1.5 #: Doc comment for Foo.flox. One line only.
|
||||||
|
|
||||||
|
baz = 2
|
||||||
|
"""Docstring for class attribute Foo.baz."""
|
||||||
|
|
||||||
|
def __init__(self):
|
||||||
|
#: Doc comment for instance attribute qux.
|
||||||
|
self.qux = 3
|
||||||
|
|
||||||
|
self.spam = 4
|
||||||
|
"""Docstring for instance attribute spam."""
|
||||||
|
|
||||||
|
|
||||||
|
#' <h1>This is pweave!</h1>
|
||||||
|
|
||||||
|
|
||||||
|
@fast(really=True)
|
||||||
|
async def wat():
|
||||||
|
# This comment, for some reason \
|
||||||
|
# contains a trailing backslash.
|
||||||
|
async with X.open_async() as x: # Some more comments
|
||||||
|
result = await x.method1()
|
||||||
|
# Comment after ending a block.
|
||||||
|
if result:
|
||||||
|
print("A OK", file=sys.stdout)
|
||||||
|
# Comment between things.
|
||||||
|
print()
|
||||||
|
|
||||||
|
|
||||||
|
# Some closing comments.
|
||||||
|
# Maybe Vim or Emacs directives for formatting.
|
||||||
|
# Who knows.
|
||||||
168
crates/ruff_python_formatter/resources/test/fixtures/black/cases/comments2.py
vendored
Normal file
168
crates/ruff_python_formatter/resources/test/fixtures/black/cases/comments2.py
vendored
Normal file
@@ -0,0 +1,168 @@
|
|||||||
|
from com.my_lovely_company.my_lovely_team.my_lovely_project.my_lovely_component import (
|
||||||
|
MyLovelyCompanyTeamProjectComponent # NOT DRY
|
||||||
|
)
|
||||||
|
from com.my_lovely_company.my_lovely_team.my_lovely_project.my_lovely_component import (
|
||||||
|
MyLovelyCompanyTeamProjectComponent as component # DRY
|
||||||
|
)
|
||||||
|
|
||||||
|
# Please keep __all__ alphabetized within each category.
|
||||||
|
|
||||||
|
__all__ = [
|
||||||
|
# Super-special typing primitives.
|
||||||
|
'Any',
|
||||||
|
'Callable',
|
||||||
|
'ClassVar',
|
||||||
|
|
||||||
|
# ABCs (from collections.abc).
|
||||||
|
'AbstractSet', # collections.abc.Set.
|
||||||
|
'ByteString',
|
||||||
|
'Container',
|
||||||
|
|
||||||
|
# Concrete collection types.
|
||||||
|
'Counter',
|
||||||
|
'Deque',
|
||||||
|
'Dict',
|
||||||
|
'DefaultDict',
|
||||||
|
'List',
|
||||||
|
'Set',
|
||||||
|
'FrozenSet',
|
||||||
|
'NamedTuple', # Not really a type.
|
||||||
|
'Generator',
|
||||||
|
]
|
||||||
|
|
||||||
|
not_shareables = [
|
||||||
|
# singletons
|
||||||
|
True,
|
||||||
|
False,
|
||||||
|
NotImplemented, ...,
|
||||||
|
# builtin types and objects
|
||||||
|
type,
|
||||||
|
object,
|
||||||
|
object(),
|
||||||
|
Exception(),
|
||||||
|
42,
|
||||||
|
100.0,
|
||||||
|
"spam",
|
||||||
|
# user-defined types and objects
|
||||||
|
Cheese,
|
||||||
|
Cheese("Wensleydale"),
|
||||||
|
SubBytes(b"spam"),
|
||||||
|
]
|
||||||
|
|
||||||
|
if 'PYTHON' in os.environ:
|
||||||
|
add_compiler(compiler_from_env())
|
||||||
|
else:
|
||||||
|
# for compiler in compilers.values():
|
||||||
|
# add_compiler(compiler)
|
||||||
|
add_compiler(compilers[(7.0, 32)])
|
||||||
|
# add_compiler(compilers[(7.1, 64)])
|
||||||
|
|
||||||
|
# Comment before function.
|
||||||
|
def inline_comments_in_brackets_ruin_everything():
|
||||||
|
if typedargslist:
|
||||||
|
parameters.children = [
|
||||||
|
children[0], # (1
|
||||||
|
body,
|
||||||
|
children[-1] # )1
|
||||||
|
]
|
||||||
|
parameters.children = [
|
||||||
|
children[0],
|
||||||
|
body,
|
||||||
|
children[-1], # type: ignore
|
||||||
|
]
|
||||||
|
else:
|
||||||
|
parameters.children = [
|
||||||
|
parameters.children[0], # (2 what if this was actually long
|
||||||
|
body,
|
||||||
|
parameters.children[-1], # )2
|
||||||
|
]
|
||||||
|
parameters.children = [parameters.what_if_this_was_actually_long.children[0], body, parameters.children[-1]] # type: ignore
|
||||||
|
if (self._proc is not None
|
||||||
|
# has the child process finished?
|
||||||
|
and self._returncode is None
|
||||||
|
# the child process has finished, but the
|
||||||
|
# transport hasn't been notified yet?
|
||||||
|
and self._proc.poll() is None):
|
||||||
|
pass
|
||||||
|
# no newline before or after
|
||||||
|
short = [
|
||||||
|
# one
|
||||||
|
1,
|
||||||
|
# two
|
||||||
|
2]
|
||||||
|
|
||||||
|
# no newline after
|
||||||
|
call(arg1, arg2, """
|
||||||
|
short
|
||||||
|
""", arg3=True)
|
||||||
|
|
||||||
|
############################################################################
|
||||||
|
|
||||||
|
call2(
|
||||||
|
#short
|
||||||
|
arg1,
|
||||||
|
#but
|
||||||
|
arg2,
|
||||||
|
#multiline
|
||||||
|
"""
|
||||||
|
short
|
||||||
|
""",
|
||||||
|
# yup
|
||||||
|
arg3=True)
|
||||||
|
lcomp = [
|
||||||
|
element # yup
|
||||||
|
for element in collection # yup
|
||||||
|
if element is not None # right
|
||||||
|
]
|
||||||
|
lcomp2 = [
|
||||||
|
# hello
|
||||||
|
element
|
||||||
|
# yup
|
||||||
|
for element in collection
|
||||||
|
# right
|
||||||
|
if element is not None
|
||||||
|
]
|
||||||
|
lcomp3 = [
|
||||||
|
# This one is actually too long to fit in a single line.
|
||||||
|
element.split('\n', 1)[0]
|
||||||
|
# yup
|
||||||
|
for element in collection.select_elements()
|
||||||
|
# right
|
||||||
|
if element is not None
|
||||||
|
]
|
||||||
|
while True:
|
||||||
|
if False:
|
||||||
|
continue
|
||||||
|
|
||||||
|
# and round and round we go
|
||||||
|
# and round and round we go
|
||||||
|
|
||||||
|
# let's return
|
||||||
|
return Node(
|
||||||
|
syms.simple_stmt,
|
||||||
|
[
|
||||||
|
Node(statement, result),
|
||||||
|
Leaf(token.NEWLINE, '\n') # FIXME: \r\n?
|
||||||
|
],
|
||||||
|
)
|
||||||
|
|
||||||
|
CONFIG_FILES = [CONFIG_FILE, ] + SHARED_CONFIG_FILES + USER_CONFIG_FILES # type: Final
|
||||||
|
|
||||||
|
class Test:
|
||||||
|
def _init_host(self, parsed) -> None:
|
||||||
|
if (parsed.hostname is None or # type: ignore
|
||||||
|
not parsed.hostname.strip()):
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
a = "type comment with trailing space" # type: str
|
||||||
|
|
||||||
|
#######################
|
||||||
|
### SECTION COMMENT ###
|
||||||
|
#######################
|
||||||
|
|
||||||
|
|
||||||
|
instruction()#comment with bad spacing
|
||||||
|
|
||||||
|
# END COMMENTS
|
||||||
|
# MORE END COMMENTS
|
||||||
175
crates/ruff_python_formatter/resources/test/fixtures/black/cases/comments2.py.expect
vendored
Normal file
175
crates/ruff_python_formatter/resources/test/fixtures/black/cases/comments2.py.expect
vendored
Normal file
@@ -0,0 +1,175 @@
|
|||||||
|
from com.my_lovely_company.my_lovely_team.my_lovely_project.my_lovely_component import (
|
||||||
|
MyLovelyCompanyTeamProjectComponent, # NOT DRY
|
||||||
|
)
|
||||||
|
from com.my_lovely_company.my_lovely_team.my_lovely_project.my_lovely_component import (
|
||||||
|
MyLovelyCompanyTeamProjectComponent as component, # DRY
|
||||||
|
)
|
||||||
|
|
||||||
|
# Please keep __all__ alphabetized within each category.
|
||||||
|
|
||||||
|
__all__ = [
|
||||||
|
# Super-special typing primitives.
|
||||||
|
"Any",
|
||||||
|
"Callable",
|
||||||
|
"ClassVar",
|
||||||
|
# ABCs (from collections.abc).
|
||||||
|
"AbstractSet", # collections.abc.Set.
|
||||||
|
"ByteString",
|
||||||
|
"Container",
|
||||||
|
# Concrete collection types.
|
||||||
|
"Counter",
|
||||||
|
"Deque",
|
||||||
|
"Dict",
|
||||||
|
"DefaultDict",
|
||||||
|
"List",
|
||||||
|
"Set",
|
||||||
|
"FrozenSet",
|
||||||
|
"NamedTuple", # Not really a type.
|
||||||
|
"Generator",
|
||||||
|
]
|
||||||
|
|
||||||
|
not_shareables = [
|
||||||
|
# singletons
|
||||||
|
True,
|
||||||
|
False,
|
||||||
|
NotImplemented,
|
||||||
|
...,
|
||||||
|
# builtin types and objects
|
||||||
|
type,
|
||||||
|
object,
|
||||||
|
object(),
|
||||||
|
Exception(),
|
||||||
|
42,
|
||||||
|
100.0,
|
||||||
|
"spam",
|
||||||
|
# user-defined types and objects
|
||||||
|
Cheese,
|
||||||
|
Cheese("Wensleydale"),
|
||||||
|
SubBytes(b"spam"),
|
||||||
|
]
|
||||||
|
|
||||||
|
if "PYTHON" in os.environ:
|
||||||
|
add_compiler(compiler_from_env())
|
||||||
|
else:
|
||||||
|
# for compiler in compilers.values():
|
||||||
|
# add_compiler(compiler)
|
||||||
|
add_compiler(compilers[(7.0, 32)])
|
||||||
|
# add_compiler(compilers[(7.1, 64)])
|
||||||
|
|
||||||
|
|
||||||
|
# Comment before function.
|
||||||
|
def inline_comments_in_brackets_ruin_everything():
|
||||||
|
if typedargslist:
|
||||||
|
parameters.children = [children[0], body, children[-1]] # (1 # )1
|
||||||
|
parameters.children = [
|
||||||
|
children[0],
|
||||||
|
body,
|
||||||
|
children[-1], # type: ignore
|
||||||
|
]
|
||||||
|
else:
|
||||||
|
parameters.children = [
|
||||||
|
parameters.children[0], # (2 what if this was actually long
|
||||||
|
body,
|
||||||
|
parameters.children[-1], # )2
|
||||||
|
]
|
||||||
|
parameters.children = [parameters.what_if_this_was_actually_long.children[0], body, parameters.children[-1]] # type: ignore
|
||||||
|
if (
|
||||||
|
self._proc is not None
|
||||||
|
# has the child process finished?
|
||||||
|
and self._returncode is None
|
||||||
|
# the child process has finished, but the
|
||||||
|
# transport hasn't been notified yet?
|
||||||
|
and self._proc.poll() is None
|
||||||
|
):
|
||||||
|
pass
|
||||||
|
# no newline before or after
|
||||||
|
short = [
|
||||||
|
# one
|
||||||
|
1,
|
||||||
|
# two
|
||||||
|
2,
|
||||||
|
]
|
||||||
|
|
||||||
|
# no newline after
|
||||||
|
call(
|
||||||
|
arg1,
|
||||||
|
arg2,
|
||||||
|
"""
|
||||||
|
short
|
||||||
|
""",
|
||||||
|
arg3=True,
|
||||||
|
)
|
||||||
|
|
||||||
|
############################################################################
|
||||||
|
|
||||||
|
call2(
|
||||||
|
# short
|
||||||
|
arg1,
|
||||||
|
# but
|
||||||
|
arg2,
|
||||||
|
# multiline
|
||||||
|
"""
|
||||||
|
short
|
||||||
|
""",
|
||||||
|
# yup
|
||||||
|
arg3=True,
|
||||||
|
)
|
||||||
|
lcomp = [
|
||||||
|
element for element in collection if element is not None # yup # yup # right
|
||||||
|
]
|
||||||
|
lcomp2 = [
|
||||||
|
# hello
|
||||||
|
element
|
||||||
|
# yup
|
||||||
|
for element in collection
|
||||||
|
# right
|
||||||
|
if element is not None
|
||||||
|
]
|
||||||
|
lcomp3 = [
|
||||||
|
# This one is actually too long to fit in a single line.
|
||||||
|
element.split("\n", 1)[0]
|
||||||
|
# yup
|
||||||
|
for element in collection.select_elements()
|
||||||
|
# right
|
||||||
|
if element is not None
|
||||||
|
]
|
||||||
|
while True:
|
||||||
|
if False:
|
||||||
|
continue
|
||||||
|
|
||||||
|
# and round and round we go
|
||||||
|
# and round and round we go
|
||||||
|
|
||||||
|
# let's return
|
||||||
|
return Node(
|
||||||
|
syms.simple_stmt,
|
||||||
|
[Node(statement, result), Leaf(token.NEWLINE, "\n")], # FIXME: \r\n?
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
CONFIG_FILES = (
|
||||||
|
[
|
||||||
|
CONFIG_FILE,
|
||||||
|
]
|
||||||
|
+ SHARED_CONFIG_FILES
|
||||||
|
+ USER_CONFIG_FILES
|
||||||
|
) # type: Final
|
||||||
|
|
||||||
|
|
||||||
|
class Test:
|
||||||
|
def _init_host(self, parsed) -> None:
|
||||||
|
if parsed.hostname is None or not parsed.hostname.strip(): # type: ignore
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
a = "type comment with trailing space" # type: str
|
||||||
|
|
||||||
|
#######################
|
||||||
|
### SECTION COMMENT ###
|
||||||
|
#######################
|
||||||
|
|
||||||
|
|
||||||
|
instruction() # comment with bad spacing
|
||||||
|
|
||||||
|
# END COMMENTS
|
||||||
|
# MORE END COMMENTS
|
||||||
48
crates/ruff_python_formatter/resources/test/fixtures/black/cases/comments3.py
vendored
Normal file
48
crates/ruff_python_formatter/resources/test/fixtures/black/cases/comments3.py
vendored
Normal file
@@ -0,0 +1,48 @@
|
|||||||
|
# The percent-percent comments are Spyder IDE cells.
|
||||||
|
|
||||||
|
|
||||||
|
# %%
|
||||||
|
def func():
|
||||||
|
x = """
|
||||||
|
a really long string
|
||||||
|
"""
|
||||||
|
lcomp3 = [
|
||||||
|
# This one is actually too long to fit in a single line.
|
||||||
|
element.split("\n", 1)[0]
|
||||||
|
# yup
|
||||||
|
for element in collection.select_elements()
|
||||||
|
# right
|
||||||
|
if element is not None
|
||||||
|
]
|
||||||
|
# Capture each of the exceptions in the MultiError along with each of their causes and contexts
|
||||||
|
if isinstance(exc_value, MultiError):
|
||||||
|
embedded = []
|
||||||
|
for exc in exc_value.exceptions:
|
||||||
|
if exc not in _seen:
|
||||||
|
embedded.append(
|
||||||
|
# This should be left alone (before)
|
||||||
|
traceback.TracebackException.from_exception(
|
||||||
|
exc,
|
||||||
|
limit=limit,
|
||||||
|
lookup_lines=lookup_lines,
|
||||||
|
capture_locals=capture_locals,
|
||||||
|
# copy the set of _seen exceptions so that duplicates
|
||||||
|
# shared between sub-exceptions are not omitted
|
||||||
|
_seen=set(_seen),
|
||||||
|
)
|
||||||
|
# This should be left alone (after)
|
||||||
|
)
|
||||||
|
|
||||||
|
# everything is fine if the expression isn't nested
|
||||||
|
traceback.TracebackException.from_exception(
|
||||||
|
exc,
|
||||||
|
limit=limit,
|
||||||
|
lookup_lines=lookup_lines,
|
||||||
|
capture_locals=capture_locals,
|
||||||
|
# copy the set of _seen exceptions so that duplicates
|
||||||
|
# shared between sub-exceptions are not omitted
|
||||||
|
_seen=set(_seen),
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
# %%
|
||||||
48
crates/ruff_python_formatter/resources/test/fixtures/black/cases/comments3.py.expect
vendored
Normal file
48
crates/ruff_python_formatter/resources/test/fixtures/black/cases/comments3.py.expect
vendored
Normal file
@@ -0,0 +1,48 @@
|
|||||||
|
# The percent-percent comments are Spyder IDE cells.
|
||||||
|
|
||||||
|
|
||||||
|
# %%
|
||||||
|
def func():
|
||||||
|
x = """
|
||||||
|
a really long string
|
||||||
|
"""
|
||||||
|
lcomp3 = [
|
||||||
|
# This one is actually too long to fit in a single line.
|
||||||
|
element.split("\n", 1)[0]
|
||||||
|
# yup
|
||||||
|
for element in collection.select_elements()
|
||||||
|
# right
|
||||||
|
if element is not None
|
||||||
|
]
|
||||||
|
# Capture each of the exceptions in the MultiError along with each of their causes and contexts
|
||||||
|
if isinstance(exc_value, MultiError):
|
||||||
|
embedded = []
|
||||||
|
for exc in exc_value.exceptions:
|
||||||
|
if exc not in _seen:
|
||||||
|
embedded.append(
|
||||||
|
# This should be left alone (before)
|
||||||
|
traceback.TracebackException.from_exception(
|
||||||
|
exc,
|
||||||
|
limit=limit,
|
||||||
|
lookup_lines=lookup_lines,
|
||||||
|
capture_locals=capture_locals,
|
||||||
|
# copy the set of _seen exceptions so that duplicates
|
||||||
|
# shared between sub-exceptions are not omitted
|
||||||
|
_seen=set(_seen),
|
||||||
|
)
|
||||||
|
# This should be left alone (after)
|
||||||
|
)
|
||||||
|
|
||||||
|
# everything is fine if the expression isn't nested
|
||||||
|
traceback.TracebackException.from_exception(
|
||||||
|
exc,
|
||||||
|
limit=limit,
|
||||||
|
lookup_lines=lookup_lines,
|
||||||
|
capture_locals=capture_locals,
|
||||||
|
# copy the set of _seen exceptions so that duplicates
|
||||||
|
# shared between sub-exceptions are not omitted
|
||||||
|
_seen=set(_seen),
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
# %%
|
||||||
94
crates/ruff_python_formatter/resources/test/fixtures/black/cases/comments4.py
vendored
Normal file
94
crates/ruff_python_formatter/resources/test/fixtures/black/cases/comments4.py
vendored
Normal file
@@ -0,0 +1,94 @@
|
|||||||
|
from com.my_lovely_company.my_lovely_team.my_lovely_project.my_lovely_component import (
|
||||||
|
MyLovelyCompanyTeamProjectComponent, # NOT DRY
|
||||||
|
)
|
||||||
|
from com.my_lovely_company.my_lovely_team.my_lovely_project.my_lovely_component import (
|
||||||
|
MyLovelyCompanyTeamProjectComponent as component, # DRY
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
class C:
|
||||||
|
@pytest.mark.parametrize(
|
||||||
|
("post_data", "message"),
|
||||||
|
[
|
||||||
|
# metadata_version errors.
|
||||||
|
(
|
||||||
|
{},
|
||||||
|
"None is an invalid value for Metadata-Version. Error: This field is"
|
||||||
|
" required. see"
|
||||||
|
" https://packaging.python.org/specifications/core-metadata",
|
||||||
|
),
|
||||||
|
(
|
||||||
|
{"metadata_version": "-1"},
|
||||||
|
"'-1' is an invalid value for Metadata-Version. Error: Unknown Metadata"
|
||||||
|
" Version see"
|
||||||
|
" https://packaging.python.org/specifications/core-metadata",
|
||||||
|
),
|
||||||
|
# name errors.
|
||||||
|
(
|
||||||
|
{"metadata_version": "1.2"},
|
||||||
|
"'' is an invalid value for Name. Error: This field is required. see"
|
||||||
|
" https://packaging.python.org/specifications/core-metadata",
|
||||||
|
),
|
||||||
|
(
|
||||||
|
{"metadata_version": "1.2", "name": "foo-"},
|
||||||
|
"'foo-' is an invalid value for Name. Error: Must start and end with a"
|
||||||
|
" letter or numeral and contain only ascii numeric and '.', '_' and"
|
||||||
|
" '-'. see https://packaging.python.org/specifications/core-metadata",
|
||||||
|
),
|
||||||
|
# version errors.
|
||||||
|
(
|
||||||
|
{"metadata_version": "1.2", "name": "example"},
|
||||||
|
"'' is an invalid value for Version. Error: This field is required. see"
|
||||||
|
" https://packaging.python.org/specifications/core-metadata",
|
||||||
|
),
|
||||||
|
(
|
||||||
|
{"metadata_version": "1.2", "name": "example", "version": "dog"},
|
||||||
|
"'dog' is an invalid value for Version. Error: Must start and end with"
|
||||||
|
" a letter or numeral and contain only ascii numeric and '.', '_' and"
|
||||||
|
" '-'. see https://packaging.python.org/specifications/core-metadata",
|
||||||
|
),
|
||||||
|
],
|
||||||
|
)
|
||||||
|
def test_fails_invalid_post_data(
|
||||||
|
self, pyramid_config, db_request, post_data, message
|
||||||
|
):
|
||||||
|
pyramid_config.testing_securitypolicy(userid=1)
|
||||||
|
db_request.POST = MultiDict(post_data)
|
||||||
|
|
||||||
|
|
||||||
|
def foo(list_a, list_b):
|
||||||
|
results = (
|
||||||
|
User.query.filter(User.foo == "bar")
|
||||||
|
.filter( # Because foo.
|
||||||
|
db.or_(User.field_a.astext.in_(list_a), User.field_b.astext.in_(list_b))
|
||||||
|
)
|
||||||
|
.filter(User.xyz.is_(None))
|
||||||
|
# Another comment about the filtering on is_quux goes here.
|
||||||
|
.filter(db.not_(User.is_pending.astext.cast(db.Boolean).is_(True)))
|
||||||
|
.order_by(User.created_at.desc())
|
||||||
|
.with_for_update(key_share=True)
|
||||||
|
.all()
|
||||||
|
)
|
||||||
|
return results
|
||||||
|
|
||||||
|
|
||||||
|
def foo2(list_a, list_b):
|
||||||
|
# Standalone comment reasonably placed.
|
||||||
|
return (
|
||||||
|
User.query.filter(User.foo == "bar")
|
||||||
|
.filter(
|
||||||
|
db.or_(User.field_a.astext.in_(list_a), User.field_b.astext.in_(list_b))
|
||||||
|
)
|
||||||
|
.filter(User.xyz.is_(None))
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
def foo3(list_a, list_b):
|
||||||
|
return (
|
||||||
|
# Standalone comment but weirdly placed.
|
||||||
|
User.query.filter(User.foo == "bar")
|
||||||
|
.filter(
|
||||||
|
db.or_(User.field_a.astext.in_(list_a), User.field_b.astext.in_(list_b))
|
||||||
|
)
|
||||||
|
.filter(User.xyz.is_(None))
|
||||||
|
)
|
||||||
94
crates/ruff_python_formatter/resources/test/fixtures/black/cases/comments4.py.expect
vendored
Normal file
94
crates/ruff_python_formatter/resources/test/fixtures/black/cases/comments4.py.expect
vendored
Normal file
@@ -0,0 +1,94 @@
|
|||||||
|
from com.my_lovely_company.my_lovely_team.my_lovely_project.my_lovely_component import (
|
||||||
|
MyLovelyCompanyTeamProjectComponent, # NOT DRY
|
||||||
|
)
|
||||||
|
from com.my_lovely_company.my_lovely_team.my_lovely_project.my_lovely_component import (
|
||||||
|
MyLovelyCompanyTeamProjectComponent as component, # DRY
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
class C:
|
||||||
|
@pytest.mark.parametrize(
|
||||||
|
("post_data", "message"),
|
||||||
|
[
|
||||||
|
# metadata_version errors.
|
||||||
|
(
|
||||||
|
{},
|
||||||
|
"None is an invalid value for Metadata-Version. Error: This field is"
|
||||||
|
" required. see"
|
||||||
|
" https://packaging.python.org/specifications/core-metadata",
|
||||||
|
),
|
||||||
|
(
|
||||||
|
{"metadata_version": "-1"},
|
||||||
|
"'-1' is an invalid value for Metadata-Version. Error: Unknown Metadata"
|
||||||
|
" Version see"
|
||||||
|
" https://packaging.python.org/specifications/core-metadata",
|
||||||
|
),
|
||||||
|
# name errors.
|
||||||
|
(
|
||||||
|
{"metadata_version": "1.2"},
|
||||||
|
"'' is an invalid value for Name. Error: This field is required. see"
|
||||||
|
" https://packaging.python.org/specifications/core-metadata",
|
||||||
|
),
|
||||||
|
(
|
||||||
|
{"metadata_version": "1.2", "name": "foo-"},
|
||||||
|
"'foo-' is an invalid value for Name. Error: Must start and end with a"
|
||||||
|
" letter or numeral and contain only ascii numeric and '.', '_' and"
|
||||||
|
" '-'. see https://packaging.python.org/specifications/core-metadata",
|
||||||
|
),
|
||||||
|
# version errors.
|
||||||
|
(
|
||||||
|
{"metadata_version": "1.2", "name": "example"},
|
||||||
|
"'' is an invalid value for Version. Error: This field is required. see"
|
||||||
|
" https://packaging.python.org/specifications/core-metadata",
|
||||||
|
),
|
||||||
|
(
|
||||||
|
{"metadata_version": "1.2", "name": "example", "version": "dog"},
|
||||||
|
"'dog' is an invalid value for Version. Error: Must start and end with"
|
||||||
|
" a letter or numeral and contain only ascii numeric and '.', '_' and"
|
||||||
|
" '-'. see https://packaging.python.org/specifications/core-metadata",
|
||||||
|
),
|
||||||
|
],
|
||||||
|
)
|
||||||
|
def test_fails_invalid_post_data(
|
||||||
|
self, pyramid_config, db_request, post_data, message
|
||||||
|
):
|
||||||
|
pyramid_config.testing_securitypolicy(userid=1)
|
||||||
|
db_request.POST = MultiDict(post_data)
|
||||||
|
|
||||||
|
|
||||||
|
def foo(list_a, list_b):
|
||||||
|
results = (
|
||||||
|
User.query.filter(User.foo == "bar")
|
||||||
|
.filter( # Because foo.
|
||||||
|
db.or_(User.field_a.astext.in_(list_a), User.field_b.astext.in_(list_b))
|
||||||
|
)
|
||||||
|
.filter(User.xyz.is_(None))
|
||||||
|
# Another comment about the filtering on is_quux goes here.
|
||||||
|
.filter(db.not_(User.is_pending.astext.cast(db.Boolean).is_(True)))
|
||||||
|
.order_by(User.created_at.desc())
|
||||||
|
.with_for_update(key_share=True)
|
||||||
|
.all()
|
||||||
|
)
|
||||||
|
return results
|
||||||
|
|
||||||
|
|
||||||
|
def foo2(list_a, list_b):
|
||||||
|
# Standalone comment reasonably placed.
|
||||||
|
return (
|
||||||
|
User.query.filter(User.foo == "bar")
|
||||||
|
.filter(
|
||||||
|
db.or_(User.field_a.astext.in_(list_a), User.field_b.astext.in_(list_b))
|
||||||
|
)
|
||||||
|
.filter(User.xyz.is_(None))
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
def foo3(list_a, list_b):
|
||||||
|
return (
|
||||||
|
# Standalone comment but weirdly placed.
|
||||||
|
User.query.filter(User.foo == "bar")
|
||||||
|
.filter(
|
||||||
|
db.or_(User.field_a.astext.in_(list_a), User.field_b.astext.in_(list_b))
|
||||||
|
)
|
||||||
|
.filter(User.xyz.is_(None))
|
||||||
|
)
|
||||||
73
crates/ruff_python_formatter/resources/test/fixtures/black/cases/comments5.py
vendored
Normal file
73
crates/ruff_python_formatter/resources/test/fixtures/black/cases/comments5.py
vendored
Normal file
@@ -0,0 +1,73 @@
|
|||||||
|
while True:
|
||||||
|
if something.changed:
|
||||||
|
do.stuff() # trailing comment
|
||||||
|
# Comment belongs to the `if` block.
|
||||||
|
# This one belongs to the `while` block.
|
||||||
|
|
||||||
|
# Should this one, too? I guess so.
|
||||||
|
|
||||||
|
# This one is properly standalone now.
|
||||||
|
|
||||||
|
for i in range(100):
|
||||||
|
# first we do this
|
||||||
|
if i % 33 == 0:
|
||||||
|
break
|
||||||
|
|
||||||
|
# then we do this
|
||||||
|
print(i)
|
||||||
|
# and finally we loop around
|
||||||
|
|
||||||
|
with open(some_temp_file) as f:
|
||||||
|
data = f.read()
|
||||||
|
|
||||||
|
try:
|
||||||
|
with open(some_other_file) as w:
|
||||||
|
w.write(data)
|
||||||
|
|
||||||
|
except OSError:
|
||||||
|
print("problems")
|
||||||
|
|
||||||
|
import sys
|
||||||
|
|
||||||
|
|
||||||
|
# leading function comment
|
||||||
|
def wat():
|
||||||
|
...
|
||||||
|
# trailing function comment
|
||||||
|
|
||||||
|
|
||||||
|
# SECTION COMMENT
|
||||||
|
|
||||||
|
|
||||||
|
# leading 1
|
||||||
|
@deco1
|
||||||
|
# leading 2
|
||||||
|
@deco2(with_args=True)
|
||||||
|
# leading 3
|
||||||
|
@deco3
|
||||||
|
def decorated1():
|
||||||
|
...
|
||||||
|
|
||||||
|
|
||||||
|
# leading 1
|
||||||
|
@deco1
|
||||||
|
# leading 2
|
||||||
|
@deco2(with_args=True)
|
||||||
|
# leading function comment
|
||||||
|
def decorated1():
|
||||||
|
...
|
||||||
|
|
||||||
|
|
||||||
|
# Note: this is fixed in
|
||||||
|
# Preview.empty_lines_before_class_or_def_with_leading_comments.
|
||||||
|
# In the current style, the user will have to split those lines by hand.
|
||||||
|
some_instruction
|
||||||
|
|
||||||
|
|
||||||
|
# This comment should be split from `some_instruction` by two lines but isn't.
|
||||||
|
def g():
|
||||||
|
...
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main()
|
||||||
73
crates/ruff_python_formatter/resources/test/fixtures/black/cases/comments5.py.expect
vendored
Normal file
73
crates/ruff_python_formatter/resources/test/fixtures/black/cases/comments5.py.expect
vendored
Normal file
@@ -0,0 +1,73 @@
|
|||||||
|
while True:
|
||||||
|
if something.changed:
|
||||||
|
do.stuff() # trailing comment
|
||||||
|
# Comment belongs to the `if` block.
|
||||||
|
# This one belongs to the `while` block.
|
||||||
|
|
||||||
|
# Should this one, too? I guess so.
|
||||||
|
|
||||||
|
# This one is properly standalone now.
|
||||||
|
|
||||||
|
for i in range(100):
|
||||||
|
# first we do this
|
||||||
|
if i % 33 == 0:
|
||||||
|
break
|
||||||
|
|
||||||
|
# then we do this
|
||||||
|
print(i)
|
||||||
|
# and finally we loop around
|
||||||
|
|
||||||
|
with open(some_temp_file) as f:
|
||||||
|
data = f.read()
|
||||||
|
|
||||||
|
try:
|
||||||
|
with open(some_other_file) as w:
|
||||||
|
w.write(data)
|
||||||
|
|
||||||
|
except OSError:
|
||||||
|
print("problems")
|
||||||
|
|
||||||
|
import sys
|
||||||
|
|
||||||
|
|
||||||
|
# leading function comment
|
||||||
|
def wat():
|
||||||
|
...
|
||||||
|
# trailing function comment
|
||||||
|
|
||||||
|
|
||||||
|
# SECTION COMMENT
|
||||||
|
|
||||||
|
|
||||||
|
# leading 1
|
||||||
|
@deco1
|
||||||
|
# leading 2
|
||||||
|
@deco2(with_args=True)
|
||||||
|
# leading 3
|
||||||
|
@deco3
|
||||||
|
def decorated1():
|
||||||
|
...
|
||||||
|
|
||||||
|
|
||||||
|
# leading 1
|
||||||
|
@deco1
|
||||||
|
# leading 2
|
||||||
|
@deco2(with_args=True)
|
||||||
|
# leading function comment
|
||||||
|
def decorated1():
|
||||||
|
...
|
||||||
|
|
||||||
|
|
||||||
|
# Note: this is fixed in
|
||||||
|
# Preview.empty_lines_before_class_or_def_with_leading_comments.
|
||||||
|
# In the current style, the user will have to split those lines by hand.
|
||||||
|
some_instruction
|
||||||
|
|
||||||
|
|
||||||
|
# This comment should be split from `some_instruction` by two lines but isn't.
|
||||||
|
def g():
|
||||||
|
...
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main()
|
||||||
118
crates/ruff_python_formatter/resources/test/fixtures/black/cases/comments6.py
vendored
Normal file
118
crates/ruff_python_formatter/resources/test/fixtures/black/cases/comments6.py
vendored
Normal file
@@ -0,0 +1,118 @@
|
|||||||
|
from typing import Any, Tuple
|
||||||
|
|
||||||
|
|
||||||
|
def f(
|
||||||
|
a, # type: int
|
||||||
|
):
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
# test type comments
|
||||||
|
def f(a, b, c, d, e, f, g, h, i):
|
||||||
|
# type: (int, int, int, int, int, int, int, int, int) -> None
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
def f(
|
||||||
|
a, # type: int
|
||||||
|
b, # type: int
|
||||||
|
c, # type: int
|
||||||
|
d, # type: int
|
||||||
|
e, # type: int
|
||||||
|
f, # type: int
|
||||||
|
g, # type: int
|
||||||
|
h, # type: int
|
||||||
|
i, # type: int
|
||||||
|
):
|
||||||
|
# type: (...) -> None
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
def f(
|
||||||
|
arg, # type: int
|
||||||
|
*args, # type: *Any
|
||||||
|
default=False, # type: bool
|
||||||
|
**kwargs, # type: **Any
|
||||||
|
):
|
||||||
|
# type: (...) -> None
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
def f(
|
||||||
|
a, # type: int
|
||||||
|
b, # type: int
|
||||||
|
c, # type: int
|
||||||
|
d, # type: int
|
||||||
|
):
|
||||||
|
# type: (...) -> None
|
||||||
|
|
||||||
|
element = 0 # type: int
|
||||||
|
another_element = 1 # type: float
|
||||||
|
another_element_with_long_name = 2 # type: int
|
||||||
|
another_really_really_long_element_with_a_unnecessarily_long_name_to_describe_what_it_does_enterprise_style = (
|
||||||
|
3
|
||||||
|
) # type: int
|
||||||
|
an_element_with_a_long_value = calls() or more_calls() and more() # type: bool
|
||||||
|
|
||||||
|
tup = (
|
||||||
|
another_element,
|
||||||
|
another_really_really_long_element_with_a_unnecessarily_long_name_to_describe_what_it_does_enterprise_style,
|
||||||
|
) # type: Tuple[int, int]
|
||||||
|
|
||||||
|
a = (
|
||||||
|
element
|
||||||
|
+ another_element
|
||||||
|
+ another_element_with_long_name
|
||||||
|
+ element
|
||||||
|
+ another_element
|
||||||
|
+ another_element_with_long_name
|
||||||
|
) # type: int
|
||||||
|
|
||||||
|
|
||||||
|
def f(
|
||||||
|
x, # not a type comment
|
||||||
|
y, # type: int
|
||||||
|
):
|
||||||
|
# type: (...) -> None
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
def f(
|
||||||
|
x, # not a type comment
|
||||||
|
): # type: (int) -> None
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
def func(
|
||||||
|
a=some_list[0], # type: int
|
||||||
|
): # type: () -> int
|
||||||
|
c = call(
|
||||||
|
0.0123,
|
||||||
|
0.0456,
|
||||||
|
0.0789,
|
||||||
|
0.0123,
|
||||||
|
0.0456,
|
||||||
|
0.0789,
|
||||||
|
0.0123,
|
||||||
|
0.0456,
|
||||||
|
0.0789,
|
||||||
|
a[-1], # type: ignore
|
||||||
|
)
|
||||||
|
|
||||||
|
c = call(
|
||||||
|
"aaaaaaaa", "aaaaaaaa", "aaaaaaaa", "aaaaaaaa", "aaaaaaaa", "aaaaaaaa", "aaaaaaaa" # type: ignore
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
result = ( # aaa
|
||||||
|
"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
|
||||||
|
)
|
||||||
|
|
||||||
|
AAAAAAAAAAAAA = [AAAAAAAAAAAAA] + SHARED_AAAAAAAAAAAAA + USER_AAAAAAAAAAAAA + AAAAAAAAAAAAA # type: ignore
|
||||||
|
|
||||||
|
call_to_some_function_asdf(
|
||||||
|
foo,
|
||||||
|
[AAAAAAAAAAAAAAAAAAAAAAA, AAAAAAAAAAAAAAAAAAAAAAA, AAAAAAAAAAAAAAAAAAAAAAA, BBBBBBBBBBBB], # type: ignore
|
||||||
|
)
|
||||||
|
|
||||||
|
aaaaaaaaaaaaa, bbbbbbbbb = map(list, map(itertools.chain.from_iterable, zip(*items))) # type: ignore[arg-type]
|
||||||
118
crates/ruff_python_formatter/resources/test/fixtures/black/cases/comments6.py.expect
vendored
Normal file
118
crates/ruff_python_formatter/resources/test/fixtures/black/cases/comments6.py.expect
vendored
Normal file
@@ -0,0 +1,118 @@
|
|||||||
|
from typing import Any, Tuple
|
||||||
|
|
||||||
|
|
||||||
|
def f(
|
||||||
|
a, # type: int
|
||||||
|
):
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
# test type comments
|
||||||
|
def f(a, b, c, d, e, f, g, h, i):
|
||||||
|
# type: (int, int, int, int, int, int, int, int, int) -> None
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
def f(
|
||||||
|
a, # type: int
|
||||||
|
b, # type: int
|
||||||
|
c, # type: int
|
||||||
|
d, # type: int
|
||||||
|
e, # type: int
|
||||||
|
f, # type: int
|
||||||
|
g, # type: int
|
||||||
|
h, # type: int
|
||||||
|
i, # type: int
|
||||||
|
):
|
||||||
|
# type: (...) -> None
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
def f(
|
||||||
|
arg, # type: int
|
||||||
|
*args, # type: *Any
|
||||||
|
default=False, # type: bool
|
||||||
|
**kwargs, # type: **Any
|
||||||
|
):
|
||||||
|
# type: (...) -> None
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
def f(
|
||||||
|
a, # type: int
|
||||||
|
b, # type: int
|
||||||
|
c, # type: int
|
||||||
|
d, # type: int
|
||||||
|
):
|
||||||
|
# type: (...) -> None
|
||||||
|
|
||||||
|
element = 0 # type: int
|
||||||
|
another_element = 1 # type: float
|
||||||
|
another_element_with_long_name = 2 # type: int
|
||||||
|
another_really_really_long_element_with_a_unnecessarily_long_name_to_describe_what_it_does_enterprise_style = (
|
||||||
|
3
|
||||||
|
) # type: int
|
||||||
|
an_element_with_a_long_value = calls() or more_calls() and more() # type: bool
|
||||||
|
|
||||||
|
tup = (
|
||||||
|
another_element,
|
||||||
|
another_really_really_long_element_with_a_unnecessarily_long_name_to_describe_what_it_does_enterprise_style,
|
||||||
|
) # type: Tuple[int, int]
|
||||||
|
|
||||||
|
a = (
|
||||||
|
element
|
||||||
|
+ another_element
|
||||||
|
+ another_element_with_long_name
|
||||||
|
+ element
|
||||||
|
+ another_element
|
||||||
|
+ another_element_with_long_name
|
||||||
|
) # type: int
|
||||||
|
|
||||||
|
|
||||||
|
def f(
|
||||||
|
x, # not a type comment
|
||||||
|
y, # type: int
|
||||||
|
):
|
||||||
|
# type: (...) -> None
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
def f(
|
||||||
|
x, # not a type comment
|
||||||
|
): # type: (int) -> None
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
def func(
|
||||||
|
a=some_list[0], # type: int
|
||||||
|
): # type: () -> int
|
||||||
|
c = call(
|
||||||
|
0.0123,
|
||||||
|
0.0456,
|
||||||
|
0.0789,
|
||||||
|
0.0123,
|
||||||
|
0.0456,
|
||||||
|
0.0789,
|
||||||
|
0.0123,
|
||||||
|
0.0456,
|
||||||
|
0.0789,
|
||||||
|
a[-1], # type: ignore
|
||||||
|
)
|
||||||
|
|
||||||
|
c = call(
|
||||||
|
"aaaaaaaa", "aaaaaaaa", "aaaaaaaa", "aaaaaaaa", "aaaaaaaa", "aaaaaaaa", "aaaaaaaa" # type: ignore
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
result = ( # aaa
|
||||||
|
"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
|
||||||
|
)
|
||||||
|
|
||||||
|
AAAAAAAAAAAAA = [AAAAAAAAAAAAA] + SHARED_AAAAAAAAAAAAA + USER_AAAAAAAAAAAAA + AAAAAAAAAAAAA # type: ignore
|
||||||
|
|
||||||
|
call_to_some_function_asdf(
|
||||||
|
foo,
|
||||||
|
[AAAAAAAAAAAAAAAAAAAAAAA, AAAAAAAAAAAAAAAAAAAAAAA, AAAAAAAAAAAAAAAAAAAAAAA, BBBBBBBBBBBB], # type: ignore
|
||||||
|
)
|
||||||
|
|
||||||
|
aaaaaaaaaaaaa, bbbbbbbbb = map(list, map(itertools.chain.from_iterable, zip(*items))) # type: ignore[arg-type]
|
||||||
6
crates/ruff_python_formatter/resources/test/fixtures/black/cases/comments8.py
vendored
Normal file
6
crates/ruff_python_formatter/resources/test/fixtures/black/cases/comments8.py
vendored
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
# The percent-percent comments are Spyder IDE cells.
|
||||||
|
# Both `#%%`` and `# %%` are accepted, so `black` standardises
|
||||||
|
# to the latter.
|
||||||
|
|
||||||
|
#%%
|
||||||
|
# %%
|
||||||
6
crates/ruff_python_formatter/resources/test/fixtures/black/cases/comments8.py.expect
vendored
Normal file
6
crates/ruff_python_formatter/resources/test/fixtures/black/cases/comments8.py.expect
vendored
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
# The percent-percent comments are Spyder IDE cells.
|
||||||
|
# Both `#%%`` and `# %%` are accepted, so `black` standardises
|
||||||
|
# to the latter.
|
||||||
|
|
||||||
|
# %%
|
||||||
|
# %%
|
||||||
139
crates/ruff_python_formatter/resources/test/fixtures/black/cases/comments9.py
vendored
Normal file
139
crates/ruff_python_formatter/resources/test/fixtures/black/cases/comments9.py
vendored
Normal file
@@ -0,0 +1,139 @@
|
|||||||
|
# Test for https://github.com/psf/black/issues/246.
|
||||||
|
|
||||||
|
some = statement
|
||||||
|
# This comment should be split from the statement above by two lines.
|
||||||
|
def function():
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
some = statement
|
||||||
|
# This multiline comments section
|
||||||
|
# should be split from the statement
|
||||||
|
# above by two lines.
|
||||||
|
def function():
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
some = statement
|
||||||
|
# This comment should be split from the statement above by two lines.
|
||||||
|
async def async_function():
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
some = statement
|
||||||
|
# This comment should be split from the statement above by two lines.
|
||||||
|
class MyClass:
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
some = statement
|
||||||
|
# This should be stick to the statement above
|
||||||
|
|
||||||
|
# This should be split from the above by two lines
|
||||||
|
class MyClassWithComplexLeadingComments:
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
class ClassWithDocstring:
|
||||||
|
"""A docstring."""
|
||||||
|
# Leading comment after a class with just a docstring
|
||||||
|
class MyClassAfterAnotherClassWithDocstring:
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
some = statement
|
||||||
|
# leading 1
|
||||||
|
@deco1
|
||||||
|
# leading 2
|
||||||
|
# leading 2 extra
|
||||||
|
@deco2(with_args=True)
|
||||||
|
# leading 3
|
||||||
|
@deco3
|
||||||
|
# leading 4
|
||||||
|
def decorated():
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
some = statement
|
||||||
|
# leading 1
|
||||||
|
@deco1
|
||||||
|
# leading 2
|
||||||
|
@deco2(with_args=True)
|
||||||
|
|
||||||
|
# leading 3 that already has an empty line
|
||||||
|
@deco3
|
||||||
|
# leading 4
|
||||||
|
def decorated_with_split_leading_comments():
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
some = statement
|
||||||
|
# leading 1
|
||||||
|
@deco1
|
||||||
|
# leading 2
|
||||||
|
@deco2(with_args=True)
|
||||||
|
# leading 3
|
||||||
|
@deco3
|
||||||
|
|
||||||
|
# leading 4 that already has an empty line
|
||||||
|
def decorated_with_split_leading_comments():
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
def main():
|
||||||
|
if a:
|
||||||
|
# Leading comment before inline function
|
||||||
|
def inline():
|
||||||
|
pass
|
||||||
|
# Another leading comment
|
||||||
|
def another_inline():
|
||||||
|
pass
|
||||||
|
else:
|
||||||
|
# More leading comments
|
||||||
|
def inline_after_else():
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
if a:
|
||||||
|
# Leading comment before "top-level inline" function
|
||||||
|
def top_level_quote_inline():
|
||||||
|
pass
|
||||||
|
# Another leading comment
|
||||||
|
def another_top_level_quote_inline_inline():
|
||||||
|
pass
|
||||||
|
else:
|
||||||
|
# More leading comments
|
||||||
|
def top_level_quote_inline_after_else():
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
class MyClass:
|
||||||
|
# First method has no empty lines between bare class def.
|
||||||
|
# More comments.
|
||||||
|
def first_method(self):
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
# Regression test for https://github.com/psf/black/issues/3454.
|
||||||
|
def foo():
|
||||||
|
pass
|
||||||
|
# Trailing comment that belongs to this function
|
||||||
|
|
||||||
|
|
||||||
|
@decorator1
|
||||||
|
@decorator2 # fmt: skip
|
||||||
|
def bar():
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
# Regression test for https://github.com/psf/black/issues/3454.
|
||||||
|
def foo():
|
||||||
|
pass
|
||||||
|
# Trailing comment that belongs to this function.
|
||||||
|
# NOTE this comment only has one empty line below, and the formatter
|
||||||
|
# should enforce two blank lines.
|
||||||
|
|
||||||
|
@decorator1
|
||||||
|
# A standalone comment
|
||||||
|
def bar():
|
||||||
|
pass
|
||||||
161
crates/ruff_python_formatter/resources/test/fixtures/black/cases/comments9.py.expect
vendored
Normal file
161
crates/ruff_python_formatter/resources/test/fixtures/black/cases/comments9.py.expect
vendored
Normal file
@@ -0,0 +1,161 @@
|
|||||||
|
# Test for https://github.com/psf/black/issues/246.
|
||||||
|
|
||||||
|
some = statement
|
||||||
|
|
||||||
|
|
||||||
|
# This comment should be split from the statement above by two lines.
|
||||||
|
def function():
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
some = statement
|
||||||
|
|
||||||
|
|
||||||
|
# This multiline comments section
|
||||||
|
# should be split from the statement
|
||||||
|
# above by two lines.
|
||||||
|
def function():
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
some = statement
|
||||||
|
|
||||||
|
|
||||||
|
# This comment should be split from the statement above by two lines.
|
||||||
|
async def async_function():
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
some = statement
|
||||||
|
|
||||||
|
|
||||||
|
# This comment should be split from the statement above by two lines.
|
||||||
|
class MyClass:
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
some = statement
|
||||||
|
# This should be stick to the statement above
|
||||||
|
|
||||||
|
|
||||||
|
# This should be split from the above by two lines
|
||||||
|
class MyClassWithComplexLeadingComments:
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
class ClassWithDocstring:
|
||||||
|
"""A docstring."""
|
||||||
|
|
||||||
|
|
||||||
|
# Leading comment after a class with just a docstring
|
||||||
|
class MyClassAfterAnotherClassWithDocstring:
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
some = statement
|
||||||
|
|
||||||
|
|
||||||
|
# leading 1
|
||||||
|
@deco1
|
||||||
|
# leading 2
|
||||||
|
# leading 2 extra
|
||||||
|
@deco2(with_args=True)
|
||||||
|
# leading 3
|
||||||
|
@deco3
|
||||||
|
# leading 4
|
||||||
|
def decorated():
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
some = statement
|
||||||
|
|
||||||
|
|
||||||
|
# leading 1
|
||||||
|
@deco1
|
||||||
|
# leading 2
|
||||||
|
@deco2(with_args=True)
|
||||||
|
|
||||||
|
# leading 3 that already has an empty line
|
||||||
|
@deco3
|
||||||
|
# leading 4
|
||||||
|
def decorated_with_split_leading_comments():
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
some = statement
|
||||||
|
|
||||||
|
|
||||||
|
# leading 1
|
||||||
|
@deco1
|
||||||
|
# leading 2
|
||||||
|
@deco2(with_args=True)
|
||||||
|
# leading 3
|
||||||
|
@deco3
|
||||||
|
|
||||||
|
# leading 4 that already has an empty line
|
||||||
|
def decorated_with_split_leading_comments():
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
def main():
|
||||||
|
if a:
|
||||||
|
# Leading comment before inline function
|
||||||
|
def inline():
|
||||||
|
pass
|
||||||
|
|
||||||
|
# Another leading comment
|
||||||
|
def another_inline():
|
||||||
|
pass
|
||||||
|
|
||||||
|
else:
|
||||||
|
# More leading comments
|
||||||
|
def inline_after_else():
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
if a:
|
||||||
|
# Leading comment before "top-level inline" function
|
||||||
|
def top_level_quote_inline():
|
||||||
|
pass
|
||||||
|
|
||||||
|
# Another leading comment
|
||||||
|
def another_top_level_quote_inline_inline():
|
||||||
|
pass
|
||||||
|
|
||||||
|
else:
|
||||||
|
# More leading comments
|
||||||
|
def top_level_quote_inline_after_else():
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
class MyClass:
|
||||||
|
# First method has no empty lines between bare class def.
|
||||||
|
# More comments.
|
||||||
|
def first_method(self):
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
# Regression test for https://github.com/psf/black/issues/3454.
|
||||||
|
def foo():
|
||||||
|
pass
|
||||||
|
# Trailing comment that belongs to this function
|
||||||
|
|
||||||
|
|
||||||
|
@decorator1
|
||||||
|
@decorator2 # fmt: skip
|
||||||
|
def bar():
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
# Regression test for https://github.com/psf/black/issues/3454.
|
||||||
|
def foo():
|
||||||
|
pass
|
||||||
|
# Trailing comment that belongs to this function.
|
||||||
|
# NOTE this comment only has one empty line below, and the formatter
|
||||||
|
# should enforce two blank lines.
|
||||||
|
|
||||||
|
|
||||||
|
@decorator1
|
||||||
|
# A standalone comment
|
||||||
|
def bar():
|
||||||
|
pass
|
||||||
111
crates/ruff_python_formatter/resources/test/fixtures/black/cases/comments_in_blocks.py
vendored
Normal file
111
crates/ruff_python_formatter/resources/test/fixtures/black/cases/comments_in_blocks.py
vendored
Normal file
@@ -0,0 +1,111 @@
|
|||||||
|
# Test cases from:
|
||||||
|
# - https://github.com/psf/black/issues/1798
|
||||||
|
# - https://github.com/psf/black/issues/1499
|
||||||
|
# - https://github.com/psf/black/issues/1211
|
||||||
|
# - https://github.com/psf/black/issues/563
|
||||||
|
|
||||||
|
(
|
||||||
|
lambda
|
||||||
|
# a comment
|
||||||
|
: None
|
||||||
|
)
|
||||||
|
|
||||||
|
(
|
||||||
|
lambda:
|
||||||
|
# b comment
|
||||||
|
None
|
||||||
|
)
|
||||||
|
|
||||||
|
(
|
||||||
|
lambda
|
||||||
|
# a comment
|
||||||
|
:
|
||||||
|
# b comment
|
||||||
|
None
|
||||||
|
)
|
||||||
|
|
||||||
|
[
|
||||||
|
x
|
||||||
|
# Let's do this
|
||||||
|
for
|
||||||
|
# OK?
|
||||||
|
x
|
||||||
|
# Some comment
|
||||||
|
# And another
|
||||||
|
in
|
||||||
|
# One more
|
||||||
|
y
|
||||||
|
]
|
||||||
|
|
||||||
|
return [
|
||||||
|
(offers[offer_index], 1.0)
|
||||||
|
for offer_index, _
|
||||||
|
# avoid returning any offers that don't match the grammar so
|
||||||
|
# that the return values here are consistent with what would be
|
||||||
|
# returned in AcceptValidHeader
|
||||||
|
in self._parse_and_normalize_offers(offers)
|
||||||
|
]
|
||||||
|
|
||||||
|
from foo import (
|
||||||
|
bar,
|
||||||
|
# qux
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
def convert(collection):
|
||||||
|
# replace all variables by integers
|
||||||
|
replacement_dict = {
|
||||||
|
variable: f"{index}"
|
||||||
|
for index, variable
|
||||||
|
# 0 is reserved as line terminator
|
||||||
|
in enumerate(collection.variables(), start=1)
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
{
|
||||||
|
i: i
|
||||||
|
for i
|
||||||
|
# a comment
|
||||||
|
in range(5)
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
def get_subtree_proof_nodes(
|
||||||
|
chunk_index_groups: Sequence[Tuple[int, ...], ...],
|
||||||
|
) -> Tuple[int, ...]:
|
||||||
|
subtree_node_paths = (
|
||||||
|
# We take a candidate element from each group and shift it to
|
||||||
|
# remove the bits that are not common to other group members, then
|
||||||
|
# we convert it to a tree path that all elements from this group
|
||||||
|
# have in common.
|
||||||
|
chunk_index
|
||||||
|
for chunk_index, bits_to_truncate
|
||||||
|
# Each group will contain an even "power-of-two" number of# elements.
|
||||||
|
# This tells us how many tailing bits each element has# which need to
|
||||||
|
# be truncated to get the group's common prefix.
|
||||||
|
in ((group[0], (len(group) - 1).bit_length()) for group in chunk_index_groups)
|
||||||
|
)
|
||||||
|
return subtree_node_paths
|
||||||
|
|
||||||
|
|
||||||
|
if (
|
||||||
|
# comment1
|
||||||
|
a
|
||||||
|
# comment2
|
||||||
|
or (
|
||||||
|
# comment3
|
||||||
|
(
|
||||||
|
# comment4
|
||||||
|
b
|
||||||
|
)
|
||||||
|
# comment5
|
||||||
|
and
|
||||||
|
# comment6
|
||||||
|
c
|
||||||
|
or (
|
||||||
|
# comment7
|
||||||
|
d
|
||||||
|
)
|
||||||
|
)
|
||||||
|
):
|
||||||
|
print("Foo")
|
||||||
111
crates/ruff_python_formatter/resources/test/fixtures/black/cases/comments_in_blocks.py.expect
vendored
Normal file
111
crates/ruff_python_formatter/resources/test/fixtures/black/cases/comments_in_blocks.py.expect
vendored
Normal file
@@ -0,0 +1,111 @@
|
|||||||
|
# Test cases from:
|
||||||
|
# - https://github.com/psf/black/issues/1798
|
||||||
|
# - https://github.com/psf/black/issues/1499
|
||||||
|
# - https://github.com/psf/black/issues/1211
|
||||||
|
# - https://github.com/psf/black/issues/563
|
||||||
|
|
||||||
|
(
|
||||||
|
lambda
|
||||||
|
# a comment
|
||||||
|
: None
|
||||||
|
)
|
||||||
|
|
||||||
|
(
|
||||||
|
lambda:
|
||||||
|
# b comment
|
||||||
|
None
|
||||||
|
)
|
||||||
|
|
||||||
|
(
|
||||||
|
lambda
|
||||||
|
# a comment
|
||||||
|
:
|
||||||
|
# b comment
|
||||||
|
None
|
||||||
|
)
|
||||||
|
|
||||||
|
[
|
||||||
|
x
|
||||||
|
# Let's do this
|
||||||
|
for
|
||||||
|
# OK?
|
||||||
|
x
|
||||||
|
# Some comment
|
||||||
|
# And another
|
||||||
|
in
|
||||||
|
# One more
|
||||||
|
y
|
||||||
|
]
|
||||||
|
|
||||||
|
return [
|
||||||
|
(offers[offer_index], 1.0)
|
||||||
|
for offer_index, _
|
||||||
|
# avoid returning any offers that don't match the grammar so
|
||||||
|
# that the return values here are consistent with what would be
|
||||||
|
# returned in AcceptValidHeader
|
||||||
|
in self._parse_and_normalize_offers(offers)
|
||||||
|
]
|
||||||
|
|
||||||
|
from foo import (
|
||||||
|
bar,
|
||||||
|
# qux
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
def convert(collection):
|
||||||
|
# replace all variables by integers
|
||||||
|
replacement_dict = {
|
||||||
|
variable: f"{index}"
|
||||||
|
for index, variable
|
||||||
|
# 0 is reserved as line terminator
|
||||||
|
in enumerate(collection.variables(), start=1)
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
{
|
||||||
|
i: i
|
||||||
|
for i
|
||||||
|
# a comment
|
||||||
|
in range(5)
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
def get_subtree_proof_nodes(
|
||||||
|
chunk_index_groups: Sequence[Tuple[int, ...], ...],
|
||||||
|
) -> Tuple[int, ...]:
|
||||||
|
subtree_node_paths = (
|
||||||
|
# We take a candidate element from each group and shift it to
|
||||||
|
# remove the bits that are not common to other group members, then
|
||||||
|
# we convert it to a tree path that all elements from this group
|
||||||
|
# have in common.
|
||||||
|
chunk_index
|
||||||
|
for chunk_index, bits_to_truncate
|
||||||
|
# Each group will contain an even "power-of-two" number of# elements.
|
||||||
|
# This tells us how many tailing bits each element has# which need to
|
||||||
|
# be truncated to get the group's common prefix.
|
||||||
|
in ((group[0], (len(group) - 1).bit_length()) for group in chunk_index_groups)
|
||||||
|
)
|
||||||
|
return subtree_node_paths
|
||||||
|
|
||||||
|
|
||||||
|
if (
|
||||||
|
# comment1
|
||||||
|
a
|
||||||
|
# comment2
|
||||||
|
or (
|
||||||
|
# comment3
|
||||||
|
(
|
||||||
|
# comment4
|
||||||
|
b
|
||||||
|
)
|
||||||
|
# comment5
|
||||||
|
and
|
||||||
|
# comment6
|
||||||
|
c
|
||||||
|
or (
|
||||||
|
# comment7
|
||||||
|
d
|
||||||
|
)
|
||||||
|
)
|
||||||
|
):
|
||||||
|
print("Foo")
|
||||||
19
crates/ruff_python_formatter/resources/test/fixtures/black/cases/comments_non_breaking_space.py
vendored
Normal file
19
crates/ruff_python_formatter/resources/test/fixtures/black/cases/comments_non_breaking_space.py
vendored
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
from .config import ( ConfigTypeAttributes, Int, Path, # String,
|
||||||
|
# DEFAULT_TYPE_ATTRIBUTES,
|
||||||
|
)
|
||||||
|
|
||||||
|
result = 1 # A simple comment
|
||||||
|
result = ( 1, ) # Another one
|
||||||
|
|
||||||
|
result = 1 # type: ignore
|
||||||
|
result = 1# This comment is talking about type: ignore
|
||||||
|
square = Square(4) # type: Optional[Square]
|
||||||
|
|
||||||
|
def function(a:int=42):
|
||||||
|
""" This docstring is already formatted
|
||||||
|
a
|
||||||
|
b
|
||||||
|
"""
|
||||||
|
# There's a NBSP + 3 spaces before
|
||||||
|
# And 4 spaces on the next line
|
||||||
|
pass
|
||||||
@@ -0,0 +1,23 @@
|
|||||||
|
from .config import (
|
||||||
|
ConfigTypeAttributes,
|
||||||
|
Int,
|
||||||
|
Path, # String,
|
||||||
|
# DEFAULT_TYPE_ATTRIBUTES,
|
||||||
|
)
|
||||||
|
|
||||||
|
result = 1 # A simple comment
|
||||||
|
result = (1,) # Another one
|
||||||
|
|
||||||
|
result = 1 # type: ignore
|
||||||
|
result = 1 # This comment is talking about type: ignore
|
||||||
|
square = Square(4) # type: Optional[Square]
|
||||||
|
|
||||||
|
|
||||||
|
def function(a: int = 42):
|
||||||
|
"""This docstring is already formatted
|
||||||
|
a
|
||||||
|
b
|
||||||
|
"""
|
||||||
|
# There's a NBSP + 3 spaces before
|
||||||
|
# And 4 spaces on the next line
|
||||||
|
pass
|
||||||
181
crates/ruff_python_formatter/resources/test/fixtures/black/cases/composition.py
vendored
Normal file
181
crates/ruff_python_formatter/resources/test/fixtures/black/cases/composition.py
vendored
Normal file
@@ -0,0 +1,181 @@
|
|||||||
|
class C:
|
||||||
|
def test(self) -> None:
|
||||||
|
with patch("black.out", print):
|
||||||
|
self.assertEqual(
|
||||||
|
unstyle(str(report)), "1 file reformatted, 1 file failed to reformat."
|
||||||
|
)
|
||||||
|
self.assertEqual(
|
||||||
|
unstyle(str(report)),
|
||||||
|
"1 file reformatted, 1 file left unchanged, 1 file failed to reformat.",
|
||||||
|
)
|
||||||
|
self.assertEqual(
|
||||||
|
unstyle(str(report)),
|
||||||
|
"2 files reformatted, 1 file left unchanged, 1 file failed to"
|
||||||
|
" reformat.",
|
||||||
|
)
|
||||||
|
self.assertEqual(
|
||||||
|
unstyle(str(report)),
|
||||||
|
"2 files reformatted, 2 files left unchanged, 2 files failed to"
|
||||||
|
" reformat.",
|
||||||
|
)
|
||||||
|
for i in (a,):
|
||||||
|
if (
|
||||||
|
# Rule 1
|
||||||
|
i % 2 == 0
|
||||||
|
# Rule 2
|
||||||
|
and i % 3 == 0
|
||||||
|
):
|
||||||
|
while (
|
||||||
|
# Just a comment
|
||||||
|
call()
|
||||||
|
# Another
|
||||||
|
):
|
||||||
|
print(i)
|
||||||
|
xxxxxxxxxxxxxxxx = Yyyy2YyyyyYyyyyy(
|
||||||
|
push_manager=context.request.resource_manager,
|
||||||
|
max_items_to_push=num_items,
|
||||||
|
batch_size=Yyyy2YyyyYyyyyYyyy.FULL_SIZE,
|
||||||
|
).push(
|
||||||
|
# Only send the first n items.
|
||||||
|
items=items[:num_items]
|
||||||
|
)
|
||||||
|
return (
|
||||||
|
'Utterly failed doctest test for %s\n File "%s", line %s, in %s\n\n%s'
|
||||||
|
% (test.name, test.filename, lineno, lname, err)
|
||||||
|
)
|
||||||
|
|
||||||
|
def omitting_trailers(self) -> None:
|
||||||
|
get_collection(
|
||||||
|
hey_this_is_a_very_long_call, it_has_funny_attributes, really=True
|
||||||
|
)[OneLevelIndex]
|
||||||
|
get_collection(
|
||||||
|
hey_this_is_a_very_long_call, it_has_funny_attributes, really=True
|
||||||
|
)[OneLevelIndex][TwoLevelIndex][ThreeLevelIndex][FourLevelIndex]
|
||||||
|
d[0][1][2][3][4][5][6][7][8][9][10][11][12][13][14][15][16][17][18][19][20][21][
|
||||||
|
22
|
||||||
|
]
|
||||||
|
assignment = (
|
||||||
|
some.rather.elaborate.rule() and another.rule.ending_with.index[123]
|
||||||
|
)
|
||||||
|
|
||||||
|
def easy_asserts(self) -> None:
|
||||||
|
assert {
|
||||||
|
key1: value1,
|
||||||
|
key2: value2,
|
||||||
|
key3: value3,
|
||||||
|
key4: value4,
|
||||||
|
key5: value5,
|
||||||
|
key6: value6,
|
||||||
|
key7: value7,
|
||||||
|
key8: value8,
|
||||||
|
key9: value9,
|
||||||
|
} == expected, "Not what we expected"
|
||||||
|
|
||||||
|
assert expected == {
|
||||||
|
key1: value1,
|
||||||
|
key2: value2,
|
||||||
|
key3: value3,
|
||||||
|
key4: value4,
|
||||||
|
key5: value5,
|
||||||
|
key6: value6,
|
||||||
|
key7: value7,
|
||||||
|
key8: value8,
|
||||||
|
key9: value9,
|
||||||
|
}, "Not what we expected"
|
||||||
|
|
||||||
|
assert expected == {
|
||||||
|
key1: value1,
|
||||||
|
key2: value2,
|
||||||
|
key3: value3,
|
||||||
|
key4: value4,
|
||||||
|
key5: value5,
|
||||||
|
key6: value6,
|
||||||
|
key7: value7,
|
||||||
|
key8: value8,
|
||||||
|
key9: value9,
|
||||||
|
}
|
||||||
|
|
||||||
|
def tricky_asserts(self) -> None:
|
||||||
|
assert {
|
||||||
|
key1: value1,
|
||||||
|
key2: value2,
|
||||||
|
key3: value3,
|
||||||
|
key4: value4,
|
||||||
|
key5: value5,
|
||||||
|
key6: value6,
|
||||||
|
key7: value7,
|
||||||
|
key8: value8,
|
||||||
|
key9: value9,
|
||||||
|
} == expected(
|
||||||
|
value, is_going_to_be="too long to fit in a single line", srsly=True
|
||||||
|
), "Not what we expected"
|
||||||
|
|
||||||
|
assert {
|
||||||
|
key1: value1,
|
||||||
|
key2: value2,
|
||||||
|
key3: value3,
|
||||||
|
key4: value4,
|
||||||
|
key5: value5,
|
||||||
|
key6: value6,
|
||||||
|
key7: value7,
|
||||||
|
key8: value8,
|
||||||
|
key9: value9,
|
||||||
|
} == expected, (
|
||||||
|
"Not what we expected and the message is too long to fit in one line"
|
||||||
|
)
|
||||||
|
|
||||||
|
assert expected(
|
||||||
|
value, is_going_to_be="too long to fit in a single line", srsly=True
|
||||||
|
) == {
|
||||||
|
key1: value1,
|
||||||
|
key2: value2,
|
||||||
|
key3: value3,
|
||||||
|
key4: value4,
|
||||||
|
key5: value5,
|
||||||
|
key6: value6,
|
||||||
|
key7: value7,
|
||||||
|
key8: value8,
|
||||||
|
key9: value9,
|
||||||
|
}, "Not what we expected"
|
||||||
|
|
||||||
|
assert expected == {
|
||||||
|
key1: value1,
|
||||||
|
key2: value2,
|
||||||
|
key3: value3,
|
||||||
|
key4: value4,
|
||||||
|
key5: value5,
|
||||||
|
key6: value6,
|
||||||
|
key7: value7,
|
||||||
|
key8: value8,
|
||||||
|
key9: value9,
|
||||||
|
}, (
|
||||||
|
"Not what we expected and the message is too long to fit in one line"
|
||||||
|
" because it's too long"
|
||||||
|
)
|
||||||
|
|
||||||
|
dis_c_instance_method = """\
|
||||||
|
%3d 0 LOAD_FAST 1 (x)
|
||||||
|
2 LOAD_CONST 1 (1)
|
||||||
|
4 COMPARE_OP 2 (==)
|
||||||
|
6 LOAD_FAST 0 (self)
|
||||||
|
8 STORE_ATTR 0 (x)
|
||||||
|
10 LOAD_CONST 0 (None)
|
||||||
|
12 RETURN_VALUE
|
||||||
|
""" % (
|
||||||
|
_C.__init__.__code__.co_firstlineno + 1,
|
||||||
|
)
|
||||||
|
|
||||||
|
assert (
|
||||||
|
expectedexpectedexpectedexpectedexpectedexpectedexpectedexpectedexpect
|
||||||
|
== {
|
||||||
|
key1: value1,
|
||||||
|
key2: value2,
|
||||||
|
key3: value3,
|
||||||
|
key4: value4,
|
||||||
|
key5: value5,
|
||||||
|
key6: value6,
|
||||||
|
key7: value7,
|
||||||
|
key8: value8,
|
||||||
|
key9: value9,
|
||||||
|
}
|
||||||
|
)
|
||||||
181
crates/ruff_python_formatter/resources/test/fixtures/black/cases/composition.py.expect
vendored
Normal file
181
crates/ruff_python_formatter/resources/test/fixtures/black/cases/composition.py.expect
vendored
Normal file
@@ -0,0 +1,181 @@
|
|||||||
|
class C:
|
||||||
|
def test(self) -> None:
|
||||||
|
with patch("black.out", print):
|
||||||
|
self.assertEqual(
|
||||||
|
unstyle(str(report)), "1 file reformatted, 1 file failed to reformat."
|
||||||
|
)
|
||||||
|
self.assertEqual(
|
||||||
|
unstyle(str(report)),
|
||||||
|
"1 file reformatted, 1 file left unchanged, 1 file failed to reformat.",
|
||||||
|
)
|
||||||
|
self.assertEqual(
|
||||||
|
unstyle(str(report)),
|
||||||
|
"2 files reformatted, 1 file left unchanged, 1 file failed to"
|
||||||
|
" reformat.",
|
||||||
|
)
|
||||||
|
self.assertEqual(
|
||||||
|
unstyle(str(report)),
|
||||||
|
"2 files reformatted, 2 files left unchanged, 2 files failed to"
|
||||||
|
" reformat.",
|
||||||
|
)
|
||||||
|
for i in (a,):
|
||||||
|
if (
|
||||||
|
# Rule 1
|
||||||
|
i % 2 == 0
|
||||||
|
# Rule 2
|
||||||
|
and i % 3 == 0
|
||||||
|
):
|
||||||
|
while (
|
||||||
|
# Just a comment
|
||||||
|
call()
|
||||||
|
# Another
|
||||||
|
):
|
||||||
|
print(i)
|
||||||
|
xxxxxxxxxxxxxxxx = Yyyy2YyyyyYyyyyy(
|
||||||
|
push_manager=context.request.resource_manager,
|
||||||
|
max_items_to_push=num_items,
|
||||||
|
batch_size=Yyyy2YyyyYyyyyYyyy.FULL_SIZE,
|
||||||
|
).push(
|
||||||
|
# Only send the first n items.
|
||||||
|
items=items[:num_items]
|
||||||
|
)
|
||||||
|
return (
|
||||||
|
'Utterly failed doctest test for %s\n File "%s", line %s, in %s\n\n%s'
|
||||||
|
% (test.name, test.filename, lineno, lname, err)
|
||||||
|
)
|
||||||
|
|
||||||
|
def omitting_trailers(self) -> None:
|
||||||
|
get_collection(
|
||||||
|
hey_this_is_a_very_long_call, it_has_funny_attributes, really=True
|
||||||
|
)[OneLevelIndex]
|
||||||
|
get_collection(
|
||||||
|
hey_this_is_a_very_long_call, it_has_funny_attributes, really=True
|
||||||
|
)[OneLevelIndex][TwoLevelIndex][ThreeLevelIndex][FourLevelIndex]
|
||||||
|
d[0][1][2][3][4][5][6][7][8][9][10][11][12][13][14][15][16][17][18][19][20][21][
|
||||||
|
22
|
||||||
|
]
|
||||||
|
assignment = (
|
||||||
|
some.rather.elaborate.rule() and another.rule.ending_with.index[123]
|
||||||
|
)
|
||||||
|
|
||||||
|
def easy_asserts(self) -> None:
|
||||||
|
assert {
|
||||||
|
key1: value1,
|
||||||
|
key2: value2,
|
||||||
|
key3: value3,
|
||||||
|
key4: value4,
|
||||||
|
key5: value5,
|
||||||
|
key6: value6,
|
||||||
|
key7: value7,
|
||||||
|
key8: value8,
|
||||||
|
key9: value9,
|
||||||
|
} == expected, "Not what we expected"
|
||||||
|
|
||||||
|
assert expected == {
|
||||||
|
key1: value1,
|
||||||
|
key2: value2,
|
||||||
|
key3: value3,
|
||||||
|
key4: value4,
|
||||||
|
key5: value5,
|
||||||
|
key6: value6,
|
||||||
|
key7: value7,
|
||||||
|
key8: value8,
|
||||||
|
key9: value9,
|
||||||
|
}, "Not what we expected"
|
||||||
|
|
||||||
|
assert expected == {
|
||||||
|
key1: value1,
|
||||||
|
key2: value2,
|
||||||
|
key3: value3,
|
||||||
|
key4: value4,
|
||||||
|
key5: value5,
|
||||||
|
key6: value6,
|
||||||
|
key7: value7,
|
||||||
|
key8: value8,
|
||||||
|
key9: value9,
|
||||||
|
}
|
||||||
|
|
||||||
|
def tricky_asserts(self) -> None:
|
||||||
|
assert {
|
||||||
|
key1: value1,
|
||||||
|
key2: value2,
|
||||||
|
key3: value3,
|
||||||
|
key4: value4,
|
||||||
|
key5: value5,
|
||||||
|
key6: value6,
|
||||||
|
key7: value7,
|
||||||
|
key8: value8,
|
||||||
|
key9: value9,
|
||||||
|
} == expected(
|
||||||
|
value, is_going_to_be="too long to fit in a single line", srsly=True
|
||||||
|
), "Not what we expected"
|
||||||
|
|
||||||
|
assert {
|
||||||
|
key1: value1,
|
||||||
|
key2: value2,
|
||||||
|
key3: value3,
|
||||||
|
key4: value4,
|
||||||
|
key5: value5,
|
||||||
|
key6: value6,
|
||||||
|
key7: value7,
|
||||||
|
key8: value8,
|
||||||
|
key9: value9,
|
||||||
|
} == expected, (
|
||||||
|
"Not what we expected and the message is too long to fit in one line"
|
||||||
|
)
|
||||||
|
|
||||||
|
assert expected(
|
||||||
|
value, is_going_to_be="too long to fit in a single line", srsly=True
|
||||||
|
) == {
|
||||||
|
key1: value1,
|
||||||
|
key2: value2,
|
||||||
|
key3: value3,
|
||||||
|
key4: value4,
|
||||||
|
key5: value5,
|
||||||
|
key6: value6,
|
||||||
|
key7: value7,
|
||||||
|
key8: value8,
|
||||||
|
key9: value9,
|
||||||
|
}, "Not what we expected"
|
||||||
|
|
||||||
|
assert expected == {
|
||||||
|
key1: value1,
|
||||||
|
key2: value2,
|
||||||
|
key3: value3,
|
||||||
|
key4: value4,
|
||||||
|
key5: value5,
|
||||||
|
key6: value6,
|
||||||
|
key7: value7,
|
||||||
|
key8: value8,
|
||||||
|
key9: value9,
|
||||||
|
}, (
|
||||||
|
"Not what we expected and the message is too long to fit in one line"
|
||||||
|
" because it's too long"
|
||||||
|
)
|
||||||
|
|
||||||
|
dis_c_instance_method = """\
|
||||||
|
%3d 0 LOAD_FAST 1 (x)
|
||||||
|
2 LOAD_CONST 1 (1)
|
||||||
|
4 COMPARE_OP 2 (==)
|
||||||
|
6 LOAD_FAST 0 (self)
|
||||||
|
8 STORE_ATTR 0 (x)
|
||||||
|
10 LOAD_CONST 0 (None)
|
||||||
|
12 RETURN_VALUE
|
||||||
|
""" % (
|
||||||
|
_C.__init__.__code__.co_firstlineno + 1,
|
||||||
|
)
|
||||||
|
|
||||||
|
assert (
|
||||||
|
expectedexpectedexpectedexpectedexpectedexpectedexpectedexpectedexpect
|
||||||
|
== {
|
||||||
|
key1: value1,
|
||||||
|
key2: value2,
|
||||||
|
key3: value3,
|
||||||
|
key4: value4,
|
||||||
|
key5: value5,
|
||||||
|
key6: value6,
|
||||||
|
key7: value7,
|
||||||
|
key8: value8,
|
||||||
|
key9: value9,
|
||||||
|
}
|
||||||
|
)
|
||||||
181
crates/ruff_python_formatter/resources/test/fixtures/black/cases/composition_no_trailing_comma.py
vendored
Normal file
181
crates/ruff_python_formatter/resources/test/fixtures/black/cases/composition_no_trailing_comma.py
vendored
Normal file
@@ -0,0 +1,181 @@
|
|||||||
|
class C:
|
||||||
|
def test(self) -> None:
|
||||||
|
with patch("black.out", print):
|
||||||
|
self.assertEqual(
|
||||||
|
unstyle(str(report)), "1 file reformatted, 1 file failed to reformat."
|
||||||
|
)
|
||||||
|
self.assertEqual(
|
||||||
|
unstyle(str(report)),
|
||||||
|
"1 file reformatted, 1 file left unchanged, 1 file failed to reformat.",
|
||||||
|
)
|
||||||
|
self.assertEqual(
|
||||||
|
unstyle(str(report)),
|
||||||
|
"2 files reformatted, 1 file left unchanged, 1 file failed to"
|
||||||
|
" reformat.",
|
||||||
|
)
|
||||||
|
self.assertEqual(
|
||||||
|
unstyle(str(report)),
|
||||||
|
"2 files reformatted, 2 files left unchanged, 2 files failed to"
|
||||||
|
" reformat.",
|
||||||
|
)
|
||||||
|
for i in (a,):
|
||||||
|
if (
|
||||||
|
# Rule 1
|
||||||
|
i % 2 == 0
|
||||||
|
# Rule 2
|
||||||
|
and i % 3 == 0
|
||||||
|
):
|
||||||
|
while (
|
||||||
|
# Just a comment
|
||||||
|
call()
|
||||||
|
# Another
|
||||||
|
):
|
||||||
|
print(i)
|
||||||
|
xxxxxxxxxxxxxxxx = Yyyy2YyyyyYyyyyy(
|
||||||
|
push_manager=context.request.resource_manager,
|
||||||
|
max_items_to_push=num_items,
|
||||||
|
batch_size=Yyyy2YyyyYyyyyYyyy.FULL_SIZE
|
||||||
|
).push(
|
||||||
|
# Only send the first n items.
|
||||||
|
items=items[:num_items]
|
||||||
|
)
|
||||||
|
return (
|
||||||
|
'Utterly failed doctest test for %s\n File "%s", line %s, in %s\n\n%s'
|
||||||
|
% (test.name, test.filename, lineno, lname, err)
|
||||||
|
)
|
||||||
|
|
||||||
|
def omitting_trailers(self) -> None:
|
||||||
|
get_collection(
|
||||||
|
hey_this_is_a_very_long_call, it_has_funny_attributes, really=True
|
||||||
|
)[OneLevelIndex]
|
||||||
|
get_collection(
|
||||||
|
hey_this_is_a_very_long_call, it_has_funny_attributes, really=True
|
||||||
|
)[OneLevelIndex][TwoLevelIndex][ThreeLevelIndex][FourLevelIndex]
|
||||||
|
d[0][1][2][3][4][5][6][7][8][9][10][11][12][13][14][15][16][17][18][19][20][21][
|
||||||
|
22
|
||||||
|
]
|
||||||
|
assignment = (
|
||||||
|
some.rather.elaborate.rule() and another.rule.ending_with.index[123]
|
||||||
|
)
|
||||||
|
|
||||||
|
def easy_asserts(self) -> None:
|
||||||
|
assert {
|
||||||
|
key1: value1,
|
||||||
|
key2: value2,
|
||||||
|
key3: value3,
|
||||||
|
key4: value4,
|
||||||
|
key5: value5,
|
||||||
|
key6: value6,
|
||||||
|
key7: value7,
|
||||||
|
key8: value8,
|
||||||
|
key9: value9
|
||||||
|
} == expected, "Not what we expected"
|
||||||
|
|
||||||
|
assert expected == {
|
||||||
|
key1: value1,
|
||||||
|
key2: value2,
|
||||||
|
key3: value3,
|
||||||
|
key4: value4,
|
||||||
|
key5: value5,
|
||||||
|
key6: value6,
|
||||||
|
key7: value7,
|
||||||
|
key8: value8,
|
||||||
|
key9: value9
|
||||||
|
}, "Not what we expected"
|
||||||
|
|
||||||
|
assert expected == {
|
||||||
|
key1: value1,
|
||||||
|
key2: value2,
|
||||||
|
key3: value3,
|
||||||
|
key4: value4,
|
||||||
|
key5: value5,
|
||||||
|
key6: value6,
|
||||||
|
key7: value7,
|
||||||
|
key8: value8,
|
||||||
|
key9: value9
|
||||||
|
}
|
||||||
|
|
||||||
|
def tricky_asserts(self) -> None:
|
||||||
|
assert {
|
||||||
|
key1: value1,
|
||||||
|
key2: value2,
|
||||||
|
key3: value3,
|
||||||
|
key4: value4,
|
||||||
|
key5: value5,
|
||||||
|
key6: value6,
|
||||||
|
key7: value7,
|
||||||
|
key8: value8,
|
||||||
|
key9: value9
|
||||||
|
} == expected(
|
||||||
|
value, is_going_to_be="too long to fit in a single line", srsly=True
|
||||||
|
), "Not what we expected"
|
||||||
|
|
||||||
|
assert {
|
||||||
|
key1: value1,
|
||||||
|
key2: value2,
|
||||||
|
key3: value3,
|
||||||
|
key4: value4,
|
||||||
|
key5: value5,
|
||||||
|
key6: value6,
|
||||||
|
key7: value7,
|
||||||
|
key8: value8,
|
||||||
|
key9: value9
|
||||||
|
} == expected, (
|
||||||
|
"Not what we expected and the message is too long to fit in one line"
|
||||||
|
)
|
||||||
|
|
||||||
|
assert expected(
|
||||||
|
value, is_going_to_be="too long to fit in a single line", srsly=True
|
||||||
|
) == {
|
||||||
|
key1: value1,
|
||||||
|
key2: value2,
|
||||||
|
key3: value3,
|
||||||
|
key4: value4,
|
||||||
|
key5: value5,
|
||||||
|
key6: value6,
|
||||||
|
key7: value7,
|
||||||
|
key8: value8,
|
||||||
|
key9: value9
|
||||||
|
}, "Not what we expected"
|
||||||
|
|
||||||
|
assert expected == {
|
||||||
|
key1: value1,
|
||||||
|
key2: value2,
|
||||||
|
key3: value3,
|
||||||
|
key4: value4,
|
||||||
|
key5: value5,
|
||||||
|
key6: value6,
|
||||||
|
key7: value7,
|
||||||
|
key8: value8,
|
||||||
|
key9: value9
|
||||||
|
}, (
|
||||||
|
"Not what we expected and the message is too long to fit in one line"
|
||||||
|
" because it's too long"
|
||||||
|
)
|
||||||
|
|
||||||
|
dis_c_instance_method = """\
|
||||||
|
%3d 0 LOAD_FAST 1 (x)
|
||||||
|
2 LOAD_CONST 1 (1)
|
||||||
|
4 COMPARE_OP 2 (==)
|
||||||
|
6 LOAD_FAST 0 (self)
|
||||||
|
8 STORE_ATTR 0 (x)
|
||||||
|
10 LOAD_CONST 0 (None)
|
||||||
|
12 RETURN_VALUE
|
||||||
|
""" % (
|
||||||
|
_C.__init__.__code__.co_firstlineno + 1,
|
||||||
|
)
|
||||||
|
|
||||||
|
assert (
|
||||||
|
expectedexpectedexpectedexpectedexpectedexpectedexpectedexpectedexpect
|
||||||
|
== {
|
||||||
|
key1: value1,
|
||||||
|
key2: value2,
|
||||||
|
key3: value3,
|
||||||
|
key4: value4,
|
||||||
|
key5: value5,
|
||||||
|
key6: value6,
|
||||||
|
key7: value7,
|
||||||
|
key8: value8,
|
||||||
|
key9: value9
|
||||||
|
}
|
||||||
|
)
|
||||||
@@ -0,0 +1,181 @@
|
|||||||
|
class C:
|
||||||
|
def test(self) -> None:
|
||||||
|
with patch("black.out", print):
|
||||||
|
self.assertEqual(
|
||||||
|
unstyle(str(report)), "1 file reformatted, 1 file failed to reformat."
|
||||||
|
)
|
||||||
|
self.assertEqual(
|
||||||
|
unstyle(str(report)),
|
||||||
|
"1 file reformatted, 1 file left unchanged, 1 file failed to reformat.",
|
||||||
|
)
|
||||||
|
self.assertEqual(
|
||||||
|
unstyle(str(report)),
|
||||||
|
"2 files reformatted, 1 file left unchanged, 1 file failed to"
|
||||||
|
" reformat.",
|
||||||
|
)
|
||||||
|
self.assertEqual(
|
||||||
|
unstyle(str(report)),
|
||||||
|
"2 files reformatted, 2 files left unchanged, 2 files failed to"
|
||||||
|
" reformat.",
|
||||||
|
)
|
||||||
|
for i in (a,):
|
||||||
|
if (
|
||||||
|
# Rule 1
|
||||||
|
i % 2 == 0
|
||||||
|
# Rule 2
|
||||||
|
and i % 3 == 0
|
||||||
|
):
|
||||||
|
while (
|
||||||
|
# Just a comment
|
||||||
|
call()
|
||||||
|
# Another
|
||||||
|
):
|
||||||
|
print(i)
|
||||||
|
xxxxxxxxxxxxxxxx = Yyyy2YyyyyYyyyyy(
|
||||||
|
push_manager=context.request.resource_manager,
|
||||||
|
max_items_to_push=num_items,
|
||||||
|
batch_size=Yyyy2YyyyYyyyyYyyy.FULL_SIZE,
|
||||||
|
).push(
|
||||||
|
# Only send the first n items.
|
||||||
|
items=items[:num_items]
|
||||||
|
)
|
||||||
|
return (
|
||||||
|
'Utterly failed doctest test for %s\n File "%s", line %s, in %s\n\n%s'
|
||||||
|
% (test.name, test.filename, lineno, lname, err)
|
||||||
|
)
|
||||||
|
|
||||||
|
def omitting_trailers(self) -> None:
|
||||||
|
get_collection(
|
||||||
|
hey_this_is_a_very_long_call, it_has_funny_attributes, really=True
|
||||||
|
)[OneLevelIndex]
|
||||||
|
get_collection(
|
||||||
|
hey_this_is_a_very_long_call, it_has_funny_attributes, really=True
|
||||||
|
)[OneLevelIndex][TwoLevelIndex][ThreeLevelIndex][FourLevelIndex]
|
||||||
|
d[0][1][2][3][4][5][6][7][8][9][10][11][12][13][14][15][16][17][18][19][20][21][
|
||||||
|
22
|
||||||
|
]
|
||||||
|
assignment = (
|
||||||
|
some.rather.elaborate.rule() and another.rule.ending_with.index[123]
|
||||||
|
)
|
||||||
|
|
||||||
|
def easy_asserts(self) -> None:
|
||||||
|
assert {
|
||||||
|
key1: value1,
|
||||||
|
key2: value2,
|
||||||
|
key3: value3,
|
||||||
|
key4: value4,
|
||||||
|
key5: value5,
|
||||||
|
key6: value6,
|
||||||
|
key7: value7,
|
||||||
|
key8: value8,
|
||||||
|
key9: value9,
|
||||||
|
} == expected, "Not what we expected"
|
||||||
|
|
||||||
|
assert expected == {
|
||||||
|
key1: value1,
|
||||||
|
key2: value2,
|
||||||
|
key3: value3,
|
||||||
|
key4: value4,
|
||||||
|
key5: value5,
|
||||||
|
key6: value6,
|
||||||
|
key7: value7,
|
||||||
|
key8: value8,
|
||||||
|
key9: value9,
|
||||||
|
}, "Not what we expected"
|
||||||
|
|
||||||
|
assert expected == {
|
||||||
|
key1: value1,
|
||||||
|
key2: value2,
|
||||||
|
key3: value3,
|
||||||
|
key4: value4,
|
||||||
|
key5: value5,
|
||||||
|
key6: value6,
|
||||||
|
key7: value7,
|
||||||
|
key8: value8,
|
||||||
|
key9: value9,
|
||||||
|
}
|
||||||
|
|
||||||
|
def tricky_asserts(self) -> None:
|
||||||
|
assert {
|
||||||
|
key1: value1,
|
||||||
|
key2: value2,
|
||||||
|
key3: value3,
|
||||||
|
key4: value4,
|
||||||
|
key5: value5,
|
||||||
|
key6: value6,
|
||||||
|
key7: value7,
|
||||||
|
key8: value8,
|
||||||
|
key9: value9,
|
||||||
|
} == expected(
|
||||||
|
value, is_going_to_be="too long to fit in a single line", srsly=True
|
||||||
|
), "Not what we expected"
|
||||||
|
|
||||||
|
assert {
|
||||||
|
key1: value1,
|
||||||
|
key2: value2,
|
||||||
|
key3: value3,
|
||||||
|
key4: value4,
|
||||||
|
key5: value5,
|
||||||
|
key6: value6,
|
||||||
|
key7: value7,
|
||||||
|
key8: value8,
|
||||||
|
key9: value9,
|
||||||
|
} == expected, (
|
||||||
|
"Not what we expected and the message is too long to fit in one line"
|
||||||
|
)
|
||||||
|
|
||||||
|
assert expected(
|
||||||
|
value, is_going_to_be="too long to fit in a single line", srsly=True
|
||||||
|
) == {
|
||||||
|
key1: value1,
|
||||||
|
key2: value2,
|
||||||
|
key3: value3,
|
||||||
|
key4: value4,
|
||||||
|
key5: value5,
|
||||||
|
key6: value6,
|
||||||
|
key7: value7,
|
||||||
|
key8: value8,
|
||||||
|
key9: value9,
|
||||||
|
}, "Not what we expected"
|
||||||
|
|
||||||
|
assert expected == {
|
||||||
|
key1: value1,
|
||||||
|
key2: value2,
|
||||||
|
key3: value3,
|
||||||
|
key4: value4,
|
||||||
|
key5: value5,
|
||||||
|
key6: value6,
|
||||||
|
key7: value7,
|
||||||
|
key8: value8,
|
||||||
|
key9: value9,
|
||||||
|
}, (
|
||||||
|
"Not what we expected and the message is too long to fit in one line"
|
||||||
|
" because it's too long"
|
||||||
|
)
|
||||||
|
|
||||||
|
dis_c_instance_method = """\
|
||||||
|
%3d 0 LOAD_FAST 1 (x)
|
||||||
|
2 LOAD_CONST 1 (1)
|
||||||
|
4 COMPARE_OP 2 (==)
|
||||||
|
6 LOAD_FAST 0 (self)
|
||||||
|
8 STORE_ATTR 0 (x)
|
||||||
|
10 LOAD_CONST 0 (None)
|
||||||
|
12 RETURN_VALUE
|
||||||
|
""" % (
|
||||||
|
_C.__init__.__code__.co_firstlineno + 1,
|
||||||
|
)
|
||||||
|
|
||||||
|
assert (
|
||||||
|
expectedexpectedexpectedexpectedexpectedexpectedexpectedexpectedexpect
|
||||||
|
== {
|
||||||
|
key1: value1,
|
||||||
|
key2: value2,
|
||||||
|
key3: value3,
|
||||||
|
key4: value4,
|
||||||
|
key5: value5,
|
||||||
|
key6: value6,
|
||||||
|
key7: value7,
|
||||||
|
key8: value8,
|
||||||
|
key9: value9,
|
||||||
|
}
|
||||||
|
)
|
||||||
68
crates/ruff_python_formatter/resources/test/fixtures/black/cases/conditional_expression.py
vendored
Normal file
68
crates/ruff_python_formatter/resources/test/fixtures/black/cases/conditional_expression.py
vendored
Normal file
@@ -0,0 +1,68 @@
|
|||||||
|
# flags: --preview
|
||||||
|
long_kwargs_single_line = my_function(
|
||||||
|
foo="test, this is a sample value",
|
||||||
|
bar=some_long_value_name_foo_bar_baz if some_boolean_variable else some_fallback_value_foo_bar_baz,
|
||||||
|
baz="hello, this is a another value",
|
||||||
|
)
|
||||||
|
|
||||||
|
multiline_kwargs_indented = my_function(
|
||||||
|
foo="test, this is a sample value",
|
||||||
|
bar=some_long_value_name_foo_bar_baz
|
||||||
|
if some_boolean_variable
|
||||||
|
else some_fallback_value_foo_bar_baz,
|
||||||
|
baz="hello, this is a another value",
|
||||||
|
)
|
||||||
|
|
||||||
|
imploding_kwargs = my_function(
|
||||||
|
foo="test, this is a sample value",
|
||||||
|
bar=a
|
||||||
|
if foo
|
||||||
|
else b,
|
||||||
|
baz="hello, this is a another value",
|
||||||
|
)
|
||||||
|
|
||||||
|
imploding_line = (
|
||||||
|
1
|
||||||
|
if 1 + 1 == 2
|
||||||
|
else 0
|
||||||
|
)
|
||||||
|
|
||||||
|
exploding_line = "hello this is a slightly long string" if some_long_value_name_foo_bar_baz else "this one is a little shorter"
|
||||||
|
|
||||||
|
positional_argument_test(some_long_value_name_foo_bar_baz if some_boolean_variable else some_fallback_value_foo_bar_baz)
|
||||||
|
|
||||||
|
def weird_default_argument(x=some_long_value_name_foo_bar_baz
|
||||||
|
if SOME_CONSTANT
|
||||||
|
else some_fallback_value_foo_bar_baz):
|
||||||
|
pass
|
||||||
|
|
||||||
|
nested = "hello this is a slightly long string" if (some_long_value_name_foo_bar_baz if
|
||||||
|
nesting_test_expressions else some_fallback_value_foo_bar_baz) \
|
||||||
|
else "this one is a little shorter"
|
||||||
|
|
||||||
|
generator_expression = (
|
||||||
|
some_long_value_name_foo_bar_baz if some_boolean_variable else some_fallback_value_foo_bar_baz for some_boolean_variable in some_iterable
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
def limit_offset_sql(self, low_mark, high_mark):
|
||||||
|
"""Return LIMIT/OFFSET SQL clause."""
|
||||||
|
limit, offset = self._get_limit_offset_params(low_mark, high_mark)
|
||||||
|
return " ".join(
|
||||||
|
sql
|
||||||
|
for sql in (
|
||||||
|
"LIMIT %d" % limit if limit else None,
|
||||||
|
("OFFSET %d" % offset) if offset else None,
|
||||||
|
)
|
||||||
|
if sql
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
def something():
|
||||||
|
clone._iterable_class = (
|
||||||
|
NamedValuesListIterable
|
||||||
|
if named
|
||||||
|
else FlatValuesListIterable
|
||||||
|
if flat
|
||||||
|
else ValuesListIterable
|
||||||
|
)
|
||||||
@@ -0,0 +1,90 @@
|
|||||||
|
long_kwargs_single_line = my_function(
|
||||||
|
foo="test, this is a sample value",
|
||||||
|
bar=(
|
||||||
|
some_long_value_name_foo_bar_baz
|
||||||
|
if some_boolean_variable
|
||||||
|
else some_fallback_value_foo_bar_baz
|
||||||
|
),
|
||||||
|
baz="hello, this is a another value",
|
||||||
|
)
|
||||||
|
|
||||||
|
multiline_kwargs_indented = my_function(
|
||||||
|
foo="test, this is a sample value",
|
||||||
|
bar=(
|
||||||
|
some_long_value_name_foo_bar_baz
|
||||||
|
if some_boolean_variable
|
||||||
|
else some_fallback_value_foo_bar_baz
|
||||||
|
),
|
||||||
|
baz="hello, this is a another value",
|
||||||
|
)
|
||||||
|
|
||||||
|
imploding_kwargs = my_function(
|
||||||
|
foo="test, this is a sample value",
|
||||||
|
bar=a if foo else b,
|
||||||
|
baz="hello, this is a another value",
|
||||||
|
)
|
||||||
|
|
||||||
|
imploding_line = 1 if 1 + 1 == 2 else 0
|
||||||
|
|
||||||
|
exploding_line = (
|
||||||
|
"hello this is a slightly long string"
|
||||||
|
if some_long_value_name_foo_bar_baz
|
||||||
|
else "this one is a little shorter"
|
||||||
|
)
|
||||||
|
|
||||||
|
positional_argument_test(
|
||||||
|
some_long_value_name_foo_bar_baz
|
||||||
|
if some_boolean_variable
|
||||||
|
else some_fallback_value_foo_bar_baz
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
def weird_default_argument(
|
||||||
|
x=(
|
||||||
|
some_long_value_name_foo_bar_baz
|
||||||
|
if SOME_CONSTANT
|
||||||
|
else some_fallback_value_foo_bar_baz
|
||||||
|
),
|
||||||
|
):
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
nested = (
|
||||||
|
"hello this is a slightly long string"
|
||||||
|
if (
|
||||||
|
some_long_value_name_foo_bar_baz
|
||||||
|
if nesting_test_expressions
|
||||||
|
else some_fallback_value_foo_bar_baz
|
||||||
|
)
|
||||||
|
else "this one is a little shorter"
|
||||||
|
)
|
||||||
|
|
||||||
|
generator_expression = (
|
||||||
|
(
|
||||||
|
some_long_value_name_foo_bar_baz
|
||||||
|
if some_boolean_variable
|
||||||
|
else some_fallback_value_foo_bar_baz
|
||||||
|
)
|
||||||
|
for some_boolean_variable in some_iterable
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
def limit_offset_sql(self, low_mark, high_mark):
|
||||||
|
"""Return LIMIT/OFFSET SQL clause."""
|
||||||
|
limit, offset = self._get_limit_offset_params(low_mark, high_mark)
|
||||||
|
return " ".join(
|
||||||
|
sql
|
||||||
|
for sql in (
|
||||||
|
"LIMIT %d" % limit if limit else None,
|
||||||
|
("OFFSET %d" % offset) if offset else None,
|
||||||
|
)
|
||||||
|
if sql
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
def something():
|
||||||
|
clone._iterable_class = (
|
||||||
|
NamedValuesListIterable
|
||||||
|
if named
|
||||||
|
else FlatValuesListIterable if flat else ValuesListIterable
|
||||||
|
)
|
||||||
228
crates/ruff_python_formatter/resources/test/fixtures/black/cases/docstring.py
vendored
Normal file
228
crates/ruff_python_formatter/resources/test/fixtures/black/cases/docstring.py
vendored
Normal file
@@ -0,0 +1,228 @@
|
|||||||
|
class MyClass:
|
||||||
|
""" Multiline
|
||||||
|
class docstring
|
||||||
|
"""
|
||||||
|
|
||||||
|
def method(self):
|
||||||
|
"""Multiline
|
||||||
|
method docstring
|
||||||
|
"""
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
def foo():
|
||||||
|
"""This is a docstring with
|
||||||
|
some lines of text here
|
||||||
|
"""
|
||||||
|
return
|
||||||
|
|
||||||
|
|
||||||
|
def bar():
|
||||||
|
'''This is another docstring
|
||||||
|
with more lines of text
|
||||||
|
'''
|
||||||
|
return
|
||||||
|
|
||||||
|
|
||||||
|
def baz():
|
||||||
|
'''"This" is a string with some
|
||||||
|
embedded "quotes"'''
|
||||||
|
return
|
||||||
|
|
||||||
|
|
||||||
|
def troz():
|
||||||
|
'''Indentation with tabs
|
||||||
|
is just as OK
|
||||||
|
'''
|
||||||
|
return
|
||||||
|
|
||||||
|
|
||||||
|
def zort():
|
||||||
|
"""Another
|
||||||
|
multiline
|
||||||
|
docstring
|
||||||
|
"""
|
||||||
|
pass
|
||||||
|
|
||||||
|
def poit():
|
||||||
|
"""
|
||||||
|
Lorem ipsum dolor sit amet.
|
||||||
|
|
||||||
|
Consectetur adipiscing elit:
|
||||||
|
- sed do eiusmod tempor incididunt ut labore
|
||||||
|
- dolore magna aliqua
|
||||||
|
- enim ad minim veniam
|
||||||
|
- quis nostrud exercitation ullamco laboris nisi
|
||||||
|
- aliquip ex ea commodo consequat
|
||||||
|
"""
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
def under_indent():
|
||||||
|
"""
|
||||||
|
These lines are indented in a way that does not
|
||||||
|
make sense.
|
||||||
|
"""
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
def over_indent():
|
||||||
|
"""
|
||||||
|
This has a shallow indent
|
||||||
|
- But some lines are deeper
|
||||||
|
- And the closing quote is too deep
|
||||||
|
"""
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
def single_line():
|
||||||
|
"""But with a newline after it!
|
||||||
|
|
||||||
|
"""
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
def this():
|
||||||
|
r"""
|
||||||
|
'hey ho'
|
||||||
|
"""
|
||||||
|
|
||||||
|
|
||||||
|
def that():
|
||||||
|
""" "hey yah" """
|
||||||
|
|
||||||
|
|
||||||
|
def and_that():
|
||||||
|
"""
|
||||||
|
"hey yah" """
|
||||||
|
|
||||||
|
|
||||||
|
def and_this():
|
||||||
|
'''
|
||||||
|
"hey yah"'''
|
||||||
|
|
||||||
|
|
||||||
|
def multiline_whitespace():
|
||||||
|
'''
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
'''
|
||||||
|
|
||||||
|
|
||||||
|
def oneline_whitespace():
|
||||||
|
''' '''
|
||||||
|
|
||||||
|
|
||||||
|
def empty():
|
||||||
|
""""""
|
||||||
|
|
||||||
|
|
||||||
|
def single_quotes():
|
||||||
|
'testing'
|
||||||
|
|
||||||
|
|
||||||
|
def believe_it_or_not_this_is_in_the_py_stdlib(): '''
|
||||||
|
"hey yah"'''
|
||||||
|
|
||||||
|
|
||||||
|
def ignored_docstring():
|
||||||
|
"""a => \
|
||||||
|
b"""
|
||||||
|
|
||||||
|
def single_line_docstring_with_whitespace():
|
||||||
|
""" This should be stripped """
|
||||||
|
|
||||||
|
def docstring_with_inline_tabs_and_space_indentation():
|
||||||
|
"""hey
|
||||||
|
|
||||||
|
tab separated value
|
||||||
|
tab at start of line and then a tab separated value
|
||||||
|
multiple tabs at the beginning and inline
|
||||||
|
mixed tabs and spaces at beginning. next line has mixed tabs and spaces only.
|
||||||
|
|
||||||
|
line ends with some tabs
|
||||||
|
"""
|
||||||
|
|
||||||
|
|
||||||
|
def docstring_with_inline_tabs_and_tab_indentation():
|
||||||
|
"""hey
|
||||||
|
|
||||||
|
tab separated value
|
||||||
|
tab at start of line and then a tab separated value
|
||||||
|
multiple tabs at the beginning and inline
|
||||||
|
mixed tabs and spaces at beginning. next line has mixed tabs and spaces only.
|
||||||
|
|
||||||
|
line ends with some tabs
|
||||||
|
"""
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
def backslash_space():
|
||||||
|
"""\ """
|
||||||
|
|
||||||
|
|
||||||
|
def multiline_backslash_1():
|
||||||
|
'''
|
||||||
|
hey\there\
|
||||||
|
\ '''
|
||||||
|
|
||||||
|
|
||||||
|
def multiline_backslash_2():
|
||||||
|
'''
|
||||||
|
hey there \ '''
|
||||||
|
|
||||||
|
# Regression test for #3425
|
||||||
|
def multiline_backslash_really_long_dont_crash():
|
||||||
|
"""
|
||||||
|
hey there hello guten tag hi hoow are you ola zdravstvuyte ciao como estas ca va \ """
|
||||||
|
|
||||||
|
|
||||||
|
def multiline_backslash_3():
|
||||||
|
'''
|
||||||
|
already escaped \\ '''
|
||||||
|
|
||||||
|
|
||||||
|
def my_god_its_full_of_stars_1():
|
||||||
|
"I'm sorry Dave\u2001"
|
||||||
|
|
||||||
|
|
||||||
|
# the space below is actually a \u2001, removed in output
|
||||||
|
def my_god_its_full_of_stars_2():
|
||||||
|
"I'm sorry Dave "
|
||||||
|
|
||||||
|
|
||||||
|
def docstring_almost_at_line_limit():
|
||||||
|
"""long docstring................................................................."""
|
||||||
|
|
||||||
|
|
||||||
|
def docstring_almost_at_line_limit2():
|
||||||
|
"""long docstring.................................................................
|
||||||
|
|
||||||
|
..................................................................................
|
||||||
|
"""
|
||||||
|
|
||||||
|
|
||||||
|
def docstring_at_line_limit():
|
||||||
|
"""long docstring................................................................"""
|
||||||
|
|
||||||
|
|
||||||
|
def multiline_docstring_at_line_limit():
|
||||||
|
"""first line-----------------------------------------------------------------------
|
||||||
|
|
||||||
|
second line----------------------------------------------------------------------"""
|
||||||
|
|
||||||
|
|
||||||
|
def stable_quote_normalization_with_immediate_inner_single_quote(self):
|
||||||
|
''''<text here>
|
||||||
|
|
||||||
|
<text here, since without another non-empty line black is stable>
|
||||||
|
'''
|
||||||
|
|
||||||
|
|
||||||
|
def foo():
|
||||||
|
"""
|
||||||
|
Docstring with a backslash followed by a space\
|
||||||
|
and then another line
|
||||||
|
"""
|
||||||
226
crates/ruff_python_formatter/resources/test/fixtures/black/cases/docstring.py.expect
vendored
Normal file
226
crates/ruff_python_formatter/resources/test/fixtures/black/cases/docstring.py.expect
vendored
Normal file
@@ -0,0 +1,226 @@
|
|||||||
|
class MyClass:
|
||||||
|
"""Multiline
|
||||||
|
class docstring
|
||||||
|
"""
|
||||||
|
|
||||||
|
def method(self):
|
||||||
|
"""Multiline
|
||||||
|
method docstring
|
||||||
|
"""
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
def foo():
|
||||||
|
"""This is a docstring with
|
||||||
|
some lines of text here
|
||||||
|
"""
|
||||||
|
return
|
||||||
|
|
||||||
|
|
||||||
|
def bar():
|
||||||
|
"""This is another docstring
|
||||||
|
with more lines of text
|
||||||
|
"""
|
||||||
|
return
|
||||||
|
|
||||||
|
|
||||||
|
def baz():
|
||||||
|
'''"This" is a string with some
|
||||||
|
embedded "quotes"'''
|
||||||
|
return
|
||||||
|
|
||||||
|
|
||||||
|
def troz():
|
||||||
|
"""Indentation with tabs
|
||||||
|
is just as OK
|
||||||
|
"""
|
||||||
|
return
|
||||||
|
|
||||||
|
|
||||||
|
def zort():
|
||||||
|
"""Another
|
||||||
|
multiline
|
||||||
|
docstring
|
||||||
|
"""
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
def poit():
|
||||||
|
"""
|
||||||
|
Lorem ipsum dolor sit amet.
|
||||||
|
|
||||||
|
Consectetur adipiscing elit:
|
||||||
|
- sed do eiusmod tempor incididunt ut labore
|
||||||
|
- dolore magna aliqua
|
||||||
|
- enim ad minim veniam
|
||||||
|
- quis nostrud exercitation ullamco laboris nisi
|
||||||
|
- aliquip ex ea commodo consequat
|
||||||
|
"""
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
def under_indent():
|
||||||
|
"""
|
||||||
|
These lines are indented in a way that does not
|
||||||
|
make sense.
|
||||||
|
"""
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
def over_indent():
|
||||||
|
"""
|
||||||
|
This has a shallow indent
|
||||||
|
- But some lines are deeper
|
||||||
|
- And the closing quote is too deep
|
||||||
|
"""
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
def single_line():
|
||||||
|
"""But with a newline after it!"""
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
def this():
|
||||||
|
r"""
|
||||||
|
'hey ho'
|
||||||
|
"""
|
||||||
|
|
||||||
|
|
||||||
|
def that():
|
||||||
|
""" "hey yah" """
|
||||||
|
|
||||||
|
|
||||||
|
def and_that():
|
||||||
|
"""
|
||||||
|
"hey yah" """
|
||||||
|
|
||||||
|
|
||||||
|
def and_this():
|
||||||
|
'''
|
||||||
|
"hey yah"'''
|
||||||
|
|
||||||
|
|
||||||
|
def multiline_whitespace():
|
||||||
|
""" """
|
||||||
|
|
||||||
|
|
||||||
|
def oneline_whitespace():
|
||||||
|
""" """
|
||||||
|
|
||||||
|
|
||||||
|
def empty():
|
||||||
|
""""""
|
||||||
|
|
||||||
|
|
||||||
|
def single_quotes():
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
|
||||||
|
def believe_it_or_not_this_is_in_the_py_stdlib():
|
||||||
|
'''
|
||||||
|
"hey yah"'''
|
||||||
|
|
||||||
|
|
||||||
|
def ignored_docstring():
|
||||||
|
"""a => \
|
||||||
|
b"""
|
||||||
|
|
||||||
|
|
||||||
|
def single_line_docstring_with_whitespace():
|
||||||
|
"""This should be stripped"""
|
||||||
|
|
||||||
|
|
||||||
|
def docstring_with_inline_tabs_and_space_indentation():
|
||||||
|
"""hey
|
||||||
|
|
||||||
|
tab separated value
|
||||||
|
tab at start of line and then a tab separated value
|
||||||
|
multiple tabs at the beginning and inline
|
||||||
|
mixed tabs and spaces at beginning. next line has mixed tabs and spaces only.
|
||||||
|
|
||||||
|
line ends with some tabs
|
||||||
|
"""
|
||||||
|
|
||||||
|
|
||||||
|
def docstring_with_inline_tabs_and_tab_indentation():
|
||||||
|
"""hey
|
||||||
|
|
||||||
|
tab separated value
|
||||||
|
tab at start of line and then a tab separated value
|
||||||
|
multiple tabs at the beginning and inline
|
||||||
|
mixed tabs and spaces at beginning. next line has mixed tabs and spaces only.
|
||||||
|
|
||||||
|
line ends with some tabs
|
||||||
|
"""
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
def backslash_space():
|
||||||
|
"""\ """
|
||||||
|
|
||||||
|
|
||||||
|
def multiline_backslash_1():
|
||||||
|
"""
|
||||||
|
hey\there\
|
||||||
|
\ """
|
||||||
|
|
||||||
|
|
||||||
|
def multiline_backslash_2():
|
||||||
|
"""
|
||||||
|
hey there \ """
|
||||||
|
|
||||||
|
|
||||||
|
# Regression test for #3425
|
||||||
|
def multiline_backslash_really_long_dont_crash():
|
||||||
|
"""
|
||||||
|
hey there hello guten tag hi hoow are you ola zdravstvuyte ciao como estas ca va \ """
|
||||||
|
|
||||||
|
|
||||||
|
def multiline_backslash_3():
|
||||||
|
"""
|
||||||
|
already escaped \\"""
|
||||||
|
|
||||||
|
|
||||||
|
def my_god_its_full_of_stars_1():
|
||||||
|
"I'm sorry Dave\u2001"
|
||||||
|
|
||||||
|
|
||||||
|
# the space below is actually a \u2001, removed in output
|
||||||
|
def my_god_its_full_of_stars_2():
|
||||||
|
"I'm sorry Dave"
|
||||||
|
|
||||||
|
|
||||||
|
def docstring_almost_at_line_limit():
|
||||||
|
"""long docstring................................................................."""
|
||||||
|
|
||||||
|
|
||||||
|
def docstring_almost_at_line_limit2():
|
||||||
|
"""long docstring.................................................................
|
||||||
|
|
||||||
|
..................................................................................
|
||||||
|
"""
|
||||||
|
|
||||||
|
|
||||||
|
def docstring_at_line_limit():
|
||||||
|
"""long docstring................................................................"""
|
||||||
|
|
||||||
|
|
||||||
|
def multiline_docstring_at_line_limit():
|
||||||
|
"""first line-----------------------------------------------------------------------
|
||||||
|
|
||||||
|
second line----------------------------------------------------------------------"""
|
||||||
|
|
||||||
|
|
||||||
|
def stable_quote_normalization_with_immediate_inner_single_quote(self):
|
||||||
|
"""'<text here>
|
||||||
|
|
||||||
|
<text here, since without another non-empty line black is stable>
|
||||||
|
"""
|
||||||
|
|
||||||
|
|
||||||
|
def foo():
|
||||||
|
"""
|
||||||
|
Docstring with a backslash followed by a space\
|
||||||
|
and then another line
|
||||||
|
"""
|
||||||
@@ -0,0 +1,4 @@
|
|||||||
|
# Make sure when the file ends with class's docstring,
|
||||||
|
# It doesn't add extra blank lines.
|
||||||
|
class ClassWithDocstring:
|
||||||
|
"""A docstring."""
|
||||||
@@ -0,0 +1,4 @@
|
|||||||
|
# Make sure when the file ends with class's docstring,
|
||||||
|
# It doesn't add extra blank lines.
|
||||||
|
class ClassWithDocstring:
|
||||||
|
"""A docstring."""
|
||||||
@@ -0,0 +1,124 @@
|
|||||||
|
# flags: --skip-string-normalization
|
||||||
|
class ALonelyClass:
|
||||||
|
'''
|
||||||
|
A multiline class docstring.
|
||||||
|
'''
|
||||||
|
def AnEquallyLonelyMethod(self):
|
||||||
|
'''
|
||||||
|
A multiline method docstring'''
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
def one_function():
|
||||||
|
'''This is a docstring with a single line of text.'''
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
def shockingly_the_quotes_are_normalized():
|
||||||
|
'''This is a multiline docstring.
|
||||||
|
This is a multiline docstring.
|
||||||
|
This is a multiline docstring.
|
||||||
|
'''
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
def foo():
|
||||||
|
"""This is a docstring with
|
||||||
|
some lines of text here
|
||||||
|
"""
|
||||||
|
return
|
||||||
|
|
||||||
|
|
||||||
|
def baz():
|
||||||
|
'''"This" is a string with some
|
||||||
|
embedded "quotes"'''
|
||||||
|
return
|
||||||
|
|
||||||
|
|
||||||
|
def poit():
|
||||||
|
"""
|
||||||
|
Lorem ipsum dolor sit amet.
|
||||||
|
|
||||||
|
Consectetur adipiscing elit:
|
||||||
|
- sed do eiusmod tempor incididunt ut labore
|
||||||
|
- dolore magna aliqua
|
||||||
|
- enim ad minim veniam
|
||||||
|
- quis nostrud exercitation ullamco laboris nisi
|
||||||
|
- aliquip ex ea commodo consequat
|
||||||
|
"""
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
def under_indent():
|
||||||
|
"""
|
||||||
|
These lines are indented in a way that does not
|
||||||
|
make sense.
|
||||||
|
"""
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
def over_indent():
|
||||||
|
"""
|
||||||
|
This has a shallow indent
|
||||||
|
- But some lines are deeper
|
||||||
|
- And the closing quote is too deep
|
||||||
|
"""
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
def single_line():
|
||||||
|
"""But with a newline after it!
|
||||||
|
|
||||||
|
"""
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
def this():
|
||||||
|
r"""
|
||||||
|
'hey ho'
|
||||||
|
"""
|
||||||
|
|
||||||
|
|
||||||
|
def that():
|
||||||
|
""" "hey yah" """
|
||||||
|
|
||||||
|
|
||||||
|
def and_that():
|
||||||
|
"""
|
||||||
|
"hey yah" """
|
||||||
|
|
||||||
|
|
||||||
|
def and_this():
|
||||||
|
'''
|
||||||
|
"hey yah"'''
|
||||||
|
|
||||||
|
|
||||||
|
def believe_it_or_not_this_is_in_the_py_stdlib(): '''
|
||||||
|
"hey yah"'''
|
||||||
|
|
||||||
|
|
||||||
|
def shockingly_the_quotes_are_normalized_v2():
|
||||||
|
'''
|
||||||
|
Docstring Docstring Docstring
|
||||||
|
'''
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
def backslash_space():
|
||||||
|
'\ '
|
||||||
|
|
||||||
|
|
||||||
|
def multiline_backslash_1():
|
||||||
|
'''
|
||||||
|
hey\there\
|
||||||
|
\ '''
|
||||||
|
|
||||||
|
|
||||||
|
def multiline_backslash_2():
|
||||||
|
'''
|
||||||
|
hey there \ '''
|
||||||
|
|
||||||
|
|
||||||
|
def multiline_backslash_3():
|
||||||
|
'''
|
||||||
|
already escaped \\ '''
|
||||||
@@ -0,0 +1,123 @@
|
|||||||
|
class ALonelyClass:
|
||||||
|
'''
|
||||||
|
A multiline class docstring.
|
||||||
|
'''
|
||||||
|
|
||||||
|
def AnEquallyLonelyMethod(self):
|
||||||
|
'''
|
||||||
|
A multiline method docstring'''
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
def one_function():
|
||||||
|
'''This is a docstring with a single line of text.'''
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
def shockingly_the_quotes_are_normalized():
|
||||||
|
'''This is a multiline docstring.
|
||||||
|
This is a multiline docstring.
|
||||||
|
This is a multiline docstring.
|
||||||
|
'''
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
def foo():
|
||||||
|
"""This is a docstring with
|
||||||
|
some lines of text here
|
||||||
|
"""
|
||||||
|
return
|
||||||
|
|
||||||
|
|
||||||
|
def baz():
|
||||||
|
'''"This" is a string with some
|
||||||
|
embedded "quotes"'''
|
||||||
|
return
|
||||||
|
|
||||||
|
|
||||||
|
def poit():
|
||||||
|
"""
|
||||||
|
Lorem ipsum dolor sit amet.
|
||||||
|
|
||||||
|
Consectetur adipiscing elit:
|
||||||
|
- sed do eiusmod tempor incididunt ut labore
|
||||||
|
- dolore magna aliqua
|
||||||
|
- enim ad minim veniam
|
||||||
|
- quis nostrud exercitation ullamco laboris nisi
|
||||||
|
- aliquip ex ea commodo consequat
|
||||||
|
"""
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
def under_indent():
|
||||||
|
"""
|
||||||
|
These lines are indented in a way that does not
|
||||||
|
make sense.
|
||||||
|
"""
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
def over_indent():
|
||||||
|
"""
|
||||||
|
This has a shallow indent
|
||||||
|
- But some lines are deeper
|
||||||
|
- And the closing quote is too deep
|
||||||
|
"""
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
def single_line():
|
||||||
|
"""But with a newline after it!"""
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
def this():
|
||||||
|
r"""
|
||||||
|
'hey ho'
|
||||||
|
"""
|
||||||
|
|
||||||
|
|
||||||
|
def that():
|
||||||
|
""" "hey yah" """
|
||||||
|
|
||||||
|
|
||||||
|
def and_that():
|
||||||
|
"""
|
||||||
|
"hey yah" """
|
||||||
|
|
||||||
|
|
||||||
|
def and_this():
|
||||||
|
'''
|
||||||
|
"hey yah"'''
|
||||||
|
|
||||||
|
|
||||||
|
def believe_it_or_not_this_is_in_the_py_stdlib():
|
||||||
|
'''
|
||||||
|
"hey yah"'''
|
||||||
|
|
||||||
|
|
||||||
|
def shockingly_the_quotes_are_normalized_v2():
|
||||||
|
'''
|
||||||
|
Docstring Docstring Docstring
|
||||||
|
'''
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
def backslash_space():
|
||||||
|
'\ '
|
||||||
|
|
||||||
|
|
||||||
|
def multiline_backslash_1():
|
||||||
|
'''
|
||||||
|
hey\there\
|
||||||
|
\ '''
|
||||||
|
|
||||||
|
|
||||||
|
def multiline_backslash_2():
|
||||||
|
'''
|
||||||
|
hey there \ '''
|
||||||
|
|
||||||
|
|
||||||
|
def multiline_backslash_3():
|
||||||
|
'''
|
||||||
|
already escaped \\'''
|
||||||
50
crates/ruff_python_formatter/resources/test/fixtures/black/cases/docstring_preview.py
vendored
Normal file
50
crates/ruff_python_formatter/resources/test/fixtures/black/cases/docstring_preview.py
vendored
Normal file
@@ -0,0 +1,50 @@
|
|||||||
|
def docstring_almost_at_line_limit():
|
||||||
|
"""long docstring.................................................................
|
||||||
|
"""
|
||||||
|
|
||||||
|
|
||||||
|
def docstring_almost_at_line_limit_with_prefix():
|
||||||
|
f"""long docstring................................................................
|
||||||
|
"""
|
||||||
|
|
||||||
|
|
||||||
|
def mulitline_docstring_almost_at_line_limit():
|
||||||
|
"""long docstring.................................................................
|
||||||
|
|
||||||
|
..................................................................................
|
||||||
|
"""
|
||||||
|
|
||||||
|
|
||||||
|
def mulitline_docstring_almost_at_line_limit_with_prefix():
|
||||||
|
f"""long docstring................................................................
|
||||||
|
|
||||||
|
..................................................................................
|
||||||
|
"""
|
||||||
|
|
||||||
|
|
||||||
|
def docstring_at_line_limit():
|
||||||
|
"""long docstring................................................................"""
|
||||||
|
|
||||||
|
|
||||||
|
def docstring_at_line_limit_with_prefix():
|
||||||
|
f"""long docstring..............................................................."""
|
||||||
|
|
||||||
|
|
||||||
|
def multiline_docstring_at_line_limit():
|
||||||
|
"""first line-----------------------------------------------------------------------
|
||||||
|
|
||||||
|
second line----------------------------------------------------------------------"""
|
||||||
|
|
||||||
|
|
||||||
|
def multiline_docstring_at_line_limit_with_prefix():
|
||||||
|
f"""first line----------------------------------------------------------------------
|
||||||
|
|
||||||
|
second line----------------------------------------------------------------------"""
|
||||||
|
|
||||||
|
|
||||||
|
def single_quote_docstring_over_line_limit():
|
||||||
|
"We do not want to put the closing quote on a new line as that is invalid (see GH-3141)."
|
||||||
|
|
||||||
|
|
||||||
|
def single_quote_docstring_over_line_limit2():
|
||||||
|
'We do not want to put the closing quote on a new line as that is invalid (see GH-3141).'
|
||||||
49
crates/ruff_python_formatter/resources/test/fixtures/black/cases/docstring_preview.py.expect
vendored
Normal file
49
crates/ruff_python_formatter/resources/test/fixtures/black/cases/docstring_preview.py.expect
vendored
Normal file
@@ -0,0 +1,49 @@
|
|||||||
|
def docstring_almost_at_line_limit():
|
||||||
|
"""long docstring................................................................."""
|
||||||
|
|
||||||
|
|
||||||
|
def docstring_almost_at_line_limit_with_prefix():
|
||||||
|
f"""long docstring................................................................
|
||||||
|
"""
|
||||||
|
|
||||||
|
|
||||||
|
def mulitline_docstring_almost_at_line_limit():
|
||||||
|
"""long docstring.................................................................
|
||||||
|
|
||||||
|
..................................................................................
|
||||||
|
"""
|
||||||
|
|
||||||
|
|
||||||
|
def mulitline_docstring_almost_at_line_limit_with_prefix():
|
||||||
|
f"""long docstring................................................................
|
||||||
|
|
||||||
|
..................................................................................
|
||||||
|
"""
|
||||||
|
|
||||||
|
|
||||||
|
def docstring_at_line_limit():
|
||||||
|
"""long docstring................................................................"""
|
||||||
|
|
||||||
|
|
||||||
|
def docstring_at_line_limit_with_prefix():
|
||||||
|
f"""long docstring..............................................................."""
|
||||||
|
|
||||||
|
|
||||||
|
def multiline_docstring_at_line_limit():
|
||||||
|
"""first line-----------------------------------------------------------------------
|
||||||
|
|
||||||
|
second line----------------------------------------------------------------------"""
|
||||||
|
|
||||||
|
|
||||||
|
def multiline_docstring_at_line_limit_with_prefix():
|
||||||
|
f"""first line----------------------------------------------------------------------
|
||||||
|
|
||||||
|
second line----------------------------------------------------------------------"""
|
||||||
|
|
||||||
|
|
||||||
|
def single_quote_docstring_over_line_limit():
|
||||||
|
"We do not want to put the closing quote on a new line as that is invalid (see GH-3141)."
|
||||||
|
|
||||||
|
|
||||||
|
def single_quote_docstring_over_line_limit2():
|
||||||
|
"We do not want to put the closing quote on a new line as that is invalid (see GH-3141)."
|
||||||
92
crates/ruff_python_formatter/resources/test/fixtures/black/cases/empty_lines.py
vendored
Normal file
92
crates/ruff_python_formatter/resources/test/fixtures/black/cases/empty_lines.py
vendored
Normal file
@@ -0,0 +1,92 @@
|
|||||||
|
"""Docstring."""
|
||||||
|
|
||||||
|
|
||||||
|
# leading comment
|
||||||
|
def f():
|
||||||
|
NO = ''
|
||||||
|
SPACE = ' '
|
||||||
|
DOUBLESPACE = ' '
|
||||||
|
|
||||||
|
t = leaf.type
|
||||||
|
p = leaf.parent # trailing comment
|
||||||
|
v = leaf.value
|
||||||
|
|
||||||
|
if t in ALWAYS_NO_SPACE:
|
||||||
|
pass
|
||||||
|
if t == token.COMMENT: # another trailing comment
|
||||||
|
return DOUBLESPACE
|
||||||
|
|
||||||
|
|
||||||
|
assert p is not None, f"INTERNAL ERROR: hand-made leaf without parent: {leaf!r}"
|
||||||
|
|
||||||
|
|
||||||
|
prev = leaf.prev_sibling
|
||||||
|
if not prev:
|
||||||
|
prevp = preceding_leaf(p)
|
||||||
|
if not prevp or prevp.type in OPENING_BRACKETS:
|
||||||
|
|
||||||
|
|
||||||
|
return NO
|
||||||
|
|
||||||
|
|
||||||
|
if prevp.type == token.EQUAL:
|
||||||
|
if prevp.parent and prevp.parent.type in {
|
||||||
|
syms.typedargslist,
|
||||||
|
syms.varargslist,
|
||||||
|
syms.parameters,
|
||||||
|
syms.arglist,
|
||||||
|
syms.argument,
|
||||||
|
}:
|
||||||
|
return NO
|
||||||
|
|
||||||
|
elif prevp.type == token.DOUBLESTAR:
|
||||||
|
if prevp.parent and prevp.parent.type in {
|
||||||
|
syms.typedargslist,
|
||||||
|
syms.varargslist,
|
||||||
|
syms.parameters,
|
||||||
|
syms.arglist,
|
||||||
|
syms.dictsetmaker,
|
||||||
|
}:
|
||||||
|
return NO
|
||||||
|
|
||||||
|
###############################################################################
|
||||||
|
# SECTION BECAUSE SECTIONS
|
||||||
|
###############################################################################
|
||||||
|
|
||||||
|
def g():
|
||||||
|
NO = ''
|
||||||
|
SPACE = ' '
|
||||||
|
DOUBLESPACE = ' '
|
||||||
|
|
||||||
|
t = leaf.type
|
||||||
|
p = leaf.parent
|
||||||
|
v = leaf.value
|
||||||
|
|
||||||
|
# Comment because comments
|
||||||
|
|
||||||
|
if t in ALWAYS_NO_SPACE:
|
||||||
|
pass
|
||||||
|
if t == token.COMMENT:
|
||||||
|
return DOUBLESPACE
|
||||||
|
|
||||||
|
# Another comment because more comments
|
||||||
|
assert p is not None, f'INTERNAL ERROR: hand-made leaf without parent: {leaf!r}'
|
||||||
|
|
||||||
|
prev = leaf.prev_sibling
|
||||||
|
if not prev:
|
||||||
|
prevp = preceding_leaf(p)
|
||||||
|
|
||||||
|
if not prevp or prevp.type in OPENING_BRACKETS:
|
||||||
|
# Start of the line or a bracketed expression.
|
||||||
|
# More than one line for the comment.
|
||||||
|
return NO
|
||||||
|
|
||||||
|
if prevp.type == token.EQUAL:
|
||||||
|
if prevp.parent and prevp.parent.type in {
|
||||||
|
syms.typedargslist,
|
||||||
|
syms.varargslist,
|
||||||
|
syms.parameters,
|
||||||
|
syms.arglist,
|
||||||
|
syms.argument,
|
||||||
|
}:
|
||||||
|
return NO
|
||||||
89
crates/ruff_python_formatter/resources/test/fixtures/black/cases/empty_lines.py.expect
vendored
Normal file
89
crates/ruff_python_formatter/resources/test/fixtures/black/cases/empty_lines.py.expect
vendored
Normal file
@@ -0,0 +1,89 @@
|
|||||||
|
"""Docstring."""
|
||||||
|
|
||||||
|
|
||||||
|
# leading comment
|
||||||
|
def f():
|
||||||
|
NO = ""
|
||||||
|
SPACE = " "
|
||||||
|
DOUBLESPACE = " "
|
||||||
|
|
||||||
|
t = leaf.type
|
||||||
|
p = leaf.parent # trailing comment
|
||||||
|
v = leaf.value
|
||||||
|
|
||||||
|
if t in ALWAYS_NO_SPACE:
|
||||||
|
pass
|
||||||
|
if t == token.COMMENT: # another trailing comment
|
||||||
|
return DOUBLESPACE
|
||||||
|
|
||||||
|
assert p is not None, f"INTERNAL ERROR: hand-made leaf without parent: {leaf!r}"
|
||||||
|
|
||||||
|
prev = leaf.prev_sibling
|
||||||
|
if not prev:
|
||||||
|
prevp = preceding_leaf(p)
|
||||||
|
if not prevp or prevp.type in OPENING_BRACKETS:
|
||||||
|
return NO
|
||||||
|
|
||||||
|
if prevp.type == token.EQUAL:
|
||||||
|
if prevp.parent and prevp.parent.type in {
|
||||||
|
syms.typedargslist,
|
||||||
|
syms.varargslist,
|
||||||
|
syms.parameters,
|
||||||
|
syms.arglist,
|
||||||
|
syms.argument,
|
||||||
|
}:
|
||||||
|
return NO
|
||||||
|
|
||||||
|
elif prevp.type == token.DOUBLESTAR:
|
||||||
|
if prevp.parent and prevp.parent.type in {
|
||||||
|
syms.typedargslist,
|
||||||
|
syms.varargslist,
|
||||||
|
syms.parameters,
|
||||||
|
syms.arglist,
|
||||||
|
syms.dictsetmaker,
|
||||||
|
}:
|
||||||
|
return NO
|
||||||
|
|
||||||
|
|
||||||
|
###############################################################################
|
||||||
|
# SECTION BECAUSE SECTIONS
|
||||||
|
###############################################################################
|
||||||
|
|
||||||
|
|
||||||
|
def g():
|
||||||
|
NO = ""
|
||||||
|
SPACE = " "
|
||||||
|
DOUBLESPACE = " "
|
||||||
|
|
||||||
|
t = leaf.type
|
||||||
|
p = leaf.parent
|
||||||
|
v = leaf.value
|
||||||
|
|
||||||
|
# Comment because comments
|
||||||
|
|
||||||
|
if t in ALWAYS_NO_SPACE:
|
||||||
|
pass
|
||||||
|
if t == token.COMMENT:
|
||||||
|
return DOUBLESPACE
|
||||||
|
|
||||||
|
# Another comment because more comments
|
||||||
|
assert p is not None, f"INTERNAL ERROR: hand-made leaf without parent: {leaf!r}"
|
||||||
|
|
||||||
|
prev = leaf.prev_sibling
|
||||||
|
if not prev:
|
||||||
|
prevp = preceding_leaf(p)
|
||||||
|
|
||||||
|
if not prevp or prevp.type in OPENING_BRACKETS:
|
||||||
|
# Start of the line or a bracketed expression.
|
||||||
|
# More than one line for the comment.
|
||||||
|
return NO
|
||||||
|
|
||||||
|
if prevp.type == token.EQUAL:
|
||||||
|
if prevp.parent and prevp.parent.type in {
|
||||||
|
syms.typedargslist,
|
||||||
|
syms.varargslist,
|
||||||
|
syms.parameters,
|
||||||
|
syms.arglist,
|
||||||
|
syms.argument,
|
||||||
|
}:
|
||||||
|
return NO
|
||||||
254
crates/ruff_python_formatter/resources/test/fixtures/black/cases/expression.py
vendored
Normal file
254
crates/ruff_python_formatter/resources/test/fixtures/black/cases/expression.py
vendored
Normal file
@@ -0,0 +1,254 @@
|
|||||||
|
...
|
||||||
|
'some_string'
|
||||||
|
b'\\xa3'
|
||||||
|
Name
|
||||||
|
None
|
||||||
|
True
|
||||||
|
False
|
||||||
|
1
|
||||||
|
1.0
|
||||||
|
1j
|
||||||
|
True or False
|
||||||
|
True or False or None
|
||||||
|
True and False
|
||||||
|
True and False and None
|
||||||
|
(Name1 and Name2) or Name3
|
||||||
|
Name1 and Name2 or Name3
|
||||||
|
Name1 or (Name2 and Name3)
|
||||||
|
Name1 or Name2 and Name3
|
||||||
|
(Name1 and Name2) or (Name3 and Name4)
|
||||||
|
Name1 and Name2 or Name3 and Name4
|
||||||
|
Name1 or (Name2 and Name3) or Name4
|
||||||
|
Name1 or Name2 and Name3 or Name4
|
||||||
|
v1 << 2
|
||||||
|
1 >> v2
|
||||||
|
1 % finished
|
||||||
|
1 + v2 - v3 * 4 ^ 5 ** v6 / 7 // 8
|
||||||
|
((1 + v2) - (v3 * 4)) ^ (((5 ** v6) / 7) // 8)
|
||||||
|
not great
|
||||||
|
~great
|
||||||
|
+value
|
||||||
|
-1
|
||||||
|
~int and not v1 ^ 123 + v2 | True
|
||||||
|
(~int) and (not ((v1 ^ (123 + v2)) | True))
|
||||||
|
+really ** -confusing ** ~operator ** -precedence
|
||||||
|
flags & ~ select.EPOLLIN and waiters.write_task is not None
|
||||||
|
lambda arg: None
|
||||||
|
lambda a=True: a
|
||||||
|
lambda a, b, c=True: a
|
||||||
|
lambda a, b, c=True, *, d=(1 << v2), e='str': a
|
||||||
|
lambda a, b, c=True, *vararg, d=(v1 << 2), e='str', **kwargs: a + b
|
||||||
|
manylambdas = lambda x=lambda y=lambda z=1: z: y(): x()
|
||||||
|
foo = (lambda port_id, ignore_missing: {"port1": port1_resource, "port2": port2_resource}[port_id])
|
||||||
|
1 if True else 2
|
||||||
|
str or None if True else str or bytes or None
|
||||||
|
(str or None) if True else (str or bytes or None)
|
||||||
|
str or None if (1 if True else 2) else str or bytes or None
|
||||||
|
(str or None) if (1 if True else 2) else (str or bytes or None)
|
||||||
|
((super_long_variable_name or None) if (1 if super_long_test_name else 2) else (str or bytes or None))
|
||||||
|
{'2.7': dead, '3.7': (long_live or die_hard)}
|
||||||
|
{'2.7': dead, '3.7': (long_live or die_hard), **{'3.6': verygood}}
|
||||||
|
{**a, **b, **c}
|
||||||
|
{'2.7', '3.6', '3.7', '3.8', '3.9', ('4.0' if gilectomy else '3.10')}
|
||||||
|
({'a': 'b'}, (True or False), (+value), 'string', b'bytes') or None
|
||||||
|
()
|
||||||
|
(1,)
|
||||||
|
(1, 2)
|
||||||
|
(1, 2, 3)
|
||||||
|
[]
|
||||||
|
[1, 2, 3, 4, 5, 6, 7, 8, 9, (10 or A), (11 or B), (12 or C)]
|
||||||
|
[1, 2, 3,]
|
||||||
|
[*a]
|
||||||
|
[*range(10)]
|
||||||
|
[*a, 4, 5,]
|
||||||
|
[4, *a, 5,]
|
||||||
|
[this_is_a_very_long_variable_which_will_force_a_delimiter_split, element, another, *more]
|
||||||
|
{i for i in (1, 2, 3)}
|
||||||
|
{(i ** 2) for i in (1, 2, 3)}
|
||||||
|
{(i ** 2) for i, _ in ((1, 'a'), (2, 'b'), (3, 'c'))}
|
||||||
|
{((i ** 2) + j) for i in (1, 2, 3) for j in (1, 2, 3)}
|
||||||
|
[i for i in (1, 2, 3)]
|
||||||
|
[(i ** 2) for i in (1, 2, 3)]
|
||||||
|
[(i ** 2) for i, _ in ((1, 'a'), (2, 'b'), (3, 'c'))]
|
||||||
|
[((i ** 2) + j) for i in (1, 2, 3) for j in (1, 2, 3)]
|
||||||
|
{i: 0 for i in (1, 2, 3)}
|
||||||
|
{i: j for i, j in ((1, 'a'), (2, 'b'), (3, 'c'))}
|
||||||
|
{a: b * 2 for a, b in dictionary.items()}
|
||||||
|
{a: b * -2 for a, b in dictionary.items()}
|
||||||
|
{k: v for k, v in this_is_a_very_long_variable_which_will_cause_a_trailing_comma_which_breaks_the_comprehension}
|
||||||
|
Python3 > Python2 > COBOL
|
||||||
|
Life is Life
|
||||||
|
call()
|
||||||
|
call(arg)
|
||||||
|
call(kwarg='hey')
|
||||||
|
call(arg, kwarg='hey')
|
||||||
|
call(arg, another, kwarg='hey', **kwargs)
|
||||||
|
call(this_is_a_very_long_variable_which_will_force_a_delimiter_split, arg, another, kwarg='hey', **kwargs) # note: no trailing comma pre-3.6
|
||||||
|
call(*gidgets[:2])
|
||||||
|
call(a, *gidgets[:2])
|
||||||
|
call(**self.screen_kwargs)
|
||||||
|
call(b, **self.screen_kwargs)
|
||||||
|
lukasz.langa.pl
|
||||||
|
call.me(maybe)
|
||||||
|
1 .real
|
||||||
|
1.0 .real
|
||||||
|
....__class__
|
||||||
|
list[str]
|
||||||
|
dict[str, int]
|
||||||
|
tuple[str, ...]
|
||||||
|
tuple[
|
||||||
|
str, int, float, dict[str, int]
|
||||||
|
]
|
||||||
|
tuple[str, int, float, dict[str, int],]
|
||||||
|
very_long_variable_name_filters: t.List[
|
||||||
|
t.Tuple[str, t.Union[str, t.List[t.Optional[str]]]],
|
||||||
|
]
|
||||||
|
xxxx_xxxxx_xxxx_xxx: Callable[..., List[SomeClass]] = classmethod( # type: ignore
|
||||||
|
sync(async_xxxx_xxx_xxxx_xxxxx_xxxx_xxx.__func__)
|
||||||
|
)
|
||||||
|
xxxx_xxx_xxxx_xxxxx_xxxx_xxx: Callable[..., List[SomeClass]] = classmethod( # type: ignore
|
||||||
|
sync(async_xxxx_xxx_xxxx_xxxxx_xxxx_xxx.__func__)
|
||||||
|
)
|
||||||
|
xxxx_xxx_xxxx_xxxxx_xxxx_xxx: Callable[
|
||||||
|
..., List[SomeClass]
|
||||||
|
] = classmethod(sync(async_xxxx_xxx_xxxx_xxxxx_xxxx_xxx.__func__)) # type: ignore
|
||||||
|
slice[0]
|
||||||
|
slice[0:1]
|
||||||
|
slice[0:1:2]
|
||||||
|
slice[:]
|
||||||
|
slice[:-1]
|
||||||
|
slice[1:]
|
||||||
|
slice[::-1]
|
||||||
|
slice[d :: d + 1]
|
||||||
|
slice[:c, c - 1]
|
||||||
|
numpy[:, 0:1]
|
||||||
|
numpy[:, :-1]
|
||||||
|
numpy[0, :]
|
||||||
|
numpy[:, i]
|
||||||
|
numpy[0, :2]
|
||||||
|
numpy[:N, 0]
|
||||||
|
numpy[:2, :4]
|
||||||
|
numpy[2:4, 1:5]
|
||||||
|
numpy[4:, 2:]
|
||||||
|
numpy[:, (0, 1, 2, 5)]
|
||||||
|
numpy[0, [0]]
|
||||||
|
numpy[:, [i]]
|
||||||
|
numpy[1 : c + 1, c]
|
||||||
|
numpy[-(c + 1) :, d]
|
||||||
|
numpy[:, l[-2]]
|
||||||
|
numpy[:, ::-1]
|
||||||
|
numpy[np.newaxis, :]
|
||||||
|
(str or None) if (sys.version_info[0] > (3,)) else (str or bytes or None)
|
||||||
|
{'2.7': dead, '3.7': long_live or die_hard}
|
||||||
|
{'2.7', '3.6', '3.7', '3.8', '3.9', '4.0' if gilectomy else '3.10'}
|
||||||
|
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10 or A, 11 or B, 12 or C]
|
||||||
|
(SomeName)
|
||||||
|
SomeName
|
||||||
|
(Good, Bad, Ugly)
|
||||||
|
(i for i in (1, 2, 3))
|
||||||
|
((i ** 2) for i in (1, 2, 3))
|
||||||
|
((i ** 2) for i, _ in ((1, 'a'), (2, 'b'), (3, 'c')))
|
||||||
|
(((i ** 2) + j) for i in (1, 2, 3) for j in (1, 2, 3))
|
||||||
|
(*starred,)
|
||||||
|
{"id": "1","type": "type","started_at": now(),"ended_at": now() + timedelta(days=10),"priority": 1,"import_session_id": 1,**kwargs}
|
||||||
|
a = (1,)
|
||||||
|
b = 1,
|
||||||
|
c = 1
|
||||||
|
d = (1,) + a + (2,)
|
||||||
|
e = (1,).count(1)
|
||||||
|
f = 1, *range(10)
|
||||||
|
g = 1, *"ten"
|
||||||
|
what_is_up_with_those_new_coord_names = (coord_names + set(vars_to_create)) + set(vars_to_remove)
|
||||||
|
what_is_up_with_those_new_coord_names = (coord_names | set(vars_to_create)) - set(vars_to_remove)
|
||||||
|
result = session.query(models.Customer.id).filter(models.Customer.account_id == account_id, models.Customer.email == email_address).order_by(models.Customer.id.asc()).all()
|
||||||
|
result = session.query(models.Customer.id).filter(models.Customer.account_id == account_id, models.Customer.email == email_address).order_by(models.Customer.id.asc(),).all()
|
||||||
|
Ø = set()
|
||||||
|
authors.łukasz.say_thanks()
|
||||||
|
mapping = {
|
||||||
|
A: 0.25 * (10.0 / 12),
|
||||||
|
B: 0.1 * (10.0 / 12),
|
||||||
|
C: 0.1 * (10.0 / 12),
|
||||||
|
D: 0.1 * (10.0 / 12),
|
||||||
|
}
|
||||||
|
|
||||||
|
def gen():
|
||||||
|
yield from outside_of_generator
|
||||||
|
a = (yield)
|
||||||
|
b = ((yield))
|
||||||
|
c = (((yield)))
|
||||||
|
|
||||||
|
async def f():
|
||||||
|
await some.complicated[0].call(with_args=(True or (1 is not 1)))
|
||||||
|
print(* [] or [1])
|
||||||
|
print(**{1: 3} if False else {x: x for x in range(3)})
|
||||||
|
print(* lambda x: x)
|
||||||
|
assert(not Test),("Short message")
|
||||||
|
assert this is ComplexTest and not requirements.fit_in_a_single_line(force=False), "Short message"
|
||||||
|
assert(((parens is TooMany)))
|
||||||
|
for x, in (1,), (2,), (3,): ...
|
||||||
|
for y in (): ...
|
||||||
|
for z in (i for i in (1, 2, 3)): ...
|
||||||
|
for i in (call()): ...
|
||||||
|
for j in (1 + (2 + 3)): ...
|
||||||
|
while(this and that): ...
|
||||||
|
for addr_family, addr_type, addr_proto, addr_canonname, addr_sockaddr in socket.getaddrinfo('google.com', 'http'):
|
||||||
|
pass
|
||||||
|
a = aaaa.bbbb.cccc.dddd.eeee.ffff.gggg.hhhh.iiii.jjjj.kkkk.llll.mmmm.nnnn.oooo.pppp in qqqq.rrrr.ssss.tttt.uuuu.vvvv.xxxx.yyyy.zzzz
|
||||||
|
a = aaaa.bbbb.cccc.dddd.eeee.ffff.gggg.hhhh.iiii.jjjj.kkkk.llll.mmmm.nnnn.oooo.pppp not in qqqq.rrrr.ssss.tttt.uuuu.vvvv.xxxx.yyyy.zzzz
|
||||||
|
a = aaaa.bbbb.cccc.dddd.eeee.ffff.gggg.hhhh.iiii.jjjj.kkkk.llll.mmmm.nnnn.oooo.pppp is qqqq.rrrr.ssss.tttt.uuuu.vvvv.xxxx.yyyy.zzzz
|
||||||
|
a = aaaa.bbbb.cccc.dddd.eeee.ffff.gggg.hhhh.iiii.jjjj.kkkk.llll.mmmm.nnnn.oooo.pppp is not qqqq.rrrr.ssss.tttt.uuuu.vvvv.xxxx.yyyy.zzzz
|
||||||
|
if (
|
||||||
|
threading.current_thread() != threading.main_thread() and
|
||||||
|
threading.current_thread() != threading.main_thread() or
|
||||||
|
signal.getsignal(signal.SIGINT) != signal.default_int_handler
|
||||||
|
):
|
||||||
|
return True
|
||||||
|
if (
|
||||||
|
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa |
|
||||||
|
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
|
||||||
|
):
|
||||||
|
return True
|
||||||
|
if (
|
||||||
|
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa &
|
||||||
|
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
|
||||||
|
):
|
||||||
|
return True
|
||||||
|
if (
|
||||||
|
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +
|
||||||
|
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
|
||||||
|
):
|
||||||
|
return True
|
||||||
|
if (
|
||||||
|
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -
|
||||||
|
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
|
||||||
|
):
|
||||||
|
return True
|
||||||
|
if (
|
||||||
|
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *
|
||||||
|
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
|
||||||
|
):
|
||||||
|
return True
|
||||||
|
if (
|
||||||
|
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa /
|
||||||
|
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
|
||||||
|
):
|
||||||
|
return True
|
||||||
|
if (
|
||||||
|
~ aaaa.a + aaaa.b - aaaa.c * aaaa.d / aaaa.e | aaaa.f & aaaa.g % aaaa.h ^ aaaa.i << aaaa.k >> aaaa.l ** aaaa.m // aaaa.n
|
||||||
|
):
|
||||||
|
return True
|
||||||
|
if (
|
||||||
|
~ aaaaaaaa.a + aaaaaaaa.b - aaaaaaaa.c @ aaaaaaaa.d / aaaaaaaa.e | aaaaaaaa.f & aaaaaaaa.g % aaaaaaaa.h ^ aaaaaaaa.i << aaaaaaaa.k >> aaaaaaaa.l ** aaaaaaaa.m // aaaaaaaa.n
|
||||||
|
):
|
||||||
|
return True
|
||||||
|
if (
|
||||||
|
~ aaaaaaaaaaaaaaaa.a + aaaaaaaaaaaaaaaa.b - aaaaaaaaaaaaaaaa.c * aaaaaaaaaaaaaaaa.d @ aaaaaaaaaaaaaaaa.e | aaaaaaaaaaaaaaaa.f & aaaaaaaaaaaaaaaa.g % aaaaaaaaaaaaaaaa.h ^ aaaaaaaaaaaaaaaa.i << aaaaaaaaaaaaaaaa.k >> aaaaaaaaaaaaaaaa.l ** aaaaaaaaaaaaaaaa.m // aaaaaaaaaaaaaaaa.n
|
||||||
|
):
|
||||||
|
return True
|
||||||
|
aaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaa - aaaaaaaaaaaaaaaa * (aaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaa) / (aaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaa)
|
||||||
|
aaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaa
|
||||||
|
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa >> aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
|
||||||
|
bbbb >> bbbb * bbbb
|
||||||
|
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ^bbbb.a & aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa^aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
|
||||||
|
last_call()
|
||||||
|
# standalone comment at ENDMARKER
|
||||||
371
crates/ruff_python_formatter/resources/test/fixtures/black/cases/expression.py.expect
vendored
Normal file
371
crates/ruff_python_formatter/resources/test/fixtures/black/cases/expression.py.expect
vendored
Normal file
@@ -0,0 +1,371 @@
|
|||||||
|
...
|
||||||
|
"some_string"
|
||||||
|
b"\\xa3"
|
||||||
|
Name
|
||||||
|
None
|
||||||
|
True
|
||||||
|
False
|
||||||
|
1
|
||||||
|
1.0
|
||||||
|
1j
|
||||||
|
True or False
|
||||||
|
True or False or None
|
||||||
|
True and False
|
||||||
|
True and False and None
|
||||||
|
(Name1 and Name2) or Name3
|
||||||
|
Name1 and Name2 or Name3
|
||||||
|
Name1 or (Name2 and Name3)
|
||||||
|
Name1 or Name2 and Name3
|
||||||
|
(Name1 and Name2) or (Name3 and Name4)
|
||||||
|
Name1 and Name2 or Name3 and Name4
|
||||||
|
Name1 or (Name2 and Name3) or Name4
|
||||||
|
Name1 or Name2 and Name3 or Name4
|
||||||
|
v1 << 2
|
||||||
|
1 >> v2
|
||||||
|
1 % finished
|
||||||
|
1 + v2 - v3 * 4 ^ 5**v6 / 7 // 8
|
||||||
|
((1 + v2) - (v3 * 4)) ^ (((5**v6) / 7) // 8)
|
||||||
|
not great
|
||||||
|
~great
|
||||||
|
+value
|
||||||
|
-1
|
||||||
|
~int and not v1 ^ 123 + v2 | True
|
||||||
|
(~int) and (not ((v1 ^ (123 + v2)) | True))
|
||||||
|
+(really ** -(confusing ** ~(operator**-precedence)))
|
||||||
|
flags & ~select.EPOLLIN and waiters.write_task is not None
|
||||||
|
lambda arg: None
|
||||||
|
lambda a=True: a
|
||||||
|
lambda a, b, c=True: a
|
||||||
|
lambda a, b, c=True, *, d=(1 << v2), e="str": a
|
||||||
|
lambda a, b, c=True, *vararg, d=(v1 << 2), e="str", **kwargs: a + b
|
||||||
|
manylambdas = lambda x=lambda y=lambda z=1: z: y(): x()
|
||||||
|
foo = lambda port_id, ignore_missing: {
|
||||||
|
"port1": port1_resource,
|
||||||
|
"port2": port2_resource,
|
||||||
|
}[port_id]
|
||||||
|
1 if True else 2
|
||||||
|
str or None if True else str or bytes or None
|
||||||
|
(str or None) if True else (str or bytes or None)
|
||||||
|
str or None if (1 if True else 2) else str or bytes or None
|
||||||
|
(str or None) if (1 if True else 2) else (str or bytes or None)
|
||||||
|
(
|
||||||
|
(super_long_variable_name or None)
|
||||||
|
if (1 if super_long_test_name else 2)
|
||||||
|
else (str or bytes or None)
|
||||||
|
)
|
||||||
|
{"2.7": dead, "3.7": (long_live or die_hard)}
|
||||||
|
{"2.7": dead, "3.7": (long_live or die_hard), **{"3.6": verygood}}
|
||||||
|
{**a, **b, **c}
|
||||||
|
{"2.7", "3.6", "3.7", "3.8", "3.9", ("4.0" if gilectomy else "3.10")}
|
||||||
|
({"a": "b"}, (True or False), (+value), "string", b"bytes") or None
|
||||||
|
()
|
||||||
|
(1,)
|
||||||
|
(1, 2)
|
||||||
|
(1, 2, 3)
|
||||||
|
[]
|
||||||
|
[1, 2, 3, 4, 5, 6, 7, 8, 9, (10 or A), (11 or B), (12 or C)]
|
||||||
|
[
|
||||||
|
1,
|
||||||
|
2,
|
||||||
|
3,
|
||||||
|
]
|
||||||
|
[*a]
|
||||||
|
[*range(10)]
|
||||||
|
[
|
||||||
|
*a,
|
||||||
|
4,
|
||||||
|
5,
|
||||||
|
]
|
||||||
|
[
|
||||||
|
4,
|
||||||
|
*a,
|
||||||
|
5,
|
||||||
|
]
|
||||||
|
[
|
||||||
|
this_is_a_very_long_variable_which_will_force_a_delimiter_split,
|
||||||
|
element,
|
||||||
|
another,
|
||||||
|
*more,
|
||||||
|
]
|
||||||
|
{i for i in (1, 2, 3)}
|
||||||
|
{(i**2) for i in (1, 2, 3)}
|
||||||
|
{(i**2) for i, _ in ((1, "a"), (2, "b"), (3, "c"))}
|
||||||
|
{((i**2) + j) for i in (1, 2, 3) for j in (1, 2, 3)}
|
||||||
|
[i for i in (1, 2, 3)]
|
||||||
|
[(i**2) for i in (1, 2, 3)]
|
||||||
|
[(i**2) for i, _ in ((1, "a"), (2, "b"), (3, "c"))]
|
||||||
|
[((i**2) + j) for i in (1, 2, 3) for j in (1, 2, 3)]
|
||||||
|
{i: 0 for i in (1, 2, 3)}
|
||||||
|
{i: j for i, j in ((1, "a"), (2, "b"), (3, "c"))}
|
||||||
|
{a: b * 2 for a, b in dictionary.items()}
|
||||||
|
{a: b * -2 for a, b in dictionary.items()}
|
||||||
|
{
|
||||||
|
k: v
|
||||||
|
for k, v in this_is_a_very_long_variable_which_will_cause_a_trailing_comma_which_breaks_the_comprehension
|
||||||
|
}
|
||||||
|
Python3 > Python2 > COBOL
|
||||||
|
Life is Life
|
||||||
|
call()
|
||||||
|
call(arg)
|
||||||
|
call(kwarg="hey")
|
||||||
|
call(arg, kwarg="hey")
|
||||||
|
call(arg, another, kwarg="hey", **kwargs)
|
||||||
|
call(
|
||||||
|
this_is_a_very_long_variable_which_will_force_a_delimiter_split,
|
||||||
|
arg,
|
||||||
|
another,
|
||||||
|
kwarg="hey",
|
||||||
|
**kwargs
|
||||||
|
) # note: no trailing comma pre-3.6
|
||||||
|
call(*gidgets[:2])
|
||||||
|
call(a, *gidgets[:2])
|
||||||
|
call(**self.screen_kwargs)
|
||||||
|
call(b, **self.screen_kwargs)
|
||||||
|
lukasz.langa.pl
|
||||||
|
call.me(maybe)
|
||||||
|
(1).real
|
||||||
|
(1.0).real
|
||||||
|
....__class__
|
||||||
|
list[str]
|
||||||
|
dict[str, int]
|
||||||
|
tuple[str, ...]
|
||||||
|
tuple[str, int, float, dict[str, int]]
|
||||||
|
tuple[
|
||||||
|
str,
|
||||||
|
int,
|
||||||
|
float,
|
||||||
|
dict[str, int],
|
||||||
|
]
|
||||||
|
very_long_variable_name_filters: t.List[
|
||||||
|
t.Tuple[str, t.Union[str, t.List[t.Optional[str]]]],
|
||||||
|
]
|
||||||
|
xxxx_xxxxx_xxxx_xxx: Callable[..., List[SomeClass]] = classmethod( # type: ignore
|
||||||
|
sync(async_xxxx_xxx_xxxx_xxxxx_xxxx_xxx.__func__)
|
||||||
|
)
|
||||||
|
xxxx_xxx_xxxx_xxxxx_xxxx_xxx: Callable[..., List[SomeClass]] = classmethod( # type: ignore
|
||||||
|
sync(async_xxxx_xxx_xxxx_xxxxx_xxxx_xxx.__func__)
|
||||||
|
)
|
||||||
|
xxxx_xxx_xxxx_xxxxx_xxxx_xxx: Callable[..., List[SomeClass]] = classmethod(
|
||||||
|
sync(async_xxxx_xxx_xxxx_xxxxx_xxxx_xxx.__func__)
|
||||||
|
) # type: ignore
|
||||||
|
slice[0]
|
||||||
|
slice[0:1]
|
||||||
|
slice[0:1:2]
|
||||||
|
slice[:]
|
||||||
|
slice[:-1]
|
||||||
|
slice[1:]
|
||||||
|
slice[::-1]
|
||||||
|
slice[d :: d + 1]
|
||||||
|
slice[:c, c - 1]
|
||||||
|
numpy[:, 0:1]
|
||||||
|
numpy[:, :-1]
|
||||||
|
numpy[0, :]
|
||||||
|
numpy[:, i]
|
||||||
|
numpy[0, :2]
|
||||||
|
numpy[:N, 0]
|
||||||
|
numpy[:2, :4]
|
||||||
|
numpy[2:4, 1:5]
|
||||||
|
numpy[4:, 2:]
|
||||||
|
numpy[:, (0, 1, 2, 5)]
|
||||||
|
numpy[0, [0]]
|
||||||
|
numpy[:, [i]]
|
||||||
|
numpy[1 : c + 1, c]
|
||||||
|
numpy[-(c + 1) :, d]
|
||||||
|
numpy[:, l[-2]]
|
||||||
|
numpy[:, ::-1]
|
||||||
|
numpy[np.newaxis, :]
|
||||||
|
(str or None) if (sys.version_info[0] > (3,)) else (str or bytes or None)
|
||||||
|
{"2.7": dead, "3.7": long_live or die_hard}
|
||||||
|
{"2.7", "3.6", "3.7", "3.8", "3.9", "4.0" if gilectomy else "3.10"}
|
||||||
|
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10 or A, 11 or B, 12 or C]
|
||||||
|
(SomeName)
|
||||||
|
SomeName
|
||||||
|
(Good, Bad, Ugly)
|
||||||
|
(i for i in (1, 2, 3))
|
||||||
|
((i**2) for i in (1, 2, 3))
|
||||||
|
((i**2) for i, _ in ((1, "a"), (2, "b"), (3, "c")))
|
||||||
|
(((i**2) + j) for i in (1, 2, 3) for j in (1, 2, 3))
|
||||||
|
(*starred,)
|
||||||
|
{
|
||||||
|
"id": "1",
|
||||||
|
"type": "type",
|
||||||
|
"started_at": now(),
|
||||||
|
"ended_at": now() + timedelta(days=10),
|
||||||
|
"priority": 1,
|
||||||
|
"import_session_id": 1,
|
||||||
|
**kwargs,
|
||||||
|
}
|
||||||
|
a = (1,)
|
||||||
|
b = (1,)
|
||||||
|
c = 1
|
||||||
|
d = (1,) + a + (2,)
|
||||||
|
e = (1,).count(1)
|
||||||
|
f = 1, *range(10)
|
||||||
|
g = 1, *"ten"
|
||||||
|
what_is_up_with_those_new_coord_names = (coord_names + set(vars_to_create)) + set(
|
||||||
|
vars_to_remove
|
||||||
|
)
|
||||||
|
what_is_up_with_those_new_coord_names = (coord_names | set(vars_to_create)) - set(
|
||||||
|
vars_to_remove
|
||||||
|
)
|
||||||
|
result = (
|
||||||
|
session.query(models.Customer.id)
|
||||||
|
.filter(
|
||||||
|
models.Customer.account_id == account_id, models.Customer.email == email_address
|
||||||
|
)
|
||||||
|
.order_by(models.Customer.id.asc())
|
||||||
|
.all()
|
||||||
|
)
|
||||||
|
result = (
|
||||||
|
session.query(models.Customer.id)
|
||||||
|
.filter(
|
||||||
|
models.Customer.account_id == account_id, models.Customer.email == email_address
|
||||||
|
)
|
||||||
|
.order_by(
|
||||||
|
models.Customer.id.asc(),
|
||||||
|
)
|
||||||
|
.all()
|
||||||
|
)
|
||||||
|
Ø = set()
|
||||||
|
authors.łukasz.say_thanks()
|
||||||
|
mapping = {
|
||||||
|
A: 0.25 * (10.0 / 12),
|
||||||
|
B: 0.1 * (10.0 / 12),
|
||||||
|
C: 0.1 * (10.0 / 12),
|
||||||
|
D: 0.1 * (10.0 / 12),
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
def gen():
|
||||||
|
yield from outside_of_generator
|
||||||
|
a = yield
|
||||||
|
b = yield
|
||||||
|
c = yield
|
||||||
|
|
||||||
|
|
||||||
|
async def f():
|
||||||
|
await some.complicated[0].call(with_args=(True or (1 is not 1)))
|
||||||
|
|
||||||
|
|
||||||
|
print(*[] or [1])
|
||||||
|
print(**{1: 3} if False else {x: x for x in range(3)})
|
||||||
|
print(*lambda x: x)
|
||||||
|
assert not Test, "Short message"
|
||||||
|
assert this is ComplexTest and not requirements.fit_in_a_single_line(
|
||||||
|
force=False
|
||||||
|
), "Short message"
|
||||||
|
assert parens is TooMany
|
||||||
|
for (x,) in (1,), (2,), (3,):
|
||||||
|
...
|
||||||
|
for y in ():
|
||||||
|
...
|
||||||
|
for z in (i for i in (1, 2, 3)):
|
||||||
|
...
|
||||||
|
for i in call():
|
||||||
|
...
|
||||||
|
for j in 1 + (2 + 3):
|
||||||
|
...
|
||||||
|
while this and that:
|
||||||
|
...
|
||||||
|
for (
|
||||||
|
addr_family,
|
||||||
|
addr_type,
|
||||||
|
addr_proto,
|
||||||
|
addr_canonname,
|
||||||
|
addr_sockaddr,
|
||||||
|
) in socket.getaddrinfo("google.com", "http"):
|
||||||
|
pass
|
||||||
|
a = (
|
||||||
|
aaaa.bbbb.cccc.dddd.eeee.ffff.gggg.hhhh.iiii.jjjj.kkkk.llll.mmmm.nnnn.oooo.pppp
|
||||||
|
in qqqq.rrrr.ssss.tttt.uuuu.vvvv.xxxx.yyyy.zzzz
|
||||||
|
)
|
||||||
|
a = (
|
||||||
|
aaaa.bbbb.cccc.dddd.eeee.ffff.gggg.hhhh.iiii.jjjj.kkkk.llll.mmmm.nnnn.oooo.pppp
|
||||||
|
not in qqqq.rrrr.ssss.tttt.uuuu.vvvv.xxxx.yyyy.zzzz
|
||||||
|
)
|
||||||
|
a = (
|
||||||
|
aaaa.bbbb.cccc.dddd.eeee.ffff.gggg.hhhh.iiii.jjjj.kkkk.llll.mmmm.nnnn.oooo.pppp
|
||||||
|
is qqqq.rrrr.ssss.tttt.uuuu.vvvv.xxxx.yyyy.zzzz
|
||||||
|
)
|
||||||
|
a = (
|
||||||
|
aaaa.bbbb.cccc.dddd.eeee.ffff.gggg.hhhh.iiii.jjjj.kkkk.llll.mmmm.nnnn.oooo.pppp
|
||||||
|
is not qqqq.rrrr.ssss.tttt.uuuu.vvvv.xxxx.yyyy.zzzz
|
||||||
|
)
|
||||||
|
if (
|
||||||
|
threading.current_thread() != threading.main_thread()
|
||||||
|
and threading.current_thread() != threading.main_thread()
|
||||||
|
or signal.getsignal(signal.SIGINT) != signal.default_int_handler
|
||||||
|
):
|
||||||
|
return True
|
||||||
|
if (
|
||||||
|
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
|
||||||
|
| aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
|
||||||
|
):
|
||||||
|
return True
|
||||||
|
if (
|
||||||
|
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
|
||||||
|
& aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
|
||||||
|
):
|
||||||
|
return True
|
||||||
|
if (
|
||||||
|
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
|
||||||
|
+ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
|
||||||
|
):
|
||||||
|
return True
|
||||||
|
if (
|
||||||
|
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
|
||||||
|
- aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
|
||||||
|
):
|
||||||
|
return True
|
||||||
|
if (
|
||||||
|
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
|
||||||
|
* aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
|
||||||
|
):
|
||||||
|
return True
|
||||||
|
if (
|
||||||
|
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
|
||||||
|
/ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
|
||||||
|
):
|
||||||
|
return True
|
||||||
|
if (
|
||||||
|
~aaaa.a + aaaa.b - aaaa.c * aaaa.d / aaaa.e
|
||||||
|
| aaaa.f & aaaa.g % aaaa.h ^ aaaa.i << aaaa.k >> aaaa.l**aaaa.m // aaaa.n
|
||||||
|
):
|
||||||
|
return True
|
||||||
|
if (
|
||||||
|
~aaaaaaaa.a + aaaaaaaa.b - aaaaaaaa.c @ aaaaaaaa.d / aaaaaaaa.e
|
||||||
|
| aaaaaaaa.f & aaaaaaaa.g % aaaaaaaa.h
|
||||||
|
^ aaaaaaaa.i << aaaaaaaa.k >> aaaaaaaa.l**aaaaaaaa.m // aaaaaaaa.n
|
||||||
|
):
|
||||||
|
return True
|
||||||
|
if (
|
||||||
|
~aaaaaaaaaaaaaaaa.a
|
||||||
|
+ aaaaaaaaaaaaaaaa.b
|
||||||
|
- aaaaaaaaaaaaaaaa.c * aaaaaaaaaaaaaaaa.d @ aaaaaaaaaaaaaaaa.e
|
||||||
|
| aaaaaaaaaaaaaaaa.f & aaaaaaaaaaaaaaaa.g % aaaaaaaaaaaaaaaa.h
|
||||||
|
^ aaaaaaaaaaaaaaaa.i
|
||||||
|
<< aaaaaaaaaaaaaaaa.k
|
||||||
|
>> aaaaaaaaaaaaaaaa.l**aaaaaaaaaaaaaaaa.m // aaaaaaaaaaaaaaaa.n
|
||||||
|
):
|
||||||
|
return True
|
||||||
|
(
|
||||||
|
aaaaaaaaaaaaaaaa
|
||||||
|
+ aaaaaaaaaaaaaaaa
|
||||||
|
- aaaaaaaaaaaaaaaa
|
||||||
|
* (aaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaa)
|
||||||
|
/ (aaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaa)
|
||||||
|
)
|
||||||
|
aaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaa
|
||||||
|
(
|
||||||
|
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
|
||||||
|
>> aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
|
||||||
|
<< aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
|
||||||
|
)
|
||||||
|
bbbb >> bbbb * bbbb
|
||||||
|
(
|
||||||
|
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
|
||||||
|
^ bbbb.a & aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
|
||||||
|
^ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
|
||||||
|
)
|
||||||
|
last_call()
|
||||||
|
# standalone comment at ENDMARKER
|
||||||
8
crates/ruff_python_formatter/resources/test/fixtures/black/cases/f_docstring.py
vendored
Normal file
8
crates/ruff_python_formatter/resources/test/fixtures/black/cases/f_docstring.py
vendored
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
def foo(e):
|
||||||
|
f""" {'.'.join(e)}"""
|
||||||
|
|
||||||
|
def bar(e):
|
||||||
|
f"{'.'.join(e)}"
|
||||||
|
|
||||||
|
def baz(e):
|
||||||
|
F""" {'.'.join(e)}"""
|
||||||
10
crates/ruff_python_formatter/resources/test/fixtures/black/cases/f_docstring.py.expect
vendored
Normal file
10
crates/ruff_python_formatter/resources/test/fixtures/black/cases/f_docstring.py.expect
vendored
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
def foo(e):
|
||||||
|
f""" {'.'.join(e)}"""
|
||||||
|
|
||||||
|
|
||||||
|
def bar(e):
|
||||||
|
f"{'.'.join(e)}"
|
||||||
|
|
||||||
|
|
||||||
|
def baz(e):
|
||||||
|
f""" {'.'.join(e)}"""
|
||||||
186
crates/ruff_python_formatter/resources/test/fixtures/black/cases/fmtonoff.py
vendored
Normal file
186
crates/ruff_python_formatter/resources/test/fixtures/black/cases/fmtonoff.py
vendored
Normal file
@@ -0,0 +1,186 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
import asyncio
|
||||||
|
import sys
|
||||||
|
|
||||||
|
from third_party import X, Y, Z
|
||||||
|
|
||||||
|
from library import some_connection, \
|
||||||
|
some_decorator
|
||||||
|
# fmt: off
|
||||||
|
from third_party import (X,
|
||||||
|
Y, Z)
|
||||||
|
# fmt: on
|
||||||
|
f'trigger 3.6 mode'
|
||||||
|
# Comment 1
|
||||||
|
|
||||||
|
# Comment 2
|
||||||
|
|
||||||
|
# fmt: off
|
||||||
|
def func_no_args():
|
||||||
|
a; b; c
|
||||||
|
if True: raise RuntimeError
|
||||||
|
if False: ...
|
||||||
|
for i in range(10):
|
||||||
|
print(i)
|
||||||
|
continue
|
||||||
|
exec('new-style exec', {}, {})
|
||||||
|
return None
|
||||||
|
async def coroutine(arg, exec=False):
|
||||||
|
'Single-line docstring. Multiline is harder to reformat.'
|
||||||
|
async with some_connection() as conn:
|
||||||
|
await conn.do_what_i_mean('SELECT bobby, tables FROM xkcd', timeout=2)
|
||||||
|
await asyncio.sleep(1)
|
||||||
|
@asyncio.coroutine
|
||||||
|
@some_decorator(
|
||||||
|
with_args=True,
|
||||||
|
many_args=[1,2,3]
|
||||||
|
)
|
||||||
|
def function_signature_stress_test(number:int,no_annotation=None,text:str='default',* ,debug:bool=False,**kwargs) -> str:
|
||||||
|
return text[number:-1]
|
||||||
|
# fmt: on
|
||||||
|
def spaces(a=1, b=(), c=[], d={}, e=True, f=-1, g=1 if False else 2, h="", i=r''):
|
||||||
|
offset = attr.ib(default=attr.Factory( lambda: _r.uniform(1, 2)))
|
||||||
|
assert task._cancel_stack[:len(old_stack)] == old_stack
|
||||||
|
def spaces_types(a: int = 1, b: tuple = (), c: list = [], d: dict = {}, e: bool = True, f: int = -1, g: int = 1 if False else 2, h: str = "", i: str = r''): ...
|
||||||
|
def spaces2(result= _core.Value(None)):
|
||||||
|
...
|
||||||
|
something = {
|
||||||
|
# fmt: off
|
||||||
|
key: 'value',
|
||||||
|
}
|
||||||
|
|
||||||
|
def subscriptlist():
|
||||||
|
atom[
|
||||||
|
# fmt: off
|
||||||
|
'some big and',
|
||||||
|
'complex subscript',
|
||||||
|
# fmt: on
|
||||||
|
goes + here, andhere,
|
||||||
|
]
|
||||||
|
|
||||||
|
def import_as_names():
|
||||||
|
# fmt: off
|
||||||
|
from hello import a, b
|
||||||
|
'unformatted'
|
||||||
|
# fmt: on
|
||||||
|
|
||||||
|
def testlist_star_expr():
|
||||||
|
# fmt: off
|
||||||
|
a , b = *hello
|
||||||
|
'unformatted'
|
||||||
|
# fmt: on
|
||||||
|
|
||||||
|
def yield_expr():
|
||||||
|
# fmt: off
|
||||||
|
yield hello
|
||||||
|
'unformatted'
|
||||||
|
# fmt: on
|
||||||
|
'formatted'
|
||||||
|
# fmt: off
|
||||||
|
( yield hello )
|
||||||
|
'unformatted'
|
||||||
|
# fmt: on
|
||||||
|
|
||||||
|
def example(session):
|
||||||
|
# fmt: off
|
||||||
|
result = session\
|
||||||
|
.query(models.Customer.id)\
|
||||||
|
.filter(models.Customer.account_id == account_id,
|
||||||
|
models.Customer.email == email_address)\
|
||||||
|
.order_by(models.Customer.id.asc())\
|
||||||
|
.all()
|
||||||
|
# fmt: on
|
||||||
|
def off_and_on_without_data():
|
||||||
|
"""All comments here are technically on the same prefix.
|
||||||
|
|
||||||
|
The comments between will be formatted. This is a known limitation.
|
||||||
|
"""
|
||||||
|
# fmt: off
|
||||||
|
|
||||||
|
|
||||||
|
#hey, that won't work
|
||||||
|
|
||||||
|
|
||||||
|
# fmt: on
|
||||||
|
pass
|
||||||
|
def on_and_off_broken():
|
||||||
|
"""Another known limitation."""
|
||||||
|
# fmt: on
|
||||||
|
# fmt: off
|
||||||
|
this=should.not_be.formatted()
|
||||||
|
and_=indeed . it is not formatted
|
||||||
|
because . the . handling . inside . generate_ignored_nodes()
|
||||||
|
now . considers . multiple . fmt . directives . within . one . prefix
|
||||||
|
# fmt: on
|
||||||
|
# fmt: off
|
||||||
|
# ...but comments still get reformatted even though they should not be
|
||||||
|
# fmt: on
|
||||||
|
def long_lines():
|
||||||
|
if True:
|
||||||
|
typedargslist.extend(
|
||||||
|
gen_annotated_params(ast_args.kwonlyargs, ast_args.kw_defaults, parameters, implicit_default=True)
|
||||||
|
)
|
||||||
|
# fmt: off
|
||||||
|
a = (
|
||||||
|
unnecessary_bracket()
|
||||||
|
)
|
||||||
|
# fmt: on
|
||||||
|
_type_comment_re = re.compile(
|
||||||
|
r"""
|
||||||
|
^
|
||||||
|
[\t ]*
|
||||||
|
\#[ ]type:[ ]*
|
||||||
|
(?P<type>
|
||||||
|
[^#\t\n]+?
|
||||||
|
)
|
||||||
|
(?<!ignore) # note: this will force the non-greedy + in <type> to match
|
||||||
|
# a trailing space which is why we need the silliness below
|
||||||
|
(?<!ignore[ ]{1})(?<!ignore[ ]{2})(?<!ignore[ ]{3})(?<!ignore[ ]{4})
|
||||||
|
(?<!ignore[ ]{5})(?<!ignore[ ]{6})(?<!ignore[ ]{7})(?<!ignore[ ]{8})
|
||||||
|
(?<!ignore[ ]{9})(?<!ignore[ ]{10})
|
||||||
|
[\t ]*
|
||||||
|
(?P<nl>
|
||||||
|
(?:\#[^\n]*)?
|
||||||
|
\n?
|
||||||
|
)
|
||||||
|
$
|
||||||
|
""",
|
||||||
|
# fmt: off
|
||||||
|
re.MULTILINE|re.VERBOSE
|
||||||
|
# fmt: on
|
||||||
|
)
|
||||||
|
def single_literal_yapf_disable():
|
||||||
|
"""Black does not support this."""
|
||||||
|
BAZ = {
|
||||||
|
(1, 2, 3, 4),
|
||||||
|
(5, 6, 7, 8),
|
||||||
|
(9, 10, 11, 12)
|
||||||
|
} # yapf: disable
|
||||||
|
cfg.rule(
|
||||||
|
"Default", "address",
|
||||||
|
xxxx_xxxx=["xxx-xxxxxx-xxxxxxxxxx"],
|
||||||
|
xxxxxx="xx_xxxxx", xxxxxxx="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
|
||||||
|
xxxxxxxxx_xxxx=True, xxxxxxxx_xxxxxxxxxx=False,
|
||||||
|
xxxxxx_xxxxxx=2, xxxxxx_xxxxx_xxxxxxxx=70, xxxxxx_xxxxxx_xxxxx=True,
|
||||||
|
# fmt: off
|
||||||
|
xxxxxxx_xxxxxxxxxxxx={
|
||||||
|
"xxxxxxxx": {
|
||||||
|
"xxxxxx": False,
|
||||||
|
"xxxxxxx": False,
|
||||||
|
"xxxx_xxxxxx": "xxxxx",
|
||||||
|
},
|
||||||
|
"xxxxxxxx-xxxxx": {
|
||||||
|
"xxxxxx": False,
|
||||||
|
"xxxxxxx": True,
|
||||||
|
"xxxx_xxxxxx": "xxxxxx",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
# fmt: on
|
||||||
|
xxxxxxxxxx_xxxxxxxxxxx_xxxxxxx_xxxxxxxxx=5
|
||||||
|
)
|
||||||
|
# fmt: off
|
||||||
|
yield 'hello'
|
||||||
|
# No formatting to the end of the file
|
||||||
|
l=[1,2,3]
|
||||||
|
d={'a':1,
|
||||||
|
'b':2}
|
||||||
223
crates/ruff_python_formatter/resources/test/fixtures/black/cases/fmtonoff.py.expect
vendored
Normal file
223
crates/ruff_python_formatter/resources/test/fixtures/black/cases/fmtonoff.py.expect
vendored
Normal file
@@ -0,0 +1,223 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
import asyncio
|
||||||
|
import sys
|
||||||
|
|
||||||
|
from third_party import X, Y, Z
|
||||||
|
|
||||||
|
from library import some_connection, some_decorator
|
||||||
|
# fmt: off
|
||||||
|
from third_party import (X,
|
||||||
|
Y, Z)
|
||||||
|
# fmt: on
|
||||||
|
f"trigger 3.6 mode"
|
||||||
|
# Comment 1
|
||||||
|
|
||||||
|
# Comment 2
|
||||||
|
|
||||||
|
|
||||||
|
# fmt: off
|
||||||
|
def func_no_args():
|
||||||
|
a; b; c
|
||||||
|
if True: raise RuntimeError
|
||||||
|
if False: ...
|
||||||
|
for i in range(10):
|
||||||
|
print(i)
|
||||||
|
continue
|
||||||
|
exec('new-style exec', {}, {})
|
||||||
|
return None
|
||||||
|
async def coroutine(arg, exec=False):
|
||||||
|
'Single-line docstring. Multiline is harder to reformat.'
|
||||||
|
async with some_connection() as conn:
|
||||||
|
await conn.do_what_i_mean('SELECT bobby, tables FROM xkcd', timeout=2)
|
||||||
|
await asyncio.sleep(1)
|
||||||
|
@asyncio.coroutine
|
||||||
|
@some_decorator(
|
||||||
|
with_args=True,
|
||||||
|
many_args=[1,2,3]
|
||||||
|
)
|
||||||
|
def function_signature_stress_test(number:int,no_annotation=None,text:str='default',* ,debug:bool=False,**kwargs) -> str:
|
||||||
|
return text[number:-1]
|
||||||
|
# fmt: on
|
||||||
|
def spaces(a=1, b=(), c=[], d={}, e=True, f=-1, g=1 if False else 2, h="", i=r""):
|
||||||
|
offset = attr.ib(default=attr.Factory(lambda: _r.uniform(1, 2)))
|
||||||
|
assert task._cancel_stack[: len(old_stack)] == old_stack
|
||||||
|
|
||||||
|
|
||||||
|
def spaces_types(
|
||||||
|
a: int = 1,
|
||||||
|
b: tuple = (),
|
||||||
|
c: list = [],
|
||||||
|
d: dict = {},
|
||||||
|
e: bool = True,
|
||||||
|
f: int = -1,
|
||||||
|
g: int = 1 if False else 2,
|
||||||
|
h: str = "",
|
||||||
|
i: str = r"",
|
||||||
|
):
|
||||||
|
...
|
||||||
|
|
||||||
|
|
||||||
|
def spaces2(result=_core.Value(None)):
|
||||||
|
...
|
||||||
|
|
||||||
|
|
||||||
|
something = {
|
||||||
|
# fmt: off
|
||||||
|
key: 'value',
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
def subscriptlist():
|
||||||
|
atom[
|
||||||
|
# fmt: off
|
||||||
|
'some big and',
|
||||||
|
'complex subscript',
|
||||||
|
# fmt: on
|
||||||
|
goes + here,
|
||||||
|
andhere,
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
|
def import_as_names():
|
||||||
|
# fmt: off
|
||||||
|
from hello import a, b
|
||||||
|
'unformatted'
|
||||||
|
# fmt: on
|
||||||
|
|
||||||
|
|
||||||
|
def testlist_star_expr():
|
||||||
|
# fmt: off
|
||||||
|
a , b = *hello
|
||||||
|
'unformatted'
|
||||||
|
# fmt: on
|
||||||
|
|
||||||
|
|
||||||
|
def yield_expr():
|
||||||
|
# fmt: off
|
||||||
|
yield hello
|
||||||
|
'unformatted'
|
||||||
|
# fmt: on
|
||||||
|
"formatted"
|
||||||
|
# fmt: off
|
||||||
|
( yield hello )
|
||||||
|
'unformatted'
|
||||||
|
# fmt: on
|
||||||
|
|
||||||
|
|
||||||
|
def example(session):
|
||||||
|
# fmt: off
|
||||||
|
result = session\
|
||||||
|
.query(models.Customer.id)\
|
||||||
|
.filter(models.Customer.account_id == account_id,
|
||||||
|
models.Customer.email == email_address)\
|
||||||
|
.order_by(models.Customer.id.asc())\
|
||||||
|
.all()
|
||||||
|
# fmt: on
|
||||||
|
|
||||||
|
|
||||||
|
def off_and_on_without_data():
|
||||||
|
"""All comments here are technically on the same prefix.
|
||||||
|
|
||||||
|
The comments between will be formatted. This is a known limitation.
|
||||||
|
"""
|
||||||
|
# fmt: off
|
||||||
|
|
||||||
|
# hey, that won't work
|
||||||
|
|
||||||
|
# fmt: on
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
def on_and_off_broken():
|
||||||
|
"""Another known limitation."""
|
||||||
|
# fmt: on
|
||||||
|
# fmt: off
|
||||||
|
this=should.not_be.formatted()
|
||||||
|
and_=indeed . it is not formatted
|
||||||
|
because . the . handling . inside . generate_ignored_nodes()
|
||||||
|
now . considers . multiple . fmt . directives . within . one . prefix
|
||||||
|
# fmt: on
|
||||||
|
# fmt: off
|
||||||
|
# ...but comments still get reformatted even though they should not be
|
||||||
|
# fmt: on
|
||||||
|
|
||||||
|
|
||||||
|
def long_lines():
|
||||||
|
if True:
|
||||||
|
typedargslist.extend(
|
||||||
|
gen_annotated_params(
|
||||||
|
ast_args.kwonlyargs,
|
||||||
|
ast_args.kw_defaults,
|
||||||
|
parameters,
|
||||||
|
implicit_default=True,
|
||||||
|
)
|
||||||
|
)
|
||||||
|
# fmt: off
|
||||||
|
a = (
|
||||||
|
unnecessary_bracket()
|
||||||
|
)
|
||||||
|
# fmt: on
|
||||||
|
_type_comment_re = re.compile(
|
||||||
|
r"""
|
||||||
|
^
|
||||||
|
[\t ]*
|
||||||
|
\#[ ]type:[ ]*
|
||||||
|
(?P<type>
|
||||||
|
[^#\t\n]+?
|
||||||
|
)
|
||||||
|
(?<!ignore) # note: this will force the non-greedy + in <type> to match
|
||||||
|
# a trailing space which is why we need the silliness below
|
||||||
|
(?<!ignore[ ]{1})(?<!ignore[ ]{2})(?<!ignore[ ]{3})(?<!ignore[ ]{4})
|
||||||
|
(?<!ignore[ ]{5})(?<!ignore[ ]{6})(?<!ignore[ ]{7})(?<!ignore[ ]{8})
|
||||||
|
(?<!ignore[ ]{9})(?<!ignore[ ]{10})
|
||||||
|
[\t ]*
|
||||||
|
(?P<nl>
|
||||||
|
(?:\#[^\n]*)?
|
||||||
|
\n?
|
||||||
|
)
|
||||||
|
$
|
||||||
|
""",
|
||||||
|
# fmt: off
|
||||||
|
re.MULTILINE|re.VERBOSE
|
||||||
|
# fmt: on
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
def single_literal_yapf_disable():
|
||||||
|
"""Black does not support this."""
|
||||||
|
BAZ = {(1, 2, 3, 4), (5, 6, 7, 8), (9, 10, 11, 12)} # yapf: disable
|
||||||
|
|
||||||
|
|
||||||
|
cfg.rule(
|
||||||
|
"Default",
|
||||||
|
"address",
|
||||||
|
xxxx_xxxx=["xxx-xxxxxx-xxxxxxxxxx"],
|
||||||
|
xxxxxx="xx_xxxxx",
|
||||||
|
xxxxxxx="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
|
||||||
|
xxxxxxxxx_xxxx=True,
|
||||||
|
xxxxxxxx_xxxxxxxxxx=False,
|
||||||
|
xxxxxx_xxxxxx=2,
|
||||||
|
xxxxxx_xxxxx_xxxxxxxx=70,
|
||||||
|
xxxxxx_xxxxxx_xxxxx=True,
|
||||||
|
# fmt: off
|
||||||
|
xxxxxxx_xxxxxxxxxxxx={
|
||||||
|
"xxxxxxxx": {
|
||||||
|
"xxxxxx": False,
|
||||||
|
"xxxxxxx": False,
|
||||||
|
"xxxx_xxxxxx": "xxxxx",
|
||||||
|
},
|
||||||
|
"xxxxxxxx-xxxxx": {
|
||||||
|
"xxxxxx": False,
|
||||||
|
"xxxxxxx": True,
|
||||||
|
"xxxx_xxxxxx": "xxxxxx",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
# fmt: on
|
||||||
|
xxxxxxxxxx_xxxxxxxxxxx_xxxxxxx_xxxxxxxxx=5,
|
||||||
|
)
|
||||||
|
# fmt: off
|
||||||
|
yield 'hello'
|
||||||
|
# No formatting to the end of the file
|
||||||
|
l=[1,2,3]
|
||||||
|
d={'a':1,
|
||||||
|
'b':2}
|
||||||
40
crates/ruff_python_formatter/resources/test/fixtures/black/cases/fmtonoff2.py
vendored
Normal file
40
crates/ruff_python_formatter/resources/test/fixtures/black/cases/fmtonoff2.py
vendored
Normal file
@@ -0,0 +1,40 @@
|
|||||||
|
import pytest
|
||||||
|
|
||||||
|
TmSt = 1
|
||||||
|
TmEx = 2
|
||||||
|
|
||||||
|
# fmt: off
|
||||||
|
|
||||||
|
# Test data:
|
||||||
|
# Position, Volume, State, TmSt/TmEx/None, [call, [arg1...]]
|
||||||
|
|
||||||
|
@pytest.mark.parametrize('test', [
|
||||||
|
|
||||||
|
# Test don't manage the volume
|
||||||
|
[
|
||||||
|
('stuff', 'in')
|
||||||
|
],
|
||||||
|
])
|
||||||
|
def test_fader(test):
|
||||||
|
pass
|
||||||
|
|
||||||
|
def check_fader(test):
|
||||||
|
|
||||||
|
pass
|
||||||
|
|
||||||
|
def verify_fader(test):
|
||||||
|
# misaligned comment
|
||||||
|
pass
|
||||||
|
|
||||||
|
def verify_fader(test):
|
||||||
|
"""Hey, ho."""
|
||||||
|
assert test.passed()
|
||||||
|
|
||||||
|
def test_calculate_fades():
|
||||||
|
calcs = [
|
||||||
|
# one is zero/none
|
||||||
|
(0, 4, 0, 0, 10, 0, 0, 6, 10),
|
||||||
|
(None, 4, 0, 0, 10, 0, 0, 6, 10),
|
||||||
|
]
|
||||||
|
|
||||||
|
# fmt: on
|
||||||
40
crates/ruff_python_formatter/resources/test/fixtures/black/cases/fmtonoff2.py.expect
vendored
Normal file
40
crates/ruff_python_formatter/resources/test/fixtures/black/cases/fmtonoff2.py.expect
vendored
Normal file
@@ -0,0 +1,40 @@
|
|||||||
|
import pytest
|
||||||
|
|
||||||
|
TmSt = 1
|
||||||
|
TmEx = 2
|
||||||
|
|
||||||
|
# fmt: off
|
||||||
|
|
||||||
|
# Test data:
|
||||||
|
# Position, Volume, State, TmSt/TmEx/None, [call, [arg1...]]
|
||||||
|
|
||||||
|
@pytest.mark.parametrize('test', [
|
||||||
|
|
||||||
|
# Test don't manage the volume
|
||||||
|
[
|
||||||
|
('stuff', 'in')
|
||||||
|
],
|
||||||
|
])
|
||||||
|
def test_fader(test):
|
||||||
|
pass
|
||||||
|
|
||||||
|
def check_fader(test):
|
||||||
|
|
||||||
|
pass
|
||||||
|
|
||||||
|
def verify_fader(test):
|
||||||
|
# misaligned comment
|
||||||
|
pass
|
||||||
|
|
||||||
|
def verify_fader(test):
|
||||||
|
"""Hey, ho."""
|
||||||
|
assert test.passed()
|
||||||
|
|
||||||
|
def test_calculate_fades():
|
||||||
|
calcs = [
|
||||||
|
# one is zero/none
|
||||||
|
(0, 4, 0, 0, 10, 0, 0, 6, 10),
|
||||||
|
(None, 4, 0, 0, 10, 0, 0, 6, 10),
|
||||||
|
]
|
||||||
|
|
||||||
|
# fmt: on
|
||||||
17
crates/ruff_python_formatter/resources/test/fixtures/black/cases/fmtonoff3.py
vendored
Normal file
17
crates/ruff_python_formatter/resources/test/fixtures/black/cases/fmtonoff3.py
vendored
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
# fmt: off
|
||||||
|
x = [
|
||||||
|
1, 2,
|
||||||
|
3, 4,
|
||||||
|
]
|
||||||
|
# fmt: on
|
||||||
|
|
||||||
|
# fmt: off
|
||||||
|
x = [
|
||||||
|
1, 2,
|
||||||
|
3, 4,
|
||||||
|
]
|
||||||
|
# fmt: on
|
||||||
|
|
||||||
|
x = [
|
||||||
|
1, 2, 3, 4
|
||||||
|
]
|
||||||
15
crates/ruff_python_formatter/resources/test/fixtures/black/cases/fmtonoff3.py.expect
vendored
Normal file
15
crates/ruff_python_formatter/resources/test/fixtures/black/cases/fmtonoff3.py.expect
vendored
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
# fmt: off
|
||||||
|
x = [
|
||||||
|
1, 2,
|
||||||
|
3, 4,
|
||||||
|
]
|
||||||
|
# fmt: on
|
||||||
|
|
||||||
|
# fmt: off
|
||||||
|
x = [
|
||||||
|
1, 2,
|
||||||
|
3, 4,
|
||||||
|
]
|
||||||
|
# fmt: on
|
||||||
|
|
||||||
|
x = [1, 2, 3, 4]
|
||||||
13
crates/ruff_python_formatter/resources/test/fixtures/black/cases/fmtonoff4.py
vendored
Normal file
13
crates/ruff_python_formatter/resources/test/fixtures/black/cases/fmtonoff4.py
vendored
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
# fmt: off
|
||||||
|
@test([
|
||||||
|
1, 2,
|
||||||
|
3, 4,
|
||||||
|
])
|
||||||
|
# fmt: on
|
||||||
|
def f(): pass
|
||||||
|
|
||||||
|
@test([
|
||||||
|
1, 2,
|
||||||
|
3, 4,
|
||||||
|
])
|
||||||
|
def f(): pass
|
||||||
20
crates/ruff_python_formatter/resources/test/fixtures/black/cases/fmtonoff4.py.expect
vendored
Normal file
20
crates/ruff_python_formatter/resources/test/fixtures/black/cases/fmtonoff4.py.expect
vendored
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
# fmt: off
|
||||||
|
@test([
|
||||||
|
1, 2,
|
||||||
|
3, 4,
|
||||||
|
])
|
||||||
|
# fmt: on
|
||||||
|
def f():
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
@test(
|
||||||
|
[
|
||||||
|
1,
|
||||||
|
2,
|
||||||
|
3,
|
||||||
|
4,
|
||||||
|
]
|
||||||
|
)
|
||||||
|
def f():
|
||||||
|
pass
|
||||||
84
crates/ruff_python_formatter/resources/test/fixtures/black/cases/fmtonoff5.py
vendored
Normal file
84
crates/ruff_python_formatter/resources/test/fixtures/black/cases/fmtonoff5.py
vendored
Normal file
@@ -0,0 +1,84 @@
|
|||||||
|
# Regression test for https://github.com/psf/black/issues/3129.
|
||||||
|
setup(
|
||||||
|
entry_points={
|
||||||
|
# fmt: off
|
||||||
|
"console_scripts": [
|
||||||
|
"foo-bar"
|
||||||
|
"=foo.bar.:main",
|
||||||
|
# fmt: on
|
||||||
|
] # Includes an formatted indentation.
|
||||||
|
},
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
# Regression test for https://github.com/psf/black/issues/2015.
|
||||||
|
run(
|
||||||
|
# fmt: off
|
||||||
|
[
|
||||||
|
"ls",
|
||||||
|
"-la",
|
||||||
|
]
|
||||||
|
# fmt: on
|
||||||
|
+ path,
|
||||||
|
check=True,
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
# Regression test for https://github.com/psf/black/issues/3026.
|
||||||
|
def test_func():
|
||||||
|
# yapf: disable
|
||||||
|
if unformatted( args ):
|
||||||
|
return True
|
||||||
|
# yapf: enable
|
||||||
|
elif b:
|
||||||
|
return True
|
||||||
|
|
||||||
|
return False
|
||||||
|
|
||||||
|
|
||||||
|
# Regression test for https://github.com/psf/black/issues/2567.
|
||||||
|
if True:
|
||||||
|
# fmt: off
|
||||||
|
for _ in range( 1 ):
|
||||||
|
# fmt: on
|
||||||
|
print ( "This won't be formatted" )
|
||||||
|
print ( "This won't be formatted either" )
|
||||||
|
else:
|
||||||
|
print ( "This will be formatted" )
|
||||||
|
|
||||||
|
|
||||||
|
# Regression test for https://github.com/psf/black/issues/3184.
|
||||||
|
class A:
|
||||||
|
async def call(param):
|
||||||
|
if param:
|
||||||
|
# fmt: off
|
||||||
|
if param[0:4] in (
|
||||||
|
"ABCD", "EFGH"
|
||||||
|
) :
|
||||||
|
# fmt: on
|
||||||
|
print ( "This won't be formatted" )
|
||||||
|
|
||||||
|
elif param[0:4] in ("ZZZZ",):
|
||||||
|
print ( "This won't be formatted either" )
|
||||||
|
|
||||||
|
print ( "This will be formatted" )
|
||||||
|
|
||||||
|
|
||||||
|
# Regression test for https://github.com/psf/black/issues/2985.
|
||||||
|
class Named(t.Protocol):
|
||||||
|
# fmt: off
|
||||||
|
@property
|
||||||
|
def this_wont_be_formatted ( self ) -> str: ...
|
||||||
|
|
||||||
|
class Factory(t.Protocol):
|
||||||
|
def this_will_be_formatted ( self, **kwargs ) -> Named: ...
|
||||||
|
# fmt: on
|
||||||
|
|
||||||
|
|
||||||
|
# Regression test for https://github.com/psf/black/issues/3436.
|
||||||
|
if x:
|
||||||
|
return x
|
||||||
|
# fmt: off
|
||||||
|
elif unformatted:
|
||||||
|
# fmt: on
|
||||||
|
will_be_formatted ()
|
||||||
87
crates/ruff_python_formatter/resources/test/fixtures/black/cases/fmtonoff5.py.expect
vendored
Normal file
87
crates/ruff_python_formatter/resources/test/fixtures/black/cases/fmtonoff5.py.expect
vendored
Normal file
@@ -0,0 +1,87 @@
|
|||||||
|
# Regression test for https://github.com/psf/black/issues/3129.
|
||||||
|
setup(
|
||||||
|
entry_points={
|
||||||
|
# fmt: off
|
||||||
|
"console_scripts": [
|
||||||
|
"foo-bar"
|
||||||
|
"=foo.bar.:main",
|
||||||
|
# fmt: on
|
||||||
|
] # Includes an formatted indentation.
|
||||||
|
},
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
# Regression test for https://github.com/psf/black/issues/2015.
|
||||||
|
run(
|
||||||
|
# fmt: off
|
||||||
|
[
|
||||||
|
"ls",
|
||||||
|
"-la",
|
||||||
|
]
|
||||||
|
# fmt: on
|
||||||
|
+ path,
|
||||||
|
check=True,
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
# Regression test for https://github.com/psf/black/issues/3026.
|
||||||
|
def test_func():
|
||||||
|
# yapf: disable
|
||||||
|
if unformatted( args ):
|
||||||
|
return True
|
||||||
|
# yapf: enable
|
||||||
|
elif b:
|
||||||
|
return True
|
||||||
|
|
||||||
|
return False
|
||||||
|
|
||||||
|
|
||||||
|
# Regression test for https://github.com/psf/black/issues/2567.
|
||||||
|
if True:
|
||||||
|
# fmt: off
|
||||||
|
for _ in range( 1 ):
|
||||||
|
# fmt: on
|
||||||
|
print ( "This won't be formatted" )
|
||||||
|
print ( "This won't be formatted either" )
|
||||||
|
else:
|
||||||
|
print("This will be formatted")
|
||||||
|
|
||||||
|
|
||||||
|
# Regression test for https://github.com/psf/black/issues/3184.
|
||||||
|
class A:
|
||||||
|
async def call(param):
|
||||||
|
if param:
|
||||||
|
# fmt: off
|
||||||
|
if param[0:4] in (
|
||||||
|
"ABCD", "EFGH"
|
||||||
|
) :
|
||||||
|
# fmt: on
|
||||||
|
print ( "This won't be formatted" )
|
||||||
|
|
||||||
|
elif param[0:4] in ("ZZZZ",):
|
||||||
|
print ( "This won't be formatted either" )
|
||||||
|
|
||||||
|
print("This will be formatted")
|
||||||
|
|
||||||
|
|
||||||
|
# Regression test for https://github.com/psf/black/issues/2985.
|
||||||
|
class Named(t.Protocol):
|
||||||
|
# fmt: off
|
||||||
|
@property
|
||||||
|
def this_wont_be_formatted ( self ) -> str: ...
|
||||||
|
|
||||||
|
|
||||||
|
class Factory(t.Protocol):
|
||||||
|
def this_will_be_formatted(self, **kwargs) -> Named:
|
||||||
|
...
|
||||||
|
|
||||||
|
# fmt: on
|
||||||
|
|
||||||
|
|
||||||
|
# Regression test for https://github.com/psf/black/issues/3436.
|
||||||
|
if x:
|
||||||
|
return x
|
||||||
|
# fmt: off
|
||||||
|
elif unformatted:
|
||||||
|
# fmt: on
|
||||||
|
will_be_formatted()
|
||||||
19
crates/ruff_python_formatter/resources/test/fixtures/black/cases/fmtpass_imports.py
vendored
Normal file
19
crates/ruff_python_formatter/resources/test/fixtures/black/cases/fmtpass_imports.py
vendored
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
# Regression test for https://github.com/psf/black/issues/3438
|
||||||
|
|
||||||
|
import ast
|
||||||
|
import collections # fmt: skip
|
||||||
|
import dataclasses
|
||||||
|
# fmt: off
|
||||||
|
import os
|
||||||
|
# fmt: on
|
||||||
|
import pathlib
|
||||||
|
|
||||||
|
import re # fmt: skip
|
||||||
|
import secrets
|
||||||
|
|
||||||
|
# fmt: off
|
||||||
|
import sys
|
||||||
|
# fmt: on
|
||||||
|
|
||||||
|
import tempfile
|
||||||
|
import zoneinfo
|
||||||
19
crates/ruff_python_formatter/resources/test/fixtures/black/cases/fmtpass_imports.py.expect
vendored
Normal file
19
crates/ruff_python_formatter/resources/test/fixtures/black/cases/fmtpass_imports.py.expect
vendored
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
# Regression test for https://github.com/psf/black/issues/3438
|
||||||
|
|
||||||
|
import ast
|
||||||
|
import collections # fmt: skip
|
||||||
|
import dataclasses
|
||||||
|
# fmt: off
|
||||||
|
import os
|
||||||
|
# fmt: on
|
||||||
|
import pathlib
|
||||||
|
|
||||||
|
import re # fmt: skip
|
||||||
|
import secrets
|
||||||
|
|
||||||
|
# fmt: off
|
||||||
|
import sys
|
||||||
|
# fmt: on
|
||||||
|
|
||||||
|
import tempfile
|
||||||
|
import zoneinfo
|
||||||
3
crates/ruff_python_formatter/resources/test/fixtures/black/cases/fmtskip.py
vendored
Normal file
3
crates/ruff_python_formatter/resources/test/fixtures/black/cases/fmtskip.py
vendored
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
a, b = 1, 2
|
||||||
|
c = 6 # fmt: skip
|
||||||
|
d = 5
|
||||||
3
crates/ruff_python_formatter/resources/test/fixtures/black/cases/fmtskip.py.expect
vendored
Normal file
3
crates/ruff_python_formatter/resources/test/fixtures/black/cases/fmtskip.py.expect
vendored
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
a, b = 1, 2
|
||||||
|
c = 6 # fmt: skip
|
||||||
|
d = 5
|
||||||
3
crates/ruff_python_formatter/resources/test/fixtures/black/cases/fmtskip2.py
vendored
Normal file
3
crates/ruff_python_formatter/resources/test/fixtures/black/cases/fmtskip2.py
vendored
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
l1 = ["This list should be broken up", "into multiple lines", "because it is way too long"]
|
||||||
|
l2 = ["But this list shouldn't", "even though it also has", "way too many characters in it"] # fmt: skip
|
||||||
|
l3 = ["I have", "trailing comma", "so I should be braked",]
|
||||||
11
crates/ruff_python_formatter/resources/test/fixtures/black/cases/fmtskip2.py.expect
vendored
Normal file
11
crates/ruff_python_formatter/resources/test/fixtures/black/cases/fmtskip2.py.expect
vendored
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
l1 = [
|
||||||
|
"This list should be broken up",
|
||||||
|
"into multiple lines",
|
||||||
|
"because it is way too long",
|
||||||
|
]
|
||||||
|
l2 = ["But this list shouldn't", "even though it also has", "way too many characters in it"] # fmt: skip
|
||||||
|
l3 = [
|
||||||
|
"I have",
|
||||||
|
"trailing comma",
|
||||||
|
"so I should be braked",
|
||||||
|
]
|
||||||
7
crates/ruff_python_formatter/resources/test/fixtures/black/cases/fmtskip3.py
vendored
Normal file
7
crates/ruff_python_formatter/resources/test/fixtures/black/cases/fmtskip3.py
vendored
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
a = 3
|
||||||
|
# fmt: off
|
||||||
|
b, c = 1, 2
|
||||||
|
d = 6 # fmt: skip
|
||||||
|
e = 5
|
||||||
|
# fmt: on
|
||||||
|
f = ["This is a very long line that should be formatted into a clearer line ", "by rearranging."]
|
||||||
10
crates/ruff_python_formatter/resources/test/fixtures/black/cases/fmtskip3.py.expect
vendored
Normal file
10
crates/ruff_python_formatter/resources/test/fixtures/black/cases/fmtskip3.py.expect
vendored
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
a = 3
|
||||||
|
# fmt: off
|
||||||
|
b, c = 1, 2
|
||||||
|
d = 6 # fmt: skip
|
||||||
|
e = 5
|
||||||
|
# fmt: on
|
||||||
|
f = [
|
||||||
|
"This is a very long line that should be formatted into a clearer line ",
|
||||||
|
"by rearranging.",
|
||||||
|
]
|
||||||
3
crates/ruff_python_formatter/resources/test/fixtures/black/cases/fmtskip4.py
vendored
Normal file
3
crates/ruff_python_formatter/resources/test/fixtures/black/cases/fmtskip4.py
vendored
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
a = 2
|
||||||
|
# fmt: skip
|
||||||
|
l = [1, 2, 3,]
|
||||||
7
crates/ruff_python_formatter/resources/test/fixtures/black/cases/fmtskip4.py.expect
vendored
Normal file
7
crates/ruff_python_formatter/resources/test/fixtures/black/cases/fmtskip4.py.expect
vendored
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
a = 2
|
||||||
|
# fmt: skip
|
||||||
|
l = [
|
||||||
|
1,
|
||||||
|
2,
|
||||||
|
3,
|
||||||
|
]
|
||||||
9
crates/ruff_python_formatter/resources/test/fixtures/black/cases/fmtskip5.py
vendored
Normal file
9
crates/ruff_python_formatter/resources/test/fixtures/black/cases/fmtskip5.py
vendored
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
a, b, c = 3, 4, 5
|
||||||
|
if (
|
||||||
|
a == 3
|
||||||
|
and b != 9 # fmt: skip
|
||||||
|
and c is not None
|
||||||
|
):
|
||||||
|
print("I'm good!")
|
||||||
|
else:
|
||||||
|
print("I'm bad")
|
||||||
9
crates/ruff_python_formatter/resources/test/fixtures/black/cases/fmtskip5.py.expect
vendored
Normal file
9
crates/ruff_python_formatter/resources/test/fixtures/black/cases/fmtskip5.py.expect
vendored
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
a, b, c = 3, 4, 5
|
||||||
|
if (
|
||||||
|
a == 3
|
||||||
|
and b != 9 # fmt: skip
|
||||||
|
and c is not None
|
||||||
|
):
|
||||||
|
print("I'm good!")
|
||||||
|
else:
|
||||||
|
print("I'm bad")
|
||||||
5
crates/ruff_python_formatter/resources/test/fixtures/black/cases/fmtskip6.py
vendored
Normal file
5
crates/ruff_python_formatter/resources/test/fixtures/black/cases/fmtskip6.py
vendored
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
class A:
|
||||||
|
def f(self):
|
||||||
|
for line in range(10):
|
||||||
|
if True:
|
||||||
|
pass # fmt: skip
|
||||||
5
crates/ruff_python_formatter/resources/test/fixtures/black/cases/fmtskip6.py.expect
vendored
Normal file
5
crates/ruff_python_formatter/resources/test/fixtures/black/cases/fmtskip6.py.expect
vendored
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
class A:
|
||||||
|
def f(self):
|
||||||
|
for line in range(10):
|
||||||
|
if True:
|
||||||
|
pass # fmt: skip
|
||||||
4
crates/ruff_python_formatter/resources/test/fixtures/black/cases/fmtskip7.py
vendored
Normal file
4
crates/ruff_python_formatter/resources/test/fixtures/black/cases/fmtskip7.py
vendored
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
a = "this is some code"
|
||||||
|
b = 5 #fmt:skip
|
||||||
|
c = 9 #fmt: skip
|
||||||
|
d = "thisisasuperlongstringthisisasuperlongstringthisisasuperlongstringthisisasuperlongstring" #fmt:skip
|
||||||
4
crates/ruff_python_formatter/resources/test/fixtures/black/cases/fmtskip7.py.expect
vendored
Normal file
4
crates/ruff_python_formatter/resources/test/fixtures/black/cases/fmtskip7.py.expect
vendored
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
a = "this is some code"
|
||||||
|
b = 5 # fmt:skip
|
||||||
|
c = 9 # fmt: skip
|
||||||
|
d = "thisisasuperlongstringthisisasuperlongstringthisisasuperlongstringthisisasuperlongstring" # fmt:skip
|
||||||
62
crates/ruff_python_formatter/resources/test/fixtures/black/cases/fmtskip8.py
vendored
Normal file
62
crates/ruff_python_formatter/resources/test/fixtures/black/cases/fmtskip8.py
vendored
Normal file
@@ -0,0 +1,62 @@
|
|||||||
|
# Make sure a leading comment is not removed.
|
||||||
|
def some_func( unformatted, args ): # fmt: skip
|
||||||
|
print("I am some_func")
|
||||||
|
return 0
|
||||||
|
# Make sure this comment is not removed.
|
||||||
|
|
||||||
|
|
||||||
|
# Make sure a leading comment is not removed.
|
||||||
|
async def some_async_func( unformatted, args): # fmt: skip
|
||||||
|
print("I am some_async_func")
|
||||||
|
await asyncio.sleep(1)
|
||||||
|
|
||||||
|
|
||||||
|
# Make sure a leading comment is not removed.
|
||||||
|
class SomeClass( Unformatted, SuperClasses ): # fmt: skip
|
||||||
|
def some_method( self, unformatted, args ): # fmt: skip
|
||||||
|
print("I am some_method")
|
||||||
|
return 0
|
||||||
|
|
||||||
|
async def some_async_method( self, unformatted, args ): # fmt: skip
|
||||||
|
print("I am some_async_method")
|
||||||
|
await asyncio.sleep(1)
|
||||||
|
|
||||||
|
|
||||||
|
# Make sure a leading comment is not removed.
|
||||||
|
if unformatted_call( args ): # fmt: skip
|
||||||
|
print("First branch")
|
||||||
|
# Make sure this is not removed.
|
||||||
|
elif another_unformatted_call( args ): # fmt: skip
|
||||||
|
print("Second branch")
|
||||||
|
else : # fmt: skip
|
||||||
|
print("Last branch")
|
||||||
|
|
||||||
|
|
||||||
|
while some_condition( unformatted, args ): # fmt: skip
|
||||||
|
print("Do something")
|
||||||
|
|
||||||
|
|
||||||
|
for i in some_iter( unformatted, args ): # fmt: skip
|
||||||
|
print("Do something")
|
||||||
|
|
||||||
|
|
||||||
|
async def test_async_for():
|
||||||
|
async for i in some_async_iter( unformatted, args ): # fmt: skip
|
||||||
|
print("Do something")
|
||||||
|
|
||||||
|
|
||||||
|
try : # fmt: skip
|
||||||
|
some_call()
|
||||||
|
except UnformattedError as ex: # fmt: skip
|
||||||
|
handle_exception()
|
||||||
|
finally : # fmt: skip
|
||||||
|
finally_call()
|
||||||
|
|
||||||
|
|
||||||
|
with give_me_context( unformatted, args ): # fmt: skip
|
||||||
|
print("Do something")
|
||||||
|
|
||||||
|
|
||||||
|
async def test_async_with():
|
||||||
|
async with give_me_async_context( unformatted, args ): # fmt: skip
|
||||||
|
print("Do something")
|
||||||
62
crates/ruff_python_formatter/resources/test/fixtures/black/cases/fmtskip8.py.expect
vendored
Normal file
62
crates/ruff_python_formatter/resources/test/fixtures/black/cases/fmtskip8.py.expect
vendored
Normal file
@@ -0,0 +1,62 @@
|
|||||||
|
# Make sure a leading comment is not removed.
|
||||||
|
def some_func( unformatted, args ): # fmt: skip
|
||||||
|
print("I am some_func")
|
||||||
|
return 0
|
||||||
|
# Make sure this comment is not removed.
|
||||||
|
|
||||||
|
|
||||||
|
# Make sure a leading comment is not removed.
|
||||||
|
async def some_async_func( unformatted, args): # fmt: skip
|
||||||
|
print("I am some_async_func")
|
||||||
|
await asyncio.sleep(1)
|
||||||
|
|
||||||
|
|
||||||
|
# Make sure a leading comment is not removed.
|
||||||
|
class SomeClass( Unformatted, SuperClasses ): # fmt: skip
|
||||||
|
def some_method( self, unformatted, args ): # fmt: skip
|
||||||
|
print("I am some_method")
|
||||||
|
return 0
|
||||||
|
|
||||||
|
async def some_async_method( self, unformatted, args ): # fmt: skip
|
||||||
|
print("I am some_async_method")
|
||||||
|
await asyncio.sleep(1)
|
||||||
|
|
||||||
|
|
||||||
|
# Make sure a leading comment is not removed.
|
||||||
|
if unformatted_call( args ): # fmt: skip
|
||||||
|
print("First branch")
|
||||||
|
# Make sure this is not removed.
|
||||||
|
elif another_unformatted_call( args ): # fmt: skip
|
||||||
|
print("Second branch")
|
||||||
|
else : # fmt: skip
|
||||||
|
print("Last branch")
|
||||||
|
|
||||||
|
|
||||||
|
while some_condition( unformatted, args ): # fmt: skip
|
||||||
|
print("Do something")
|
||||||
|
|
||||||
|
|
||||||
|
for i in some_iter( unformatted, args ): # fmt: skip
|
||||||
|
print("Do something")
|
||||||
|
|
||||||
|
|
||||||
|
async def test_async_for():
|
||||||
|
async for i in some_async_iter( unformatted, args ): # fmt: skip
|
||||||
|
print("Do something")
|
||||||
|
|
||||||
|
|
||||||
|
try : # fmt: skip
|
||||||
|
some_call()
|
||||||
|
except UnformattedError as ex: # fmt: skip
|
||||||
|
handle_exception()
|
||||||
|
finally : # fmt: skip
|
||||||
|
finally_call()
|
||||||
|
|
||||||
|
|
||||||
|
with give_me_context( unformatted, args ): # fmt: skip
|
||||||
|
print("Do something")
|
||||||
|
|
||||||
|
|
||||||
|
async def test_async_with():
|
||||||
|
async with give_me_async_context( unformatted, args ): # fmt: skip
|
||||||
|
print("Do something")
|
||||||
11
crates/ruff_python_formatter/resources/test/fixtures/black/cases/fstring.py
vendored
Normal file
11
crates/ruff_python_formatter/resources/test/fixtures/black/cases/fstring.py
vendored
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
f"f-string without formatted values is just a string"
|
||||||
|
f"{{NOT a formatted value}}"
|
||||||
|
f"{{NOT 'a' \"formatted\" \"value\"}}"
|
||||||
|
f"some f-string with {a} {few():.2f} {formatted.values!r}"
|
||||||
|
f'some f-string with {a} {few(""):.2f} {formatted.values!r}'
|
||||||
|
f"{f'''{'nested'} inner'''} outer"
|
||||||
|
f"\"{f'{nested} inner'}\" outer"
|
||||||
|
f"space between opening braces: { {a for a in (1, 2, 3)}}"
|
||||||
|
f'Hello \'{tricky + "example"}\''
|
||||||
|
f"Tried directories {str(rootdirs)} \
|
||||||
|
but none started with prefix {parentdir_prefix}"
|
||||||
11
crates/ruff_python_formatter/resources/test/fixtures/black/cases/fstring.py.expect
vendored
Normal file
11
crates/ruff_python_formatter/resources/test/fixtures/black/cases/fstring.py.expect
vendored
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
f"f-string without formatted values is just a string"
|
||||||
|
f"{{NOT a formatted value}}"
|
||||||
|
f'{{NOT \'a\' "formatted" "value"}}'
|
||||||
|
f"some f-string with {a} {few():.2f} {formatted.values!r}"
|
||||||
|
f'some f-string with {a} {few(""):.2f} {formatted.values!r}'
|
||||||
|
f"{f'''{'nested'} inner'''} outer"
|
||||||
|
f"\"{f'{nested} inner'}\" outer"
|
||||||
|
f"space between opening braces: { {a for a in (1, 2, 3)}}"
|
||||||
|
f'Hello \'{tricky + "example"}\''
|
||||||
|
f"Tried directories {str(rootdirs)} \
|
||||||
|
but none started with prefix {parentdir_prefix}"
|
||||||
@@ -0,0 +1,144 @@
|
|||||||
|
# flags: --preview --minimum-version=3.10
|
||||||
|
# normal, short, function definition
|
||||||
|
def foo(a, b) -> tuple[int, float]: ...
|
||||||
|
|
||||||
|
|
||||||
|
# normal, short, function definition w/o return type
|
||||||
|
def foo(a, b): ...
|
||||||
|
|
||||||
|
|
||||||
|
# no splitting
|
||||||
|
def foo(a: A, b: B) -> list[p, q]:
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
# magic trailing comma in param list
|
||||||
|
def foo(a, b,): ...
|
||||||
|
|
||||||
|
|
||||||
|
# magic trailing comma in nested params in param list
|
||||||
|
def foo(a, b: tuple[int, float,]): ...
|
||||||
|
|
||||||
|
|
||||||
|
# magic trailing comma in return type, no params
|
||||||
|
def a() -> tuple[
|
||||||
|
a,
|
||||||
|
b,
|
||||||
|
]: ...
|
||||||
|
|
||||||
|
|
||||||
|
# magic trailing comma in return type, params
|
||||||
|
def foo(a: A, b: B) -> list[
|
||||||
|
p,
|
||||||
|
q,
|
||||||
|
]:
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
# magic trailing comma in param list and in return type
|
||||||
|
def foo(
|
||||||
|
a: a,
|
||||||
|
b: b,
|
||||||
|
) -> list[
|
||||||
|
a,
|
||||||
|
a,
|
||||||
|
]:
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
# long function definition, param list is longer
|
||||||
|
def aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(
|
||||||
|
bbbbbbbbbbbbbbbbbb,
|
||||||
|
) -> cccccccccccccccccccccccccccccc: ...
|
||||||
|
|
||||||
|
|
||||||
|
# long function definition, return type is longer
|
||||||
|
# this should maybe split on rhs?
|
||||||
|
def aaaaaaaaaaaaaaaaa(bbbbbbbbbbbbbbbbbb) -> list[
|
||||||
|
Ccccccccccccccccccccccccccccccccccccccccccccccccccc, Dddddd
|
||||||
|
]: ...
|
||||||
|
|
||||||
|
|
||||||
|
# long return type, no param list
|
||||||
|
def foo() -> list[
|
||||||
|
Loooooooooooooooooooooooooooooooooooong,
|
||||||
|
Loooooooooooooooooooong,
|
||||||
|
Looooooooooooong,
|
||||||
|
]: ...
|
||||||
|
|
||||||
|
|
||||||
|
# long function name, no param list, no return value
|
||||||
|
def thiiiiiiiiiiiiiiiiiis_iiiiiiiiiiiiiiiiiiiiiiiiiiiiiis_veeeeeeeeeeeeeeeeeeeeeeery_looooooong():
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
# long function name, no param list
|
||||||
|
def thiiiiiiiiiiiiiiiiiis_iiiiiiiiiiiiiiiiiiiiiiiiiiiiiis_veeeeeeeeeeeeeeeeeeeeeeery_looooooong() -> (
|
||||||
|
list[int, float]
|
||||||
|
): ...
|
||||||
|
|
||||||
|
|
||||||
|
# long function name, no return value
|
||||||
|
def thiiiiiiiiiiiiiiiiiis_iiiiiiiiiiiiiiiiiiiiiiiiiiiiiis_veeeeeeeeeeeeeeeeeeeeeeery_looooooong(
|
||||||
|
a, b
|
||||||
|
): ...
|
||||||
|
|
||||||
|
|
||||||
|
# unskippable type hint (??)
|
||||||
|
def foo(a) -> list[aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa]: # type: ignore
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
def foo(a) -> list[
|
||||||
|
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
|
||||||
|
]: # abpedeifnore
|
||||||
|
pass
|
||||||
|
|
||||||
|
def foo(a, b: list[Bad],): ... # type: ignore
|
||||||
|
|
||||||
|
# don't lose any comments (no magic)
|
||||||
|
def foo( # 1
|
||||||
|
a, # 2
|
||||||
|
b) -> list[ # 3
|
||||||
|
a, # 4
|
||||||
|
b]: # 5
|
||||||
|
... # 6
|
||||||
|
|
||||||
|
|
||||||
|
# don't lose any comments (param list magic)
|
||||||
|
def foo( # 1
|
||||||
|
a, # 2
|
||||||
|
b,) -> list[ # 3
|
||||||
|
a, # 4
|
||||||
|
b]: # 5
|
||||||
|
... # 6
|
||||||
|
|
||||||
|
|
||||||
|
# don't lose any comments (return type magic)
|
||||||
|
def foo( # 1
|
||||||
|
a, # 2
|
||||||
|
b) -> list[ # 3
|
||||||
|
a, # 4
|
||||||
|
b,]: # 5
|
||||||
|
... # 6
|
||||||
|
|
||||||
|
|
||||||
|
# don't lose any comments (both magic)
|
||||||
|
def foo( # 1
|
||||||
|
a, # 2
|
||||||
|
b,) -> list[ # 3
|
||||||
|
a, # 4
|
||||||
|
b,]: # 5
|
||||||
|
... # 6
|
||||||
|
|
||||||
|
# real life example
|
||||||
|
def SimplePyFn(
|
||||||
|
context: hl.GeneratorContext,
|
||||||
|
buffer_input: Buffer[UInt8, 2],
|
||||||
|
func_input: Buffer[Int32, 2],
|
||||||
|
float_arg: Scalar[Float32],
|
||||||
|
offset: int = 0,
|
||||||
|
) -> tuple[
|
||||||
|
Buffer[UInt8, 2],
|
||||||
|
Buffer[UInt8, 2],
|
||||||
|
]: ...
|
||||||
@@ -0,0 +1,156 @@
|
|||||||
|
# normal, short, function definition
|
||||||
|
def foo(a, b) -> tuple[int, float]: ...
|
||||||
|
|
||||||
|
|
||||||
|
# normal, short, function definition w/o return type
|
||||||
|
def foo(a, b): ...
|
||||||
|
|
||||||
|
|
||||||
|
# no splitting
|
||||||
|
def foo(a: A, b: B) -> list[p, q]:
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
# magic trailing comma in param list
|
||||||
|
def foo(
|
||||||
|
a,
|
||||||
|
b,
|
||||||
|
): ...
|
||||||
|
|
||||||
|
|
||||||
|
# magic trailing comma in nested params in param list
|
||||||
|
def foo(
|
||||||
|
a,
|
||||||
|
b: tuple[
|
||||||
|
int,
|
||||||
|
float,
|
||||||
|
],
|
||||||
|
): ...
|
||||||
|
|
||||||
|
|
||||||
|
# magic trailing comma in return type, no params
|
||||||
|
def a() -> tuple[
|
||||||
|
a,
|
||||||
|
b,
|
||||||
|
]: ...
|
||||||
|
|
||||||
|
|
||||||
|
# magic trailing comma in return type, params
|
||||||
|
def foo(a: A, b: B) -> list[
|
||||||
|
p,
|
||||||
|
q,
|
||||||
|
]:
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
# magic trailing comma in param list and in return type
|
||||||
|
def foo(
|
||||||
|
a: a,
|
||||||
|
b: b,
|
||||||
|
) -> list[
|
||||||
|
a,
|
||||||
|
a,
|
||||||
|
]:
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
# long function definition, param list is longer
|
||||||
|
def aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(
|
||||||
|
bbbbbbbbbbbbbbbbbb,
|
||||||
|
) -> cccccccccccccccccccccccccccccc: ...
|
||||||
|
|
||||||
|
|
||||||
|
# long function definition, return type is longer
|
||||||
|
# this should maybe split on rhs?
|
||||||
|
def aaaaaaaaaaaaaaaaa(
|
||||||
|
bbbbbbbbbbbbbbbbbb,
|
||||||
|
) -> list[Ccccccccccccccccccccccccccccccccccccccccccccccccccc, Dddddd]: ...
|
||||||
|
|
||||||
|
|
||||||
|
# long return type, no param list
|
||||||
|
def foo() -> list[
|
||||||
|
Loooooooooooooooooooooooooooooooooooong,
|
||||||
|
Loooooooooooooooooooong,
|
||||||
|
Looooooooooooong,
|
||||||
|
]: ...
|
||||||
|
|
||||||
|
|
||||||
|
# long function name, no param list, no return value
|
||||||
|
def thiiiiiiiiiiiiiiiiiis_iiiiiiiiiiiiiiiiiiiiiiiiiiiiiis_veeeeeeeeeeeeeeeeeeeeeeery_looooooong():
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
# long function name, no param list
|
||||||
|
def thiiiiiiiiiiiiiiiiiis_iiiiiiiiiiiiiiiiiiiiiiiiiiiiiis_veeeeeeeeeeeeeeeeeeeeeeery_looooooong() -> (
|
||||||
|
list[int, float]
|
||||||
|
): ...
|
||||||
|
|
||||||
|
|
||||||
|
# long function name, no return value
|
||||||
|
def thiiiiiiiiiiiiiiiiiis_iiiiiiiiiiiiiiiiiiiiiiiiiiiiiis_veeeeeeeeeeeeeeeeeeeeeeery_looooooong(
|
||||||
|
a, b
|
||||||
|
): ...
|
||||||
|
|
||||||
|
|
||||||
|
# unskippable type hint (??)
|
||||||
|
def foo(a) -> list[aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa]: # type: ignore
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
def foo(
|
||||||
|
a,
|
||||||
|
) -> list[
|
||||||
|
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
|
||||||
|
]: # abpedeifnore
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
def foo(
|
||||||
|
a,
|
||||||
|
b: list[Bad],
|
||||||
|
): ... # type: ignore
|
||||||
|
|
||||||
|
|
||||||
|
# don't lose any comments (no magic)
|
||||||
|
def foo(a, b) -> list[a, b]: # 1 # 2 # 3 # 4 # 5
|
||||||
|
... # 6
|
||||||
|
|
||||||
|
|
||||||
|
# don't lose any comments (param list magic)
|
||||||
|
def foo( # 1
|
||||||
|
a, # 2
|
||||||
|
b,
|
||||||
|
) -> list[a, b]: # 3 # 4 # 5
|
||||||
|
... # 6
|
||||||
|
|
||||||
|
|
||||||
|
# don't lose any comments (return type magic)
|
||||||
|
def foo(a, b) -> list[ # 1 # 2 # 3
|
||||||
|
a, # 4
|
||||||
|
b,
|
||||||
|
]: # 5
|
||||||
|
... # 6
|
||||||
|
|
||||||
|
|
||||||
|
# don't lose any comments (both magic)
|
||||||
|
def foo( # 1
|
||||||
|
a, # 2
|
||||||
|
b,
|
||||||
|
) -> list[ # 3
|
||||||
|
a, # 4
|
||||||
|
b,
|
||||||
|
]: # 5
|
||||||
|
... # 6
|
||||||
|
|
||||||
|
|
||||||
|
# real life example
|
||||||
|
def SimplePyFn(
|
||||||
|
context: hl.GeneratorContext,
|
||||||
|
buffer_input: Buffer[UInt8, 2],
|
||||||
|
func_input: Buffer[Int32, 2],
|
||||||
|
float_arg: Scalar[Float32],
|
||||||
|
offset: int = 0,
|
||||||
|
) -> tuple[
|
||||||
|
Buffer[UInt8, 2],
|
||||||
|
Buffer[UInt8, 2],
|
||||||
|
]: ...
|
||||||
95
crates/ruff_python_formatter/resources/test/fixtures/black/cases/function.py
vendored
Normal file
95
crates/ruff_python_formatter/resources/test/fixtures/black/cases/function.py
vendored
Normal file
@@ -0,0 +1,95 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
import asyncio
|
||||||
|
import sys
|
||||||
|
|
||||||
|
from third_party import X, Y, Z
|
||||||
|
|
||||||
|
from library import some_connection, \
|
||||||
|
some_decorator
|
||||||
|
f'trigger 3.6 mode'
|
||||||
|
def func_no_args():
|
||||||
|
a; b; c
|
||||||
|
if True: raise RuntimeError
|
||||||
|
if False: ...
|
||||||
|
for i in range(10):
|
||||||
|
print(i)
|
||||||
|
continue
|
||||||
|
exec("new-style exec", {}, {})
|
||||||
|
return None
|
||||||
|
async def coroutine(arg, exec=False):
|
||||||
|
"Single-line docstring. Multiline is harder to reformat."
|
||||||
|
async with some_connection() as conn:
|
||||||
|
await conn.do_what_i_mean('SELECT bobby, tables FROM xkcd', timeout=2)
|
||||||
|
await asyncio.sleep(1)
|
||||||
|
@asyncio.coroutine
|
||||||
|
@some_decorator(
|
||||||
|
with_args=True,
|
||||||
|
many_args=[1,2,3]
|
||||||
|
)
|
||||||
|
def function_signature_stress_test(number:int,no_annotation=None,text:str="default",* ,debug:bool=False,**kwargs) -> str:
|
||||||
|
return text[number:-1]
|
||||||
|
def spaces(a=1, b=(), c=[], d={}, e=True, f=-1, g=1 if False else 2, h="", i=r''):
|
||||||
|
offset = attr.ib(default=attr.Factory( lambda: _r.uniform(10000, 200000)))
|
||||||
|
assert task._cancel_stack[:len(old_stack)] == old_stack
|
||||||
|
def spaces_types(a: int = 1, b: tuple = (), c: list = [], d: dict = {}, e: bool = True, f: int = -1, g: int = 1 if False else 2, h: str = "", i: str = r''): ...
|
||||||
|
def spaces2(result= _core.Value(None)):
|
||||||
|
assert fut is self._read_fut, (fut, self._read_fut)
|
||||||
|
# EMPTY LINE WITH WHITESPACE (this comment will be removed)
|
||||||
|
def example(session):
|
||||||
|
result = session.query(models.Customer.id).filter(
|
||||||
|
models.Customer.account_id == account_id,
|
||||||
|
models.Customer.email == email_address,
|
||||||
|
).order_by(
|
||||||
|
models.Customer.id.asc()
|
||||||
|
).all()
|
||||||
|
def long_lines():
|
||||||
|
if True:
|
||||||
|
typedargslist.extend(
|
||||||
|
gen_annotated_params(ast_args.kwonlyargs, ast_args.kw_defaults, parameters, implicit_default=True)
|
||||||
|
)
|
||||||
|
typedargslist.extend(
|
||||||
|
gen_annotated_params(
|
||||||
|
ast_args.kwonlyargs, ast_args.kw_defaults, parameters, implicit_default=True,
|
||||||
|
# trailing standalone comment
|
||||||
|
)
|
||||||
|
)
|
||||||
|
_type_comment_re = re.compile(
|
||||||
|
r"""
|
||||||
|
^
|
||||||
|
[\t ]*
|
||||||
|
\#[ ]type:[ ]*
|
||||||
|
(?P<type>
|
||||||
|
[^#\t\n]+?
|
||||||
|
)
|
||||||
|
(?<!ignore) # note: this will force the non-greedy + in <type> to match
|
||||||
|
# a trailing space which is why we need the silliness below
|
||||||
|
(?<!ignore[ ]{1})(?<!ignore[ ]{2})(?<!ignore[ ]{3})(?<!ignore[ ]{4})
|
||||||
|
(?<!ignore[ ]{5})(?<!ignore[ ]{6})(?<!ignore[ ]{7})(?<!ignore[ ]{8})
|
||||||
|
(?<!ignore[ ]{9})(?<!ignore[ ]{10})
|
||||||
|
[\t ]*
|
||||||
|
(?P<nl>
|
||||||
|
(?:\#[^\n]*)?
|
||||||
|
\n?
|
||||||
|
)
|
||||||
|
$
|
||||||
|
""", re.MULTILINE | re.VERBOSE
|
||||||
|
)
|
||||||
|
def trailing_comma():
|
||||||
|
mapping = {
|
||||||
|
A: 0.25 * (10.0 / 12),
|
||||||
|
B: 0.1 * (10.0 / 12),
|
||||||
|
C: 0.1 * (10.0 / 12),
|
||||||
|
D: 0.1 * (10.0 / 12),
|
||||||
|
}
|
||||||
|
def f(
|
||||||
|
a,
|
||||||
|
**kwargs,
|
||||||
|
) -> A:
|
||||||
|
return (
|
||||||
|
yield from A(
|
||||||
|
very_long_argument_name1=very_long_value_for_the_argument,
|
||||||
|
very_long_argument_name2=very_long_value_for_the_argument,
|
||||||
|
**kwargs,
|
||||||
|
)
|
||||||
|
)
|
||||||
|
def __await__(): return (yield)
|
||||||
148
crates/ruff_python_formatter/resources/test/fixtures/black/cases/function.py.expect
vendored
Normal file
148
crates/ruff_python_formatter/resources/test/fixtures/black/cases/function.py.expect
vendored
Normal file
@@ -0,0 +1,148 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
import asyncio
|
||||||
|
import sys
|
||||||
|
|
||||||
|
from third_party import X, Y, Z
|
||||||
|
|
||||||
|
from library import some_connection, some_decorator
|
||||||
|
|
||||||
|
f"trigger 3.6 mode"
|
||||||
|
|
||||||
|
|
||||||
|
def func_no_args():
|
||||||
|
a
|
||||||
|
b
|
||||||
|
c
|
||||||
|
if True:
|
||||||
|
raise RuntimeError
|
||||||
|
if False:
|
||||||
|
...
|
||||||
|
for i in range(10):
|
||||||
|
print(i)
|
||||||
|
continue
|
||||||
|
exec("new-style exec", {}, {})
|
||||||
|
return None
|
||||||
|
|
||||||
|
|
||||||
|
async def coroutine(arg, exec=False):
|
||||||
|
"Single-line docstring. Multiline is harder to reformat."
|
||||||
|
async with some_connection() as conn:
|
||||||
|
await conn.do_what_i_mean("SELECT bobby, tables FROM xkcd", timeout=2)
|
||||||
|
await asyncio.sleep(1)
|
||||||
|
|
||||||
|
|
||||||
|
@asyncio.coroutine
|
||||||
|
@some_decorator(with_args=True, many_args=[1, 2, 3])
|
||||||
|
def function_signature_stress_test(
|
||||||
|
number: int,
|
||||||
|
no_annotation=None,
|
||||||
|
text: str = "default",
|
||||||
|
*,
|
||||||
|
debug: bool = False,
|
||||||
|
**kwargs,
|
||||||
|
) -> str:
|
||||||
|
return text[number:-1]
|
||||||
|
|
||||||
|
|
||||||
|
def spaces(a=1, b=(), c=[], d={}, e=True, f=-1, g=1 if False else 2, h="", i=r""):
|
||||||
|
offset = attr.ib(default=attr.Factory(lambda: _r.uniform(10000, 200000)))
|
||||||
|
assert task._cancel_stack[: len(old_stack)] == old_stack
|
||||||
|
|
||||||
|
|
||||||
|
def spaces_types(
|
||||||
|
a: int = 1,
|
||||||
|
b: tuple = (),
|
||||||
|
c: list = [],
|
||||||
|
d: dict = {},
|
||||||
|
e: bool = True,
|
||||||
|
f: int = -1,
|
||||||
|
g: int = 1 if False else 2,
|
||||||
|
h: str = "",
|
||||||
|
i: str = r"",
|
||||||
|
):
|
||||||
|
...
|
||||||
|
|
||||||
|
|
||||||
|
def spaces2(result=_core.Value(None)):
|
||||||
|
assert fut is self._read_fut, (fut, self._read_fut)
|
||||||
|
|
||||||
|
|
||||||
|
def example(session):
|
||||||
|
result = (
|
||||||
|
session.query(models.Customer.id)
|
||||||
|
.filter(
|
||||||
|
models.Customer.account_id == account_id,
|
||||||
|
models.Customer.email == email_address,
|
||||||
|
)
|
||||||
|
.order_by(models.Customer.id.asc())
|
||||||
|
.all()
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
def long_lines():
|
||||||
|
if True:
|
||||||
|
typedargslist.extend(
|
||||||
|
gen_annotated_params(
|
||||||
|
ast_args.kwonlyargs,
|
||||||
|
ast_args.kw_defaults,
|
||||||
|
parameters,
|
||||||
|
implicit_default=True,
|
||||||
|
)
|
||||||
|
)
|
||||||
|
typedargslist.extend(
|
||||||
|
gen_annotated_params(
|
||||||
|
ast_args.kwonlyargs,
|
||||||
|
ast_args.kw_defaults,
|
||||||
|
parameters,
|
||||||
|
implicit_default=True,
|
||||||
|
# trailing standalone comment
|
||||||
|
)
|
||||||
|
)
|
||||||
|
_type_comment_re = re.compile(
|
||||||
|
r"""
|
||||||
|
^
|
||||||
|
[\t ]*
|
||||||
|
\#[ ]type:[ ]*
|
||||||
|
(?P<type>
|
||||||
|
[^#\t\n]+?
|
||||||
|
)
|
||||||
|
(?<!ignore) # note: this will force the non-greedy + in <type> to match
|
||||||
|
# a trailing space which is why we need the silliness below
|
||||||
|
(?<!ignore[ ]{1})(?<!ignore[ ]{2})(?<!ignore[ ]{3})(?<!ignore[ ]{4})
|
||||||
|
(?<!ignore[ ]{5})(?<!ignore[ ]{6})(?<!ignore[ ]{7})(?<!ignore[ ]{8})
|
||||||
|
(?<!ignore[ ]{9})(?<!ignore[ ]{10})
|
||||||
|
[\t ]*
|
||||||
|
(?P<nl>
|
||||||
|
(?:\#[^\n]*)?
|
||||||
|
\n?
|
||||||
|
)
|
||||||
|
$
|
||||||
|
""",
|
||||||
|
re.MULTILINE | re.VERBOSE,
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
def trailing_comma():
|
||||||
|
mapping = {
|
||||||
|
A: 0.25 * (10.0 / 12),
|
||||||
|
B: 0.1 * (10.0 / 12),
|
||||||
|
C: 0.1 * (10.0 / 12),
|
||||||
|
D: 0.1 * (10.0 / 12),
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
def f(
|
||||||
|
a,
|
||||||
|
**kwargs,
|
||||||
|
) -> A:
|
||||||
|
return (
|
||||||
|
yield from A(
|
||||||
|
very_long_argument_name1=very_long_value_for_the_argument,
|
||||||
|
very_long_argument_name2=very_long_value_for_the_argument,
|
||||||
|
**kwargs,
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
def __await__():
|
||||||
|
return (yield)
|
||||||
53
crates/ruff_python_formatter/resources/test/fixtures/black/cases/function2.py
vendored
Normal file
53
crates/ruff_python_formatter/resources/test/fixtures/black/cases/function2.py
vendored
Normal file
@@ -0,0 +1,53 @@
|
|||||||
|
def f(
|
||||||
|
a,
|
||||||
|
**kwargs,
|
||||||
|
) -> A:
|
||||||
|
with cache_dir():
|
||||||
|
if something:
|
||||||
|
result = (
|
||||||
|
CliRunner().invoke(black.main, [str(src1), str(src2), "--diff", "--check"])
|
||||||
|
)
|
||||||
|
limited.append(-limited.pop()) # negate top
|
||||||
|
return A(
|
||||||
|
very_long_argument_name1=very_long_value_for_the_argument,
|
||||||
|
very_long_argument_name2=-very.long.value.for_the_argument,
|
||||||
|
**kwargs,
|
||||||
|
)
|
||||||
|
def g():
|
||||||
|
"Docstring."
|
||||||
|
def inner():
|
||||||
|
pass
|
||||||
|
print("Inner defs should breathe a little.")
|
||||||
|
def h():
|
||||||
|
def inner():
|
||||||
|
pass
|
||||||
|
print("Inner defs should breathe a little.")
|
||||||
|
|
||||||
|
|
||||||
|
if os.name == "posix":
|
||||||
|
import termios
|
||||||
|
def i_should_be_followed_by_only_one_newline():
|
||||||
|
pass
|
||||||
|
elif os.name == "nt":
|
||||||
|
try:
|
||||||
|
import msvcrt
|
||||||
|
def i_should_be_followed_by_only_one_newline():
|
||||||
|
pass
|
||||||
|
|
||||||
|
except ImportError:
|
||||||
|
|
||||||
|
def i_should_be_followed_by_only_one_newline():
|
||||||
|
pass
|
||||||
|
|
||||||
|
elif False:
|
||||||
|
|
||||||
|
class IHopeYouAreHavingALovelyDay:
|
||||||
|
def __call__(self):
|
||||||
|
print("i_should_be_followed_by_only_one_newline")
|
||||||
|
else:
|
||||||
|
|
||||||
|
def foo():
|
||||||
|
pass
|
||||||
|
|
||||||
|
with hmm_but_this_should_get_two_preceding_newlines():
|
||||||
|
pass
|
||||||
65
crates/ruff_python_formatter/resources/test/fixtures/black/cases/function2.py.expect
vendored
Normal file
65
crates/ruff_python_formatter/resources/test/fixtures/black/cases/function2.py.expect
vendored
Normal file
@@ -0,0 +1,65 @@
|
|||||||
|
def f(
|
||||||
|
a,
|
||||||
|
**kwargs,
|
||||||
|
) -> A:
|
||||||
|
with cache_dir():
|
||||||
|
if something:
|
||||||
|
result = CliRunner().invoke(
|
||||||
|
black.main, [str(src1), str(src2), "--diff", "--check"]
|
||||||
|
)
|
||||||
|
limited.append(-limited.pop()) # negate top
|
||||||
|
return A(
|
||||||
|
very_long_argument_name1=very_long_value_for_the_argument,
|
||||||
|
very_long_argument_name2=-very.long.value.for_the_argument,
|
||||||
|
**kwargs,
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
def g():
|
||||||
|
"Docstring."
|
||||||
|
|
||||||
|
def inner():
|
||||||
|
pass
|
||||||
|
|
||||||
|
print("Inner defs should breathe a little.")
|
||||||
|
|
||||||
|
|
||||||
|
def h():
|
||||||
|
def inner():
|
||||||
|
pass
|
||||||
|
|
||||||
|
print("Inner defs should breathe a little.")
|
||||||
|
|
||||||
|
|
||||||
|
if os.name == "posix":
|
||||||
|
import termios
|
||||||
|
|
||||||
|
def i_should_be_followed_by_only_one_newline():
|
||||||
|
pass
|
||||||
|
|
||||||
|
elif os.name == "nt":
|
||||||
|
try:
|
||||||
|
import msvcrt
|
||||||
|
|
||||||
|
def i_should_be_followed_by_only_one_newline():
|
||||||
|
pass
|
||||||
|
|
||||||
|
except ImportError:
|
||||||
|
|
||||||
|
def i_should_be_followed_by_only_one_newline():
|
||||||
|
pass
|
||||||
|
|
||||||
|
elif False:
|
||||||
|
|
||||||
|
class IHopeYouAreHavingALovelyDay:
|
||||||
|
def __call__(self):
|
||||||
|
print("i_should_be_followed_by_only_one_newline")
|
||||||
|
|
||||||
|
else:
|
||||||
|
|
||||||
|
def foo():
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
with hmm_but_this_should_get_two_preceding_newlines():
|
||||||
|
pass
|
||||||
61
crates/ruff_python_formatter/resources/test/fixtures/black/cases/function_trailing_comma.py
vendored
Normal file
61
crates/ruff_python_formatter/resources/test/fixtures/black/cases/function_trailing_comma.py
vendored
Normal file
@@ -0,0 +1,61 @@
|
|||||||
|
def f(a,):
|
||||||
|
d = {'key': 'value',}
|
||||||
|
tup = (1,)
|
||||||
|
|
||||||
|
def f2(a,b,):
|
||||||
|
d = {'key': 'value', 'key2': 'value2',}
|
||||||
|
tup = (1,2,)
|
||||||
|
|
||||||
|
def f(a:int=1,):
|
||||||
|
call(arg={'explode': 'this',})
|
||||||
|
call2(arg=[1,2,3],)
|
||||||
|
x = {
|
||||||
|
"a": 1,
|
||||||
|
"b": 2,
|
||||||
|
}["a"]
|
||||||
|
if a == {"a": 1,"b": 2,"c": 3,"d": 4,"e": 5,"f": 6,"g": 7,"h": 8,}["a"]:
|
||||||
|
pass
|
||||||
|
|
||||||
|
def xxxxxxxxxxxxxxxxxxxxxxxxxxxx() -> Set[
|
||||||
|
"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
|
||||||
|
]:
|
||||||
|
json = {"k": {"k2": {"k3": [1,]}}}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# The type annotation shouldn't get a trailing comma since that would change its type.
|
||||||
|
# Relevant bug report: https://github.com/psf/black/issues/2381.
|
||||||
|
def some_function_with_a_really_long_name() -> (
|
||||||
|
returning_a_deeply_nested_import_of_a_type_i_suppose
|
||||||
|
):
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
def some_method_with_a_really_long_name(very_long_parameter_so_yeah: str, another_long_parameter: int) -> (
|
||||||
|
another_case_of_returning_a_deeply_nested_import_of_a_type_i_suppose_cause_why_not
|
||||||
|
):
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
def func() -> (
|
||||||
|
also_super_long_type_annotation_that_may_cause_an_AST_related_crash_in_black(this_shouldn_t_get_a_trailing_comma_too)
|
||||||
|
):
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
def func() -> ((also_super_long_type_annotation_that_may_cause_an_AST_related_crash_in_black(
|
||||||
|
this_shouldn_t_get_a_trailing_comma_too
|
||||||
|
))
|
||||||
|
):
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
# Make sure inner one-element tuple won't explode
|
||||||
|
some_module.some_function(
|
||||||
|
argument1, (one_element_tuple,), argument4, argument5, argument6
|
||||||
|
)
|
||||||
|
|
||||||
|
# Inner trailing comma causes outer to explode
|
||||||
|
some_module.some_function(
|
||||||
|
argument1, (one, two,), argument4, argument5, argument6
|
||||||
|
)
|
||||||
114
crates/ruff_python_formatter/resources/test/fixtures/black/cases/function_trailing_comma.py.expect
vendored
Normal file
114
crates/ruff_python_formatter/resources/test/fixtures/black/cases/function_trailing_comma.py.expect
vendored
Normal file
@@ -0,0 +1,114 @@
|
|||||||
|
def f(
|
||||||
|
a,
|
||||||
|
):
|
||||||
|
d = {
|
||||||
|
"key": "value",
|
||||||
|
}
|
||||||
|
tup = (1,)
|
||||||
|
|
||||||
|
|
||||||
|
def f2(
|
||||||
|
a,
|
||||||
|
b,
|
||||||
|
):
|
||||||
|
d = {
|
||||||
|
"key": "value",
|
||||||
|
"key2": "value2",
|
||||||
|
}
|
||||||
|
tup = (
|
||||||
|
1,
|
||||||
|
2,
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
def f(
|
||||||
|
a: int = 1,
|
||||||
|
):
|
||||||
|
call(
|
||||||
|
arg={
|
||||||
|
"explode": "this",
|
||||||
|
}
|
||||||
|
)
|
||||||
|
call2(
|
||||||
|
arg=[1, 2, 3],
|
||||||
|
)
|
||||||
|
x = {
|
||||||
|
"a": 1,
|
||||||
|
"b": 2,
|
||||||
|
}["a"]
|
||||||
|
if (
|
||||||
|
a
|
||||||
|
== {
|
||||||
|
"a": 1,
|
||||||
|
"b": 2,
|
||||||
|
"c": 3,
|
||||||
|
"d": 4,
|
||||||
|
"e": 5,
|
||||||
|
"f": 6,
|
||||||
|
"g": 7,
|
||||||
|
"h": 8,
|
||||||
|
}["a"]
|
||||||
|
):
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
def xxxxxxxxxxxxxxxxxxxxxxxxxxxx() -> (
|
||||||
|
Set["xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"]
|
||||||
|
):
|
||||||
|
json = {
|
||||||
|
"k": {
|
||||||
|
"k2": {
|
||||||
|
"k3": [
|
||||||
|
1,
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
# The type annotation shouldn't get a trailing comma since that would change its type.
|
||||||
|
# Relevant bug report: https://github.com/psf/black/issues/2381.
|
||||||
|
def some_function_with_a_really_long_name() -> (
|
||||||
|
returning_a_deeply_nested_import_of_a_type_i_suppose
|
||||||
|
):
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
def some_method_with_a_really_long_name(
|
||||||
|
very_long_parameter_so_yeah: str, another_long_parameter: int
|
||||||
|
) -> another_case_of_returning_a_deeply_nested_import_of_a_type_i_suppose_cause_why_not:
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
def func() -> (
|
||||||
|
also_super_long_type_annotation_that_may_cause_an_AST_related_crash_in_black(
|
||||||
|
this_shouldn_t_get_a_trailing_comma_too
|
||||||
|
)
|
||||||
|
):
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
def func() -> (
|
||||||
|
also_super_long_type_annotation_that_may_cause_an_AST_related_crash_in_black(
|
||||||
|
this_shouldn_t_get_a_trailing_comma_too
|
||||||
|
)
|
||||||
|
):
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
# Make sure inner one-element tuple won't explode
|
||||||
|
some_module.some_function(
|
||||||
|
argument1, (one_element_tuple,), argument4, argument5, argument6
|
||||||
|
)
|
||||||
|
|
||||||
|
# Inner trailing comma causes outer to explode
|
||||||
|
some_module.some_function(
|
||||||
|
argument1,
|
||||||
|
(
|
||||||
|
one,
|
||||||
|
two,
|
||||||
|
),
|
||||||
|
argument4,
|
||||||
|
argument5,
|
||||||
|
argument6,
|
||||||
|
)
|
||||||
21
crates/ruff_python_formatter/resources/test/fixtures/black/cases/ignore_pyi.py
vendored
Normal file
21
crates/ruff_python_formatter/resources/test/fixtures/black/cases/ignore_pyi.py
vendored
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
# flags: --pyi
|
||||||
|
def f(): # type: ignore
|
||||||
|
...
|
||||||
|
|
||||||
|
class x: # some comment
|
||||||
|
...
|
||||||
|
|
||||||
|
class y:
|
||||||
|
... # comment
|
||||||
|
|
||||||
|
# whitespace doesn't matter (note the next line has a trailing space and tab)
|
||||||
|
class z:
|
||||||
|
...
|
||||||
|
|
||||||
|
def g():
|
||||||
|
# hi
|
||||||
|
...
|
||||||
|
|
||||||
|
def h():
|
||||||
|
...
|
||||||
|
# bye
|
||||||
18
crates/ruff_python_formatter/resources/test/fixtures/black/cases/ignore_pyi.py.expect
vendored
Normal file
18
crates/ruff_python_formatter/resources/test/fixtures/black/cases/ignore_pyi.py.expect
vendored
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
def f(): # type: ignore
|
||||||
|
...
|
||||||
|
|
||||||
|
class x: # some comment
|
||||||
|
...
|
||||||
|
|
||||||
|
class y: ... # comment
|
||||||
|
|
||||||
|
# whitespace doesn't matter (note the next line has a trailing space and tab)
|
||||||
|
class z: ...
|
||||||
|
|
||||||
|
def g():
|
||||||
|
# hi
|
||||||
|
...
|
||||||
|
|
||||||
|
def h():
|
||||||
|
...
|
||||||
|
# bye
|
||||||
49
crates/ruff_python_formatter/resources/test/fixtures/black/cases/import_spacing.py
vendored
Normal file
49
crates/ruff_python_formatter/resources/test/fixtures/black/cases/import_spacing.py
vendored
Normal file
@@ -0,0 +1,49 @@
|
|||||||
|
"""The asyncio package, tracking PEP 3156."""
|
||||||
|
|
||||||
|
# flake8: noqa
|
||||||
|
|
||||||
|
from logging import (
|
||||||
|
WARNING
|
||||||
|
)
|
||||||
|
from logging import (
|
||||||
|
ERROR,
|
||||||
|
)
|
||||||
|
import sys
|
||||||
|
|
||||||
|
# This relies on each of the submodules having an __all__ variable.
|
||||||
|
from .base_events import *
|
||||||
|
from .coroutines import *
|
||||||
|
from .events import * # comment here
|
||||||
|
|
||||||
|
from .futures import *
|
||||||
|
from .locks import * # comment here
|
||||||
|
from .protocols import *
|
||||||
|
|
||||||
|
from ..runners import * # comment here
|
||||||
|
from ..queues import *
|
||||||
|
from ..streams import *
|
||||||
|
|
||||||
|
from some_library import (
|
||||||
|
Just, Enough, Libraries, To, Fit, In, This, Nice, Split, Which, We, No, Longer, Use
|
||||||
|
)
|
||||||
|
from name_of_a_company.extremely_long_project_name.component.ttypes import CuteLittleServiceHandlerFactoryyy
|
||||||
|
from name_of_a_company.extremely_long_project_name.extremely_long_component_name.ttypes import *
|
||||||
|
|
||||||
|
from .a.b.c.subprocess import *
|
||||||
|
from . import (tasks)
|
||||||
|
from . import (A, B, C)
|
||||||
|
from . import SomeVeryLongNameAndAllOfItsAdditionalLetters1, \
|
||||||
|
SomeVeryLongNameAndAllOfItsAdditionalLetters2
|
||||||
|
|
||||||
|
__all__ = (
|
||||||
|
base_events.__all__
|
||||||
|
+ coroutines.__all__
|
||||||
|
+ events.__all__
|
||||||
|
+ futures.__all__
|
||||||
|
+ locks.__all__
|
||||||
|
+ protocols.__all__
|
||||||
|
+ runners.__all__
|
||||||
|
+ queues.__all__
|
||||||
|
+ streams.__all__
|
||||||
|
+ tasks.__all__
|
||||||
|
)
|
||||||
64
crates/ruff_python_formatter/resources/test/fixtures/black/cases/import_spacing.py.expect
vendored
Normal file
64
crates/ruff_python_formatter/resources/test/fixtures/black/cases/import_spacing.py.expect
vendored
Normal file
@@ -0,0 +1,64 @@
|
|||||||
|
"""The asyncio package, tracking PEP 3156."""
|
||||||
|
|
||||||
|
# flake8: noqa
|
||||||
|
|
||||||
|
from logging import WARNING
|
||||||
|
from logging import (
|
||||||
|
ERROR,
|
||||||
|
)
|
||||||
|
import sys
|
||||||
|
|
||||||
|
# This relies on each of the submodules having an __all__ variable.
|
||||||
|
from .base_events import *
|
||||||
|
from .coroutines import *
|
||||||
|
from .events import * # comment here
|
||||||
|
|
||||||
|
from .futures import *
|
||||||
|
from .locks import * # comment here
|
||||||
|
from .protocols import *
|
||||||
|
|
||||||
|
from ..runners import * # comment here
|
||||||
|
from ..queues import *
|
||||||
|
from ..streams import *
|
||||||
|
|
||||||
|
from some_library import (
|
||||||
|
Just,
|
||||||
|
Enough,
|
||||||
|
Libraries,
|
||||||
|
To,
|
||||||
|
Fit,
|
||||||
|
In,
|
||||||
|
This,
|
||||||
|
Nice,
|
||||||
|
Split,
|
||||||
|
Which,
|
||||||
|
We,
|
||||||
|
No,
|
||||||
|
Longer,
|
||||||
|
Use,
|
||||||
|
)
|
||||||
|
from name_of_a_company.extremely_long_project_name.component.ttypes import (
|
||||||
|
CuteLittleServiceHandlerFactoryyy,
|
||||||
|
)
|
||||||
|
from name_of_a_company.extremely_long_project_name.extremely_long_component_name.ttypes import *
|
||||||
|
|
||||||
|
from .a.b.c.subprocess import *
|
||||||
|
from . import tasks
|
||||||
|
from . import A, B, C
|
||||||
|
from . import (
|
||||||
|
SomeVeryLongNameAndAllOfItsAdditionalLetters1,
|
||||||
|
SomeVeryLongNameAndAllOfItsAdditionalLetters2,
|
||||||
|
)
|
||||||
|
|
||||||
|
__all__ = (
|
||||||
|
base_events.__all__
|
||||||
|
+ coroutines.__all__
|
||||||
|
+ events.__all__
|
||||||
|
+ futures.__all__
|
||||||
|
+ locks.__all__
|
||||||
|
+ protocols.__all__
|
||||||
|
+ runners.__all__
|
||||||
|
+ queues.__all__
|
||||||
|
+ streams.__all__
|
||||||
|
+ tasks.__all__
|
||||||
|
)
|
||||||
41
crates/ruff_python_formatter/resources/test/fixtures/black/cases/line_ranges_basic.py
vendored
Normal file
41
crates/ruff_python_formatter/resources/test/fixtures/black/cases/line_ranges_basic.py
vendored
Normal file
@@ -0,0 +1,41 @@
|
|||||||
|
# flags: --line-ranges=5-6
|
||||||
|
# NOTE: If you need to modify this file, pay special attention to the --line-ranges=
|
||||||
|
# flag above as it's formatting specifically these lines.
|
||||||
|
def foo1(parameter_1, parameter_2, parameter_3, parameter_4, parameter_5, parameter_6, parameter_7): pass
|
||||||
|
def foo2(parameter_1, parameter_2, parameter_3, parameter_4, parameter_5, parameter_6, parameter_7): pass
|
||||||
|
def foo3(parameter_1, parameter_2, parameter_3, parameter_4, parameter_5, parameter_6, parameter_7): pass
|
||||||
|
def foo4(parameter_1, parameter_2, parameter_3, parameter_4, parameter_5, parameter_6, parameter_7): pass
|
||||||
|
|
||||||
|
# Adding some unformated code covering a wide range of syntaxes.
|
||||||
|
|
||||||
|
if True:
|
||||||
|
# Incorrectly indented prefix comments.
|
||||||
|
pass
|
||||||
|
|
||||||
|
import typing
|
||||||
|
from typing import (
|
||||||
|
Any ,
|
||||||
|
)
|
||||||
|
class MyClass( object): # Trailing comment with extra leading space.
|
||||||
|
#NOTE: The following indentation is incorrect:
|
||||||
|
@decor( 1 * 3 )
|
||||||
|
def my_func( arg):
|
||||||
|
pass
|
||||||
|
|
||||||
|
try: # Trailing comment with extra leading space.
|
||||||
|
for i in range(10): # Trailing comment with extra leading space.
|
||||||
|
while condition:
|
||||||
|
if something:
|
||||||
|
then_something( )
|
||||||
|
elif something_else:
|
||||||
|
then_something_else( )
|
||||||
|
except ValueError as e:
|
||||||
|
unformatted( )
|
||||||
|
finally:
|
||||||
|
unformatted( )
|
||||||
|
|
||||||
|
async def test_async_unformatted( ): # Trailing comment with extra leading space.
|
||||||
|
async for i in some_iter( unformatted ): # Trailing comment with extra leading space.
|
||||||
|
await asyncio.sleep( 1 )
|
||||||
|
async with some_context( unformatted ):
|
||||||
|
print( "unformatted" )
|
||||||
63
crates/ruff_python_formatter/resources/test/fixtures/black/cases/line_ranges_basic.py.expect
vendored
Normal file
63
crates/ruff_python_formatter/resources/test/fixtures/black/cases/line_ranges_basic.py.expect
vendored
Normal file
@@ -0,0 +1,63 @@
|
|||||||
|
# flags: --line-ranges=5-6
|
||||||
|
# NOTE: If you need to modify this file, pay special attention to the --line-ranges=
|
||||||
|
# flag above as it's formatting specifically these lines.
|
||||||
|
def foo1(parameter_1, parameter_2, parameter_3, parameter_4, parameter_5, parameter_6, parameter_7): pass
|
||||||
|
def foo2(
|
||||||
|
parameter_1,
|
||||||
|
parameter_2,
|
||||||
|
parameter_3,
|
||||||
|
parameter_4,
|
||||||
|
parameter_5,
|
||||||
|
parameter_6,
|
||||||
|
parameter_7,
|
||||||
|
):
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
def foo3(
|
||||||
|
parameter_1,
|
||||||
|
parameter_2,
|
||||||
|
parameter_3,
|
||||||
|
parameter_4,
|
||||||
|
parameter_5,
|
||||||
|
parameter_6,
|
||||||
|
parameter_7,
|
||||||
|
):
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
def foo4(parameter_1, parameter_2, parameter_3, parameter_4, parameter_5, parameter_6, parameter_7): pass
|
||||||
|
|
||||||
|
# Adding some unformated code covering a wide range of syntaxes.
|
||||||
|
|
||||||
|
if True:
|
||||||
|
# Incorrectly indented prefix comments.
|
||||||
|
pass
|
||||||
|
|
||||||
|
import typing
|
||||||
|
from typing import (
|
||||||
|
Any ,
|
||||||
|
)
|
||||||
|
class MyClass( object): # Trailing comment with extra leading space.
|
||||||
|
#NOTE: The following indentation is incorrect:
|
||||||
|
@decor( 1 * 3 )
|
||||||
|
def my_func( arg):
|
||||||
|
pass
|
||||||
|
|
||||||
|
try: # Trailing comment with extra leading space.
|
||||||
|
for i in range(10): # Trailing comment with extra leading space.
|
||||||
|
while condition:
|
||||||
|
if something:
|
||||||
|
then_something( )
|
||||||
|
elif something_else:
|
||||||
|
then_something_else( )
|
||||||
|
except ValueError as e:
|
||||||
|
unformatted( )
|
||||||
|
finally:
|
||||||
|
unformatted( )
|
||||||
|
|
||||||
|
async def test_async_unformatted( ): # Trailing comment with extra leading space.
|
||||||
|
async for i in some_iter( unformatted ): # Trailing comment with extra leading space.
|
||||||
|
await asyncio.sleep( 1 )
|
||||||
|
async with some_context( unformatted ):
|
||||||
|
print( "unformatted" )
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user