Move unconventional import rule to post-binding phase (#5151)

## Summary

This PR moves the "unconventional import alias" rule (which enforces,
e.g., that `pandas` is imported as `pd`) to the "dead scopes" phase,
after the main linter pass. This (1) avoids an allocation since we no
longer need to create the qualified name in the linter pass; and (2)
will allow us to autofix it, since we'll have access to all references.

## Test Plan

`cargo test` -- all changes are to ranges (which are improvements IMO).
This commit is contained in:
Charlie Marsh 2023-06-18 11:23:40 -04:00 committed by GitHub
parent 195b36c429
commit a0b750f74b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
8 changed files with 167 additions and 174 deletions

View File

@ -950,18 +950,6 @@ where
} }
} }
} }
if self.enabled(Rule::UnconventionalImportAlias) {
if let Some(diagnostic) =
flake8_import_conventions::rules::conventional_import_alias(
stmt,
&alias.name,
alias.asname.as_deref(),
&self.settings.flake8_import_conventions.aliases,
)
{
self.diagnostics.push(diagnostic);
}
}
if self.enabled(Rule::BannedImportAlias) { if self.enabled(Rule::BannedImportAlias) {
if let Some(asname) = &alias.asname { if let Some(asname) = &alias.asname {
if let Some(diagnostic) = if let Some(diagnostic) =
@ -1162,20 +1150,6 @@ where
self.diagnostics.push(diagnostic); self.diagnostics.push(diagnostic);
} }
} }
if self.enabled(Rule::UnconventionalImportAlias) {
let qualified_name =
helpers::format_import_from_member(level, module, &alias.name);
if let Some(diagnostic) =
flake8_import_conventions::rules::conventional_import_alias(
stmt,
&qualified_name,
alias.asname.as_deref(),
&self.settings.flake8_import_conventions.aliases,
)
{
self.diagnostics.push(diagnostic);
}
}
if self.enabled(Rule::BannedImportAlias) { if self.enabled(Rule::BannedImportAlias) {
if let Some(asname) = &alias.asname { if let Some(asname) = &alias.asname {
let qualified_name = let qualified_name =
@ -1192,7 +1166,6 @@ where
} }
} }
} }
if let Some(asname) = &alias.asname { if let Some(asname) = &alias.asname {
if self.enabled(Rule::ConstantImportedAsNonConstant) { if self.enabled(Rule::ConstantImportedAsNonConstant) {
if let Some(diagnostic) = if let Some(diagnostic) =
@ -1259,8 +1232,6 @@ where
self.diagnostics.push(diagnostic); self.diagnostics.push(diagnostic);
} }
} }
// pylint
if !self.is_stub { if !self.is_stub {
if self.enabled(Rule::UselessImportAlias) { if self.enabled(Rule::UselessImportAlias) {
pylint::rules::useless_import_alias(self, alias); pylint::rules::useless_import_alias(self, alias);
@ -4733,6 +4704,7 @@ impl<'a> Checker<'a> {
Rule::TypingOnlyStandardLibraryImport, Rule::TypingOnlyStandardLibraryImport,
Rule::UndefinedExport, Rule::UndefinedExport,
Rule::UnaliasedCollectionsAbcSetImport, Rule::UnaliasedCollectionsAbcSetImport,
Rule::UnconventionalImportAlias,
]) { ]) {
return; return;
} }
@ -4918,7 +4890,14 @@ impl<'a> Checker<'a> {
if self.enabled(Rule::UnusedImport) { if self.enabled(Rule::UnusedImport) {
pyflakes::rules::unused_import(self, scope, &mut diagnostics); pyflakes::rules::unused_import(self, scope, &mut diagnostics);
} }
if self.enabled(Rule::UnconventionalImportAlias) {
flake8_import_conventions::rules::unconventional_import_alias(
self,
scope,
&mut diagnostics,
&self.settings.flake8_import_conventions.aliases,
);
}
if self.is_stub { if self.is_stub {
if self.enabled(Rule::UnaliasedCollectionsAbcSetImport) { if self.enabled(Rule::UnaliasedCollectionsAbcSetImport) {
flake8_pyi::rules::unaliased_collections_abc_set_import( flake8_pyi::rules::unaliased_collections_abc_set_import(

View File

@ -1,7 +1,7 @@
pub(crate) use banned_import_alias::*; pub(crate) use banned_import_alias::*;
pub(crate) use banned_import_from::*; pub(crate) use banned_import_from::*;
pub(crate) use conventional_import_alias::*; pub(crate) use unconventional_import_alias::*;
mod banned_import_alias; mod banned_import_alias;
mod banned_import_from; mod banned_import_from;
mod conventional_import_alias; mod unconventional_import_alias;

View File

@ -1,8 +1,10 @@
use rustc_hash::FxHashMap; use rustc_hash::FxHashMap;
use rustpython_parser::ast::{Ranged, Stmt};
use ruff_diagnostics::{Diagnostic, Violation}; use ruff_diagnostics::{Diagnostic, Violation};
use ruff_macros::{derive_message_formats, violation}; use ruff_macros::{derive_message_formats, violation};
use ruff_python_semantic::Scope;
use crate::checkers::ast::Checker;
/// ## What it does /// ## What it does
/// Checks for imports that are typically imported using a common convention, /// Checks for imports that are typically imported using a common convention,
@ -40,22 +42,34 @@ impl Violation for UnconventionalImportAlias {
} }
/// ICN001 /// ICN001
pub(crate) fn conventional_import_alias( pub(crate) fn unconventional_import_alias(
stmt: &Stmt, checker: &Checker,
name: &str, scope: &Scope,
asname: Option<&str>, diagnostics: &mut Vec<Diagnostic>,
conventions: &FxHashMap<String, String>, conventions: &FxHashMap<String, String>,
) -> Option<Diagnostic> { ) -> Option<Diagnostic> {
if let Some(expected_alias) = conventions.get(name) { for (name, binding_id) in scope.all_bindings() {
if asname != Some(expected_alias) { let binding = checker.semantic().binding(binding_id);
return Some(Diagnostic::new(
let Some(qualified_name) = binding.qualified_name() else {
continue;
};
let Some(expected_alias) = conventions.get(qualified_name) else {
continue;
};
if binding.is_alias() && name == expected_alias {
continue;
}
diagnostics.push(Diagnostic::new(
UnconventionalImportAlias { UnconventionalImportAlias {
name: name.to_string(), name: qualified_name.to_string(),
asname: expected_alias.to_string(), asname: expected_alias.to_string(),
}, },
stmt.range(), binding.range,
)); ));
} }
}
None None
} }

View File

@ -1,278 +1,278 @@
--- ---
source: crates/ruff/src/rules/flake8_import_conventions/mod.rs source: crates/ruff/src/rules/flake8_import_conventions/mod.rs
--- ---
custom.py:3:1: ICN001 `altair` should be imported as `alt` custom.py:3:8: ICN001 `altair` should be imported as `alt`
| |
1 | import math # not checked 1 | import math # not checked
2 | 2 |
3 | import altair # unconventional 3 | import altair # unconventional
| ^^^^^^^^^^^^^ ICN001 | ^^^^^^ ICN001
4 | import dask.array # unconventional 4 | import dask.array # unconventional
5 | import dask.dataframe # unconventional 5 | import dask.dataframe # unconventional
| |
custom.py:4:1: ICN001 `dask.array` should be imported as `da` custom.py:4:8: ICN001 `dask.array` should be imported as `da`
| |
3 | import altair # unconventional 3 | import altair # unconventional
4 | import dask.array # unconventional 4 | import dask.array # unconventional
| ^^^^^^^^^^^^^^^^^ ICN001 | ^^^^ ICN001
5 | import dask.dataframe # unconventional 5 | import dask.dataframe # unconventional
6 | import matplotlib.pyplot # unconventional 6 | import matplotlib.pyplot # unconventional
| |
custom.py:5:1: ICN001 `dask.dataframe` should be imported as `dd` custom.py:5:8: ICN001 `dask.dataframe` should be imported as `dd`
| |
3 | import altair # unconventional 3 | import altair # unconventional
4 | import dask.array # unconventional 4 | import dask.array # unconventional
5 | import dask.dataframe # unconventional 5 | import dask.dataframe # unconventional
| ^^^^^^^^^^^^^^^^^^^^^ ICN001 | ^^^^ ICN001
6 | import matplotlib.pyplot # unconventional 6 | import matplotlib.pyplot # unconventional
7 | import numpy # unconventional 7 | import numpy # unconventional
| |
custom.py:6:1: ICN001 `matplotlib.pyplot` should be imported as `plt` custom.py:6:8: ICN001 `matplotlib.pyplot` should be imported as `plt`
| |
4 | import dask.array # unconventional 4 | import dask.array # unconventional
5 | import dask.dataframe # unconventional 5 | import dask.dataframe # unconventional
6 | import matplotlib.pyplot # unconventional 6 | import matplotlib.pyplot # unconventional
| ^^^^^^^^^^^^^^^^^^^^^^^^ ICN001 | ^^^^^^^^^^ ICN001
7 | import numpy # unconventional 7 | import numpy # unconventional
8 | import pandas # unconventional 8 | import pandas # unconventional
| |
custom.py:7:1: ICN001 `numpy` should be imported as `np` custom.py:7:8: ICN001 `numpy` should be imported as `np`
| |
5 | import dask.dataframe # unconventional 5 | import dask.dataframe # unconventional
6 | import matplotlib.pyplot # unconventional 6 | import matplotlib.pyplot # unconventional
7 | import numpy # unconventional 7 | import numpy # unconventional
| ^^^^^^^^^^^^ ICN001 | ^^^^^ ICN001
8 | import pandas # unconventional 8 | import pandas # unconventional
9 | import seaborn # unconventional 9 | import seaborn # unconventional
| |
custom.py:8:1: ICN001 `pandas` should be imported as `pd` custom.py:8:8: ICN001 `pandas` should be imported as `pd`
| |
6 | import matplotlib.pyplot # unconventional 6 | import matplotlib.pyplot # unconventional
7 | import numpy # unconventional 7 | import numpy # unconventional
8 | import pandas # unconventional 8 | import pandas # unconventional
| ^^^^^^^^^^^^^ ICN001 | ^^^^^^ ICN001
9 | import seaborn # unconventional 9 | import seaborn # unconventional
10 | import tensorflow # unconventional 10 | import tensorflow # unconventional
| |
custom.py:9:1: ICN001 `seaborn` should be imported as `sns` custom.py:9:8: ICN001 `seaborn` should be imported as `sns`
| |
7 | import numpy # unconventional 7 | import numpy # unconventional
8 | import pandas # unconventional 8 | import pandas # unconventional
9 | import seaborn # unconventional 9 | import seaborn # unconventional
| ^^^^^^^^^^^^^^ ICN001 | ^^^^^^^ ICN001
10 | import tensorflow # unconventional 10 | import tensorflow # unconventional
11 | import holoviews # unconventional 11 | import holoviews # unconventional
| |
custom.py:10:1: ICN001 `tensorflow` should be imported as `tf` custom.py:10:8: ICN001 `tensorflow` should be imported as `tf`
| |
8 | import pandas # unconventional 8 | import pandas # unconventional
9 | import seaborn # unconventional 9 | import seaborn # unconventional
10 | import tensorflow # unconventional 10 | import tensorflow # unconventional
| ^^^^^^^^^^^^^^^^^ ICN001 | ^^^^^^^^^^ ICN001
11 | import holoviews # unconventional 11 | import holoviews # unconventional
12 | import panel # unconventional 12 | import panel # unconventional
| |
custom.py:11:1: ICN001 `holoviews` should be imported as `hv` custom.py:11:8: ICN001 `holoviews` should be imported as `hv`
| |
9 | import seaborn # unconventional 9 | import seaborn # unconventional
10 | import tensorflow # unconventional 10 | import tensorflow # unconventional
11 | import holoviews # unconventional 11 | import holoviews # unconventional
| ^^^^^^^^^^^^^^^^ ICN001 | ^^^^^^^^^ ICN001
12 | import panel # unconventional 12 | import panel # unconventional
13 | import plotly.express # unconventional 13 | import plotly.express # unconventional
| |
custom.py:12:1: ICN001 `panel` should be imported as `pn` custom.py:12:8: ICN001 `panel` should be imported as `pn`
| |
10 | import tensorflow # unconventional 10 | import tensorflow # unconventional
11 | import holoviews # unconventional 11 | import holoviews # unconventional
12 | import panel # unconventional 12 | import panel # unconventional
| ^^^^^^^^^^^^ ICN001 | ^^^^^ ICN001
13 | import plotly.express # unconventional 13 | import plotly.express # unconventional
14 | import matplotlib # unconventional 14 | import matplotlib # unconventional
| |
custom.py:13:1: ICN001 `plotly.express` should be imported as `px` custom.py:13:8: ICN001 `plotly.express` should be imported as `px`
| |
11 | import holoviews # unconventional 11 | import holoviews # unconventional
12 | import panel # unconventional 12 | import panel # unconventional
13 | import plotly.express # unconventional 13 | import plotly.express # unconventional
| ^^^^^^^^^^^^^^^^^^^^^ ICN001 | ^^^^^^ ICN001
14 | import matplotlib # unconventional 14 | import matplotlib # unconventional
15 | import polars # unconventional 15 | import polars # unconventional
| |
custom.py:14:1: ICN001 `matplotlib` should be imported as `mpl` custom.py:14:8: ICN001 `matplotlib` should be imported as `mpl`
| |
12 | import panel # unconventional 12 | import panel # unconventional
13 | import plotly.express # unconventional 13 | import plotly.express # unconventional
14 | import matplotlib # unconventional 14 | import matplotlib # unconventional
| ^^^^^^^^^^^^^^^^^ ICN001 | ^^^^^^^^^^ ICN001
15 | import polars # unconventional 15 | import polars # unconventional
16 | import pyarrow # unconventional 16 | import pyarrow # unconventional
| |
custom.py:15:1: ICN001 `polars` should be imported as `pl` custom.py:15:8: ICN001 `polars` should be imported as `pl`
| |
13 | import plotly.express # unconventional 13 | import plotly.express # unconventional
14 | import matplotlib # unconventional 14 | import matplotlib # unconventional
15 | import polars # unconventional 15 | import polars # unconventional
| ^^^^^^^^^^^^^ ICN001 | ^^^^^^ ICN001
16 | import pyarrow # unconventional 16 | import pyarrow # unconventional
| |
custom.py:16:1: ICN001 `pyarrow` should be imported as `pa` custom.py:16:8: ICN001 `pyarrow` should be imported as `pa`
| |
14 | import matplotlib # unconventional 14 | import matplotlib # unconventional
15 | import polars # unconventional 15 | import polars # unconventional
16 | import pyarrow # unconventional 16 | import pyarrow # unconventional
| ^^^^^^^^^^^^^^ ICN001 | ^^^^^^^ ICN001
17 | 17 |
18 | import altair as altr # unconventional 18 | import altair as altr # unconventional
| |
custom.py:18:1: ICN001 `altair` should be imported as `alt` custom.py:18:18: ICN001 `altair` should be imported as `alt`
| |
16 | import pyarrow # unconventional 16 | import pyarrow # unconventional
17 | 17 |
18 | import altair as altr # unconventional 18 | import altair as altr # unconventional
| ^^^^^^^^^^^^^^^^^^^^^ ICN001 | ^^^^ ICN001
19 | import matplotlib.pyplot as plot # unconventional 19 | import matplotlib.pyplot as plot # unconventional
20 | import dask.array as darray # unconventional 20 | import dask.array as darray # unconventional
| |
custom.py:19:1: ICN001 `matplotlib.pyplot` should be imported as `plt` custom.py:19:29: ICN001 `matplotlib.pyplot` should be imported as `plt`
| |
18 | import altair as altr # unconventional 18 | import altair as altr # unconventional
19 | import matplotlib.pyplot as plot # unconventional 19 | import matplotlib.pyplot as plot # unconventional
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ICN001 | ^^^^ ICN001
20 | import dask.array as darray # unconventional 20 | import dask.array as darray # unconventional
21 | import dask.dataframe as ddf # unconventional 21 | import dask.dataframe as ddf # unconventional
| |
custom.py:20:1: ICN001 `dask.array` should be imported as `da` custom.py:20:22: ICN001 `dask.array` should be imported as `da`
| |
18 | import altair as altr # unconventional 18 | import altair as altr # unconventional
19 | import matplotlib.pyplot as plot # unconventional 19 | import matplotlib.pyplot as plot # unconventional
20 | import dask.array as darray # unconventional 20 | import dask.array as darray # unconventional
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^ ICN001 | ^^^^^^ ICN001
21 | import dask.dataframe as ddf # unconventional 21 | import dask.dataframe as ddf # unconventional
22 | import numpy as nmp # unconventional 22 | import numpy as nmp # unconventional
| |
custom.py:21:1: ICN001 `dask.dataframe` should be imported as `dd` custom.py:21:26: ICN001 `dask.dataframe` should be imported as `dd`
| |
19 | import matplotlib.pyplot as plot # unconventional 19 | import matplotlib.pyplot as plot # unconventional
20 | import dask.array as darray # unconventional 20 | import dask.array as darray # unconventional
21 | import dask.dataframe as ddf # unconventional 21 | import dask.dataframe as ddf # unconventional
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ICN001 | ^^^ ICN001
22 | import numpy as nmp # unconventional 22 | import numpy as nmp # unconventional
23 | import pandas as pdas # unconventional 23 | import pandas as pdas # unconventional
| |
custom.py:22:1: ICN001 `numpy` should be imported as `np` custom.py:22:17: ICN001 `numpy` should be imported as `np`
| |
20 | import dask.array as darray # unconventional 20 | import dask.array as darray # unconventional
21 | import dask.dataframe as ddf # unconventional 21 | import dask.dataframe as ddf # unconventional
22 | import numpy as nmp # unconventional 22 | import numpy as nmp # unconventional
| ^^^^^^^^^^^^^^^^^^^ ICN001 | ^^^ ICN001
23 | import pandas as pdas # unconventional 23 | import pandas as pdas # unconventional
24 | import seaborn as sbrn # unconventional 24 | import seaborn as sbrn # unconventional
| |
custom.py:23:1: ICN001 `pandas` should be imported as `pd` custom.py:23:18: ICN001 `pandas` should be imported as `pd`
| |
21 | import dask.dataframe as ddf # unconventional 21 | import dask.dataframe as ddf # unconventional
22 | import numpy as nmp # unconventional 22 | import numpy as nmp # unconventional
23 | import pandas as pdas # unconventional 23 | import pandas as pdas # unconventional
| ^^^^^^^^^^^^^^^^^^^^^ ICN001 | ^^^^ ICN001
24 | import seaborn as sbrn # unconventional 24 | import seaborn as sbrn # unconventional
25 | import tensorflow as tfz # unconventional 25 | import tensorflow as tfz # unconventional
| |
custom.py:24:1: ICN001 `seaborn` should be imported as `sns` custom.py:24:19: ICN001 `seaborn` should be imported as `sns`
| |
22 | import numpy as nmp # unconventional 22 | import numpy as nmp # unconventional
23 | import pandas as pdas # unconventional 23 | import pandas as pdas # unconventional
24 | import seaborn as sbrn # unconventional 24 | import seaborn as sbrn # unconventional
| ^^^^^^^^^^^^^^^^^^^^^^ ICN001 | ^^^^ ICN001
25 | import tensorflow as tfz # unconventional 25 | import tensorflow as tfz # unconventional
26 | import holoviews as hsv # unconventional 26 | import holoviews as hsv # unconventional
| |
custom.py:25:1: ICN001 `tensorflow` should be imported as `tf` custom.py:25:22: ICN001 `tensorflow` should be imported as `tf`
| |
23 | import pandas as pdas # unconventional 23 | import pandas as pdas # unconventional
24 | import seaborn as sbrn # unconventional 24 | import seaborn as sbrn # unconventional
25 | import tensorflow as tfz # unconventional 25 | import tensorflow as tfz # unconventional
| ^^^^^^^^^^^^^^^^^^^^^^^^ ICN001 | ^^^ ICN001
26 | import holoviews as hsv # unconventional 26 | import holoviews as hsv # unconventional
27 | import panel as pns # unconventional 27 | import panel as pns # unconventional
| |
custom.py:26:1: ICN001 `holoviews` should be imported as `hv` custom.py:26:21: ICN001 `holoviews` should be imported as `hv`
| |
24 | import seaborn as sbrn # unconventional 24 | import seaborn as sbrn # unconventional
25 | import tensorflow as tfz # unconventional 25 | import tensorflow as tfz # unconventional
26 | import holoviews as hsv # unconventional 26 | import holoviews as hsv # unconventional
| ^^^^^^^^^^^^^^^^^^^^^^^ ICN001 | ^^^ ICN001
27 | import panel as pns # unconventional 27 | import panel as pns # unconventional
28 | import plotly.express as pltx # unconventional 28 | import plotly.express as pltx # unconventional
| |
custom.py:27:1: ICN001 `panel` should be imported as `pn` custom.py:27:17: ICN001 `panel` should be imported as `pn`
| |
25 | import tensorflow as tfz # unconventional 25 | import tensorflow as tfz # unconventional
26 | import holoviews as hsv # unconventional 26 | import holoviews as hsv # unconventional
27 | import panel as pns # unconventional 27 | import panel as pns # unconventional
| ^^^^^^^^^^^^^^^^^^^ ICN001 | ^^^ ICN001
28 | import plotly.express as pltx # unconventional 28 | import plotly.express as pltx # unconventional
29 | import matplotlib as ml # unconventional 29 | import matplotlib as ml # unconventional
| |
custom.py:28:1: ICN001 `plotly.express` should be imported as `px` custom.py:28:26: ICN001 `plotly.express` should be imported as `px`
| |
26 | import holoviews as hsv # unconventional 26 | import holoviews as hsv # unconventional
27 | import panel as pns # unconventional 27 | import panel as pns # unconventional
28 | import plotly.express as pltx # unconventional 28 | import plotly.express as pltx # unconventional
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ICN001 | ^^^^ ICN001
29 | import matplotlib as ml # unconventional 29 | import matplotlib as ml # unconventional
30 | import polars as ps # unconventional 30 | import polars as ps # unconventional
| |
custom.py:29:1: ICN001 `matplotlib` should be imported as `mpl` custom.py:29:22: ICN001 `matplotlib` should be imported as `mpl`
| |
27 | import panel as pns # unconventional 27 | import panel as pns # unconventional
28 | import plotly.express as pltx # unconventional 28 | import plotly.express as pltx # unconventional
29 | import matplotlib as ml # unconventional 29 | import matplotlib as ml # unconventional
| ^^^^^^^^^^^^^^^^^^^^^^^ ICN001 | ^^ ICN001
30 | import polars as ps # unconventional 30 | import polars as ps # unconventional
31 | import pyarrow as arr # unconventional 31 | import pyarrow as arr # unconventional
| |
custom.py:30:1: ICN001 `polars` should be imported as `pl` custom.py:30:18: ICN001 `polars` should be imported as `pl`
| |
28 | import plotly.express as pltx # unconventional 28 | import plotly.express as pltx # unconventional
29 | import matplotlib as ml # unconventional 29 | import matplotlib as ml # unconventional
30 | import polars as ps # unconventional 30 | import polars as ps # unconventional
| ^^^^^^^^^^^^^^^^^^^ ICN001 | ^^ ICN001
31 | import pyarrow as arr # unconventional 31 | import pyarrow as arr # unconventional
| |
custom.py:31:1: ICN001 `pyarrow` should be imported as `pa` custom.py:31:19: ICN001 `pyarrow` should be imported as `pa`
| |
29 | import matplotlib as ml # unconventional 29 | import matplotlib as ml # unconventional
30 | import polars as ps # unconventional 30 | import polars as ps # unconventional
31 | import pyarrow as arr # unconventional 31 | import pyarrow as arr # unconventional
| ^^^^^^^^^^^^^^^^^^^^^ ICN001 | ^^^ ICN001
32 | 32 |
33 | import altair as alt # conventional 33 | import altair as alt # conventional
| |

View File

@ -1,98 +1,98 @@
--- ---
source: crates/ruff/src/rules/flake8_import_conventions/mod.rs source: crates/ruff/src/rules/flake8_import_conventions/mod.rs
--- ---
defaults.py:3:1: ICN001 `altair` should be imported as `alt` defaults.py:3:8: ICN001 `altair` should be imported as `alt`
| |
1 | import math # not checked 1 | import math # not checked
2 | 2 |
3 | import altair # unconventional 3 | import altair # unconventional
| ^^^^^^^^^^^^^ ICN001 | ^^^^^^ ICN001
4 | import matplotlib.pyplot # unconventional 4 | import matplotlib.pyplot # unconventional
5 | import numpy # unconventional 5 | import numpy # unconventional
| |
defaults.py:4:1: ICN001 `matplotlib.pyplot` should be imported as `plt` defaults.py:4:8: ICN001 `matplotlib.pyplot` should be imported as `plt`
| |
3 | import altair # unconventional 3 | import altair # unconventional
4 | import matplotlib.pyplot # unconventional 4 | import matplotlib.pyplot # unconventional
| ^^^^^^^^^^^^^^^^^^^^^^^^ ICN001 | ^^^^^^^^^^ ICN001
5 | import numpy # unconventional 5 | import numpy # unconventional
6 | import pandas # unconventional 6 | import pandas # unconventional
| |
defaults.py:5:1: ICN001 `numpy` should be imported as `np` defaults.py:5:8: ICN001 `numpy` should be imported as `np`
| |
3 | import altair # unconventional 3 | import altair # unconventional
4 | import matplotlib.pyplot # unconventional 4 | import matplotlib.pyplot # unconventional
5 | import numpy # unconventional 5 | import numpy # unconventional
| ^^^^^^^^^^^^ ICN001 | ^^^^^ ICN001
6 | import pandas # unconventional 6 | import pandas # unconventional
7 | import seaborn # unconventional 7 | import seaborn # unconventional
| |
defaults.py:6:1: ICN001 `pandas` should be imported as `pd` defaults.py:6:8: ICN001 `pandas` should be imported as `pd`
| |
4 | import matplotlib.pyplot # unconventional 4 | import matplotlib.pyplot # unconventional
5 | import numpy # unconventional 5 | import numpy # unconventional
6 | import pandas # unconventional 6 | import pandas # unconventional
| ^^^^^^^^^^^^^ ICN001 | ^^^^^^ ICN001
7 | import seaborn # unconventional 7 | import seaborn # unconventional
| |
defaults.py:7:1: ICN001 `seaborn` should be imported as `sns` defaults.py:7:8: ICN001 `seaborn` should be imported as `sns`
| |
5 | import numpy # unconventional 5 | import numpy # unconventional
6 | import pandas # unconventional 6 | import pandas # unconventional
7 | import seaborn # unconventional 7 | import seaborn # unconventional
| ^^^^^^^^^^^^^^ ICN001 | ^^^^^^^ ICN001
8 | 8 |
9 | import altair as altr # unconventional 9 | import altair as altr # unconventional
| |
defaults.py:9:1: ICN001 `altair` should be imported as `alt` defaults.py:9:18: ICN001 `altair` should be imported as `alt`
| |
7 | import seaborn # unconventional 7 | import seaborn # unconventional
8 | 8 |
9 | import altair as altr # unconventional 9 | import altair as altr # unconventional
| ^^^^^^^^^^^^^^^^^^^^^ ICN001 | ^^^^ ICN001
10 | import matplotlib.pyplot as plot # unconventional 10 | import matplotlib.pyplot as plot # unconventional
11 | import numpy as nmp # unconventional 11 | import numpy as nmp # unconventional
| |
defaults.py:10:1: ICN001 `matplotlib.pyplot` should be imported as `plt` defaults.py:10:29: ICN001 `matplotlib.pyplot` should be imported as `plt`
| |
9 | import altair as altr # unconventional 9 | import altair as altr # unconventional
10 | import matplotlib.pyplot as plot # unconventional 10 | import matplotlib.pyplot as plot # unconventional
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ICN001 | ^^^^ ICN001
11 | import numpy as nmp # unconventional 11 | import numpy as nmp # unconventional
12 | import pandas as pdas # unconventional 12 | import pandas as pdas # unconventional
| |
defaults.py:11:1: ICN001 `numpy` should be imported as `np` defaults.py:11:17: ICN001 `numpy` should be imported as `np`
| |
9 | import altair as altr # unconventional 9 | import altair as altr # unconventional
10 | import matplotlib.pyplot as plot # unconventional 10 | import matplotlib.pyplot as plot # unconventional
11 | import numpy as nmp # unconventional 11 | import numpy as nmp # unconventional
| ^^^^^^^^^^^^^^^^^^^ ICN001 | ^^^ ICN001
12 | import pandas as pdas # unconventional 12 | import pandas as pdas # unconventional
13 | import seaborn as sbrn # unconventional 13 | import seaborn as sbrn # unconventional
| |
defaults.py:12:1: ICN001 `pandas` should be imported as `pd` defaults.py:12:18: ICN001 `pandas` should be imported as `pd`
| |
10 | import matplotlib.pyplot as plot # unconventional 10 | import matplotlib.pyplot as plot # unconventional
11 | import numpy as nmp # unconventional 11 | import numpy as nmp # unconventional
12 | import pandas as pdas # unconventional 12 | import pandas as pdas # unconventional
| ^^^^^^^^^^^^^^^^^^^^^ ICN001 | ^^^^ ICN001
13 | import seaborn as sbrn # unconventional 13 | import seaborn as sbrn # unconventional
| |
defaults.py:13:1: ICN001 `seaborn` should be imported as `sns` defaults.py:13:19: ICN001 `seaborn` should be imported as `sns`
| |
11 | import numpy as nmp # unconventional 11 | import numpy as nmp # unconventional
12 | import pandas as pdas # unconventional 12 | import pandas as pdas # unconventional
13 | import seaborn as sbrn # unconventional 13 | import seaborn as sbrn # unconventional
| ^^^^^^^^^^^^^^^^^^^^^^ ICN001 | ^^^^ ICN001
14 | 14 |
15 | import altair as alt # conventional 15 | import altair as alt # conventional
| |

View File

@ -1,81 +1,81 @@
--- ---
source: crates/ruff/src/rules/flake8_import_conventions/mod.rs source: crates/ruff/src/rules/flake8_import_conventions/mod.rs
--- ---
from_imports.py:3:1: ICN001 `xml.dom.minidom` should be imported as `md` from_imports.py:3:8: ICN001 `xml.dom.minidom` should be imported as `md`
| |
1 | # Test absolute imports 1 | # Test absolute imports
2 | # Violation cases 2 | # Violation cases
3 | import xml.dom.minidom 3 | import xml.dom.minidom
| ^^^^^^^^^^^^^^^^^^^^^^ ICN001 | ^^^ ICN001
4 | import xml.dom.minidom as wrong 4 | import xml.dom.minidom as wrong
5 | from xml.dom import minidom as wrong 5 | from xml.dom import minidom as wrong
| |
from_imports.py:4:1: ICN001 `xml.dom.minidom` should be imported as `md` from_imports.py:4:27: ICN001 `xml.dom.minidom` should be imported as `md`
| |
2 | # Violation cases 2 | # Violation cases
3 | import xml.dom.minidom 3 | import xml.dom.minidom
4 | import xml.dom.minidom as wrong 4 | import xml.dom.minidom as wrong
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ICN001 | ^^^^^ ICN001
5 | from xml.dom import minidom as wrong 5 | from xml.dom import minidom as wrong
6 | from xml.dom import minidom 6 | from xml.dom import minidom
| |
from_imports.py:5:1: ICN001 `xml.dom.minidom` should be imported as `md` from_imports.py:5:32: ICN001 `xml.dom.minidom` should be imported as `md`
| |
3 | import xml.dom.minidom 3 | import xml.dom.minidom
4 | import xml.dom.minidom as wrong 4 | import xml.dom.minidom as wrong
5 | from xml.dom import minidom as wrong 5 | from xml.dom import minidom as wrong
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ICN001 | ^^^^^ ICN001
6 | from xml.dom import minidom 6 | from xml.dom import minidom
7 | from xml.dom.minidom import parseString as wrong # Ensure ICN001 throws on function import. 7 | from xml.dom.minidom import parseString as wrong # Ensure ICN001 throws on function import.
| |
from_imports.py:6:1: ICN001 `xml.dom.minidom` should be imported as `md` from_imports.py:6:21: ICN001 `xml.dom.minidom` should be imported as `md`
| |
4 | import xml.dom.minidom as wrong 4 | import xml.dom.minidom as wrong
5 | from xml.dom import minidom as wrong 5 | from xml.dom import minidom as wrong
6 | from xml.dom import minidom 6 | from xml.dom import minidom
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^ ICN001 | ^^^^^^^ ICN001
7 | from xml.dom.minidom import parseString as wrong # Ensure ICN001 throws on function import. 7 | from xml.dom.minidom import parseString as wrong # Ensure ICN001 throws on function import.
8 | from xml.dom.minidom import parseString 8 | from xml.dom.minidom import parseString
| |
from_imports.py:7:1: ICN001 `xml.dom.minidom.parseString` should be imported as `pstr` from_imports.py:7:44: ICN001 `xml.dom.minidom.parseString` should be imported as `pstr`
| |
5 | from xml.dom import minidom as wrong 5 | from xml.dom import minidom as wrong
6 | from xml.dom import minidom 6 | from xml.dom import minidom
7 | from xml.dom.minidom import parseString as wrong # Ensure ICN001 throws on function import. 7 | from xml.dom.minidom import parseString as wrong # Ensure ICN001 throws on function import.
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ICN001 | ^^^^^ ICN001
8 | from xml.dom.minidom import parseString 8 | from xml.dom.minidom import parseString
9 | from xml.dom.minidom import parse, parseString 9 | from xml.dom.minidom import parse, parseString
| |
from_imports.py:8:1: ICN001 `xml.dom.minidom.parseString` should be imported as `pstr` from_imports.py:8:29: ICN001 `xml.dom.minidom.parseString` should be imported as `pstr`
| |
6 | from xml.dom import minidom 6 | from xml.dom import minidom
7 | from xml.dom.minidom import parseString as wrong # Ensure ICN001 throws on function import. 7 | from xml.dom.minidom import parseString as wrong # Ensure ICN001 throws on function import.
8 | from xml.dom.minidom import parseString 8 | from xml.dom.minidom import parseString
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ICN001 | ^^^^^^^^^^^ ICN001
9 | from xml.dom.minidom import parse, parseString 9 | from xml.dom.minidom import parse, parseString
10 | from xml.dom.minidom import parse as ps, parseString as wrong 10 | from xml.dom.minidom import parse as ps, parseString as wrong
| |
from_imports.py:9:1: ICN001 `xml.dom.minidom.parseString` should be imported as `pstr` from_imports.py:9:36: ICN001 `xml.dom.minidom.parseString` should be imported as `pstr`
| |
7 | from xml.dom.minidom import parseString as wrong # Ensure ICN001 throws on function import. 7 | from xml.dom.minidom import parseString as wrong # Ensure ICN001 throws on function import.
8 | from xml.dom.minidom import parseString 8 | from xml.dom.minidom import parseString
9 | from xml.dom.minidom import parse, parseString 9 | from xml.dom.minidom import parse, parseString
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ICN001 | ^^^^^^^^^^^ ICN001
10 | from xml.dom.minidom import parse as ps, parseString as wrong 10 | from xml.dom.minidom import parse as ps, parseString as wrong
| |
from_imports.py:10:1: ICN001 `xml.dom.minidom.parseString` should be imported as `pstr` from_imports.py:10:57: ICN001 `xml.dom.minidom.parseString` should be imported as `pstr`
| |
8 | from xml.dom.minidom import parseString 8 | from xml.dom.minidom import parseString
9 | from xml.dom.minidom import parse, parseString 9 | from xml.dom.minidom import parse, parseString
10 | from xml.dom.minidom import parse as ps, parseString as wrong 10 | from xml.dom.minidom import parse as ps, parseString as wrong
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ICN001 | ^^^^^ ICN001
11 | 11 |
12 | # No ICN001 violations 12 | # No ICN001 violations
| |

View File

@ -1,98 +1,98 @@
--- ---
source: crates/ruff/src/rules/flake8_import_conventions/mod.rs source: crates/ruff/src/rules/flake8_import_conventions/mod.rs
--- ---
override_default.py:3:1: ICN001 `altair` should be imported as `alt` override_default.py:3:8: ICN001 `altair` should be imported as `alt`
| |
1 | import math # not checked 1 | import math # not checked
2 | 2 |
3 | import altair # unconventional 3 | import altair # unconventional
| ^^^^^^^^^^^^^ ICN001 | ^^^^^^ ICN001
4 | import matplotlib.pyplot # unconventional 4 | import matplotlib.pyplot # unconventional
5 | import numpy # unconventional 5 | import numpy # unconventional
| |
override_default.py:4:1: ICN001 `matplotlib.pyplot` should be imported as `plt` override_default.py:4:8: ICN001 `matplotlib.pyplot` should be imported as `plt`
| |
3 | import altair # unconventional 3 | import altair # unconventional
4 | import matplotlib.pyplot # unconventional 4 | import matplotlib.pyplot # unconventional
| ^^^^^^^^^^^^^^^^^^^^^^^^ ICN001 | ^^^^^^^^^^ ICN001
5 | import numpy # unconventional 5 | import numpy # unconventional
6 | import pandas # unconventional 6 | import pandas # unconventional
| |
override_default.py:5:1: ICN001 `numpy` should be imported as `nmp` override_default.py:5:8: ICN001 `numpy` should be imported as `nmp`
| |
3 | import altair # unconventional 3 | import altair # unconventional
4 | import matplotlib.pyplot # unconventional 4 | import matplotlib.pyplot # unconventional
5 | import numpy # unconventional 5 | import numpy # unconventional
| ^^^^^^^^^^^^ ICN001 | ^^^^^ ICN001
6 | import pandas # unconventional 6 | import pandas # unconventional
7 | import seaborn # unconventional 7 | import seaborn # unconventional
| |
override_default.py:6:1: ICN001 `pandas` should be imported as `pd` override_default.py:6:8: ICN001 `pandas` should be imported as `pd`
| |
4 | import matplotlib.pyplot # unconventional 4 | import matplotlib.pyplot # unconventional
5 | import numpy # unconventional 5 | import numpy # unconventional
6 | import pandas # unconventional 6 | import pandas # unconventional
| ^^^^^^^^^^^^^ ICN001 | ^^^^^^ ICN001
7 | import seaborn # unconventional 7 | import seaborn # unconventional
| |
override_default.py:7:1: ICN001 `seaborn` should be imported as `sns` override_default.py:7:8: ICN001 `seaborn` should be imported as `sns`
| |
5 | import numpy # unconventional 5 | import numpy # unconventional
6 | import pandas # unconventional 6 | import pandas # unconventional
7 | import seaborn # unconventional 7 | import seaborn # unconventional
| ^^^^^^^^^^^^^^ ICN001 | ^^^^^^^ ICN001
8 | 8 |
9 | import altair as altr # unconventional 9 | import altair as altr # unconventional
| |
override_default.py:9:1: ICN001 `altair` should be imported as `alt` override_default.py:9:18: ICN001 `altair` should be imported as `alt`
| |
7 | import seaborn # unconventional 7 | import seaborn # unconventional
8 | 8 |
9 | import altair as altr # unconventional 9 | import altair as altr # unconventional
| ^^^^^^^^^^^^^^^^^^^^^ ICN001 | ^^^^ ICN001
10 | import matplotlib.pyplot as plot # unconventional 10 | import matplotlib.pyplot as plot # unconventional
11 | import numpy as np # unconventional 11 | import numpy as np # unconventional
| |
override_default.py:10:1: ICN001 `matplotlib.pyplot` should be imported as `plt` override_default.py:10:29: ICN001 `matplotlib.pyplot` should be imported as `plt`
| |
9 | import altair as altr # unconventional 9 | import altair as altr # unconventional
10 | import matplotlib.pyplot as plot # unconventional 10 | import matplotlib.pyplot as plot # unconventional
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ICN001 | ^^^^ ICN001
11 | import numpy as np # unconventional 11 | import numpy as np # unconventional
12 | import pandas as pdas # unconventional 12 | import pandas as pdas # unconventional
| |
override_default.py:11:1: ICN001 `numpy` should be imported as `nmp` override_default.py:11:17: ICN001 `numpy` should be imported as `nmp`
| |
9 | import altair as altr # unconventional 9 | import altair as altr # unconventional
10 | import matplotlib.pyplot as plot # unconventional 10 | import matplotlib.pyplot as plot # unconventional
11 | import numpy as np # unconventional 11 | import numpy as np # unconventional
| ^^^^^^^^^^^^^^^^^^ ICN001 | ^^ ICN001
12 | import pandas as pdas # unconventional 12 | import pandas as pdas # unconventional
13 | import seaborn as sbrn # unconventional 13 | import seaborn as sbrn # unconventional
| |
override_default.py:12:1: ICN001 `pandas` should be imported as `pd` override_default.py:12:18: ICN001 `pandas` should be imported as `pd`
| |
10 | import matplotlib.pyplot as plot # unconventional 10 | import matplotlib.pyplot as plot # unconventional
11 | import numpy as np # unconventional 11 | import numpy as np # unconventional
12 | import pandas as pdas # unconventional 12 | import pandas as pdas # unconventional
| ^^^^^^^^^^^^^^^^^^^^^ ICN001 | ^^^^ ICN001
13 | import seaborn as sbrn # unconventional 13 | import seaborn as sbrn # unconventional
| |
override_default.py:13:1: ICN001 `seaborn` should be imported as `sns` override_default.py:13:19: ICN001 `seaborn` should be imported as `sns`
| |
11 | import numpy as np # unconventional 11 | import numpy as np # unconventional
12 | import pandas as pdas # unconventional 12 | import pandas as pdas # unconventional
13 | import seaborn as sbrn # unconventional 13 | import seaborn as sbrn # unconventional
| ^^^^^^^^^^^^^^^^^^^^^^ ICN001 | ^^^^ ICN001
14 | 14 |
15 | import altair as alt # conventional 15 | import altair as alt # conventional
| |

View File

@ -1,78 +1,78 @@
--- ---
source: crates/ruff/src/rules/flake8_import_conventions/mod.rs source: crates/ruff/src/rules/flake8_import_conventions/mod.rs
--- ---
remove_default.py:3:1: ICN001 `altair` should be imported as `alt` remove_default.py:3:8: ICN001 `altair` should be imported as `alt`
| |
1 | import math # not checked 1 | import math # not checked
2 | 2 |
3 | import altair # unconventional 3 | import altair # unconventional
| ^^^^^^^^^^^^^ ICN001 | ^^^^^^ ICN001
4 | import matplotlib.pyplot # unconventional 4 | import matplotlib.pyplot # unconventional
5 | import numpy # not checked 5 | import numpy # not checked
| |
remove_default.py:4:1: ICN001 `matplotlib.pyplot` should be imported as `plt` remove_default.py:4:8: ICN001 `matplotlib.pyplot` should be imported as `plt`
| |
3 | import altair # unconventional 3 | import altair # unconventional
4 | import matplotlib.pyplot # unconventional 4 | import matplotlib.pyplot # unconventional
| ^^^^^^^^^^^^^^^^^^^^^^^^ ICN001 | ^^^^^^^^^^ ICN001
5 | import numpy # not checked 5 | import numpy # not checked
6 | import pandas # unconventional 6 | import pandas # unconventional
| |
remove_default.py:6:1: ICN001 `pandas` should be imported as `pd` remove_default.py:6:8: ICN001 `pandas` should be imported as `pd`
| |
4 | import matplotlib.pyplot # unconventional 4 | import matplotlib.pyplot # unconventional
5 | import numpy # not checked 5 | import numpy # not checked
6 | import pandas # unconventional 6 | import pandas # unconventional
| ^^^^^^^^^^^^^ ICN001 | ^^^^^^ ICN001
7 | import seaborn # unconventional 7 | import seaborn # unconventional
| |
remove_default.py:7:1: ICN001 `seaborn` should be imported as `sns` remove_default.py:7:8: ICN001 `seaborn` should be imported as `sns`
| |
5 | import numpy # not checked 5 | import numpy # not checked
6 | import pandas # unconventional 6 | import pandas # unconventional
7 | import seaborn # unconventional 7 | import seaborn # unconventional
| ^^^^^^^^^^^^^^ ICN001 | ^^^^^^^ ICN001
8 | 8 |
9 | import altair as altr # unconventional 9 | import altair as altr # unconventional
| |
remove_default.py:9:1: ICN001 `altair` should be imported as `alt` remove_default.py:9:18: ICN001 `altair` should be imported as `alt`
| |
7 | import seaborn # unconventional 7 | import seaborn # unconventional
8 | 8 |
9 | import altair as altr # unconventional 9 | import altair as altr # unconventional
| ^^^^^^^^^^^^^^^^^^^^^ ICN001 | ^^^^ ICN001
10 | import matplotlib.pyplot as plot # unconventional 10 | import matplotlib.pyplot as plot # unconventional
11 | import numpy as nmp # not checked 11 | import numpy as nmp # not checked
| |
remove_default.py:10:1: ICN001 `matplotlib.pyplot` should be imported as `plt` remove_default.py:10:29: ICN001 `matplotlib.pyplot` should be imported as `plt`
| |
9 | import altair as altr # unconventional 9 | import altair as altr # unconventional
10 | import matplotlib.pyplot as plot # unconventional 10 | import matplotlib.pyplot as plot # unconventional
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ICN001 | ^^^^ ICN001
11 | import numpy as nmp # not checked 11 | import numpy as nmp # not checked
12 | import pandas as pdas # unconventional 12 | import pandas as pdas # unconventional
| |
remove_default.py:12:1: ICN001 `pandas` should be imported as `pd` remove_default.py:12:18: ICN001 `pandas` should be imported as `pd`
| |
10 | import matplotlib.pyplot as plot # unconventional 10 | import matplotlib.pyplot as plot # unconventional
11 | import numpy as nmp # not checked 11 | import numpy as nmp # not checked
12 | import pandas as pdas # unconventional 12 | import pandas as pdas # unconventional
| ^^^^^^^^^^^^^^^^^^^^^ ICN001 | ^^^^ ICN001
13 | import seaborn as sbrn # unconventional 13 | import seaborn as sbrn # unconventional
| |
remove_default.py:13:1: ICN001 `seaborn` should be imported as `sns` remove_default.py:13:19: ICN001 `seaborn` should be imported as `sns`
| |
11 | import numpy as nmp # not checked 11 | import numpy as nmp # not checked
12 | import pandas as pdas # unconventional 12 | import pandas as pdas # unconventional
13 | import seaborn as sbrn # unconventional 13 | import seaborn as sbrn # unconventional
| ^^^^^^^^^^^^^^^^^^^^^^ ICN001 | ^^^^ ICN001
14 | 14 |
15 | import altair as alt # conventional 15 | import altair as alt # conventional
| |