Skip to content

Commit

Permalink
Remove spaces from import statements
Browse files Browse the repository at this point in the history
**Summary** Remove spaces from import statements such as

```python
import tqdm .  tqdm
from tqdm .    auto import tqdm
```

See also #7760 for a better solution.

**Test Plan** New fixtures
  • Loading branch information
konstin committed Oct 9, 2023
1 parent 38f512d commit 350ea0d
Show file tree
Hide file tree
Showing 5 changed files with 24 additions and 8 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,8 @@
from foo\
.bar import baz

import tqdm . tqdm

# At the top-level, force one empty line after an import, but allow up to two empty
# lines.
import os
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,3 +35,5 @@
( # comment
bar,
)

from tqdm . auto import tqdm
20 changes: 12 additions & 8 deletions crates/ruff_python_formatter/src/other/identifier.rs
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
use ruff_formatter::{FormatOwnedWithRule, FormatRefWithRule};
use ruff_python_ast::Identifier;
use ruff_python_trivia::is_python_whitespace;
use ruff_text_size::Ranged;

use crate::prelude::*;
Expand Down Expand Up @@ -31,6 +32,7 @@ impl<'ast> IntoFormat<PyFormatContext<'ast>> for Identifier {
/// A formatter for a dot-delimited identifier, as seen in import statements:
/// ```python
/// import foo.bar
/// from tqdm . auto import tqdm
/// ```
///
/// Dot-delimited identifiers can contain newlines via continuations (backslashes) after the
Expand All @@ -54,14 +56,16 @@ impl<'a> DotDelimitedIdentifier<'a> {

impl Format<PyFormatContext<'_>> for DotDelimitedIdentifier<'_> {
fn fmt(&self, f: &mut PyFormatter) -> FormatResult<()> {
// An import identifier can contain newlines by inserting continuations (backslashes) after
// a dot-delimited segment, as in:
// ```python
// import foo\
// .bar
// ```
if memchr::memchr(b'\\', f.context().source()[self.0.range()].as_bytes()).is_some() {
text(self.0.as_str(), Some(self.0.start())).fmt(f)
// The backslashes are line continuations
if f.context().source()[self.0.range()]
.chars()
.any(|c| is_python_whitespace(c) || matches!(c, '\n' | '\r' | '\\'))
{
let no_whitespace: String = f.context().source()[self.0.range()]
.chars()
.filter(|c| !is_python_whitespace(*c) && !matches!(c, '\n' | '\r' | '\\'))
.collect();
text(&no_whitespace, Some(self.0.start())).fmt(f)
} else {
source_text_slice(self.0.range()).fmt(f)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,8 @@ import foo\
from foo\
.bar import baz
import tqdm . tqdm
# At the top-level, force one empty line after an import, but allow up to two empty
# lines.
import os
Expand Down Expand Up @@ -110,6 +112,8 @@ import foo.bar
from foo.bar import baz
import tqdm.tqdm
# At the top-level, force one empty line after an import, but allow up to two empty
# lines.
import os
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,8 @@ from a import \
( # comment
bar,
)
from tqdm . auto import tqdm
```

## Output
Expand Down Expand Up @@ -115,6 +117,8 @@ from a import (
from a import ( # comment
bar,
)
from tqdm.auto import tqdm
```


Expand Down

0 comments on commit 350ea0d

Please sign in to comment.