merge CCLanguageConfigurator to EduPluginConfigurator (EDU-895)

This commit is contained in:
Liana.Bakradze
2017-03-23 13:43:29 +03:00
parent cbfdfdf8e0
commit 1dde26b6f7
11 changed files with 88 additions and 124 deletions
@@ -44,12 +44,6 @@
</component>
</project-components>
<extensionPoints>
<extensionPoint qualifiedName="Edu.CCLanguageManager" beanClass="com.intellij.lang.LanguageExtensionPoint">
<with attribute="implementationClass" implements="com.jetbrains.edu.coursecreator.CCLanguageManager"/>
</extensionPoint>
</extensionPoints>
<actions>
<action id="CreateLesson" class="com.jetbrains.edu.coursecreator.actions.CCCreateLesson">
<add-to-group group-id="NewGroup" anchor="before" relative-to-action="NewFile"/>
@@ -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<CCLanguageManager> 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) {}
}
@@ -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) {
@@ -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;
}
@@ -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);
@@ -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) {
@@ -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<EduPluginConfigurator> 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) {}
}
@@ -5,10 +5,6 @@
<runConfigurationProducer implementation="com.jetbrains.edu.coursecreator.run.PyCCRunTestsConfigurationProducer"/>
</extensions>
<extensions defaultExtensionNs="Edu">
<CCLanguageManager implementationClass="com.jetbrains.edu.coursecreator.PyCCLanguageManager" language="Python"/>
</extensions>
<actions>
<action class="com.jetbrains.edu.coursecreator.PyCCCreateProjectFromArchive" id="PyCC.NewEdu">
<add-to-group group-id="CCFileGroup" anchor="last"/>
@@ -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);
}
}
@@ -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) :
@@ -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);
}
}