Skip to content

curriculum: add actionable assertion messages to generators checks - #152

Closed
Ali-Nawaz-devt wants to merge 6 commits into
abhiksark:mainfrom
Ali-Nawaz-devt:fix-generator-assertion-messages
Closed

Ali-Nawaz-devt wants to merge 6 commits into
abhiksark:mainfrom
Ali-Nawaz-devt:fix-generator-assertion-messages

Conversation

@Ali-Nawaz-devt

@Ali-Nawaz-devt Ali-Nawaz-devt commented Sep 20, 2026

Copy link
Copy Markdown

Closes #90
Closes #91

Summary

Adds actionable assertion messages to all 24 currently bare assertions across the 7 generators check files (14 from #90, 10 from #91). Preserves every assertion predicate, execution order, helper statement, and success print. Two asserts (next(c) == 0, next(c) == 1 in generators9.py) use static messages rather than echoing the actual value, since Counter is a stateful iterator and re-calling next(c) inside the message would advance it and corrupt the rest of the test sequence.

Validation

Summary by CodeRabbit

  • Tests

    • Added descriptive failure messages across enum, generator, itertools, OOP, and pathlib exercises.
    • Failed checks now show expected conditions alongside relevant actual values, making troubleshooting clearer.
    • Existing validation logic, expected results, and successful outputs remain unchanged.
  • Documentation

    • Clarified that the built-in editor reruns checks shortly after typing stops.
    • Documented that external-editor users must save changes and run the exercise command manually.

frobel0520 and others added 6 commits August 24, 2026 00:15
…h 2) (abhiksark#139)

* curriculum: add assertion message to checks/oop_advanced/oop_advanced7.py

* curriculum: add assertion message to checks/oop_advanced/oop_advanced8.py

* curriculum: add assertion message to checks/oop_advanced/oop_advanced9.py

* curriculum: add assertion message to checks/oop_advanced/oop_advanced10.py

* curriculum: add assertion message to checks/oop_advanced/oop_advanced11.py

* curriculum: add assertion message to checks/oop_advanced/oop_advanced12.py

* fix(curriculum): normalize advanced OOP checks

---------

Co-authored-by: Abhik Sarkar <abhiksark@gmail.com>
@coderabbitai

coderabbitai Bot commented Sep 20, 2026

Copy link
Copy Markdown

Review Change StackReview Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Advanced

Run ID: e52cd731-3768-4275-9de6-56001e817971

📥 Commits

Reviewing files that changed from the base of the PR and between b4d40bf and ca3dd1e.

📒 Files selected for processing (34)
  • checks/enums/enums1.py
  • checks/enums/enums2.py
  • checks/enums/enums3.py
  • checks/enums/enums4.py
  • checks/enums/enums5.py
  • checks/enums/enums6.py
  • checks/generators/generators1.py
  • checks/generators/generators10.py
  • checks/generators/generators3.py
  • checks/generators/generators6.py
  • checks/generators/generators7.py
  • checks/generators/generators8.py
  • checks/generators/generators9.py
  • checks/itertools/itertools3.py
  • checks/itertools/itertools4.py
  • checks/itertools/itertools5.py
  • checks/itertools/itertools6.py
  • checks/itertools/itertools7.py
  • checks/itertools/itertools8.py
  • checks/oop_advanced/oop_advanced10.py
  • checks/oop_advanced/oop_advanced11.py
  • checks/oop_advanced/oop_advanced12.py
  • checks/oop_advanced/oop_advanced7.py
  • checks/oop_advanced/oop_advanced8.py
  • checks/oop_advanced/oop_advanced9.py
  • checks/pathlib/pathlib1.py
  • checks/pathlib/pathlib2.py
  • checks/pathlib/pathlib3.py
  • checks/pathlib/pathlib4.py
  • checks/pathlib/pathlib5.py
  • checks/pathlib/pathlib6.py
  • docs-site/how-it-works.md
  • docs-site/index.md
  • docs-site/quick-start.md

Included review availability: Your plan provides up to 1 included review per hour; 0 remain after this review.

📜 Recent review details
🧰 Additional context used
📓 Path-based instructions (6)
Maintain Python 3.9 compatibility.

📄 CodeRabbit inference engine (AGENTS.md)

Files:

  • checks/pathlib/pathlib3.py
  • checks/enums/enums2.py
  • checks/itertools/itertools6.py
  • checks/oop_advanced/oop_advanced12.py
  • checks/itertools/itertools7.py
  • checks/enums/enums6.py
  • checks/itertools/itertools5.py
  • checks/generators/generators10.py
  • checks/pathlib/pathlib1.py
  • checks/enums/enums3.py
  • checks/generators/generators1.py
  • checks/oop_advanced/oop_advanced10.py
  • checks/itertools/itertools4.py
  • checks/pathlib/pathlib6.py
  • checks/enums/enums1.py
  • checks/itertools/itertools8.py
  • checks/pathlib/pathlib4.py
  • checks/pathlib/pathlib2.py
  • checks/generators/generators7.py
  • checks/generators/generators3.py
  • checks/generators/generators9.py
  • checks/enums/enums4.py
  • checks/oop_advanced/oop_advanced9.py
  • checks/oop_advanced/oop_advanced7.py
  • checks/pathlib/pathlib5.py
  • checks/itertools/itertools3.py
  • checks/oop_advanced/oop_advanced8.py
  • checks/enums/enums5.py
  • checks/oop_advanced/oop_advanced11.py
  • checks/generators/generators8.py
  • checks/generators/generators6.py
Preserve learner-edited exercises during workspace updates.

📄 CodeRabbit inference engine (AGENTS.md)

Files:

  • checks/pathlib/pathlib3.py
  • checks/enums/enums2.py
  • checks/itertools/itertools6.py
  • docs-site/quick-start.md
  • checks/oop_advanced/oop_advanced12.py
  • checks/itertools/itertools7.py
  • checks/enums/enums6.py
  • checks/itertools/itertools5.py
  • checks/generators/generators10.py
  • checks/pathlib/pathlib1.py
  • checks/enums/enums3.py
  • checks/generators/generators1.py
  • docs-site/index.md
  • checks/oop_advanced/oop_advanced10.py
  • checks/itertools/itertools4.py
  • checks/pathlib/pathlib6.py
  • checks/enums/enums1.py
  • checks/itertools/itertools8.py
  • checks/pathlib/pathlib4.py
  • checks/pathlib/pathlib2.py
  • checks/generators/generators7.py
  • checks/generators/generators3.py
  • checks/generators/generators9.py
  • checks/enums/enums4.py
  • checks/oop_advanced/oop_advanced9.py
  • checks/oop_advanced/oop_advanced7.py
  • checks/pathlib/pathlib5.py
  • checks/itertools/itertools3.py
  • docs-site/how-it-works.md
  • checks/oop_advanced/oop_advanced8.py
  • checks/enums/enums5.py
  • checks/oop_advanced/oop_advanced11.py
  • checks/generators/generators8.py
  • checks/generators/generators6.py
Before editing `docs-site/**` or `pythonlings/docs/**`, read the corresponding nested `AGENTS.md` in that directory.

📄 CodeRabbit inference engine (CLAUDE.md)

Files:

  • docs-site/quick-start.md
  • docs-site/index.md
  • docs-site/how-it-works.md
Checks must use bare assertions with actionable, beginner-facing messages.

📄 CodeRabbit inference engine (AGENTS.md)

Files:

  • checks/pathlib/pathlib3.py
  • checks/enums/enums2.py
  • checks/itertools/itertools6.py
  • checks/oop_advanced/oop_advanced12.py
  • checks/itertools/itertools7.py
  • checks/enums/enums6.py
  • checks/itertools/itertools5.py
  • checks/generators/generators10.py
  • checks/pathlib/pathlib1.py
  • checks/enums/enums3.py
  • checks/generators/generators1.py
  • checks/oop_advanced/oop_advanced10.py
  • checks/itertools/itertools4.py
  • checks/pathlib/pathlib6.py
  • checks/enums/enums1.py
  • checks/itertools/itertools8.py
  • checks/pathlib/pathlib4.py
  • checks/pathlib/pathlib2.py
  • checks/generators/generators7.py
  • checks/generators/generators3.py
  • checks/generators/generators9.py
  • checks/enums/enums4.py
  • checks/oop_advanced/oop_advanced9.py
  • checks/oop_advanced/oop_advanced7.py
  • checks/pathlib/pathlib5.py
  • checks/itertools/itertools3.py
  • checks/oop_advanced/oop_advanced8.py
  • checks/enums/enums5.py
  • checks/oop_advanced/oop_advanced11.py
  • checks/generators/generators8.py
  • checks/generators/generators6.py
Before editing `docs-site/**`, also read `docs-site/AGENTS.md`.

📄 CodeRabbit inference engine (AGENTS.md)

Files:

  • docs-site/quick-start.md
  • docs-site/index.md
  • docs-site/how-it-works.md
This guide applies to `docs-site/**`.

📄 CodeRabbit inference engine (docs-site/AGENTS.md)

Files:

  • docs-site/quick-start.md
  • docs-site/index.md
  • docs-site/how-it-works.md
🪛 Ruff (0.16.5)
checks/pathlib/pathlib3.py

[error] 3-3: Undefined name parent

(F821)


[error] 4-4: Undefined name parent

(F821)


[error] 6-6: Undefined name stem

(F821)


[error] 7-7: Undefined name suffix

(F821)

checks/enums/enums2.py

[error] 1-1: Undefined name Status

(F821)


[error] 3-3: Undefined name Status

(F821)


[error] 5-5: Undefined name Status

(F821)


[error] 7-7: Undefined name Status

(F821)

checks/itertools/itertools6.py

[error] 1-1: Undefined name repeated

(F821)


[error] 3-3: Undefined name repeated

(F821)

checks/oop_advanced/oop_advanced12.py

[error] 2-2: Undefined name Vector

(F821)

checks/itertools/itertools7.py

[error] 1-1: Undefined name pairs

(F821)


[error] 3-3: Undefined name pairs

(F821)

checks/enums/enums6.py

[error] 1-1: Undefined name Direction

(F821)


[error] 4-4: Undefined name Direction

(F821)

checks/itertools/itertools5.py

[error] 1-1: Undefined name running_totals

(F821)


[error] 3-3: Undefined name running_totals

(F821)

checks/generators/generators10.py

[error] 2-2: Undefined name running_total

(F821)


[error] 3-3: Undefined name running_total

(F821)


[error] 4-4: Undefined name running_total

(F821)


[error] 5-5: Undefined name running_total

(F821)


[error] 6-6: Undefined name running_total

(F821)

checks/pathlib/pathlib1.py

[error] 3-3: Undefined name path

(F821)


[error] 4-4: Undefined name path

(F821)


[error] 6-6: Undefined name filename

(F821)


[error] 7-7: Undefined name filename

(F821)

checks/enums/enums3.py

[error] 1-1: Undefined name selected_name

(F821)


[error] 2-2: Undefined name selected_name

(F821)


[error] 4-4: Undefined name selected_value

(F821)


[error] 5-5: Undefined name selected_value

(F821)

checks/generators/generators1.py

[error] 2-2: Undefined name count_up_to

(F821)


[error] 3-3: Undefined name count_up_to

(F821)


[error] 4-4: Undefined name count_up_to

(F821)

checks/oop_advanced/oop_advanced10.py

[error] 1-1: Undefined name Square

(F821)


[error] 1-1: Undefined name Shape

(F821)


[error] 2-2: Undefined name Square

(F821)

checks/itertools/itertools4.py

[error] 1-1: Undefined name grouped

(F821)


[error] 6-6: Undefined name grouped

(F821)

checks/pathlib/pathlib6.py

[error] 3-3: Undefined name processed

(F821)


[error] 4-4: Undefined name processed

(F821)


[error] 6-6: Undefined name parts

(F821)


[error] 7-7: Undefined name parts

(F821)

checks/enums/enums1.py

[error] 1-1: Undefined name Color

(F821)


[error] 2-2: Undefined name Color

(F821)


[error] 4-4: Undefined name Color

(F821)


[error] 5-5: Undefined name Color

(F821)


[error] 7-7: Undefined name favorite

(F821)


[error] 7-7: Undefined name Color

(F821)


[error] 8-8: Undefined name favorite

(F821)

checks/itertools/itertools8.py

[error] 1-1: Undefined name flattened

(F821)


[error] 3-3: Undefined name flattened

(F821)


[error] 5-5: Undefined name adjacent_pairs

(F821)


[error] 7-7: Undefined name adjacent_pairs

(F821)

checks/pathlib/pathlib4.py

[error] 3-3: Undefined name python_files

(F821)


[error] 5-5: Undefined name python_files

(F821)

checks/pathlib/pathlib2.py

[error] 3-3: Undefined name source

(F821)


[error] 4-4: Undefined name source

(F821)

checks/generators/generators7.py

[error] 4-4: Undefined name fibonacci

(F821)


[error] 8-8: Undefined name fibonacci

(F821)

checks/generators/generators3.py

[error] 2-2: Undefined name collected

(F821)


[error] 3-3: Undefined name evens_up_to

(F821)


[error] 4-4: Undefined name evens_up_to

(F821)

checks/generators/generators9.py

[error] 2-2: Undefined name Counter

(F821)


[error] 3-3: Undefined name Counter

(F821)


[error] 4-4: Undefined name Counter

(F821)


[error] 5-5: Undefined name Counter

(F821)

checks/enums/enums4.py

[error] 1-1: Undefined name size_codes

(F821)


[error] 2-2: Undefined name size_codes

(F821)

checks/oop_advanced/oop_advanced9.py

[error] 1-1: Undefined name Grade

(F821)


[error] 2-2: Undefined name Grade

(F821)


[error] 3-3: Undefined name Grade

(F821)

checks/oop_advanced/oop_advanced7.py

[error] 1-1: Undefined name Book

(F821)


[error] 4-4: Undefined name Book

(F821)

checks/pathlib/pathlib5.py

[error] 3-3: Undefined name final

(F821)


[error] 4-4: Undefined name final

(F821)

checks/itertools/itertools3.py

[error] 1-1: Undefined name coordinates

(F821)


[error] 8-8: Undefined name coordinates

(F821)

checks/enums/enums5.py

[error] 1-1: Undefined name is_terminal

(F821)


[error] 1-1: Undefined name TicketState

(F821)


[error] 4-4: Undefined name is_terminal

(F821)


[error] 4-4: Undefined name TicketState

(F821)


[error] 7-7: Undefined name is_terminal

(F821)


[error] 7-7: Undefined name TicketState

(F821)

checks/generators/generators8.py

[error] 2-2: Undefined name Countdown

(F821)


[error] 3-3: Undefined name Countdown

(F821)


[error] 4-4: Undefined name Countdown

(F821)


[error] 5-5: Undefined name Countdown

(F821)

checks/generators/generators6.py

[error] 2-2: Undefined name first_ten

(F821)


[error] 3-3: Undefined name first_ten

(F821)


[error] 5-5: Undefined name itertools

(F821)


[error] 5-5: Undefined name natural_numbers

(F821)

🔇 Additional comments (34)
docs-site/how-it-works.md (1)

12-13: LGTM!

docs-site/index.md (1)

10-12: LGTM!

docs-site/quick-start.md (1)

64-68: LGTM!

checks/enums/enums1.py (1)

1-9: LGTM!

checks/enums/enums2.py (1)

1-8: LGTM!

checks/enums/enums3.py (1)

1-6: LGTM!

checks/enums/enums4.py (1)

1-3: LGTM!

checks/enums/enums5.py (1)

1-9: LGTM!

checks/enums/enums6.py (1)

1-6: LGTM!

checks/generators/generators1.py (1)

1-5: LGTM!

checks/generators/generators3.py (1)

1-5: LGTM!

checks/generators/generators6.py (1)

1-1: LGTM!

Also applies to: 6-8

checks/generators/generators7.py (1)

1-1: LGTM!

Also applies to: 9-11

checks/generators/generators8.py (1)

1-4: LGTM!

Also applies to: 6-8

checks/generators/generators9.py (1)

1-7: LGTM!

Also applies to: 13-13

checks/generators/generators10.py (1)

1-7: LGTM!

checks/itertools/itertools3.py (1)

1-9: LGTM!

checks/itertools/itertools4.py (1)

1-7: LGTM!

checks/itertools/itertools5.py (1)

1-4: LGTM!

checks/itertools/itertools6.py (1)

1-4: LGTM!

checks/itertools/itertools7.py (1)

1-4: LGTM!

checks/itertools/itertools8.py (1)

1-8: LGTM!

checks/oop_advanced/oop_advanced10.py (1)

1-2: LGTM!

checks/oop_advanced/oop_advanced11.py (1)

2-5: LGTM!

checks/oop_advanced/oop_advanced12.py (1)

2-9: LGTM!

checks/oop_advanced/oop_advanced7.py (1)

1-6: LGTM!

checks/oop_advanced/oop_advanced8.py (1)

2-5: LGTM!

checks/oop_advanced/oop_advanced9.py (1)

1-5: LGTM!

checks/pathlib/pathlib1.py (1)

3-8: LGTM!

checks/pathlib/pathlib2.py (1)

3-5: LGTM!

checks/pathlib/pathlib3.py (1)

3-7: LGTM!

checks/pathlib/pathlib4.py (1)

3-6: LGTM!

checks/pathlib/pathlib5.py (1)

3-5: LGTM!

checks/pathlib/pathlib6.py (1)

3-8: LGTM!


📝 Walkthrough

Walkthrough

The change adds descriptive failure messages to assertions across curriculum checks. It preserves assertion conditions and success output. Documentation now explains automatic checks in the built-in editor and manual checks for external editors.

Changes

Assertion diagnostics

Layer / File(s) Summary
Enum assertion diagnostics
checks/enums/*
Enum assertions now report expected behavior and observed values when they fail.
Generator assertion diagnostics
checks/generators/*
Generator assertions now include actionable failure messages and observed values.
Collection and object assertion diagnostics
checks/itertools/*, checks/oop_advanced/*, checks/pathlib/*
Assertions now report expected and actual values for collection, object, and path checks.

Editor workflow documentation

Layer / File(s) Summary
Editor workflow instructions
docs-site/how-it-works.md, docs-site/index.md, docs-site/quick-start.md
Documentation distinguishes automatic built-in-editor checks from manual external-editor checks using pythonlings run <name>.

Priority: ⬇️ Low

Estimated code review effort: 2 (Simple) | ~15 minutes

Change: Other · Severity of issue fixed: Low

Suggested reviewers: abhiksark

🚥 Pre-merge checks | ✅ 4 | ❌ 3

❌ Failed checks (2 warnings, 1 inconclusive)

Check name Status Explanation Resolution
Out of Scope Changes check ⚠️ Warning The changes include unrelated enum, itertools, OOP, pathlib, and documentation files. The stated objectives limit the pull request to seven generator check files and explicitly exclude documentation a… Remove the unrelated changes from this pull request, or update the pull request objectives and linked issue scope to include them.
Out of Scope Changes check ⚠️ Warning The pull request changes files outside the scope of [#90] and [#91]. The summary lists changes in checks/enums, checks/itertools, checks/oop_advanced, checks/pathlib, and docs-site. The issues limit c… Remove the unrelated changes in checks/enums, checks/itertools, checks/oop_advanced, checks/pathlib, and docs-site. Keep only changes required for the seven generator check files.
Linked Issues check ❓ Inconclusive The generator changes address the 24 targeted bare assertions in the seven files named by [#90] and [#91]. The summary states that predicates, order, side effects, helper statements, and success outpu… Provide reviewable validation evidence that all 292 reference answers pass and that the changed checks remain Python 3.9 compatible.
✅ Passed checks (4 passed)
Check name Status Explanation
Title check ✅ Passed The title clearly identifies the main change: adding actionable assertion messages to generator checks.
Description check ✅ Passed The description provides a complete summary and detailed validation results. It omits the template headings for Tests, Screenshots, and Checklist, but the required test evidence is included under Vali…
Linked Issues check ✅ Passed The description references issues #90 and #91, and the stated objectives match the requested generator assertion-message changes.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check. Docstring coverage is scoped to functions touched by this diff. Analyzed 0 functions across 3…
Full details: Out of Scope Changes check

Explanation

The changes include unrelated enum, itertools, OOP, pathlib, and documentation files. The stated objectives limit the pull request to seven generator check files and explicitly exclude documentation and other curriculum files.

Full details: Linked Issues check

Explanation

The generator changes address the 24 targeted bare assertions in the seven files named by [#90] and [#91]. The summary states that predicates, order, side effects, helper statements, and success output remain unchanged. It also reports passing integration and full test commands. The available evidence does not establish that all 292 reference answers passed or that the checks were verified on Python 3.9.

Full details: Out of Scope Changes check

Explanation

The pull request changes files outside the scope of [#90] and [#91]. The summary lists changes in checks/enums, checks/itertools, checks/oop_advanced, checks/pathlib, and docs-site. The issues limit changes to checks/generators/generators1.py, generators3.py, generators6.py, generators7.py, generators8.py, generators9.py, and generators10.py, and explicitly exclude documentation and unrelated checks.

  • Fix all pre-merge checks with AI
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create a new PR

Warning

⚠️ This pull request shows signs of AI-generated slop (redundant_comments, description_diff_mismatch). It has been flagged by CodeRabbit slop detection and should be reviewed carefully.


Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

I twitch my nose at messages bright,
Each failed check now shines its light.
The editor waits, then checks anew,
External saves have steps to do.
Hop, hop—the curriculum is clear!

Comment @coderabbitai help to get the list of available commands.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

3 participants