From 5f3a6a19f23caa7d0dc097ae8e197be507c03d11 Mon Sep 17 00:00:00 2001 From: David Kennedy Date: Thu, 14 Feb 2013 12:51:00 +0000 Subject: [PATCH 01/60] Ignore RVM config if the user wants to use it RVM allows the user to select a specific Ruby for a specific project. It is common to put a .rvmrc config file in the root of a project to select the Ruby automatically when the user switches into that project. The Ruby Koans should ignore this file if present and not mistake it for a change to the Koans themselves. There are other ways of choosing a Ruby to use, and use of RVM is not mandated by the Koans so ignoring seems like the right solution. --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index ffb9a5a..81fb2a4 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,6 @@ dist .project_env.rc .path_progress +.rvmrc *.rbc koans/* From eedfeb1022d3b102335a7846ef993b008fd33c5f Mon Sep 17 00:00:00 2001 From: David Kennedy Date: Thu, 14 Feb 2013 13:21:06 +0000 Subject: [PATCH 02/60] Explain how to use watchr in the README Support has been added for watchr, and this is very helpful while walking the path to enlightenment as it keeps the users focus on the koans and not on the repeated need to run rake after each edit. However, only an experienced Rubyist would know how to install and use watchr (or worse, they might just not notice the watchr config file). So let's add an optional section to the README explaining how to use watchr. --- README.rdoc | 56 +++++++++++++++++++++++++++++++++++++++-------------- 1 file changed, 42 insertions(+), 14 deletions(-) diff --git a/README.rdoc b/README.rdoc index 121228b..93e4bc8 100644 --- a/README.rdoc +++ b/README.rdoc @@ -8,9 +8,9 @@ and do great things in the language. == The Structure -The koans are broken out into areas by file, hashes are covered in about_hashes.rb, -modules are introduced in about_modules.rb, etc. They are presented in order in the -path_to_enlightenment.rb file. +The koans are broken out into areas by file, hashes are covered in about_hashes.rb, +modules are introduced in about_modules.rb, etc. They are presented in +order in the path_to_enlightenment.rb file. Each koan builds up your knowledge of Ruby and builds upon itself. It will stop at the first place you need to correct. @@ -23,8 +23,8 @@ make it work correctly. == Installing Ruby If you do not have Ruby setup, please visit http://ruby-lang.org/en/downloads/ for -operating specific instructions. In order to run this you need ruby and rake -installed. To check the installations simply type: +operating specific instructions. In order to run this you need ruby and +rake installed. To check the installations simply type: *nix platforms from any terminal window: @@ -36,10 +36,10 @@ Windows from the command prompt (cmd.exe) c:\ruby --version c:\rake --version -If you don't have rake installed, just run `gem install rake` +If you don't have rake installed, just run gem install rake Any response for Ruby with a version number greater than 1.8 is fine (should be -around 1.8.6 or more). Any version of rake will do. +around 1.8.6 or more). Any version of rake will do. == Generating the Koans @@ -69,12 +69,13 @@ Windows is the same thing === Red, Green, Refactor -In test-driven development the mantra has always been, red, green, refactor. Write a -failing test and run it (red), make the test pass (green), then refactor it (that is -look at the code and see if you can make it any better). In this case you will need -to run the koan and see it fail (red), make the test pass (green), then take a -moment and reflect upon the test to see what it is teaching you and improve the -code to better communicate its intent (refactor). +In test-driven development the mantra has always been red, green, refactor. +Write a failing test and run it (red), make the test pass (green), +then refactor it (that is look at the code and see if you can make it any better). +In this case you will need to run the koan and see it fail (red), make +the test pass (green), then take a moment and reflect upon the test to +see what it is teaching you and improve the code to better communicate its intent +(refactor). The very first time you run it you will see the following output: @@ -106,7 +107,7 @@ the first solution: path_to_enlightenment.rb:38:in `each_with_index' path_to_enlightenment.rb:38 -We then open up the about_asserts.rb file and look at the first test: +We then open up the about_asserts.rb file and look at the first test: # We shall contemplate truth by testing reality, via asserts. def test_assert_truth @@ -122,6 +123,33 @@ In this case the goal is for you to see that if you pass a value to the +assert+ method, it will either ensure it is +true+ and continue on, or fail if in fact the statement is +false+. +=== Running the Koans automatically + +This section is optional. + +Normally the path to enlightenment looks like this: + + cd ruby_koans + rake + # edit + rake + # edit + rake + # etc + +If you prefer, you can keep the koans running in the background so that after you +make a change in your editor, the koans will immediately run again. This will +hopefully keep your focus on learning Ruby instead of the command line. + +Install the Ruby gem (library) called +watchr+ and then ask it to +"watch" the koans for changes: + + cd ruby_koans + rake + # decide to run rake automatically from now on as you edit + gem install watchr + watchr ./koans/koans.watchr + == Inspiration A special thanks to Mike Clark and Ara Howard for inspiring this From f36a964fdd95b5b516b4869edac96491fc156529 Mon Sep 17 00:00:00 2001 From: David Kennedy Date: Thu, 14 Feb 2013 14:22:11 +0000 Subject: [PATCH 03/60] Explain how to use Watchr in the README The koans have support for Watchr now, and this is very helpful as you can focus on editing and not on re-running rake over and over. However, a user new to Ruby will not even know what Watchr is (I'd not used it before! I was using Guard) so they might miss this choice. There are some other minor edits for style and consistency. I explain that Koans are tests. We/You tidy up. Removed some excess wordage. Made some "your should do this" statements more imperative. Made mark up more consistent. --- README.rdoc | 51 ++++++++++++++++++++++++++------------------------- 1 file changed, 26 insertions(+), 25 deletions(-) diff --git a/README.rdoc b/README.rdoc index 93e4bc8..5034992 100644 --- a/README.rdoc +++ b/README.rdoc @@ -2,17 +2,17 @@ The Ruby Koans walk you along the path to enlightenment in order to learn Ruby. The goal is to learn the Ruby language, syntax, structure, and some common -functions and libraries. We also teach you culture. Testing is not just something we -pay lip service to, but something we live. It is essential in your quest to learn -and do great things in the language. +functions and libraries. We also teach you culture by basing the koans on tests. +Testing is not just something we pay lip service to, but something we +live. Testing is essential in your quest to learn and do great things in Ruby. == The Structure -The koans are broken out into areas by file, hashes are covered in about_hashes.rb, -modules are introduced in about_modules.rb, etc. They are presented in -order in the path_to_enlightenment.rb file. +The koans are broken out into areas by file, hashes are covered in +about_hashes.rb+, +modules are introduced in +about_modules.rb+, etc. They are presented in +order in the +path_to_enlightenment.rb+ file. -Each koan builds up your knowledge of Ruby and builds upon itself. It will stop at +Each koan builds up your knowledge of Ruby and builds upon itself. It will stop at the first place you need to correct. Some koans simply need to have the correct answer substituted for an incorrect one. @@ -23,23 +23,23 @@ make it work correctly. == Installing Ruby If you do not have Ruby setup, please visit http://ruby-lang.org/en/downloads/ for -operating specific instructions. In order to run this you need ruby and -rake installed. To check the installations simply type: +operating specific instructions. In order to run the koans you need +ruby+ and ++rake+ installed. To check your installations simply type: *nix platforms from any terminal window: [~] $ ruby --version [~] $ rake --version -Windows from the command prompt (cmd.exe) +Windows from the command prompt (+cmd.exe+) c:\ruby --version c:\rake --version -If you don't have rake installed, just run gem install rake +If you don't have +rake+ installed, just run +gem install rake+ Any response for Ruby with a version number greater than 1.8 is fine (should be -around 1.8.6 or more). Any version of rake will do. +around 1.8.6 or more). Any version of +rake+ will do. == Generating the Koans @@ -54,10 +54,10 @@ If you need to regenerate the koans, thus wiping your current `koans`, == The Path To Enlightenment -You can run the tests through rake or by calling the file itself (rake is the +You can run the tests through +rake+ or by calling the file itself (+rake+ is the recommended way to run them as we might build more functionality into this task). -*nix platforms, from the koans directory +*nix platforms, from the +ruby_koans+ directory [ruby_koans] $ rake # runs the default target :walk_the_path [ruby_koans] $ ruby path_to_enlightenment.rb # simply call the file directly @@ -71,13 +71,14 @@ Windows is the same thing In test-driven development the mantra has always been red, green, refactor. Write a failing test and run it (red), make the test pass (green), -then refactor it (that is look at the code and see if you can make it any better). -In this case you will need to run the koan and see it fail (red), make -the test pass (green), then take a moment and reflect upon the test to -see what it is teaching you and improve the code to better communicate its intent -(refactor). +then look at the code and consider if you can make it any better (refactor). -The very first time you run it you will see the following output: +While walking the path to Ruby enlightenment you will need to run the koan and +see it fail (red), make the test pass (green), then take a moment +and reflect upon the test to see what it is teaching you and improve the code to +better communicate its intent (refactor). + +The very first time you run the koans you will see the following output: [ ruby_koans ] $ rake (in /Users/person/dev/ruby_koans) @@ -99,7 +100,7 @@ The very first time you run it you will see the following output: mountains are merely mountains your path thus far [X_________________________________________________] 0/280 -You have come to your first stage. If you notice it is telling you where to look for +You have come to your first stage. Notice it is telling you where to look for the first solution: Please meditate on the following code: @@ -107,20 +108,20 @@ the first solution: path_to_enlightenment.rb:38:in `each_with_index' path_to_enlightenment.rb:38 -We then open up the about_asserts.rb file and look at the first test: +Open the +about_asserts.rb+ file and look at the first test: # We shall contemplate truth by testing reality, via asserts. def test_assert_truth assert false # This should be true end -We then change the +false+ to +true+ and run the test again. After you are +Change the +false+ to +true+ and re-run the test. After you are done, think about what you are learning. In this case, ignore everything except the method name (+test_assert_truth+) and the parts inside the method (everything before the +end+). In this case the goal is for you to see that if you pass a value to the +assert+ -method, it will either ensure it is +true+ and continue on, or fail if in fact +method, it will either ensure it is +true+ and continue on, or fail if the statement is +false+. === Running the Koans automatically @@ -139,7 +140,7 @@ Normally the path to enlightenment looks like this: If you prefer, you can keep the koans running in the background so that after you make a change in your editor, the koans will immediately run again. This will -hopefully keep your focus on learning Ruby instead of the command line. +hopefully keep your focus on learning Ruby instead of on the command line. Install the Ruby gem (library) called +watchr+ and then ask it to "watch" the koans for changes: From 676d9ce8ac44b6628006b29f63273b11c83bc23e Mon Sep 17 00:00:00 2001 From: Wei Lu Date: Thu, 28 Feb 2013 15:44:28 +0800 Subject: [PATCH 04/60] Fix indentation --- src/about_triangle_project_2.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/about_triangle_project_2.rb b/src/about_triangle_project_2.rb index 0a57e25..347c3b1 100644 --- a/src/about_triangle_project_2.rb +++ b/src/about_triangle_project_2.rb @@ -12,6 +12,6 @@ class AboutTriangleProject2 < EdgeCase::Koan assert_raise(TriangleError) do triangle(1, 1, 3) end assert_raise(TriangleError) do triangle(2, 4, 2) end # HINT: for tips, see http://stackoverflow.com/questions/3834203/ruby-koan-151-raising-exceptions - end + end end From aa3c83f04493545ae0316d5f8d90e263aa6a4e96 Mon Sep 17 00:00:00 2001 From: Wei Lu Date: Thu, 28 Feb 2013 18:59:58 +0800 Subject: [PATCH 05/60] Remove assigned but unused variables --- src/about_blocks.rb | 2 +- src/about_exceptions.rb | 2 +- src/about_sandwich_code.rb | 6 +++--- src/about_scope.rb | 2 +- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/about_blocks.rb b/src/about_blocks.rb index 7fefcd9..483fc26 100644 --- a/src/about_blocks.rb +++ b/src/about_blocks.rb @@ -23,7 +23,7 @@ class AboutBlocks < EdgeCase::Koan end def test_blocks_can_take_arguments - result = method_with_block_arguments do |argument| + method_with_block_arguments do |argument| assert_equal __("Jim"), argument end end diff --git a/src/about_exceptions.rb b/src/about_exceptions.rb index f243982..652f932 100644 --- a/src/about_exceptions.rb +++ b/src/about_exceptions.rb @@ -48,7 +48,7 @@ class AboutExceptions < EdgeCase::Koan result = nil begin fail "Oops" - rescue StandardError => ex + rescue StandardError # no code here ensure result = :always_run diff --git a/src/about_sandwich_code.rb b/src/about_sandwich_code.rb index e641b13..c12525d 100644 --- a/src/about_sandwich_code.rb +++ b/src/about_sandwich_code.rb @@ -5,7 +5,7 @@ class AboutSandwichCode < EdgeCase::Koan def count_lines(file_name) file = open(file_name) count = 0 - while line = file.gets + while file.gets count += 1 end count @@ -66,7 +66,7 @@ class AboutSandwichCode < EdgeCase::Koan def count_lines2(file_name) file_sandwich(file_name) do |file| count = 0 - while line = file.gets + while file.gets count += 1 end count @@ -99,7 +99,7 @@ class AboutSandwichCode < EdgeCase::Koan def count_lines3(file_name) open(file_name) do |file| count = 0 - while line = file.gets + while file.gets count += 1 end count diff --git a/src/about_scope.rb b/src/about_scope.rb index f6843c8..afd8767 100644 --- a/src/about_scope.rb +++ b/src/about_scope.rb @@ -19,7 +19,7 @@ class AboutScope < EdgeCase::Koan def test_dog_is_not_available_in_the_current_scope assert_raise(___(NameError)) do - fido = Dog.new + Dog.new end end From 4d41bab6e68f40517e99e189f9f5ce4784b1e9b5 Mon Sep 17 00:00:00 2001 From: lucasrcosta Date: Sun, 10 Mar 2013 14:31:05 -0300 Subject: [PATCH 06/60] Added Times Statement --- src/about_control_statements.rb | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/about_control_statements.rb b/src/about_control_statements.rb index 1e799e6..ef5de52 100644 --- a/src/about_control_statements.rb +++ b/src/about_control_statements.rb @@ -130,5 +130,13 @@ class AboutControlStatements < EdgeCase::Koan end assert_equal [__("FISH"), __("AND"), __("CHIPS")], result end + + def test_times_statement + i = 0 + 10.times do + i += 1 + end + assert_equal __(10), result + end end From 213aece7e9f637088ab11d0a37e1dc926c3813eb Mon Sep 17 00:00:00 2001 From: Adam McCrea Date: Mon, 1 Apr 2013 17:11:02 -0300 Subject: [PATCH 07/60] Move to Neo --- README.rdoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.rdoc b/README.rdoc index 121228b..7ca4f59 100644 --- a/README.rdoc +++ b/README.rdoc @@ -1,4 +1,4 @@ -= EdgeCase Ruby Koans += Neo Ruby Koans The Ruby Koans walk you along the path to enlightenment in order to learn Ruby. The goal is to learn the Ruby language, syntax, structure, and some common From 2df8e5554d8e822ca4d7102433aa13ac1ba6bcbf Mon Sep 17 00:00:00 2001 From: Jim Weirich Date: Mon, 1 Apr 2013 19:10:47 -0400 Subject: [PATCH 08/60] Added todo for EdgeCase to Neo conversion. --- src/edgecase.rb | 1 + 1 file changed, 1 insertion(+) diff --git a/src/edgecase.rb b/src/edgecase.rb index 40c9607..e2002be 100644 --- a/src/edgecase.rb +++ b/src/edgecase.rb @@ -83,6 +83,7 @@ class String end end +# TODO: Change EdgeCase to Neo module EdgeCase class << self def simple_output From 405c42eb81b1b12f7884fb91a3284c4f0cd63c13 Mon Sep 17 00:00:00 2001 From: mfeckie Date: Sat, 6 Apr 2013 11:31:32 +0800 Subject: [PATCH 09/60] Updated Sensei for 2.0.0 Add support for Ruby 2.0.0 --- src/edgecase.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/edgecase.rb b/src/edgecase.rb index e2002be..bd65fdf 100644 --- a/src/edgecase.rb +++ b/src/edgecase.rb @@ -147,7 +147,7 @@ module EdgeCase AssertionError = Test::Unit::AssertionFailedError end - in_ruby_version("1.9") do + in_ruby_version("1.9", "2.0") do if defined?(MiniTest) AssertionError = MiniTest::Assertion else From cb14e48f1dcf3a26c288a6d12b9a23a8cfb30724 Mon Sep 17 00:00:00 2001 From: mfeckie Date: Sat, 6 Apr 2013 12:18:41 +0800 Subject: [PATCH 10/60] Add tests for keyword arguments in Ruby 2.0 --- src/about_methods.rb | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/src/about_methods.rb b/src/about_methods.rb index b720010..eabe7aa 100644 --- a/src/about_methods.rb +++ b/src/about_methods.rb @@ -77,6 +77,36 @@ class AboutMethods < EdgeCase::Koan assert_equal __([:one]), method_with_var_args(:one) assert_equal __([:one, :two]), method_with_var_args(:one, :two) end + # ------------------------------------------------------------------ + + if ruby_version?('2.0') + def method_with_keyword_arguments(one: 1, two: 'two') + [one, two] + end + + def test_keyword_arguments + assert_equal __, method_with_keyword_arguments.class + assert_equal __, method_with_keyword_arguments + assert_equal __, method_with_keyword_arguments(one: 'one') + assert_equal __, method_with_keyword_arguments(two: 2) + end + + def method_with_keywork_arguments_with_mandatory_argument(one, two: 2, three: 3) + [one, two, three] + end + + def test_keyword_arguments_with_wrong_number_of_arguments + exception = assert_raise (__) do + method_with_keywork_arguments_with_mandatory_argument + end + assert_match(/__/, exception.message) + end + + # THINK ABOUT IT: + # + # Keyword arguments always have a default value, making them optional to the caller + + end # ------------------------------------------------------------------ From 9c5ecb509ad923b0d548731c26a9ec87c0377740 Mon Sep 17 00:00:00 2001 From: mfeckie Date: Sat, 6 Apr 2013 13:23:56 +0800 Subject: [PATCH 11/60] Add support for Ruby 2.0 --- src/about_iteration.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/about_iteration.rb b/src/about_iteration.rb index 2e35aa9..09ccfa2 100644 --- a/src/about_iteration.rb +++ b/src/about_iteration.rb @@ -14,7 +14,7 @@ class AboutIteration < EdgeCase::Koan end end - in_ruby_version("1.9") do + in_ruby_version("1.9", "2.0") do def as_name(name) name.to_sym end From 58238ef54a83b01ef2d5b9c41ebad754cb377b9e Mon Sep 17 00:00:00 2001 From: Jim Weirich Date: Tue, 9 Apr 2013 09:30:33 -0400 Subject: [PATCH 12/60] Removed fixed object_id koan This koan is not as important now that Ruby 2 has changed all the object ids. --- src/about_objects.rb | 6 ------ 1 file changed, 6 deletions(-) diff --git a/src/about_objects.rb b/src/about_objects.rb index 1faf0a0..3d068a9 100644 --- a/src/about_objects.rb +++ b/src/about_objects.rb @@ -30,12 +30,6 @@ class AboutObjects < EdgeCase::Koan assert_equal __(true), obj.object_id != another_obj.object_id end - def test_some_system_objects_always_have_the_same_id - assert_equal __(0), false.object_id - assert_equal __(2), true.object_id - assert_equal __(4), nil.object_id - end - def test_small_integers_have_fixed_ids assert_equal __(1), 0.object_id assert_equal __(3), 1.object_id From f03e0d21eef530299bff95a358c7c26017dce726 Mon Sep 17 00:00:00 2001 From: Jim Weirich Date: Tue, 9 Apr 2013 09:45:23 -0400 Subject: [PATCH 13/60] Add keyword arguments (with correct answers). --- src/about_keyword_arguments.rb | 31 +++++++++++++++++++++++++++++++ src/about_message_passing.rb | 10 +++++----- src/about_methods.rb | 30 ------------------------------ src/edgecase.rb | 2 +- src/path_to_enlightenment.rb | 3 +++ 5 files changed, 40 insertions(+), 36 deletions(-) create mode 100644 src/about_keyword_arguments.rb diff --git a/src/about_keyword_arguments.rb b/src/about_keyword_arguments.rb new file mode 100644 index 0000000..7b37e1b --- /dev/null +++ b/src/about_keyword_arguments.rb @@ -0,0 +1,31 @@ +require File.expand_path(File.dirname(__FILE__) + '/edgecase') + +class AboutMethods < EdgeCase::Koan + + def method_with_keyword_arguments(one: 1, two: 'two') + [one, two] + end + + def test_keyword_arguments + assert_equal __(Array), method_with_keyword_arguments.class + assert_equal __([1, 'two']), method_with_keyword_arguments + assert_equal __(['one', 'two']), method_with_keyword_arguments(one: 'one') + assert_equal __([1, 2]), method_with_keyword_arguments(two: 2) + end + + def method_with_keywork_arguments_with_mandatory_argument(one, two: 2, three: 3) + [one, two, three] + end + + def test_keyword_arguments_with_wrong_number_of_arguments + exception = assert_raise (___(ArgumentError)) do + method_with_keywork_arguments_with_mandatory_argument + end + assert_match(/#{__("wrong number of arguments")}/, exception.message) + end + + # THINK ABOUT IT: + # + # Keyword arguments always have a default value, making them optional to the caller + +end diff --git a/src/about_message_passing.rb b/src/about_message_passing.rb index 882716e..11a0a79 100644 --- a/src/about_message_passing.rb +++ b/src/about_message_passing.rb @@ -93,11 +93,11 @@ class AboutMessagePassing < EdgeCase::Koan # NOTE: # # In Ruby 1.8 the method_missing method is public and can be - # called as shown above. However, in Ruby 1.9 the method_missing - # method is private. We explicitly made it public in the testing - # framework so this example works in both versions of Ruby. Just - # keep in mind you can't call method_missing like that in Ruby - # 1.9. normally. + # called as shown above. However, in Ruby 1.9 (and later versions) + # the method_missing method is private. We explicitly made it + # public in the testing framework so this example works in both + # versions of Ruby. Just keep in mind you can't call + # method_missing like that after Ruby 1.9 normally. # # Thanks. We now return you to your regularly scheduled Ruby # Koans. diff --git a/src/about_methods.rb b/src/about_methods.rb index eabe7aa..b720010 100644 --- a/src/about_methods.rb +++ b/src/about_methods.rb @@ -77,36 +77,6 @@ class AboutMethods < EdgeCase::Koan assert_equal __([:one]), method_with_var_args(:one) assert_equal __([:one, :two]), method_with_var_args(:one, :two) end - # ------------------------------------------------------------------ - - if ruby_version?('2.0') - def method_with_keyword_arguments(one: 1, two: 'two') - [one, two] - end - - def test_keyword_arguments - assert_equal __, method_with_keyword_arguments.class - assert_equal __, method_with_keyword_arguments - assert_equal __, method_with_keyword_arguments(one: 'one') - assert_equal __, method_with_keyword_arguments(two: 2) - end - - def method_with_keywork_arguments_with_mandatory_argument(one, two: 2, three: 3) - [one, two, three] - end - - def test_keyword_arguments_with_wrong_number_of_arguments - exception = assert_raise (__) do - method_with_keywork_arguments_with_mandatory_argument - end - assert_match(/__/, exception.message) - end - - # THINK ABOUT IT: - # - # Keyword arguments always have a default value, making them optional to the caller - - end # ------------------------------------------------------------------ diff --git a/src/edgecase.rb b/src/edgecase.rb index bd65fdf..713f55d 100644 --- a/src/edgecase.rb +++ b/src/edgecase.rb @@ -65,7 +65,7 @@ class Object end end - in_ruby_version("1.9") do + in_ruby_version("1.9", "2") do public :method_missing end end diff --git a/src/path_to_enlightenment.rb b/src/path_to_enlightenment.rb index 64621bf..9e8ccbe 100644 --- a/src/path_to_enlightenment.rb +++ b/src/path_to_enlightenment.rb @@ -12,6 +12,9 @@ require 'about_strings' require 'about_symbols' require 'about_regular_expressions' require 'about_methods' +in_ruby_version("2") do + require 'about_keyword_arguments' +end require 'about_constants' require 'about_control_statements' require 'about_true_and_false' From e150dd6d9e5f1fc871bc67e98f538d09fb0849e2 Mon Sep 17 00:00:00 2001 From: Jim Weirich Date: Tue, 9 Apr 2013 10:10:24 -0400 Subject: [PATCH 14/60] Fix private message error for JRuby. --- src/about_methods.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/about_methods.rb b/src/about_methods.rb index b720010..dee1387 100644 --- a/src/about_methods.rb +++ b/src/about_methods.rb @@ -130,7 +130,7 @@ class AboutMethods < EdgeCase::Koan exception = assert_raise(___(NoMethodError)) do self.my_private_method end - assert_match /#{__("private method `my_private_method' called ")}/, exception.message + assert_match /#{__("method `my_private_method'")}/, exception.message end # ------------------------------------------------------------------ From f2e4a1f357483222bf9eaf670a1a4262e4d89b52 Mon Sep 17 00:00:00 2001 From: Jim Weirich Date: Tue, 9 Apr 2013 10:22:12 -0400 Subject: [PATCH 15/60] Make each do/end usage more consistent. --- src/about_iteration.rb | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/about_iteration.rb b/src/about_iteration.rb index 09ccfa2..331c18c 100644 --- a/src/about_iteration.rb +++ b/src/about_iteration.rb @@ -39,19 +39,19 @@ class AboutIteration < EdgeCase::Koan def test_each_can_use_curly_brace_blocks_too array = [1, 2, 3] sum = 0 - array.each { |item| + array.each do |item| sum += item - } + end assert_equal __(6), sum end def test_break_works_with_each_style_iterations array = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] sum = 0 - array.each { |item| + array.each do |item| break if item > 3 sum += item - } + end assert_equal __(6), sum end From 7eb51a9a304676ef8620b504608968d06e98a588 Mon Sep 17 00:00:00 2001 From: Jim Weirich Date: Tue, 9 Apr 2013 10:25:41 -0400 Subject: [PATCH 16/60] Remove unused files. --- src/array_test.rb | 47 ----------------------------------------------- src/code_mash.rb | 1 - src/first_test.rb | 11 ----------- 3 files changed, 59 deletions(-) delete mode 100644 src/array_test.rb delete mode 100644 src/code_mash.rb delete mode 100644 src/first_test.rb diff --git a/src/array_test.rb b/src/array_test.rb deleted file mode 100644 index 83ec07b..0000000 --- a/src/array_test.rb +++ /dev/null @@ -1,47 +0,0 @@ -require 'test_helper' - -class ArrayTest < EdgeCase::TestCase - - def test_basic_arrays - food = [:peanut, :button, :and, :jelly] - assert_equal __, food[0] - assert_equal __, food.size - end - - def test_array_access - food = [:peanut, :button, :and, :jelly] - assert_equal __, food.first - assert_equal __, food.last - assert_equal __, food[0] - assert_equal __, food[2] - assert_equal __, food[(food.size() - 1)] - end - - def test_arrays_with_other_objects - food = [:peanut, :button, :and, :jelly, 1, nil] - assert_equal __, food.size - assert_equal __, food.last - assert_equal __, food[5] - end - - def test_adding_to_an_array_with_shovel_shovel - food = [:peanut, :button, :and, :jelly] - food << 'sandwich' - assert_equal __, food.size - assert_equal __, food.first - end - - def test_adding_to_an_array_with_push - food = [:peanut, :button, :and, :jelly] - food.push('sandwich') - assert_equal __, food.last - end - - def test_adding_to_an_array_with_unshift - food = [:peanut, :button, :and, :jelly] - food.unshift('a') - assert_equal __, food.first - end - -end - diff --git a/src/code_mash.rb b/src/code_mash.rb deleted file mode 100644 index 8fbf617..0000000 --- a/src/code_mash.rb +++ /dev/null @@ -1 +0,0 @@ -require File.expand_path(File.dirname(__FILE__) + '/edgecase') diff --git a/src/first_test.rb b/src/first_test.rb deleted file mode 100644 index 708baf1..0000000 --- a/src/first_test.rb +++ /dev/null @@ -1,11 +0,0 @@ -require 'test/unit' - -class TestSomething < Test::Unit::TestCase - def test_assert - assert true - assert_equal 1, 1 - assert_equal 1, 1.0 - end -end - - From 67750bf9bfe67101c40a4fd48d1756496060debd Mon Sep 17 00:00:00 2001 From: Jim Weirich Date: Tue, 9 Apr 2013 10:31:08 -0400 Subject: [PATCH 17/60] Fix missing blanks in about hashes. --- src/about_hashes.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/about_hashes.rb b/src/about_hashes.rb index afb17b3..b9a4f24 100644 --- a/src/about_hashes.rb +++ b/src/about_hashes.rb @@ -4,7 +4,7 @@ class AboutHashes < EdgeCase::Koan def test_creating_hashes empty_hash = Hash.new assert_equal __(Hash), empty_hash.class - assert_equal({}, empty_hash) # __ + assert_equal(__({}), empty_hash) assert_equal __(0), empty_hash.size end From 09b03e9b1c45343cf5399c40a2210f5d741f2ae2 Mon Sep 17 00:00:00 2001 From: Jim Weirich Date: Tue, 9 Apr 2013 10:40:27 -0400 Subject: [PATCH 18/60] Change EdgeCase to Neo --- src/about_array_assignment.rb | 4 ++-- src/about_arrays.rb | 4 ++-- src/about_asserts.rb | 4 ++-- src/about_blocks.rb | 4 ++-- src/about_class_methods.rb | 4 ++-- src/about_classes.rb | 4 ++-- src/about_constants.rb | 4 ++-- src/about_control_statements.rb | 4 ++-- src/about_dice_project.rb | 4 ++-- src/about_exceptions.rb | 4 ++-- src/about_hashes.rb | 4 ++-- src/about_inheritance.rb | 4 ++-- src/about_iteration.rb | 4 ++-- src/about_java_interop.rb | 4 ++-- src/about_keyword_arguments.rb | 4 ++-- src/about_message_passing.rb | 4 ++-- src/about_methods.rb | 4 ++-- src/about_modules.rb | 4 ++-- src/about_nil.rb | 4 ++-- src/about_objects.rb | 4 ++-- src/about_open_classes.rb | 4 ++-- src/about_proxy_object_project.rb | 6 +++--- src/about_regular_expressions.rb | 4 ++-- src/about_sandwich_code.rb | 4 ++-- src/about_scope.rb | 4 ++-- src/about_scoring_project.rb | 4 ++-- src/about_strings.rb | 4 ++-- src/about_symbols.rb | 4 ++-- src/about_to_str.rb | 4 ++-- src/about_triangle_project.rb | 4 ++-- src/about_triangle_project_2.rb | 4 ++-- src/about_true_and_false.rb | 4 ++-- src/{edgecase.rb => neo.rb} | 29 ++++++++++++++--------------- 33 files changed, 79 insertions(+), 80 deletions(-) rename src/{edgecase.rb => neo.rb} (94%) diff --git a/src/about_array_assignment.rb b/src/about_array_assignment.rb index 35af856..a08f512 100644 --- a/src/about_array_assignment.rb +++ b/src/about_array_assignment.rb @@ -1,6 +1,6 @@ -require File.expand_path(File.dirname(__FILE__) + '/edgecase') +require File.expand_path(File.dirname(__FILE__) + '/neo') -class AboutArrayAssignment < EdgeCase::Koan +class AboutArrayAssignment < Neo::Koan def test_non_parallel_assignment names = ["John", "Smith"] assert_equal __(["John", "Smith"]), names diff --git a/src/about_arrays.rb b/src/about_arrays.rb index 35c951d..a415538 100644 --- a/src/about_arrays.rb +++ b/src/about_arrays.rb @@ -1,6 +1,6 @@ -require File.expand_path(File.dirname(__FILE__) + '/edgecase') +require File.expand_path(File.dirname(__FILE__) + '/neo') -class AboutArrays < EdgeCase::Koan +class AboutArrays < Neo::Koan def test_creating_arrays empty_array = Array.new assert_equal __(Array), empty_array.class diff --git a/src/about_asserts.rb b/src/about_asserts.rb index 5ac6b55..88c3100 100644 --- a/src/about_asserts.rb +++ b/src/about_asserts.rb @@ -1,9 +1,9 @@ #!/usr/bin/env ruby # -*- ruby -*- -require File.expand_path(File.dirname(__FILE__) + '/edgecase') +require File.expand_path(File.dirname(__FILE__) + '/neo') -class AboutAsserts < EdgeCase::Koan +class AboutAsserts < Neo::Koan # We shall contemplate truth by testing reality, via asserts. def test_assert_truth diff --git a/src/about_blocks.rb b/src/about_blocks.rb index 483fc26..af6f207 100644 --- a/src/about_blocks.rb +++ b/src/about_blocks.rb @@ -1,6 +1,6 @@ -require File.expand_path(File.dirname(__FILE__) + '/edgecase') +require File.expand_path(File.dirname(__FILE__) + '/neo') -class AboutBlocks < EdgeCase::Koan +class AboutBlocks < Neo::Koan def method_with_block result = yield result diff --git a/src/about_class_methods.rb b/src/about_class_methods.rb index 2cadbaa..a352d2d 100644 --- a/src/about_class_methods.rb +++ b/src/about_class_methods.rb @@ -1,6 +1,6 @@ -require File.expand_path(File.dirname(__FILE__) + '/edgecase') +require File.expand_path(File.dirname(__FILE__) + '/neo') -class AboutClassMethods < EdgeCase::Koan +class AboutClassMethods < Neo::Koan class Dog end diff --git a/src/about_classes.rb b/src/about_classes.rb index a8336bf..e1de7d7 100644 --- a/src/about_classes.rb +++ b/src/about_classes.rb @@ -1,6 +1,6 @@ -require File.expand_path(File.dirname(__FILE__) + '/edgecase') +require File.expand_path(File.dirname(__FILE__) + '/neo') -class AboutClasses < EdgeCase::Koan +class AboutClasses < Neo::Koan class Dog end diff --git a/src/about_constants.rb b/src/about_constants.rb index dd0bc39..49d2b5a 100644 --- a/src/about_constants.rb +++ b/src/about_constants.rb @@ -1,8 +1,8 @@ -require File.expand_path(File.dirname(__FILE__) + '/edgecase') +require File.expand_path(File.dirname(__FILE__) + '/neo') C = "top level" -class AboutConstants < EdgeCase::Koan +class AboutConstants < Neo::Koan C = "nested" diff --git a/src/about_control_statements.rb b/src/about_control_statements.rb index 1e799e6..99953ec 100644 --- a/src/about_control_statements.rb +++ b/src/about_control_statements.rb @@ -1,6 +1,6 @@ -require File.expand_path(File.dirname(__FILE__) + '/edgecase') +require File.expand_path(File.dirname(__FILE__) + '/neo') -class AboutControlStatements < EdgeCase::Koan +class AboutControlStatements < Neo::Koan def test_if_then_else_statements if true diff --git a/src/about_dice_project.rb b/src/about_dice_project.rb index 65c21df..98717ba 100644 --- a/src/about_dice_project.rb +++ b/src/about_dice_project.rb @@ -1,4 +1,4 @@ -require File.expand_path(File.dirname(__FILE__) + '/edgecase') +require File.expand_path(File.dirname(__FILE__) + '/neo') # Implement a DiceSet Class here: # @@ -15,7 +15,7 @@ class DiceSet end #++ -class AboutDiceProject < EdgeCase::Koan +class AboutDiceProject < Neo::Koan def test_can_create_a_dice_set dice = DiceSet.new assert_not_nil dice diff --git a/src/about_exceptions.rb b/src/about_exceptions.rb index 652f932..b4ad63d 100644 --- a/src/about_exceptions.rb +++ b/src/about_exceptions.rb @@ -1,6 +1,6 @@ -require File.expand_path(File.dirname(__FILE__) + '/edgecase') +require File.expand_path(File.dirname(__FILE__) + '/neo') -class AboutExceptions < EdgeCase::Koan +class AboutExceptions < Neo::Koan class MySpecialError < RuntimeError end diff --git a/src/about_hashes.rb b/src/about_hashes.rb index b9a4f24..ef58621 100644 --- a/src/about_hashes.rb +++ b/src/about_hashes.rb @@ -1,6 +1,6 @@ -require File.expand_path(File.dirname(__FILE__) + '/edgecase') +require File.expand_path(File.dirname(__FILE__) + '/neo') -class AboutHashes < EdgeCase::Koan +class AboutHashes < Neo::Koan def test_creating_hashes empty_hash = Hash.new assert_equal __(Hash), empty_hash.class diff --git a/src/about_inheritance.rb b/src/about_inheritance.rb index 73030c6..3a119c0 100644 --- a/src/about_inheritance.rb +++ b/src/about_inheritance.rb @@ -1,6 +1,6 @@ -require File.expand_path(File.dirname(__FILE__) + '/edgecase') +require File.expand_path(File.dirname(__FILE__) + '/neo') -class AboutInheritance < EdgeCase::Koan +class AboutInheritance < Neo::Koan class Dog attr_reader :name diff --git a/src/about_iteration.rb b/src/about_iteration.rb index 331c18c..8e16bf6 100644 --- a/src/about_iteration.rb +++ b/src/about_iteration.rb @@ -1,6 +1,6 @@ -require File.expand_path(File.dirname(__FILE__) + '/edgecase') +require File.expand_path(File.dirname(__FILE__) + '/neo') -class AboutIteration < EdgeCase::Koan +class AboutIteration < Neo::Koan # -- An Aside ------------------------------------------------------ # Ruby 1.8 stores names as strings. Ruby 1.9 stores names as diff --git a/src/about_java_interop.rb b/src/about_java_interop.rb index c2d2142..83c2a21 100644 --- a/src/about_java_interop.rb +++ b/src/about_java_interop.rb @@ -1,4 +1,4 @@ -require File.expand_path(File.dirname(__FILE__) + '/edgecase') +require File.expand_path(File.dirname(__FILE__) + '/neo') include Java @@ -11,7 +11,7 @@ include Java # * Calling custom java class # * Calling Ruby from java??? -class AboutJavaInterop < EdgeCase::Koan +class AboutJavaInterop < Neo::Koan def test_using_a_java_library_class java_array = java.util.ArrayList.new assert_equal __(Java::JavaUtil::ArrayList), java_array.class diff --git a/src/about_keyword_arguments.rb b/src/about_keyword_arguments.rb index 7b37e1b..1596034 100644 --- a/src/about_keyword_arguments.rb +++ b/src/about_keyword_arguments.rb @@ -1,6 +1,6 @@ -require File.expand_path(File.dirname(__FILE__) + '/edgecase') +require File.expand_path(File.dirname(__FILE__) + '/neo') -class AboutMethods < EdgeCase::Koan +class AboutMethods < Neo::Koan def method_with_keyword_arguments(one: 1, two: 'two') [one, two] diff --git a/src/about_message_passing.rb b/src/about_message_passing.rb index 11a0a79..4301a95 100644 --- a/src/about_message_passing.rb +++ b/src/about_message_passing.rb @@ -1,6 +1,6 @@ -require File.expand_path(File.dirname(__FILE__) + '/edgecase') +require File.expand_path(File.dirname(__FILE__) + '/neo') -class AboutMessagePassing < EdgeCase::Koan +class AboutMessagePassing < Neo::Koan class MessageCatcher def caught? diff --git a/src/about_methods.rb b/src/about_methods.rb index dee1387..2a1c3fa 100644 --- a/src/about_methods.rb +++ b/src/about_methods.rb @@ -1,10 +1,10 @@ -require File.expand_path(File.dirname(__FILE__) + '/edgecase') +require File.expand_path(File.dirname(__FILE__) + '/neo') def my_global_method(a,b) a + b end -class AboutMethods < EdgeCase::Koan +class AboutMethods < Neo::Koan def test_calling_global_methods assert_equal __(5), my_global_method(2,3) diff --git a/src/about_modules.rb b/src/about_modules.rb index 334b175..a96c662 100644 --- a/src/about_modules.rb +++ b/src/about_modules.rb @@ -1,6 +1,6 @@ -require File.expand_path(File.dirname(__FILE__) + '/edgecase') +require File.expand_path(File.dirname(__FILE__) + '/neo') -class AboutModules < EdgeCase::Koan +class AboutModules < Neo::Koan module Nameable def set_name(new_name) @name = new_name diff --git a/src/about_nil.rb b/src/about_nil.rb index 9df4f9b..0c084d7 100644 --- a/src/about_nil.rb +++ b/src/about_nil.rb @@ -1,6 +1,6 @@ -require File.expand_path(File.dirname(__FILE__) + '/edgecase') +require File.expand_path(File.dirname(__FILE__) + '/neo') -class AboutNil < EdgeCase::Koan +class AboutNil < Neo::Koan def test_nil_is_an_object assert_equal __(true), nil.is_a?(Object), "Unlike NULL in other languages" end diff --git a/src/about_objects.rb b/src/about_objects.rb index 3d068a9..0d75258 100644 --- a/src/about_objects.rb +++ b/src/about_objects.rb @@ -1,6 +1,6 @@ -require File.expand_path(File.dirname(__FILE__) + '/edgecase') +require File.expand_path(File.dirname(__FILE__) + '/neo') -class AboutObjects < EdgeCase::Koan +class AboutObjects < Neo::Koan def test_everything_is_an_object assert_equal __(true), 1.is_a?(Object) assert_equal __(true), 1.5.is_a?(Object) diff --git a/src/about_open_classes.rb b/src/about_open_classes.rb index 80df888..0372f50 100644 --- a/src/about_open_classes.rb +++ b/src/about_open_classes.rb @@ -1,6 +1,6 @@ -require File.expand_path(File.dirname(__FILE__) + '/edgecase') +require File.expand_path(File.dirname(__FILE__) + '/neo') -class AboutOpenClasses < EdgeCase::Koan +class AboutOpenClasses < Neo::Koan class Dog def bark "WOOF" diff --git a/src/about_proxy_object_project.rb b/src/about_proxy_object_project.rb index 7e8be03..3f969f6 100644 --- a/src/about_proxy_object_project.rb +++ b/src/about_proxy_object_project.rb @@ -1,4 +1,4 @@ -require File.expand_path(File.dirname(__FILE__) + '/edgecase') +require File.expand_path(File.dirname(__FILE__) + '/neo') # Project: Create a Proxy Class # @@ -42,7 +42,7 @@ end # The proxy object should pass the following Koan: # -class AboutProxyObjectProject < EdgeCase::Koan +class AboutProxyObjectProject < Neo::Koan def test_proxy_method_returns_wrapped_object # NOTE: The Television class is defined below tv = Proxy.new(Television.new) @@ -135,7 +135,7 @@ class Television end # Tests for the Television class. All of theses tests should pass. -class TelevisionTest < EdgeCase::Koan +class TelevisionTest < Neo::Koan def test_it_turns_on tv = Television.new diff --git a/src/about_regular_expressions.rb b/src/about_regular_expressions.rb index 03e8f9a..76bd566 100644 --- a/src/about_regular_expressions.rb +++ b/src/about_regular_expressions.rb @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- -require File.expand_path(File.dirname(__FILE__) + '/edgecase') +require File.expand_path(File.dirname(__FILE__) + '/neo') -class AboutRegularExpressions < EdgeCase::Koan +class AboutRegularExpressions < Neo::Koan def test_a_pattern_is_a_regular_expression assert_equal __(Regexp), /pattern/.class end diff --git a/src/about_sandwich_code.rb b/src/about_sandwich_code.rb index c12525d..1314ec8 100644 --- a/src/about_sandwich_code.rb +++ b/src/about_sandwich_code.rb @@ -1,6 +1,6 @@ -require File.expand_path(File.dirname(__FILE__) + '/edgecase') +require File.expand_path(File.dirname(__FILE__) + '/neo') -class AboutSandwichCode < EdgeCase::Koan +class AboutSandwichCode < Neo::Koan def count_lines(file_name) file = open(file_name) diff --git a/src/about_scope.rb b/src/about_scope.rb index afd8767..4760a9a 100644 --- a/src/about_scope.rb +++ b/src/about_scope.rb @@ -1,6 +1,6 @@ -require File.expand_path(File.dirname(__FILE__) + '/edgecase') +require File.expand_path(File.dirname(__FILE__) + '/neo') -class AboutScope < EdgeCase::Koan +class AboutScope < Neo::Koan module Jims class Dog def identify diff --git a/src/about_scoring_project.rb b/src/about_scoring_project.rb index 60b4682..8315520 100644 --- a/src/about_scoring_project.rb +++ b/src/about_scoring_project.rb @@ -1,4 +1,4 @@ -require File.expand_path(File.dirname(__FILE__) + '/edgecase') +require File.expand_path(File.dirname(__FILE__) + '/neo') # Greed is a dice game where you roll up to five dice to accumulate # points. The following "score" function will be used to calculate the @@ -54,7 +54,7 @@ def score(dice) #++ end -class AboutScoringProject < EdgeCase::Koan +class AboutScoringProject < Neo::Koan def test_score_of_an_empty_list_is_zero assert_equal 0, score([]) end diff --git a/src/about_strings.rb b/src/about_strings.rb index dd13fec..8a96a52 100644 --- a/src/about_strings.rb +++ b/src/about_strings.rb @@ -1,6 +1,6 @@ -require File.expand_path(File.dirname(__FILE__) + '/edgecase') +require File.expand_path(File.dirname(__FILE__) + '/neo') -class AboutStrings < EdgeCase::Koan +class AboutStrings < Neo::Koan def test_double_quoted_strings_are_strings string = "Hello, World" assert_equal __(true), string.is_a?(String) diff --git a/src/about_symbols.rb b/src/about_symbols.rb index 720ca8c..c2c9321 100644 --- a/src/about_symbols.rb +++ b/src/about_symbols.rb @@ -1,6 +1,6 @@ -require File.expand_path(File.dirname(__FILE__) + '/edgecase') +require File.expand_path(File.dirname(__FILE__) + '/neo') -class AboutSymbols < EdgeCase::Koan +class AboutSymbols < Neo::Koan def test_symbols_are_symbols symbol = :ruby assert_equal __(true), symbol.is_a?(Symbol) diff --git a/src/about_to_str.rb b/src/about_to_str.rb index 68c40b2..669a4df 100644 --- a/src/about_to_str.rb +++ b/src/about_to_str.rb @@ -1,6 +1,6 @@ -require File.expand_path(File.dirname(__FILE__) + '/edgecase') +require File.expand_path(File.dirname(__FILE__) + '/neo') -class AboutToStr < EdgeCase::Koan +class AboutToStr < Neo::Koan class CanNotBeTreatedAsString def to_s diff --git a/src/about_triangle_project.rb b/src/about_triangle_project.rb index da23bbd..ec2447c 100644 --- a/src/about_triangle_project.rb +++ b/src/about_triangle_project.rb @@ -1,9 +1,9 @@ -require File.expand_path(File.dirname(__FILE__) + '/edgecase') +require File.expand_path(File.dirname(__FILE__) + '/neo') # You need to write the triangle method in the file 'triangle.rb' require 'triangle.rb' -class AboutTriangleProject < EdgeCase::Koan +class AboutTriangleProject < Neo::Koan def test_equilateral_triangles_have_equal_sides assert_equal :equilateral, triangle(2, 2, 2) assert_equal :equilateral, triangle(10, 10, 10) diff --git a/src/about_triangle_project_2.rb b/src/about_triangle_project_2.rb index 347c3b1..55dd742 100644 --- a/src/about_triangle_project_2.rb +++ b/src/about_triangle_project_2.rb @@ -1,9 +1,9 @@ -require File.expand_path(File.dirname(__FILE__) + '/edgecase') +require File.expand_path(File.dirname(__FILE__) + '/neo') # You need to write the triangle method in the file 'triangle.rb' require 'triangle.rb' -class AboutTriangleProject2 < EdgeCase::Koan +class AboutTriangleProject2 < Neo::Koan # The first assignment did not talk about how to handle errors. # Let's handle that part now. def test_illegal_triangles_throw_exceptions diff --git a/src/about_true_and_false.rb b/src/about_true_and_false.rb index e9910f6..470489e 100644 --- a/src/about_true_and_false.rb +++ b/src/about_true_and_false.rb @@ -1,6 +1,6 @@ -require File.expand_path(File.dirname(__FILE__) + '/edgecase') +require File.expand_path(File.dirname(__FILE__) + '/neo') -class AboutTrueAndFalse < EdgeCase::Koan +class AboutTrueAndFalse < Neo::Koan def truth_value(condition) if condition :true_stuff diff --git a/src/edgecase.rb b/src/neo.rb similarity index 94% rename from src/edgecase.rb rename to src/neo.rb index 713f55d..06c60ca 100644 --- a/src/edgecase.rb +++ b/src/neo.rb @@ -83,8 +83,7 @@ class String end end -# TODO: Change EdgeCase to Neo -module EdgeCase +module Neo class << self def simple_output ENV['SIMPLE_KOAN_OUTPUT'] == 'true' @@ -196,7 +195,7 @@ module EdgeCase @failure = step.failure add_progress(@pass_count) @observations << Color.red("#{step.koan_file}##{step.name} has damaged your karma.") - throw :edgecase_exit + throw :neo_exit end end @@ -222,7 +221,7 @@ module EdgeCase def show_progress bar_width = 50 - total_tests = EdgeCase::Koan.total_tests + total_tests = Neo::Koan.total_tests scale = bar_width.to_f/total_tests print Color.green("your path thus far [") happy_steps = (pass_count*scale).to_i @@ -238,7 +237,7 @@ module EdgeCase end def end_screen - if EdgeCase.simple_output + if Neo.simple_output boring_end_screen else artistic_end_screen @@ -275,7 +274,7 @@ module EdgeCase ,:::::::::::::, brought to you by ,,::::::::::::, :::::::::::::: ,:::::::::::: ::::::::::::::, ,::::::::::::: - ::::::::::::, EdgeCase Software Artisans , :::::::::::: + ::::::::::::, Neo Software Artisans , :::::::::::: :,::::::::: :::: ::::::::::::: ,::::::::::: ,: ,,:::::::::::::, :::::::::::: ,::::::::::::::, @@ -337,7 +336,7 @@ ENDTEXT def find_interesting_lines(backtrace) backtrace.reject { |line| - line =~ /test\/unit\/|edgecase\.rb|minitest/ + line =~ /test\/unit\/|neo\.rb|minitest/ } end @@ -397,19 +396,19 @@ ENDTEXT setup begin send(name) - rescue StandardError, EdgeCase::Sensei::AssertionError => ex + rescue StandardError, Neo::Sensei::AssertionError => ex failed(ex) ensure begin teardown - rescue StandardError, EdgeCase::Sensei::AssertionError => ex + rescue StandardError, Neo::Sensei::AssertionError => ex failed(ex) if passed? end end self end - # Class methods for the EdgeCase test suite. + # Class methods for the Neo test suite. class << self def inherited(subclass) subclasses << subclass @@ -466,7 +465,7 @@ ENDTEXT class ThePath def walk - sensei = EdgeCase::Sensei.new + sensei = Neo::Sensei.new each_step do |step| sensei.observe(step.meditate) end @@ -474,9 +473,9 @@ ENDTEXT end def each_step - catch(:edgecase_exit) { + catch(:neo_exit) { step_count = 0 - EdgeCase::Koan.subclasses.each_with_index do |koan,koan_index| + Neo::Koan.subclasses.each_with_index do |koan,koan_index| koan.testmethods.each do |method_name| step = koan.new(method_name, koan.to_s, koan_index+1, step_count+=1) yield step @@ -488,6 +487,6 @@ ENDTEXT end END { - EdgeCase::Koan.command_line(ARGV) - EdgeCase::ThePath.new.walk + Neo::Koan.command_line(ARGV) + Neo::ThePath.new.walk } From dc8f73f1070924f334a714ce86994eeb11b6bde7 Mon Sep 17 00:00:00 2001 From: Jim Weirich Date: Tue, 9 Apr 2013 10:40:49 -0400 Subject: [PATCH 19/60] Remove test_helper.rb --- src/test_helper.rb | 7 ------- 1 file changed, 7 deletions(-) delete mode 100644 src/test_helper.rb diff --git a/src/test_helper.rb b/src/test_helper.rb deleted file mode 100644 index 9accf96..0000000 --- a/src/test_helper.rb +++ /dev/null @@ -1,7 +0,0 @@ -require 'test/unit' - -def __ - "FILL ME IN" -end - -EdgeCase = Test::Unit From 86cb9c5a27c53d38bec8fe8bf894a8e931e64e7f Mon Sep 17 00:00:00 2001 From: Jim Weirich Date: Tue, 9 Apr 2013 10:46:13 -0400 Subject: [PATCH 20/60] Fixed times example. --- src/about_control_statements.rb | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/about_control_statements.rb b/src/about_control_statements.rb index b9d1045..6fedd70 100644 --- a/src/about_control_statements.rb +++ b/src/about_control_statements.rb @@ -130,13 +130,13 @@ class AboutControlStatements < Neo::Koan end assert_equal [__("FISH"), __("AND"), __("CHIPS")], result end - + def test_times_statement - i = 0 + sum = 0 10.times do - i += 1 + sum += 1 end - assert_equal __(10), result + assert_equal __(10), sum end end From f3560581ce185e94cb8baaab1d5c69c1ffd965b6 Mon Sep 17 00:00:00 2001 From: Jim Weirich Date: Tue, 9 Apr 2013 10:58:49 -0400 Subject: [PATCH 21/60] Removed RDoc --- Rakefile | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/Rakefile b/Rakefile index ab77d19..11c4353 100755 --- a/Rakefile +++ b/Rakefile @@ -2,11 +2,6 @@ # -*- ruby -*- require 'rake/clean' -begin - require 'rdoc/task' -rescue LoadError => ex - # No rdoc task availble. -end SRC_DIR = 'src' PROB_DIR = 'koans' @@ -90,13 +85,6 @@ task :walk_the_path do ruby 'path_to_enlightenment.rb' end -if defined?(Rake::RDocTask) - Rake::RDocTask.new do |rd| - rd.main = "README.rdoc" - rd.rdoc_files.include("README.rdoc", "${PROB_DIR}/*.rb") - end -end - directory DIST_DIR directory PROB_DIR From 63753656afc0214853bdb2196d2f076c27ce794d Mon Sep 17 00:00:00 2001 From: Jim Weirich Date: Tue, 9 Apr 2013 11:06:31 -0400 Subject: [PATCH 22/60] Fix prematurely correct answer. --- src/about_classes.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/about_classes.rb b/src/about_classes.rb index e1de7d7..48c8054 100644 --- a/src/about_classes.rb +++ b/src/about_classes.rb @@ -147,7 +147,7 @@ class AboutClasses < Neo::Koan end def to_s - __(@name) + @name end def inspect From 197dd8eff88f70a1d3a31a5fe0952dbfb598c536 Mon Sep 17 00:00:00 2001 From: Jim Weirich Date: Tue, 9 Apr 2013 11:13:51 -0400 Subject: [PATCH 23/60] Clarify the difference between here docs and multi-line strings. --- src/about_strings.rb | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/about_strings.rb b/src/about_strings.rb index 8a96a52..2496982 100644 --- a/src/about_strings.rb +++ b/src/about_strings.rb @@ -42,6 +42,7 @@ It was the worst of times. } assert_equal __(54), long_string.length assert_equal __(3), long_string.lines.count + assert_equal __("\n"), long_string[0,1] end def test_here_documents_can_also_handle_multiple_lines @@ -51,6 +52,7 @@ It was the worst of times. EOS assert_equal __(53), long_string.length assert_equal __(2), long_string.lines.count + assert_equal __("I"), long_string[0,1] end def test_plus_will_concatenate_two_strings From 12639186cb48d61c1d097f36cd39805f9b022338 Mon Sep 17 00:00:00 2001 From: Jim Weirich Date: Tue, 9 Apr 2013 11:26:58 -0400 Subject: [PATCH 24/60] Fix order of comparison in about symbols to follow standard. --- src/about_symbols.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/about_symbols.rb b/src/about_symbols.rb index c2c9321..5963c65 100644 --- a/src/about_symbols.rb +++ b/src/about_symbols.rb @@ -50,14 +50,14 @@ class AboutSymbols < Neo::Koan def test_symbols_with_spaces_can_be_built symbol = :"cats and dogs" - assert_equal symbol, __("cats and dogs").to_sym + assert_equal __("cats and dogs").to_sym, symbol end def test_symbols_with_interpolation_can_be_built value = "and" symbol = :"cats #{value} dogs" - assert_equal symbol, __("cats and dogs").to_sym + assert_equal __("cats and dogs").to_sym, symbol end def test_to_s_is_called_on_interpolated_symbols From e947652bcf5953001dd4134d37ee38c301201c20 Mon Sep 17 00:00:00 2001 From: Jim Weirich Date: Tue, 9 Apr 2013 15:19:32 -0400 Subject: [PATCH 25/60] Zip file goes in download directory. Moving the zip file to the source tree so it can be downloaded. --- Rakefile | 20 ++++++-------------- download/rubykoans.zip | Bin 0 -> 38100 bytes 2 files changed, 6 insertions(+), 14 deletions(-) create mode 100644 download/rubykoans.zip diff --git a/Rakefile b/Rakefile index 11c4353..ab0a2ec 100755 --- a/Rakefile +++ b/Rakefile @@ -5,17 +5,14 @@ require 'rake/clean' SRC_DIR = 'src' PROB_DIR = 'koans' -DIST_DIR = 'dist' +DOWNLOAD_DIR = 'download' SRC_FILES = FileList["#{SRC_DIR}/*"] KOAN_FILES = SRC_FILES.pathmap("#{PROB_DIR}/%f") -today = Time.now.strftime("%Y-%m-%d") -TAR_FILE = "#{DIST_DIR}/rubykoans-#{today}.tgz" -ZIP_FILE = "#{DIST_DIR}/rubykoans-#{today}.zip" +ZIP_FILE = "#{DOWNLOAD_DIR}/rubykoans.zip" CLEAN.include("**/*.rbc") -CLOBBER.include(DIST_DIR) module Koans extend Rake::DSL if defined?(Rake::DSL) @@ -85,23 +82,18 @@ task :walk_the_path do ruby 'path_to_enlightenment.rb' end -directory DIST_DIR +directory DOWNLOAD_DIR directory PROB_DIR -file ZIP_FILE => KOAN_FILES + [DIST_DIR] do +file ZIP_FILE => KOAN_FILES + [DOWNLOAD_DIR] do sh "zip #{ZIP_FILE} #{PROB_DIR}/*" end -file TAR_FILE => KOAN_FILES + [DIST_DIR] do - sh "tar zcvf #{TAR_FILE} #{PROB_DIR}" -end - desc "Create packaged files for distribution" -task :package => [TAR_FILE, ZIP_FILE] +task :package => [ZIP_FILE] desc "Upload the package files to the web server" -task :upload => [TAR_FILE, ZIP_FILE] do - sh "scp #{TAR_FILE} linode:sites/onestepback.org/download" +task :upload => [ZIP_FILE] do sh "scp #{ZIP_FILE} linode:sites/onestepback.org/download" end diff --git a/download/rubykoans.zip b/download/rubykoans.zip new file mode 100644 index 0000000000000000000000000000000000000000..91662455cbcee4dc9b8f0705a6d49fcea7270587 GIT binary patch literal 38100 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 Date: Tue, 9 Apr 2013 16:04:07 -0400 Subject: [PATCH 26/60] Added deploy instructions. --- DEPLOYING | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 DEPLOYING diff --git a/DEPLOYING b/DEPLOYING new file mode 100644 index 0000000..3b91dc3 --- /dev/null +++ b/DEPLOYING @@ -0,0 +1,12 @@ += Deploying a new Ruby Koans ZIP file + +The "Download" button on the rubykoans.com web-site points to the +download/rubykoans.zip file in the github repository. So to update the +download target on the web-site, just rebuild the .zip file, commit +and push the changes. + + rake package + git add download + git push + +That's it. \ No newline at end of file From 610e219fa5e340592db262a925935d3b161c601c Mon Sep 17 00:00:00 2001 From: Mike Mazur Date: Fri, 12 Apr 2013 09:23:21 -0400 Subject: [PATCH 27/60] One more EdgeCase -> Neo change in the Rakefile Fixes #92. --- Rakefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Rakefile b/Rakefile index ab0a2ec..0c3b2c0 100755 --- a/Rakefile +++ b/Rakefile @@ -32,7 +32,7 @@ module Koans end def Koans.make_koan_file(infile, outfile) - if infile =~ /edgecase/ + if infile =~ /neo/ cp infile, outfile else open(infile) do |ins| From 24a0069c20bbfc4273286f00318441499860188c Mon Sep 17 00:00:00 2001 From: Jason Noble Date: Sun, 14 Apr 2013 11:53:37 -0600 Subject: [PATCH 28/60] Update .gitignore with .ruby-version .ruby-version is the new .rvmrc, although .rvmrc is used still. --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 81fb2a4..26bb3fc 100644 --- a/.gitignore +++ b/.gitignore @@ -2,5 +2,6 @@ dist .project_env.rc .path_progress .rvmrc +.ruby-version *.rbc koans/* From f4d9dc0db70766f2eff673024aeffa924d97fff2 Mon Sep 17 00:00:00 2001 From: Artur Moczulski Date: Wed, 24 Apr 2013 00:24:09 -0700 Subject: [PATCH 29/60] Fixes a silly typo in the method name in method_with_keyword_arguments_with_mandatory_argument --- src/about_keyword_arguments.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/about_keyword_arguments.rb b/src/about_keyword_arguments.rb index 1596034..e92dc14 100644 --- a/src/about_keyword_arguments.rb +++ b/src/about_keyword_arguments.rb @@ -13,13 +13,13 @@ class AboutMethods < Neo::Koan assert_equal __([1, 2]), method_with_keyword_arguments(two: 2) end - def method_with_keywork_arguments_with_mandatory_argument(one, two: 2, three: 3) + def method_with_keyword_arguments_with_mandatory_argument(one, two: 2, three: 3) [one, two, three] end def test_keyword_arguments_with_wrong_number_of_arguments exception = assert_raise (___(ArgumentError)) do - method_with_keywork_arguments_with_mandatory_argument + method_with_keyword_arguments_with_mandatory_argument end assert_match(/#{__("wrong number of arguments")}/, exception.message) end From 6b66d4615636b5bcb35d1b8d4f12d8972b1b9ab4 Mon Sep 17 00:00:00 2001 From: Steven Ndaye Date: Mon, 13 May 2013 11:22:02 +0200 Subject: [PATCH 30/60] Wrong class name from AboutMethods to AboutKeywordArguments --- src/about_keyword_arguments.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/about_keyword_arguments.rb b/src/about_keyword_arguments.rb index 1596034..22acdc3 100644 --- a/src/about_keyword_arguments.rb +++ b/src/about_keyword_arguments.rb @@ -1,6 +1,6 @@ require File.expand_path(File.dirname(__FILE__) + '/neo') -class AboutMethods < Neo::Koan +class AboutKeywordArguments < Neo::Koan def method_with_keyword_arguments(one: 1, two: 'two') [one, two] From 1ce6d52963221eb6df2c3c8bca3e2147feeef2e2 Mon Sep 17 00:00:00 2001 From: Buck Doyle Date: Mon, 13 May 2013 16:48:57 -0300 Subject: [PATCH 31/60] test_inject_will_blow_your_mind uses an incorrect memo argument name No big NBD, but the second memo argument is better called 'product' than 'sum'. --- src/about_iteration.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/about_iteration.rb b/src/about_iteration.rb index 8e16bf6..8a4c16b 100644 --- a/src/about_iteration.rb +++ b/src/about_iteration.rb @@ -86,7 +86,7 @@ class AboutIteration < Neo::Koan result = [2, 3, 4].inject(0) { |sum, item| sum + item } assert_equal __(9), result - result2 = [2, 3, 4].inject(1) { |sum, item| sum * item } + result2 = [2, 3, 4].inject(1) { |product, item| sum * item } assert_equal __(24), result2 # Extra Credit: From dfaeb570e505f557ce35806b381ec93f21d675e2 Mon Sep 17 00:00:00 2001 From: Adler Santos Date: Mon, 3 Jun 2013 02:18:29 +0800 Subject: [PATCH 32/60] corrected example code in test_each_can_use_curly_brace_blocks_too test_each_can_use_curly_brace_blocks_too was using the do-end block instead of the curly brace syntax for the each method. --- src/about_iteration.rb | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/about_iteration.rb b/src/about_iteration.rb index 8e16bf6..d1132d1 100644 --- a/src/about_iteration.rb +++ b/src/about_iteration.rb @@ -39,9 +39,7 @@ class AboutIteration < Neo::Koan def test_each_can_use_curly_brace_blocks_too array = [1, 2, 3] sum = 0 - array.each do |item| - sum += item - end + array.each { |item| sum += item } assert_equal __(6), sum end From 718538b72936c47691ecd0fdbe4f326aa8bd20f2 Mon Sep 17 00:00:00 2001 From: Jim Weirich Date: Thu, 6 Jun 2013 23:03:33 +0800 Subject: [PATCH 33/60] Add ~ files to ignore list. --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 81fb2a4..d7338af 100644 --- a/.gitignore +++ b/.gitignore @@ -4,3 +4,4 @@ dist .rvmrc *.rbc koans/* +*~ \ No newline at end of file From 4ba9f3c1422b4c650e2a50ffc22a3a952b2436c4 Mon Sep 17 00:00:00 2001 From: Jim Weirich Date: Thu, 6 Jun 2013 23:03:44 +0800 Subject: [PATCH 34/60] Add zip task for building zip file. --- Rakefile | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/Rakefile b/Rakefile index 0c3b2c0..cb79c19 100755 --- a/Rakefile +++ b/Rakefile @@ -85,6 +85,13 @@ end directory DOWNLOAD_DIR directory PROB_DIR +desc "Build zip file" +task :zip => [:clobber_zip, ZIP_FILE] + +task :clobber_zip do + rm ZIP_FILE +end + file ZIP_FILE => KOAN_FILES + [DOWNLOAD_DIR] do sh "zip #{ZIP_FILE} #{PROB_DIR}/*" end From 623e21fc18eef6be5b21ac2fe2d49d66589872ed Mon Sep 17 00:00:00 2001 From: Jim Weirich Date: Thu, 6 Jun 2013 23:04:18 +0800 Subject: [PATCH 35/60] Updated zip file to latest changes. --- download/rubykoans.zip | Bin 38100 -> 38421 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/download/rubykoans.zip b/download/rubykoans.zip index 91662455cbcee4dc9b8f0705a6d49fcea7270587..95299d5e6f73ad3cc5201cb200bcc1b2c2517d98 100644 GIT binary patch delta 9512 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 A9RL6T delta 9079 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 From ad5f6f5fe86090fdfc901179689a635935df0913 Mon Sep 17 00:00:00 2001 From: Jim Weirich Date: Fri, 7 Jun 2013 05:38:44 +0800 Subject: [PATCH 36/60] Fixed missed sum => product change --- src/about_iteration.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/about_iteration.rb b/src/about_iteration.rb index 938b175..c14e5fb 100644 --- a/src/about_iteration.rb +++ b/src/about_iteration.rb @@ -84,7 +84,7 @@ class AboutIteration < Neo::Koan result = [2, 3, 4].inject(0) { |sum, item| sum + item } assert_equal __(9), result - result2 = [2, 3, 4].inject(1) { |product, item| sum * item } + result2 = [2, 3, 4].inject(1) { |product, item| product * item } assert_equal __(24), result2 # Extra Credit: From d5b787cd2b85db4cfafb05a5b58571a969c52170 Mon Sep 17 00:00:00 2001 From: Jim Weirich Date: Fri, 7 Jun 2013 06:01:01 +0800 Subject: [PATCH 37/60] Beefed up the greed scoring tests just a bit. --- src/about_scoring_project.rb | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/about_scoring_project.rb b/src/about_scoring_project.rb index 8315520..4031eb4 100644 --- a/src/about_scoring_project.rb +++ b/src/about_scoring_project.rb @@ -90,6 +90,9 @@ class AboutScoringProject < Neo::Koan def test_score_of_mixed_is_sum assert_equal 250, score([2,5,2,2,3]) assert_equal 550, score([5,5,5,5]) + assert_equal 1100, score([1,1,1,1]) + assert_equal 1200, score([1,1,1,1,1]) + assert_equal 1150, score([1,1,1,5,1]) end end From 8dd3acae415fe7323213ef334180b4e5bc358d84 Mon Sep 17 00:00:00 2001 From: Jim Weirich Date: Fri, 7 Jun 2013 06:02:26 +0800 Subject: [PATCH 38/60] Update the zip file with the latest changes. --- download/rubykoans.zip | Bin 38421 -> 38449 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/download/rubykoans.zip b/download/rubykoans.zip index 95299d5e6f73ad3cc5201cb200bcc1b2c2517d98..ec2da90aa65f4644f99e01252a98344f2b66ede8 100644 GIT binary patch delta 4419 zcmZ{nc|4R|8^`Y%hG)o{hRh`UI=09bM)oX)$WlZigqg;YrA%ThlO=AHhh)nZA{0eL z*^@0vLYB%?Av<~XPBWRF>GQsS+<%X3FZkhBY#zaj3cZRc$`yoM+k;-CQuj$*TEfDWy<9Y zp}=x(n#ZaM?g=Vv;XzZBKV7c!j8fq%#BU`tZz+^w{$TF`n$P*YHy9`|b|2N8Jj$y2 zeN$AJDAc$V21do&b zJexkWH+A{U-&19j8 zeWYzk6Au<)_3@0*f4n)F@NPBe3xdz?-aRc(31r-$1+s1@1+^L<18a~{;KNrz2>Z!ujJTb z^eVhGmJ}2pqzI(2yZSBOTzIdgTSgMTX*V^fG-#{<5mTDcJ#fBNCS{4eTXZB)s;i*7 zVmcva7qjDH{h`RwUKHmzTz?uuAh5MaGA16!MzYRNTNQ4Mu?3BoXNP7A%!NNj&x@>0 zeAR^bc=2_4k4Z0U6mc<3UF5(J^htyy%m5O1{)7qs^qMr|U?s{IU@MaW_?cPQ; z>XS02Cq8Rew<2av4YqO<_`M1X$`)0y(tl{X*!`Cp4ZZ#%r#}$B3}AO2##tMaC(v#f-wHx~y=mC@f+O{X~zHy((ButkhG9 zK3wzRy}sdNu^EBZfHP;zH)`>BgKB+I1u4bE@=nD&WqYQWE}4gL+7Sp0ZF*{XSAt_U z#fSE(OOQ&k&?F;epSZEq>U7My0 zza2fUBlhss+;*->&$fJ##kZy0>xh7;t?ze=3%2Uf)~Z>}|B@7=z6pP($iRVHTxyuLK+a_@B?w_*6E0RhCURbl)onu%J z;$5`Vak2w#)3JS1GMBz{pivK#{Dbw

