Skip to content

Commit 787e2fd

Browse files
authored
Format import statements (#5493)
## Summary Format import statements in all their variants. Specifically, this implemented formatting `StmtImport`, `StmtImportFrom` and `Alias`. ## Test Plan I added some custom snapshots, even though this has been covered well by black's tests.
1 parent 6acc316 commit 787e2fd

26 files changed

+308
-995
lines changed
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
from a import aksjdhflsakhdflkjsadlfajkslhfdkjsaldajlahflashdfljahlfksajlhfajfjfsaahflakjslhdfkjalhdskjfa
2+
from a import aksjdhflsakhdflkjsadlfajkslhfdkjsaldajlahflashdfljahlfksajlhfajfjfsaahflakjslhdfkjalhdskjfa, aksjdhflsakhdflkjsadlfajkslhfdkjsaldajlahflashdfljahlfksajlhfajfjfsaahflakjslhdfkjalhdskjfa
3+
from a import aksjdhflsakhdflkjsadlfajkslhfdkjsaldajlahflashdfljahlfksajlhfajfjfsaahflakjslhdfkjalhdskjfa as dfgsdfgsd, aksjdhflsakhdflkjsadlfajkslhfdkjsaldajlahflashdfljahlfksajlhfajfjfsaahflakjslhdfkjalhdskjfa as sdkjflsdjlahlfd
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
from a import aksjdhflsakhdflkjsadlfajkslhf
2+
from a import (
3+
aksjdhflsakhdflkjsadlfajkslhf,
4+
)
5+
from a import (
6+
aksjdhflsakhdflkjsadlfajkslhfdkjsaldajlahflashdfljahlfksajlhfajfjfsaahflakjslhdfkjalhdskjfa,
7+
)
8+
from a import (
9+
aksjdhflsakhdflkjsadlfajkslhfdkjsaldajlahflashdfljahlfksajlhfajfjfsaahflakjslhdfkjalhdskjfa,
10+
aksjdhflsakhdflkjsadlfajkslhfdkjsaldajlahflashdfljahlfksajlhfajfjfsaahflakjslhdfkjalhdskjfa,
11+
)
12+
from a import (
13+
aksjdhflsakhdflkjsadlfajkslhfdkjsaldajlahflashdfljahlfksajlhfajfjfsaahflakjslhdfkjalhdskjfa as dfgsdfgsd,
14+
aksjdhflsakhdflkjsadlfajkslhfdkjsaldajlahflashdfljahlfksajlhfajfjfsaahflakjslhdfkjalhdskjfa as sdkjflsdjlahlfd,
15+
)
16+
from aksjdhflsakhdflkjsadlfajkslhfdkjsaldajlahflashdfljahlfksajlhfajfjfsaahflakjslhdfkjalhdskjfa import *
Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,22 @@
1-
use crate::{not_yet_implemented, FormatNodeRule, PyFormatter};
2-
use ruff_formatter::{write, Buffer, FormatResult};
1+
use crate::{AsFormat, FormatNodeRule, PyFormatter};
2+
use ruff_formatter::prelude::{space, text};
3+
use ruff_formatter::{write, Buffer, Format, FormatResult};
34
use rustpython_parser::ast::Alias;
45

56
#[derive(Default)]
67
pub struct FormatAlias;
78

89
impl FormatNodeRule<Alias> for FormatAlias {
910
fn fmt_fields(&self, item: &Alias, f: &mut PyFormatter) -> FormatResult<()> {
10-
write!(f, [not_yet_implemented(item)])
11+
let Alias {
12+
range: _,
13+
name,
14+
asname,
15+
} = item;
16+
name.format().fmt(f)?;
17+
if let Some(asname) = asname {
18+
write!(f, [space(), text("as"), space(), asname.format()])?;
19+
}
20+
Ok(())
1121
}
1222
}
Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
use crate::{not_yet_implemented, FormatNodeRule, PyFormatter};
1+
use crate::{FormatNodeRule, FormattedIterExt, PyFormatter};
2+
use ruff_formatter::prelude::{format_args, format_with, space, text};
23
use ruff_formatter::{write, Buffer, FormatResult};
34
use rustpython_parser::ast::StmtImport;
45

@@ -7,6 +8,12 @@ pub struct FormatStmtImport;
78

89
impl FormatNodeRule<StmtImport> for FormatStmtImport {
910
fn fmt_fields(&self, item: &StmtImport, f: &mut PyFormatter) -> FormatResult<()> {
10-
write!(f, [not_yet_implemented(item)])
11+
let StmtImport { names, range: _ } = item;
12+
let names = format_with(|f| {
13+
f.join_with(&format_args![text(","), space()])
14+
.entries(names.iter().formatted())
15+
.finish()
16+
});
17+
write!(f, [text("import"), space(), names])
1118
}
1219
}
Lines changed: 39 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,48 @@
1-
use crate::{not_yet_implemented, FormatNodeRule, PyFormatter};
2-
use ruff_formatter::{write, Buffer, FormatResult};
1+
use crate::builders::{optional_parentheses, PyFormatterExtensions};
2+
use crate::{AsFormat, FormatNodeRule, PyFormatter};
3+
use ruff_formatter::prelude::{dynamic_text, format_with, space, text};
4+
use ruff_formatter::{write, Buffer, Format, FormatResult};
35
use rustpython_parser::ast::StmtImportFrom;
46

57
#[derive(Default)]
68
pub struct FormatStmtImportFrom;
79

810
impl FormatNodeRule<StmtImportFrom> for FormatStmtImportFrom {
911
fn fmt_fields(&self, item: &StmtImportFrom, f: &mut PyFormatter) -> FormatResult<()> {
10-
write!(f, [not_yet_implemented(item)])
12+
let StmtImportFrom {
13+
module,
14+
names,
15+
range: _,
16+
level,
17+
} = item;
18+
19+
let level_str = level
20+
.map(|level| ".".repeat(level.to_usize()))
21+
.unwrap_or(String::default());
22+
23+
write!(
24+
f,
25+
[
26+
text("from"),
27+
space(),
28+
dynamic_text(&level_str, None),
29+
module.as_ref().map(AsFormat::format),
30+
space(),
31+
text("import"),
32+
space(),
33+
]
34+
)?;
35+
if let [name] = names.as_slice() {
36+
// star can't be surrounded by parentheses
37+
if name.name.as_str() == "*" {
38+
return text("*").fmt(f);
39+
}
40+
}
41+
let names = format_with(|f| {
42+
f.join_comma_separated()
43+
.entries(names.iter().map(|name| (name, name.format())))
44+
.finish()
45+
});
46+
optional_parentheses(&names).fmt(f)
1147
}
1248
}

crates/ruff_python_formatter/tests/snapshots/black_compatibility@miscellaneous__force_pyi.py.snap

Lines changed: 11 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -43,21 +43,20 @@ def eggs() -> Union[str, int]: ...
4343
--- Black
4444
+++ Ruff
4545
@@ -1,32 +1,58 @@
46-
-from typing import Union
47-
+NOT_YET_IMPLEMENTED_StmtImportFrom
48-
+
46+
from typing import Union
4947
48+
+
5049
@bird
5150
-def zoo(): ...
5251
+def zoo():
5352
+ ...
54-
+
55-
+
56-
+class A:
57-
+ ...
5853
5954
-class A: ...
6055
56+
+class A:
57+
+ ...
58+
+
59+
+
6160
@bar
6261
class B:
6362
- def BMethod(self) -> None: ...
@@ -94,14 +93,14 @@ def eggs() -> Union[str, int]: ...
9493
+
9594
+class F(A, C):
9695
+ ...
96+
+
97+
+
98+
+def spam() -> None:
99+
+ ...
97100
98101
-class F(A, C): ...
99102
100103
-def spam() -> None: ...
101-
+def spam() -> None:
102-
+ ...
103-
+
104-
+
105104
@overload
106105
-def spam(arg: str) -> str: ...
107106
+def spam(arg: str) -> str:
@@ -120,7 +119,7 @@ def eggs() -> Union[str, int]: ...
120119
## Ruff Output
121120

122121
```py
123-
NOT_YET_IMPLEMENTED_StmtImportFrom
122+
from typing import Union
124123
125124
126125
@bird

crates/ruff_python_formatter/tests/snapshots/black_compatibility@py_310__pattern_matching_extras.py.snap

Lines changed: 13 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -132,8 +132,7 @@ match bar1:
132132
--- Black
133133
+++ Ruff
134134
@@ -1,119 +1,43 @@
135-
-import match
136-
+NOT_YET_IMPLEMENTED_StmtImport
135+
import match
137136
138137
-match something:
139138
- case [a as b]:
@@ -208,10 +207,11 @@ match bar1:
208207
- ),
209208
- ):
210209
- pass
211-
-
210+
+NOT_YET_IMPLEMENTED_StmtMatch
211+
212212
- case [a as match]:
213213
- pass
214-
-
214+
215215
- case case:
216216
- pass
217217
+NOT_YET_IMPLEMENTED_StmtMatch
@@ -220,8 +220,9 @@ match bar1:
220220
-match match:
221221
- case case:
222222
- pass
223-
-
224-
-
223+
+NOT_YET_IMPLEMENTED_StmtMatch
224+
225+
225226
-match a, *b(), c:
226227
- case d, *f, g:
227228
- pass
@@ -236,30 +237,28 @@ match bar1:
236237
- pass
237238
- case {"maybe": something(complicated as this) as that}:
238239
- pass
240+
-
239241
+NOT_YET_IMPLEMENTED_StmtMatch
240242
241-
242243
-match something:
243244
- case 1 as a:
244245
- pass
245-
+NOT_YET_IMPLEMENTED_StmtMatch
246246
247247
- case 2 as b, 3 as c:
248248
- pass
249+
+NOT_YET_IMPLEMENTED_StmtMatch
249250
250251
- case 4 as d, (5 as e), (6 | 7 as g), *h:
251252
- pass
252-
+NOT_YET_IMPLEMENTED_StmtMatch
253-
254253
254+
-
255255
-match bar1:
256256
- case Foo(aa=Callable() as aa, bb=int()):
257257
- print(bar1.aa, bar1.bb)
258258
- case _:
259259
- print("no match", "\n")
260-
+NOT_YET_IMPLEMENTED_StmtMatch
261-
262-
260+
-
261+
-
263262
-match bar1:
264263
- case Foo(
265264
- normal=x, perhaps=[list, {"x": d, "y": 1.0}] as y, otherwise=something, q=t as u
@@ -271,7 +270,7 @@ match bar1:
271270
## Ruff Output
272271

273272
```py
274-
NOT_YET_IMPLEMENTED_StmtImport
273+
import match
275274
276275
NOT_YET_IMPLEMENTED_StmtMatch
277276

crates/ruff_python_formatter/tests/snapshots/black_compatibility@simple_cases__collections.py.snap

Lines changed: 16 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -83,31 +83,9 @@ if True:
8383
```diff
8484
--- Black
8585
+++ Ruff
86-
@@ -1,40 +1,22 @@
87-
-import core, time, a
88-
+NOT_YET_IMPLEMENTED_StmtImport
89-
90-
-from . import A, B, C
91-
+NOT_YET_IMPLEMENTED_StmtImportFrom
92-
93-
# keeps existing trailing comma
94-
-from foo import (
95-
- bar,
96-
-)
97-
+NOT_YET_IMPLEMENTED_StmtImportFrom
98-
99-
# also keeps existing structure
100-
-from foo import (
101-
- baz,
102-
- qux,
103-
-)
104-
+NOT_YET_IMPLEMENTED_StmtImportFrom
105-
106-
# `as` works as well
107-
-from foo import (
108-
- xyzzy as magic,
109-
-)
110-
+NOT_YET_IMPLEMENTED_StmtImportFrom
86+
@@ -18,23 +18,12 @@
87+
xyzzy as magic,
88+
)
11189
11290
-a = {
11391
- 1,
@@ -132,7 +110,7 @@ if True:
132110
nested_no_trailing_comma = {(1, 2, 3), (4, 5, 6)}
133111
nested_long_lines = [
134112
"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
135-
@@ -52,10 +34,7 @@
113+
@@ -52,10 +41,7 @@
136114
y = {
137115
"oneple": (1,),
138116
}
@@ -149,18 +127,25 @@ if True:
149127
## Ruff Output
150128

151129
```py
152-
NOT_YET_IMPLEMENTED_StmtImport
130+
import core, time, a
153131
154-
NOT_YET_IMPLEMENTED_StmtImportFrom
132+
from . import A, B, C
155133
156134
# keeps existing trailing comma
157-
NOT_YET_IMPLEMENTED_StmtImportFrom
135+
from foo import (
136+
bar,
137+
)
158138
159139
# also keeps existing structure
160-
NOT_YET_IMPLEMENTED_StmtImportFrom
140+
from foo import (
141+
baz,
142+
qux,
143+
)
161144
162145
# `as` works as well
163-
NOT_YET_IMPLEMENTED_StmtImportFrom
146+
from foo import (
147+
xyzzy as magic,
148+
)
164149
165150
a = {1, 2, 3}
166151
b = {1, 2, 3}

0 commit comments

Comments
 (0)