Skip to content

Commit db43dee

Browse files
committed
cooking with gas
1 parent 930bd36 commit db43dee

15 files changed

Lines changed: 278 additions & 63 deletions

File tree

build.gradle

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -48,19 +48,15 @@ dependencies {
4848
implementation 'com.github.therapi:therapi-runtime-javadoc:0.15.0'
4949
implementation 'com.github.therapi:therapi-runtime-javadoc-scribe:0.15.0'
5050
implementation 'info.picocli:picocli:4.7.7'
51-
implementation 'io.reactivex.rxjava3:rxjava:3.1.12'
5251
implementation 'com.google.code.gson:gson:2.13.2'
5352
implementation 'com.google.guava:guava:33.5.0-jre'
54-
implementation 'org.apache.logging.log4j:log4j-api:2.13.1'
55-
implementation 'org.apache.logging.log4j:log4j-core:2.13.1'
5653
implementation 'com.google.dagger:dagger:2.57.2'
5754
implementation 'com.github.bsommerfeld.jshepherd:core:3.3.2'
5855
implementation 'com.github.bsommerfeld.jshepherd:yaml:3.3.2'
5956
implementation 'com.google.flogger:flogger:0.9'
6057
implementation 'com.google.flogger:flogger-system-backend:0.9'
6158
implementation 'org.pitest:pitest:1.20.6'
6259
implementation 'org.pitest:pitest-entry:1.20.6'
63-
implementation 'org.pitest:pitest-html-report:1.20.6'
6460

6561
// Annotations
6662
annotationProcessor 'com.google.dagger:dagger-compiler:2.57.2'

src/chalkbox/commands/Grade.java

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
package chalkbox.commands;
2+
3+
import chalkbox.config.Config;
4+
import chalkbox.source.Solution;
5+
import chalkbox.source.Submission;
6+
import chalkbox.stages.Result;
7+
import chalkbox.stages.Stage;
8+
import chalkbox.stages.StageException;
9+
import chalkbox.stages.StageResult;
10+
import chalkbox.stages.ai.Ai;
11+
import chalkbox.stages.header.Header;
12+
import com.google.common.flogger.FluentLogger;
13+
import de.bsommerfeld.jshepherd.core.ConfigurationLoader;
14+
import picocli.CommandLine;
15+
import picocli.CommandLine.Command;
16+
import picocli.CommandLine.Mixin;
17+
18+
import java.nio.file.Path;
19+
import java.nio.file.Paths;
20+
21+
@Command(name = "grade",
22+
description = "Runs a sequence of stages and generates a Gradescope submission result")
23+
public class Grade implements Runnable {
24+
private static final FluentLogger logger = FluentLogger.forEnclosingClass();
25+
26+
@CommandLine.Option(names = { "--stages" }, required = true, description = "Comma seperated stages to run")
27+
public String stages;
28+
29+
@Mixin Shared shared = new Shared();
30+
31+
@Override
32+
public void run() {
33+
Path configFile = Paths.get(shared.configFile);
34+
var config = ConfigurationLoader.load(configFile, Config::new);
35+
36+
logger.atInfo().log("Running the following stages: " + String.join(" ,", stages));
37+
38+
//todo(mh): Config this
39+
var solution = new Solution("./test/resources/csse2002/solutions/correct",
40+
"./test/resources/csse2002/lib/junit-4.12.jar");
41+
var submission = new Submission(shared.submissionPath, "./test/resources/csse2002/lib/junit-4.12.jar");
42+
43+
// for each stage in the config
44+
var stages = this.stages.split(",");
45+
for (var name : stages) {
46+
var stage = getStage(name, config);
47+
if (stage == null) {
48+
logger.atWarning().log("Unable to find stage for " + name);
49+
continue;
50+
}
51+
StageResult result = null;
52+
try {
53+
switch (stage.getType()) {
54+
case SUBMISSION_ONLY -> result = stage.run(submission);
55+
case SUBMISSION_AND_SOLUTION -> result = stage.run(submission, solution);
56+
}
57+
} catch (StageException e) {
58+
result = StageResult.fromOverview(new Result(stage.getName()));
59+
}
60+
61+
logger.atInfo().log(stage.getName());
62+
if (result == null) {
63+
continue;
64+
}
65+
logger.atInfo().log(result.overview().getOutput());
66+
}
67+
}
68+
69+
private Stage getStage(String name, Config config) {
70+
return switch (name) {
71+
case "header" -> new Header();
72+
case "ai" -> new Ai();
73+
case "codestyle" -> config.toCodestyle();
74+
case "conformance" -> config.toConformance();
75+
case "functionality" -> config.toFunctionality();
76+
case "mutation" -> config.toMutation();
77+
default -> null;
78+
};
79+
}
80+
}

src/chalkbox/commands/Run.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55

66
@Command(name = "run",
77
description = "Run one of the supported commands: CheckStyle, Conformance, Functionality, Mutation",
8-
subcommands = { Conformance.class, CodeStyle.class, Functionality.class, Mutation.class, CommandLine.HelpCommand.class })
8+
subcommands = { Grade.class, Conformance.class, CodeStyle.class, Functionality.class, Mutation.class, CommandLine.HelpCommand.class })
99
public class Run implements Runnable {
1010

1111
@Override

src/chalkbox/source/Source.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
import java.io.IOException;
1212
import java.io.StringWriter;
1313
import java.net.*;
14+
import java.nio.charset.StandardCharsets;
1415
import java.nio.file.Files;
1516
import java.nio.file.Path;
1617
import java.nio.file.Paths;

src/chalkbox/source/SourceNotCompiled.java

Lines changed: 0 additions & 7 deletions
This file was deleted.
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,22 @@
11
package chalkbox.source;
22

3+
import java.io.IOException;
4+
import java.nio.charset.StandardCharsets;
5+
import java.nio.file.Files;
6+
import java.nio.file.Path;
7+
38
public class Submission extends Source {
49

510
public Submission(String baseDirectory, String classPath) {
611
super("submission", baseDirectory, classPath);
712
}
813

14+
public String getAiDeclaration() {
15+
try {
16+
return Files.readString(Path.of(getBasePath() + "/ai/" + "README.txt"), StandardCharsets.UTF_8);
17+
} catch (IOException e) {
18+
return "";
19+
}
20+
}
21+
922
}

src/chalkbox/stages/Stage.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,10 @@
66
import java.util.List;
77

88
public interface Stage {
9+
String getName();
10+
11+
Type getType();
12+
913
StageResult run(Submission submission) throws StageException;
1014

1115
StageResult run(Submission submission, Solution solution) throws StageException;

src/chalkbox/stages/Type.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package chalkbox.stages;
2+
3+
public enum Type {
4+
SUBMISSION_ONLY,
5+
SUBMISSION_AND_SOLUTION,
6+
SUBMISSION_AND_MULTIPLE_SOLUTIONS
7+
}

src/chalkbox/stages/ai/Ai.java

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
package chalkbox.stages.ai;
2+
3+
import chalkbox.source.Solution;
4+
import chalkbox.source.Submission;
5+
import chalkbox.stages.*;
6+
7+
import java.util.List;
8+
9+
public class Ai implements Stage {
10+
@Override
11+
public String getName() {
12+
return "Ai Declaration";
13+
}
14+
15+
@Override
16+
public Type getType() {
17+
return Type.SUBMISSION_ONLY;
18+
}
19+
20+
@Override
21+
public StageResult run(Submission submission) throws StageException {
22+
var result = new Result("Info")
23+
.setStatus(Status.PASSED)
24+
.setVisibility(Visibility.VISIBLE)
25+
.setOutputFormat("HTML");
26+
27+
var declaration = submission.getAiDeclaration();
28+
if (declaration.isEmpty()) {
29+
result.appendOutput("<p>You have not declared if you have or have not used Ai</p>");
30+
result.setStatus(Status.FAILED);
31+
} else {
32+
if (declaration.contains("No generative AI tools were utilised")) {
33+
result.appendOutput("<p><span style=\"color: blue; font-size: 20px;\">&#x1F6C8;</span> You have declared that you did not use Ai in your submission</p>\n");
34+
} else {
35+
result.appendOutput("<p><span style=\"color: blue; font-size: 20px;\">&#x1F6C8;</span> You have declared that you <b>did<b> use Ai in your submission</p>\n");
36+
}
37+
result.appendOutput(String.format("""
38+
<h2>Ai Declaration</h2>
39+
<code>
40+
%s
41+
</code>
42+
""", declaration));
43+
}
44+
45+
return StageResult.fromOverview(result);
46+
}
47+
48+
@Override
49+
public StageResult run(Submission submission, Solution solution) throws StageException {
50+
return null;
51+
}
52+
53+
@Override
54+
public StageResult run(Submission submission, List<Solution> solutions) throws StageException {
55+
return null;
56+
}
57+
}

src/chalkbox/stages/codestyle/CodeStyle.java

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,9 @@
33
import chalkbox.api.common.Execution;
44
import chalkbox.api.common.ProcessExecution;
55
import chalkbox.source.Solution;
6-
import chalkbox.stages.Result;
7-
import chalkbox.stages.Stage;
8-
import chalkbox.stages.StageException;
6+
import chalkbox.stages.*;
97
import chalkbox.source.Submission;
10-
import chalkbox.stages.StageResult;
118
import com.google.common.flogger.FluentLogger;
12-
import org.apache.logging.log4j.util.Strings;
139

1410
import java.io.IOException;
1511
import java.net.URI;
@@ -43,6 +39,16 @@ public CodeStyle(int weighting, float penaltyPerInfraction, List<String> exclude
4339
this.excludedFiles = excludedFiles;
4440
}
4541

42+
@Override
43+
public String getName() {
44+
return name;
45+
}
46+
47+
@Override
48+
public Type getType() {
49+
return Type.SUBMISSION_ONLY;
50+
}
51+
4652
public CodeStyle overrideCheckstyleConfig(String filePath) {
4753
this.customCheckstyleConfig = filePath;
4854
return this;
@@ -82,7 +88,7 @@ public StageResult run(Submission submission) throws StageException {
8288
processArgs.add(customCheckstyleConfig.isEmpty() ? checkstyleConfig : customCheckstyleConfig);
8389
processArgs.addAll(generateExcludedArgs(excludedFiles));
8490
processArgs.add(submission.getSrcFolder());
85-
logger.atInfo().log("Running CheckStyle %s", Strings.join(processArgs, ' '));
91+
logger.atInfo().log("Running CheckStyle %s", String.join(" ", processArgs));
8692

8793
// todo(mh): Change this to # * timeunit.Seconds or likewise
8894
ProcessExecution process = null;

0 commit comments

Comments
 (0)