diff --git a/python/edu/learn-python/gen/icons/StudyIcons.java b/python/edu/learn-python/gen/icons/StudyIcons.java
deleted file mode 100644
index f1db45d83e73..000000000000
--- a/python/edu/learn-python/gen/icons/StudyIcons.java
+++ /dev/null
@@ -1,27 +0,0 @@
-package icons;
-
-import com.intellij.openapi.util.IconLoader;
-
-import javax.swing.*;
-
-/**
- * NOTE THIS FILE IS AUTO-GENERATED
- * DO NOT EDIT IT BY HAND, run build/scripts/icons.gant instead
- */
-public class StudyIcons {
- private static Icon load(String path) {
- return IconLoader.getIcon(path, StudyIcons.class);
- }
-
- public static final Icon EducationalProjectType = load("/icons/com/jetbrains/python/edu/EducationalProjectType.png"); // 16x16
- public static final Icon Lesson = load("/icons/com/jetbrains/python/edu/Lesson.png"); // 16x16
- public static final Icon LessonCompl = load("/icons/com/jetbrains/python/edu/LessonCompl.png"); // 16x16
- public static final Icon Prev = load("/icons/com/jetbrains/python/edu/prev.png"); // 16x16
- public static final Icon Resolve = load("/icons/com/jetbrains/python/edu/resolve.png"); // 16x16
- public static final Icon Sandbox = load("/icons/com/jetbrains/python/edu/Sandbox.png"); // 16x16
- public static final Icon ShowHint = load("/icons/com/jetbrains/python/edu/showHint.png"); // 16x16
- public static final Icon Task = load("/icons/com/jetbrains/python/edu/Task.png"); // 16x16
- public static final Icon TaskCompl = load("/icons/com/jetbrains/python/edu/TaskCompl.png"); // 16x16
- public static final Icon TaskProbl = load("/icons/com/jetbrains/python/edu/TaskProbl.png"); // 16x16
- public static final Icon WatchInput = load("/icons/com/jetbrains/python/edu/WatchInput.png"); // 24x24
-}
diff --git a/python/edu/learn-python/learn-python.iml b/python/edu/learn-python/learn-python.iml
deleted file mode 100644
index f2b46e9e5479..000000000000
--- a/python/edu/learn-python/learn-python.iml
+++ /dev/null
@@ -1,21 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/python/edu/learn-python/resources/META-INF/plugin.xml b/python/edu/learn-python/resources/META-INF/plugin.xml
deleted file mode 100644
index a8e99c9506ec..000000000000
--- a/python/edu/learn-python/resources/META-INF/plugin.xml
+++ /dev/null
@@ -1,82 +0,0 @@
-
-
- com.jetbrains.python.edu.learn-python
- Educational plugin for PyCharm
- 1.2
-
-
-
-
-
-
-
-
-
-
- com.intellij.modules.lang
- com.intellij.modules.python
-
-
-
- com.jetbrains.python.edu.StudyTaskManager
- com.jetbrains.python.edu.StudyTaskManager
-
-
-
-
-
- com.jetbrains.python.edu.StudyInitialConfigurator
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/python/edu/learn-python/src/com/jetbrains/python/edu/StudyResourceManger.java b/python/edu/learn-python/src/com/jetbrains/python/edu/StudyResourceManger.java
deleted file mode 100644
index 38f1c2ff2cde..000000000000
--- a/python/edu/learn-python/src/com/jetbrains/python/edu/StudyResourceManger.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package com.jetbrains.python.edu;
-
-public interface StudyResourceManger {
- String USER_TESTER = "user_tester.py";
-}
diff --git a/python/edu/learn-python/src/com/jetbrains/python/edu/actions/StudyRunAction.java b/python/edu/learn-python/src/com/jetbrains/python/edu/actions/StudyRunAction.java
deleted file mode 100644
index c1398a9a585a..000000000000
--- a/python/edu/learn-python/src/com/jetbrains/python/edu/actions/StudyRunAction.java
+++ /dev/null
@@ -1,96 +0,0 @@
-package com.jetbrains.python.edu.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.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.python.edu.StudyResourceManger;
-import com.jetbrains.python.edu.StudyTaskManager;
-import com.jetbrains.python.edu.StudyUtils;
-import com.jetbrains.python.edu.course.Task;
-import com.jetbrains.python.edu.course.TaskFile;
-import com.jetbrains.python.edu.editor.StudyEditor;
-import com.jetbrains.python.run.PythonTracebackFilter;
-import org.jetbrains.annotations.NotNull;
-
-import java.io.File;
-
-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;
-
- public void run(@NotNull final Project project, @NotNull final Sdk sdk) {
- if (myHandler != null && !myHandler.isProcessTerminated()) return;
- Editor selectedEditor = StudyEditor.getSelectedEditor(project);
- FileDocumentManager fileDocumentManager = FileDocumentManager.getInstance();
- assert selectedEditor != null;
- VirtualFile openedFile = fileDocumentManager.getFile(selectedEditor.getDocument());
- StudyTaskManager taskManager = StudyTaskManager.getInstance(project);
- if (openedFile != null && openedFile.getCanonicalPath() != null) {
- String filePath = openedFile.getCanonicalPath();
- GeneralCommandLine cmd = new GeneralCommandLine();
- cmd.withWorkDirectory(openedFile.getParent().getCanonicalPath());
- String pythonPath = sdk.getHomePath();
- if (pythonPath != null) {
- cmd.setExePath(pythonPath);
- TaskFile selectedTaskFile = taskManager.getTaskFile(openedFile);
- assert selectedTaskFile != null;
- Task currentTask = selectedTaskFile.getTask();
- if (!currentTask.getUserTests().isEmpty()) {
- cmd.addParameter(new File(project.getBaseDir().getPath(), StudyResourceManger.USER_TESTER).getPath());
- cmd.addParameter(pythonPath);
- cmd.addParameter(filePath);
- Process process;
- try {
- process = cmd.createProcess();
- }
- catch (ExecutionException e) {
- LOG.error(e);
- return;
- }
- myHandler = new OSProcessHandler(process);
- RunContentExecutor executor = new RunContentExecutor(project, myHandler).withFilter(new PythonTracebackFilter(project));
- Disposer.register(project, executor);
- executor.run();
- return;
- }
- try {
- cmd.addParameter(filePath);
- Process p = cmd.createProcess();
- myHandler = new OSProcessHandler(p);
-
- RunContentExecutor executor = new RunContentExecutor(project, myHandler).withFilter(new PythonTracebackFilter(project));
- Disposer.register(project, executor);
- executor.run();
- }
-
- catch (ExecutionException e) {
- LOG.error(e);
- }
- }
- }
- }
-
- public void actionPerformed(@NotNull AnActionEvent e) {
- Project project = e.getProject();
- if (project == null) {
- return;
- }
- Sdk sdk = StudyUtils.findPythonSdk(project);
- if (sdk == null) {
- return;
- }
- run(project, sdk);
- }
-}
diff --git a/python/edu/main_pycharm_edu.iml b/python/edu/main_pycharm_edu.iml
index c29ec159fc09..7dbfb712fc9c 100644
--- a/python/edu/main_pycharm_edu.iml
+++ b/python/edu/main_pycharm_edu.iml
@@ -15,9 +15,10 @@
-
+
+
\ No newline at end of file
diff --git a/python/educational-python/interactive-learning-python/interactive-learning-python.iml b/python/educational-python/interactive-learning-python/interactive-learning-python.iml
index c90834f2d607..96fc1b873f54 100644
--- a/python/educational-python/interactive-learning-python/interactive-learning-python.iml
+++ b/python/educational-python/interactive-learning-python/interactive-learning-python.iml
@@ -4,8 +4,26 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/python/educational-python/interactive-learning-python/resources/META-INF/plugin.xml b/python/educational-python/interactive-learning-python/resources/META-INF/plugin.xml
new file mode 100644
index 000000000000..be0490b7ba79
--- /dev/null
+++ b/python/educational-python/interactive-learning-python/resources/META-INF/plugin.xml
@@ -0,0 +1,43 @@
+
+
+ com.jetbrains.python.edu.interactivelearning.python
+ Educational plugin for PyCharm
+ 2.0
+
+
+
+
+
+
+
+
+
+
+ com.intellij.modules.lang
+ com.intellij.modules.python
+ com.jetbrains.edu.interactivelearning
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/python/edu/learn-python/resources/com/jetbrains/python/edu/user_tester.py b/python/educational-python/interactive-learning-python/resources/com/jetbrains/python/edu/user_tester.py
similarity index 100%
rename from python/edu/learn-python/resources/com/jetbrains/python/edu/user_tester.py
rename to python/educational-python/interactive-learning-python/resources/com/jetbrains/python/edu/user_tester.py
diff --git a/python/edu/learn-python/resources/courses/introduction_course.zip b/python/educational-python/interactive-learning-python/resources/courses/introduction_course.zip
similarity index 100%
rename from python/edu/learn-python/resources/courses/introduction_course.zip
rename to python/educational-python/interactive-learning-python/resources/courses/introduction_course.zip
diff --git a/python/edu/learn-python/resources/icons/com/jetbrains/python/edu/EducationalProjectType.png b/python/educational-python/interactive-learning-python/resources/icons/com/jetbrains/edu/learning/EducationalProjectType.png
similarity index 100%
rename from python/edu/learn-python/resources/icons/com/jetbrains/python/edu/EducationalProjectType.png
rename to python/educational-python/interactive-learning-python/resources/icons/com/jetbrains/edu/learning/EducationalProjectType.png
diff --git a/python/edu/learn-python/resources/icons/com/jetbrains/python/edu/EducationalProjectType@2x.png b/python/educational-python/interactive-learning-python/resources/icons/com/jetbrains/edu/learning/EducationalProjectType@2x.png
similarity index 100%
rename from python/edu/learn-python/resources/icons/com/jetbrains/python/edu/EducationalProjectType@2x.png
rename to python/educational-python/interactive-learning-python/resources/icons/com/jetbrains/edu/learning/EducationalProjectType@2x.png
diff --git a/python/edu/learn-python/resources/icons/com/jetbrains/python/edu/EducationalProjectType_dark.png b/python/educational-python/interactive-learning-python/resources/icons/com/jetbrains/edu/learning/EducationalProjectType_dark.png
similarity index 100%
rename from python/edu/learn-python/resources/icons/com/jetbrains/python/edu/EducationalProjectType_dark.png
rename to python/educational-python/interactive-learning-python/resources/icons/com/jetbrains/edu/learning/EducationalProjectType_dark.png
diff --git a/python/edu/learn-python/resources/icons/com/jetbrains/python/edu/EducationalProjectType_dark@2x.png b/python/educational-python/interactive-learning-python/resources/icons/com/jetbrains/edu/learning/EducationalProjectType_dark@2x.png
similarity index 100%
rename from python/edu/learn-python/resources/icons/com/jetbrains/python/edu/EducationalProjectType_dark@2x.png
rename to python/educational-python/interactive-learning-python/resources/icons/com/jetbrains/edu/learning/EducationalProjectType_dark@2x.png
diff --git a/python/educational-python/interactive-learning-python/src/com/jetbrains/edu/learning/PyStudyDirectoryProjectGenerator.java b/python/educational-python/interactive-learning-python/src/com/jetbrains/edu/learning/PyStudyDirectoryProjectGenerator.java
new file mode 100644
index 000000000000..293282be29e3
--- /dev/null
+++ b/python/educational-python/interactive-learning-python/src/com/jetbrains/edu/learning/PyStudyDirectoryProjectGenerator.java
@@ -0,0 +1,95 @@
+package com.jetbrains.edu.learning;
+
+import com.intellij.facet.ui.FacetEditorValidator;
+import com.intellij.facet.ui.FacetValidatorsManager;
+import com.intellij.facet.ui.ValidationResult;
+import com.intellij.openapi.module.Module;
+import com.intellij.openapi.progress.ProcessCanceledException;
+import com.intellij.openapi.project.Project;
+import com.intellij.openapi.vfs.VirtualFile;
+import com.intellij.platform.DirectoryProjectGenerator;
+import com.jetbrains.edu.learning.course.CourseInfo;
+import com.jetbrains.edu.learning.ui.StudyNewProjectPanel;
+import com.jetbrains.python.newProject.PythonProjectGenerator;
+import icons.InteractiveLearningPythonIcons;
+import org.jetbrains.annotations.Nls;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+import javax.swing.*;
+import java.io.File;
+import java.util.Map;
+
+
+public class PyStudyDirectoryProjectGenerator extends PythonProjectGenerator implements DirectoryProjectGenerator {
+ private final StudyProjectGenerator myGenerator;
+ public ValidationResult myValidationResult = new ValidationResult("selected course is not valid");
+
+ public PyStudyDirectoryProjectGenerator() {
+ myGenerator = new StudyProjectGenerator();
+ myGenerator.addSettingsStateListener(new StudyProjectGenerator.SettingsListener() {
+ @Override
+ public void stateChanged(ValidationResult result) {
+ setValidationResult(result);
+ }
+ });
+ }
+
+ @Nls
+ @NotNull
+ @Override
+ public String getName() {
+ return "Educational";
+ }
+
+ @Nullable
+ @Override
+ public Object showGenerationSettings(VirtualFile baseDir) throws ProcessCanceledException {
+ return null;
+ }
+
+ @Nullable
+ @Override
+ public Icon getLogo() {
+ return InteractiveLearningPythonIcons.EducationalProjectType;
+ }
+
+
+ @Override
+ public void generateProject(@NotNull final Project project, @NotNull final VirtualFile baseDir,
+ @Nullable Object settings, @NotNull Module module) {
+ myGenerator.generateProject(project, baseDir);
+ }
+ @NotNull
+ @Override
+ public ValidationResult validate(@NotNull String s) {
+ return myValidationResult;
+ }
+
+ public void setValidationResult(ValidationResult validationResult) {
+ myValidationResult = validationResult;
+ }
+
+ @Nullable
+ @Override
+ public JPanel extendBasePanel() throws ProcessCanceledException {
+ StudyNewProjectPanel settingsPanel = new StudyNewProjectPanel(myGenerator);
+ settingsPanel.registerValidators(new FacetValidatorsManager() {
+ public void registerValidator(FacetEditorValidator validator, JComponent... componentsToWatch) {
+ throw new UnsupportedOperationException();
+ }
+ public void validate() {
+ fireStateChanged();
+ }
+ });
+ return settingsPanel.getContentPanel();
+ }
+
+ public Map getCourses() {
+ return myGenerator.getCourses();
+ }
+
+ public void setSelectedCourse(CourseInfo course) {
+ myGenerator.setSelectedCourse(course);
+ }
+}
diff --git a/python/edu/learn-python/src/com/jetbrains/python/edu/StudyTestRunner.java b/python/educational-python/interactive-learning-python/src/com/jetbrains/edu/learning/PyStudyTestRunner.java
similarity index 62%
rename from python/edu/learn-python/src/com/jetbrains/python/edu/StudyTestRunner.java
rename to python/educational-python/interactive-learning-python/src/com/jetbrains/edu/learning/PyStudyTestRunner.java
index 78eadcbfe8b2..bc0e563d80c9 100644
--- a/python/edu/learn-python/src/com/jetbrains/python/edu/StudyTestRunner.java
+++ b/python/educational-python/interactive-learning-python/src/com/jetbrains/edu/learning/PyStudyTestRunner.java
@@ -1,36 +1,26 @@
-package com.jetbrains.python.edu;
+package com.jetbrains.edu.learning;
import com.intellij.execution.ExecutionException;
import com.intellij.execution.configurations.GeneralCommandLine;
-import com.intellij.execution.process.ProcessOutput;
-import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.module.ModuleManager;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.projectRoots.Sdk;
import com.intellij.openapi.util.io.FileUtil;
import com.intellij.openapi.vfs.VirtualFile;
-import com.jetbrains.python.edu.course.Course;
-import com.jetbrains.python.edu.course.Task;
+import com.jetbrains.edu.learning.course.Course;
+import com.jetbrains.edu.learning.course.Task;
import com.jetbrains.python.sdk.PythonSdkType;
import org.jetbrains.annotations.NotNull;
-import java.io.*;
+import java.io.File;
import java.util.Map;
-public class StudyTestRunner {
- public static final String STUDY_PREFIX="#educational_plugin";
- public static final String TEST_OK = "test OK";
- private static final String TEST_FAILED = "FAILED + ";
+public class PyStudyTestRunner extends StudyTestRunner {
private static final String PYTHONPATH = "PYTHONPATH";
- private static final Logger LOG = Logger.getInstance(StudyTestRunner.class);
- private final Task myTask;
- private final VirtualFile myTaskDir;
- public StudyTestRunner(Task task, VirtualFile taskDir) {
- myTask = task;
- myTaskDir = taskDir;
+ PyStudyTestRunner(@NotNull final Task task, @NotNull final VirtualFile taskfile) {
+ super(task, taskfile);
}
-
public Process createCheckProcess(Project project, String executablePath) throws ExecutionException {
Sdk sdk = PythonSdkType.findPythonSdk(ModuleManager.getInstance(project).getModules()[0]);
File testRunner = new File(myTaskDir.getPath(), myTask.getTestFile());
@@ -61,20 +51,4 @@ public class StudyTestRunner {
}
return null;
}
-
-
- @NotNull
- public String getTestsOutput(@NotNull final ProcessOutput processOutput) {
- for (String line : processOutput.getStdoutLines()) {
- if (line.contains(STUDY_PREFIX)) {
- if (line.contains(TEST_OK)) {
- continue;
- }
- int messageStart = line.indexOf(TEST_FAILED);
- return line.substring(messageStart + TEST_FAILED.length());
- }
- }
-
- return TEST_OK;
- }
}
diff --git a/python/educational-python/interactive-learning-python/src/com/jetbrains/edu/learning/PyStudyUtils.java b/python/educational-python/interactive-learning-python/src/com/jetbrains/edu/learning/PyStudyUtils.java
new file mode 100644
index 000000000000..524510e97e6c
--- /dev/null
+++ b/python/educational-python/interactive-learning-python/src/com/jetbrains/edu/learning/PyStudyUtils.java
@@ -0,0 +1,76 @@
+/*
+ * 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.module.ModuleManager;
+import com.intellij.openapi.project.Project;
+import com.intellij.openapi.projectRoots.Sdk;
+import com.intellij.openapi.vfs.VirtualFile;
+import com.jetbrains.edu.learning.course.Task;
+import com.jetbrains.python.run.PythonTracebackFilter;
+import com.jetbrains.python.sdk.PythonSdkType;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+import java.io.File;
+
+public class PyStudyUtils implements StudyUtilsExtensionPoint {
+
+ @Override
+ public Sdk findSdk(@NotNull final Project project) {
+ return PythonSdkType.findPythonSdk(ModuleManager.getInstance(project).getModules()[0]);
+ }
+
+ @Nullable
+ @Override
+ public String getLinkToTutorial() {
+ return "If you'd like to learn" +
+ " more about PyCharm " +
+ "Educational Edition, " +
+ "click here to watch a tutorial";
+ }
+
+ @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 pythonPath,
+ @NotNull final Task currentTask) {
+ if (!currentTask.getUserTests().isEmpty()) {
+ cmd.addParameter(new File(project.getBaseDir().getPath(), StudyNames.USER_TESTER).getPath());
+ cmd.addParameter(pythonPath);
+ cmd.addParameter(filePath);
+ }
+ else {
+ cmd.addParameter(filePath);
+ }
+ }
+
+
+}
diff --git a/python/edu/learn-python/src/com/jetbrains/python/edu/actions/StudyIntroductionCourseAction.java b/python/educational-python/interactive-learning-python/src/com/jetbrains/edu/learning/actions/PyStudyIntroductionCourseAction.java
similarity index 81%
rename from python/edu/learn-python/src/com/jetbrains/python/edu/actions/StudyIntroductionCourseAction.java
rename to python/educational-python/interactive-learning-python/src/com/jetbrains/edu/learning/actions/PyStudyIntroductionCourseAction.java
index a03dc6acec3b..a7785e16838c 100644
--- a/python/edu/learn-python/src/com/jetbrains/python/edu/actions/StudyIntroductionCourseAction.java
+++ b/python/educational-python/interactive-learning-python/src/com/jetbrains/edu/learning/actions/PyStudyIntroductionCourseAction.java
@@ -13,7 +13,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package com.jetbrains.python.edu.actions;
+package com.jetbrains.edu.learning.actions;
import com.intellij.ide.impl.ProjectUtil;
import com.intellij.openapi.actionSystem.AnAction;
@@ -21,23 +21,23 @@ import com.intellij.openapi.actionSystem.AnActionEvent;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.project.ProjectManager;
import com.intellij.openapi.projectRoots.Sdk;
+import com.jetbrains.edu.learning.PyStudyDirectoryProjectGenerator;
+import com.jetbrains.edu.learning.StudyUtils;
+import com.jetbrains.edu.learning.course.CourseInfo;
import com.jetbrains.python.configuration.PyConfigurableInterpreterList;
-import com.jetbrains.python.edu.StudyDirectoryProjectGenerator;
-import com.jetbrains.python.edu.StudyUtils;
-import com.jetbrains.python.edu.course.CourseInfo;
import com.jetbrains.python.newProject.actions.GenerateProjectCallback;
import com.jetbrains.python.newProject.actions.ProjectSpecificSettingsStep;
-import icons.StudyIcons;
+import icons.InteractiveLearningPythonIcons;
import org.jetbrains.annotations.NotNull;
import java.io.File;
import java.util.List;
import java.util.Map;
-public class StudyIntroductionCourseAction extends AnAction {
+public class PyStudyIntroductionCourseAction extends AnAction {
- public StudyIntroductionCourseAction() {
- super("Introduction to Python", "Introduction to Python", StudyIcons.EducationalProjectType);
+ public PyStudyIntroductionCourseAction() {
+ super("Introduction to Python", "Introduction to Python", InteractiveLearningPythonIcons.EducationalProjectType);
}
@Override
@@ -48,7 +48,7 @@ public class StudyIntroductionCourseAction extends AnAction {
}
else {
final GenerateProjectCallback callback = new GenerateProjectCallback();
- final StudyDirectoryProjectGenerator generator = new StudyDirectoryProjectGenerator();
+ final PyStudyDirectoryProjectGenerator generator = new PyStudyDirectoryProjectGenerator();
final Map courses = generator.getCourses();
CourseInfo introCourse = null;
for (CourseInfo info : courses.keySet()) {
diff --git a/python/edu/learn-python/src/com/jetbrains/python/edu/actions/StudyWatchTutorialAction.java b/python/educational-python/interactive-learning-python/src/com/jetbrains/edu/learning/actions/PyStudyWatchTutorialAction.java
similarity index 74%
rename from python/edu/learn-python/src/com/jetbrains/python/edu/actions/StudyWatchTutorialAction.java
rename to python/educational-python/interactive-learning-python/src/com/jetbrains/edu/learning/actions/PyStudyWatchTutorialAction.java
index cae18e2457ad..e9e1b2b378bb 100644
--- a/python/edu/learn-python/src/com/jetbrains/python/edu/actions/StudyWatchTutorialAction.java
+++ b/python/educational-python/interactive-learning-python/src/com/jetbrains/edu/learning/actions/PyStudyWatchTutorialAction.java
@@ -1,12 +1,12 @@
-package com.jetbrains.python.edu.actions;
+package com.jetbrains.edu.learning.actions;
import com.intellij.ide.BrowserUtil;
import com.intellij.openapi.actionSystem.AnActionEvent;
import com.intellij.openapi.project.DumbAwareAction;
import org.jetbrains.annotations.NotNull;
-public class StudyWatchTutorialAction extends DumbAwareAction {
- public StudyWatchTutorialAction() {
+public class PyStudyWatchTutorialAction extends DumbAwareAction {
+ public PyStudyWatchTutorialAction() {
super("Learn more about PyCharm Educational Edition", null, null);
}
diff --git a/python/edu/learn-python/src/com/jetbrains/python/edu/highlighting/StudyVisitorFilter.java b/python/educational-python/interactive-learning-python/src/com/jetbrains/edu/learning/highlighting/PyStudyVisitorFilter.java
similarity index 76%
rename from python/edu/learn-python/src/com/jetbrains/python/edu/highlighting/StudyVisitorFilter.java
rename to python/educational-python/interactive-learning-python/src/com/jetbrains/edu/learning/highlighting/PyStudyVisitorFilter.java
index dc7495adb16e..4b849da0bf7a 100644
--- a/python/edu/learn-python/src/com/jetbrains/python/edu/highlighting/StudyVisitorFilter.java
+++ b/python/educational-python/interactive-learning-python/src/com/jetbrains/edu/learning/highlighting/PyStudyVisitorFilter.java
@@ -1,12 +1,12 @@
-package com.jetbrains.python.edu.highlighting;
+package com.jetbrains.edu.learning.highlighting;
import com.intellij.psi.PsiFile;
-import com.jetbrains.python.edu.StudyTaskManager;
+import com.jetbrains.edu.learning.StudyTaskManager;
import com.jetbrains.python.inspections.PythonVisitorFilter;
import com.jetbrains.python.inspections.unresolvedReference.PyUnresolvedReferencesInspection;
import org.jetbrains.annotations.NotNull;
-public class StudyVisitorFilter implements PythonVisitorFilter {
+public class PyStudyVisitorFilter implements PythonVisitorFilter {
@Override
public boolean isSupported(@NotNull final Class visitorClass, @NotNull final PsiFile file) {
if (StudyTaskManager.getInstance(file.getProject()).getCourse() == null) return true;
diff --git a/python/educational-python/interactive-learning-python/src/icons/InteractiveLearningPythonIcons.java b/python/educational-python/interactive-learning-python/src/icons/InteractiveLearningPythonIcons.java
new file mode 100644
index 000000000000..08b0bdd2acd8
--- /dev/null
+++ b/python/educational-python/interactive-learning-python/src/icons/InteractiveLearningPythonIcons.java
@@ -0,0 +1,17 @@
+package icons;
+
+import com.intellij.openapi.util.IconLoader;
+
+import javax.swing.*;
+
+/**
+ * NOTE THIS FILE IS AUTO-GENERATED
+ * DO NOT EDIT IT BY HAND, run build/scripts/icons.gant instead
+ */
+public class InteractiveLearningPythonIcons {
+ private static Icon load(String path) {
+ return IconLoader.getIcon(path, InteractiveLearningPythonIcons.class);
+ }
+
+ public static final Icon EducationalProjectType = load("/icons/com/jetbrains/edu/learning/EducationalProjectType.png"); // 16x16
+}
diff --git a/python/edu/learn-python/testData/course.json b/python/educational-python/interactive-learning-python/testData/course.json
similarity index 100%
rename from python/edu/learn-python/testData/course.json
rename to python/educational-python/interactive-learning-python/testData/course.json
diff --git a/python/edu/learn-python/testData/helloworld.py b/python/educational-python/interactive-learning-python/testData/helloworld.py
similarity index 100%
rename from python/edu/learn-python/testData/helloworld.py
rename to python/educational-python/interactive-learning-python/testData/helloworld.py
diff --git a/python/edu/learn-python/tests/JsonParserTest.java b/python/educational-python/interactive-learning-python/tests/JsonParserTest.java
similarity index 63%
rename from python/edu/learn-python/tests/JsonParserTest.java
rename to python/educational-python/interactive-learning-python/tests/JsonParserTest.java
index df8ee03a6c39..b9fd9654a90e 100644
--- a/python/edu/learn-python/tests/JsonParserTest.java
+++ b/python/educational-python/interactive-learning-python/tests/JsonParserTest.java
@@ -1,32 +1,30 @@
import com.google.gson.FieldNamingPolicy;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
-import org.junit.Before;
-import org.junit.Test;
-import com.jetbrains.python.edu.StudyUtils;
-import com.jetbrains.python.edu.course.Course;
+import com.jetbrains.edu.learning.StudyUtils;
+import com.jetbrains.edu.learning.course.Course;
+import com.jetbrains.python.PythonHelpersLocator;
+import junit.framework.TestCase;
import java.io.FileInputStream;
-import java.io.FileNotFoundException;
import java.io.InputStreamReader;
import java.io.Reader;
-import static org.junit.Assert.assertEquals;
/**
* author: liana
* data: 7/4/14.
*/
-public class JsonParserTest {
+public class JsonParserTest extends TestCase {
private Course myCourse = null;
- @Before
- public void setUp() throws FileNotFoundException {
- Reader reader = new InputStreamReader(new FileInputStream("testData/course.json"));
+
+ public void setUp() throws Exception {
+ super.setUp();
+ Reader reader = new InputStreamReader(new FileInputStream(getTestDataPath() + "/course.json"));
Gson gson = new GsonBuilder().setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES).create();
myCourse = gson.fromJson(reader, Course.class);
}
- @Test
public void testCourseLevel() {
assertEquals(myCourse.getName(), "Python для начинающих");
assertEquals(StudyUtils.getFirst(myCourse.getLessons().get(1).getTaskList().get(0).getUserTests()).getInput(), "sum-input.txt");
@@ -34,4 +32,7 @@ public class JsonParserTest {
assertEquals(myCourse.getLessons().get(0).getTaskList().size(), 2);
assertEquals(myCourse.getLessons().get(1).getTaskList().size(), 1);
}
+ protected String getTestDataPath() {
+ return PythonHelpersLocator.getPythonCommunityPath() + "/edu/learn-python/testData";
+ }
}
diff --git a/python/edu/learn-python/tests/StudyDocumentListenerTest.java b/python/educational-python/interactive-learning-python/tests/StudyDocumentListenerTest.java
similarity index 91%
rename from python/edu/learn-python/tests/StudyDocumentListenerTest.java
rename to python/educational-python/interactive-learning-python/tests/StudyDocumentListenerTest.java
index 9a89d12d670a..1004bd643dd9 100644
--- a/python/edu/learn-python/tests/StudyDocumentListenerTest.java
+++ b/python/educational-python/interactive-learning-python/tests/StudyDocumentListenerTest.java
@@ -3,9 +3,9 @@ import com.intellij.openapi.command.CommandProcessor;
import com.intellij.openapi.editor.Document;
import com.intellij.openapi.fileEditor.FileDocumentManager;
import com.intellij.psi.PsiFile;
-import com.jetbrains.python.edu.StudyDocumentListener;
-import com.jetbrains.python.edu.course.TaskFile;
-import com.jetbrains.python.edu.course.TaskWindow;
+import com.jetbrains.edu.learning.StudyDocumentListener;
+import com.jetbrains.edu.learning.course.TaskFile;
+import com.jetbrains.edu.learning.course.TaskWindow;
import java.util.ArrayList;
import java.util.List;
diff --git a/python/edu/learn-python/tests/StudyTestCase.java b/python/educational-python/interactive-learning-python/tests/StudyTestCase.java
similarity index 100%
rename from python/edu/learn-python/tests/StudyTestCase.java
rename to python/educational-python/interactive-learning-python/tests/StudyTestCase.java
diff --git a/python/educational/course-creator/src/com/jetbrains/edu/coursecreator/CCProjectGeneratorUtil.java b/python/educational/course-creator/src/com/jetbrains/edu/coursecreator/CCProjectGeneratorUtil.java
index 7ccd9a8d7f6a..2d7d03f1dc9e 100644
--- a/python/educational/course-creator/src/com/jetbrains/edu/coursecreator/CCProjectGeneratorUtil.java
+++ b/python/educational/course-creator/src/com/jetbrains/edu/coursecreator/CCProjectGeneratorUtil.java
@@ -16,6 +16,9 @@ import org.jetbrains.annotations.NotNull;
public class CCProjectGeneratorUtil {
+ private CCProjectGeneratorUtil() {
+ }
+
public static void generateProject(@NotNull final Project project, @NotNull final VirtualFile baseDir,
@NotNull final String name, @NotNull final String author,
@NotNull final String description) {
diff --git a/python/educational/interactive-learning/interactive-learning.iml b/python/educational/interactive-learning/interactive-learning.iml
index c90834f2d607..7413f5da4ba1 100644
--- a/python/educational/interactive-learning/interactive-learning.iml
+++ b/python/educational/interactive-learning/interactive-learning.iml
@@ -4,8 +4,11 @@
+
+
+
\ No newline at end of file
diff --git a/python/educational/interactive-learning/resources/META-INF/plugin.xml b/python/educational/interactive-learning/resources/META-INF/plugin.xml
new file mode 100644
index 000000000000..8374db06e8ed
--- /dev/null
+++ b/python/educational/interactive-learning/resources/META-INF/plugin.xml
@@ -0,0 +1,74 @@
+
+
+ com.jetbrains.edu.interactivelearning
+ Educational plugin core
+ 2.0
+
+
+
+
+
+
+
+
+
+
+ com.intellij.modules.lang
+
+
+
+ com.jetbrains.edu.learning.StudyTaskManager
+ com.jetbrains.edu.learning.StudyTaskManager
+
+
+
+
+
+ com.jetbrains.edu.learning.StudyInitialConfigurator
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/python/edu/learn-python/resources/icons/com/jetbrains/python/edu/Lesson.png b/python/educational/interactive-learning/resources/icons/com/jetbrains/edu/learning/Lesson.png
similarity index 100%
rename from python/edu/learn-python/resources/icons/com/jetbrains/python/edu/Lesson.png
rename to python/educational/interactive-learning/resources/icons/com/jetbrains/edu/learning/Lesson.png
diff --git a/python/edu/learn-python/resources/icons/com/jetbrains/python/edu/Lesson@2x.png b/python/educational/interactive-learning/resources/icons/com/jetbrains/edu/learning/Lesson@2x.png
similarity index 100%
rename from python/edu/learn-python/resources/icons/com/jetbrains/python/edu/Lesson@2x.png
rename to python/educational/interactive-learning/resources/icons/com/jetbrains/edu/learning/Lesson@2x.png
diff --git a/python/edu/learn-python/resources/icons/com/jetbrains/python/edu/LessonComp@2x.png b/python/educational/interactive-learning/resources/icons/com/jetbrains/edu/learning/LessonComp@2x.png
similarity index 100%
rename from python/edu/learn-python/resources/icons/com/jetbrains/python/edu/LessonComp@2x.png
rename to python/educational/interactive-learning/resources/icons/com/jetbrains/edu/learning/LessonComp@2x.png
diff --git a/python/edu/learn-python/resources/icons/com/jetbrains/python/edu/LessonCompl.png b/python/educational/interactive-learning/resources/icons/com/jetbrains/edu/learning/LessonCompl.png
similarity index 100%
rename from python/edu/learn-python/resources/icons/com/jetbrains/python/edu/LessonCompl.png
rename to python/educational/interactive-learning/resources/icons/com/jetbrains/edu/learning/LessonCompl.png
diff --git a/python/edu/learn-python/resources/icons/com/jetbrains/python/edu/Sandbox.png b/python/educational/interactive-learning/resources/icons/com/jetbrains/edu/learning/Sandbox.png
similarity index 100%
rename from python/edu/learn-python/resources/icons/com/jetbrains/python/edu/Sandbox.png
rename to python/educational/interactive-learning/resources/icons/com/jetbrains/edu/learning/Sandbox.png
diff --git a/python/edu/learn-python/resources/icons/com/jetbrains/python/edu/Sandbox@2x.png b/python/educational/interactive-learning/resources/icons/com/jetbrains/edu/learning/Sandbox@2x.png
similarity index 100%
rename from python/edu/learn-python/resources/icons/com/jetbrains/python/edu/Sandbox@2x.png
rename to python/educational/interactive-learning/resources/icons/com/jetbrains/edu/learning/Sandbox@2x.png
diff --git a/python/edu/learn-python/resources/icons/com/jetbrains/python/edu/Task.png b/python/educational/interactive-learning/resources/icons/com/jetbrains/edu/learning/Task.png
similarity index 100%
rename from python/edu/learn-python/resources/icons/com/jetbrains/python/edu/Task.png
rename to python/educational/interactive-learning/resources/icons/com/jetbrains/edu/learning/Task.png
diff --git a/python/edu/learn-python/resources/icons/com/jetbrains/python/edu/Task@2x.png b/python/educational/interactive-learning/resources/icons/com/jetbrains/edu/learning/Task@2x.png
similarity index 100%
rename from python/edu/learn-python/resources/icons/com/jetbrains/python/edu/Task@2x.png
rename to python/educational/interactive-learning/resources/icons/com/jetbrains/edu/learning/Task@2x.png
diff --git a/python/edu/learn-python/resources/icons/com/jetbrains/python/edu/Task@2x_dark.png b/python/educational/interactive-learning/resources/icons/com/jetbrains/edu/learning/Task@2x_dark.png
similarity index 100%
rename from python/edu/learn-python/resources/icons/com/jetbrains/python/edu/Task@2x_dark.png
rename to python/educational/interactive-learning/resources/icons/com/jetbrains/edu/learning/Task@2x_dark.png
diff --git a/python/edu/learn-python/resources/icons/com/jetbrains/python/edu/TaskCompl.png b/python/educational/interactive-learning/resources/icons/com/jetbrains/edu/learning/TaskCompl.png
similarity index 100%
rename from python/edu/learn-python/resources/icons/com/jetbrains/python/edu/TaskCompl.png
rename to python/educational/interactive-learning/resources/icons/com/jetbrains/edu/learning/TaskCompl.png
diff --git a/python/edu/learn-python/resources/icons/com/jetbrains/python/edu/TaskCompl@2x.png b/python/educational/interactive-learning/resources/icons/com/jetbrains/edu/learning/TaskCompl@2x.png
similarity index 100%
rename from python/edu/learn-python/resources/icons/com/jetbrains/python/edu/TaskCompl@2x.png
rename to python/educational/interactive-learning/resources/icons/com/jetbrains/edu/learning/TaskCompl@2x.png
diff --git a/python/edu/learn-python/resources/icons/com/jetbrains/python/edu/TaskCompl@2x_dark.png b/python/educational/interactive-learning/resources/icons/com/jetbrains/edu/learning/TaskCompl@2x_dark.png
similarity index 100%
rename from python/edu/learn-python/resources/icons/com/jetbrains/python/edu/TaskCompl@2x_dark.png
rename to python/educational/interactive-learning/resources/icons/com/jetbrains/edu/learning/TaskCompl@2x_dark.png
diff --git a/python/edu/learn-python/resources/icons/com/jetbrains/python/edu/TaskCompl_dark.png b/python/educational/interactive-learning/resources/icons/com/jetbrains/edu/learning/TaskCompl_dark.png
similarity index 100%
rename from python/edu/learn-python/resources/icons/com/jetbrains/python/edu/TaskCompl_dark.png
rename to python/educational/interactive-learning/resources/icons/com/jetbrains/edu/learning/TaskCompl_dark.png
diff --git a/python/edu/learn-python/resources/icons/com/jetbrains/python/edu/TaskProbl.png b/python/educational/interactive-learning/resources/icons/com/jetbrains/edu/learning/TaskProbl.png
similarity index 100%
rename from python/edu/learn-python/resources/icons/com/jetbrains/python/edu/TaskProbl.png
rename to python/educational/interactive-learning/resources/icons/com/jetbrains/edu/learning/TaskProbl.png
diff --git a/python/edu/learn-python/resources/icons/com/jetbrains/python/edu/TaskProbl@2x.png b/python/educational/interactive-learning/resources/icons/com/jetbrains/edu/learning/TaskProbl@2x.png
similarity index 100%
rename from python/edu/learn-python/resources/icons/com/jetbrains/python/edu/TaskProbl@2x.png
rename to python/educational/interactive-learning/resources/icons/com/jetbrains/edu/learning/TaskProbl@2x.png
diff --git a/python/edu/learn-python/resources/icons/com/jetbrains/python/edu/TaskProbl@2x_dark.png b/python/educational/interactive-learning/resources/icons/com/jetbrains/edu/learning/TaskProbl@2x_dark.png
similarity index 100%
rename from python/edu/learn-python/resources/icons/com/jetbrains/python/edu/TaskProbl@2x_dark.png
rename to python/educational/interactive-learning/resources/icons/com/jetbrains/edu/learning/TaskProbl@2x_dark.png
diff --git a/python/edu/learn-python/resources/icons/com/jetbrains/python/edu/TaskProbl_dark.png b/python/educational/interactive-learning/resources/icons/com/jetbrains/edu/learning/TaskProbl_dark.png
similarity index 100%
rename from python/edu/learn-python/resources/icons/com/jetbrains/python/edu/TaskProbl_dark.png
rename to python/educational/interactive-learning/resources/icons/com/jetbrains/edu/learning/TaskProbl_dark.png
diff --git a/python/edu/learn-python/resources/icons/com/jetbrains/python/edu/Task_dark.png b/python/educational/interactive-learning/resources/icons/com/jetbrains/edu/learning/Task_dark.png
similarity index 100%
rename from python/edu/learn-python/resources/icons/com/jetbrains/python/edu/Task_dark.png
rename to python/educational/interactive-learning/resources/icons/com/jetbrains/edu/learning/Task_dark.png
diff --git a/python/edu/learn-python/resources/icons/com/jetbrains/python/edu/WatchInput.png b/python/educational/interactive-learning/resources/icons/com/jetbrains/edu/learning/WatchInput.png
similarity index 100%
rename from python/edu/learn-python/resources/icons/com/jetbrains/python/edu/WatchInput.png
rename to python/educational/interactive-learning/resources/icons/com/jetbrains/edu/learning/WatchInput.png
diff --git a/python/edu/learn-python/resources/icons/com/jetbrains/python/edu/prev.png b/python/educational/interactive-learning/resources/icons/com/jetbrains/edu/learning/prev.png
similarity index 100%
rename from python/edu/learn-python/resources/icons/com/jetbrains/python/edu/prev.png
rename to python/educational/interactive-learning/resources/icons/com/jetbrains/edu/learning/prev.png
diff --git a/python/edu/learn-python/resources/icons/com/jetbrains/python/edu/resolve.png b/python/educational/interactive-learning/resources/icons/com/jetbrains/edu/learning/resolve.png
similarity index 100%
rename from python/edu/learn-python/resources/icons/com/jetbrains/python/edu/resolve.png
rename to python/educational/interactive-learning/resources/icons/com/jetbrains/edu/learning/resolve.png
diff --git a/python/edu/learn-python/resources/icons/com/jetbrains/python/edu/resolve_dark.png b/python/educational/interactive-learning/resources/icons/com/jetbrains/edu/learning/resolve_dark.png
similarity index 100%
rename from python/edu/learn-python/resources/icons/com/jetbrains/python/edu/resolve_dark.png
rename to python/educational/interactive-learning/resources/icons/com/jetbrains/edu/learning/resolve_dark.png
diff --git a/python/edu/learn-python/resources/icons/com/jetbrains/python/edu/showHint.png b/python/educational/interactive-learning/resources/icons/com/jetbrains/edu/learning/showHint.png
similarity index 100%
rename from python/edu/learn-python/resources/icons/com/jetbrains/python/edu/showHint.png
rename to python/educational/interactive-learning/resources/icons/com/jetbrains/edu/learning/showHint.png
diff --git a/python/edu/learn-python/resources/icons/com/jetbrains/python/edu/showHint@2x.png b/python/educational/interactive-learning/resources/icons/com/jetbrains/edu/learning/showHint@2x.png
similarity index 100%
rename from python/edu/learn-python/resources/icons/com/jetbrains/python/edu/showHint@2x.png
rename to python/educational/interactive-learning/resources/icons/com/jetbrains/edu/learning/showHint@2x.png
diff --git a/python/edu/learn-python/src/com/jetbrains/python/edu/StudyDocumentListener.java b/python/educational/interactive-learning/src/com/jetbrains/edu/learning/StudyDocumentListener.java
similarity index 94%
rename from python/edu/learn-python/src/com/jetbrains/python/edu/StudyDocumentListener.java
rename to python/educational/interactive-learning/src/com/jetbrains/edu/learning/StudyDocumentListener.java
index 848becfae1b1..9714472a5649 100644
--- a/python/edu/learn-python/src/com/jetbrains/python/edu/StudyDocumentListener.java
+++ b/python/educational/interactive-learning/src/com/jetbrains/edu/learning/StudyDocumentListener.java
@@ -1,12 +1,12 @@
-package com.jetbrains.python.edu;
+package com.jetbrains.edu.learning;
import com.intellij.openapi.editor.Document;
import com.intellij.openapi.editor.event.DocumentAdapter;
import com.intellij.openapi.editor.event.DocumentEvent;
import com.intellij.openapi.editor.impl.event.DocumentEventImpl;
-import com.jetbrains.python.edu.course.TaskFile;
-import com.jetbrains.python.edu.course.TaskWindow;
+import com.jetbrains.edu.learning.course.TaskFile;
+import com.jetbrains.edu.learning.course.TaskWindow;
import java.util.ArrayList;
import java.util.List;
diff --git a/python/edu/learn-python/src/com/jetbrains/python/edu/StudyEditorFactoryListener.java b/python/educational/interactive-learning/src/com/jetbrains/edu/learning/StudyEditorFactoryListener.java
similarity index 94%
rename from python/edu/learn-python/src/com/jetbrains/python/edu/StudyEditorFactoryListener.java
rename to python/educational/interactive-learning/src/com/jetbrains/edu/learning/StudyEditorFactoryListener.java
index 8d580923f6e4..78da60815e4a 100644
--- a/python/edu/learn-python/src/com/jetbrains/python/edu/StudyEditorFactoryListener.java
+++ b/python/educational/interactive-learning/src/com/jetbrains/edu/learning/StudyEditorFactoryListener.java
@@ -1,4 +1,4 @@
-package com.jetbrains.python.edu;
+package com.jetbrains.edu.learning;
import com.intellij.openapi.application.ApplicationManager;
@@ -12,9 +12,9 @@ import com.intellij.openapi.editor.event.EditorMouseEvent;
import com.intellij.openapi.fileEditor.FileDocumentManager;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.vfs.VirtualFile;
-import com.jetbrains.python.edu.course.TaskFile;
-import com.jetbrains.python.edu.course.TaskWindow;
-import com.jetbrains.python.edu.editor.StudyEditor;
+import com.jetbrains.edu.learning.course.TaskFile;
+import com.jetbrains.edu.learning.course.TaskWindow;
+import com.jetbrains.edu.learning.editor.StudyEditor;
import org.jetbrains.annotations.NotNull;
import java.awt.*;
diff --git a/python/edu/learn-python/src/com/jetbrains/python/edu/StudyInitialConfigurator.java b/python/educational/interactive-learning/src/com/jetbrains/edu/learning/StudyInitialConfigurator.java
similarity index 98%
rename from python/edu/learn-python/src/com/jetbrains/python/edu/StudyInitialConfigurator.java
rename to python/educational/interactive-learning/src/com/jetbrains/edu/learning/StudyInitialConfigurator.java
index 6078025e9492..fef9cc78bd8a 100644
--- a/python/edu/learn-python/src/com/jetbrains/python/edu/StudyInitialConfigurator.java
+++ b/python/educational/interactive-learning/src/com/jetbrains/edu/learning/StudyInitialConfigurator.java
@@ -1,4 +1,4 @@
-package com.jetbrains.python.edu;
+package com.jetbrains.edu.learning;
import com.intellij.codeInsight.CodeInsightSettings;
import com.intellij.ide.RecentProjectsManager;
diff --git a/python/edu/learn-python/src/com/jetbrains/python/edu/StudyInstructionPainter.java b/python/educational/interactive-learning/src/com/jetbrains/edu/learning/StudyInstructionPainter.java
similarity index 95%
rename from python/edu/learn-python/src/com/jetbrains/python/edu/StudyInstructionPainter.java
rename to python/educational/interactive-learning/src/com/jetbrains/edu/learning/StudyInstructionPainter.java
index 95ecfb49651f..38266615e0cb 100644
--- a/python/edu/learn-python/src/com/jetbrains/python/edu/StudyInstructionPainter.java
+++ b/python/educational/interactive-learning/src/com/jetbrains/edu/learning/StudyInstructionPainter.java
@@ -1,4 +1,4 @@
-package com.jetbrains.python.edu;
+package com.jetbrains.edu.learning;
import com.intellij.openapi.actionSystem.ActionManager;
import com.intellij.openapi.actionSystem.AnAction;
@@ -12,7 +12,7 @@ import com.intellij.ui.JBColor;
import com.intellij.util.PairFunction;
import com.intellij.util.ui.GraphicsUtil;
import com.intellij.util.ui.UIUtil;
-import com.jetbrains.python.edu.actions.*;
+import com.jetbrains.edu.learning.actions.*;
import javax.swing.*;
import java.awt.*;
@@ -32,7 +32,7 @@ public class StudyInstructionPainter extends EditorEmptyTextPainter {
UIUtil.TextPainter painter = new UIUtil.TextPainter().withLineSpacing(1.5f);
- painter.appendLine("PyCharm Educational Edition").underlined(new JBColor(Gray._150, Gray._180));
+ painter.appendLine("Educational Edition").underlined(new JBColor(Gray._150, Gray._180));
addAction(painter, "Navigate to the next answer placeholder", StudyNextWindowAction.ACTION_ID, StudyNextWindowAction.SHORTCUT2, true);
String shortcut1 = getShortcutText(StudyPrevWindowAction.ACTION_ID, StudyPrevWindowAction.SHORTCUT, false, false);
String shortcut2 = getShortcutText(StudyNextWindowAction.ACTION_ID, StudyNextWindowAction.SHORTCUT, false, false);
diff --git a/python/edu/learn-python/src/com/jetbrains/python/edu/StudyNames.java b/python/educational/interactive-learning/src/com/jetbrains/edu/learning/StudyNames.java
similarity index 85%
rename from python/edu/learn-python/src/com/jetbrains/python/edu/StudyNames.java
rename to python/educational/interactive-learning/src/com/jetbrains/edu/learning/StudyNames.java
index 348ce36e6d9c..893f0d3b59ac 100644
--- a/python/edu/learn-python/src/com/jetbrains/python/edu/StudyNames.java
+++ b/python/educational/interactive-learning/src/com/jetbrains/edu/learning/StudyNames.java
@@ -13,18 +13,17 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package com.jetbrains.python.edu;
+package com.jetbrains.edu.learning;
import org.jetbrains.annotations.NonNls;
@NonNls
public class StudyNames {
- public static final String INTRODUCTION_COURSE = "introduction_course";
public static final String TASK_HTML = "task.html";
public static final String TASK_TESTS = "tests.py";
- public static final String COURSES = "courses";
public static final String LESSON = "lesson";
public static final String TEST_HELPER = "test_helper.py";
+ public static final String USER_TESTER = "user_tester.py";
private StudyNames() {
}
diff --git a/python/edu/learn-python/src/com/jetbrains/python/edu/StudyDirectoryProjectGenerator.java b/python/educational/interactive-learning/src/com/jetbrains/edu/learning/StudyProjectGenerator.java
similarity index 87%
rename from python/edu/learn-python/src/com/jetbrains/python/edu/StudyDirectoryProjectGenerator.java
rename to python/educational/interactive-learning/src/com/jetbrains/edu/learning/StudyProjectGenerator.java
index cc2bc803f0ea..c6954c6e60d6 100644
--- a/python/edu/learn-python/src/com/jetbrains/python/edu/StudyDirectoryProjectGenerator.java
+++ b/python/educational/interactive-learning/src/com/jetbrains/edu/learning/StudyProjectGenerator.java
@@ -1,9 +1,7 @@
-package com.jetbrains.python.edu;
+package com.jetbrains.edu.learning;
import com.google.gson.*;
import com.google.gson.stream.JsonReader;
-import com.intellij.facet.ui.FacetEditorValidator;
-import com.intellij.facet.ui.FacetValidatorsManager;
import com.intellij.facet.ui.ValidationResult;
import com.intellij.ide.projectView.ProjectView;
import com.intellij.ide.projectView.impl.AbstractProjectViewPane;
@@ -13,8 +11,6 @@ import com.intellij.openapi.application.ModalityState;
import com.intellij.openapi.application.PathManager;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.fileEditor.FileEditorManager;
-import com.intellij.openapi.module.Module;
-import com.intellij.openapi.progress.ProcessCanceledException;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.Condition;
import com.intellij.openapi.vfs.LocalFileSystem;
@@ -24,29 +20,26 @@ import com.intellij.openapi.vfs.newvfs.NewVirtualFile;
import com.intellij.openapi.vfs.newvfs.impl.VirtualDirectoryImpl;
import com.intellij.openapi.wm.ex.ToolWindowManagerAdapter;
import com.intellij.openapi.wm.ex.ToolWindowManagerEx;
-import com.intellij.platform.DirectoryProjectGenerator;
import com.intellij.platform.templates.github.GeneratorException;
import com.intellij.platform.templates.github.ZipUtil;
import com.intellij.psi.PsiFile;
import com.intellij.psi.PsiManager;
-import com.jetbrains.python.edu.course.*;
-import com.jetbrains.python.edu.ui.StudyNewProjectPanel;
-import com.jetbrains.python.newProject.PythonProjectGenerator;
-import icons.StudyIcons;
-import org.jetbrains.annotations.Nls;
+import com.intellij.util.containers.ContainerUtil;
+import com.jetbrains.edu.learning.course.*;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import javax.swing.*;
import java.io.*;
import java.util.HashMap;
+import java.util.List;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
-
-public class StudyDirectoryProjectGenerator extends PythonProjectGenerator implements DirectoryProjectGenerator {
- private static final Logger LOG = Logger.getInstance(StudyDirectoryProjectGenerator.class.getName());
+public class StudyProjectGenerator {
+ private static final Logger LOG = Logger.getInstance(StudyProjectGenerator.class.getName());
+ private final List myListeners = ContainerUtil.newArrayList();
private static final String REPO_URL = "https://github.com/JetBrains/pycharm-courses/archive/master.zip";
private static final String USER_NAME = "PyCharm";
private static final String COURSE_META_FILE = "course.json";
@@ -59,15 +52,6 @@ public class StudyDirectoryProjectGenerator extends PythonProjectGenerator imple
private Map myCourses = new HashMap();
private File mySelectedCourseFile;
private Project myProject;
- public ValidationResult myValidationResult = new ValidationResult("selected course is not valid");
-
- @Nls
- @NotNull
- @Override
- public String getName() {
- return "Educational";
- }
-
public void setCourses(Map courses) {
myCourses = courses;
@@ -140,22 +124,7 @@ public class StudyDirectoryProjectGenerator extends PythonProjectGenerator imple
return null;
}
- @Nullable
- @Override
- public Object showGenerationSettings(VirtualFile baseDir) throws ProcessCanceledException {
- return null;
- }
-
- @Nullable
- @Override
- public Icon getLogo() {
- return StudyIcons.EducationalProjectType;
- }
-
-
- @Override
- public void generateProject(@NotNull final Project project, @NotNull final VirtualFile baseDir,
- @Nullable Object settings, @NotNull Module module) {
+ public void generateProject(@NotNull final Project project, @NotNull final VirtualFile baseDir) {
myProject = project;
Reader reader = null;
@@ -336,42 +305,6 @@ public class StudyDirectoryProjectGenerator extends PythonProjectGenerator imple
return courseInfo;
}
- @NotNull
- @Override
- public ValidationResult validate(@NotNull String s) {
- return myValidationResult;
- }
-
- public void setValidationResult(ValidationResult validationResult) {
- myValidationResult = validationResult;
- }
-
- /**
- * @return courses from memory or from cash file or parses course directory
- */
- public Map getCourses() {
- if (!myCourses.isEmpty()) {
- return myCourses;
- }
- if (myCoursesDir.exists()) {
- File cacheFile = new File(myCoursesDir, CACHE_NAME);
- if (cacheFile.exists()) {
- myCourses = getCoursesFromCache(cacheFile);
- if (!myCourses.isEmpty()) {
- return myCourses;
- }
- }
- myCourses = loadCourses();
- if (!myCourses.isEmpty()) {
- return myCourses;
- }
- }
- downloadAndUnzip(false);
- myCourses = loadCourses();
- flushCache();
- return myCourses;
- }
-
/**
* Writes courses to cash file {@link com.jetbrains.python.edu.StudyDirectoryProjectGenerator#CACHE_NAME}
*/
@@ -417,7 +350,7 @@ public class StudyDirectoryProjectGenerator extends PythonProjectGenerator imple
Map coursesFromCash = new HashMap();
BufferedReader reader = null;
try {
- reader = new BufferedReader(new InputStreamReader(new FileInputStream(cashFile)));
+ reader = new BufferedReader(new InputStreamReader(new FileInputStream(cashFile)));
String line;
while ((line = reader.readLine()) != null) {
@@ -446,18 +379,43 @@ public class StudyDirectoryProjectGenerator extends PythonProjectGenerator imple
return coursesFromCash;
}
- @Nullable
- @Override
- public JPanel extendBasePanel() throws ProcessCanceledException {
- StudyNewProjectPanel settingsPanel = new StudyNewProjectPanel(this);
- settingsPanel.registerValidators(new FacetValidatorsManager() {
- public void registerValidator(FacetEditorValidator validator, JComponent... componentsToWatch) {
- throw new UnsupportedOperationException();
+ /**
+ * @return courses from memory or from cash file or parses course directory
+ */
+ public Map getCourses() {
+ if (!myCourses.isEmpty()) {
+ return myCourses;
+ }
+ if (myCoursesDir.exists()) {
+ File cacheFile = new File(myCoursesDir, CACHE_NAME);
+ if (cacheFile.exists()) {
+ myCourses = getCoursesFromCache(cacheFile);
+ if (!myCourses.isEmpty()) {
+ return myCourses;
+ }
}
- public void validate() {
- fireStateChanged();
+ myCourses = loadCourses();
+ if (!myCourses.isEmpty()) {
+ return myCourses;
}
- });
- return settingsPanel.getContentPanel();
+ }
+ downloadAndUnzip(false);
+ myCourses = loadCourses();
+ flushCache();
+ return myCourses;
+ }
+
+ public void addSettingsStateListener(@NotNull SettingsListener listener) {
+ myListeners.add(listener);
+ }
+
+ public interface SettingsListener {
+ void stateChanged(ValidationResult result);
+ }
+
+ public void fireStateChanged(ValidationResult result) {
+ for (SettingsListener listener : myListeners) {
+ listener.stateChanged(result);
+ }
}
}
diff --git a/python/edu/learn-python/src/com/jetbrains/python/edu/StudyState.java b/python/educational/interactive-learning/src/com/jetbrains/edu/learning/StudyState.java
similarity index 88%
rename from python/edu/learn-python/src/com/jetbrains/python/edu/StudyState.java
rename to python/educational/interactive-learning/src/com/jetbrains/edu/learning/StudyState.java
index 96dc3d906472..4c382e0cc622 100644
--- a/python/edu/learn-python/src/com/jetbrains/python/edu/StudyState.java
+++ b/python/educational/interactive-learning/src/com/jetbrains/edu/learning/StudyState.java
@@ -1,11 +1,11 @@
-package com.jetbrains.python.edu;
+package com.jetbrains.edu.learning;
import com.intellij.openapi.editor.Editor;
import com.intellij.openapi.fileEditor.FileDocumentManager;
import com.intellij.openapi.vfs.VirtualFile;
-import com.jetbrains.python.edu.course.Task;
-import com.jetbrains.python.edu.course.TaskFile;
-import com.jetbrains.python.edu.editor.StudyEditor;
+import com.jetbrains.edu.learning.course.Task;
+import com.jetbrains.edu.learning.course.TaskFile;
+import com.jetbrains.edu.learning.editor.StudyEditor;
public class StudyState {
private final StudyEditor myStudyEditor;
diff --git a/python/edu/learn-python/src/com/jetbrains/python/edu/StudyTaskManager.java b/python/educational/interactive-learning/src/com/jetbrains/edu/learning/StudyTaskManager.java
similarity index 95%
rename from python/edu/learn-python/src/com/jetbrains/python/edu/StudyTaskManager.java
rename to python/educational/interactive-learning/src/com/jetbrains/edu/learning/StudyTaskManager.java
index d44c251d5bb4..16996c0fb331 100644
--- a/python/edu/learn-python/src/com/jetbrains/python/edu/StudyTaskManager.java
+++ b/python/educational/interactive-learning/src/com/jetbrains/edu/learning/StudyTaskManager.java
@@ -1,4 +1,4 @@
-package com.jetbrains.python.edu;
+package com.jetbrains.edu.learning;
import com.intellij.ide.BrowserUtil;
import com.intellij.ide.ui.UISettings;
@@ -32,13 +32,13 @@ import com.intellij.openapi.vfs.VirtualFileManager;
import com.intellij.openapi.wm.*;
import com.intellij.util.ui.update.UiNotifyConnector;
import com.intellij.util.xmlb.XmlSerializer;
-import com.jetbrains.python.edu.actions.*;
-import com.jetbrains.python.edu.course.Course;
-import com.jetbrains.python.edu.course.Lesson;
-import com.jetbrains.python.edu.course.Task;
-import com.jetbrains.python.edu.course.TaskFile;
-import com.jetbrains.python.edu.ui.StudyCondition;
-import com.jetbrains.python.edu.ui.StudyToolWindowFactory;
+import com.jetbrains.edu.learning.actions.*;
+import com.jetbrains.edu.learning.course.Course;
+import com.jetbrains.edu.learning.course.Lesson;
+import com.jetbrains.edu.learning.course.Task;
+import com.jetbrains.edu.learning.course.TaskFile;
+import com.jetbrains.edu.learning.ui.StudyCondition;
+import com.jetbrains.edu.learning.ui.StudyToolWindowFactory;
import org.jdom.Element;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@@ -201,10 +201,7 @@ public class StudyTaskManager implements ProjectComponent, PersistentStateCompon
@Override
public void run() {
if (PropertiesComponent.getInstance().getBoolean("StudyShowPopup", true)) {
- String content = "If you'd like to learn" +
- " more about PyCharm " +
- "Educational Edition, " +
- "click here to watch a tutorial";
+ String content = StudyUtils.getLinkToTutorial();
final Notification notification =
new Notification("Watch Tutorials!", "", content, NotificationType.INFORMATION, new UrlOpeningListener(true));
Notifications.Bus.notify(notification);
diff --git a/python/educational/interactive-learning/src/com/jetbrains/edu/learning/StudyTestRunner.java b/python/educational/interactive-learning/src/com/jetbrains/edu/learning/StudyTestRunner.java
new file mode 100644
index 000000000000..366a8df7faf4
--- /dev/null
+++ b/python/educational/interactive-learning/src/com/jetbrains/edu/learning/StudyTestRunner.java
@@ -0,0 +1,38 @@
+package com.jetbrains.edu.learning;
+
+import com.intellij.execution.ExecutionException;
+import com.intellij.execution.process.ProcessOutput;
+import com.intellij.openapi.project.Project;
+import com.intellij.openapi.vfs.VirtualFile;
+import com.jetbrains.edu.learning.course.Task;
+import org.jetbrains.annotations.NotNull;
+
+public abstract class StudyTestRunner {
+ public static final String STUDY_PREFIX="#educational_plugin";
+ public static final String TEST_OK = "test OK";
+ private static final String TEST_FAILED = "FAILED + ";
+ protected final Task myTask;
+ protected final VirtualFile myTaskDir;
+
+ public StudyTestRunner(@NotNull final Task task, @NotNull final VirtualFile taskDir) {
+ myTask = task;
+ myTaskDir = taskDir;
+ }
+
+ public abstract Process createCheckProcess(Project project, String executablePath) throws ExecutionException;
+
+ @NotNull
+ public String getTestsOutput(@NotNull final ProcessOutput processOutput) {
+ for (String line : processOutput.getStdoutLines()) {
+ if (line.contains(STUDY_PREFIX)) {
+ if (line.contains(TEST_OK)) {
+ continue;
+ }
+ int messageStart = line.indexOf(TEST_FAILED);
+ return line.substring(messageStart + TEST_FAILED.length());
+ }
+ }
+
+ return TEST_OK;
+ }
+}
diff --git a/python/edu/learn-python/src/com/jetbrains/python/edu/StudyUtils.java b/python/educational/interactive-learning/src/com/jetbrains/edu/learning/StudyUtils.java
similarity index 76%
rename from python/edu/learn-python/src/com/jetbrains/python/edu/StudyUtils.java
rename to python/educational/interactive-learning/src/com/jetbrains/edu/learning/StudyUtils.java
index 324e58aa4b4c..9262ac6c7041 100644
--- a/python/edu/learn-python/src/com/jetbrains/python/edu/StudyUtils.java
+++ b/python/educational/interactive-learning/src/com/jetbrains/edu/learning/StudyUtils.java
@@ -1,5 +1,8 @@
-package com.jetbrains.python.edu;
+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.SaveAndSyncHandlerImpl;
import com.intellij.ide.projectView.actions.MarkRootActionBase;
import com.intellij.openapi.actionSystem.AnActionEvent;
@@ -11,7 +14,6 @@ import com.intellij.openapi.fileEditor.FileDocumentManager;
import com.intellij.openapi.fileEditor.FileEditor;
import com.intellij.openapi.fileEditor.FileEditorManager;
import com.intellij.openapi.module.Module;
-import com.intellij.openapi.module.ModuleManager;
import com.intellij.openapi.module.ModuleUtilCore;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.projectRoots.Sdk;
@@ -24,10 +26,9 @@ import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.openapi.vfs.VirtualFileManager;
import com.intellij.openapi.wm.ToolWindowManager;
import com.intellij.util.ui.UIUtil;
-import com.jetbrains.python.edu.course.*;
-import com.jetbrains.python.edu.editor.StudyEditor;
-import com.jetbrains.python.edu.ui.StudyToolWindowFactory;
-import com.jetbrains.python.sdk.PythonSdkType;
+import com.jetbrains.edu.learning.course.*;
+import com.jetbrains.edu.learning.editor.StudyEditor;
+import com.jetbrains.edu.learning.ui.StudyToolWindowFactory;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@@ -35,6 +36,9 @@ import java.io.*;
import java.util.Collection;
public class StudyUtils {
+ private StudyUtils() {
+ }
+
private static final Logger LOG = Logger.getInstance(StudyUtils.class.getName());
public static void closeSilently(Closeable stream) {
@@ -199,8 +203,13 @@ public class StudyUtils {
}
@Nullable
- public static Sdk findPythonSdk(@NotNull final Project project) {
- return PythonSdkType.findPythonSdk(ModuleManager.getInstance(project).getModules()[0]);
+ public static Sdk findSdk(@NotNull final Project project) {
+ final StudyUtilsExtensionPoint[] extensions =
+ ApplicationManager.getApplication().getExtensions(StudyUtilsExtensionPoint.EP_NAME);
+ if (extensions.length > 0) {
+ return extensions[0].findSdk(project);
+ }
+ return null;
}
public static void markDirAsSourceRoot(@NotNull final VirtualFile dir, @NotNull final Project project) {
@@ -224,4 +233,43 @@ public class StudyUtils {
}
});
}
+
+ public static StudyTestRunner getTestRunner(@NotNull final Task task, @NotNull final VirtualFile taskDir) {
+ final StudyUtilsExtensionPoint[] extensions =
+ ApplicationManager.getApplication().getExtensions(StudyUtilsExtensionPoint.EP_NAME);
+ if (extensions.length > 0) {
+ return extensions[0].getTestRunner(task, taskDir);
+ }
+ return null;
+ }
+
+ public static String getLinkToTutorial() {
+ final StudyUtilsExtensionPoint[] extensions =
+ ApplicationManager.getApplication().getExtensions(StudyUtilsExtensionPoint.EP_NAME);
+ if (extensions.length > 0) {
+ return extensions[0].getLinkToTutorial();
+ }
+ return null;
+ }
+
+ public static RunContentExecutor getExecutor(@NotNull final Project project, @NotNull final ProcessHandler handler) {
+ final StudyUtilsExtensionPoint[] extensions =
+ ApplicationManager.getApplication().getExtensions(StudyUtilsExtensionPoint.EP_NAME);
+ if (extensions.length > 0) {
+ return extensions[0].getExecutor(project, handler);
+ }
+ return null;
+ }
+
+ public static void setCommandLineParameters(@NotNull final GeneralCommandLine cmd,
+ @NotNull final Project project,
+ @NotNull final String filePath,
+ @NotNull final String pythonPath,
+ @NotNull final Task currentTask) {
+ final StudyUtilsExtensionPoint[] extensions =
+ ApplicationManager.getApplication().getExtensions(StudyUtilsExtensionPoint.EP_NAME);
+ if (extensions.length > 0) {
+ extensions[0].setCommandLineParameters(cmd, project, filePath, pythonPath, currentTask);
+ }
+ }
}
diff --git a/python/educational/interactive-learning/src/com/jetbrains/edu/learning/StudyUtilsExtensionPoint.java b/python/educational/interactive-learning/src/com/jetbrains/edu/learning/StudyUtilsExtensionPoint.java
new file mode 100644
index 000000000000..2342e5d28e15
--- /dev/null
+++ b/python/educational/interactive-learning/src/com/jetbrains/edu/learning/StudyUtilsExtensionPoint.java
@@ -0,0 +1,46 @@
+/*
+ * 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.extensions.ExtensionPointName;
+import com.intellij.openapi.project.Project;
+import com.intellij.openapi.projectRoots.Sdk;
+import com.intellij.openapi.vfs.VirtualFile;
+import com.jetbrains.edu.learning.course.Task;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+public interface StudyUtilsExtensionPoint {
+ ExtensionPointName EP_NAME = ExtensionPointName.create("Edu.StudyUtils");
+
+ @Nullable
+ abstract Sdk findSdk(@NotNull final Project project);
+
+ abstract String getLinkToTutorial();
+
+ abstract StudyTestRunner getTestRunner(@NotNull final Task task, @NotNull final VirtualFile taskDir);
+
+ public RunContentExecutor getExecutor(@NotNull final Project project, @NotNull final ProcessHandler handler);
+
+ public void setCommandLineParameters(@NotNull final GeneralCommandLine cmd,
+ @NotNull final Project project,
+ @NotNull final String filePath,
+ @NotNull final String pythonPath,
+ @NotNull final Task currentTask);
+}
diff --git a/python/edu/learn-python/src/com/jetbrains/python/edu/TaskWindowDeleteHandler.java b/python/educational/interactive-learning/src/com/jetbrains/edu/learning/TaskWindowDeleteHandler.java
similarity index 95%
rename from python/edu/learn-python/src/com/jetbrains/python/edu/TaskWindowDeleteHandler.java
rename to python/educational/interactive-learning/src/com/jetbrains/edu/learning/TaskWindowDeleteHandler.java
index 334d78f550fb..3e3896d26c0c 100644
--- a/python/edu/learn-python/src/com/jetbrains/python/edu/TaskWindowDeleteHandler.java
+++ b/python/educational/interactive-learning/src/com/jetbrains/edu/learning/TaskWindowDeleteHandler.java
@@ -1,4 +1,4 @@
-package com.jetbrains.python.edu;
+package com.jetbrains.edu.learning;
import com.intellij.codeInsight.hint.HintManager;
import com.intellij.openapi.editor.Editor;
diff --git a/python/edu/learn-python/src/com/jetbrains/python/edu/actions/StudyCheckAction.java b/python/educational/interactive-learning/src/com/jetbrains/edu/learning/actions/StudyCheckAction.java
similarity index 96%
rename from python/edu/learn-python/src/com/jetbrains/python/edu/actions/StudyCheckAction.java
rename to python/educational/interactive-learning/src/com/jetbrains/edu/learning/actions/StudyCheckAction.java
index 1b161278357b..4afe508dbc5a 100644
--- a/python/edu/learn-python/src/com/jetbrains/python/edu/actions/StudyCheckAction.java
+++ b/python/educational/interactive-learning/src/com/jetbrains/edu/learning/actions/StudyCheckAction.java
@@ -1,4 +1,4 @@
-package com.jetbrains.python.edu.actions;
+package com.jetbrains.edu.learning.actions;
import com.intellij.execution.ExecutionException;
import com.intellij.execution.process.CapturingProcessHandler;
@@ -33,15 +33,15 @@ import com.intellij.openapi.wm.IdeFrame;
import com.intellij.openapi.wm.WindowManager;
import com.intellij.openapi.wm.ex.StatusBarEx;
import com.intellij.openapi.wm.ex.WindowManagerEx;
-import com.jetbrains.python.edu.StudyDocumentListener;
-import com.jetbrains.python.edu.StudyState;
-import com.jetbrains.python.edu.StudyTestRunner;
-import com.jetbrains.python.edu.StudyUtils;
-import com.jetbrains.python.edu.course.StudyStatus;
-import com.jetbrains.python.edu.course.Task;
-import com.jetbrains.python.edu.course.TaskFile;
-import com.jetbrains.python.edu.course.TaskWindow;
-import com.jetbrains.python.edu.editor.StudyEditor;
+import com.jetbrains.edu.learning.StudyDocumentListener;
+import com.jetbrains.edu.learning.StudyState;
+import com.jetbrains.edu.learning.StudyTestRunner;
+import com.jetbrains.edu.learning.StudyUtils;
+import com.jetbrains.edu.learning.course.StudyStatus;
+import com.jetbrains.edu.learning.course.Task;
+import com.jetbrains.edu.learning.course.TaskFile;
+import com.jetbrains.edu.learning.course.TaskWindow;
+import com.jetbrains.edu.learning.editor.StudyEditor;
import org.jetbrains.annotations.NotNull;
import javax.swing.*;
@@ -133,7 +133,7 @@ public class StudyCheckAction extends DumbAwareAction {
final Task task = studyState.getTask();
final VirtualFile taskDir = studyState.getTaskDir();
flushWindows(task, taskDir);
- Sdk sdk = StudyUtils.findPythonSdk(project);
+ final Sdk sdk = StudyUtils.findSdk(project);
if (sdk == null) {
createNoPythonInterpreterPopUp(project);
return;
@@ -149,7 +149,8 @@ public class StudyCheckAction extends DumbAwareAction {
IdeFocusManager.getInstance(project).requestFocus(studyState.getEditor().getComponent(), true);
}
});
- final StudyTestRunner testRunner = new StudyTestRunner(task, taskDir);
+
+ final StudyTestRunner testRunner = StudyUtils.getTestRunner(task, taskDir);
Process testProcess = null;
try {
final VirtualFile executablePath = getTaskVirtualFile(studyState, task, taskDir);
diff --git a/python/edu/learn-python/src/com/jetbrains/python/edu/actions/StudyEditInputAction.java b/python/educational/interactive-learning/src/com/jetbrains/edu/learning/actions/StudyEditInputAction.java
similarity index 94%
rename from python/edu/learn-python/src/com/jetbrains/python/edu/actions/StudyEditInputAction.java
rename to python/educational/interactive-learning/src/com/jetbrains/edu/learning/actions/StudyEditInputAction.java
index 50dcc3a2e69a..b026e18388cd 100644
--- a/python/edu/learn-python/src/com/jetbrains/python/edu/actions/StudyEditInputAction.java
+++ b/python/educational/interactive-learning/src/com/jetbrains/edu/learning/actions/StudyEditInputAction.java
@@ -1,4 +1,4 @@
-package com.jetbrains.python.edu.actions;
+package com.jetbrains.edu.learning.actions;
import com.intellij.icons.AllIcons;
import com.intellij.ide.ui.UISettings;
@@ -20,13 +20,13 @@ import com.intellij.ui.tabs.TabInfo;
import com.intellij.ui.tabs.TabsListener;
import com.intellij.ui.tabs.impl.JBEditorTabs;
import com.intellij.util.PlatformIcons;
-import com.jetbrains.python.edu.StudyTaskManager;
-import com.jetbrains.python.edu.StudyUtils;
-import com.jetbrains.python.edu.course.Task;
-import com.jetbrains.python.edu.course.TaskFile;
-import com.jetbrains.python.edu.course.UserTest;
-import com.jetbrains.python.edu.editor.StudyEditor;
-import com.jetbrains.python.edu.ui.StudyTestContentPanel;
+import com.jetbrains.edu.learning.StudyTaskManager;
+import com.jetbrains.edu.learning.StudyUtils;
+import com.jetbrains.edu.learning.course.Task;
+import com.jetbrains.edu.learning.course.TaskFile;
+import com.jetbrains.edu.learning.course.UserTest;
+import com.jetbrains.edu.learning.editor.StudyEditor;
+import com.jetbrains.edu.learning.ui.StudyTestContentPanel;
import org.jetbrains.annotations.NotNull;
import javax.swing.*;
@@ -154,7 +154,7 @@ public class StudyEditInputAction extends DumbAwareAction {
showInput(e.getProject());
}
- private class HintClosedListener extends JBPopupAdapter {
+ private static class HintClosedListener extends JBPopupAdapter {
private final Task myTask;
private HintClosedListener(@NotNull final Task task) {
myTask = task;
diff --git a/python/edu/learn-python/src/com/jetbrains/python/edu/actions/StudyNextStudyTaskAction.java b/python/educational/interactive-learning/src/com/jetbrains/edu/learning/actions/StudyNextStudyTaskAction.java
similarity index 81%
rename from python/edu/learn-python/src/com/jetbrains/python/edu/actions/StudyNextStudyTaskAction.java
rename to python/educational/interactive-learning/src/com/jetbrains/edu/learning/actions/StudyNextStudyTaskAction.java
index 27edf22529cd..831208fcf5fa 100644
--- a/python/edu/learn-python/src/com/jetbrains/python/edu/actions/StudyNextStudyTaskAction.java
+++ b/python/educational/interactive-learning/src/com/jetbrains/edu/learning/actions/StudyNextStudyTaskAction.java
@@ -1,7 +1,7 @@
-package com.jetbrains.python.edu.actions;
+package com.jetbrains.edu.learning.actions;
-import com.jetbrains.python.edu.editor.StudyEditor;
-import com.jetbrains.python.edu.course.Task;
+import com.jetbrains.edu.learning.course.Task;
+import com.jetbrains.edu.learning.editor.StudyEditor;
import org.jetbrains.annotations.NotNull;
import javax.swing.*;
diff --git a/python/edu/learn-python/src/com/jetbrains/python/edu/actions/StudyNextWindowAction.java b/python/educational/interactive-learning/src/com/jetbrains/edu/learning/actions/StudyNextWindowAction.java
similarity index 87%
rename from python/edu/learn-python/src/com/jetbrains/python/edu/actions/StudyNextWindowAction.java
rename to python/educational/interactive-learning/src/com/jetbrains/edu/learning/actions/StudyNextWindowAction.java
index e4d3bb79d7a3..6dbcc19cef15 100644
--- a/python/edu/learn-python/src/com/jetbrains/python/edu/actions/StudyNextWindowAction.java
+++ b/python/educational/interactive-learning/src/com/jetbrains/edu/learning/actions/StudyNextWindowAction.java
@@ -1,8 +1,8 @@
-package com.jetbrains.python.edu.actions;
+package com.jetbrains.edu.learning.actions;
import com.intellij.icons.AllIcons;
-import com.jetbrains.python.edu.StudyUtils;
-import com.jetbrains.python.edu.course.TaskWindow;
+import com.jetbrains.edu.learning.StudyUtils;
+import com.jetbrains.edu.learning.course.TaskWindow;
import org.jetbrains.annotations.NotNull;
import java.util.List;
diff --git a/python/edu/learn-python/src/com/jetbrains/python/edu/actions/StudyPrevWindowAction.java b/python/educational/interactive-learning/src/com/jetbrains/edu/learning/actions/StudyPrevWindowAction.java
similarity index 75%
rename from python/edu/learn-python/src/com/jetbrains/python/edu/actions/StudyPrevWindowAction.java
rename to python/educational/interactive-learning/src/com/jetbrains/edu/learning/actions/StudyPrevWindowAction.java
index 01f6e1688b02..267944a33dc6 100644
--- a/python/edu/learn-python/src/com/jetbrains/python/edu/actions/StudyPrevWindowAction.java
+++ b/python/educational/interactive-learning/src/com/jetbrains/edu/learning/actions/StudyPrevWindowAction.java
@@ -1,8 +1,8 @@
-package com.jetbrains.python.edu.actions;
+package com.jetbrains.edu.learning.actions;
-import com.jetbrains.python.edu.StudyUtils;
-import com.jetbrains.python.edu.course.TaskWindow;
-import icons.StudyIcons;
+import com.jetbrains.edu.learning.StudyUtils;
+import com.jetbrains.edu.learning.course.TaskWindow;
+import icons.InteractiveLearningIcons;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@@ -17,7 +17,7 @@ public class StudyPrevWindowAction extends StudyWindowNavigationAction {
public static final String SHORTCUT = "ctrl shift pressed COMMA";
public StudyPrevWindowAction() {
- super("Navigate to the Previous Answer Placeholder", "Navigate to the previous answer placeholder", StudyIcons.Prev);
+ super("Navigate to the Previous Answer Placeholder", "Navigate to the previous answer placeholder", InteractiveLearningIcons.Prev);
}
diff --git a/python/edu/learn-python/src/com/jetbrains/python/edu/actions/StudyPreviousStudyTaskAction.java b/python/educational/interactive-learning/src/com/jetbrains/edu/learning/actions/StudyPreviousStudyTaskAction.java
similarity index 81%
rename from python/edu/learn-python/src/com/jetbrains/python/edu/actions/StudyPreviousStudyTaskAction.java
rename to python/educational/interactive-learning/src/com/jetbrains/edu/learning/actions/StudyPreviousStudyTaskAction.java
index 02cc36355834..1c3dc5a95cb6 100644
--- a/python/edu/learn-python/src/com/jetbrains/python/edu/actions/StudyPreviousStudyTaskAction.java
+++ b/python/educational/interactive-learning/src/com/jetbrains/edu/learning/actions/StudyPreviousStudyTaskAction.java
@@ -1,8 +1,8 @@
-package com.jetbrains.python.edu.actions;
+package com.jetbrains.edu.learning.actions;
-import com.jetbrains.python.edu.editor.StudyEditor;
-import com.jetbrains.python.edu.course.Task;
+import com.jetbrains.edu.learning.course.Task;
+import com.jetbrains.edu.learning.editor.StudyEditor;
import org.jetbrains.annotations.NotNull;
import javax.swing.*;
diff --git a/python/edu/learn-python/src/com/jetbrains/python/edu/actions/StudyRefreshTaskFileAction.java b/python/educational/interactive-learning/src/com/jetbrains/edu/learning/actions/StudyRefreshTaskFileAction.java
similarity index 95%
rename from python/edu/learn-python/src/com/jetbrains/python/edu/actions/StudyRefreshTaskFileAction.java
rename to python/educational/interactive-learning/src/com/jetbrains/edu/learning/actions/StudyRefreshTaskFileAction.java
index 9ec54b10569e..3458d252a15b 100644
--- a/python/edu/learn-python/src/com/jetbrains/python/edu/actions/StudyRefreshTaskFileAction.java
+++ b/python/educational/interactive-learning/src/com/jetbrains/edu/learning/actions/StudyRefreshTaskFileAction.java
@@ -1,4 +1,4 @@
-package com.jetbrains.python.edu.actions;
+package com.jetbrains.edu.learning.actions;
import com.intellij.ide.projectView.ProjectView;
import com.intellij.openapi.actionSystem.AnActionEvent;
@@ -18,11 +18,11 @@ import com.intellij.openapi.util.io.FileUtil;
import com.intellij.openapi.vfs.VfsUtil;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.openapi.wm.IdeFocusManager;
-import com.jetbrains.python.edu.StudyDocumentListener;
-import com.jetbrains.python.edu.StudyTaskManager;
-import com.jetbrains.python.edu.StudyUtils;
-import com.jetbrains.python.edu.course.*;
-import com.jetbrains.python.edu.editor.StudyEditor;
+import com.jetbrains.edu.learning.StudyDocumentListener;
+import com.jetbrains.edu.learning.StudyTaskManager;
+import com.jetbrains.edu.learning.StudyUtils;
+import com.jetbrains.edu.learning.course.*;
+import com.jetbrains.edu.learning.editor.StudyEditor;
import org.jetbrains.annotations.NotNull;
import java.io.File;
diff --git a/python/educational/interactive-learning/src/com/jetbrains/edu/learning/actions/StudyRunAction.java b/python/educational/interactive-learning/src/com/jetbrains/edu/learning/actions/StudyRunAction.java
new file mode 100644
index 000000000000..2cd453b0b870
--- /dev/null
+++ b/python/educational/interactive-learning/src/com/jetbrains/edu/learning/actions/StudyRunAction.java
@@ -0,0 +1,82 @@
+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.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.StudyTaskManager;
+import com.jetbrains.edu.learning.StudyUtils;
+import com.jetbrains.edu.learning.course.Task;
+import com.jetbrains.edu.learning.course.TaskFile;
+import com.jetbrains.edu.learning.editor.StudyEditor;
+import org.jetbrains.annotations.NotNull;
+
+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;
+
+ public void run(@NotNull final Project project, @NotNull final Sdk sdk) {
+ if (myHandler != null && !myHandler.isProcessTerminated()) return;
+ Editor selectedEditor = StudyEditor.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, sdk, openedFile, filePath);
+ }
+ }
+
+ private void executeFile(@NotNull final Project project, @NotNull final Sdk sdk,
+ @NotNull final VirtualFile openedFile, @NotNull final String filePath) {
+ StudyTaskManager taskManager = StudyTaskManager.getInstance(project);
+ GeneralCommandLine cmd = new GeneralCommandLine();
+ cmd.withWorkDirectory(openedFile.getParent().getCanonicalPath());
+ String sdkHomePath = sdk.getHomePath();
+ if (sdkHomePath != null) {
+ cmd.setExePath(sdkHomePath);
+ TaskFile selectedTaskFile = taskManager.getTaskFile(openedFile);
+ assert selectedTaskFile != null;
+ Task currentTask = selectedTaskFile.getTask();
+ Process process;
+ StudyUtils.setCommandLineParameters(cmd, project, filePath, sdkHomePath, currentTask);
+
+ try {
+ process = cmd.createProcess();
+ }
+ catch (ExecutionException e) {
+ LOG.error(e);
+ return;
+ }
+ myHandler = new OSProcessHandler(process);
+ RunContentExecutor executor = StudyUtils.getExecutor(project, myHandler);
+ Disposer.register(project, executor);
+ executor.run();
+
+ }
+ }
+
+ public void actionPerformed(@NotNull AnActionEvent e) {
+ Project project = e.getProject();
+ if (project == null) {
+ return;
+ }
+ Sdk sdk = StudyUtils.findSdk(project);
+ if (sdk == null) {
+ return;
+ }
+ run(project, sdk);
+ }
+}
diff --git a/python/edu/learn-python/src/com/jetbrains/python/edu/actions/StudyShowHintAction.java b/python/educational/interactive-learning/src/com/jetbrains/edu/learning/actions/StudyShowHintAction.java
similarity index 89%
rename from python/edu/learn-python/src/com/jetbrains/python/edu/actions/StudyShowHintAction.java
rename to python/educational/interactive-learning/src/com/jetbrains/edu/learning/actions/StudyShowHintAction.java
index a5d37cbd2c2e..94e3cc4bd5ef 100644
--- a/python/edu/learn-python/src/com/jetbrains/python/edu/actions/StudyShowHintAction.java
+++ b/python/educational/interactive-learning/src/com/jetbrains/edu/learning/actions/StudyShowHintAction.java
@@ -1,4 +1,4 @@
-package com.jetbrains.python.edu.actions;
+package com.jetbrains.edu.learning.actions;
import com.intellij.codeInsight.documentation.DocumentationComponent;
import com.intellij.codeInsight.documentation.DocumentationManager;
@@ -13,13 +13,13 @@ import com.intellij.openapi.util.Disposer;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiFile;
import com.intellij.psi.PsiManager;
-import com.jetbrains.python.edu.StudyState;
-import com.jetbrains.python.edu.StudyTaskManager;
-import com.jetbrains.python.edu.StudyUtils;
-import com.jetbrains.python.edu.course.Course;
-import com.jetbrains.python.edu.course.TaskWindow;
-import com.jetbrains.python.edu.editor.StudyEditor;
-import icons.StudyIcons;
+import com.jetbrains.edu.learning.StudyState;
+import com.jetbrains.edu.learning.StudyTaskManager;
+import com.jetbrains.edu.learning.StudyUtils;
+import com.jetbrains.edu.learning.course.Course;
+import com.jetbrains.edu.learning.course.TaskWindow;
+import com.jetbrains.edu.learning.editor.StudyEditor;
+import icons.InteractiveLearningIcons;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@@ -32,7 +32,7 @@ public class StudyShowHintAction extends DumbAwareAction {
public static final String HINT_NOT_AVAILABLE = "There is no hint for this answer placeholder";
public StudyShowHintAction() {
- super("Show hint", "Show hint", StudyIcons.ShowHint);
+ super("Show hint", "Show hint", InteractiveLearningIcons.ShowHint);
}
public void actionPerformed(@NotNull AnActionEvent e) {
diff --git a/python/edu/learn-python/src/com/jetbrains/python/edu/actions/StudyTaskNavigationAction.java b/python/educational/interactive-learning/src/com/jetbrains/edu/learning/actions/StudyTaskNavigationAction.java
similarity index 92%
rename from python/edu/learn-python/src/com/jetbrains/python/edu/actions/StudyTaskNavigationAction.java
rename to python/educational/interactive-learning/src/com/jetbrains/edu/learning/actions/StudyTaskNavigationAction.java
index b98bbd098776..721ff2f10ccb 100644
--- a/python/edu/learn-python/src/com/jetbrains/python/edu/actions/StudyTaskNavigationAction.java
+++ b/python/educational/interactive-learning/src/com/jetbrains/edu/learning/actions/StudyTaskNavigationAction.java
@@ -1,4 +1,4 @@
-package com.jetbrains.python.edu.actions;
+package com.jetbrains.edu.learning.actions;
import com.intellij.ide.projectView.ProjectView;
import com.intellij.openapi.actionSystem.AnActionEvent;
@@ -14,11 +14,11 @@ import com.intellij.openapi.wm.ToolWindow;
import com.intellij.openapi.wm.ToolWindowId;
import com.intellij.openapi.wm.ToolWindowManager;
import com.intellij.util.ui.tree.TreeUtil;
-import com.jetbrains.python.edu.StudyState;
-import com.jetbrains.python.edu.course.Lesson;
-import com.jetbrains.python.edu.course.Task;
-import com.jetbrains.python.edu.course.TaskFile;
-import com.jetbrains.python.edu.editor.StudyEditor;
+import com.jetbrains.edu.learning.StudyState;
+import com.jetbrains.edu.learning.course.Lesson;
+import com.jetbrains.edu.learning.course.Task;
+import com.jetbrains.edu.learning.course.TaskFile;
+import com.jetbrains.edu.learning.editor.StudyEditor;
import org.jetbrains.annotations.NotNull;
import javax.swing.*;
diff --git a/python/edu/learn-python/src/com/jetbrains/python/edu/actions/StudyWindowNavigationAction.java b/python/educational/interactive-learning/src/com/jetbrains/edu/learning/actions/StudyWindowNavigationAction.java
similarity index 87%
rename from python/edu/learn-python/src/com/jetbrains/python/edu/actions/StudyWindowNavigationAction.java
rename to python/educational/interactive-learning/src/com/jetbrains/edu/learning/actions/StudyWindowNavigationAction.java
index e401fcee021f..cc5fea2dc9ec 100644
--- a/python/edu/learn-python/src/com/jetbrains/python/edu/actions/StudyWindowNavigationAction.java
+++ b/python/educational/interactive-learning/src/com/jetbrains/edu/learning/actions/StudyWindowNavigationAction.java
@@ -1,4 +1,4 @@
-package com.jetbrains.python.edu.actions;
+package com.jetbrains.edu.learning.actions;
import com.intellij.openapi.actionSystem.AnActionEvent;
import com.intellij.openapi.editor.Editor;
@@ -6,11 +6,11 @@ import com.intellij.openapi.fileEditor.FileDocumentManager;
import com.intellij.openapi.project.DumbAwareAction;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.vfs.VirtualFile;
-import com.jetbrains.python.edu.StudyTaskManager;
-import com.jetbrains.python.edu.StudyUtils;
-import com.jetbrains.python.edu.course.TaskFile;
-import com.jetbrains.python.edu.course.TaskWindow;
-import com.jetbrains.python.edu.editor.StudyEditor;
+import com.jetbrains.edu.learning.StudyTaskManager;
+import com.jetbrains.edu.learning.StudyUtils;
+import com.jetbrains.edu.learning.course.TaskFile;
+import com.jetbrains.edu.learning.course.TaskWindow;
+import com.jetbrains.edu.learning.editor.StudyEditor;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
diff --git a/python/edu/learn-python/src/com/jetbrains/python/edu/course/Course.java b/python/educational/interactive-learning/src/com/jetbrains/edu/learning/course/Course.java
similarity index 98%
rename from python/edu/learn-python/src/com/jetbrains/python/edu/course/Course.java
rename to python/educational/interactive-learning/src/com/jetbrains/edu/learning/course/Course.java
index d461a4807151..94196dd45e26 100644
--- a/python/edu/learn-python/src/com/jetbrains/python/edu/course/Course.java
+++ b/python/educational/interactive-learning/src/com/jetbrains/edu/learning/course/Course.java
@@ -1,4 +1,4 @@
-package com.jetbrains.python.edu.course;
+package com.jetbrains.edu.learning.course;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.diagnostic.Logger;
diff --git a/python/edu/learn-python/src/com/jetbrains/python/edu/course/CourseInfo.java b/python/educational/interactive-learning/src/com/jetbrains/edu/learning/course/CourseInfo.java
similarity index 96%
rename from python/edu/learn-python/src/com/jetbrains/python/edu/course/CourseInfo.java
rename to python/educational/interactive-learning/src/com/jetbrains/edu/learning/course/CourseInfo.java
index 9f820c12c572..6cf9b18ea6d2 100644
--- a/python/edu/learn-python/src/com/jetbrains/python/edu/course/CourseInfo.java
+++ b/python/educational/interactive-learning/src/com/jetbrains/edu/learning/course/CourseInfo.java
@@ -1,4 +1,4 @@
-package com.jetbrains.python.edu.course;
+package com.jetbrains.edu.learning.course;
/**
* Implementation of class which contains information to be shawn in course description in tool window
diff --git a/python/edu/learn-python/src/com/jetbrains/python/edu/course/Lesson.java b/python/educational/interactive-learning/src/com/jetbrains/edu/learning/course/Lesson.java
similarity index 97%
rename from python/edu/learn-python/src/com/jetbrains/python/edu/course/Lesson.java
rename to python/educational/interactive-learning/src/com/jetbrains/edu/learning/course/Lesson.java
index b4a3286dfd94..34be407bf5ef 100644
--- a/python/edu/learn-python/src/com/jetbrains/python/edu/course/Lesson.java
+++ b/python/educational/interactive-learning/src/com/jetbrains/edu/learning/course/Lesson.java
@@ -1,4 +1,4 @@
-package com.jetbrains.python.edu.course;
+package com.jetbrains.edu.learning.course;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.vfs.VirtualFile;
@@ -58,7 +58,7 @@ public class Lesson implements Stateful {
*
* @param courseDir project directory of course
* @param resourceRoot directory where original lesson stored
- * @throws java.io.IOException
+ * @throws IOException
*/
public void create(@NotNull final VirtualFile courseDir, @NotNull final File resourceRoot,
@NotNull final Project project) throws IOException {
diff --git a/python/edu/learn-python/src/com/jetbrains/python/edu/course/LessonInfo.java b/python/educational/interactive-learning/src/com/jetbrains/edu/learning/course/LessonInfo.java
similarity index 96%
rename from python/edu/learn-python/src/com/jetbrains/python/edu/course/LessonInfo.java
rename to python/educational/interactive-learning/src/com/jetbrains/edu/learning/course/LessonInfo.java
index 85e2eb8be1a9..2de9bad0af6f 100644
--- a/python/edu/learn-python/src/com/jetbrains/python/edu/course/LessonInfo.java
+++ b/python/educational/interactive-learning/src/com/jetbrains/edu/learning/course/LessonInfo.java
@@ -1,4 +1,4 @@
-package com.jetbrains.python.edu.course;
+package com.jetbrains.edu.learning.course;
/**
* Implementation of class which contains information about student progress in current lesson
diff --git a/python/edu/learn-python/src/com/jetbrains/python/edu/course/Stateful.java b/python/educational/interactive-learning/src/com/jetbrains/edu/learning/course/Stateful.java
similarity index 73%
rename from python/edu/learn-python/src/com/jetbrains/python/edu/course/Stateful.java
rename to python/educational/interactive-learning/src/com/jetbrains/edu/learning/course/Stateful.java
index 3a163622f56d..4ba655e5066e 100644
--- a/python/edu/learn-python/src/com/jetbrains/python/edu/course/Stateful.java
+++ b/python/educational/interactive-learning/src/com/jetbrains/edu/learning/course/Stateful.java
@@ -1,4 +1,4 @@
-package com.jetbrains.python.edu.course;
+package com.jetbrains.edu.learning.course;
public interface Stateful {
StudyStatus getStatus();
diff --git a/python/edu/learn-python/src/com/jetbrains/python/edu/course/StudyStatus.java b/python/educational/interactive-learning/src/com/jetbrains/edu/learning/course/StudyStatus.java
similarity index 70%
rename from python/edu/learn-python/src/com/jetbrains/python/edu/course/StudyStatus.java
rename to python/educational/interactive-learning/src/com/jetbrains/edu/learning/course/StudyStatus.java
index d95b42b73866..cedcfd0fb01e 100644
--- a/python/edu/learn-python/src/com/jetbrains/python/edu/course/StudyStatus.java
+++ b/python/educational/interactive-learning/src/com/jetbrains/edu/learning/course/StudyStatus.java
@@ -1,4 +1,4 @@
-package com.jetbrains.python.edu.course;
+package com.jetbrains.edu.learning.course;
/**
* @see {@link TaskWindow#myStatus}
diff --git a/python/edu/learn-python/src/com/jetbrains/python/edu/course/Task.java b/python/educational/interactive-learning/src/com/jetbrains/edu/learning/course/Task.java
similarity index 98%
rename from python/edu/learn-python/src/com/jetbrains/python/edu/course/Task.java
rename to python/educational/interactive-learning/src/com/jetbrains/edu/learning/course/Task.java
index 0a106ff597ad..abdda07da02f 100644
--- a/python/edu/learn-python/src/com/jetbrains/python/edu/course/Task.java
+++ b/python/educational/interactive-learning/src/com/jetbrains/edu/learning/course/Task.java
@@ -1,10 +1,10 @@
-package com.jetbrains.python.edu.course;
+package com.jetbrains.edu.learning.course;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.io.FileUtil;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.util.xmlb.annotations.Transient;
-import com.jetbrains.python.edu.StudyUtils;
+import com.jetbrains.edu.learning.StudyUtils;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@@ -83,7 +83,7 @@ public class Task implements Stateful {
*
* @param lessonDir project directory of lesson which task belongs to
* @param resourceRoot directory where original task file stored
- * @throws java.io.IOException
+ * @throws IOException
*/
public void create(@NotNull final VirtualFile lessonDir, @NotNull final File resourceRoot,
@NotNull final Project project) throws IOException {
diff --git a/python/edu/learn-python/src/com/jetbrains/python/edu/course/TaskFile.java b/python/educational/interactive-learning/src/com/jetbrains/edu/learning/course/TaskFile.java
similarity index 97%
rename from python/edu/learn-python/src/com/jetbrains/python/edu/course/TaskFile.java
rename to python/educational/interactive-learning/src/com/jetbrains/edu/learning/course/TaskFile.java
index b8908b606311..1f5f7ebbbb52 100644
--- a/python/edu/learn-python/src/com/jetbrains/python/edu/course/TaskFile.java
+++ b/python/educational/interactive-learning/src/com/jetbrains/edu/learning/course/TaskFile.java
@@ -1,4 +1,4 @@
-package com.jetbrains.python.edu.course;
+package com.jetbrains.edu.learning.course;
import com.intellij.openapi.editor.Document;
import com.intellij.openapi.editor.Editor;
@@ -13,8 +13,8 @@ import com.intellij.openapi.editor.markup.RangeHighlighter;
import com.intellij.openapi.util.io.FileUtil;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.util.xmlb.annotations.Transient;
-import com.jetbrains.python.edu.StudyUtils;
-import com.jetbrains.python.edu.TaskWindowDeleteHandler;
+import com.jetbrains.edu.learning.StudyUtils;
+import com.jetbrains.edu.learning.TaskWindowDeleteHandler;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@@ -85,7 +85,7 @@ public class TaskFile implements Stateful {
*
* @param taskDir project directory of task which task file belongs to
* @param resourceRoot directory where original task file stored
- * @throws java.io.IOException
+ * @throws IOException
*/
public void create(@NotNull final VirtualFile taskDir, @NotNull final File resourceRoot,
@NotNull final String name) throws IOException {
diff --git a/python/edu/learn-python/src/com/jetbrains/python/edu/course/TaskWindow.java b/python/educational/interactive-learning/src/com/jetbrains/edu/learning/course/TaskWindow.java
similarity index 97%
rename from python/edu/learn-python/src/com/jetbrains/python/edu/course/TaskWindow.java
rename to python/educational/interactive-learning/src/com/jetbrains/edu/learning/course/TaskWindow.java
index 2229309092e7..2cd4c4ce7759 100644
--- a/python/edu/learn-python/src/com/jetbrains/python/edu/course/TaskWindow.java
+++ b/python/educational/interactive-learning/src/com/jetbrains/edu/learning/course/TaskWindow.java
@@ -1,4 +1,4 @@
-package com.jetbrains.python.edu.course;
+package com.jetbrains.edu.learning.course;
import com.intellij.execution.ExecutionException;
import com.intellij.execution.process.CapturingProcessHandler;
@@ -18,9 +18,9 @@ import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.TextRange;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.ui.JBColor;
-import com.jetbrains.python.edu.StudyDocumentListener;
-import com.jetbrains.python.edu.StudyTestRunner;
-import com.jetbrains.python.edu.StudyUtils;
+import com.jetbrains.edu.learning.StudyDocumentListener;
+import com.jetbrains.edu.learning.StudyTestRunner;
+import com.jetbrains.edu.learning.StudyUtils;
import org.jetbrains.annotations.NotNull;
import java.io.File;
diff --git a/python/edu/learn-python/src/com/jetbrains/python/edu/course/UserTest.java b/python/educational/interactive-learning/src/com/jetbrains/edu/learning/course/UserTest.java
similarity index 94%
rename from python/edu/learn-python/src/com/jetbrains/python/edu/course/UserTest.java
rename to python/educational/interactive-learning/src/com/jetbrains/edu/learning/course/UserTest.java
index 8133e9102a14..fdaffc582fff 100644
--- a/python/edu/learn-python/src/com/jetbrains/python/edu/course/UserTest.java
+++ b/python/educational/interactive-learning/src/com/jetbrains/edu/learning/course/UserTest.java
@@ -1,4 +1,4 @@
-package com.jetbrains.python.edu.course;
+package com.jetbrains.edu.learning.course;
public class UserTest {
private String input;
diff --git a/python/edu/learn-python/src/com/jetbrains/python/edu/editor/StudyEditor.java b/python/educational/interactive-learning/src/com/jetbrains/edu/learning/editor/StudyEditor.java
similarity index 95%
rename from python/edu/learn-python/src/com/jetbrains/python/edu/editor/StudyEditor.java
rename to python/educational/interactive-learning/src/com/jetbrains/edu/learning/editor/StudyEditor.java
index 14f932ede2f0..a5c7edb9291a 100644
--- a/python/edu/learn-python/src/com/jetbrains/python/edu/editor/StudyEditor.java
+++ b/python/educational/interactive-learning/src/com/jetbrains/edu/learning/editor/StudyEditor.java
@@ -1,4 +1,4 @@
-package com.jetbrains.python.edu.editor;
+package com.jetbrains.edu.learning.editor;
import com.intellij.codeHighlighting.BackgroundEditorHighlighter;
import com.intellij.icons.AllIcons;
@@ -34,13 +34,13 @@ import com.intellij.ui.HideableTitledPanel;
import com.intellij.ui.JBColor;
import com.intellij.util.ui.EmptyClipboardOwner;
import com.intellij.util.ui.UIUtil;
-import com.jetbrains.python.edu.StudyDocumentListener;
-import com.jetbrains.python.edu.StudyTaskManager;
-import com.jetbrains.python.edu.StudyUtils;
-import com.jetbrains.python.edu.actions.*;
-import com.jetbrains.python.edu.course.Task;
-import com.jetbrains.python.edu.course.TaskFile;
-import icons.StudyIcons;
+import com.jetbrains.edu.learning.StudyDocumentListener;
+import com.jetbrains.edu.learning.StudyTaskManager;
+import com.jetbrains.edu.learning.StudyUtils;
+import com.jetbrains.edu.learning.actions.*;
+import com.jetbrains.edu.learning.course.Task;
+import com.jetbrains.edu.learning.course.TaskFile;
+import icons.InteractiveLearningIcons;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@@ -205,13 +205,13 @@ public class StudyEditor implements TextEditor {
}
private void initializeButtons(@NotNull final JPanel taskActionsPanel, @NotNull final TaskFile taskFile) {
- myCheckButton = addButton(taskActionsPanel, StudyCheckAction.ACTION_ID, StudyIcons.Resolve, StudyCheckAction.SHORTCUT);
- myPrevTaskButton = addButton(taskActionsPanel, StudyPreviousStudyTaskAction.ACTION_ID, StudyIcons.Prev, StudyPreviousStudyTaskAction.SHORTCUT);
+ myCheckButton = addButton(taskActionsPanel, StudyCheckAction.ACTION_ID, InteractiveLearningIcons.Resolve, StudyCheckAction.SHORTCUT);
+ myPrevTaskButton = addButton(taskActionsPanel, StudyPreviousStudyTaskAction.ACTION_ID, InteractiveLearningIcons.Prev, StudyPreviousStudyTaskAction.SHORTCUT);
myNextTaskButton = addButton(taskActionsPanel, StudyNextStudyTaskAction.ACTION_ID, AllIcons.Actions.Forward, StudyNextStudyTaskAction.SHORTCUT);
myRefreshButton = addButton(taskActionsPanel, StudyRefreshTaskFileAction.ACTION_ID, AllIcons.Actions.Refresh, StudyRefreshTaskFileAction.SHORTCUT);
- JButton myShowHintButton = addButton(taskActionsPanel, StudyShowHintAction.ACTION_ID, StudyIcons.ShowHint, StudyShowHintAction.SHORTCUT);
+ JButton myShowHintButton = addButton(taskActionsPanel, StudyShowHintAction.ACTION_ID, InteractiveLearningIcons.ShowHint, StudyShowHintAction.SHORTCUT);
if (!taskFile.getTask().getUserTests().isEmpty()) {
- final Sdk sdk = StudyUtils.findPythonSdk(myProject);
+ final Sdk sdk = StudyUtils.findSdk(myProject);
if (sdk != null) {
JButton runButton = addButton(taskActionsPanel, StudyRunAction.ACTION_ID, AllIcons.General.Run, null);
runButton.addActionListener(new ActionListener() {
@@ -221,7 +221,7 @@ public class StudyEditor implements TextEditor {
studyRunAction.run(myProject, sdk);
}
});
- JButton watchInputButton = addButton(taskActionsPanel, "WatchInputAction", StudyIcons.WatchInput, null);
+ JButton watchInputButton = addButton(taskActionsPanel, "WatchInputAction", InteractiveLearningIcons.WatchInput, null);
watchInputButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
diff --git a/python/edu/learn-python/src/com/jetbrains/python/edu/editor/StudyFileEditorProvider.java b/python/educational/interactive-learning/src/com/jetbrains/edu/learning/editor/StudyFileEditorProvider.java
similarity index 93%
rename from python/edu/learn-python/src/com/jetbrains/python/edu/editor/StudyFileEditorProvider.java
rename to python/educational/interactive-learning/src/com/jetbrains/edu/learning/editor/StudyFileEditorProvider.java
index 631b5a9eaf4c..ae8df1652681 100644
--- a/python/edu/learn-python/src/com/jetbrains/python/edu/editor/StudyFileEditorProvider.java
+++ b/python/educational/interactive-learning/src/com/jetbrains/edu/learning/editor/StudyFileEditorProvider.java
@@ -1,4 +1,4 @@
-package com.jetbrains.python.edu.editor;
+package com.jetbrains.edu.learning.editor;
import com.intellij.openapi.fileEditor.FileEditor;
import com.intellij.openapi.fileEditor.FileEditorPolicy;
@@ -8,10 +8,10 @@ import com.intellij.openapi.fileEditor.impl.text.TextEditorProvider;
import com.intellij.openapi.project.DumbAware;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.vfs.VirtualFile;
+import com.jetbrains.edu.learning.StudyTaskManager;
+import com.jetbrains.edu.learning.course.TaskFile;
import org.jdom.Element;
import org.jetbrains.annotations.NotNull;
-import com.jetbrains.python.edu.StudyTaskManager;
-import com.jetbrains.python.edu.course.TaskFile;
/**
* User: lia
diff --git a/python/edu/learn-python/src/com/jetbrains/python/edu/projectView/StudyDirectoryNode.java b/python/educational/interactive-learning/src/com/jetbrains/edu/learning/projectView/StudyDirectoryNode.java
similarity index 89%
rename from python/edu/learn-python/src/com/jetbrains/python/edu/projectView/StudyDirectoryNode.java
rename to python/educational/interactive-learning/src/com/jetbrains/edu/learning/projectView/StudyDirectoryNode.java
index 4bd8df9baee7..a76e98ca50de 100644
--- a/python/edu/learn-python/src/com/jetbrains/python/edu/projectView/StudyDirectoryNode.java
+++ b/python/educational/interactive-learning/src/com/jetbrains/edu/learning/projectView/StudyDirectoryNode.java
@@ -1,4 +1,4 @@
-package com.jetbrains.python.edu.projectView;
+package com.jetbrains.edu.learning.projectView;
import com.intellij.ide.projectView.PresentationData;
import com.intellij.ide.projectView.ProjectView;
@@ -11,10 +11,10 @@ import com.intellij.psi.PsiDirectory;
import com.intellij.psi.PsiElement;
import com.intellij.ui.JBColor;
import com.intellij.ui.SimpleTextAttributes;
-import com.jetbrains.python.edu.StudyTaskManager;
-import com.jetbrains.python.edu.StudyUtils;
-import com.jetbrains.python.edu.course.*;
-import icons.StudyIcons;
+import com.jetbrains.edu.learning.StudyTaskManager;
+import com.jetbrains.edu.learning.StudyUtils;
+import com.jetbrains.edu.learning.course.*;
+import icons.InteractiveLearningIcons;
import org.jetbrains.annotations.NotNull;
import javax.swing.*;
@@ -35,7 +35,7 @@ public class StudyDirectoryNode extends PsiDirectoryNode {
@Override
protected void updateImpl(PresentationData data) {
- data.setIcon(StudyIcons.Task);
+ data.setIcon(InteractiveLearningIcons.Task);
String valueName = myValue.getName();
StudyTaskManager studyTaskManager = StudyTaskManager.getInstance(myProject);
Course course = studyTaskManager.getCourse();
@@ -72,7 +72,7 @@ public class StudyDirectoryNode extends PsiDirectoryNode {
if (myValue.getParent() != null) {
if (!myValue.getParent().getName().contains(Course.SANDBOX_DIR)) {
data.setPresentableText(Course.SANDBOX_DIR);
- data.setIcon(StudyIcons.Sandbox);
+ data.setIcon(InteractiveLearningIcons.Sandbox);
return;
}
}
@@ -94,16 +94,16 @@ public class StudyDirectoryNode extends PsiDirectoryNode {
StudyStatus taskStatus = stateful.getStatus();
switch (taskStatus) {
case Unchecked: {
- updatePresentation(data, additionalName, JBColor.BLACK, stateful instanceof Lesson ? StudyIcons.Lesson : StudyIcons.Task);
+ updatePresentation(data, additionalName, JBColor.BLACK, stateful instanceof Lesson ? InteractiveLearningIcons.Lesson : InteractiveLearningIcons.Task);
break;
}
case Solved: {
updatePresentation(data, additionalName, new JBColor(new Color(0, 134, 0), new Color(98, 150, 85)),
- stateful instanceof Lesson ? StudyIcons.LessonCompl : StudyIcons.TaskCompl);
+ stateful instanceof Lesson ? InteractiveLearningIcons.LessonCompl : InteractiveLearningIcons.TaskCompl);
break;
}
case Failed: {
- updatePresentation(data, additionalName, JBColor.RED, stateful instanceof Lesson ? StudyIcons.Lesson : StudyIcons.TaskProbl);
+ updatePresentation(data, additionalName, JBColor.RED, stateful instanceof Lesson ? InteractiveLearningIcons.Lesson : InteractiveLearningIcons.TaskProbl);
}
}
}
diff --git a/python/edu/learn-python/src/com/jetbrains/python/edu/projectView/StudyTreeStructureProvider.java b/python/educational/interactive-learning/src/com/jetbrains/edu/learning/projectView/StudyTreeStructureProvider.java
similarity index 91%
rename from python/edu/learn-python/src/com/jetbrains/python/edu/projectView/StudyTreeStructureProvider.java
rename to python/educational/interactive-learning/src/com/jetbrains/edu/learning/projectView/StudyTreeStructureProvider.java
index 29b328a5da45..375a350f8bbb 100644
--- a/python/edu/learn-python/src/com/jetbrains/python/edu/projectView/StudyTreeStructureProvider.java
+++ b/python/educational/interactive-learning/src/com/jetbrains/edu/learning/projectView/StudyTreeStructureProvider.java
@@ -1,4 +1,4 @@
-package com.jetbrains.python.edu.projectView;
+package com.jetbrains.edu.learning.projectView;
import com.intellij.ide.projectView.TreeStructureProvider;
import com.intellij.ide.projectView.ViewSettings;
@@ -8,10 +8,10 @@ import com.intellij.openapi.project.DumbAware;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.PsiDirectory;
-import com.jetbrains.python.edu.StudyTaskManager;
-import com.jetbrains.python.edu.course.Course;
-import com.jetbrains.python.edu.course.Task;
-import com.jetbrains.python.edu.course.TaskFile;
+import com.jetbrains.edu.learning.StudyTaskManager;
+import com.jetbrains.edu.learning.course.Course;
+import com.jetbrains.edu.learning.course.Task;
+import com.jetbrains.edu.learning.course.TaskFile;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
diff --git a/python/edu/learn-python/src/com/jetbrains/python/edu/ui/StudyCondition.java b/python/educational/interactive-learning/src/com/jetbrains/edu/learning/ui/StudyCondition.java
similarity index 86%
rename from python/edu/learn-python/src/com/jetbrains/python/edu/ui/StudyCondition.java
rename to python/educational/interactive-learning/src/com/jetbrains/edu/learning/ui/StudyCondition.java
index 5add6c934ecd..9d82fa4813a3 100644
--- a/python/edu/learn-python/src/com/jetbrains/python/edu/ui/StudyCondition.java
+++ b/python/educational/interactive-learning/src/com/jetbrains/edu/learning/ui/StudyCondition.java
@@ -1,9 +1,9 @@
-package com.jetbrains.python.edu.ui;
+package com.jetbrains.edu.learning.ui;
import com.intellij.openapi.project.DumbAware;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.Condition;
-import com.jetbrains.python.edu.StudyTaskManager;
+import com.jetbrains.edu.learning.StudyTaskManager;
/**
* author: liana
diff --git a/python/edu/learn-python/src/com/jetbrains/python/edu/ui/StudyNewProjectPanel.form b/python/educational/interactive-learning/src/com/jetbrains/edu/learning/ui/StudyNewProjectPanel.form
similarity index 98%
rename from python/edu/learn-python/src/com/jetbrains/python/edu/ui/StudyNewProjectPanel.form
rename to python/educational/interactive-learning/src/com/jetbrains/edu/learning/ui/StudyNewProjectPanel.form
index 8dd6506d710c..e6d745da6a7b 100644
--- a/python/edu/learn-python/src/com/jetbrains/python/edu/ui/StudyNewProjectPanel.form
+++ b/python/educational/interactive-learning/src/com/jetbrains/edu/learning/ui/StudyNewProjectPanel.form
@@ -1,5 +1,5 @@
-