1 package com.jetbrains.edu.coursecreator;
3 import com.intellij.ide.fileTemplates.FileTemplate;
4 import com.intellij.ide.fileTemplates.FileTemplateManager;
5 import com.intellij.openapi.application.ApplicationManager;
6 import com.intellij.openapi.diagnostic.Logger;
7 import com.intellij.openapi.editor.Document;
8 import com.intellij.openapi.fileEditor.FileDocumentManager;
9 import com.intellij.openapi.project.Project;
10 import com.intellij.openapi.util.io.FileUtil;
11 import com.intellij.openapi.util.io.FileUtilRt;
12 import com.intellij.openapi.vfs.VirtualFile;
13 import com.intellij.util.DocumentUtil;
14 import com.jetbrains.edu.learning.StudyTaskManager;
15 import com.jetbrains.edu.learning.core.EduNames;
16 import com.jetbrains.edu.learning.courseFormat.Task;
17 import org.jetbrains.annotations.NotNull;
18 import org.jetbrains.annotations.Nullable;
21 import java.io.IOException;
23 public class PyCCLanguageManager implements CCLanguageManager {
24 private static final Logger LOG = Logger.getInstance(PyCCLanguageManager.class);
28 public String getDefaultTaskFileExtension() {
34 public FileTemplate getTaskFileTemplateForExtension(@NotNull final Project project, String extension) {
35 if (!extension.equals("py")) {
38 return getInternalTemplateByName(project, "task.py");
43 public FileTemplate getTestsTemplate(@NotNull final Project project) {
44 return getInternalTemplateByName(project, EduNames.TESTS_FILE);
48 public boolean doNotPackFile(File pathname) {
49 String name = pathname.getName();
50 return name.contains("__pycache__") || name.contains(".pyc");
53 private static FileTemplate getInternalTemplateByName(@NotNull final Project project, String name) {
54 return FileTemplateManager.getInstance(project).getInternalTemplate(name);
58 public boolean isTestFile(VirtualFile file) {
59 String name = file.getName();
60 if (EduNames.TESTS_FILE.equals(name)) {
63 return name.contains(FileUtil.getNameWithoutExtension(EduNames.TESTS_FILE)) && name.contains(EduNames.SUBTASK_MARKER);
67 public void createTestsForNewSubtask(@NotNull Project project, @NotNull Task task) {
68 VirtualFile taskDir = task.getTaskDir(project);
69 if (taskDir == null) {
73 int prevSubtaskIndex = task.getActiveSubtaskIndex();
74 String name = prevSubtaskIndex == 0 ? EduNames.TESTS_FILE : getSubtaskTestsFileName(prevSubtaskIndex);
75 VirtualFile testsFile = taskDir.findChild(name);
76 if (testsFile == null) {
79 Document document = FileDocumentManager.getInstance().getDocument(testsFile);
80 if (document == null) {
83 CharSequence prevTestText = document.getCharsSequence();
84 int nextSubtaskIndex = prevSubtaskIndex + 1;
85 String nextSubtaskTestsFileName = getSubtaskTestsFileName(nextSubtaskIndex);
86 ApplicationManager.getApplication().runWriteAction(() -> {
88 VirtualFile nextSubtaskTestsFile = taskDir.createChildData(this, nextSubtaskTestsFileName);
89 StudyTaskManager.getInstance(project).addInvisibleFiles(nextSubtaskTestsFile.getPath());
90 Document nextSubtaskDocument = FileDocumentManager.getInstance().getDocument(nextSubtaskTestsFile);
91 if (nextSubtaskDocument == null) {
94 String header = "# This is test for subtask " + nextSubtaskIndex + ". We've already copied tests from previous subtask here.\n\n";
95 DocumentUtil.writeInRunUndoTransparentAction(() -> {
96 nextSubtaskDocument.insertString(0, header);
97 nextSubtaskDocument.insertString(header.length(), prevTestText);
98 FileDocumentManager.getInstance().saveDocument(nextSubtaskDocument);
101 catch (IOException e) {
108 public static String getSubtaskTestsFileName(int index) {
109 return index == 0 ? EduNames.TESTS_FILE : FileUtil.getNameWithoutExtension(EduNames.TESTS_FILE) +
110 EduNames.SUBTASK_MARKER +
112 FileUtilRt.getExtension(EduNames.TESTS_FILE);