From e8e1c0cbda117f1deb10d34a9c0b59841992b984 Mon Sep 17 00:00:00 2001 From: Vaia Patta Date: Tue, 27 Jan 2026 21:03:18 +0200 Subject: [PATCH 1/7] Moviegoer and SimpleCalculator accept exceptions from both scopes The tests for these two learning exercises now check whether the expected exception has been defined inside or outside the main class. Solves issue #6772 --- exercises/concept/moviegoer/moviegoer_test.rb | 3 ++- .../concept/simple-calculator/simple_calculator_test.rb | 9 ++++++--- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/exercises/concept/moviegoer/moviegoer_test.rb b/exercises/concept/moviegoer/moviegoer_test.rb index c31a3e4641..7925422b84 100644 --- a/exercises/concept/moviegoer/moviegoer_test.rb +++ b/exercises/concept/moviegoer/moviegoer_test.rb @@ -23,7 +23,8 @@ def test_members_get_free_popcorn end def test_regular_moviegoers_dont_get_free_popcorn - assert_raises NotMovieClubMemberError do + expected_exception=Moviegoer.include?(NotMovieClubMemberError)?(Moviegoer::NotMovieClubMemberError):NotMovieClubMemberError + assert_raises expected_exception do Moviegoer.new(25, member: false).claim_free_popcorn! end end diff --git a/exercises/concept/simple-calculator/simple_calculator_test.rb b/exercises/concept/simple-calculator/simple_calculator_test.rb index 1b26e42796..c8d426ecfa 100644 --- a/exercises/concept/simple-calculator/simple_calculator_test.rb +++ b/exercises/concept/simple-calculator/simple_calculator_test.rb @@ -27,14 +27,17 @@ def test_no_number_second_operand_raises_exception end def test_raises_exception_for_non_valid_operations - assert_raises(SimpleCalculator::UnsupportedOperation) { SimpleCalculator.calculate(1, 2, '**') } + expected_exception=SimpleCalculator.include?(UnsupportedOperation)?(SimpleCalculator::UnsupportedOperation):UnsupportedOperation + assert_raises(expected_exception) { SimpleCalculator.calculate(1, 2, '**') } end def test_raises_exception_when_operation_is_nil - assert_raises(SimpleCalculator::UnsupportedOperation) { SimpleCalculator.calculate(1, 2, nil) } + expected_exception=SimpleCalculator.include?(UnsupportedOperation)?(SimpleCalculator::UnsupportedOperation):UnsupportedOperation + assert_raises(expected_exception) { SimpleCalculator.calculate(1, 2, nil) } end def test_raises_exception_when_operation_is_an_empty_string - assert_raises(SimpleCalculator::UnsupportedOperation) { SimpleCalculator.calculate(1, 2, '') } + expected_exception=SimpleCalculator.include?(UnsupportedOperation)?(SimpleCalculator::UnsupportedOperation):UnsupportedOperation + assert_raises(expected_exception) { SimpleCalculator.calculate(1, 2, '') } end end From e978d29b532e29a8327e9cc3a2765c1d643c5bce Mon Sep 17 00:00:00 2001 From: Isaac Good Date: Sun, 1 Feb 2026 03:00:06 -0800 Subject: [PATCH 2/7] Fix up boutique-inventory-improvements instructions (#1820) * One sentence per line. * `s/openstruct/OpenStruct/` * Fix header markdown to properly render. --- .../.docs/instructions.md | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/exercises/concept/boutique-inventory-improvements/.docs/instructions.md b/exercises/concept/boutique-inventory-improvements/.docs/instructions.md index b60f347dd3..34fc952837 100644 --- a/exercises/concept/boutique-inventory-improvements/.docs/instructions.md +++ b/exercises/concept/boutique-inventory-improvements/.docs/instructions.md @@ -1,6 +1,8 @@ # Instructions -You're continuing to work on the stock management system you built previously. Since discovering `OpenStruct` and block shortcuts, you've decided to refactor the code a little. Rather than storing the items as hashes, you're going to utilize your newfound skills. +You're continuing to work on the stock management system you built previously. +Since discovering `OpenStruct` and block shortcuts, you've decided to refactor the code a little. +Rather than storing the items as hashes, you're going to utilize your newfound skills. ## 1. Allow retrievable of items @@ -24,7 +26,7 @@ inventory.items.size # => 4 ``` -# 2. Refactor `item_names` +## 2. Refactor `item_names` Refactor `item_names` to use the new block shortcut you've learnt rather than hashes. As a reminder, the method should return: @@ -40,11 +42,10 @@ BoutiqueInventory.new([ # => ["Bamboo Socks Cats", "Black Short Skirt", "Maxi Brown Dress", "Red Short Skirt"] ``` +## 3. Refactor `total_stock` -# 2. Refactor `total_stock` - -Refactor `total_stock` to use the openstruct's method, rather than referencing a hash. -As a reminder, the method should return:: +Refactor `total_stock` to use the OpenStruct's method, rather than referencing a hash. +As a reminder, the method should return: ```ruby BoutiqueInventory.new([ From 60b3847124ec572118f750b173214b7f8434547a Mon Sep 17 00:00:00 2001 From: Isaac Good Date: Sun, 1 Feb 2026 03:02:13 -0800 Subject: [PATCH 3/7] Advanced Enumeration concept doc: Correct whitespace in enumeration (#1819) --- concepts/advanced-enumeration/about.md | 6 +++--- concepts/advanced-enumeration/introduction.md | 6 +++--- exercises/concept/boutique-inventory/.docs/introduction.md | 6 +++--- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/concepts/advanced-enumeration/about.md b/concepts/advanced-enumeration/about.md index afa1e3cdfe..d5e7c2b63b 100644 --- a/concepts/advanced-enumeration/about.md +++ b/concepts/advanced-enumeration/about.md @@ -14,12 +14,12 @@ fibonacci.none? { |number| number > 20 } #=> true fibonacci.select { |number| number.odd? } #=> [1, 1, 3, 5, 13] fibonacci.all? { |number| number < 20 } #=> true fibonacci.map { |number| number * 2 } #=> [0, 2, 2, 4, 6, 10, 16, 26] -fibonacci.select { |number| number >= 5} #=> [5, 8, 13] -fibonacci.find { |number| number >= 5} #=> 5 +fibonacci.select { |number| number >= 5 } #=> [5, 8, 13] +fibonacci.find { |number| number >= 5 } #=> 5 # Some methods work with or without a block fibonacci.sum #=> 33 -fibonacci.sum {| number | number * number } #=> 273 +fibonacci.sum { |number| number * number } #=> 273 # There are also methods to help with nested arrays: animals = [ ['cat', 'bob'], ['horse', 'caris'], ['mouse', 'arya'] ] diff --git a/concepts/advanced-enumeration/introduction.md b/concepts/advanced-enumeration/introduction.md index 5a20fb38a2..f2ccb0bcde 100644 --- a/concepts/advanced-enumeration/introduction.md +++ b/concepts/advanced-enumeration/introduction.md @@ -14,12 +14,12 @@ fibonacci.none? { |number| number > 20 } #=> true fibonacci.select { |number| number.odd? } #=> [1, 1, 3, 5, 13] fibonacci.all? { |number| number < 20 } #=> true fibonacci.map { |number| number * 2 } #=> [0, 2, 2, 4, 6, 10, 16, 26] -fibonacci.select { |number| number >= 5} #=> [5, 8, 13] -fibonacci.find { |number| number >= 5} #=> 5 +fibonacci.select { |number| number >= 5 } #=> [5, 8, 13] +fibonacci.find { |number| number >= 5 } #=> 5 # Some methods work with or without a block fibonacci.sum #=> 33 -fibonacci.sum {| number | number * number } #=> 273 +fibonacci.sum { |number| number * number } #=> 273 # There are also methods to help with nested arrays: animals = [ ['cat', 'bob'], ['horse', 'caris'], ['mouse', 'arya'] ] diff --git a/exercises/concept/boutique-inventory/.docs/introduction.md b/exercises/concept/boutique-inventory/.docs/introduction.md index d7cf341980..7d88a22671 100644 --- a/exercises/concept/boutique-inventory/.docs/introduction.md +++ b/exercises/concept/boutique-inventory/.docs/introduction.md @@ -14,12 +14,12 @@ fibonacci.none? { |number| number > 20 } #=> true fibonacci.select { |number| number.odd? } #=> [1, 1, 3, 5, 13] fibonacci.all? { |number| number < 20 } #=> true fibonacci.map { |number| number * 2 } #=> [0, 2, 2, 4, 6, 10, 16, 26] -fibonacci.select { |number| number >= 5} #=> [5, 8, 13] -fibonacci.find { |number| number >= 6} #=> 8 +fibonacci.select { |number| number >= 5 } #=> [5, 8, 13] +fibonacci.find { |number| number >= 6 } #=> 8 # Some methods work with or without a block fibonacci.sum #=> 33 -fibonacci.sum {| number | number * number } #=> 273 +fibonacci.sum { |number| number * number } #=> 273 # There are also methods to help with nested arrays: animals = [ ['cat', 'bob'], ['horse', 'caris'], ['mouse', 'arya'] ] From 209f96bdfd12b6032f1f959fc32c7af968c06d87 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 1 Feb 2026 05:05:46 -0600 Subject: [PATCH 4/7] Bump ruby/setup-ruby from 1.278.0 to 1.287.0 (#1818) Bumps [ruby/setup-ruby](https://github.com/ruby/setup-ruby) from 1.278.0 to 1.287.0. - [Release notes](https://github.com/ruby/setup-ruby/releases) - [Changelog](https://github.com/ruby/setup-ruby/blob/master/release.rb) - [Commits](https://github.com/ruby/setup-ruby/compare/4c24fa5ec04b2e79eb40571b1cee2a0d2b705771...8d27f39a5e7ad39aebbcbd1324f7af020229645c) --- updated-dependencies: - dependency-name: ruby/setup-ruby dependency-version: 1.287.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/exercise-tests.yml | 2 +- .github/workflows/generator-tests.yml | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/exercise-tests.yml b/.github/workflows/exercise-tests.yml index 33df406432..531675c824 100644 --- a/.github/workflows/exercise-tests.yml +++ b/.github/workflows/exercise-tests.yml @@ -22,7 +22,7 @@ jobs: - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 - name: Set up Ruby - uses: ruby/setup-ruby@4c24fa5ec04b2e79eb40571b1cee2a0d2b705771 + uses: ruby/setup-ruby@8d27f39a5e7ad39aebbcbd1324f7af020229645c with: ruby-version: ${{ matrix.ruby-version }} bundler-cache: true diff --git a/.github/workflows/generator-tests.yml b/.github/workflows/generator-tests.yml index 2445790607..bb0bf33290 100644 --- a/.github/workflows/generator-tests.yml +++ b/.github/workflows/generator-tests.yml @@ -14,7 +14,7 @@ jobs: steps: - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 - name: Set up Ruby - uses: ruby/setup-ruby@4c24fa5ec04b2e79eb40571b1cee2a0d2b705771 + uses: ruby/setup-ruby@8d27f39a5e7ad39aebbcbd1324f7af020229645c with: ruby-version: "3.3" bundler-cache: true @@ -26,7 +26,7 @@ jobs: steps: - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 - name: Set up Ruby - uses: ruby/setup-ruby@4c24fa5ec04b2e79eb40571b1cee2a0d2b705771 + uses: ruby/setup-ruby@8d27f39a5e7ad39aebbcbd1324f7af020229645c with: ruby-version: "3.3" bundler-cache: true From 7ec93bb67e1c44c94854e393a13d2fe76e8b87cc Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 1 Feb 2026 05:05:55 -0600 Subject: [PATCH 5/7] Bump actions/checkout from 6.0.1 to 6.0.2 (#1817) Bumps [actions/checkout](https://github.com/actions/checkout) from 6.0.1 to 6.0.2. - [Release notes](https://github.com/actions/checkout/releases) - [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md) - [Commits](https://github.com/actions/checkout/compare/8e8c483db84b4bee98b60c0593521ed34d9990e8...de0fac2e4500dabe0009e67214ff5f5447ce83dd) --- updated-dependencies: - dependency-name: actions/checkout dependency-version: 6.0.2 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/exercise-tests.yml | 2 +- .github/workflows/generator-tests.yml | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/exercise-tests.yml b/.github/workflows/exercise-tests.yml index 531675c824..8ed279c0f3 100644 --- a/.github/workflows/exercise-tests.yml +++ b/.github/workflows/exercise-tests.yml @@ -19,7 +19,7 @@ jobs: ruby-version: [3.2, 3.3] steps: - - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd - name: Set up Ruby uses: ruby/setup-ruby@8d27f39a5e7ad39aebbcbd1324f7af020229645c diff --git a/.github/workflows/generator-tests.yml b/.github/workflows/generator-tests.yml index bb0bf33290..582b8d2cee 100644 --- a/.github/workflows/generator-tests.yml +++ b/.github/workflows/generator-tests.yml @@ -12,7 +12,7 @@ jobs: name: Check Generator Templates runs-on: ubuntu-22.04 steps: - - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd - name: Set up Ruby uses: ruby/setup-ruby@8d27f39a5e7ad39aebbcbd1324f7af020229645c with: @@ -24,7 +24,7 @@ jobs: name: Test Generator runs-on: ubuntu-22.04 steps: - - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd - name: Set up Ruby uses: ruby/setup-ruby@8d27f39a5e7ad39aebbcbd1324f7af020229645c with: From fbd33a45b745acb4a2fb1e3d569e025321331c1e Mon Sep 17 00:00:00 2001 From: Vaia Patta Date: Tue, 27 Jan 2026 21:03:18 +0200 Subject: [PATCH 6/7] Moviegoer and SimpleCalculator accept exceptions from both scopes The tests for these two learning exercises now check whether the expected exception has been defined inside or outside the main class. Solves issue #6772 --- exercises/concept/moviegoer/moviegoer_test.rb | 3 ++- .../concept/simple-calculator/simple_calculator_test.rb | 9 ++++++--- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/exercises/concept/moviegoer/moviegoer_test.rb b/exercises/concept/moviegoer/moviegoer_test.rb index c31a3e4641..7925422b84 100644 --- a/exercises/concept/moviegoer/moviegoer_test.rb +++ b/exercises/concept/moviegoer/moviegoer_test.rb @@ -23,7 +23,8 @@ def test_members_get_free_popcorn end def test_regular_moviegoers_dont_get_free_popcorn - assert_raises NotMovieClubMemberError do + expected_exception=Moviegoer.include?(NotMovieClubMemberError)?(Moviegoer::NotMovieClubMemberError):NotMovieClubMemberError + assert_raises expected_exception do Moviegoer.new(25, member: false).claim_free_popcorn! end end diff --git a/exercises/concept/simple-calculator/simple_calculator_test.rb b/exercises/concept/simple-calculator/simple_calculator_test.rb index 1b26e42796..c8d426ecfa 100644 --- a/exercises/concept/simple-calculator/simple_calculator_test.rb +++ b/exercises/concept/simple-calculator/simple_calculator_test.rb @@ -27,14 +27,17 @@ def test_no_number_second_operand_raises_exception end def test_raises_exception_for_non_valid_operations - assert_raises(SimpleCalculator::UnsupportedOperation) { SimpleCalculator.calculate(1, 2, '**') } + expected_exception=SimpleCalculator.include?(UnsupportedOperation)?(SimpleCalculator::UnsupportedOperation):UnsupportedOperation + assert_raises(expected_exception) { SimpleCalculator.calculate(1, 2, '**') } end def test_raises_exception_when_operation_is_nil - assert_raises(SimpleCalculator::UnsupportedOperation) { SimpleCalculator.calculate(1, 2, nil) } + expected_exception=SimpleCalculator.include?(UnsupportedOperation)?(SimpleCalculator::UnsupportedOperation):UnsupportedOperation + assert_raises(expected_exception) { SimpleCalculator.calculate(1, 2, nil) } end def test_raises_exception_when_operation_is_an_empty_string - assert_raises(SimpleCalculator::UnsupportedOperation) { SimpleCalculator.calculate(1, 2, '') } + expected_exception=SimpleCalculator.include?(UnsupportedOperation)?(SimpleCalculator::UnsupportedOperation):UnsupportedOperation + assert_raises(expected_exception) { SimpleCalculator.calculate(1, 2, '') } end end From 3ed741b3db62124edff8baef6d1752cd009853e9 Mon Sep 17 00:00:00 2001 From: Vaia Patta Date: Sun, 15 Feb 2026 19:25:37 +0200 Subject: [PATCH 7/7] whitespace fixes --- exercises/concept/moviegoer/moviegoer_test.rb | 2 +- .../concept/simple-calculator/simple_calculator_test.rb | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/exercises/concept/moviegoer/moviegoer_test.rb b/exercises/concept/moviegoer/moviegoer_test.rb index 7925422b84..892ffcc615 100644 --- a/exercises/concept/moviegoer/moviegoer_test.rb +++ b/exercises/concept/moviegoer/moviegoer_test.rb @@ -23,7 +23,7 @@ def test_members_get_free_popcorn end def test_regular_moviegoers_dont_get_free_popcorn - expected_exception=Moviegoer.include?(NotMovieClubMemberError)?(Moviegoer::NotMovieClubMemberError):NotMovieClubMemberError + expected_exception = Moviegoer.include?(NotMovieClubMemberError) ? Moviegoer::NotMovieClubMemberError : NotMovieClubMemberError assert_raises expected_exception do Moviegoer.new(25, member: false).claim_free_popcorn! end diff --git a/exercises/concept/simple-calculator/simple_calculator_test.rb b/exercises/concept/simple-calculator/simple_calculator_test.rb index c8d426ecfa..7b1c8b8023 100644 --- a/exercises/concept/simple-calculator/simple_calculator_test.rb +++ b/exercises/concept/simple-calculator/simple_calculator_test.rb @@ -27,17 +27,17 @@ def test_no_number_second_operand_raises_exception end def test_raises_exception_for_non_valid_operations - expected_exception=SimpleCalculator.include?(UnsupportedOperation)?(SimpleCalculator::UnsupportedOperation):UnsupportedOperation + expected_exception = SimpleCalculator.include?(UnsupportedOperation) ? SimpleCalculator::UnsupportedOperation : UnsupportedOperation assert_raises(expected_exception) { SimpleCalculator.calculate(1, 2, '**') } end def test_raises_exception_when_operation_is_nil - expected_exception=SimpleCalculator.include?(UnsupportedOperation)?(SimpleCalculator::UnsupportedOperation):UnsupportedOperation + expected_exception = SimpleCalculator.include?(UnsupportedOperation) ? SimpleCalculator::UnsupportedOperation : UnsupportedOperation assert_raises(expected_exception) { SimpleCalculator.calculate(1, 2, nil) } end def test_raises_exception_when_operation_is_an_empty_string - expected_exception=SimpleCalculator.include?(UnsupportedOperation)?(SimpleCalculator::UnsupportedOperation):UnsupportedOperation + expected_exception = SimpleCalculator.include?(UnsupportedOperation) ? SimpleCalculator::UnsupportedOperation : UnsupportedOperation assert_raises(expected_exception) { SimpleCalculator.calculate(1, 2, '') } end end