Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -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));
Expand All @@ -17,7 +20,7 @@ public TimeEstimatesSummaries getTimeEstimateSummaries(GradeBook book) {
public TimeEstimatesSummaries getTimeEstimateSummaries(List<GradeBook> books) {
TimeEstimatesSummaries summaries = new TimeEstimatesSummaries();

Set<Assignment.ProjectType> projectTypes = new HashSet<>();
Set<ProjectType> projectTypes = new HashSet<>();
for (GradeBook book : books) {
book.assignmentsStream()
.map(Assignment::getProjectType)
Expand Down Expand Up @@ -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();

}
Expand Down Expand Up @@ -85,13 +88,13 @@ private static void usage(String message) {
}

static class TimeEstimatesSummaries {
private final Map<Assignment.ProjectType, TimeEstimatesSummary> summaries = new HashMap<>();
private final Map<ProjectType, TimeEstimatesSummary> summaries = new HashMap<>();

public TimeEstimatesSummary getTimeEstimateSummary(Assignment.ProjectType projectType) {
public TimeEstimatesSummary getTimeEstimateSummary(ProjectType projectType) {
return this.summaries.get(projectType);
}

void addSummariesFor(List<GradeBook> books, Assignment.ProjectType projectType) {
void addSummariesFor(List<GradeBook> books, ProjectType projectType) {
Collection<Double> allEstimates = new ArrayList<>();
books.forEach(book -> {
book.assignmentsStream()
Expand Down Expand Up @@ -129,7 +132,7 @@ private Optional<Double> getMaximumEstimate(List<Grade.SubmissionInfo> submissio
.max(Comparator.naturalOrder());
}

public void generateMarkdown(Writer writer, List<Assignment.ProjectType> projectTypes) {
public void generateMarkdown(Writer writer, List<ProjectType> projectTypes) {
PrintWriter pw = new PrintWriter(writer, true);
headerRows(pw, projectTypes);
countRow(pw, projectTypes);
Expand All @@ -141,31 +144,31 @@ public void generateMarkdown(Writer writer, List<Assignment.ProjectType> project
minimumRow(pw, projectTypes);
}

private void minimumRow(PrintWriter pw, List<Assignment.ProjectType> projectTypes) {
private void minimumRow(PrintWriter pw, List<ProjectType> projectTypes) {
formatRowOfDoubles(pw, projectTypes, "Minimum", TimeEstimatesSummary::getMinimum);
}

private void lowerQuartileRow(PrintWriter pw, List<Assignment.ProjectType> projectTypes) {
private void lowerQuartileRow(PrintWriter pw, List<ProjectType> projectTypes) {
formatRowOfDoubles(pw, projectTypes, "Bottom 25%", TimeEstimatesSummary::getLowerQuartile);
}

private void medianRow(PrintWriter pw, List<Assignment.ProjectType> projectTypes) {
private void medianRow(PrintWriter pw, List<ProjectType> projectTypes) {
formatRowOfDoubles(pw, projectTypes, "Median", TimeEstimatesSummary::getMedian);
}

private void upperQuartileRow(PrintWriter pw, List<Assignment.ProjectType> projectTypes) {
private void upperQuartileRow(PrintWriter pw, List<ProjectType> projectTypes) {
formatRowOfDoubles(pw, projectTypes, "Top 25%", TimeEstimatesSummary::getUpperQuartile);
}

private void maximumRow(PrintWriter pw, List<Assignment.ProjectType> projectTypes) {
private void maximumRow(PrintWriter pw, List<ProjectType> projectTypes) {
formatRowOfDoubles(pw, projectTypes, "Maximum", TimeEstimatesSummary::getMaximum);
}

private void averageRow(PrintWriter pw, List<Assignment.ProjectType> projectTypes) {
private void averageRow(PrintWriter pw, List<ProjectType> projectTypes) {
formatRowOfDoubles(pw, projectTypes, "Average", TimeEstimatesSummary::getAverage);
}

private void formatRowOfDoubles(PrintWriter pw, List<Assignment.ProjectType> projectTypes, String rowTitle, Function<TimeEstimatesSummary, Double> cellValue) {
private void formatRowOfDoubles(PrintWriter pw, List<ProjectType> projectTypes, String rowTitle, Function<TimeEstimatesSummary, Double> cellValue) {
formatRow(pw, projectTypes, rowTitle, projectType -> {
TimeEstimatesSummary summary = getTimeEstimateSummary(projectType);
if (summary == null) {
Expand All @@ -177,7 +180,7 @@ private void formatRowOfDoubles(PrintWriter pw, List<Assignment.ProjectType> pro
});
}

private void formatRow(PrintWriter pw, List<Assignment.ProjectType> projectTypes, String rowTitle, Function<Assignment.ProjectType, String> cellValue) {
private void formatRow(PrintWriter pw, List<ProjectType> projectTypes, String rowTitle, Function<ProjectType, String> cellValue) {
pw.print("| " + rowTitle + " |");
projectTypes.forEach(projectType -> {
pw.print(" ");
Expand All @@ -187,7 +190,7 @@ private void formatRow(PrintWriter pw, List<Assignment.ProjectType> projectTypes
pw.println();
}

private void countRow(PrintWriter pw, List<Assignment.ProjectType> projectTypes) {
private void countRow(PrintWriter pw, List<ProjectType> projectTypes) {
formatRow(pw, projectTypes, "Count", projectType -> {
TimeEstimatesSummary summary = getTimeEstimateSummary(projectType);
if (summary == null) {
Expand All @@ -199,13 +202,13 @@ private void countRow(PrintWriter pw, List<Assignment.ProjectType> projectTypes)
});
}

private void headerRows(PrintWriter pw, List<Assignment.ProjectType> projectTypes) {
private void headerRows(PrintWriter pw, List<ProjectType> 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";
Expand All @@ -219,6 +222,9 @@ static String formatProjectType(Assignment.ProjectType projectType) {
case XML:
return "XML";

case DATABASE:
return "DATABASE";

case KOANS:
return "Koans";

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ public enum ProjectType {
PRETTY_PRINT,
KOANS,
XML,
DATABASE,
REST,
ANDROID
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@ points it is worth, a type, a due date, and some optional notes -->
<!ELEMENT assignment (name, description?, points, canvas-id?, due-date?, notes*)>
<!ATTLIST assignment
type (PROJECT | QUIZ | OTHER | POA | OPTIONAL) #REQUIRED
project-type (APP_CLASSES | TEXT_FILE | PRETTY_PRINT | KOANS | XML | REST | ANDROID) #IMPLIED
project-type (APP_CLASSES | TEXT_FILE | PRETTY_PRINT | KOANS | XML | DATABASE | REST | ANDROID) #IMPLIED
>

<!ELEMENT description (#PCDATA)>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down