diff --git a/grader/src/main/java/edu/pdx/cs/joy/grader/ProjectTimeEstimatesSummary.java b/grader/src/main/java/edu/pdx/cs/joy/grader/ProjectTimeEstimatesSummary.java index 1561f7ad3..4651df946 100644 --- a/grader/src/main/java/edu/pdx/cs/joy/grader/ProjectTimeEstimatesSummary.java +++ b/grader/src/main/java/edu/pdx/cs/joy/grader/ProjectTimeEstimatesSummary.java @@ -3,12 +3,15 @@ import com.google.common.annotations.VisibleForTesting; import edu.pdx.cs.joy.ParserException; import edu.pdx.cs.joy.grader.gradebook.*; +import edu.pdx.cs.joy.grader.gradebook.Assignment.ProjectType; import java.io.*; import java.util.*; import java.util.function.Function; import java.util.stream.Collectors; +import static edu.pdx.cs.joy.grader.gradebook.Assignment.ProjectType.*; + public class ProjectTimeEstimatesSummary { public TimeEstimatesSummaries getTimeEstimateSummaries(GradeBook book) { return getTimeEstimateSummaries(Collections.singletonList(book)); @@ -17,7 +20,7 @@ public TimeEstimatesSummaries getTimeEstimateSummaries(GradeBook book) { public TimeEstimatesSummaries getTimeEstimateSummaries(List books) { TimeEstimatesSummaries summaries = new TimeEstimatesSummaries(); - Set projectTypes = new HashSet<>(); + Set projectTypes = new HashSet<>(); for (GradeBook book : books) { book.assignmentsStream() .map(Assignment::getProjectType) @@ -51,7 +54,7 @@ public static void main(String[] args) { TimeEstimatesSummaries summaries = summary.getTimeEstimateSummaries(gradeBooks); PrintWriter pw = new PrintWriter(System.out, true); - summaries.generateMarkdown(pw, List.of(Assignment.ProjectType.APP_CLASSES, Assignment.ProjectType.TEXT_FILE, Assignment.ProjectType.PRETTY_PRINT, Assignment.ProjectType.KOANS, Assignment.ProjectType.XML, Assignment.ProjectType.REST, Assignment.ProjectType.ANDROID)); + summaries.generateMarkdown(pw, List.of(APP_CLASSES, TEXT_FILE, PRETTY_PRINT, KOANS, XML, DATABASE, REST, ANDROID)); pw.flush(); } @@ -85,13 +88,13 @@ private static void usage(String message) { } static class TimeEstimatesSummaries { - private final Map summaries = new HashMap<>(); + private final Map summaries = new HashMap<>(); - public TimeEstimatesSummary getTimeEstimateSummary(Assignment.ProjectType projectType) { + public TimeEstimatesSummary getTimeEstimateSummary(ProjectType projectType) { return this.summaries.get(projectType); } - void addSummariesFor(List books, Assignment.ProjectType projectType) { + void addSummariesFor(List books, ProjectType projectType) { Collection allEstimates = new ArrayList<>(); books.forEach(book -> { book.assignmentsStream() @@ -129,7 +132,7 @@ private Optional getMaximumEstimate(List submissio .max(Comparator.naturalOrder()); } - public void generateMarkdown(Writer writer, List projectTypes) { + public void generateMarkdown(Writer writer, List projectTypes) { PrintWriter pw = new PrintWriter(writer, true); headerRows(pw, projectTypes); countRow(pw, projectTypes); @@ -141,31 +144,31 @@ public void generateMarkdown(Writer writer, List project minimumRow(pw, projectTypes); } - private void minimumRow(PrintWriter pw, List projectTypes) { + private void minimumRow(PrintWriter pw, List projectTypes) { formatRowOfDoubles(pw, projectTypes, "Minimum", TimeEstimatesSummary::getMinimum); } - private void lowerQuartileRow(PrintWriter pw, List projectTypes) { + private void lowerQuartileRow(PrintWriter pw, List projectTypes) { formatRowOfDoubles(pw, projectTypes, "Bottom 25%", TimeEstimatesSummary::getLowerQuartile); } - private void medianRow(PrintWriter pw, List projectTypes) { + private void medianRow(PrintWriter pw, List projectTypes) { formatRowOfDoubles(pw, projectTypes, "Median", TimeEstimatesSummary::getMedian); } - private void upperQuartileRow(PrintWriter pw, List projectTypes) { + private void upperQuartileRow(PrintWriter pw, List projectTypes) { formatRowOfDoubles(pw, projectTypes, "Top 25%", TimeEstimatesSummary::getUpperQuartile); } - private void maximumRow(PrintWriter pw, List projectTypes) { + private void maximumRow(PrintWriter pw, List projectTypes) { formatRowOfDoubles(pw, projectTypes, "Maximum", TimeEstimatesSummary::getMaximum); } - private void averageRow(PrintWriter pw, List projectTypes) { + private void averageRow(PrintWriter pw, List projectTypes) { formatRowOfDoubles(pw, projectTypes, "Average", TimeEstimatesSummary::getAverage); } - private void formatRowOfDoubles(PrintWriter pw, List projectTypes, String rowTitle, Function cellValue) { + private void formatRowOfDoubles(PrintWriter pw, List projectTypes, String rowTitle, Function cellValue) { formatRow(pw, projectTypes, rowTitle, projectType -> { TimeEstimatesSummary summary = getTimeEstimateSummary(projectType); if (summary == null) { @@ -177,7 +180,7 @@ private void formatRowOfDoubles(PrintWriter pw, List pro }); } - private void formatRow(PrintWriter pw, List projectTypes, String rowTitle, Function cellValue) { + private void formatRow(PrintWriter pw, List projectTypes, String rowTitle, Function cellValue) { pw.print("| " + rowTitle + " |"); projectTypes.forEach(projectType -> { pw.print(" "); @@ -187,7 +190,7 @@ private void formatRow(PrintWriter pw, List projectTypes pw.println(); } - private void countRow(PrintWriter pw, List projectTypes) { + private void countRow(PrintWriter pw, List projectTypes) { formatRow(pw, projectTypes, "Count", projectType -> { TimeEstimatesSummary summary = getTimeEstimateSummary(projectType); if (summary == null) { @@ -199,13 +202,13 @@ private void countRow(PrintWriter pw, List projectTypes) }); } - private void headerRows(PrintWriter pw, List projectTypes) { + private void headerRows(PrintWriter pw, List projectTypes) { formatRow(pw, projectTypes, "", TimeEstimatesSummaries::formatProjectType); formatRow(pw, projectTypes, ":---", summary -> "---:"); } @VisibleForTesting - static String formatProjectType(Assignment.ProjectType projectType) { + static String formatProjectType(ProjectType projectType) { switch (projectType) { case APP_CLASSES: return "App Classes"; @@ -219,6 +222,9 @@ static String formatProjectType(Assignment.ProjectType projectType) { case XML: return "XML"; + case DATABASE: + return "DATABASE"; + case KOANS: return "Koans"; diff --git a/grader/src/main/java/edu/pdx/cs/joy/grader/gradebook/Assignment.java b/grader/src/main/java/edu/pdx/cs/joy/grader/gradebook/Assignment.java index c47edd4b9..069d09d74 100644 --- a/grader/src/main/java/edu/pdx/cs/joy/grader/gradebook/Assignment.java +++ b/grader/src/main/java/edu/pdx/cs/joy/grader/gradebook/Assignment.java @@ -30,6 +30,7 @@ public enum ProjectType { PRETTY_PRINT, KOANS, XML, + DATABASE, REST, ANDROID } diff --git a/grader/src/main/java/edu/pdx/cs/joy/grader/gradebook/XmlDumper.java b/grader/src/main/java/edu/pdx/cs/joy/grader/gradebook/XmlDumper.java index 2eada3523..38a7b104d 100644 --- a/grader/src/main/java/edu/pdx/cs/joy/grader/gradebook/XmlDumper.java +++ b/grader/src/main/java/edu/pdx/cs/joy/grader/gradebook/XmlDumper.java @@ -276,6 +276,10 @@ private static void setProjectTypeAttribute(Assignment assignment, Element assig assignmentNode.setAttribute("project-type", "XML"); break; + case DATABASE: + assignmentNode.setAttribute("project-type", "DATABASE"); + break; + case REST: assignmentNode.setAttribute("project-type", "REST"); break; diff --git a/grader/src/main/java/edu/pdx/cs/joy/grader/gradebook/XmlGradeBookParser.java b/grader/src/main/java/edu/pdx/cs/joy/grader/gradebook/XmlGradeBookParser.java index bf71668ca..c8b0fb765 100644 --- a/grader/src/main/java/edu/pdx/cs/joy/grader/gradebook/XmlGradeBookParser.java +++ b/grader/src/main/java/edu/pdx/cs/joy/grader/gradebook/XmlGradeBookParser.java @@ -189,6 +189,10 @@ private static void setProjectTypeFromXml(Element assignmentElement, Assignment assignment.setProjectType(Assignment.ProjectType.XML); break; + case "DATABASE": + assignment.setProjectType(Assignment.ProjectType.DATABASE); + break; + case "REST": assignment.setProjectType(Assignment.ProjectType.REST); break; diff --git a/grader/src/main/resources/edu/pdx/cs/joy/grader/gradebook.dtd b/grader/src/main/resources/edu/pdx/cs/joy/grader/gradebook.dtd index e443e240d..86c735b20 100644 --- a/grader/src/main/resources/edu/pdx/cs/joy/grader/gradebook.dtd +++ b/grader/src/main/resources/edu/pdx/cs/joy/grader/gradebook.dtd @@ -48,7 +48,7 @@ points it is worth, a type, a due date, and some optional notes --> diff --git a/grader/src/test/java/edu/pdx/cs/joy/grader/gradebook/GradeBookXmlTest.java b/grader/src/test/java/edu/pdx/cs/joy/grader/gradebook/GradeBookXmlTest.java index f7eacb7a6..fdbd1b983 100644 --- a/grader/src/test/java/edu/pdx/cs/joy/grader/gradebook/GradeBookXmlTest.java +++ b/grader/src/test/java/edu/pdx/cs/joy/grader/gradebook/GradeBookXmlTest.java @@ -181,6 +181,11 @@ void xmlProjectTypeIsPersistedToXml() throws ParserException, IOException, Trans persistProjectOfType(Assignment.ProjectType.XML); } + @Test + void databaseProjectTypeIsPersistedToXml() throws ParserException, IOException, TransformerException { + persistProjectOfType(Assignment.ProjectType.DATABASE); + } + @Test void restProjectTypeIsPersistedToXml() throws ParserException, IOException, TransformerException { persistProjectOfType(Assignment.ProjectType.REST);