diff --git a/python/educational-core/course-creator/resources/META-INF/plugin.xml b/python/educational-core/course-creator/resources/META-INF/plugin.xml
index 5868e90d9c03..96971c1ea88e 100644
--- a/python/educational-core/course-creator/resources/META-INF/plugin.xml
+++ b/python/educational-core/course-creator/resources/META-INF/plugin.xml
@@ -44,12 +44,6 @@
-
-
-
-
-
-
diff --git a/python/educational-core/course-creator/src/com/jetbrains/edu/coursecreator/CCLanguageManager.java b/python/educational-core/course-creator/src/com/jetbrains/edu/coursecreator/CCLanguageManager.java
deleted file mode 100644
index 3b4910d66051..000000000000
--- a/python/educational-core/course-creator/src/com/jetbrains/edu/coursecreator/CCLanguageManager.java
+++ /dev/null
@@ -1,21 +0,0 @@
-package com.jetbrains.edu.coursecreator;
-
-import com.intellij.lang.LanguageExtension;
-import com.intellij.openapi.project.Project;
-import com.intellij.openapi.vfs.VirtualFile;
-import com.jetbrains.edu.learning.courseFormat.Task;
-import org.jetbrains.annotations.NotNull;
-
-import java.io.File;
-
-public interface CCLanguageManager {
- LanguageExtension INSTANCE = new LanguageExtension<>("Edu.CCLanguageManager");
-
- boolean doNotPackFile(File pathname);
-
- default boolean isTestFile(VirtualFile file) {
- return false;
- }
-
- default void createTestsForNewSubtask(@NotNull Project project, @NotNull Task task) {}
-}
diff --git a/python/educational-core/course-creator/src/com/jetbrains/edu/coursecreator/CCUtils.java b/python/educational-core/course-creator/src/com/jetbrains/edu/coursecreator/CCUtils.java
index afb7c8962fe3..f8a11fe946b1 100644
--- a/python/educational-core/course-creator/src/com/jetbrains/edu/coursecreator/CCUtils.java
+++ b/python/educational-core/course-creator/src/com/jetbrains/edu/coursecreator/CCUtils.java
@@ -2,7 +2,6 @@ package com.jetbrains.edu.coursecreator;
import com.google.common.base.Predicate;
import com.google.common.collect.Collections2;
-import com.intellij.lang.Language;
import com.intellij.openapi.actionSystem.AnActionEvent;
import com.intellij.openapi.actionSystem.Presentation;
import com.intellij.openapi.application.ApplicationManager;
@@ -19,6 +18,7 @@ import com.intellij.openapi.vfs.LocalFileSystem;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.PsiDirectory;
import com.intellij.util.Function;
+import com.jetbrains.edu.learning.EduPluginConfigurator;
import com.jetbrains.edu.learning.StudyTaskManager;
import com.jetbrains.edu.learning.StudyUtils;
import com.jetbrains.edu.learning.core.EduNames;
@@ -66,12 +66,6 @@ public class CCUtils {
}
}
- @Nullable
- public static CCLanguageManager getStudyLanguageManager(@NotNull final Course course) {
- Language language = Language.findLanguageByID(course.getLanguageID());
- return language == null ? null : CCLanguageManager.INSTANCE.forLanguage(language);
- }
-
/**
* This method decreases index and updates directory names of
* all tasks/lessons that have higher index than specified object
@@ -206,11 +200,11 @@ public class CCUtils {
if (course == null) {
return false;
}
- CCLanguageManager manager = getStudyLanguageManager(course);
- if (manager == null) {
+ EduPluginConfigurator configurator = EduPluginConfigurator.INSTANCE.forLanguage(course.getLanguageById());
+ if (configurator == null) {
return false;
}
- return manager.isTestFile(file);
+ return configurator.isTestFile(file);
}
public static void createResourceFile(VirtualFile createdFile, Course course, VirtualFile taskVF) {
diff --git a/python/educational-core/course-creator/src/com/jetbrains/edu/coursecreator/CCVirtualFileListener.java b/python/educational-core/course-creator/src/com/jetbrains/edu/coursecreator/CCVirtualFileListener.java
index 0cbf5af75324..de640230b157 100644
--- a/python/educational-core/course-creator/src/com/jetbrains/edu/coursecreator/CCVirtualFileListener.java
+++ b/python/educational-core/course-creator/src/com/jetbrains/edu/coursecreator/CCVirtualFileListener.java
@@ -6,6 +6,7 @@ import com.intellij.openapi.util.io.FileUtil;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.openapi.vfs.VirtualFileAdapter;
import com.intellij.openapi.vfs.VirtualFileEvent;
+import com.jetbrains.edu.learning.EduPluginConfigurator;
import com.jetbrains.edu.learning.StudyTaskManager;
import com.jetbrains.edu.learning.StudyUtils;
import com.jetbrains.edu.learning.core.EduNames;
@@ -46,8 +47,8 @@ public class CCVirtualFileListener extends VirtualFileAdapter {
String taskRelativePath = StudyUtils.pathRelativeToTask(createdFile);
- CCLanguageManager manager = CCUtils.getStudyLanguageManager(course);
- if (manager != null && manager.doNotPackFile(new File(createdFile.getPath()))) {
+ EduPluginConfigurator configurator = EduPluginConfigurator.INSTANCE.forLanguage(course.getLanguageById());
+ if (configurator != null && configurator.excludeFromArchive(new File(createdFile.getPath()))) {
return;
}
diff --git a/python/educational-core/course-creator/src/com/jetbrains/edu/coursecreator/actions/CCCreateCourseArchive.java b/python/educational-core/course-creator/src/com/jetbrains/edu/coursecreator/actions/CCCreateCourseArchive.java
index ed3623e7a863..f777b7022424 100644
--- a/python/educational-core/course-creator/src/com/jetbrains/edu/coursecreator/actions/CCCreateCourseArchive.java
+++ b/python/educational-core/course-creator/src/com/jetbrains/edu/coursecreator/actions/CCCreateCourseArchive.java
@@ -21,9 +21,9 @@ import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.openapi.vfs.VirtualFileManager;
import com.intellij.util.containers.ContainerUtil;
import com.intellij.util.io.ZipUtil;
-import com.jetbrains.edu.coursecreator.CCLanguageManager;
import com.jetbrains.edu.coursecreator.CCUtils;
import com.jetbrains.edu.coursecreator.ui.CreateCourseArchiveDialog;
+import com.jetbrains.edu.learning.EduPluginConfigurator;
import com.jetbrains.edu.learning.StudyTaskManager;
import com.jetbrains.edu.learning.core.EduNames;
import com.jetbrains.edu.learning.core.EduUtils;
@@ -88,17 +88,17 @@ public class CCCreateCourseArchive extends DumbAwareAction {
return;
}
- CCLanguageManager manager = CCUtils.getStudyLanguageManager(course);
- if (manager == null) {
+ EduPluginConfigurator configurator = EduPluginConfigurator.INSTANCE.forLanguage(course.getLanguageById());
+ if (configurator == null) {
return;
}
- FileFilter filter = pathname -> !manager.doNotPackFile(pathname);
+ FileFilter filter = pathname -> !configurator.excludeFromArchive(pathname);
for (VirtualFile child : baseDir.getChildren()) {
String name = child.getName();
File fromFile = new File(child.getPath());
if (CCUtils.GENERATED_FILES_FOLDER.equals(name) || Project.DIRECTORY_STORE_FOLDER.equals(name)
- || name.contains("iml") || manager.doNotPackFile(fromFile)) {
+ || name.contains("iml") || configurator.excludeFromArchive(fromFile)) {
continue;
}
copyChild(archiveFolder, filter, child, fromFile);
diff --git a/python/educational-core/course-creator/src/com/jetbrains/edu/coursecreator/actions/CCNewSubtaskAction.java b/python/educational-core/course-creator/src/com/jetbrains/edu/coursecreator/actions/CCNewSubtaskAction.java
index 304d4bc830c3..f7e013453d3c 100644
--- a/python/educational-core/course-creator/src/com/jetbrains/edu/coursecreator/actions/CCNewSubtaskAction.java
+++ b/python/educational-core/course-creator/src/com/jetbrains/edu/coursecreator/actions/CCNewSubtaskAction.java
@@ -16,9 +16,9 @@ import com.intellij.openapi.util.io.FileUtilRt;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.PsiDirectory;
import com.intellij.psi.PsiManager;
-import com.jetbrains.edu.coursecreator.CCLanguageManager;
import com.jetbrains.edu.coursecreator.CCUtils;
import com.jetbrains.edu.coursecreator.settings.CCSettings;
+import com.jetbrains.edu.learning.EduPluginConfigurator;
import com.jetbrains.edu.learning.StudySubtaskUtils;
import com.jetbrains.edu.learning.StudyTaskManager;
import com.jetbrains.edu.learning.StudyUtils;
@@ -69,11 +69,11 @@ public class CCNewSubtaskAction extends DumbAwareAction {
if (course == null) {
return;
}
- CCLanguageManager manager = CCUtils.getStudyLanguageManager(course);
- if (manager == null) {
+ EduPluginConfigurator configurator = EduPluginConfigurator.INSTANCE.forLanguage(course.getLanguageById());
+ if (configurator == null) {
return;
}
- manager.createTestsForNewSubtask(project, task);
+ configurator.createTestsForNewSubtask(project, task);
}
private static void createTaskDescriptionFile(Project project, VirtualFile taskDir, int index) {
diff --git a/python/educational-core/student/src/com/jetbrains/edu/learning/EduPluginConfigurator.java b/python/educational-core/student/src/com/jetbrains/edu/learning/EduPluginConfigurator.java
index 6c5fa4ce3b2a..c7d4e225c059 100644
--- a/python/educational-core/student/src/com/jetbrains/edu/learning/EduPluginConfigurator.java
+++ b/python/educational-core/student/src/com/jetbrains/edu/learning/EduPluginConfigurator.java
@@ -5,13 +5,17 @@ import com.intellij.ide.util.DirectoryUtil;
import com.intellij.lang.LanguageExtension;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.project.Project;
+import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.PsiDirectory;
import com.jetbrains.edu.learning.core.EduNames;
import com.jetbrains.edu.learning.courseFormat.Course;
import com.jetbrains.edu.learning.courseFormat.StudyItem;
+import com.jetbrains.edu.learning.courseFormat.Task;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
+import java.io.File;
+
public interface EduPluginConfigurator {
LanguageExtension INSTANCE = new LanguageExtension<>("Edu.pluginConfigurator");
@@ -42,4 +46,12 @@ public interface EduPluginConfigurator {
void createTaskContent(@NotNull Project project,
@Nullable IdeView view,
PsiDirectory taskDirectory);
+
+ boolean excludeFromArchive(File pathname);
+
+ default boolean isTestFile(VirtualFile file) {
+ return false;
+ }
+
+ default void createTestsForNewSubtask(@NotNull Project project, @NotNull Task task) {}
}
diff --git a/python/educational-python/Edu-Python/resources/META-INF/course-creator.xml b/python/educational-python/Edu-Python/resources/META-INF/course-creator.xml
index 29d74733ee4e..43ff543c147e 100644
--- a/python/educational-python/Edu-Python/resources/META-INF/course-creator.xml
+++ b/python/educational-python/Edu-Python/resources/META-INF/course-creator.xml
@@ -5,10 +5,6 @@
-
-
-
-
diff --git a/python/educational-python/Edu-Python/src/com/jetbrains/edu/coursecreator/PyCCLanguageManager.java b/python/educational-python/Edu-Python/src/com/jetbrains/edu/coursecreator/PyCCLanguageManager.java
deleted file mode 100644
index 1c8b87b9bf69..000000000000
--- a/python/educational-python/Edu-Python/src/com/jetbrains/edu/coursecreator/PyCCLanguageManager.java
+++ /dev/null
@@ -1,70 +0,0 @@
-package com.jetbrains.edu.coursecreator;
-
-import com.intellij.ide.fileTemplates.FileTemplate;
-import com.intellij.ide.fileTemplates.FileTemplateManager;
-import com.intellij.ide.fileTemplates.FileTemplateUtil;
-import com.intellij.openapi.application.ApplicationManager;
-import com.intellij.openapi.diagnostic.Logger;
-import com.intellij.openapi.project.Project;
-import com.intellij.openapi.util.io.FileUtil;
-import com.intellij.openapi.util.io.FileUtilRt;
-import com.intellij.openapi.vfs.VirtualFile;
-import com.intellij.psi.PsiDirectory;
-import com.intellij.psi.PsiManager;
-import com.jetbrains.edu.learning.StudyUtils;
-import com.jetbrains.edu.learning.core.EduNames;
-import com.jetbrains.edu.learning.courseFormat.Task;
-import org.jetbrains.annotations.NotNull;
-
-import java.io.File;
-
-public class PyCCLanguageManager implements CCLanguageManager {
- private static final Logger LOG = Logger.getInstance(PyCCLanguageManager.class);
-
- @Override
- public boolean doNotPackFile(File pathname) {
- String name = pathname.getName();
- return name.contains("__pycache__") || name.contains(".pyc");
- }
-
- @Override
- public boolean isTestFile(VirtualFile file) {
- String name = file.getName();
- if (EduNames.TESTS_FILE.equals(name)) {
- return true;
- }
- return name.contains(FileUtil.getNameWithoutExtension(EduNames.TESTS_FILE)) && name.contains(EduNames.SUBTASK_MARKER);
- }
-
- @Override
- public void createTestsForNewSubtask(@NotNull Project project, @NotNull Task task) {
- VirtualFile taskDir = task.getTaskDir(project);
- if (taskDir == null) {
- return;
- }
- int nextSubtaskIndex = task.getLastSubtaskIndex() + 1;
- String nextSubtaskTestsFileName = getSubtaskTestsFileName(nextSubtaskIndex);
- ApplicationManager.getApplication().runWriteAction(() -> {
- try {
- PsiDirectory taskPsiDir = PsiManager.getInstance(project).findDirectory(taskDir);
- FileTemplate testsTemplate = FileTemplateManager.getInstance(project).getInternalTemplate(EduNames.TESTS_FILE);
- if (taskPsiDir == null || testsTemplate == null) {
- return;
- }
- FileTemplateUtil.createFromTemplate(testsTemplate, nextSubtaskTestsFileName, null, taskPsiDir);
- StudyUtils.createFromTemplate(project, taskPsiDir, nextSubtaskTestsFileName, null, false);
- }
- catch (Exception e) {
- LOG.error(e);
- }
- });
- }
-
- @NotNull
- public static String getSubtaskTestsFileName(int index) {
- return index == 0 ? EduNames.TESTS_FILE : FileUtil.getNameWithoutExtension(EduNames.TESTS_FILE) +
- EduNames.SUBTASK_MARKER +
- index + "." +
- FileUtilRt.getExtension(EduNames.TESTS_FILE);
- }
-}
\ No newline at end of file
diff --git a/python/educational-python/Edu-Python/src/com/jetbrains/edu/coursecreator/run/PyCCRunTestsConfigurationProducer.java b/python/educational-python/Edu-Python/src/com/jetbrains/edu/coursecreator/run/PyCCRunTestsConfigurationProducer.java
index c61ecd00d982..b57bb864b644 100644
--- a/python/educational-python/Edu-Python/src/com/jetbrains/edu/coursecreator/run/PyCCRunTestsConfigurationProducer.java
+++ b/python/educational-python/Edu-Python/src/com/jetbrains/edu/coursecreator/run/PyCCRunTestsConfigurationProducer.java
@@ -10,7 +10,7 @@ import com.intellij.openapi.vfs.LocalFileSystem;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.PsiElement;
import com.jetbrains.edu.coursecreator.CCUtils;
-import com.jetbrains.edu.coursecreator.PyCCLanguageManager;
+import com.jetbrains.edu.learning.PyEduPluginConfigurator;
import com.jetbrains.edu.learning.StudyUtils;
import com.jetbrains.edu.learning.core.EduNames;
import com.jetbrains.edu.learning.courseFormat.Task;
@@ -87,7 +87,7 @@ public class PyCCRunTestsConfigurationProducer extends RunConfigurationProducer<
if (task == null) {
return null;
}
- String testsFileName = PyCCLanguageManager.getSubtaskTestsFileName(task.getActiveSubtaskIndex());
+ String testsFileName = PyEduPluginConfigurator.getSubtaskTestsFileName(task.getActiveSubtaskIndex());
String taskDirPath = FileUtil.toSystemDependentName(taskDir.getPath());
String testsPath = taskDir.findChild(EduNames.SRC) != null ?
FileUtil.join(taskDirPath, EduNames.SRC, testsFileName) :
diff --git a/python/educational-python/Edu-Python/src/com/jetbrains/edu/learning/PyEduPluginConfigurator.java b/python/educational-python/Edu-Python/src/com/jetbrains/edu/learning/PyEduPluginConfigurator.java
index 1733d6f0ca97..abc9917700fd 100644
--- a/python/educational-python/Edu-Python/src/com/jetbrains/edu/learning/PyEduPluginConfigurator.java
+++ b/python/educational-python/Edu-Python/src/com/jetbrains/edu/learning/PyEduPluginConfigurator.java
@@ -1,22 +1,34 @@
package com.jetbrains.edu.learning;
import com.intellij.ide.IdeView;
+import com.intellij.ide.fileTemplates.FileTemplate;
+import com.intellij.ide.fileTemplates.FileTemplateManager;
+import com.intellij.ide.fileTemplates.FileTemplateUtil;
import com.intellij.ide.util.DirectoryUtil;
import com.intellij.openapi.application.ApplicationManager;
+import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.Ref;
+import com.intellij.openapi.util.io.FileUtil;
+import com.intellij.openapi.util.io.FileUtilRt;
+import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.PsiDirectory;
+import com.intellij.psi.PsiManager;
import com.jetbrains.edu.coursecreator.settings.CCSettings;
import com.jetbrains.edu.learning.core.EduNames;
import com.jetbrains.edu.learning.courseFormat.Course;
import com.jetbrains.edu.learning.courseFormat.StudyItem;
+import com.jetbrains.edu.learning.courseFormat.Task;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
+import java.io.File;
+
public class PyEduPluginConfigurator implements EduPluginConfigurator {
public static final String PYTHON_3 = "3.x";
public static final String PYTHON_2 = "2.x";
private static final String TESTS_PY = "tests.py";
+ private static final Logger LOG = Logger.getInstance(PyEduPluginConfigurator.class);
@NotNull
@Override
@@ -51,4 +63,50 @@ public class PyEduPluginConfigurator implements EduPluginConfigurator {
StudyUtils.getTaskDescriptionFileName(CCSettings.getInstance().useHtmlAsDefaultTaskFormat()), view,
false);
}
+
+ @Override
+ public boolean excludeFromArchive(File pathname) {
+ String name = pathname.getName();
+ return name.contains("__pycache__") || name.contains(".pyc");
+ }
+
+ @Override
+ public boolean isTestFile(VirtualFile file) {
+ String name = file.getName();
+ if (EduNames.TESTS_FILE.equals(name)) {
+ return true;
+ }
+ return name.contains(FileUtil.getNameWithoutExtension(EduNames.TESTS_FILE)) && name.contains(EduNames.SUBTASK_MARKER);
+ }
+
+ @Override
+ public void createTestsForNewSubtask(@NotNull Project project, @NotNull Task task) {
+ VirtualFile taskDir = task.getTaskDir(project);
+ if (taskDir == null) {
+ return;
+ }
+ int nextSubtaskIndex = task.getLastSubtaskIndex() + 1;
+ String nextSubtaskTestsFileName = getSubtaskTestsFileName(nextSubtaskIndex);
+ ApplicationManager.getApplication().runWriteAction(() -> {
+ try {
+ PsiDirectory taskPsiDir = PsiManager.getInstance(project).findDirectory(taskDir);
+ FileTemplate testsTemplate = FileTemplateManager.getInstance(project).getInternalTemplate(EduNames.TESTS_FILE);
+ if (taskPsiDir == null || testsTemplate == null) {
+ return;
+ }
+ FileTemplateUtil.createFromTemplate(testsTemplate, nextSubtaskTestsFileName, null, taskPsiDir);
+ }
+ catch (Exception e) {
+ LOG.error(e);
+ }
+ });
+ }
+
+ @NotNull
+ public static String getSubtaskTestsFileName(int index) {
+ return index == 0 ? EduNames.TESTS_FILE : FileUtil.getNameWithoutExtension(EduNames.TESTS_FILE) +
+ EduNames.SUBTASK_MARKER +
+ index + "." +
+ FileUtilRt.getExtension(EduNames.TESTS_FILE);
+ }
}