use last subtask index instead of subtask number
[idea/community.git] / python / educational-python / course-creator-python / src / com / jetbrains / edu / coursecreator / PyCCLanguageManager.java
1 package com.jetbrains.edu.coursecreator;
2
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;
19
20 import java.io.File;
21 import java.io.IOException;
22
23 public class PyCCLanguageManager implements CCLanguageManager {
24   private static final Logger LOG = Logger.getInstance(PyCCLanguageManager.class);
25
26   @Nullable
27   @Override
28   public String getDefaultTaskFileExtension() {
29     return "py";
30   }
31
32   @Nullable
33   @Override
34   public FileTemplate getTaskFileTemplateForExtension(@NotNull final Project project, String extension) {
35     if (!extension.equals("py")) {
36       return null;
37     }
38     return getInternalTemplateByName(project, "task.py");
39   }
40
41   @Nullable
42   @Override
43   public FileTemplate getTestsTemplate(@NotNull final Project project) {
44     return getInternalTemplateByName(project, EduNames.TESTS_FILE);
45   }
46
47   @Override
48   public boolean doNotPackFile(File pathname) {
49     String name = pathname.getName();
50     return name.contains("__pycache__") || name.contains(".pyc");
51   }
52
53   private static FileTemplate getInternalTemplateByName(@NotNull final Project project, String name) {
54     return FileTemplateManager.getInstance(project).getInternalTemplate(name);
55   }
56
57   @Override
58   public boolean isTestFile(VirtualFile file) {
59     String name = file.getName();
60     if (EduNames.TESTS_FILE.equals(name)) {
61       return true;
62     }
63     return name.contains(FileUtil.getNameWithoutExtension(EduNames.TESTS_FILE)) && name.contains(EduNames.SUBTASK_MARKER);
64   }
65
66   @Override
67   public void createTestsForNewSubtask(@NotNull Project project, @NotNull Task task) {
68     VirtualFile taskDir = task.getTaskDir(project);
69     if (taskDir == null) {
70       return;
71     }
72
73     int prevSubtaskIndex = task.getLastSubtaskIndex();
74     String name = prevSubtaskIndex == 0 ? EduNames.TESTS_FILE : getSubtaskTestsFileName(prevSubtaskIndex);
75     VirtualFile testsFile = taskDir.findChild(name);
76     if (testsFile == null) {
77       return;
78     }
79     Document document = FileDocumentManager.getInstance().getDocument(testsFile);
80     if (document == null) {
81       return;
82     }
83     CharSequence prevTestText = document.getCharsSequence();
84     int nextSubtaskIndex = prevSubtaskIndex + 1;
85     String nextSubtaskTestsFileName = getSubtaskTestsFileName(nextSubtaskIndex);
86     ApplicationManager.getApplication().runWriteAction(() -> {
87       try {
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) {
92           return;
93         }
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);
99         });
100       }
101       catch (IOException e) {
102         LOG.error(e);
103       }
104     });
105   }
106
107   @NotNull
108   public static String getSubtaskTestsFileName(int index) {
109     return index == 0 ? EduNames.TESTS_FILE : FileUtil.getNameWithoutExtension(EduNames.TESTS_FILE) +
110                                               EduNames.SUBTASK_MARKER +
111                                               index + "." +
112                                               FileUtilRt.getExtension(EduNames.TESTS_FILE);
113   }
114 }