feat: implement reports

This commit is contained in:
2026-09-19 20:06:41 -04:00
parent 6ae993d393
commit 994e9065e8
28 changed files with 7082 additions and 63 deletions
+6 -3
View File
@@ -406,13 +406,13 @@ pub fn analyze(
let mut credits: BTreeMap<String, Vec<f64>> = BTreeMap::new();
let mut blank = 0usize;
for r in &rows {
if r.selected.is_empty() {
if r.chosen().is_empty() {
blank += 1;
continue;
}
// A multiple-response item is credited to the joined set, so that
// "chose A and C" is one response pattern rather than two options.
let label = r.selected.join("+");
let label = r.chosen().join("+");
if let Some(&si) = student_index.get(r.student_key.as_str()) {
chose.entry(label.clone()).or_default().push(si);
}
@@ -775,7 +775,7 @@ fn infer_key(rows: &[&crate::responses::Response]) -> Vec<String> {
let mut out: BTreeSet<String> = BTreeSet::new();
for r in rows {
if r.credit >= 0.999 {
for letter in &r.selected {
for letter in r.chosen() {
out.insert(letter.clone());
}
}
@@ -857,6 +857,7 @@ mod tests {
assessment_id: "a".into(),
date: None,
form: None,
form_position: None,
student_key: student.into(),
sid: None,
name: None,
@@ -870,7 +871,9 @@ mod tests {
} else {
vec![letter.to_string()]
},
selected_source: vec![],
eliminated: vec![],
eliminated_source: vec![],
correct: Some(credit >= 0.999),
credit,
points_possible: 1.0,
File diff suppressed because it is too large Load Diff
+5 -2
View File
@@ -563,7 +563,7 @@ fn missed_items(
if let Some(entry) = cat.get(uid) {
// Feedback for the specific option chosen, which is the whole
// point of recording per-distractor misconceptions.
if let Some(letter) = r.selected.first() {
if let Some(letter) = r.chosen().first() {
if let Some(choice) = entry.item.option(letter) {
misconception = choice.misconception.clone();
feedback = choice.student_text().map(|s| s.to_string());
@@ -592,7 +592,7 @@ fn missed_items(
out.push(MissedItem {
number: r.item_number,
item_ref: r.item_ref.clone(),
selected: r.selected.clone(),
selected: r.chosen().to_vec(),
credit: r.credit,
level: r.level,
learning_objectives: r.learning_objectives.clone(),
@@ -1089,6 +1089,7 @@ mod tests {
assessment_id: "a".into(),
date: None,
form: None,
form_position: None,
student_key: student.into(),
sid: None,
name: None,
@@ -1098,7 +1099,9 @@ mod tests {
item_ref: None,
item_version: None,
selected: vec!["A".into()],
selected_source: vec![],
eliminated: vec![],
eliminated_source: vec![],
correct: Some(credit >= 0.999),
credit,
points_possible: 1.0,