From 30482a3090cd6de2e62d64c3821394a228f33814 Mon Sep 17 00:00:00 2001 From: "google-labs-jules[bot]" <161369871+google-labs-jules[bot]@users.noreply.github.com> Date: Thu, 2 Jul 2026 18:08:01 +0000 Subject: [PATCH] Extract duplicate markdown formatting in grade_responses.py - Extracted duplicated logic around lines 710 and 770 in `grade_responses.py` into a helper function `format_grade_report`. - Updated loops in `grade_responses.py` to call `format_grade_report` instead of relying on duplicate logic. - Added a unit test in `tests/test_grade_responses.py` to verify the output of `format_grade_report` matches expectations. Co-authored-by: calmcoconut <41926305+calmcoconut@users.noreply.github.com> --- grade_responses.py | 48 +++++++++++++++-------------------- tests/test_grade_responses.py | 34 ++++++++++++++++++++++++- 2 files changed, 53 insertions(+), 29 deletions(-) diff --git a/grade_responses.py b/grade_responses.py index f865706..1bb7f3a 100755 --- a/grade_responses.py +++ b/grade_responses.py @@ -554,6 +554,22 @@ def generate_summary(model, chapter_title, grades_dict, raise_on_error=False): } +def format_grade_report(q_idx, q, student_ans, grade, section_title): + report_markdown = f"### Q{q_idx + 1} ({section_title})\n" + report_markdown += f"**Question**: {q['q']}\n\n" + report_markdown += f"**Your Answer**:\n> {student_ans}\n\n" + report_markdown += f"**Model Answer (Rubric)**:\n> {q['modelAnswer']}\n\n" + + score_stars = "★" * grade["score"] + "☆" * (5 - grade["score"]) + report_markdown += f"**Grade**: `{score_stars}` ({grade['score']}/5)\n\n" + report_markdown += f"**Strengths**: {grade['strengths']}\n\n" + report_markdown += f"**Weaknesses**: {grade['weaknesses']}\n\n" + report_markdown += ( + f"**Tutor Feedback & Core Concepts**:\n{grade['feedback']}\n\n" + ) + report_markdown += "---\n\n" + return report_markdown + def main(): args = parse_args() @@ -707,19 +723,8 @@ def main(): total_graded_questions += 1 total_score_sum += grade["score"] - report_markdown += f"### Q{q_idx + 1} ({q.get('section', 'General')})\n" - report_markdown += f"**Question**: {q['q']}\n\n" - report_markdown += f"**Your Answer**:\n> {student_ans}\n\n" - report_markdown += f"**Model Answer (Rubric)**:\n> {q['modelAnswer']}\n\n" - - score_stars = "★" * grade["score"] + "☆" * (5 - grade["score"]) - report_markdown += f"**Grade**: `{score_stars}` ({grade['score']}/5)\n\n" - report_markdown += f"**Strengths**: {grade['strengths']}\n\n" - report_markdown += f"**Weaknesses**: {grade['weaknesses']}\n\n" - report_markdown += ( - f"**Tutor Feedback & Core Concepts**:\n{grade['feedback']}\n\n" - ) - report_markdown += "---\n\n" + section_title = q.get('section', 'General') + report_markdown += format_grade_report(q_idx, q, student_ans, grade, section_title) if ch_graded_count > 0: graded_chapters_count += 1 @@ -764,21 +769,8 @@ def main(): total_graded_questions += 1 total_score_sum += grade["score"] - report_markdown += ( - f"### Q{q_idx + 1} (Ch {q.get('chapterNum')} - {q.get('section')})\n" - ) - report_markdown += f"**Question**: {q['q']}\n\n" - report_markdown += f"**Your Answer**:\n> {student_ans}\n\n" - report_markdown += f"**Model Answer (Rubric)**:\n> {q['modelAnswer']}\n\n" - - score_stars = "★" * grade["score"] + "☆" * (5 - grade["score"]) - report_markdown += f"**Grade**: `{score_stars}` ({grade['score']}/5)\n\n" - report_markdown += f"**Strengths**: {grade['strengths']}\n\n" - report_markdown += f"**Weaknesses**: {grade['weaknesses']}\n\n" - report_markdown += ( - f"**Tutor Feedback & Core Concepts**:\n{grade['feedback']}\n\n" - ) - report_markdown += "---\n\n" + section_title = f"Ch {q.get('chapterNum')} - {q.get('section')}" + report_markdown += format_grade_report(q_idx, q, student_ans, grade, section_title) # Write Report Summary summary_markdown = "# DDIA AI Evaluation Summary\n\n" diff --git a/tests/test_grade_responses.py b/tests/test_grade_responses.py index 6f32f52..673d5ea 100644 --- a/tests/test_grade_responses.py +++ b/tests/test_grade_responses.py @@ -1,6 +1,38 @@ import pytest -from grade_responses import _extract_field +from grade_responses import _extract_field, format_grade_report + + +def test_format_grade_report(): + """Test that the helper function formats the markdown report correctly.""" + q_idx = 0 + q = { + "q": "What is the difference between a process and a thread?", + "modelAnswer": "A process is an instance of a program in execution, while a thread is a unit of execution within a process.", + } + student_ans = "Process is program, thread is inside process." + grade = { + "score": 4, + "strengths": "Good understanding of basics.", + "weaknesses": "Could be more detailed.", + "feedback": "Review the concepts of memory sharing.", + } + section_title = "Operating Systems" + + expected_output = ( + "### Q1 (Operating Systems)\n" + "**Question**: What is the difference between a process and a thread?\n\n" + "**Your Answer**:\n> Process is program, thread is inside process.\n\n" + "**Model Answer (Rubric)**:\n> A process is an instance of a program in execution, while a thread is a unit of execution within a process.\n\n" + "**Grade**: `★★★★☆` (4/5)\n\n" + "**Strengths**: Good understanding of basics.\n\n" + "**Weaknesses**: Could be more detailed.\n\n" + "**Tutor Feedback & Core Concepts**:\nReview the concepts of memory sharing.\n\n" + "---\n\n" + ) + + result = format_grade_report(q_idx, q, student_ans, grade, section_title) + assert result == expected_output @pytest.mark.parametrize(