import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
+import java.io.File;
+
public class PyStudyLanguageManager implements StudyLanguageManager {
@Nullable
@Override
return getInternalTemplateByName(project, "tests.py");
}
+ @Override
+ public boolean packFile(File pathname) {
+ String name = pathname.getName();
+ return !name.contains("__pycache__") && !name.contains(".pyc");
+ }
+
+ @Override
+ public String[] getAdditionalFilesToPack() {
+ return new String[]{"test_helper.py"};
+ }
+
private static FileTemplate getInternalTemplateByName(@NotNull final Project project, String name) {
return FileTemplateManager.getInstance(project).getInternalTemplate(name);
}
import com.intellij.openapi.editor.Document;
import com.intellij.openapi.editor.Editor;
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.openapi.vfs.VirtualFileManager;
import com.intellij.util.xmlb.XmlSerializer;
return Integer.parseInt(fullName.substring(logicalName.length())) - 1;
}
public static String getRealTaskFileName(String name) {
- if (!name.contains(".answer")) {
+ String nameWithoutExtension = FileUtil.getNameWithoutExtension(name);
+ String extension = FileUtilRt.getExtension(name);
+ if (!nameWithoutExtension.endsWith(".answer")) {
return null;
}
int nameEnd = name.indexOf(".answer");
- return name.substring(0, nameEnd) + ".py";
+ return name.substring(0, nameEnd) + "." + extension;
}
public static boolean setCCActionAvailable(@NotNull AnActionEvent e) {
package com.jetbrains.edu.coursecreator;
import com.intellij.ide.projectView.actions.MarkRootActionBase;
+import com.intellij.lang.Language;
import com.intellij.openapi.actionSystem.AnActionEvent;
import com.intellij.openapi.actionSystem.Presentation;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.roots.ModifiableRootModel;
import com.intellij.openapi.roots.ModuleRootManager;
import com.intellij.openapi.vfs.VirtualFile;
+import com.jetbrains.edu.coursecreator.format.Course;
import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
public class CCUtils {
private static final Logger LOG = Logger.getInstance(CCUtils.class.getName());
return -1;
}
}
+
+ @Nullable
+ public static StudyLanguageManager getStudyLanguageManager(@NotNull final Course course) {
+ Language language = Language.findLanguageByID(course.getLanguage());
+ return language == null ? null : StudyLanguageManager.INSTANCE.forLanguage(language);
+ }
}
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
+import java.io.File;
+
public interface StudyLanguageManager {
LanguageExtension<StudyLanguageManager> INSTANCE = new LanguageExtension<StudyLanguageManager>("Edu.StudyLanguageManager");
@Nullable
FileTemplate getTestsTemplate(@NotNull final Project project);
+
+ boolean packFile(File pathname);
+
+ String[] getAdditionalFilesToPack();
}
import com.intellij.util.io.ZipUtil;
import com.jetbrains.edu.coursecreator.CCDocumentListener;
import com.jetbrains.edu.coursecreator.CCProjectService;
+import com.jetbrains.edu.coursecreator.CCUtils;
+import com.jetbrains.edu.coursecreator.StudyLanguageManager;
import com.jetbrains.edu.coursecreator.format.*;
import com.jetbrains.edu.coursecreator.ui.CreateCourseArchiveDialog;
import org.jetbrains.annotations.NotNull;
}
}
generateJson(project);
- packCourse(baseDir, lessons);
+ packCourse(baseDir, lessons, course);
resetTaskFiles(taskFiles);
synchronize(project);
}
}
}
- private void packCourse(@NotNull final VirtualFile baseDir, @NotNull final Map<String, Lesson> lessons) {
+ private void packCourse(@NotNull final VirtualFile baseDir, @NotNull final Map<String, Lesson> lessons, @NotNull final Course course) {
try {
File zipFile = new File(myLocationDir, myZipName + ".zip");
ZipOutputStream zos = new ZipOutputStream(new BufferedOutputStream(new FileOutputStream(zipFile)));
-
+ final StudyLanguageManager manager = CCUtils.getStudyLanguageManager(course);
for (Map.Entry<String, Lesson> entry : lessons.entrySet()) {
final VirtualFile lessonDir = baseDir.findChild(entry.getKey());
if (lessonDir == null) continue;
public boolean accept(File pathname) {
String name = pathname.getName();
String nameWithoutExtension = FileUtil.getNameWithoutExtension(pathname);
- return !nameWithoutExtension.endsWith(".answer") && !name.contains("__pycache__") && !name.contains("_windows") && !name.contains(".pyc");
+ if (nameWithoutExtension.endsWith(".answer") || name.contains("_windows")) {
+ return false;
+ }
+ return manager == null || manager.packFile(pathname);
}
}, null);
}
- ZipUtil.addFileOrDirRecursively(zos, null, new File(baseDir.getPath(), "hints"), "hints", null, null);
- ZipUtil.addFileOrDirRecursively(zos, null, new File(baseDir.getPath(), "course.json"), "course.json", null, null);
- ZipUtil.addFileOrDirRecursively(zos, null, new File(baseDir.getPath(), "test_helper.py"), "test_helper.py", null, null);
+ packFile("hints", zos, baseDir);
+ packFile("course.json", zos, baseDir);
+ if (manager != null) {
+ String[] additionalFilesToPack = manager.getAdditionalFilesToPack();
+ for (String filename: additionalFilesToPack) {
+ packFile(filename, zos, baseDir);
+ }
+ }
zos.close();
Messages.showInfoMessage("Course archive was saved to " + zipFile.getPath(), "Course Archive Was Created Successfully");
}
return true;
}
}
+
+ private static void packFile(@NotNull final String filename,
+ @NotNull final ZipOutputStream zipOutputStream,
+ @NotNull final VirtualFile baseDir) {
+ try {
+ File file = new File(baseDir.getPath(), filename);
+ if (!file.exists()) {
+ return;
+ }
+ ZipUtil.addFileOrDirRecursively(zipOutputStream, null, file, filename, null, null);
+ }
+ catch (IOException e) {
+ LOG.error(e);
+ }
+ }
}
\ No newline at end of file
import com.intellij.openapi.project.DumbAwareAction;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.ui.Messages;
+import com.intellij.openapi.util.io.FileUtil;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.PsiDirectory;
import com.intellij.psi.PsiElement;
final StudyLanguageManager studyLanguageManager = StudyLanguageManager.INSTANCE.forLanguage(language);
CCUtils.markDirAsSourceRoot(taskDirectory.getVirtualFile(), project);
+ final Task task = new Task(taskName);
+ task.setIndex(size + 1);
+ lesson.addTask(task, taskDirectory);
+
createFromTemplateAndOpen(taskDirectory, studyLanguageManager.getTestsTemplate(project), view);
createFromTemplateAndOpen(taskDirectory, FileTemplateManager.getInstance(project).getInternalTemplate("task.html"), view);
String defaultExtension = studyLanguageManager.getDefaultTaskFileExtension();
- String taskFileName = null;
if (defaultExtension != null) {
FileTemplate taskFileTemplate = studyLanguageManager.getTaskFileTemplateForExtension(project,
defaultExtension);
createFromTemplateAndOpen(taskDirectory, taskFileTemplate, view);
if (taskFileTemplate != null) {
- taskFileName = taskFileTemplate.getName();
+ String taskFileName = FileUtil.getNameWithoutExtension(taskFileTemplate.getName());
+ task.addTaskFile(taskFileName + "." + defaultExtension, size + 1);
}
}
- final Task task = new Task(taskName);
- task.setIndex(size + 1);
- lesson.addTask(task, taskDirectory);
- if (taskFileName != null) {
- task.addTaskFile(taskFileName, size + 1);
- }
ApplicationManager.getApplication().invokeLater(new Runnable() {
@Override
public void run() {
import com.intellij.ide.projectView.ProjectView;
import com.intellij.ide.util.DirectoryChooserUtil;
import com.intellij.ide.util.EditorHelper;
-import com.intellij.lang.Language;
import com.intellij.openapi.actionSystem.AnActionEvent;
import com.intellij.openapi.actionSystem.CommonDataKeys;
import com.intellij.openapi.actionSystem.LangDataKeys;
import com.intellij.psi.PsiDirectory;
import com.intellij.psi.PsiElement;
import com.jetbrains.edu.coursecreator.CCProjectService;
+import com.jetbrains.edu.coursecreator.CCUtils;
import com.jetbrains.edu.coursecreator.StudyLanguageManager;
import com.jetbrains.edu.coursecreator.format.Course;
import com.jetbrains.edu.coursecreator.format.Lesson;
final int index = task.getTaskFiles().size() + 1;
String generatedName = "file" + index;
- CreateTaskFileDialog dialog = new CreateTaskFileDialog(project, generatedName);
+ CreateTaskFileDialog dialog = new CreateTaskFileDialog(project, generatedName, course);
dialog.show();
if (dialog.getExitCode() != OK_EXIT_CODE) {
return;
if (type == null) {
return;
}
- Language language = Language.findLanguageByID(course.getLanguage());
- if (language == null) {
+ final StudyLanguageManager studyLanguageManager = CCUtils.getStudyLanguageManager(course);
+ if (studyLanguageManager == null) {
return;
}
- final StudyLanguageManager studyLanguageManager = StudyLanguageManager.INSTANCE.forLanguage(language);
final String extension = type.getDefaultExtension();
ApplicationManager.getApplication().runWriteAction(new Runnable() {
@Override
import com.intellij.execution.Location;
import com.intellij.execution.actions.ConfigurationContext;
import com.intellij.icons.AllIcons;
+import com.intellij.ide.fileTemplates.FileTemplate;
import com.intellij.openapi.actionSystem.AnAction;
import com.intellij.openapi.actionSystem.AnActionEvent;
import com.intellij.openapi.actionSystem.Presentation;
import com.intellij.psi.PsiFile;
import com.intellij.util.containers.HashMap;
import com.jetbrains.edu.coursecreator.CCProjectService;
+import com.jetbrains.edu.coursecreator.CCUtils;
+import com.jetbrains.edu.coursecreator.StudyLanguageManager;
import com.jetbrains.edu.coursecreator.format.*;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
clearTestEnvironment(taskDir, project);
for (final Map.Entry<String, TaskFile> entry : task.getTaskFiles().entrySet()) {
final String name = entry.getKey();
+ StudyLanguageManager manager = CCUtils.getStudyLanguageManager(course);
+ if (manager == null) {
+ return;
+ }
createTestEnvironment(taskDir, name, entry.getValue(), project);
- VirtualFile testFile = taskDir.findChild("tests.py");
+ FileTemplate testsTemplate = manager.getTestsTemplate(project);
+ if (testsTemplate == null) {
+ return;
+ }
+ VirtualFile testFile = taskDir.findChild(testsTemplate.getName());
if (testFile == null) {
return;
}
import com.intellij.openapi.project.Project;
import com.intellij.openapi.ui.FrameWrapper;
import com.intellij.openapi.util.Disposer;
-import com.intellij.openapi.util.io.FileUtil;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.PsiDirectory;
import com.intellij.psi.PsiFile;
Lesson lesson = course.getLesson(lessonDir.getName());
Task task = lesson.getTask(taskDir.getName());
TaskFile taskFile = task.getTaskFile(file.getName());
+ if (taskFile == null) {
+ return;
+ }
final Map<TaskFile, TaskFile> taskFilesCopy = new HashMap<TaskFile, TaskFile>();
for (final Map.Entry<String, TaskFile> entry : task.getTaskFiles().entrySet()) {
if (entry.getValue() == taskFile) {
});
}
}
- String userFileName = FileUtil.getNameWithoutExtension(file.getName()) + ".py";
+ String userFileName = CCProjectService.getRealTaskFileName(file.getName());
+ if (userFileName == null) {
+ return;
+ }
VirtualFile userFile = taskDir.getVirtualFile().findChild(userFileName);
if (userFile == null) {
LOG.info("Generated file " + userFileName + "was not found");
import com.intellij.ui.DoubleClickListener;
import com.intellij.ui.ListScrollingUtil;
import com.intellij.ui.components.JBList;
+import com.jetbrains.edu.coursecreator.CCUtils;
+import com.jetbrains.edu.coursecreator.StudyLanguageManager;
+import com.jetbrains.edu.coursecreator.format.Course;
+import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import javax.swing.*;
-import javax.swing.event.ListSelectionEvent;
-import javax.swing.event.ListSelectionListener;
import java.awt.event.MouseEvent;
public class CreateTaskFileDialog extends DialogWrapper {
+ private final Course myCourse;
private JPanel myPanel;
private JBList myList;
private JTextField myTextField;
@SuppressWarnings("unchecked")
- public CreateTaskFileDialog(@Nullable Project project, String generatedFileName) {
+ public CreateTaskFileDialog(@Nullable Project project, String generatedFileName, @NotNull final Course course) {
super(project);
+ myCourse = course;
FileType[] fileTypes = FileTypeManager.getInstance().getRegisteredFileTypes();
DefaultListModel model = new DefaultListModel();
}
}.installOn(myList);
- myList.getSelectionModel().addListSelectionListener(
- new ListSelectionListener() {
- @Override
- public void valueChanged(ListSelectionEvent e) {
- //TODO: do smth to check validness
- }
- }
- );
-
- ListScrollingUtil.selectItem(myList, FileTypeManager.getInstance().getFileTypeByExtension("py"));
+ StudyLanguageManager manager = CCUtils.getStudyLanguageManager(myCourse);
+ if (manager != null) {
+ String extension = manager.getDefaultTaskFileExtension();
+ ListScrollingUtil.selectItem(myList, FileTypeManager.getInstance().getFileTypeByExtension(extension != null ? extension : "txt"));
+ }
return myPanel;
}