diff --git a/python/src/com/jetbrains/python/packaging/PyPackageUtil.java b/python/src/com/jetbrains/python/packaging/PyPackageUtil.java index 7168eea3a5d1..9618ef218b72 100644 --- a/python/src/com/jetbrains/python/packaging/PyPackageUtil.java +++ b/python/src/com/jetbrains/python/packaging/PyPackageUtil.java @@ -33,6 +33,7 @@ import com.jetbrains.python.PyBundle; import com.jetbrains.python.PyNames; import com.jetbrains.python.PyPsiPackageUtil; import com.jetbrains.python.codeInsight.typing.PyTypeShed; +import com.jetbrains.python.packaging.requirementsTxt.PythonRequirementTxtSdkUtils; import com.jetbrains.python.packaging.requirementsTxt.PythonRequirementsTxtManager; import com.jetbrains.python.packaging.setupPy.SetupPyHelpers; import com.jetbrains.python.packaging.setupPy.SetupPyManager; @@ -83,8 +84,12 @@ public final class PyPackageUtil { public static @Nullable PyFile findSetupPy(@NotNull Module module) { Sdk sdk = PythonSdkUtil.findPythonSdk(module); - if (sdk == null) return null; - return SetupPyManager.getInstance(module.getProject(), sdk).getRequirementsPsiFile(); + if (sdk == null) { + return SetupPyHelpers.detectSetupPyInModule(module); + } + else { + return SetupPyManager.getInstance(module.getProject(), sdk).getRequirementsPsiFile(); + } } public static boolean hasRequirementsTxt(@NotNull Module module) { @@ -94,8 +99,12 @@ public final class PyPackageUtil { @SuppressWarnings("unused") public static @Nullable VirtualFile findRequirementsTxt(@NotNull Module module) { Sdk sdk = PythonSdkUtil.findPythonSdk(module); - if (sdk == null) return null; - return PythonRequirementsTxtManager.getInstance(module.getProject(), sdk).getDependenciesFile(); + if (sdk == null) { + return PythonRequirementTxtSdkUtils.detectRequirementsTxtInModule(module); + } + else { + return PythonRequirementsTxtManager.getInstance(module.getProject(), sdk).getDependenciesFile(); + } } @RequiresReadLock(generateAssertion = false) diff --git a/python/src/com/jetbrains/python/packaging/requirementsTxt/PythonRequirementTxtSdkUtils.kt b/python/src/com/jetbrains/python/packaging/requirementsTxt/PythonRequirementTxtSdkUtils.kt index 085b81a59a8f..5be62accb29d 100644 --- a/python/src/com/jetbrains/python/packaging/requirementsTxt/PythonRequirementTxtSdkUtils.kt +++ b/python/src/com/jetbrains/python/packaging/requirementsTxt/PythonRequirementTxtSdkUtils.kt @@ -97,6 +97,18 @@ object PythonRequirementTxtSdkUtils { saveRequirementsTxtPath(project, sdk, path) } + /** + * Should be used if sdk is not setup + */ + @JvmStatic + fun detectRequirementsTxtInModule(module: Module): VirtualFile? { + val requirementsPath = module.rootManager.contentRoots.firstNotNullOfOrNull { + it.findChild(PythonSdkAdditionalData.REQUIREMENT_TXT_DEFAULT) + } + + return requirementsPath + } + @Suppress("DEPRECATION", "removal") private fun getRequirementsTxtFromModule(module: Module): String? { val settings = PyPackageRequirementsSettings.getInstance(module) diff --git a/python/src/com/jetbrains/python/packaging/setupPy/SetupPyHelpers.kt b/python/src/com/jetbrains/python/packaging/setupPy/SetupPyHelpers.kt index 51c1073a335e..85093a7f9dac 100644 --- a/python/src/com/jetbrains/python/packaging/setupPy/SetupPyHelpers.kt +++ b/python/src/com/jetbrains/python/packaging/setupPy/SetupPyHelpers.kt @@ -2,8 +2,10 @@ package com.jetbrains.python.packaging.setupPy import com.intellij.openapi.command.WriteCommandAction +import com.intellij.openapi.module.Module import com.intellij.openapi.util.Ref import com.intellij.psi.PsiElement +import com.intellij.psi.PsiManager import com.jetbrains.python.PyBundle import com.jetbrains.python.codeInsight.controlflow.ScopeOwner import com.jetbrains.python.packaging.PyRequirement @@ -12,6 +14,7 @@ import com.jetbrains.python.psi.* import com.jetbrains.python.psi.impl.PyPsiUtils import com.jetbrains.python.psi.resolve.PyResolveContext import com.jetbrains.python.psi.types.TypeEvalContext +import com.jetbrains.python.sdk.rootManager internal object SetupPyHelpers { @@ -22,6 +25,15 @@ internal object SetupPyHelpers { private const val SETUP_TOOLS_PACKAGE = "setuptools" private val SETUP_PY_REQUIRES_KWARGS_NAMES: Array = arrayOf(REQUIRES, INSTALL_REQUIRES, "setup_requires", "tests_require") + @JvmStatic + fun detectSetupPyInModule(module: Module): PyFile? { + val file = module.rootManager.contentRoots.firstNotNullOfOrNull { + it.findChild(SETUP_PY) + } ?: return null + + return PsiManager.getInstance(module.project).findFile(file) as? PyFile + } + fun parseSetupPy(file: PyFile): List? { val setupCall = findSetupCall(file) ?: return null