pUCor#mfrvCXq`05OtPd^>xmpt|%VKcl} zT>;+d!Dlk#*dQ4)w4sDJ#JlJ%865IPTq>&|d(VEEu^Ktz;K3tWgcsYqqrR^DR~ON{FzwXIZ^UA~aQ`DtMt zb){<`&fY}$FRnZiHvtcGL*4etJkR08=cvA3mfIqh$<<^tpdp72I}ue-8*NsL3AoR$ zG#Hxf$`gmOY5?v_?LW`OUnAQW(u?cZRWmx6m?WY8u@?IM!h>QW+t~Lv-1yWg8>ppr zh*7L=lFyjQxwcc{`B#di$~4C(nv47;4@o|UarDQuDxPAynX8CB+2*@$^etgKW>7lA zv3Jgwr}d1A-am>hITrTieO3>QPOl25xp1^^HQ zP+(5H2muZ-{Ga3SmX-OjW*yFkHCwaE95L>gkn_t|V)d^+WzC9vv+HZG$`@wehdkR2 z1F{CsA|dxM2AqIOl_L?CTBGaZ%oSN z;PH?*;Npy{eqe8$Z)$a+|K9u}mr>;_zHkUq{MZ1S?yr2U2c>{KjM!xpIp^!a^mXEy|!Xa z0332w*3W3%5+7*Mc~zt8fsRv#BOQ38c@i(LoIpNYMNOPFjqE#=p9_z}-Tzxu7*i$K z5lEWqI0{O-=uh{Eqy$!Qwcgnd4P3PzsJ@7Pf6B?QWz}8|+c)~S26NCGtu1^TfQJN2 zjF?AwHoGk3oi>=mpykWk7Ur~gV4*0&JVQbExed+J({9gD&@B~_UNqF50d-hJeknLI zV%M(T@P}pBfPk|QtB@{8d%0`Y}0kpezy<$ zel))72?{3hY)QRu(AaaMdoh^DiO|dORUjjjWv$XueRqb52!EF4c)*2jzo6UP_spv= zMpw^N&(|#9Sl9@EF=?R5_#!l0eMNIWv{Im*Ba1B@q1Ag;AWCH5{LH?gCweALIuWJg zf=jaO-_Lo!9I2?w9mYiabAPX0g7l8tlXcQ=uVVi3YFW`KU0%j}{2*@spw) zE}MR|BLkH3*P}43zc9`CrazQ}0&hhq)8KGKD%B&7`1?VUMKq$qPf_YWYYO->8bz_x zi$2Ie-uSfk-_Zx?`sbqc=-S6)=8SwM>4ou0APrP_@8k-ok%P5`pRXe! z;UII8C>=FVLP8-E_1AO}`*=PBd8n072)*-4g)LV_kgx1^b-Adi%-Y&)8W1k=%6GV&2>2 z6<3Ah#jLWyo4Id2U>Eb0ZJ|@CuP< Q=jWME6=Yh8`niq%3u~28rvLx| delta 4519 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 Date: Sat, 8 Jun 2013 02:44:41 +0800 Subject: [PATCH 39/60] :zip task now depends on :package. Rather than directly depending on ZIP_FILE. --- Rakefile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Rakefile b/Rakefile index cb79c19..ba8bacf 100755 --- a/Rakefile +++ b/Rakefile @@ -85,8 +85,8 @@ end directory DOWNLOAD_DIR directory PROB_DIR -desc "Build zip file" -task :zip => [:clobber_zip, ZIP_FILE] +desc "(re)Build zip file" +task :zip => [:clobber_zip, :package] task :clobber_zip do rm ZIP_FILE From 98a72a5a4cca21cce343e44f27330ed31ff8c608 Mon Sep 17 00:00:00 2001 From: Mike Henry Date: Mon, 10 Jun 2013 15:34:58 -0600 Subject: [PATCH 40/60] Update about_strings.rb Update single character representation test for Ruby 2. --- src/about_strings.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/about_strings.rb b/src/about_strings.rb index 2496982..bb28593 100644 --- a/src/about_strings.rb +++ b/src/about_strings.rb @@ -159,8 +159,8 @@ EOS end end - in_ruby_version("1.9") do - def test_in_ruby_1_9_single_characters_are_represented_by_strings + in_ruby_version("1.9", "2") do + def test_in_ruby_1_9_and_2_single_characters_are_represented_by_strings assert_equal __('a'), ?a assert_equal __(false), ?a == 97 end From 8ce0fb65065c15257d5c56fd08c6fecfd32e2bff Mon Sep 17 00:00:00 2001 From: michael-gebis Date: Tue, 11 Jun 2013 23:11:48 -0700 Subject: [PATCH 41/60] Trimmed artistic end message to 79 columns. On Windows, the standard terminal will insert a blank line after any 80-column line. Yes, this is a silly way for a terminal to work, but on Windows, this is likely to happen. Trimming to 79 columns makes things much less ugly. --- src/neo.rb | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/neo.rb b/src/neo.rb index 06c60ca..1948b19 100644 --- a/src/neo.rb +++ b/src/neo.rb @@ -268,10 +268,10 @@ module Neo ,:::::::::::, ::::::::::::, :::::::::::, ,:::::::::::: ::::::::::::: ,:::::::::::: -:::::::::::: Ruby Koans ::::::::::::, -::::::::::::#{ ruby_version },::::::::::::, -:::::::::::, , :::::::::::: -,:::::::::::::, brought to you by ,,::::::::::::, +:::::::::::: Ruby Koans :::::::::::: +::::::::::::#{ ruby_version },:::::::::::: +:::::::::::, , ::::::::::: +,:::::::::::::, brought to you by ,,:::::::::::: :::::::::::::: ,:::::::::::: ::::::::::::::, ,::::::::::::: ::::::::::::, Neo Software Artisans , :::::::::::: From a380b44165435d9998c160e11c890fbf9d07cc4c Mon Sep 17 00:00:00 2001 From: Jim Weirich Date: Tue, 2 Jul 2013 15:55:31 -0400 Subject: [PATCH 42/60] Updated email addresses. --- README.rdoc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.rdoc b/README.rdoc index dc7c173..c18b083 100644 --- a/README.rdoc +++ b/README.rdoc @@ -177,8 +177,8 @@ Brian Marick's fantastic guide for beginners Everyday Scripting with Ruby :: = Other stuff -Author :: Jim Weirich -Author :: Joe O'Brien +Author :: Jim Weirich +Author :: Joe O'Brien Issue Tracker :: http://www.pivotaltracker.com/projects/48111 Requires :: Ruby 1.8.x or later and Rake (any recent version) From ea66a6d175414f7166ec4026339a4ef55675ba59 Mon Sep 17 00:00:00 2001 From: smlance Date: Tue, 9 Jul 2013 09:40:01 -0400 Subject: [PATCH 43/60] Initial minor changes (grammatical in methods; require -> require_relative in tri...). --- src/about_methods.rb | 2 +- src/about_triangle_project.rb | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/about_methods.rb b/src/about_methods.rb index 2a1c3fa..bd6d8b3 100644 --- a/src/about_methods.rb +++ b/src/about_methods.rb @@ -37,7 +37,7 @@ class AboutMethods < Neo::Koan # end - # NOTE: wrong number of argument is not a SYNTAX error, but a + # NOTE: wrong number of arguments is not a SYNTAX error, but a # runtime error. def test_calling_global_methods_with_wrong_number_of_arguments exception = assert_raise(___(ArgumentError)) do diff --git a/src/about_triangle_project.rb b/src/about_triangle_project.rb index ec2447c..0bf2aa9 100644 --- a/src/about_triangle_project.rb +++ b/src/about_triangle_project.rb @@ -1,7 +1,7 @@ require File.expand_path(File.dirname(__FILE__) + '/neo') # You need to write the triangle method in the file 'triangle.rb' -require 'triangle.rb' +require_relative 'triangle.rb' class AboutTriangleProject < Neo::Koan def test_equilateral_triangles_have_equal_sides From 4e5b9ca9698989dd7c51e9d24e4e97a0602ad274 Mon Sep 17 00:00:00 2001 From: smlance Date: Tue, 9 Jul 2013 09:44:01 -0400 Subject: [PATCH 44/60] Fixed another small grammatical mistake (. to ? in dice file) --- src/about_dice_project.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/about_dice_project.rb b/src/about_dice_project.rb index 98717ba..b458147 100644 --- a/src/about_dice_project.rb +++ b/src/about_dice_project.rb @@ -56,7 +56,7 @@ class AboutDiceProject < Neo::Koan # # If the rolls are random, then it is possible (although not # likely) that two consecutive rolls are equal. What would be a - # better way to test this. + # better way to test this? end def test_you_can_roll_different_numbers_of_dice From cf615027345e1a73c2258d14acbe55dc363889a5 Mon Sep 17 00:00:00 2001 From: smlance Date: Tue, 9 Jul 2013 09:57:17 -0400 Subject: [PATCH 45/60] Made a minor readability change to a comment in about_blocks.rb --- src/about_blocks.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/about_blocks.rb b/src/about_blocks.rb index af6f207..fa06eab 100644 --- a/src/about_blocks.rb +++ b/src/about_blocks.rb @@ -70,7 +70,7 @@ class AboutBlocks < Neo::Koan add_one = lambda { |n| n + 1 } assert_equal __(11), add_one.call(10) - # Alternative calling sequence + # Alternative calling syntax assert_equal __(11), add_one[10] end From 0e6d826af44fda04ff6134d1a8d2e9ac9b4c1717 Mon Sep 17 00:00:00 2001 From: Jim Weirich Date: Wed, 10 Jul 2013 17:25:39 -0400 Subject: [PATCH 46/60] Internalized assertions. This makes us independent of test/unit and minitest. --- src/about_message_passing.rb | 2 +- src/about_modules.rb | 2 +- src/neo.rb | 79 ++++++++++++++++++++++++++++-------- 3 files changed, 65 insertions(+), 18 deletions(-) diff --git a/src/about_message_passing.rb b/src/about_message_passing.rb index 4301a95..f6af2bf 100644 --- a/src/about_message_passing.rb +++ b/src/about_message_passing.rb @@ -122,7 +122,7 @@ class AboutMessagePassing < Neo::Koan def test_catching_messages_makes_respond_to_lie catcher = AllMessageCatcher.new - assert_nothing_raised(NoMethodError) do # __ + assert_nothing_raised do # __ catcher.any_method end assert_equal __(false), catcher.respond_to?(:any_method) diff --git a/src/about_modules.rb b/src/about_modules.rb index a96c662..246831c 100644 --- a/src/about_modules.rb +++ b/src/about_modules.rb @@ -44,7 +44,7 @@ class AboutModules < Neo::Koan def test_module_methods_are_also_available_in_the_object fido = Dog.new - assert_nothing_raised(Exception) do # __ + assert_nothing_raised do # __ fido.set_name("Rover") end end diff --git a/src/neo.rb b/src/neo.rb index 1948b19..0e5a867 100644 --- a/src/neo.rb +++ b/src/neo.rb @@ -1,7 +1,6 @@ #!/usr/bin/env ruby # -*- ruby -*- -require 'test/unit/assertions' begin require 'win32console' rescue LoadError @@ -139,20 +138,68 @@ module Neo end end + module Assertions + FailedAssertionError = Class.new(StandardError) + + def flunk(msg) + raise FailedAssertionError, msg + end + + def assert(condition, msg=nil) + msg ||= "Failed assertion." + flunk(msg) unless condition + true + end + + def assert_equal(expected, actual, msg=nil) + msg ||= "Expected #{expected.inspect} to equal #{actual.inspect}" + assert(expected == actual, msg) + end + + def assert_not_equal(expected, actual, msg=nil) + msg ||= "Expected #{expected.inspect} to not equal #{actual.inspect}" + assert(expected != actual, msg) + end + + def assert_nil(actual, msg=nil) + msg ||= "Expected #{actual.inspect} to be nil" + assert(nil == actual, msg) + end + + def assert_not_nil(actual, msg=nil) + msg ||= "Expected #{actual.inspect} to not be nil" + assert(nil != actual, msg) + end + + def assert_match(pattern, actual, msg=nil) + msg ||= "Expected #{actual.inspect} to match #{pattern.inspect}" + assert pattern =~ actual, msg + end + + def assert_raise(exception) + begin + yield + rescue Exception => ex + expected = ex.is_a?(exception) + assert(expected, "Exception #{exception.inspect} expected, but #{ex.inspect} was raised") + return ex + end + flunk "Exception #{exception.inspect} expected, but nothing raised" + end + + def assert_nothing_raised + begin + yield + rescue Exception => ex + flunk "Expected nothing to be raised, but exception #{exception.inspect} was raised" + end + end + end + class Sensei attr_reader :failure, :failed_test, :pass_count - in_ruby_version("1.8") do - AssertionError = Test::Unit::AssertionFailedError - end - - in_ruby_version("1.9", "2.0") do - if defined?(MiniTest) - AssertionError = MiniTest::Assertion - else - AssertionError = Test::Unit::AssertionFailedError - end - end + FailedAssertionError = Assertions::FailedAssertionError def initialize @pass_count = 0 @@ -204,7 +251,7 @@ module Neo end def assert_failed? - failure.is_a?(AssertionError) + failure.is_a?(FailedAssertionError) end def instruct @@ -366,7 +413,7 @@ ENDTEXT end class Koan - include Test::Unit::Assertions + include Assertions attr_reader :name, :failure, :koan_count, :step_count, :koan_file @@ -396,12 +443,12 @@ ENDTEXT setup begin send(name) - rescue StandardError, Neo::Sensei::AssertionError => ex + rescue StandardError, Neo::Sensei::FailedAssertionError => ex failed(ex) ensure begin teardown - rescue StandardError, Neo::Sensei::AssertionError => ex + rescue StandardError, Neo::Sensei::FailedAssertionError => ex failed(ex) if passed? end end From 3a8f125dd7f8dd889ac3b6ba62ffbfb8d2068b56 Mon Sep 17 00:00:00 2001 From: Jim Weirich Date: Wed, 10 Jul 2013 17:30:34 -0400 Subject: [PATCH 47/60] Shorter stack traces, even on exceptions. --- src/neo.rb | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/src/neo.rb b/src/neo.rb index 0e5a867..18e7ef7 100644 --- a/src/neo.rb +++ b/src/neo.rb @@ -356,11 +356,7 @@ ENDTEXT puts Color.red(indent(failure.message).join) puts puts "Please meditate on the following code:" - if assert_failed? - puts embolden_first_line_only(indent(find_interesting_lines(failure.backtrace))) - else - puts embolden_first_line_only(indent(failure.backtrace)) - end + puts embolden_first_line_only(indent(find_interesting_lines(failure.backtrace))) puts end @@ -383,7 +379,7 @@ ENDTEXT def find_interesting_lines(backtrace) backtrace.reject { |line| - line =~ /test\/unit\/|neo\.rb|minitest/ + line =~ /neo\.rb/ } end From d85e9f09dc85b293383dec069f8d7d6d650822f1 Mon Sep 17 00:00:00 2001 From: Jim Weirich Date: Wed, 10 Jul 2013 17:31:07 -0400 Subject: [PATCH 48/60] Update zip file. --- download/rubykoans.zip | Bin 38449 -> 38654 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/download/rubykoans.zip b/download/rubykoans.zip index ec2da90aa65f4644f99e01252a98344f2b66ede8..44640d189707b67fd772142597fbd9793c9df6bc 100644 GIT binary patch delta 10563 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 R4`w69KZETGyjL3V{{YD>Cq@7O delta 10319 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 U;Ko?|2SeXt$zacd?p*==AAlBVQ2+n{ From 482ae6f86f7963035683c88ff2ba9b0e32f64af5 Mon Sep 17 00:00:00 2001 From: Jim Weirich Date: Wed, 10 Jul 2013 17:40:36 -0400 Subject: [PATCH 49/60] Using the term 'modern ruby' --- src/about_strings.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/about_strings.rb b/src/about_strings.rb index bb28593..c74bef2 100644 --- a/src/about_strings.rb +++ b/src/about_strings.rb @@ -151,7 +151,7 @@ EOS end in_ruby_version("1.8") do - def test_in_ruby_1_8_single_characters_are_represented_by_integers + def test_in_older_ruby_single_characters_are_represented_by_integers assert_equal __(97, 'a'), ?a assert_equal __(true, false), ?a == 97 @@ -160,7 +160,7 @@ EOS end in_ruby_version("1.9", "2") do - def test_in_ruby_1_9_and_2_single_characters_are_represented_by_strings + def test_in_modern_ruby_single_characters_are_represented_by_strings assert_equal __('a'), ?a assert_equal __(false), ?a == 97 end From fa699e6eeb14378049bd1a9ac5165aac46c55677 Mon Sep 17 00:00:00 2001 From: Jim Weirich Date: Wed, 10 Jul 2013 17:41:21 -0400 Subject: [PATCH 50/60] Update zip file. --- download/rubykoans.zip | Bin 38654 -> 38676 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/download/rubykoans.zip b/download/rubykoans.zip index 44640d189707b67fd772142597fbd9793c9df6bc..bd88cbbd9601bc9ab3da179f2d6a539751b9c665 100644 GIT binary patch delta 5053 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 I{b14m0fbpjssI20 delta 4969 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 QU=3gbC5hSf>UPim2gqp&TL1t6 From 35e93072f6381ba9c24437c56615b8c346a155d0 Mon Sep 17 00:00:00 2001 From: Harshad Sabne Date: Wed, 11 Sep 2013 14:28:31 +0530 Subject: [PATCH 51/60] Code fix (Update README.rdoc) Applied correct tags to display "gem install rake" as code in rdoc. --- README.rdoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.rdoc b/README.rdoc index c18b083..5908547 100644 --- a/README.rdoc +++ b/README.rdoc @@ -36,7 +36,7 @@ Windows from the command prompt (+cmd.exe+) c:\ruby --version c:\rake --version -If you don't have +rake+ installed, just run +gem install rake+ +If you don't have +rake+ installed, just run gem install rake Any response for Ruby with a version number greater than 1.8 is fine (should be around 1.8.6 or more). Any version of +rake+ will do. From 9485ec734f91fbe01c0b67c48cf069238fcaa467 Mon Sep 17 00:00:00 2001 From: Jim Weirich Date: Tue, 1 Oct 2013 21:41:42 -0400 Subject: [PATCH 52/60] Don't answer the first few questions (#120) https://github.com/neo/ruby_koans/pull/120 --- download/rubykoans.zip | Bin 38676 -> 38674 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/download/rubykoans.zip b/download/rubykoans.zip index bd88cbbd9601bc9ab3da179f2d6a539751b9c665..20a9a9af9f29a3513f8b133114901f1843ca1bfb 100644 GIT binary patch delta 3536 zcmZ`*c|4Ts9)B2*j5SQg(kN?aLLb?Wb4s1G7>R4LHZuyROekcH2RCIctw^2W zR-}cFOxkN2PN{GRXc`~5A?Go@$bOU}rv2Ky5f zv;Y8efpL?ESFtK>ZbORyFT(HK3ZjC75QM%877~=dQ=wN`3B|vB{XJ4cF@^dBn97>ppY7EXwV< zGDlzUr@nXduY4Ga>4h!pT!NpBo_c8&QN4V3iv0-LDDmPH#kM)`2)mSIc$41aJwuK8{;@XcBcV>Gn=cAn zq6#al?>kTVM)#O^3;0(#F>q>rX2Z`TX^ph0NtMabs%I^omm?OBMpu@!)vjjx^%c~f zZoM>2c5SG=|IzNlJz8q{&Pr0;C+k5o`t)9>TK|oeCSBY1@e+bumy)OD@8#!3{P)$K zYY!=KG=8RV+ld}8l0oc4cqH4z^W%-O1CO3-Mtk*91rAfEIoI31?Kon z+m4^-XFsOi@gOE~17+G(yZ=fF<;iEmW!;6{d+&}v=+*v|nJ(}bm{O9ohBWF!CYlAe zE150%^9o$nd}eq?jnJs?hZ*ztKdAc2>hb!HvC_0HDg?7p@5zDG*3O=r+}N$l9QqD- z3Fc+k-E!}LnvlvP;D-tRM+fWq@45~0;z?-Mvy*h1KdM(w5W^V;Rv6rB@B)Poo7iCR zU6VMJ#KX)HgL!84C`_f&F*uAGkHYsXZ82Dp=7+)|)>t$wu$~kP$+E#z^Do#CQ6bmp zi!qK*bO)5fZmE>MsHM-)m09JCQS*7uGbo(y?tqb8cHf0A$8yF}3{GKK6VaVnDOHlE zE9+1t={{0$i%%U&vfhu1k>vOpqXHWPq@o7`n$hTzASr=2gASr_RIoEfay&R6)$JJK zguzK6b5Vimp;E1E3-uz1mfC~R{mD-r07s~_*_bzbog^hI1386BWZ6acO;gB|!d|-i z?um6O!{Hlj6q;7Jt<;(~Z*6JJv2S~dVL+(vL)Cxr+lR;WTv^bT)u6q>GBDPtrh*go z;@2;m{QVPcw9UC;^ENTfziuN@l~}Eh?kc=Xoq4VKLd$mWMVST1&Y*y8UYW^Lt2p&7 zFrJpN^KE9pp)?22BH(!Zr1mx4i`(7gqn{hyUQ!5@XdXKC9oFYxYprODa@P4x{eN5T zKkMQZJ-&PNpk7*`%lL<(U03V4Cks|>x2h*qn3j^i<>MMS|v)BCJDu?@>3+rAQykFf>*Grse;U;(-ax7*#x*GDE&gPA^n|kMI zk36EZrSva}?#;;R+ELeC^Xg^CW3{daXEc7 z-}jPr>hVoi_$|y`F|VM}YUs`$=)qiSX|?_9sBe~AcFp5M?13ippc#{7wUg%pX&ZTR zGRt4Zl$z;B%n5WHZ$(Ir<4i;%I!SDn6nu7oRwH)dbsUTKee zOHt;;EUEXhI?Ee{N3)$3gxdh`9EK0D8C+e^>(e z+>#=FLR6B=*#?5AND17LI^c8o!mj*<616LYg6fu-6UGsG3uOSbarCJ+0K_DO$8#2k zZ%IhvhDC>SqW`8otH+#nQxK8}L?anT(h7M6rjm>zd3n~a#;+>?(5)g{OmjF;fE82h z1-x$?MuP3sWxcpU_d?8zC^)6(YEA@VdI!>CW1Ng6SY5bCB16=P0r`uAnn)K)GypKf z1utO$7|1Y@uB*7QfkkAwDi~d4h-cD!Bk;~a(uN^A@l%!L1Knahhnbx|k*j7L$w>lL<+oh`UfDX?G$`lD8At7A+jp zsH|zf8gns1-3N+lwtM z0Ml8x3W|JJM4ZyCK`LmE%mRJ^Xs{m|$oMuaCCe{JfHkFtDnGm_NW^B%Fof+0;>HB$ zy%JWJTFS8fSxS~$3yEdsv$!^_DVu{1TNzod0Y;Ze42php7w#-$hry5~vf#oGKR!y_ z*_{<_uId<;ux=JV|hTWWo>K7*ZCF|Ax3(j?9HjUtoN>#jI+5H=(MF nUKKM|NU$|xT?1#GnKi45%Vveg|06aMmu;flXii@?;syL4BEasU delta 3548 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 Date: Tue, 1 Oct 2013 21:51:07 -0400 Subject: [PATCH 53/60] Remove require_relative (#117) Require relative is only available in modern rubies. Let's keep this working on some of the older versions as well. https://github.com/neo/ruby_koans/pull/117 --- src/about_triangle_project.rb | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/about_triangle_project.rb b/src/about_triangle_project.rb index 0bf2aa9..2ac9d9a 100644 --- a/src/about_triangle_project.rb +++ b/src/about_triangle_project.rb @@ -1,7 +1,7 @@ require File.expand_path(File.dirname(__FILE__) + '/neo') # You need to write the triangle method in the file 'triangle.rb' -require_relative 'triangle.rb' +require './triangle' class AboutTriangleProject < Neo::Koan def test_equilateral_triangles_have_equal_sides @@ -22,4 +22,3 @@ class AboutTriangleProject < Neo::Koan assert_equal :scalene, triangle(5, 4, 2) end end - From 832e5e4ab5163ab5b16db8923b7ee52595d5e9c1 Mon Sep 17 00:00:00 2001 From: Jim Weirich Date: Tue, 1 Oct 2013 22:54:48 -0400 Subject: [PATCH 54/60] Updated the zip file. --- download/rubykoans.zip | Bin 38674 -> 39686 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/download/rubykoans.zip b/download/rubykoans.zip index 20a9a9af9f29a3513f8b133114901f1843ca1bfb..4a4ef3f7643b7026f35d5a523099bb3ad14c72d2 100644 GIT binary patch delta 4963 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 K)9Gmj{Of;<@FLv+ From 6622cf0d9933fea92f6db856881468df182b2997 Mon Sep 17 00:00:00 2001 From: Jim Weirich Date: Wed, 13 Nov 2013 23:11:26 -0500 Subject: [PATCH 55/60] Fix typo in Rakefile --- Rakefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Rakefile b/Rakefile index ba8bacf..45f5df4 100755 --- a/Rakefile +++ b/Rakefile @@ -125,7 +125,7 @@ end task :run do puts 'koans' - Dir.chdir("${SRC_DIR}") do + Dir.chdir("#{SRC_DIR}") do puts "in #{Dir.pwd}" sh "ruby path_to_enlightenment.rb" end From 174defbd1a202b71b2c56a89e98bd6fa5e28dc22 Mon Sep 17 00:00:00 2001 From: Jim Weirich Date: Wed, 13 Nov 2013 23:13:26 -0500 Subject: [PATCH 56/60] Added clarification note about sending messages. --- download/rubykoans.zip | Bin 39686 -> 39819 bytes src/about_message_passing.rb | 7 +++++++ 2 files changed, 7 insertions(+) diff --git a/download/rubykoans.zip b/download/rubykoans.zip index 4a4ef3f7643b7026f35d5a523099bb3ad14c72d2..f5d286e942fc6fdbcb802133016f08d6bb6068ce 100644 GIT binary patch delta 2790 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 delta 2661 zcmZvec{r4N8^@oSi3pRmm}Yp9u?@#E(llX+vNJfAp|Ta(Mj=YfkuyLH z$C9#>8l*W{M(S`(mga4Djy2`H%>477_j><$uIKZ7@9+J)?&rDg>wfO62k@&c@Z7@) zdZxpD3;Yg5dZt6;`5hvX+X6_I9^Ae+I>_X~1TZ5z1CuIgu{<)U>D18+gP?IREU!k} z^0;kZaS0L-Y{&AJzC#{@pt?Lu>T3hZw9lIg)Zw2$vhe(7@7-oi-3~k8>FHzpZ58?|x}+)mCr1jxIk@wH&_U`}k*cmWbzPul1O(TAA!F(S1rT z+(oIbrMd7?(BwsMea)|)rRfHhnkQYrFQ8PSAFiPF>$A$w<;yA$8nBPpqcwQyo#$HH zHqh+7A`RWUkA@8pJbEPJJJbVg(UobkVw(4pQ`vKOvmGMzQWhwtHT4e%2&b7haAOBo z>_XWZPX-#hW5U6TRBA1GA^EP(%Ch7#|K?OvZ)eaC{LqrTM`iB*G?5+6hzU?mSG8JwT9Es4MlSRSS98E*r6%U_qrWe)&b)>D73&c++USOjS@!t%(jDXB z(Z1*nqQZ1n9{RQ4y7HkX%qLfV`!GJLu$G!K;4q+uj+390sr>PC{lIXEe^a(NgW$1l zae6^V^Urw;sf_WPF1nLG9q;p#10@mr`A3)kxY*pw9*m6$K4iiz?i&!lY&c{#{X6v{ z4FLxC2)d(DeD6G5&;*N0g9rh1Vib1>U{dw2FqFQ3N(iBvRYH)~NfiPMrzPy69z8Q* zI?OO!7@`{Q5fPk|e(t}MKb>W&cO`1 zBHP8G>2^*dCtEN1PJvCr&-Tw21NGxn7e-tXd1bDiL%R~K+7GVJdZ(LT+PO;m6pmm0 zdh>Z}{_~y}?6FOgLzu~p_#!1Fd{M zMio`7+a}>&XfuSrV9%O3@SwKue81It^_{pBE~6U9L=L*KM{cYgZtnl+OH;S}QmCO( zdX}$-lG%6s-Q!mJ4=&CpdtNk}Qt8n~=*OeZU^Gvbw39Yoq4BJa;3d+_Uej(MlPWPFn6APAiboS4+07z2~~&TVAQasd8Iv zc@Vsj`09h%vl+4|r9kO$XS)sYaBxH2MNI}u|E;49_2}n}`1(7uHH$055W@HHXnF|51!G$tt2iRRG9z#C6~RS{Y2 zcWnYM!b{<|C!XzTb9GqB+in~`WQmFt?p;-V9kTS&OEnzk=6F?8ezQ7LFYF${*J)3J zPwe_}LoV6pgwgSqDA%upzEsfwZt$1kJNQ{2Mu{uym%*bR}_om;$B)~myO6D_1|n5 z0q(g*&(6jR>&T%$m7M1Zdw$4X58F{wfRvc`@L1*0c2D-vc>i|iyBW9HF&peZjfhk} z7)RhR_k#V*jl}N& z)-~Q~0b3f{+6<3`Ezz#Nf-Uh&XP{|go-ZEn)8~kkF7bBnAK?BW$0{xiMqo^L^4^(# zkLxylz5C4jMQ!;U%jr1;AtG9G#2&)_dCmII$4| zt9cwoS^y`~`h?c~^diy!Sv!Up2A~M217#)(#s&l?1yQX80k)C~CbgbNM=Q8;C=noC0bqz8dp zdWwR~Ap_)Y#jRZig0{9As4}I^00OTJFo2tb1w`Y2#&nG#U~jw+NavAYmVlh+k4Q9w zK#`gHc1`>K`78VHGYg%pG`6$0H Date: Thu, 19 Dec 2013 15:17:00 -0500 Subject: [PATCH 57/60] Fix 'accidental' solving of first 3 koans --- download/rubykoans.zip | Bin 39819 -> 39817 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/download/rubykoans.zip b/download/rubykoans.zip index f5d286e942fc6fdbcb802133016f08d6bb6068ce..73aff89792b023021f15fc1144c62b0378bed8df 100644 GIT binary patch delta 2731 zcmZvdX;4#F6vuA}izpO`pukI_VT(Y5VUw+hh+3ARfFQPFAqchXVF@mXpeUjS5V?S5 zu_DEBP%PNMs342zV1jj8N5P5}v9e9Up;`eIi+#Lj-pj*&$cOj4_kYg+o^$Vs|TWgqvNH?Ru%O2{gbQD2vRjz_bcd7O-!CQ6K+o5vjosor%;X=x>W2b zdMwb&ot!fe-97uF%weqgD;@Wy&c;Z?MisZkP5!sLqUCU`c5dd!VV>W8;dvv0FgSB) z#+yHIDNq05xvBW+uv=%D61C9Dt#8xbtvW92P)Cdc`d(^xydH|b51Y2S1U??Cd!B6_ z^~2izdmToMS0rDXX4*7JYEnxW>>h#4%a>{X%(OlAYU?ahwp^{TQ)g40+$H43lHF~l zk>1SOT*e~q<*Y-pq56Ek1pdL1ZB7>&uE||?7MAlKI8Xb;$jrOt($2JaIIVr?V$eud zz18%T*3{VPCrw@LQLD#ds)}2xgN50?eFfDQny(KVyIrh)Fk}1ro>fNK?kYy&8{RWB z!R%qDYQODOoSSjEqA%U-jb~Nvc4*Pf#x_ko&1mkD^@tOqT^;)>Z^|`uZ11=a{2|K7rc-X0S6zMj(_$3>tTh2J z089`sicCs_FP0e)_eOJhy$W`3t{T}9@TJiyItC>y9s%1~&v97Gu_53iP7*HnHFF~1 zQL}S66mV?`7{e9eu-|eu0d=kXa2U=bcEU2=G?x4XpS;O8`09A_9)W;R(`?t^YFB&G zk;r}ke@21ML`dmT=MOkM?!JbQ-*(@RKbbE)90-`>(Wr)Hcic!GJ!WGKo?Y9AgzJ22 zaQU$BDnhRB$H6T*`;$B4{TuO}>;TeIXh1m*Uj@1la=V}c+-KJoX9ChfHE~PYVPuOo zg>Aqs6@*(6JKMvf@$BZ2@cfgy)vx5vPxkbJ8sD0baOSi3=T_Z_pDmF=c4JBjx*2z8&S8R^UbX-dRBC7fjAO z1p>-WRv|)@L6<_7f^z03?b4g$TKnk$gntIm_hyLBc>vG>3u+J6838CWTA{866avg( ze<4E8WC2*oGE!PvKOd{4ImagieZ7Mk0F9&^tCR!qx4b%XhbUbf5hY4W6GtYA(`-_A zYzZMVte6k;&rnl^1P$|KF#sG&7&q8>!jj@<_5?!bZ~9sNdd!!pJgRQ_8MHkPYV&_$%FjTWNG+3C6ppnxRVQB;!z6R|C^?8`4%nMjBB1J<w%?SW4$|2REph90!Qfx1qX*#hFb-Whs w8Jn_KALdk03*A$Juttw4$|O#WjZFG3;oAizg6v8*?HlM`>8<{kWPW1(2M`ISod5s; delta 2911 zcmZvddt8%c6vvjV@h<<^Ki~J9-#Olw zCMQx{I{?5eaIibJ#?sHcbYJ4?*w}5IF=ku}AsEN?GA|>nE06n)1%_*EJg{N$7u#Tw zO%-O=wjr2pirdqbX!|?|!xMa>sE0TCH#wGXz8@L0H9oQmtS{{B8@ZSLw=jC2+r+0i?!yC-=Wo?l z?UF@mf6C@v4K2uiSUjkEtGd})bGrYDO(&vCKOSv8B79>{>5}yPxbnjuyZYu^?by+5 z@~{;M{=5=r8ByxH^H#UggIB&`f%nTV@<)5hR$NKwy>Ny9!rSV@lZ|20s)j9@cG<$x zwidqhfoS~Op*EQ~FJ!RO@n~6LRA5xW)*elV;%keIBc*MjcWiXpVs+G!Y|+?z{ona| zsh{ILcQPS*Fm+XV_b$PUHahW#2bJX&LC>#0KK^Bvw7>uSlflD3*gc4F`KwXNzwt?P z?7g~hug^NW9ewgI*`A3yvFCzW^OLFXMh~nXJ``zw?7H)(PYtz$uQH!rHSp_iMH9*8 zo{q2f6qw5^*6dK;c;q+G-lQmQ$++8|G^^>=f}ttJ9Nsetf?G$ROSOw;W3i?DP43~0 z6+=2{UGdJqpL#!8u`YAs_GZiSFE!Tm*Qw|3)D|7GcHpa8CKcy4N-76c+3DdS*P4b0 zcpvC)a}*1q3kOQvspGJ3Ppcku2ytvPP@Ii6mOBu9EO60?VR88TX4(g&b;W zw+t?i2{xCaeL%mi-7y`eIC{`>L+P2zTS;__cms@%ZzUTyoZ!u9@)KQ2N}($amRT!1 zh@~)zsj_QrQUihG$q|fuK#GRs*|#p7fm7>dlawq{4J}%hx{Rb$k>-o9g?``9rlphU z?vh{zrb)&LOi33pa8LSnqWNc*0s3WYiDsY7kFlJPo&N8zC_)%Gq7V}pusw`{^6mKq zj^qY0&_iiYV2p|cLhXRLDj)pDudBSVp`Kkk&o=tn}h~gh5 z&Bx@Lxs(G4BY1W@RP z!kd*s9D%N)IfF2)%F&?ViVnGW?nk4%LJEL1D}Xl79^HHZ(6I$=FCTRPu;0O%YYHeP z*=W5>XG)&)0CGvT20*}aDRKn*<&`TJOSUM~s?E|IiBg%NT$HCmSn}^^G|IxU#IH;E8G`~iH;-=3w2lUp+yRwzWtNzDLQz)J2M ztf_G`#KG1TqMz?x-~!OkGcMd8{#IjL_<1mK<~Fhpv;lx-X^UZ!*4;=u|59I>6!k9; z^~Z%}T?jk0-Ue%YR3^1FClU&vCxy-mGb(A2=6J&b=rqGx|DS&b(iDgXkdAj?Jwc?t zo1-yBz2@i%rchu$EAUVPdnn{tIsY37+!uK*&GCc#YK`L#*3y)15`dzl$MnUoj;3xW z18s^YD<}NWS!w(3kD;gYRe#7S~YO189hySRw4;)dQXeYpf!yr>UpX0hFZU7i2abuT}lelggdw^_HRuXRp=0 zEcOd3^JQBUIm}uyGB~3KY5V+UGy%b;`ajc|Yjp~a*EMsk1YXzKf104H-@^z9&0#~a9zOKYI1U=@H#su|T!e>~Gb z3!!SdPJBcb?U1OXFXZCW!6X%|A2x5R?Yv9q`k00Rz+=@oOFb%XFg8+QNz From ad08a8de35084430178c295197ede668bb9d3c01 Mon Sep 17 00:00:00 2001 From: Jim Weirich Date: Mon, 13 Jan 2014 15:07:30 -0500 Subject: [PATCH 58/60] Handle version 2.1 --- src/about_iteration.rb | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/about_iteration.rb b/src/about_iteration.rb index c14e5fb..2a595dd 100644 --- a/src/about_iteration.rb +++ b/src/about_iteration.rb @@ -3,10 +3,10 @@ require File.expand_path(File.dirname(__FILE__) + '/neo') class AboutIteration < Neo::Koan # -- An Aside ------------------------------------------------------ - # Ruby 1.8 stores names as strings. Ruby 1.9 stores names as - # symbols. So we use a version dependent method "as_name" to convert - # to the right format in the koans. We will use "as_name" whenever - # comparing to lists of methods. + # Ruby 1.8 stores names as strings. Ruby 1.9 and later stores names + # as symbols. So we use a version dependent method "as_name" to + # convert to the right format in the koans. We will use "as_name" + # whenever comparing to lists of methods. in_ruby_version("1.8") do def as_name(name) @@ -14,7 +14,7 @@ class AboutIteration < Neo::Koan end end - in_ruby_version("1.9", "2.0") do + in_ruby_version("1.9", "2") do def as_name(name) name.to_sym end From 0fb9b21a4e745bd1e6e467d80f5ba05f7d42988c Mon Sep 17 00:00:00 2001 From: Jim Weirich Date: Mon, 13 Jan 2014 15:16:46 -0500 Subject: [PATCH 59/60] Fix require to include ./ --- src/about_triangle_project_2.rb | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/about_triangle_project_2.rb b/src/about_triangle_project_2.rb index 55dd742..fdeb8db 100644 --- a/src/about_triangle_project_2.rb +++ b/src/about_triangle_project_2.rb @@ -1,7 +1,7 @@ require File.expand_path(File.dirname(__FILE__) + '/neo') # You need to write the triangle method in the file 'triangle.rb' -require 'triangle.rb' +require './triangle.rb' class AboutTriangleProject2 < Neo::Koan # The first assignment did not talk about how to handle errors. @@ -14,4 +14,3 @@ class AboutTriangleProject2 < Neo::Koan # HINT: for tips, see http://stackoverflow.com/questions/3834203/ruby-koan-151-raising-exceptions end end - From 8068f1f106c8f535bded1b7b6b01047f76a6bf43 Mon Sep 17 00:00:00 2001 From: Jim Weirich Date: Mon, 13 Jan 2014 15:16:57 -0500 Subject: [PATCH 60/60] Latest zip file --- download/rubykoans.zip | Bin 39817 -> 40269 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/download/rubykoans.zip b/download/rubykoans.zip index 73aff89792b023021f15fc1144c62b0378bed8df..60b497b0fd2978f379f5e3400ed2b7ef97dfeccd 100644 GIT binary patch delta 4136 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 F{{x#AeDMGP delta 3610 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 QXmWnfbAtSNVdby?0KUS40{{R3