diff --git a/python/educational-core/src/com/jetbrains/edu/learning/checker/StudyCheckUtils.java b/python/educational-core/src/com/jetbrains/edu/learning/checker/StudyCheckUtils.java index 3b74d33b4fb8..bd0772416b07 100644 --- a/python/educational-core/src/com/jetbrains/edu/learning/checker/StudyCheckUtils.java +++ b/python/educational-core/src/com/jetbrains/edu/learning/checker/StudyCheckUtils.java @@ -6,9 +6,7 @@ import com.intellij.execution.process.ProcessOutput; import com.intellij.execution.ui.ConsoleViewContentType; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.diagnostic.Logger; -import com.intellij.openapi.editor.Document; import com.intellij.openapi.editor.Editor; -import com.intellij.openapi.fileEditor.FileDocumentManager; import com.intellij.openapi.fileEditor.FileEditor; import com.intellij.openapi.fileEditor.FileEditorManager; import com.intellij.openapi.progress.ProgressManager; @@ -16,7 +14,6 @@ import com.intellij.openapi.project.Project; import com.intellij.openapi.ui.popup.Balloon; import com.intellij.openapi.ui.popup.BalloonBuilder; import com.intellij.openapi.ui.popup.JBPopupFactory; -import com.intellij.openapi.util.Pair; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.openapi.wm.IdeFocusManager; import com.intellij.openapi.wm.ToolWindow; @@ -26,10 +23,7 @@ import com.intellij.ui.content.Content; import com.jetbrains.edu.learning.StudyState; import com.jetbrains.edu.learning.StudyTaskManager; import com.jetbrains.edu.learning.StudyUtils; -import com.jetbrains.edu.learning.core.EduDocumentListener; -import com.jetbrains.edu.learning.core.EduNames; import com.jetbrains.edu.learning.core.EduUtils; -import com.jetbrains.edu.learning.courseFormat.AnswerPlaceholder; import com.jetbrains.edu.learning.courseFormat.TaskFile; import com.jetbrains.edu.learning.courseFormat.tasks.Task; import com.jetbrains.edu.learning.editor.StudyEditor; @@ -40,7 +34,6 @@ import org.jetbrains.annotations.NotNull; import javax.swing.*; import java.awt.*; -import java.io.IOException; import java.util.Map; public class StudyCheckUtils { @@ -117,68 +110,6 @@ public class StudyCheckUtils { } - public static void runSmartTestProcess(@NotNull final VirtualFile taskDir, - @NotNull final StudyTestRunner testRunner, - @NotNull final String taskFileName, - @NotNull final TaskFile taskFile, - @NotNull final Project project) { - final VirtualFile virtualFile = taskDir.findFileByRelativePath(taskFileName); - if (virtualFile == null) { - return; - } - Pair pair = getCopyWithAnswers(taskDir, virtualFile, taskFile); - if (pair == null) { - return; - } - VirtualFile answerFile = pair.getFirst(); - TaskFile answerTaskFile = pair.getSecond(); - try { - for (final AnswerPlaceholder answerPlaceholder : answerTaskFile.getActivePlaceholders()) { - final Document document = FileDocumentManager.getInstance().getDocument(virtualFile); - if (document == null) { - continue; - } - StudySmartChecker.smartCheck(answerPlaceholder, project, answerFile, answerTaskFile, taskFile, testRunner, - virtualFile, document); - } - } - finally { - StudyUtils.deleteFile(answerFile); - } - } - - - private static Pair getCopyWithAnswers(@NotNull final VirtualFile taskDir, - @NotNull final VirtualFile file, - @NotNull final TaskFile source) { - try { - VirtualFile answerFile = file.copy(taskDir, taskDir, file.getNameWithoutExtension() + EduNames.ANSWERS_POSTFIX + "." + file.getExtension()); - final FileDocumentManager documentManager = FileDocumentManager.getInstance(); - final Document document = documentManager.getDocument(answerFile); - if (document != null) { - TaskFile answerTaskFile = source.getTask().copy().getTaskFile(StudyUtils.pathRelativeToTask(file)); - if (answerTaskFile == null) { - return null; - } - EduDocumentListener listener = new EduDocumentListener(answerTaskFile); - document.addDocumentListener(listener); - for (AnswerPlaceholder answerPlaceholder : answerTaskFile.getActivePlaceholders()) { - final int start = answerPlaceholder.getOffset(); - final int end = start + answerPlaceholder.getRealLength(); - final String text = answerPlaceholder.getPossibleAnswer(); - document.replaceString(start, end, text); - } - ApplicationManager.getApplication().runWriteAction(() -> documentManager.saveDocument(document)); - return Pair.create(answerFile, answerTaskFile); - } - } - catch (IOException e) { - LOG.error(e); - } - return null; - } - - public static void flushWindows(@NotNull final Task task, @NotNull final VirtualFile taskDir) { for (Map.Entry entry : task.getTaskFiles().entrySet()) { String name = entry.getKey(); 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 bd224e42f31c..758dd36fe94e 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 @@ -19,6 +19,7 @@ import com.intellij.psi.PsiDirectory; import com.intellij.psi.PsiManager; import com.intellij.util.PathUtil; import com.jetbrains.edu.coursecreator.settings.CCSettings; +import com.jetbrains.edu.learning.checker.PyStudyTaskChecker; import com.jetbrains.edu.learning.checker.StudyTaskChecker; import com.jetbrains.edu.learning.core.EduNames; import com.jetbrains.edu.learning.courseFormat.Course; diff --git a/python/educational-core/src/com/jetbrains/edu/learning/checker/StudySmartChecker.java b/python/educational-python/Edu-Python/src/com/jetbrains/edu/learning/checker/PyStudySmartChecker.java similarity index 57% rename from python/educational-core/src/com/jetbrains/edu/learning/checker/StudySmartChecker.java rename to python/educational-python/Edu-Python/src/com/jetbrains/edu/learning/checker/PyStudySmartChecker.java index daa1d3491eb5..59c850b661e6 100644 --- a/python/educational-core/src/com/jetbrains/edu/learning/checker/StudySmartChecker.java +++ b/python/educational-python/Edu-Python/src/com/jetbrains/edu/learning/checker/PyStudySmartChecker.java @@ -8,6 +8,7 @@ import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.editor.Document; import com.intellij.openapi.fileEditor.FileDocumentManager; import com.intellij.openapi.project.Project; +import com.intellij.openapi.util.Pair; import com.intellij.openapi.util.TextRange; import com.intellij.openapi.vfs.VirtualFile; import com.jetbrains.edu.learning.StudyTaskManager; @@ -23,12 +24,12 @@ import org.jetbrains.annotations.NotNull; import java.io.IOException; -public class StudySmartChecker { - private StudySmartChecker() { +public class PyStudySmartChecker { + private PyStudySmartChecker() { } - private static final Logger LOG = Logger.getInstance(StudySmartChecker.class); + private static final Logger LOG = Logger.getInstance(PyStudySmartChecker.class); public static void smartCheck(@NotNull final AnswerPlaceholder placeholder, @NotNull final Project project, @@ -80,4 +81,64 @@ public class StudySmartChecker { StudyUtils.deleteFile(fileWindows); } } + + public static void runSmartTestProcess(@NotNull final VirtualFile taskDir, + @NotNull final StudyTestRunner testRunner, + @NotNull final String taskFileName, + @NotNull final TaskFile taskFile, + @NotNull final Project project) { + final VirtualFile virtualFile = taskDir.findFileByRelativePath(taskFileName); + if (virtualFile == null) { + return; + } + Pair pair = getCopyWithAnswers(taskDir, virtualFile, taskFile); + if (pair == null) { + return; + } + VirtualFile answerFile = pair.getFirst(); + TaskFile answerTaskFile = pair.getSecond(); + try { + for (final AnswerPlaceholder answerPlaceholder : answerTaskFile.getActivePlaceholders()) { + final Document document = FileDocumentManager.getInstance().getDocument(virtualFile); + if (document == null) { + continue; + } + smartCheck(answerPlaceholder, project, answerFile, answerTaskFile, taskFile, testRunner, + virtualFile, document); + } + } + finally { + StudyUtils.deleteFile(answerFile); + } + } + + private static Pair getCopyWithAnswers(@NotNull final VirtualFile taskDir, + @NotNull final VirtualFile file, + @NotNull final TaskFile source) { + try { + VirtualFile answerFile = file.copy(taskDir, taskDir, file.getNameWithoutExtension() + EduNames.ANSWERS_POSTFIX + "." + file.getExtension()); + final FileDocumentManager documentManager = FileDocumentManager.getInstance(); + final Document document = documentManager.getDocument(answerFile); + if (document != null) { + TaskFile answerTaskFile = source.getTask().copy().getTaskFile(StudyUtils.pathRelativeToTask(file)); + if (answerTaskFile == null) { + return null; + } + EduDocumentListener listener = new EduDocumentListener(answerTaskFile); + document.addDocumentListener(listener); + for (AnswerPlaceholder answerPlaceholder : answerTaskFile.getActivePlaceholders()) { + final int start = answerPlaceholder.getOffset(); + final int end = start + answerPlaceholder.getRealLength(); + final String text = answerPlaceholder.getPossibleAnswer(); + document.replaceString(start, end, text); + } + ApplicationManager.getApplication().runWriteAction(() -> documentManager.saveDocument(document)); + return Pair.create(answerFile, answerTaskFile); + } + } + catch (IOException e) { + LOG.error(e); + } + return null; + } } diff --git a/python/educational-python/Edu-Python/src/com/jetbrains/edu/learning/PyStudyTaskChecker.java b/python/educational-python/Edu-Python/src/com/jetbrains/edu/learning/checker/PyStudyTaskChecker.java similarity index 94% rename from python/educational-python/Edu-Python/src/com/jetbrains/edu/learning/PyStudyTaskChecker.java rename to python/educational-python/Edu-Python/src/com/jetbrains/edu/learning/checker/PyStudyTaskChecker.java index f50016c2fe89..909a3ecb4f90 100644 --- a/python/educational-python/Edu-Python/src/com/jetbrains/edu/learning/PyStudyTaskChecker.java +++ b/python/educational-python/Edu-Python/src/com/jetbrains/edu/learning/checker/PyStudyTaskChecker.java @@ -1,4 +1,4 @@ -package com.jetbrains.edu.learning; +package com.jetbrains.edu.learning.checker; import com.intellij.execution.ExecutionException; import com.intellij.openapi.application.ApplicationManager; @@ -6,8 +6,10 @@ import com.intellij.openapi.command.CommandProcessor; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.project.Project; import com.intellij.openapi.vfs.VirtualFile; +import com.jetbrains.edu.learning.StudyState; +import com.jetbrains.edu.learning.StudyTaskManager; +import com.jetbrains.edu.learning.StudyUtils; import com.jetbrains.edu.learning.actions.StudyCheckAction; -import com.jetbrains.edu.learning.checker.*; import com.jetbrains.edu.learning.core.EduNames; import com.jetbrains.edu.learning.core.EduUtils; import com.jetbrains.edu.learning.courseFormat.Course; @@ -90,7 +92,7 @@ public class PyStudyTaskChecker extends StudyTaskChecker { if (course != null && EduNames.STUDY.equals(course.getCourseMode())) { CommandProcessor.getInstance().runUndoTransparentAction( () -> ApplicationManager.getApplication().runWriteAction( - () -> StudyCheckUtils.runSmartTestProcess(taskDir, new PyStudyTestRunner(myTask, taskDir), name, taskFile, myProject))); + () -> PyStudySmartChecker.runSmartTestProcess(taskDir, new PyStudyTestRunner(myTask, taskDir), name, taskFile, myProject))); } } StudyCheckUtils.navigateToFailedPlaceholder(new StudyState(StudyUtils.getSelectedStudyEditor(myProject)), myTask, taskDir, myProject); diff --git a/python/educational-python/Edu-Python/src/com/jetbrains/edu/learning/PyStudyTestRunner.java b/python/educational-python/Edu-Python/src/com/jetbrains/edu/learning/checker/PyStudyTestRunner.java similarity index 96% rename from python/educational-python/Edu-Python/src/com/jetbrains/edu/learning/PyStudyTestRunner.java rename to python/educational-python/Edu-Python/src/com/jetbrains/edu/learning/checker/PyStudyTestRunner.java index e8c506d64025..b111077d23f4 100644 --- a/python/educational-python/Edu-Python/src/com/jetbrains/edu/learning/PyStudyTestRunner.java +++ b/python/educational-python/Edu-Python/src/com/jetbrains/edu/learning/checker/PyStudyTestRunner.java @@ -1,4 +1,4 @@ -package com.jetbrains.edu.learning; +package com.jetbrains.edu.learning.checker; import com.intellij.execution.ExecutionException; import com.intellij.execution.configurations.GeneralCommandLine; @@ -8,7 +8,7 @@ import com.intellij.openapi.projectRoots.Sdk; import com.intellij.openapi.util.io.FileUtil; import com.intellij.openapi.util.io.FileUtilRt; import com.intellij.openapi.vfs.VirtualFile; -import com.jetbrains.edu.learning.checker.StudyTestRunner; +import com.jetbrains.edu.learning.PyEduPluginConfigurator; import com.jetbrains.edu.learning.core.EduNames; import com.jetbrains.edu.learning.courseFormat.tasks.Task; import com.jetbrains.edu.learning.courseFormat.tasks.TaskWithSubtasks;