Merge branch 'liana/python-version'

# Conflicts:
#	python/ide/src/com/jetbrains/python/newProject/actions/PythonGenerateProjectCallback.java
This commit is contained in:
Ekaterina Tuzova
2016-07-25 18:40:54 +03:00
16 changed files with 211 additions and 76 deletions
@@ -54,7 +54,7 @@
<add-to-group group-id="NewGroup" anchor="before" relative-to-action="NewFile"/>
</action>
<action id="ChangeCourseInfo" class="com.jetbrains.edu.coursecreator.actions.CCChangeCourseInfo"/>
<action id="ChangeCourseInfo" class="com.jetbrains.edu.coursecreator.PyCCChangeCourseInfo"/>
<group id="CCProjectViewGroup" popup="true" text="Course Creator">
<action id="AddTaskFile" class="com.jetbrains.edu.coursecreator.actions.CCAddAsTaskFile" text="Make Visible to Student"/>
@@ -44,7 +44,7 @@ public class CCUtils {
@Nullable
public static CCLanguageManager getStudyLanguageManager(@NotNull final Course course) {
Language language = Language.findLanguageByID(course.getLanguage());
Language language = Language.findLanguageByID(course.getLanguageID());
return language == null ? null : CCLanguageManager.INSTANCE.forLanguage(language);
}
@@ -19,7 +19,6 @@ import javax.swing.*;
import java.awt.*;
public class CCChangeCourseInfo extends DumbAwareAction {
private static final String ACTION_TEXT = "Change Course Information";
public CCChangeCourseInfo() {
@@ -61,15 +60,21 @@ public class CCChangeCourseInfo extends DumbAwareAction {
CCNewProjectPanel panel =
new CCNewProjectPanel(course.getName(), Course.getAuthorsString(course.getAuthors()), course.getDescription());
setupLanguageLevels(course, panel);
DialogBuilder builder = createChangeInfoDialog(project, panel);
if (builder.showAndGet()) {
course.setAuthors(panel.getAuthors());
course.setName(panel.getName());
course.setDescription(panel.getDescription());
setVersion(course, panel);
ProjectView.getInstance(project).refresh();
}
}
protected void setVersion(Course course, CCNewProjectPanel panel) {}
protected void setupLanguageLevels(Course course, CCNewProjectPanel panel) {}
private static DialogBuilder createChangeInfoDialog(Project project, @NotNull CCNewProjectPanel panel) {
DialogBuilder builder = new DialogBuilder(project);
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<form xmlns="http://www.intellij.com/uidesigner/form/" version="1" bind-to-class="com.jetbrains.edu.coursecreator.ui.CCNewProjectPanel">
<grid id="27dc6" binding="myPanel" layout-manager="GridLayoutManager" row-count="3" column-count="3" same-size-horizontally="false" same-size-vertically="false" hgap="-1" vgap="-1">
<grid id="27dc6" binding="myPanel" layout-manager="GridLayoutManager" row-count="4" column-count="2" same-size-horizontally="false" same-size-vertically="false" hgap="-1" vgap="-1">
<margin top="0" left="0" bottom="0" right="0"/>
<constraints>
<xy x="20" y="20" width="666" height="488"/>
@@ -15,18 +15,18 @@
</grid>
</constraints>
<properties>
<text value="Name:"/>
<text value="Title:"/>
</properties>
</component>
<component id="7e88" class="javax.swing.JTextField" binding="myName">
<constraints>
<grid row="0" column="1" row-span="1" col-span="2" vsize-policy="0" hsize-policy="3" anchor="8" fill="1" indent="0" use-parent-layout="false"/>
<grid row="0" column="1" row-span="1" col-span="1" vsize-policy="0" hsize-policy="3" anchor="8" fill="1" indent="0" use-parent-layout="false"/>
</constraints>
<properties/>
</component>
<component id="ec56c" class="javax.swing.JLabel">
<constraints>
<grid row="2" column="0" row-span="1" col-span="1" vsize-policy="0" hsize-policy="0" anchor="9" fill="0" indent="0" use-parent-layout="false">
<grid row="3" column="0" row-span="1" col-span="1" vsize-policy="0" hsize-policy="0" anchor="9" fill="0" indent="0" use-parent-layout="false">
<preferred-size width="80" height="-1"/>
</grid>
</constraints>
@@ -46,20 +46,34 @@
</component>
<component id="41fe6" class="javax.swing.JTextField" binding="myAuthorField">
<constraints>
<grid row="1" column="1" row-span="1" col-span="2" vsize-policy="0" hsize-policy="3" anchor="8" fill="1" indent="0" use-parent-layout="false"/>
<grid row="1" column="1" row-span="1" col-span="1" vsize-policy="0" hsize-policy="3" anchor="8" fill="1" indent="0" use-parent-layout="false"/>
</constraints>
<properties/>
</component>
<component id="389a7" class="javax.swing.JTextArea" binding="myDescription">
<constraints>
<grid row="2" column="1" row-span="1" col-span="2" vsize-policy="6" hsize-policy="1" anchor="0" fill="3" indent="0" use-parent-layout="false">
<preferred-size width="-1" height="50"/>
<grid row="3" column="1" row-span="1" col-span="1" vsize-policy="6" hsize-policy="1" anchor="0" fill="3" indent="0" use-parent-layout="false">
<preferred-size width="-1" height="150"/>
</grid>
</constraints>
<properties>
<lineWrap value="true"/>
</properties>
</component>
<component id="aa51f" class="javax.swing.JLabel" binding="myLanguageLevelLabel">
<constraints>
<grid row="2" column="0" row-span="1" col-span="1" vsize-policy="0" hsize-policy="0" anchor="8" fill="0" indent="0" use-parent-layout="false"/>
</constraints>
<properties>
<text value="Label"/>
</properties>
</component>
<component id="cfe00" class="com.intellij.openapi.ui.ComboBox" binding="myLanguageLevelCombobox">
<constraints>
<grid row="2" column="1" row-span="1" col-span="1" vsize-policy="0" hsize-policy="3" anchor="0" fill="1" indent="0" use-parent-layout="false"/>
</constraints>
<properties/>
</component>
</children>
</grid>
</form>
@@ -1,10 +1,12 @@
package com.jetbrains.edu.coursecreator.ui;
import com.intellij.facet.ui.FacetValidatorsManager;
import com.intellij.openapi.ui.ComboBox;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.ui.DocumentAdapter;
import com.intellij.ui.JBColor;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import javax.swing.*;
import javax.swing.event.DocumentEvent;
@@ -14,10 +16,14 @@ public class CCNewProjectPanel {
private JTextArea myDescription;
private JTextField myName;
private JTextField myAuthorField;
private JLabel myLanguageLevelLabel;
private ComboBox<String> myLanguageLevelCombobox;
private FacetValidatorsManager myValidationManager;
public CCNewProjectPanel() {
myLanguageLevelLabel.setVisible(false);
myLanguageLevelCombobox.setVisible(false);
final String userName = System.getProperty("user.name");
if (userName != null) {
myAuthorField.setText(userName);
@@ -81,4 +87,20 @@ public class CCNewProjectPanel {
public JTextField getNameField() {
return myName;
}
public JLabel getLanguageLevelLabel() {
return myLanguageLevelLabel;
}
public ComboBox<String> getLanguageLevelCombobox() {
return myLanguageLevelCombobox;
}
@Nullable
public String getLanguageVersion() {
if (!myLanguageLevelCombobox.isVisible() || myLanguageLevelCombobox.getItemCount() == 0) {
return null;
}
return (String)myLanguageLevelCombobox.getSelectedItem();
}
}
@@ -10,6 +10,7 @@ import com.jetbrains.edu.learning.core.EduUtils;
import com.jetbrains.edu.learning.stepic.StepicUser;
import org.jdom.Element;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.ArrayList;
import java.util.List;
@@ -122,9 +123,14 @@ public class Course {
}
public Language getLanguageById() {
return Language.findLanguageByID(myLanguage);
return Language.findLanguageByID(getLanguageID());
}
/**
* This method should be used by serialized only
* Use {@link #getLanguageID()} and {@link #getLanguageVersion()} methods instead
*/
@Deprecated
public String getLanguage() {
return myLanguage;
}
@@ -133,6 +139,19 @@ public class Course {
myLanguage = language;
}
public String getLanguageID() {
return myLanguage.split(" ")[0];
}
@Nullable
public String getLanguageVersion() {
String[] split = myLanguage.split(" ");
if (split.length <= 1) {
return null;
}
return split[1];
}
public void setAuthors(List<StepicUser> authors) {
this.authors = authors;
}
@@ -104,7 +104,7 @@ public class StudyProjectGenerator {
}
@Nullable
protected Course getCourse(@NotNull final Project project) {
public Course getCourse(@NotNull final Project project) {
final File courseFile = new File(new File(OUR_COURSES_DIR, mySelectedCourseInfo.getName()), EduNames.COURSE_META_FILE);
if (courseFile.exists()) {
@@ -157,7 +157,9 @@ public class StudyProjectGenerator {
public static void openFirstTask(@NotNull final Course course, @NotNull final Project project) {
LocalFileSystem.getInstance().refresh(false);
final Lesson firstLesson = StudyUtils.getFirst(course.getLessons());
if (firstLesson == null) return;
final Task firstTask = StudyUtils.getFirst(firstLesson.getTaskList());
if (firstTask == null) return;
final VirtualFile taskDir = firstTask.getTaskDir(project);
if (taskDir == null) return;
final Map<String, TaskFile> taskFiles = firstTask.getTaskFiles();
@@ -104,7 +104,7 @@ public class StudyNewProjectPanel extends JPanel implements PanelWithAnchor {
myDescriptionPane.setEditable(true);
myDescriptionPane.setEnabled(true);
myAuthorLabel.setEnabled(true);
myDescriptionPane.setPreferredSize(new Dimension(150, 100));
myDescriptionPane.setPreferredSize(new Dimension(150, 150));
myDescriptionPane.setFont(coursesCombo.getFont());
myInfoPanel.add(myAuthorLabel);
myInfoPanel.add(myDescriptionPane);
@@ -0,0 +1,47 @@
package com.jetbrains.edu.coursecreator;
import com.intellij.openapi.ui.ComboBox;
import com.jetbrains.edu.coursecreator.actions.CCChangeCourseInfo;
import com.jetbrains.edu.coursecreator.ui.CCNewProjectPanel;
import com.jetbrains.edu.learning.courseFormat.Course;
import com.jetbrains.python.PythonLanguage;
import javax.swing.*;
import static com.jetbrains.edu.learning.PyStudyLanguageManager.PYTHON_2;
import static com.jetbrains.edu.learning.PyStudyLanguageManager.PYTHON_3;
public class PyCCChangeCourseInfo extends CCChangeCourseInfo {
public static final String ALL_VERSIONS = "All versions";
public PyCCChangeCourseInfo() {
super();
}
protected void setVersion(Course course, CCNewProjectPanel panel) {
String version = panel.getLanguageVersion();
String language = PythonLanguage.getInstance().getID();
if (version != null && !ALL_VERSIONS.equals(version)) {
language += " " + version;
}
course.setLanguage(language);
}
protected void setupLanguageLevels(Course course, CCNewProjectPanel panel) {
JLabel languageLevelLabel = panel.getLanguageLevelLabel();
languageLevelLabel.setText("Python:");
languageLevelLabel.setVisible(true);
ComboBox<String> languageLevelCombobox = panel.getLanguageLevelCombobox();
languageLevelCombobox.addItem(ALL_VERSIONS);
languageLevelCombobox.addItem(PYTHON_3);
languageLevelCombobox.addItem(PYTHON_2);
languageLevelCombobox.setVisible(true);
final String version = course.getLanguageVersion();
if (version != null) {
languageLevelCombobox.setSelectedItem(version);
}
else {
languageLevelCombobox.setSelectedItem(ALL_VERSIONS);
}
}
}
@@ -56,14 +56,11 @@ public class PyCCProjectGenerator extends PythonProjectGenerator implements Dire
@Override
public void generateProject(@NotNull final Project project, @NotNull final VirtualFile baseDir,
@Nullable Object settings, @NotNull Module module) {
generateProject(project, baseDir, mySettingsPanel.getName(),
mySettingsPanel.getAuthors(), mySettingsPanel.getDescription());
generateProject(project, baseDir, mySettingsPanel);
}
public static void generateProject(@NotNull final Project project, @NotNull final VirtualFile baseDir,
@NotNull final String name, @NotNull final String[] authors,
@NotNull final String description) {
final Course course = getCourse(project, name, authors, description);
public static void generateProject(@NotNull final Project project, @NotNull final VirtualFile baseDir, CCNewProjectPanel settingsPanel) {
final Course course = getCourse(project, settingsPanel);
EduUsagesCollector.projectTypeCreated(CCUtils.COURSE_MODE);
final PsiDirectory projectDir = PsiManager.getInstance(project).findDirectory(baseDir);
@@ -94,12 +91,15 @@ public class PyCCProjectGenerator extends PythonProjectGenerator implements Dire
}
@NotNull
private static Course getCourse(@NotNull Project project, @NotNull String name, @NotNull String[] authors, @NotNull String description) {
private static Course getCourse(@NotNull Project project, @NotNull CCNewProjectPanel settingsPanel) {
final Course course = new Course();
String name = settingsPanel.getName();
course.setName(name);
course.setAuthors(authors);
course.setDescription(description);
course.setLanguage(PythonLanguage.getInstance().getID());
course.setAuthors(settingsPanel.getAuthors());
course.setDescription(settingsPanel.getDescription());
String language = PythonLanguage.getInstance().getID();
course.setLanguage(language);
course.setCourseMode(CCUtils.COURSE_MODE);
File coursesDir = new File(PathManager.getConfigPath(), "courses");
@@ -136,4 +136,5 @@ public class PyCCProjectGenerator extends PythonProjectGenerator implements Dire
});
return mySettingsPanel.getMainPanel();
}
}
@@ -1,5 +1,6 @@
package com.jetbrains.edu.learning;
import com.intellij.execution.ExecutionException;
import com.intellij.facet.ui.FacetEditorValidator;
import com.intellij.facet.ui.FacetValidatorsManager;
import com.intellij.facet.ui.ValidationResult;
@@ -9,22 +10,31 @@ import com.intellij.ide.fileTemplates.FileTemplateUtil;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.module.Module;
import com.intellij.openapi.options.ConfigurationException;
import com.intellij.openapi.progress.ProcessCanceledException;
import com.intellij.openapi.progress.ProgressManager;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.project.ProjectManager;
import com.intellij.openapi.projectRoots.Sdk;
import com.intellij.openapi.roots.ui.configuration.projectRoot.ProjectSdksModel;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.platform.DirectoryProjectGenerator;
import com.intellij.psi.PsiDirectory;
import com.intellij.psi.PsiManager;
import com.intellij.util.BooleanFunction;
import com.jetbrains.edu.learning.courseFormat.Course;
import com.jetbrains.edu.learning.courseGeneration.StudyProjectGenerator;
import com.jetbrains.edu.learning.stepic.CourseInfo;
import com.jetbrains.edu.learning.stepic.EduStepicConnector;
import com.jetbrains.edu.learning.ui.StudyNewProjectPanel;
import com.jetbrains.python.configuration.PyConfigurableInterpreterList;
import com.jetbrains.python.newProject.PyNewProjectSettings;
import com.jetbrains.python.newProject.PythonProjectGenerator;
import com.jetbrains.python.packaging.PyPackageManager;
import com.jetbrains.python.psi.LanguageLevel;
import com.jetbrains.python.sdk.AbstractCreateVirtualEnvDialog;
import com.jetbrains.python.sdk.PyDetectedSdk;
import com.jetbrains.python.sdk.flavors.PythonSdkFlavor;
import icons.InteractiveLearningPythonIcons;
import org.jetbrains.annotations.Nls;
import org.jetbrains.annotations.NotNull;
@@ -34,6 +44,7 @@ import javax.swing.*;
import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.Collection;
import java.util.List;
@@ -176,4 +187,58 @@ public class PyStudyDirectoryProjectGenerator extends PythonProjectGenerator imp
return true;
};
}
public void createAndAddVirtualEnv(Project project, PyNewProjectSettings settings) {
final ProjectSdksModel model = PyConfigurableInterpreterList.getInstance(project).getModel();
final String baseSdk = getBaseSdk(project);
if (baseSdk != null) {
final PyPackageManager packageManager = PyPackageManager.getInstance(new PyDetectedSdk(baseSdk));
try {
final String path = packageManager.createVirtualEnv(project.getBasePath() + "/.idea/VirtualEnvironment", false);
AbstractCreateVirtualEnvDialog.setupVirtualEnvSdk(path, true, new AbstractCreateVirtualEnvDialog.VirtualEnvCallback() {
@Override
public void virtualEnvCreated(Sdk createdSdk, boolean associateWithProject) {
settings.setSdk(createdSdk);
model.addSdk(createdSdk);
try {
model.apply();
}
catch (ConfigurationException exception) {
LOG.error("Error adding created virtual env " + exception.getMessage());
}
}
});
}
catch (ExecutionException e) {
LOG.warn("Failed to create virtual env " + e.getMessage());
}
}
}
private String getBaseSdk(@NotNull final Project project) {
final Course course = myGenerator.getCourse(project);
LanguageLevel baseLevel = LanguageLevel.PYTHON30;
if (course != null) {
final String version = course.getLanguageVersion();
if (PyStudyLanguageManager.PYTHON_2.equals(version)) {
baseLevel = LanguageLevel.PYTHON27;
}
}
final PythonSdkFlavor flavor = PythonSdkFlavor.getApplicableFlavors(false).get(0);
String baseSdk = null;
final Collection<String> baseSdks = flavor.suggestHomePaths();
for (String sdk : baseSdks) {
final String versionString = flavor.getVersionString(sdk);
final String prefix = flavor.getName() + " ";
if (versionString != null && versionString.startsWith(prefix)) {
final LanguageLevel level = LanguageLevel.fromPythonVersion(versionString.substring(prefix.length()));
if (level.isAtLeast(baseLevel)) {
baseSdk = sdk;
break;
}
}
}
return baseSdk != null ? baseSdk : baseSdks.iterator().next();
}
}
@@ -4,6 +4,8 @@ import com.jetbrains.edu.learning.core.EduNames;
import org.jetbrains.annotations.NotNull;
public class PyStudyLanguageManager implements StudyLanguageManager {
public static final String PYTHON_3 = "3.x";
public static final String PYTHON_2 = "2.x";
@NotNull
@Override
@@ -34,6 +34,6 @@ public class PyStudyPluginConfigurator extends StudyBasePluginConfigurator {
StudyTaskManager taskManager = StudyTaskManager.getInstance(project);
if (taskManager == null) return false;
Course course = taskManager.getCourse();
return course != null && "Python".equals(course.getLanguage()) && "PyCharm".equals(course.getCourseType());
return course != null && "Python".equals(course.getLanguageID()) && "PyCharm".equals(course.getCourseType());
}
}
@@ -15,7 +15,6 @@
*/
package com.jetbrains.python.newProject.actions;
import com.intellij.execution.ExecutionException;
import com.intellij.ide.util.projectWizard.AbstractNewProjectStep;
import com.intellij.ide.util.projectWizard.ProjectSettingsStepBase;
import com.intellij.ide.util.projectWizard.WebProjectTemplate;
@@ -28,7 +27,6 @@ import com.intellij.openapi.project.Project;
import com.intellij.openapi.project.ProjectManager;
import com.intellij.openapi.projectRoots.Sdk;
import com.intellij.openapi.projectRoots.SdkAdditionalData;
import com.intellij.openapi.projectRoots.impl.ProjectJdkImpl;
import com.intellij.openapi.projectRoots.impl.SdkConfigurationUtil;
import com.intellij.openapi.roots.ui.configuration.projectRoot.ProjectSdksModel;
import com.intellij.openapi.ui.Messages;
@@ -46,11 +44,9 @@ import com.jetbrains.python.packaging.PyPackageManager;
import com.jetbrains.python.packaging.PyPackageManagerUI;
import com.jetbrains.python.packaging.PyRequirement;
import com.jetbrains.python.sdk.*;
import com.jetbrains.python.sdk.flavors.PythonSdkFlavor;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
@@ -79,10 +75,11 @@ public class PythonGenerateProjectCallback implements NullableConsumer<ProjectSe
}
}
final Project newProject = generateProject(settingsStep);
if (sdk == null) {
createAndAddVirtualEnv(settingsStep);
if (generator instanceof PythonProjectGenerator && sdk == null) {
final PyNewProjectSettings settings = (PyNewProjectSettings)((PythonProjectGenerator)generator).getProjectSettings();
((PythonProjectGenerator)generator).createAndAddVirtualEnv(newProject, settings);
sdk = settings.getSdk();
}
sdk = settingsStep.getSdk();
if (newProject != null && generator instanceof PythonProjectGenerator) {
SdkConfigurationUtil.setDirectoryProjectSdk(newProject, sdk);
@@ -102,9 +99,10 @@ public class PythonGenerateProjectCallback implements NullableConsumer<ProjectSe
private static void installRequirements(@NotNull Project project) {
final Module module = ModuleManager.getInstance(project).getModules()[0];
final Sdk sdk = PythonSdkType.findPythonSdk(module);
if (sdk == null) return;
final PyPackageManager manager = PyPackageManager.getInstance(sdk);
List<PyRequirement> requirements = manager.getRequirements(module);
if (requirements != null && sdk != null) {
if (requirements != null) {
final PyPackageManagerUI ui = new PyPackageManagerUI(project, sdk, null);
ui.install(requirements, Collections.emptyList());
}
@@ -137,49 +135,6 @@ public class PythonGenerateProjectCallback implements NullableConsumer<ProjectSe
}
}
private static void createAndAddVirtualEnv(final ProjectSpecificSettingsStep settingsStep) {
final Project project = ProjectManager.getInstance().getDefaultProject();
final ProjectSdksModel model = PyConfigurableInterpreterList.getInstance(project).getModel();
final List<PythonSdkFlavor> flavors = PythonSdkFlavor.getApplicableFlavors(false);
String baseSdk = null;
for (PythonSdkFlavor flavor : flavors) {
final Collection<String> baseSdks = flavor.suggestHomePaths();
if (!baseSdks.isEmpty()) {
baseSdk = baseSdks.iterator().next();
}
}
if (baseSdk != null) {
final PyPackageManager packageManager = PyPackageManager.getInstance(new PyDetectedSdk(baseSdk));
try {
final String path = packageManager.createVirtualEnv(settingsStep.getProjectLocation() + "/.idea/VirtualEnvironment", false);
AbstractCreateVirtualEnvDialog.setupVirtualEnvSdk(path, true, new AbstractCreateVirtualEnvDialog.VirtualEnvCallback() {
@Override
public void virtualEnvCreated(Sdk createdSdk, boolean associateWithProject) {
settingsStep.setSdk(createdSdk);
model.addSdk(createdSdk);
try {
model.apply();
}
catch (ConfigurationException exception) {
LOG.error("Error adding created virtual env " + exception.getMessage());
}
if (associateWithProject) {
SdkAdditionalData additionalData = createdSdk.getSdkAdditionalData();
if (additionalData == null) {
additionalData = new PythonSdkAdditionalData(PythonSdkFlavor.getFlavor(createdSdk.getHomePath()));
((ProjectJdkImpl)createdSdk).setSdkAdditionalData(additionalData);
}
((PythonSdkAdditionalData)additionalData).associateWithNewProject();
}
}
});
}
catch (ExecutionException e) {
LOG.warn("Failed to create virtual env " + e.getMessage());
}
}
}
@Nullable
private static Project generateProject(@NotNull final ProjectSettingsStepBase settings) {
final DirectoryProjectGenerator generator = settings.getProjectGenerator();
@@ -17,6 +17,7 @@ package com.jetbrains.python.newProject;
import com.intellij.facet.ui.ValidationResult;
import com.intellij.openapi.progress.ProcessCanceledException;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.projectRoots.Sdk;
import com.intellij.util.BooleanFunction;
import com.intellij.util.containers.ContainerUtil;
@@ -83,4 +84,6 @@ public abstract class PythonProjectGenerator {
public MouseListener getErrorLabelMouseListener() {
return myErrorLabelMouseListener;
}
public void createAndAddVirtualEnv(Project project, PyNewProjectSettings settings) {}
}
@@ -424,7 +424,7 @@ public final class PythonSdkType extends SdkType {
return suggestSdkNameFromVersion(sdkHome, name);
}
public static String suggestSdkNameFromVersion(String sdkHome, String version) {
private static String suggestSdkNameFromVersion(String sdkHome, String version) {
sdkHome = FileUtil.toSystemDependentName(sdkHome);
final String shortHomeName = FileUtil.getLocationRelativeToUserHome(sdkHome);
if (version != null) {