PY-82105 Virtual environment creation is not requested in case of opening project with requirements.txt

Signed-off-by: Nikita.Ashihmin <nikita.ashihmin@jetbrains.com>

GitOrigin-RevId: fba969e0f5cc4ef18bf2c74de557c472dbdc7d69
This commit is contained in:
Nikita.Ashihmin
2025-06-27 03:38:29 +00:00
committed by intellij-monorepo-bot
parent 6b1720baee
commit 9f0baea357
3 changed files with 37 additions and 4 deletions
@@ -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)
@@ -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)
@@ -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<String> = arrayOf<String>(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<PyRequirement>? {
val setupCall = findSetupCall(file) ?: return null