diff --git a/python/educational-core/resources/META-INF/plugin.xml b/python/educational-core/resources/META-INF/plugin.xml index dcbc35a025d4..aebea6fd6a7c 100644 --- a/python/educational-core/resources/META-INF/plugin.xml +++ b/python/educational-core/resources/META-INF/plugin.xml @@ -41,9 +41,6 @@ - - - @@ -77,8 +74,6 @@ description="Watch test input "/> - diff --git a/python/educational-core/src/com/jetbrains/edu/learning/EduPluginConfigurator.java b/python/educational-core/src/com/jetbrains/edu/learning/EduPluginConfigurator.java index aaa21bbf5ead..c41739bef591 100644 --- a/python/educational-core/src/com/jetbrains/edu/learning/EduPluginConfigurator.java +++ b/python/educational-core/src/com/jetbrains/edu/learning/EduPluginConfigurator.java @@ -105,7 +105,6 @@ public interface EduPluginConfigurator { } group.add(action); } - group.add(new StudyRunAction()); group.add(new StudyEditInputAction()); return group; } diff --git a/python/educational-core/src/com/jetbrains/edu/learning/StudyUtils.java b/python/educational-core/src/com/jetbrains/edu/learning/StudyUtils.java index 8909c6936fd7..c12b44757ee6 100644 --- a/python/educational-core/src/com/jetbrains/edu/learning/StudyUtils.java +++ b/python/educational-core/src/com/jetbrains/edu/learning/StudyUtils.java @@ -1,15 +1,11 @@ package com.jetbrains.edu.learning; -import com.intellij.execution.RunContentExecutor; -import com.intellij.execution.configurations.GeneralCommandLine; -import com.intellij.execution.process.ProcessHandler; import com.intellij.ide.IdeView; import com.intellij.ide.fileTemplates.FileTemplate; import com.intellij.ide.fileTemplates.FileTemplateManager; import com.intellij.ide.fileTemplates.FileTemplateUtil; import com.intellij.ide.projectView.ProjectView; import com.intellij.ide.util.EditorHelper; -import com.intellij.lang.Language; import com.intellij.openapi.actionSystem.AnActionEvent; import com.intellij.openapi.actionSystem.CommonDataKeys; import com.intellij.openapi.actionSystem.DataContext; @@ -31,7 +27,6 @@ import com.intellij.openapi.fileEditor.ex.FileEditorManagerEx; import com.intellij.openapi.fileEditor.impl.LoadTextUtil; import com.intellij.openapi.progress.ProgressManager; import com.intellij.openapi.project.Project; -import com.intellij.openapi.projectRoots.Sdk; import com.intellij.openapi.ui.MessageType; import com.intellij.openapi.ui.popup.Balloon; import com.intellij.openapi.ui.popup.JBPopupFactory; @@ -61,8 +56,6 @@ import com.intellij.util.TimeoutUtil; import com.intellij.util.containers.ContainerUtil; import com.intellij.util.text.MarkdownUtil; import com.intellij.util.ui.UIUtil; -import com.jetbrains.edu.learning.checker.StudyExecutor; -import com.jetbrains.edu.learning.checker.StudyTestRunner; import com.jetbrains.edu.learning.core.EduAnswerPlaceholderDeleteHandler; import com.jetbrains.edu.learning.core.EduAnswerPlaceholderPainter; import com.jetbrains.edu.learning.core.EduNames; @@ -237,42 +230,6 @@ public class StudyUtils { } } - @Nullable - public static Sdk findSdk(@NotNull final Task task, @NotNull final Project project) { - final Language language = task.getLesson().getCourse().getLanguageById(); - return StudyExecutor.INSTANCE.forLanguage(language).findSdk(project); - } - - @NotNull - public static StudyTestRunner getTestRunner(@NotNull final Task task, @NotNull final VirtualFile taskDir) { - final Language language = task.getLesson().getCourse().getLanguageById(); - return StudyExecutor.INSTANCE.forLanguage(language).getTestRunner(task, taskDir); - } - - public static RunContentExecutor getExecutor(@NotNull final Project project, @NotNull final Task currentTask, - @NotNull final ProcessHandler handler) { - final Language language = currentTask.getLesson().getCourse().getLanguageById(); - return StudyExecutor.INSTANCE.forLanguage(language).getExecutor(project, handler); - } - - public static void setCommandLineParameters(@NotNull final GeneralCommandLine cmd, - @NotNull final Project project, - @NotNull final String filePath, - @NotNull final String sdkPath, - @NotNull final Task currentTask) { - final Language language = currentTask.getLesson().getCourse().getLanguageById(); - StudyExecutor.INSTANCE.forLanguage(language).setCommandLineParameters(cmd, project, filePath, sdkPath, currentTask); - } - - public static void showNoSdkNotification(@NotNull final Task currentTask, @NotNull final Project project) { - final Lesson lesson = currentTask.getLesson(); - if (lesson == null) return; - final Course course = lesson.getCourse(); - if (course == null) return; - final Language language = course.getLanguageById(); - StudyExecutor.INSTANCE.forLanguage(language).showNoSdkNotification(project); - } - /** * shows pop up in the center of "check task" button in study editor diff --git a/python/educational-core/src/com/jetbrains/edu/learning/actions/StudyRunAction.java b/python/educational-core/src/com/jetbrains/edu/learning/actions/StudyRunAction.java deleted file mode 100644 index a565dadd4528..000000000000 --- a/python/educational-core/src/com/jetbrains/edu/learning/actions/StudyRunAction.java +++ /dev/null @@ -1,123 +0,0 @@ -package com.jetbrains.edu.learning.actions; - -import com.intellij.execution.ExecutionException; -import com.intellij.execution.RunContentExecutor; -import com.intellij.execution.configurations.GeneralCommandLine; -import com.intellij.execution.process.OSProcessHandler; -import com.intellij.execution.process.ProcessHandler; -import com.intellij.execution.process.ProcessListener; -import com.intellij.icons.AllIcons; -import com.intellij.openapi.actionSystem.AnActionEvent; -import com.intellij.openapi.diagnostic.Logger; -import com.intellij.openapi.editor.Editor; -import com.intellij.openapi.fileEditor.FileDocumentManager; -import com.intellij.openapi.project.DumbAwareAction; -import com.intellij.openapi.project.Project; -import com.intellij.openapi.projectRoots.Sdk; -import com.intellij.openapi.util.Disposer; -import com.intellij.openapi.vfs.VirtualFile; -import com.jetbrains.edu.learning.core.EduUtils; -import com.jetbrains.edu.learning.courseFormat.tasks.Task; -import com.jetbrains.edu.learning.courseFormat.TaskFile; -import com.jetbrains.edu.learning.StudyTaskManager; -import com.jetbrains.edu.learning.StudyUtils; -import com.jetbrains.edu.learning.courseFormat.UserTest; -import com.jetbrains.edu.learning.editor.StudyEditor; -import org.jetbrains.annotations.NotNull; - -import java.util.LinkedList; -import java.util.List; - -public class StudyRunAction extends DumbAwareAction { - private static final Logger LOG = Logger.getInstance(StudyRunAction.class.getName()); - public static final String ACTION_ID = "StudyRunAction"; - private ProcessHandler myHandler; - private List myProcessListeners = new LinkedList<>(); - - public StudyRunAction() { - super("Run File With Tests", "Run your code with tests", AllIcons.General.Run); - } - - public void run(@NotNull final Project project) { - if (myHandler != null && !myHandler.isProcessTerminated()) return; - Editor selectedEditor = StudyUtils.getSelectedEditor(project); - FileDocumentManager fileDocumentManager = FileDocumentManager.getInstance(); - assert selectedEditor != null; - VirtualFile openedFile = fileDocumentManager.getFile(selectedEditor.getDocument()); - - if (openedFile != null && openedFile.getCanonicalPath() != null) { - String filePath = openedFile.getCanonicalPath(); - executeFile(project, openedFile, filePath); - } - } - - private void executeFile(@NotNull final Project project, - @NotNull final VirtualFile openedFile, @NotNull final String filePath) { - GeneralCommandLine cmd = new GeneralCommandLine(); - cmd.withWorkDirectory(openedFile.getParent().getCanonicalPath()); - - TaskFile selectedTaskFile = StudyUtils.getTaskFile(project, openedFile); - assert selectedTaskFile != null; - final Task currentTask = selectedTaskFile.getTask(); - final Sdk sdk = StudyUtils.findSdk(currentTask, project); - if (sdk == null) { - StudyUtils.showNoSdkNotification(currentTask, project); - return; - } - String sdkHomePath = sdk.getHomePath(); - if (sdkHomePath != null) { - cmd.setExePath(sdkHomePath); - StudyUtils.setCommandLineParameters(cmd, project, filePath, sdkHomePath, currentTask); - - try { - myHandler = new OSProcessHandler(cmd); - } - catch (ExecutionException e) { - LOG.error(e); - return; - } - - for (ProcessListener processListener : myProcessListeners) { - myHandler.addProcessListener(processListener); - } - - final RunContentExecutor executor = StudyUtils.getExecutor(project, currentTask, myHandler); - if (executor != null) { - Disposer.register(project, executor); - executor.run(); - } - EduUtils.synchronize(); - } - } - - public void addProcessListener(@NotNull final ProcessListener processListener) { - myProcessListeners.add(processListener); - } - - public void removeProcessListener(@NotNull final ProcessListener processListener) { - myProcessListeners.remove(processListener); - } - - public void actionPerformed(@NotNull AnActionEvent e) { - final Project project = e.getProject(); - if (project != null) { - run(project); - } - } - - @Override - public void update(AnActionEvent e) { - EduUtils.enableAction(e, false); - - final Project project = e.getProject(); - if (project != null) { - StudyEditor studyEditor = StudyUtils.getSelectedStudyEditor(project); - if (studyEditor != null) { - final List userTests = StudyTaskManager.getInstance(project).getUserTests(studyEditor.getTaskFile().getTask()); - if (!userTests.isEmpty()) { - EduUtils.enableAction(e, true); - } - } - } - } -} diff --git a/python/educational-core/src/com/jetbrains/edu/learning/checker/StudyExecutor.java b/python/educational-core/src/com/jetbrains/edu/learning/checker/StudyExecutor.java deleted file mode 100644 index 8e27c2bedd79..000000000000 --- a/python/educational-core/src/com/jetbrains/edu/learning/checker/StudyExecutor.java +++ /dev/null @@ -1,46 +0,0 @@ -/* - * Copyright 2000-2014 JetBrains s.r.o. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.jetbrains.edu.learning.checker; - -import com.intellij.execution.RunContentExecutor; -import com.intellij.execution.configurations.GeneralCommandLine; -import com.intellij.execution.process.ProcessHandler; -import com.intellij.lang.LanguageExtension; -import com.intellij.openapi.project.Project; -import com.intellij.openapi.projectRoots.Sdk; -import com.intellij.openapi.vfs.VirtualFile; -import com.jetbrains.edu.learning.courseFormat.tasks.Task; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -public interface StudyExecutor { - LanguageExtension INSTANCE = new LanguageExtension<>("Edu.StudyExecutor"); - - @Nullable - Sdk findSdk(@NotNull final Project project); - - StudyTestRunner getTestRunner(@NotNull final Task task, @NotNull final VirtualFile taskDir); - - RunContentExecutor getExecutor(@NotNull final Project project, @NotNull final ProcessHandler handler); - - void setCommandLineParameters(@NotNull final GeneralCommandLine cmd, - @NotNull final Project project, - @NotNull final String filePath, - @NotNull final String sdkPath, - @NotNull final Task currentTask); - - void showNoSdkNotification(@NotNull final Project project); -} diff --git a/python/educational-core/src/com/jetbrains/edu/learning/stepic/EduAdaptiveStepicConnector.java b/python/educational-core/src/com/jetbrains/edu/learning/stepic/EduAdaptiveStepicConnector.java index accecb8ad225..0978c1a4be05 100644 --- a/python/educational-core/src/com/jetbrains/edu/learning/stepic/EduAdaptiveStepicConnector.java +++ b/python/educational-core/src/com/jetbrains/edu/learning/stepic/EduAdaptiveStepicConnector.java @@ -8,9 +8,11 @@ import com.intellij.lang.Language; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.editor.Editor; +import com.intellij.openapi.module.ModuleManager; import com.intellij.openapi.progress.ProgressIndicator; import com.intellij.openapi.project.Project; import com.intellij.openapi.projectRoots.Sdk; +import com.intellij.openapi.roots.ModuleRootManager; import com.intellij.openapi.util.Pair; import com.intellij.openapi.util.text.StringUtil; import com.intellij.openapi.vfs.VirtualFile; @@ -18,7 +20,6 @@ import com.intellij.openapi.vfs.VirtualFileManager; import com.jetbrains.edu.learning.StudySettings; import com.jetbrains.edu.learning.StudyTaskManager; import com.jetbrains.edu.learning.StudyUtils; -import com.jetbrains.edu.learning.checker.StudyExecutor; import com.jetbrains.edu.learning.core.EduNames; import com.jetbrains.edu.learning.courseFormat.*; import com.jetbrains.edu.learning.courseFormat.tasks.ChoiceTask; @@ -624,9 +625,9 @@ public class EduAdaptiveStepicConnector { private static String getLanguageString(@NotNull Task task, @NotNull Project project) { final Language pythonLanguage = Language.findLanguageByID("Python"); if (pythonLanguage != null) { - final Sdk language = StudyExecutor.INSTANCE.forLanguage(pythonLanguage).findSdk(project); - if (language != null) { - final String versionString = language.getVersionString(); + Sdk sdk = ModuleRootManager.getInstance(ModuleManager.getInstance(project).getModules()[0]).getSdk(); + if (sdk != null) { + final String versionString = sdk.getVersionString(); if (versionString != null) { final List versionStringParts = StringUtil.split(versionString, " "); if (versionStringParts.size() == 2) { @@ -634,9 +635,6 @@ public class EduAdaptiveStepicConnector { } } } - else { - StudyUtils.showNoSdkNotification(task, project); - } } return null; } diff --git a/python/educational-python/Edu-Python/resources/META-INF/plugin.xml b/python/educational-python/Edu-Python/resources/META-INF/plugin.xml index 35419980703f..1d4b1055bfba 100644 --- a/python/educational-python/Edu-Python/resources/META-INF/plugin.xml +++ b/python/educational-python/Edu-Python/resources/META-INF/plugin.xml @@ -35,7 +35,6 @@ - diff --git a/python/educational-python/Edu-Python/src/com/jetbrains/edu/learning/PyStudyCheckAction.java b/python/educational-python/Edu-Python/src/com/jetbrains/edu/learning/PyStudyCheckAction.java index 264596c26b46..f1d4c8a21eb2 100644 --- a/python/educational-python/Edu-Python/src/com/jetbrains/edu/learning/PyStudyCheckAction.java +++ b/python/educational-python/Edu-Python/src/com/jetbrains/edu/learning/PyStudyCheckAction.java @@ -52,7 +52,7 @@ public class PyStudyCheckAction extends StudyCheckAction { ApplicationManager.getApplication().invokeLater( () -> IdeFocusManager.getInstance(project).requestFocus(studyState.getEditor().getComponent(), true)); - final StudyTestRunner testRunner = StudyUtils.getTestRunner(task, taskDir); + final StudyTestRunner testRunner = new PyStudyTestRunner(task, taskDir); Process testProcess = null; String commandLine = ""; try { diff --git a/python/educational-python/Edu-Python/src/com/jetbrains/edu/learning/PyStudyExecutor.java b/python/educational-python/Edu-Python/src/com/jetbrains/edu/learning/PyStudyExecutor.java deleted file mode 100644 index 0bd87804ab94..000000000000 --- a/python/educational-python/Edu-Python/src/com/jetbrains/edu/learning/PyStudyExecutor.java +++ /dev/null @@ -1,96 +0,0 @@ -/* - * Copyright 2000-2014 JetBrains s.r.o. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.jetbrains.edu.learning; - -import com.intellij.execution.RunContentExecutor; -import com.intellij.execution.configurations.GeneralCommandLine; -import com.intellij.execution.process.ProcessHandler; -import com.intellij.openapi.application.ApplicationManager; -import com.intellij.openapi.module.ModuleManager; -import com.intellij.openapi.options.ShowSettingsUtil; -import com.intellij.openapi.project.Project; -import com.intellij.openapi.projectRoots.Sdk; -import com.intellij.openapi.ui.MessageType; -import com.intellij.openapi.ui.popup.Balloon; -import com.intellij.openapi.ui.popup.BalloonBuilder; -import com.intellij.openapi.ui.popup.JBPopupFactory; -import com.intellij.openapi.vfs.VirtualFile; -import com.jetbrains.edu.learning.courseFormat.tasks.Task; -import com.jetbrains.edu.learning.checker.StudyExecutor; -import com.jetbrains.edu.learning.checker.StudyTestRunner; -import com.jetbrains.edu.learning.courseFormat.UserTest; -import com.jetbrains.python.run.PythonTracebackFilter; -import com.jetbrains.python.sdk.PythonSdkType; -import org.jetbrains.annotations.NotNull; - -import javax.swing.event.HyperlinkEvent; -import java.io.File; -import java.util.List; - -public class PyStudyExecutor implements StudyExecutor { - - @Override - public Sdk findSdk(@NotNull final Project project) { - return PythonSdkType.findPythonSdk(ModuleManager.getInstance(project).getModules()[0]); - } - - @Override - public StudyTestRunner getTestRunner(@NotNull final Task task, @NotNull final VirtualFile taskDir) { - return new PyStudyTestRunner(task, taskDir); - } - - @Override - public RunContentExecutor getExecutor(@NotNull final Project project, @NotNull final ProcessHandler handler) { - return new RunContentExecutor(project, handler).withFilter(new PythonTracebackFilter(project)); - } - - @Override - public void setCommandLineParameters(@NotNull final GeneralCommandLine cmd, - @NotNull final Project project, - @NotNull final String filePath, - @NotNull final String sdkPath, - @NotNull final Task currentTask) { - final List userTests = StudyTaskManager.getInstance(project).getUserTests(currentTask); - if (!userTests.isEmpty()) { - EduPluginConfigurator configurator = EduPluginConfigurator.INSTANCE.forLanguage(currentTask.getLesson().getCourse().getLanguageById()); - if (configurator != null) { - cmd.addParameter(new File(project.getBaseDir().getPath(), "user_tester.py").getPath()); - cmd.addParameter(sdkPath); - cmd.addParameter(filePath); - } - } - else { - cmd.addParameter(filePath); - } - } - - public void showNoSdkNotification(@NotNull final Project project) { - final String text = "No Python interpreter configured for the project
Configure interpreter"; - final BalloonBuilder balloonBuilder = JBPopupFactory.getInstance(). - createHtmlTextBalloonBuilder(text, null, - MessageType.WARNING.getPopupBackground(), - event -> { - if (event.getEventType() == HyperlinkEvent.EventType.ACTIVATED) { - ApplicationManager.getApplication() - .invokeLater( - () -> ShowSettingsUtil.getInstance().showSettingsDialog(project, "Project Interpreter")); - } - }); - balloonBuilder.setHideOnLinkClick(true); - final Balloon balloon = balloonBuilder.createBalloon(); - StudyUtils.showCheckPopUp(project, balloon); - } -}