diff --git a/resources/test/fixtures/isort/order_relative_imports_by_level.py b/resources/test/fixtures/isort/order_relative_imports_by_level.py new file mode 100644 index 0000000000..ba9e04445f --- /dev/null +++ b/resources/test/fixtures/isort/order_relative_imports_by_level.py @@ -0,0 +1,4 @@ +from .a import a +from ..a import a +from ..b import a +from .b import a diff --git a/src/isort/mod.rs b/src/isort/mod.rs index 3662b39cea..fc50929870 100644 --- a/src/isort/mod.rs +++ b/src/isort/mod.rs @@ -1,3 +1,4 @@ +use std::cmp::Reverse; use std::collections::{BTreeMap, BTreeSet}; use std::path::PathBuf; @@ -381,6 +382,7 @@ fn sort_imports(block: ImportBlock) -> OrderedImportBlock { // Sort each `StmtKind::ImportFrom` by module key, breaking ties based on // members. ( + Reverse(import_from.level), import_from .module .as_ref() @@ -477,6 +479,7 @@ mod tests { #[test_case(Path::new("leading_prefix.py"))] #[test_case(Path::new("no_reorder_within_section.py"))] #[test_case(Path::new("order_by_type.py"))] + #[test_case(Path::new("order_relative_imports_by_level.py"))] #[test_case(Path::new("preserve_comment_order.py"))] #[test_case(Path::new("preserve_indentation.py"))] #[test_case(Path::new("reorder_within_section.py"))] diff --git a/src/isort/snapshots/ruff__isort__tests__order_relative_imports_by_level.py.snap b/src/isort/snapshots/ruff__isort__tests__order_relative_imports_by_level.py.snap new file mode 100644 index 0000000000..c993b16fe6 --- /dev/null +++ b/src/isort/snapshots/ruff__isort__tests__order_relative_imports_by_level.py.snap @@ -0,0 +1,22 @@ +--- +source: src/isort/mod.rs +expression: checks +--- +- kind: UnsortedImports + location: + row: 1 + column: 0 + end_location: + row: 5 + column: 0 + fix: + patch: + content: "from ..a import a\nfrom ..b import a\nfrom .a import a\nfrom .b import a\n" + location: + row: 1 + column: 0 + end_location: + row: 5 + column: 0 + applied: false +