DS-724 Detect existing conda envs on Project creation and disable custom sorting

Signed-off-by: Elizaveta Shashkova <elizaveta.shashkova@jetbrains.com>

GitOrigin-RevId: 18405e53c5c276021be2d1285cdbd06593f7cd80
This commit is contained in:
Elizaveta Shashkova
2020-09-10 18:50:39 +03:00
committed by intellij-monorepo-bot
parent 49296d58fe
commit 9c70a34e97
5 changed files with 42 additions and 11 deletions

View File

@@ -70,5 +70,6 @@
</library>
</orderEntry>
<orderEntry type="library" name="Trove4j" level="project" />
<orderEntry type="module" module-name="intellij.platform.util" />
</component>
</module>

View File

@@ -13,6 +13,7 @@ import com.intellij.openapi.ui.TextFieldWithBrowseButton;
import com.intellij.openapi.ui.VerticalFlowLayout;
import com.intellij.openapi.util.NlsContexts;
import com.intellij.openapi.util.Pair;
import com.intellij.openapi.util.UserDataHolderBase;
import com.intellij.openapi.util.io.FileUtil;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.platform.DirectoryProjectGenerator;
@@ -30,8 +31,10 @@ import com.jetbrains.python.packaging.PyPackage;
import com.jetbrains.python.packaging.PyPackageUtil;
import com.jetbrains.python.psi.PyUtil;
import com.jetbrains.python.sdk.*;
import com.jetbrains.python.sdk.add.PyAddExistingCondaEnvPanel;
import com.jetbrains.python.sdk.add.PyAddSdkGroupPanel;
import com.jetbrains.python.sdk.add.PyAddSdkPanel;
import com.jetbrains.python.sdk.conda.PyCondaSdkCustomizer;
import one.util.streamex.StreamEx;
import org.jetbrains.annotations.Nls;
import org.jetbrains.annotations.NotNull;
@@ -100,6 +103,10 @@ public class ProjectSpecificSettingsStep<T> extends ProjectSettingsStepBase<T> i
else if (panel instanceof PyAddExistingSdkPanel) {
return panel.getSdk();
}
else if (panel instanceof PyAddExistingCondaEnvPanel) {
final PyAddExistingCondaEnvPanel condaEnv = (PyAddExistingCondaEnvPanel)panel;
return new PyLazySdk("Uninitialized environment", condaEnv::getOrCreateSdk);
}
else {
return null;
}
@@ -289,12 +296,23 @@ public class ProjectSpecificSettingsStep<T> extends ProjectSettingsStepBase<T> i
final PyAddNewEnvironmentPanel newEnvironmentPanel = new PyAddNewEnvironmentPanel(existingSdks, newProjectPath, preferredEnvironment);
final PyAddExistingSdkPanel existingSdkPanel = new PyAddExistingSdkPanel(null, null, existingSdks, newProjectPath, preferredSdk);
final PyAddSdkPanel defaultPanel = PySdkSettings.getInstance().getUseNewEnvironmentForNewProject() ?
newEnvironmentPanel : existingSdkPanel;
PyAddSdkPanel defaultPanel = PySdkSettings.getInstance().getUseNewEnvironmentForNewProject() ?
newEnvironmentPanel : existingSdkPanel;
List<PyAddSdkPanel> panels;
if (PyCondaSdkCustomizer.Companion.getInstance().getPreferExistingEnvironments()) {
PyAddExistingCondaEnvPanel existingConda =
new PyAddExistingCondaEnvPanel(null, null, existingSdks, newProjectPath, new UserDataHolderBase(), this::checkValid);
panels = Arrays.asList(existingSdkPanel, existingConda, newEnvironmentPanel);
if (existingSdks.isEmpty()) {
defaultPanel = existingConda;
}
}
else {
panels = Arrays.asList(newEnvironmentPanel, existingSdkPanel);
}
myInterpretersDecorator = new HideableDecorator(decoratorPanel, getProjectInterpreterTitle(defaultPanel), false);
myInterpretersDecorator.setContentComponent(container);
final List<PyAddSdkPanel> panels = Arrays.asList(newEnvironmentPanel, existingSdkPanel);
myInterpreterPanel = new PyAddSdkGroupPanel(PyBundle.messagePointer("python.add.sdk.panel.name.new.project.interpreter"),
getIcon(), panels, defaultPanel);
myInterpreterPanel.addChangeListener(() -> {

View File

@@ -43,6 +43,7 @@ import com.intellij.webcore.packaging.PackagesNotificationPanel
import com.jetbrains.python.PyBundle
import com.jetbrains.python.packaging.ui.PyPackageManagementService
import com.jetbrains.python.psi.LanguageLevel
import com.jetbrains.python.sdk.conda.PyCondaSdkCustomizer
import com.jetbrains.python.sdk.flavors.CondaEnvSdkFlavor
import com.jetbrains.python.sdk.flavors.PythonSdkFlavor
import com.jetbrains.python.sdk.flavors.VirtualEnvSdkFlavor
@@ -100,7 +101,8 @@ fun detectVirtualEnvs(module: Module?, existingSdks: List<Sdk>, context: UserDat
filterSuggestedPaths(VirtualEnvSdkFlavor.getInstance().suggestHomePaths(module, context), existingSdks, module)
fun detectCondaEnvs(module: Module?, existingSdks: List<Sdk>, context: UserDataHolder): List<PyDetectedSdk> =
filterSuggestedPaths(CondaEnvSdkFlavor.getInstance().suggestHomePaths(module, context), existingSdks, module)
filterSuggestedPaths(CondaEnvSdkFlavor.getInstance().suggestHomePaths(module, context), existingSdks, module,
!PyCondaSdkCustomizer.instance.disableEnvsSorting)
fun findExistingAssociatedSdk(module: Module, existingSdks: List<Sdk>): Sdk? {
return existingSdks
@@ -319,16 +321,22 @@ fun Sdk.getOrCreateAdditionalData(): PythonSdkAdditionalData {
private fun filterSuggestedPaths(suggestedPaths: MutableCollection<String>,
existingSdks: List<Sdk>,
module: Module?): List<PyDetectedSdk> {
module: Module?,
sortByModule: Boolean = true): List<PyDetectedSdk> {
val existingPaths = existingSdks.map { it.homePath }.toSet()
return suggestedPaths
val paths = suggestedPaths
.asSequence()
.filterNot { it in existingPaths }
.distinct()
.map { PyDetectedSdk(it) }
.sortedWith(compareBy({ !it.isAssociatedWithModule(module) },
{ it.homePath }))
.toList()
return if (sortByModule) {
paths.sortedWith(compareBy({ !it.isAssociatedWithModule(module) },
{ it.homePath }))
}
else {
paths
}
}
val ACTIVE_PYTHON_SDK_TOPIC: Topic<ActiveSdkListener> = Topic("Active SDK changed", ActiveSdkListener::class.java)

View File

@@ -45,7 +45,8 @@ class PyAddExistingCondaEnvPanel(private val project: Project?,
private val module: Module?,
private val existingSdks: List<Sdk>,
override var newProjectPath: String?,
context: UserDataHolder) : PyAddSdkPanel() {
context: UserDataHolder,
onEnvsDetectionComplete: (() -> Boolean)? = null) : PyAddSdkPanel() {
override val panelName: String get() = PyBundle.message("python.add.sdk.panel.name.existing.environment")
override val icon: Icon = PythonIcons.Python.Anaconda
private val sdkComboBox = PySdkPathChoosingComboBox()
@@ -79,8 +80,8 @@ class PyAddExistingCondaEnvPanel(private val project: Project?,
.addComponent(makeSharedField)
.panel
add(formPanel, BorderLayout.NORTH)
addInterpretersAsync(sdkComboBox) {
detectCondaEnvs(module, existingSdks, context)
addInterpretersAsync(sdkComboBox, { detectCondaEnvs(module, existingSdks, context) }) {
onEnvsDetectionComplete?.invoke()
}
}

View File

@@ -21,6 +21,9 @@ interface PyCondaSdkCustomizer {
val suggestSharedCondaEnvironments: Boolean
get() = false
val disableEnvsSorting: Boolean
get() = false
companion object {
val EP_NAME: ExtensionPointName<PyCondaSdkCustomizer> = ExtensionPointName.create("Pythonid.condaSdkCustomizer")
val instance: PyCondaSdkCustomizer