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); + } }