diff --git a/python/src/com/jetbrains/python/codeInsight/imports/AddImportHelper.java b/python/src/com/jetbrains/python/codeInsight/imports/AddImportHelper.java index ba0f11131b2c..52ca2006a44c 100644 --- a/python/src/com/jetbrains/python/codeInsight/imports/AddImportHelper.java +++ b/python/src/com/jetbrains/python/codeInsight/imports/AddImportHelper.java @@ -225,6 +225,9 @@ public class AddImportHelper { if (fromImportStatement.isFromFuture()) { return ImportPriority.FUTURE; } + if (fromImportStatement.getRelativeLevel() > 0) { + return ImportPriority.PROJECT; + } resolved = fromImportStatement.resolveImportSource(); } else { diff --git a/python/testData/optimizeImports/alphabeticalOrder.after.py b/python/testData/optimizeImports/alphabeticalOrder.after.py index edf016f2f333..b06b7ad267a8 100644 --- a/python/testData/optimizeImports/alphabeticalOrder.after.py +++ b/python/testData/optimizeImports/alphabeticalOrder.after.py @@ -16,6 +16,7 @@ from alphabet import B, A from alphabet import C from alphabet import D from b import func + from . import m1 from . import m4, m5 from .pkg import m3 diff --git a/python/testData/optimizeImports/disableAlphabeticalOrder.after.py b/python/testData/optimizeImports/disableAlphabeticalOrder.after.py index 46e2c5d80bbe..25e330235b74 100644 --- a/python/testData/optimizeImports/disableAlphabeticalOrder.after.py +++ b/python/testData/optimizeImports/disableAlphabeticalOrder.after.py @@ -12,12 +12,13 @@ from alphabet import D from b import func from import foo # broken -from . import m1 import # broken from alphabet import * -from .. import m2 from alphabet import C from alphabet import B, A + +from . import m1 +from .. import m2 from .pkg import m3 from . import m4, m5 diff --git a/python/testData/optimizeImports/unresolvedRelativeImportsShouldBeInProjectGroup/pkg/__init__.py b/python/testData/optimizeImports/unresolvedRelativeImportsShouldBeInProjectGroup/pkg/__init__.py new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/python/testData/optimizeImports/unresolvedRelativeImportsShouldBeInProjectGroup/pkg/main.after.py b/python/testData/optimizeImports/unresolvedRelativeImportsShouldBeInProjectGroup/pkg/main.after.py new file mode 100644 index 000000000000..ba77b50a254c --- /dev/null +++ b/python/testData/optimizeImports/unresolvedRelativeImportsShouldBeInProjectGroup/pkg/main.after.py @@ -0,0 +1,6 @@ +import re + +from . import foo +from .module import A + +print(re, foo, A) diff --git a/python/testData/optimizeImports/unresolvedRelativeImportsShouldBeInProjectGroup/pkg/main.py b/python/testData/optimizeImports/unresolvedRelativeImportsShouldBeInProjectGroup/pkg/main.py new file mode 100644 index 000000000000..47d1a0c8d4d8 --- /dev/null +++ b/python/testData/optimizeImports/unresolvedRelativeImportsShouldBeInProjectGroup/pkg/main.py @@ -0,0 +1,5 @@ +import re +from . import foo +from .module import A + +print(re, foo, A) diff --git a/python/testSrc/com/jetbrains/python/PyOptimizeImportsTest.java b/python/testSrc/com/jetbrains/python/PyOptimizeImportsTest.java index 251a49d8560d..3226eb60ae5a 100644 --- a/python/testSrc/com/jetbrains/python/PyOptimizeImportsTest.java +++ b/python/testSrc/com/jetbrains/python/PyOptimizeImportsTest.java @@ -182,6 +182,15 @@ public class PyOptimizeImportsTest extends PyTestCase { doTest(); } + // PY-19674 + public void testUnresolvedRelativeImportsShouldBeInProjectGroup() { + final String testName = getTestName(true); + myFixture.copyDirectoryToProject(testName, ""); + myFixture.configureByFile("pkg/main.py"); + OptimizeImportsAction.actionPerformedImpl(DataManager.getInstance().getDataContext(myFixture.getEditor().getContentComponent())); + myFixture.checkResultByFile(testName + "/pkg/main.after.py"); + } + private void doTest() { myFixture.configureByFile(getTestName(true) + ".py"); OptimizeImportsAction.actionPerformedImpl(DataManager.getInstance().getDataContext(myFixture.getEditor().getContentComponent()));