Skip to content

Commit 301b9f4

Browse files
Add trailing space around readlines (astral-sh#18542)
Closes astral-sh#17683.
1 parent 86e5a31 commit 301b9f4

File tree

4 files changed

+68
-2
lines changed

4 files changed

+68
-2
lines changed

crates/ruff_linter/resources/test/fixtures/refurb/FURB129.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,3 +102,8 @@ def readlines(self) -> list[str]:
102102
pass
103103
for line in(f).readlines():
104104
pass
105+
# Test case for issue #17683 - missing space before keyword
106+
print([line for line in f.readlines()if True])
107+
print([line for line in f.readlines()and True])
108+
print([line for line in f.readlines()or True])
109+
print([line for line in f.readlines()in ["test"]])

crates/ruff_linter/src/rules/refurb/rules/readlines_in_for.rs

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ use ruff_python_semantic::analyze::typing::is_io_base_expr;
66
use ruff_text_size::Ranged;
77

88
use crate::checkers::ast::Checker;
9+
use crate::fix::edits::pad_end;
910
use crate::preview::is_readlines_in_for_fix_safe_enabled;
1011
use crate::{AlwaysFixableViolation, Edit, Fix};
1112

@@ -91,9 +92,21 @@ fn readlines_in_iter(checker: &Checker, iter_expr: &Expr) {
9192
checker.comment_ranges(),
9293
checker.source(),
9394
) {
94-
Edit::range_deletion(expr_call.range().add_start(parenthesized_range.len()))
95+
let deletion_range = expr_call.range().add_start(parenthesized_range.len());
96+
let padded = pad_end(String::new(), deletion_range.end(), checker.locator());
97+
if padded.is_empty() {
98+
Edit::range_deletion(deletion_range)
99+
} else {
100+
Edit::range_replacement(padded, deletion_range)
101+
}
95102
} else {
96-
Edit::range_deletion(expr_call.range().add_start(expr_attr.value.range().len()))
103+
let deletion_range = expr_call.range().add_start(expr_attr.value.range().len());
104+
let padded = pad_end(String::new(), deletion_range.end(), checker.locator());
105+
if padded.is_empty() {
106+
Edit::range_deletion(deletion_range)
107+
} else {
108+
Edit::range_replacement(padded, deletion_range)
109+
}
97110
};
98111

99112
let mut diagnostic = checker.report_diagnostic(ReadlinesInFor, expr_call.range());

crates/ruff_linter/src/rules/refurb/snapshots/ruff_linter__rules__refurb__tests__FURB129_FURB129.py.snap

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -307,6 +307,7 @@ FURB129.py:103:16: FURB129 [*] Instead of calling `readlines()`, iterate over fi
307307
103 | for line in(f).readlines():
308308
| ^^^^^^^^^^^^^^^ FURB129
309309
104 | pass
310+
105 | # Test case for issue #17683 - missing space before keyword
310311
|
311312
= help: Remove `readlines()`
312313

@@ -317,3 +318,26 @@ FURB129.py:103:16: FURB129 [*] Instead of calling `readlines()`, iterate over fi
317318
103 |- for line in(f).readlines():
318319
103 |+ for line in(f):
319320
104 104 | pass
321+
105 105 | # Test case for issue #17683 - missing space before keyword
322+
106 106 | print([line for line in f.readlines()if True])
323+
324+
FURB129.py:106:29: FURB129 [*] Instead of calling `readlines()`, iterate over file object directly
325+
|
326+
104 | pass
327+
105 | # Test case for issue #17683 - missing space before keyword
328+
106 | print([line for line in f.readlines()if True])
329+
| ^^^^^^^^^^^^^ FURB129
330+
107 | print([line for line in f.readlines()and True])
331+
108 | print([line for line in f.readlines()or True])
332+
|
333+
= help: Remove `readlines()`
334+
335+
Unsafe fix
336+
103 103 | for line in(f).readlines():
337+
104 104 | pass
338+
105 105 | # Test case for issue #17683 - missing space before keyword
339+
106 |- print([line for line in f.readlines()if True])
340+
106 |+ print([line for line in f if True])
341+
107 107 | print([line for line in f.readlines()and True])
342+
108 108 | print([line for line in f.readlines()or True])
343+
109 109 | print([line for line in f.readlines()in ["test"]])

crates/ruff_linter/src/rules/refurb/snapshots/ruff_linter__rules__refurb__tests__preview__FURB129_FURB129.py.snap

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -307,6 +307,7 @@ FURB129.py:103:16: FURB129 [*] Instead of calling `readlines()`, iterate over fi
307307
103 | for line in(f).readlines():
308308
| ^^^^^^^^^^^^^^^ FURB129
309309
104 | pass
310+
105 | # Test case for issue #17683 - missing space before keyword
310311
|
311312
= help: Remove `readlines()`
312313

@@ -317,3 +318,26 @@ FURB129.py:103:16: FURB129 [*] Instead of calling `readlines()`, iterate over fi
317318
103 |- for line in(f).readlines():
318319
103 |+ for line in(f):
319320
104 104 | pass
321+
105 105 | # Test case for issue #17683 - missing space before keyword
322+
106 106 | print([line for line in f.readlines()if True])
323+
324+
FURB129.py:106:29: FURB129 [*] Instead of calling `readlines()`, iterate over file object directly
325+
|
326+
104 | pass
327+
105 | # Test case for issue #17683 - missing space before keyword
328+
106 | print([line for line in f.readlines()if True])
329+
| ^^^^^^^^^^^^^ FURB129
330+
107 | print([line for line in f.readlines()and True])
331+
108 | print([line for line in f.readlines()or True])
332+
|
333+
= help: Remove `readlines()`
334+
335+
Safe fix
336+
103 103 | for line in(f).readlines():
337+
104 104 | pass
338+
105 105 | # Test case for issue #17683 - missing space before keyword
339+
106 |- print([line for line in f.readlines()if True])
340+
106 |+ print([line for line in f if True])
341+
107 107 | print([line for line in f.readlines()and True])
342+
108 108 | print([line for line in f.readlines()or True])
343+
109 109 | print([line for line in f.readlines()in ["test"]])

0 commit comments

Comments
 (0)