Skip to content
This repository was archived by the owner on Jun 3, 2025. It is now read-only.

Commit 411c490

Browse files
authored
Merge pull request #327 from tmc-cli/feedback-jclc
feedback submission
2 parents 20c171c + 18336ad commit 411c490

7 files changed

Lines changed: 120 additions & 8 deletions

File tree

src/main/java/fi/helsinki/cs/tmc/cli/command/PropertiesCommand.java

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,6 @@
1212
import java.util.ArrayList;
1313
import java.util.Collections;
1414
import java.util.HashMap;
15-
import java.util.Iterator;
16-
import java.util.List;
1715

1816
@Command(name = "prop", desc = "Set/unset TMC-CLI properties")
1917
public class PropertiesCommand extends AbstractCommand {

src/main/java/fi/helsinki/cs/tmc/cli/command/SubmitCommand.java

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,19 +12,23 @@
1212
import fi.helsinki.cs.tmc.cli.tmcstuff.CourseInfo;
1313
import fi.helsinki.cs.tmc.cli.tmcstuff.CourseInfoIo;
1414
import fi.helsinki.cs.tmc.cli.tmcstuff.ExerciseUpdater;
15+
import fi.helsinki.cs.tmc.cli.tmcstuff.FeedbackHandler;
1516
import fi.helsinki.cs.tmc.cli.tmcstuff.TmcUtil;
1617
import fi.helsinki.cs.tmc.cli.tmcstuff.WorkDir;
1718
import fi.helsinki.cs.tmc.core.TmcCore;
1819
import fi.helsinki.cs.tmc.core.domain.Course;
1920
import fi.helsinki.cs.tmc.core.domain.Exercise;
21+
import fi.helsinki.cs.tmc.core.domain.submission.FeedbackQuestion;
2022
import fi.helsinki.cs.tmc.core.domain.submission.SubmissionResult;
2123

2224
import org.apache.commons.cli.CommandLine;
2325
import org.apache.commons.cli.Options;
2426
import org.slf4j.Logger;
2527
import org.slf4j.LoggerFactory;
2628

29+
import java.net.URI;
2730
import java.nio.file.Path;
31+
import java.util.ArrayList;
2832
import java.util.List;
2933

3034
@Command(name = "submit", desc = "Submit exercises")
@@ -99,6 +103,10 @@ public void run(CommandLine args, Io io) {
99103
Color.AnsiColor color2 = app.getColor("testresults-right");
100104

101105
List<Exercise> submitExercises = info.getExercises(exerciseNames);
106+
List<List<FeedbackQuestion>> feedbackLists
107+
= new ArrayList<List<FeedbackQuestion>>();
108+
List<String> exercisesWithFeedback = new ArrayList<String>();
109+
List<URI> feedbackUris = new ArrayList<URI>();
102110

103111
for (Exercise exercise : submitExercises) {
104112
io.println(Color.colorString("Submitting: " + exercise.getName(),
@@ -118,6 +126,12 @@ public void run(CommandLine args, Io io) {
118126
}
119127
exercise.setCompleted(true);
120128
}
129+
List<FeedbackQuestion> feedback = result.getFeedbackQuestions();
130+
if (feedback != null && feedback.size() > 0) {
131+
feedbackLists.add(feedback);
132+
exercisesWithFeedback.add(exercise.getName());
133+
feedbackUris.add(URI.create(result.getFeedbackAnswerUrl()));
134+
}
121135
}
122136
}
123137
CourseInfoIo.save(info, workDir.getConfigFile());
@@ -128,8 +142,22 @@ public void run(CommandLine args, Io io) {
128142
io.println(TmcCliProgressObserver.getPassedTestsBar(passed, total, color1, color2));
129143
}
130144

145+
io.println("Updating " + CourseInfoIo.COURSE_CONFIG);
131146
updateCourseJson(core, submitExercises, info, workDir.getConfigFile());
132147
checkForExerciseUpdates(core, currentCourse);
148+
for (int i = 0; i < exercisesWithFeedback.size(); i++) {
149+
if (io.readConfirmation(
150+
"Send feedback for " + exercisesWithFeedback.get(i) + "?", true)) {
151+
FeedbackHandler fbh = new FeedbackHandler(io);
152+
Boolean success = fbh.sendFeedback(
153+
core, feedbackLists.get(i), feedbackUris.get(i));
154+
if (success) {
155+
io.println("Feedback sent.");
156+
} else {
157+
io.println("Failed to send feedback.");
158+
}
159+
}
160+
}
133161
}
134162

135163
protected void updateCourseJson(TmcCore core, List<Exercise> submittedExercises,

src/main/java/fi/helsinki/cs/tmc/cli/io/ResultPrinter.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,7 @@ public void printSubmissionResult(SubmissionResult result, Boolean printProgress
8585
io.println(TmcCliProgressObserver.getPassedTestsBar(passed, total, color1, color2));
8686
}
8787
String msg = null;
88-
switch (result.getTestResultStatus()) {
88+
switch ( result.getTestResultStatus()) {
8989
case NONE_FAILED:
9090
msg = "All tests passed on server!";
9191
msg = Color.colorString(msg, Color.AnsiColor.ANSI_GREEN)

src/main/java/fi/helsinki/cs/tmc/cli/io/TerminalIo.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,9 +41,11 @@ public Boolean readConfirmation(String prompt, Boolean defaultToYes) {
4141
logger.warn("Line could not be read.", e);
4242
return null;
4343
}
44-
if (input.equals("y")) {
44+
if (input.isEmpty()) {
45+
return defaultToYes;
46+
} else if (input.charAt(0) == 'y') {
4547
return true;
46-
} else if (input.equals("n")) {
48+
} else if (input.charAt(0) == 'n') {
4749
return false;
4850
}
4951
return defaultToYes;

src/main/java/fi/helsinki/cs/tmc/cli/io/TmcCliProgressObserver.java

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,6 @@
33
import fi.helsinki.cs.tmc.cli.Application;
44
import fi.helsinki.cs.tmc.core.domain.ProgressObserver;
55

6-
/**
7-
* Created by jclakkis on 27.5.2016.
8-
*/
96
public class TmcCliProgressObserver extends ProgressObserver {
107
protected static final char PIPCHAR = '█';
118
protected static final char EMPTYCHAR = '░';
Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
package fi.helsinki.cs.tmc.cli.tmcstuff;
2+
3+
import fi.helsinki.cs.tmc.cli.io.ExternalsUtil;
4+
import fi.helsinki.cs.tmc.cli.io.Io;
5+
import fi.helsinki.cs.tmc.cli.io.TmcCliProgressObserver;
6+
import fi.helsinki.cs.tmc.core.TmcCore;
7+
import fi.helsinki.cs.tmc.core.domain.submission.FeedbackAnswer;
8+
import fi.helsinki.cs.tmc.core.domain.submission.FeedbackQuestion;
9+
10+
import org.apache.commons.lang3.text.WordUtils;
11+
import org.slf4j.Logger;
12+
import org.slf4j.LoggerFactory;
13+
14+
import java.net.URI;
15+
import java.util.ArrayList;
16+
import java.util.List;
17+
18+
public class FeedbackHandler {
19+
private List<FeedbackQuestion> questions;
20+
private Io io;
21+
private static final Logger logger = LoggerFactory.getLogger(FeedbackHandler.class);
22+
23+
public FeedbackHandler(Io io) {
24+
this.io = io;
25+
}
26+
27+
public Boolean sendFeedback(TmcCore core, List<FeedbackQuestion> questions,
28+
URI feedbackUri) {
29+
this.questions = questions;
30+
List<FeedbackAnswer> answers = new ArrayList<>();
31+
32+
for (FeedbackQuestion question : questions) {
33+
answers.add(getAnswer(question));
34+
}
35+
try {
36+
Boolean call = core.sendFeedback(
37+
new TmcCliProgressObserver(io), answers, feedbackUri).call();
38+
return call;
39+
} catch (Exception e) {
40+
logger.error("Couldn't send feedback", e);
41+
}
42+
return false;
43+
}
44+
45+
private FeedbackAnswer getAnswer(FeedbackQuestion question) {
46+
if (question.isText()) {
47+
String wrappedQuestion =
48+
"\n# " + WordUtils.wrap("Feedback question: "
49+
+ question.getQuestion(), 77, "\n# ", true)
50+
+ "\n#\n# Write your feedback in this file and save it."
51+
+ "\n# Lines beginning with # are comments and will be ignored.";
52+
String answer = ExternalsUtil.getUserEditedMessage(wrappedQuestion,
53+
"tmc-feedback", true);
54+
return new FeedbackAnswer(question, answer);
55+
} else if (question.isIntRange()) {
56+
io.println("Feedback question: " + question.getQuestion());
57+
int answer = Integer.MIN_VALUE;
58+
while (!(question.getIntRangeMin() <= answer && question.getIntRangeMax() >= answer)) {
59+
try {
60+
answer = Integer.parseInt(io.readLine(
61+
"[" + question.getIntRangeMin()
62+
+ "-" + question.getIntRangeMax() + "] "));
63+
} catch (Exception e) {
64+
logger.warn("Couldn't parse string as integer", e);
65+
}
66+
}
67+
return new FeedbackAnswer(question, Integer.toString(answer));
68+
} else {
69+
io.println("Feedback question: " + question.getQuestion());
70+
String answer = io.readLine("Answer: ");
71+
return new FeedbackAnswer(question, answer);
72+
}
73+
}
74+
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package fi.helsinki.cs.tmc.cli.tmcstuff;
2+
3+
import fi.helsinki.cs.tmc.cli.io.ExternalsUtil;
4+
5+
import org.junit.runner.RunWith;
6+
import org.powermock.core.classloader.annotations.PrepareForTest;
7+
import org.powermock.modules.junit4.PowerMockRunner;
8+
9+
@RunWith(PowerMockRunner.class)
10+
@PrepareForTest(ExternalsUtil.class)
11+
public class FeedbackHandlerTest {
12+
13+
}

0 commit comments

Comments
 (0)