From 8f9c3573a0512f467442e0b7a233dafe91e4302b Mon Sep 17 00:00:00 2001 From: kotp Date: Fri, 2 Jun 2017 02:57:07 -0400 Subject: [PATCH 01/16] Test no longer supplies the `date` dependency for solution --- exercises/meetup/.meta/solutions/meetup.rb | 1 + exercises/meetup/meetup_test.rb | 1 - 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/exercises/meetup/.meta/solutions/meetup.rb b/exercises/meetup/.meta/solutions/meetup.rb index 0b66c0cd03..370df880a1 100644 --- a/exercises/meetup/.meta/solutions/meetup.rb +++ b/exercises/meetup/.meta/solutions/meetup.rb @@ -1,3 +1,4 @@ +require 'date' class Meetup def self.days_of_week [:sunday, :monday, :tuesday, :wednesday, :thursday, :friday, :saturday] diff --git a/exercises/meetup/meetup_test.rb b/exercises/meetup/meetup_test.rb index 3a8c97822f..d69d5d0d2a 100755 --- a/exercises/meetup/meetup_test.rb +++ b/exercises/meetup/meetup_test.rb @@ -1,6 +1,5 @@ #!/usr/bin/env ruby require 'minitest/autorun' -require 'date' require_relative 'meetup' # Define a class Meetup with a constructor taking a month and a year From 3568975daea954194cd8d44c37b276162ea34f74 Mon Sep 17 00:00:00 2001 From: ajwann Date: Thu, 25 May 2017 19:31:34 -0400 Subject: [PATCH 02/16] sum-of-multiples: added generator --- exercises/sum-of-multiples/.meta/.version | 1 + .../.meta/generator/sum_of_multiples_case.rb | 11 ++++ .../.meta/solutions/sum_of_multiples.rb | 4 ++ .../sum-of-multiples/sum_of_multiples_test.rb | 63 +++++++++++++++---- 4 files changed, 67 insertions(+), 12 deletions(-) create mode 100644 exercises/sum-of-multiples/.meta/.version create mode 100644 exercises/sum-of-multiples/.meta/generator/sum_of_multiples_case.rb diff --git a/exercises/sum-of-multiples/.meta/.version b/exercises/sum-of-multiples/.meta/.version new file mode 100644 index 0000000000..d00491fd7e --- /dev/null +++ b/exercises/sum-of-multiples/.meta/.version @@ -0,0 +1 @@ +1 diff --git a/exercises/sum-of-multiples/.meta/generator/sum_of_multiples_case.rb b/exercises/sum-of-multiples/.meta/generator/sum_of_multiples_case.rb new file mode 100644 index 0000000000..23ff8a838d --- /dev/null +++ b/exercises/sum-of-multiples/.meta/generator/sum_of_multiples_case.rb @@ -0,0 +1,11 @@ +require 'generator/exercise_case' + +class SumOfMultiplesCase < Generator::ExerciseCase + using Generator::Underscore + + def workload + assert_expected = "assert_equal #{expected.underscore}" + value = "SumOfMultiples.new(#{factors.join(', ')}).to(#{limit})" + indent_lines(["#{assert_expected}, #{value}"], 4) + end +end diff --git a/exercises/sum-of-multiples/.meta/solutions/sum_of_multiples.rb b/exercises/sum-of-multiples/.meta/solutions/sum_of_multiples.rb index 597c0a4062..80199ab2b7 100644 --- a/exercises/sum-of-multiples/.meta/solutions/sum_of_multiples.rb +++ b/exercises/sum-of-multiples/.meta/solutions/sum_of_multiples.rb @@ -1,3 +1,7 @@ +module BookKeeping + VERSION = 1 +end + class SumOfMultiples attr_reader :multiples def initialize(*multiples) diff --git a/exercises/sum-of-multiples/sum_of_multiples_test.rb b/exercises/sum-of-multiples/sum_of_multiples_test.rb index 7741e514f1..6de1425b1e 100755 --- a/exercises/sum-of-multiples/sum_of_multiples_test.rb +++ b/exercises/sum-of-multiples/sum_of_multiples_test.rb @@ -2,48 +2,87 @@ require 'minitest/autorun' require_relative 'sum_of_multiples' -class SumTest < Minitest::Test - def test_sum_to_1 +# Common test data version: 1.0.0 72b1496 +class SumOfMultiplesTest < Minitest::Test + def test_multiples_of_3_or_5_up_to_1 + # skip assert_equal 0, SumOfMultiples.new(3, 5).to(1) end - def test_sum_to_3 + def test_multiples_of_3_or_5_up_to_4 skip assert_equal 3, SumOfMultiples.new(3, 5).to(4) end - def test_sum_to_10 + def test_multiples_of_3_or_5_up_to_10 skip assert_equal 23, SumOfMultiples.new(3, 5).to(10) end - def test_sum_to_100 + def test_multiples_of_3_or_5_up_to_100 skip assert_equal 2_318, SumOfMultiples.new(3, 5).to(100) end - def test_sum_to_1000 + def test_multiples_of_3_or_5_up_to_1000 skip assert_equal 233_168, SumOfMultiples.new(3, 5).to(1000) end - def test_configurable_7_13_17_to_20 + def test_multiples_of_7_13_or_17_up_to_20 skip assert_equal 51, SumOfMultiples.new(7, 13, 17).to(20) end - def test_configurable_4_6_to_15 + def test_multiples_of_4_or_6_up_to_15 skip assert_equal 30, SumOfMultiples.new(4, 6).to(15) end - def test_configurable_5_6_8_to_150 + def test_multiples_of_5_6_or_8_up_to_150 skip - assert_equal 4419, SumOfMultiples.new(5, 6, 8).to(150) + assert_equal 4_419, SumOfMultiples.new(5, 6, 8).to(150) end - def test_configurable_43_47_to_10000 + def test_multiples_of_5_or_25_up_to_51 skip - assert_equal 2_203_160, SumOfMultiples.new(43, 47).to(10_000) + assert_equal 275, SumOfMultiples.new(5, 25).to(51) + end + + def test_multiples_of_43_or_47_up_to_10000 + skip + assert_equal 2_203_160, SumOfMultiples.new(43, 47).to(10000) + end + + def test_multiples_of_1_up_to_100 + skip + assert_equal 4_950, SumOfMultiples.new(1).to(100) + end + + def test_multiples_of_an_empty_list_up_to_10000 + skip + assert_equal 0, SumOfMultiples.new().to(10000) + end + + # Problems in exercism evolve over time, as we find better ways to ask + # questions. + # The version number refers to the version of the problem you solved, + # not your solution. + # + # Define a constant named VERSION inside of the top level BookKeeping + # module, which may be placed near the end of your file. + # + # In your file, it will look like this: + # + # module BookKeeping + # VERSION = 1 # Where the version number matches the one in the test. + # end + # + # If you are curious, read more about constants on RubyDoc: + # http://ruby-doc.org/docs/ruby-doc-bundle/UsersGuide/rg/constants.html + + def test_bookkeeping + skip + assert_equal 1, BookKeeping::VERSION end end From 63ee9f5fc26250166cb52008490e749824858870 Mon Sep 17 00:00:00 2001 From: Alexander Delgado Date: Tue, 6 Jun 2017 23:13:18 -0700 Subject: [PATCH 03/16] Isogram Exercise improvements: change method name/add failure messages (#664) * Isogram Exercise improvements: change method name and add failure messages --- exercises/isogram/.meta/.version | 2 +- .../isogram/.meta/generator/isogram_case.rb | 16 ++++++++++++++- exercises/isogram/isogram_test.rb | 20 +++++++++---------- 3 files changed, 26 insertions(+), 12 deletions(-) diff --git a/exercises/isogram/.meta/.version b/exercises/isogram/.meta/.version index e440e5c842..b8626c4cff 100644 --- a/exercises/isogram/.meta/.version +++ b/exercises/isogram/.meta/.version @@ -1 +1 @@ -3 \ No newline at end of file +4 diff --git a/exercises/isogram/.meta/generator/isogram_case.rb b/exercises/isogram/.meta/generator/isogram_case.rb index 078852ae37..a121d977c1 100644 --- a/exercises/isogram/.meta/generator/isogram_case.rb +++ b/exercises/isogram/.meta/generator/isogram_case.rb @@ -6,9 +6,23 @@ def workload indent_lines( [ "string = #{input.inspect}", - "#{assert} Isogram.is_isogram?(string)" + "#{assert} Isogram.isogram?(string), #{failure_message}" ], 4 ) end + private + + def failure_message + %Q("Expected #{expected}, #{reason}") + end + + def reason + "'#{input}' #{is_or_not} an isogram" + end + + def is_or_not + expected ? 'is' : 'is not' + end + end diff --git a/exercises/isogram/isogram_test.rb b/exercises/isogram/isogram_test.rb index 66f3f270b2..5170678380 100755 --- a/exercises/isogram/isogram_test.rb +++ b/exercises/isogram/isogram_test.rb @@ -7,55 +7,55 @@ class IsogramTest < Minitest::Test def test_empty_string # skip string = "" - assert Isogram.is_isogram?(string) + assert Isogram.isogram?(string), "Expected true, '' is an isogram" end def test_isogram_with_only_lower_case_characters skip string = "isogram" - assert Isogram.is_isogram?(string) + assert Isogram.isogram?(string), "Expected true, 'isogram' is an isogram" end def test_word_with_one_duplicated_character skip string = "eleven" - refute Isogram.is_isogram?(string) + refute Isogram.isogram?(string), "Expected false, 'eleven' is not an isogram" end def test_longest_reported_english_isogram skip string = "subdermatoglyphic" - assert Isogram.is_isogram?(string) + assert Isogram.isogram?(string), "Expected true, 'subdermatoglyphic' is an isogram" end def test_word_with_duplicated_character_in_mixed_case skip string = "Alphabet" - refute Isogram.is_isogram?(string) + refute Isogram.isogram?(string), "Expected false, 'Alphabet' is not an isogram" end def test_hypothetical_isogrammic_word_with_hyphen skip string = "thumbscrew-japingly" - assert Isogram.is_isogram?(string) + assert Isogram.isogram?(string), "Expected true, 'thumbscrew-japingly' is an isogram" end def test_isogram_with_duplicated_non_letter_character skip string = "Hjelmqvist-Gryb-Zock-Pfund-Wax" - assert Isogram.is_isogram?(string) + assert Isogram.isogram?(string), "Expected true, 'Hjelmqvist-Gryb-Zock-Pfund-Wax' is an isogram" end def test_made_up_name_that_is_an_isogram skip string = "Emily Jung Schwartzkopf" - assert Isogram.is_isogram?(string) + assert Isogram.isogram?(string), "Expected true, 'Emily Jung Schwartzkopf' is an isogram" end def test_duplicated_character_in_the_middle skip string = "accentor" - refute Isogram.is_isogram?(string) + refute Isogram.isogram?(string), "Expected false, 'accentor' is not an isogram" end # Problems in exercism evolve over time, as we find better ways to ask @@ -77,6 +77,6 @@ def test_duplicated_character_in_the_middle def test_bookkeeping skip - assert_equal 3, BookKeeping::VERSION + assert_equal 4, BookKeeping::VERSION end end From 45673809d57d964a102ce05d45fd992104e54689 Mon Sep 17 00:00:00 2001 From: Geoff Hubbard Date: Fri, 9 Jun 2017 00:02:18 +0200 Subject: [PATCH 04/16] isogram: update solution to pass current tests. (#669) --- exercises/isogram/.meta/solutions/isogram.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/exercises/isogram/.meta/solutions/isogram.rb b/exercises/isogram/.meta/solutions/isogram.rb index 857864361a..4530285c5e 100644 --- a/exercises/isogram/.meta/solutions/isogram.rb +++ b/exercises/isogram/.meta/solutions/isogram.rb @@ -1,9 +1,9 @@ module BookKeeping - VERSION = 3 + VERSION = 4 end class Isogram - def self.is_isogram?(str) + def self.isogram?(str) letters = str.downcase.gsub(/[[:punct:]]| /, '').chars letters == letters.uniq end From 81184b190346dc7e930462b2913bac94e60796ec Mon Sep 17 00:00:00 2001 From: ajwann Date: Tue, 23 May 2017 19:17:49 -0400 Subject: [PATCH 05/16] bob: added generator --- exercises/bob/.meta/.version | 1 + exercises/bob/.meta/generator/bob_case.rb | 9 ++ exercises/bob/.meta/solutions/bob.rb | 4 + exercises/bob/bob_test.rb | 145 ++++++++++++++-------- 4 files changed, 109 insertions(+), 50 deletions(-) create mode 100644 exercises/bob/.meta/.version create mode 100644 exercises/bob/.meta/generator/bob_case.rb diff --git a/exercises/bob/.meta/.version b/exercises/bob/.meta/.version new file mode 100644 index 0000000000..d00491fd7e --- /dev/null +++ b/exercises/bob/.meta/.version @@ -0,0 +1 @@ +1 diff --git a/exercises/bob/.meta/generator/bob_case.rb b/exercises/bob/.meta/generator/bob_case.rb new file mode 100644 index 0000000000..1a67b5494e --- /dev/null +++ b/exercises/bob/.meta/generator/bob_case.rb @@ -0,0 +1,9 @@ +require 'generator/exercise_case' + +class BobCase < Generator::ExerciseCase + def workload + indent_lines(["remark = #{input.inspect}", + "assert_equal '#{expected}', Bob.hey(remark), %q{Bob hears #{input.inspect}, and..}" + ], 4) + end +end diff --git a/exercises/bob/.meta/solutions/bob.rb b/exercises/bob/.meta/solutions/bob.rb index fde2d874c0..b92e835eeb 100644 --- a/exercises/bob/.meta/solutions/bob.rb +++ b/exercises/bob/.meta/solutions/bob.rb @@ -1,3 +1,7 @@ +module BookKeeping + VERSION = 1 +end + module Bob def hey(drivel) answer Phrase.new(drivel) diff --git a/exercises/bob/bob_test.rb b/exercises/bob/bob_test.rb index be4e7ee040..4b60ba5d28 100755 --- a/exercises/bob/bob_test.rb +++ b/exercises/bob/bob_test.rb @@ -2,133 +2,178 @@ require 'minitest/autorun' require_relative 'bob' +# Common test data version: 1.0.0 65756b1 class BobTest < Minitest::Test - def bob - Bob - end - - def feedback(text) - "Bob hears #{text.inspect}, and.." - end def test_stating_something - remark = 'Tom-ay-to, tom-aaaah-to.' - assert_equal 'Whatever.', bob.hey(remark), feedback(remark) + # skip + remark = "Tom-ay-to, tom-aaaah-to." + assert_equal 'Whatever.', Bob.hey(remark), %q{Bob hears "Tom-ay-to, tom-aaaah-to.", and..} end def test_shouting skip - remark = 'WATCH OUT!' - assert_equal 'Whoa, chill out!', bob.hey(remark), feedback(remark) + remark = "WATCH OUT!" + assert_equal 'Whoa, chill out!', Bob.hey(remark), %q{Bob hears "WATCH OUT!", and..} end def test_shouting_gibberish skip - remark = ('A'..'Z').to_a.sample(10).join - assert_equal 'Whoa, chill out!', bob.hey(remark), feedback(remark) + remark = "FCECDFCAAB" + assert_equal 'Whoa, chill out!', Bob.hey(remark), %q{Bob hears "FCECDFCAAB", and..} end def test_asking_a_question skip - remark = 'Does this cryogenic chamber make me look fat?' - assert_equal 'Sure.', bob.hey(remark), feedback(remark) + remark = "Does this cryogenic chamber make me look fat?" + assert_equal 'Sure.', Bob.hey(remark), %q{Bob hears "Does this cryogenic chamber make me look fat?", and..} end def test_asking_a_numeric_question skip - remark = 'You are, what, like 15?' - assert_equal 'Sure.', bob.hey(remark), feedback(remark) + remark = "You are, what, like 15?" + assert_equal 'Sure.', Bob.hey(remark), %q{Bob hears "You are, what, like 15?", and..} end def test_asking_gibberish skip - remark = ('a'..'z').to_a.sample(10).join << '?' - assert_equal 'Sure.', bob.hey(remark), feedback(remark) + remark = "fffbbcbeab?" + assert_equal 'Sure.', Bob.hey(remark), %q{Bob hears "fffbbcbeab?", and..} end def test_talking_forcefully skip remark = "Let's go make out behind the gym!" - assert_equal 'Whatever.', bob.hey(remark), feedback(remark) + assert_equal 'Whatever.', Bob.hey(remark), %q{Bob hears "Let's go make out behind the gym!", and..} end def test_using_acronyms_in_regular_speech skip remark = "It's OK if you don't want to go to the DMV." - assert_equal 'Whatever.', bob.hey(remark), feedback(remark) + assert_equal 'Whatever.', Bob.hey(remark), %q{Bob hears "It's OK if you don't want to go to the DMV.", and..} end - def test_forceful_questions + def test_forceful_question skip - remark = 'WHAT THE HELL WERE YOU THINKING?' - assert_equal 'Whoa, chill out!', bob.hey(remark), feedback(remark) + remark = "WHAT THE HELL WERE YOU THINKING?" + assert_equal 'Whoa, chill out!', Bob.hey(remark), %q{Bob hears "WHAT THE HELL WERE YOU THINKING?", and..} end def test_shouting_numbers skip - remark = '1, 2, 3 GO!' - assert_equal 'Whoa, chill out!', bob.hey(remark), feedback(remark) + remark = "1, 2, 3 GO!" + assert_equal 'Whoa, chill out!', Bob.hey(remark), %q{Bob hears "1, 2, 3 GO!", and..} end def test_only_numbers skip - remark = '1, 2, 3' - assert_equal 'Whatever.', bob.hey(remark), feedback(remark) + remark = "1, 2, 3" + assert_equal 'Whatever.', Bob.hey(remark), %q{Bob hears "1, 2, 3", and..} end def test_question_with_only_numbers skip - remark = '4?' - assert_equal 'Sure.', bob.hey(remark), feedback(remark) + remark = "4?" + assert_equal 'Sure.', Bob.hey(remark), %q{Bob hears "4?", and..} end def test_shouting_with_special_characters skip - remark = 'ZOMG THE %^*@#$(*^ ZOMBIES ARE COMING!!11!!1!' - assert_equal 'Whoa, chill out!', bob.hey(remark), feedback(remark) + remark = "ZOMG THE %^*@\#$(*^ ZOMBIES ARE COMING!!11!!1!" + assert_equal 'Whoa, chill out!', Bob.hey(remark), %q{Bob hears "ZOMG THE %^*@\#$(*^ ZOMBIES ARE COMING!!11!!1!", and..} end def test_shouting_with_no_exclamation_mark skip - remark = 'I HATE YOU' - assert_equal 'Whoa, chill out!', bob.hey(remark), feedback(remark) + remark = "I HATE YOU" + assert_equal 'Whoa, chill out!', Bob.hey(remark), %q{Bob hears "I HATE YOU", and..} end def test_statement_containing_question_mark skip - remark = 'Ending with ? means a question.' - assert_equal 'Whatever.', bob.hey(remark), feedback(remark) + remark = "Ending with ? means a question." + assert_equal 'Whatever.', Bob.hey(remark), %q{Bob hears "Ending with ? means a question.", and..} + end + + def test_non_letters_with_question + skip + remark = ":) ?" + assert_equal 'Sure.', Bob.hey(remark), %q{Bob hears ":) ?", and..} end def test_prattling_on skip - remark = 'Wait! Hang on. Are you going to be OK?' - assert_equal 'Sure.', bob.hey(remark), feedback(remark) + remark = "Wait! Hang on. Are you going to be OK?" + assert_equal 'Sure.', Bob.hey(remark), %q{Bob hears "Wait! Hang on. Are you going to be OK?", and..} end def test_silence skip - remark = '' - assert_equal 'Fine. Be that way!', bob.hey(remark), feedback(remark) + remark = "" + assert_equal 'Fine. Be that way!', Bob.hey(remark), %q{Bob hears "", and..} end def test_prolonged_silence skip - remark = ' ' * rand(1..10) - assert_equal 'Fine. Be that way!', bob.hey(remark), feedback(remark) + remark = " " + assert_equal 'Fine. Be that way!', Bob.hey(remark), %q{Bob hears " ", and..} + end + + def test_alternate_silence + skip + remark = "\t\t\t\t\t\t\t\t\t\t" + assert_equal 'Fine. Be that way!', Bob.hey(remark), %q{Bob hears "\t\t\t\t\t\t\t\t\t\t", and..} + end + + def test_multiple_line_question + skip + remark = "\nDoes this cryogenic chamber make me look fat?\nno" + assert_equal 'Whatever.', Bob.hey(remark), %q{Bob hears "\nDoes this cryogenic chamber make me look fat?\nno", and..} + end + + def test_starting_with_whitespace + skip + remark = " hmmmmmmm..." + assert_equal 'Whatever.', Bob.hey(remark), %q{Bob hears " hmmmmmmm...", and..} end - def test_alternate_silences + def test_ending_with_whitespace skip - remark = "\t" * rand(1..10) - assert_equal 'Fine. Be that way!', bob.hey(remark), feedback(remark) + remark = "Okay if like my spacebar quite a bit? " + assert_equal 'Sure.', Bob.hey(remark), %q{Bob hears "Okay if like my spacebar quite a bit? ", and..} end - def test_on_multiple_line_questions + def test_other_whitespace + skip + remark = "\n\r \t" + assert_equal 'Fine. Be that way!', Bob.hey(remark), %q{Bob hears "\n\r \t", and..} + end + + def test_non_question_ending_with_whitespace + skip + remark = "This is a statement ending with whitespace " + assert_equal 'Whatever.', Bob.hey(remark), %q{Bob hears "This is a statement ending with whitespace ", and..} + end + + # Problems in exercism evolve over time, as we find better ways to ask + # questions. + # The version number refers to the version of the problem you solved, + # not your solution. + # + # Define a constant named VERSION inside of the top level BookKeeping + # module, which may be placed near the end of your file. + # + # In your file, it will look like this: + # + # module BookKeeping + # VERSION = 1 # Where the version number matches the one in the test. + # end + # + # If you are curious, read more about constants on RubyDoc: + # http://ruby-doc.org/docs/ruby-doc-bundle/UsersGuide/rg/constants.html + + def test_bookkeeping skip - remark = %( -Does this cryogenic chamber make me look fat? -no) - assert_equal 'Whatever.', bob.hey(remark), feedback(remark) + assert_equal 1, BookKeeping::VERSION end end From 130f64232f91346842a81b78a5196615c85357f5 Mon Sep 17 00:00:00 2001 From: Katrina Owen Date: Fri, 9 Jun 2017 11:13:16 -0600 Subject: [PATCH 06/16] Rename the global exercise hints file We've had some difficulty coming up with a good name for the file that gets included in all of the exercise READMEs for a given track. These are global hints, like how to run the test suite, which are relevant to all the exercises on a track. We started with SETUP.md in the root of the repository, then renamed that to exercises/TRACK_HINTS.md because SETUP.md was misleading and confusing, but then we realized that TRACK_HINTS.md was a bit ambiguous and confusing as well. Finally we settled on putting the file in the docs directory, since this is user-facing documentation, and calling the file EXERCISE_README_INSERT.md See https://github.com/exercism/meta/issues/5 for context. --- exercises/TRACK_HINTS.md => docs/EXERCISE_README_INSERT.md | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename exercises/TRACK_HINTS.md => docs/EXERCISE_README_INSERT.md (100%) diff --git a/exercises/TRACK_HINTS.md b/docs/EXERCISE_README_INSERT.md similarity index 100% rename from exercises/TRACK_HINTS.md rename to docs/EXERCISE_README_INSERT.md From f75df42c1b3876ceb09f97b27a42b3ca8f23452a Mon Sep 17 00:00:00 2001 From: Katrina Owen Date: Sat, 10 Jun 2017 10:10:58 -0600 Subject: [PATCH 07/16] Delete ignored key from config.json Since the exercise implementations are all in the exercises directory we no longer need to ignore any non-exercise directories in the root of the track. --- config.json | 90 +++++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 84 insertions(+), 6 deletions(-) diff --git a/config.json b/config.json index 7dc4a1ab06..4f270d6b5a 100644 --- a/config.json +++ b/config.json @@ -10,504 +10,588 @@ "slug": "hello-world", "difficulty": 1, "topics": [ + ] }, { "slug": "hamming", "difficulty": 1, "topics": [ + ] }, { "slug": "gigasecond", "difficulty": 1, "topics": [ + ] }, { "slug": "rna-transcription", "difficulty": 1, "topics": [ + ] }, { "slug": "raindrops", "difficulty": 1, "topics": [ + ] }, { "slug": "difference-of-squares", "difficulty": 1, "topics": [ + ] }, { "slug": "pangram", "difficulty": 1, "topics": [ + ] }, { "slug": "sieve", "difficulty": 1, "topics": [ + ] }, { "slug": "roman-numerals", "difficulty": 1, "topics": [ + ] }, { "slug": "nth-prime", "difficulty": 1, "topics": [ + ] }, { "slug": "leap", "difficulty": 1, "topics": [ + ] }, { "slug": "grains", "difficulty": 1, "topics": [ + ] }, { "slug": "word-count", "difficulty": 1, "topics": [ + ] }, { "slug": "bob", "difficulty": 1, "topics": [ + ] }, { "slug": "run-length-encoding", "difficulty": 1, "topics": [ + ] }, { "slug": "binary", "difficulty": 1, "topics": [ + ] }, { "slug": "accumulate", "difficulty": 1, "topics": [ + ] }, { "slug": "sum-of-multiples", "difficulty": 1, "topics": [ + ] }, { "slug": "grade-school", "difficulty": 1, "topics": [ + ] }, { "slug": "series", "difficulty": 1, "topics": [ + ] }, { "slug": "phone-number", "difficulty": 1, "topics": [ + ] }, { "slug": "prime-factors", "difficulty": 1, "topics": [ + ] }, { "slug": "strain", "difficulty": 1, "topics": [ + ] }, { "slug": "etl", "difficulty": 1, "topics": [ + ] }, { "slug": "trinary", "difficulty": 1, "topics": [ + ] }, { "slug": "beer-song", "difficulty": 1, "topics": [ + ] }, { "slug": "bowling", "difficulty": 1, "topics": [ + ] }, { "slug": "space-age", "difficulty": 1, "topics": [ + ] }, { "slug": "anagram", "difficulty": 1, "topics": [ + ] }, { "slug": "binary-search-tree", "difficulty": 1, "topics": [ + ] }, { "slug": "crypto-square", "difficulty": 1, "topics": [ + ] }, { "slug": "clock", "difficulty": 1, "topics": [ + ] }, { "slug": "alphametics", "difficulty": 1, "topics": [ + ] }, { "slug": "rail-fence-cipher", "difficulty": 1, "topics": [ + ] }, { "slug": "acronym", "difficulty": 1, "topics": [ + ] }, { "slug": "scrabble-score", "difficulty": 1, "topics": [ + ] }, { "slug": "nucleotide-count", "difficulty": 1, "topics": [ + ] }, { "slug": "flatten-array", "difficulty": 1, "topics": [ + ] }, { "slug": "hexadecimal", "difficulty": 1, "topics": [ + ] }, { "slug": "say", "difficulty": 1, "topics": [ + ] }, { "slug": "meetup", "difficulty": 1, "topics": [ + ] }, { "slug": "robot-name", "difficulty": 6, "topics": [ + ] }, { "slug": "queen-attack", "difficulty": 1, "topics": [ + ] }, { "slug": "palindrome-products", "difficulty": 1, "topics": [ + ] }, { "slug": "bracket-push", "difficulty": 1, "topics": [ + ] }, { "slug": "food-chain", "difficulty": 1, "topics": [ + ] }, { "slug": "matrix", "difficulty": 1, "topics": [ + ] }, { "slug": "saddle-points", "difficulty": 1, "topics": [ + ] }, { "slug": "triangle", "difficulty": 1, "topics": [ + ] }, { "slug": "atbash-cipher", "difficulty": 1, "topics": [ + ] }, { "slug": "house", "difficulty": 1, "topics": [ + ] }, { "slug": "secret-handshake", "difficulty": 1, "topics": [ + ] }, { "slug": "proverb", "difficulty": 1, "topics": [ + ] }, { "slug": "ocr-numbers", "difficulty": 1, "topics": [ + ] }, { "slug": "pig-latin", "difficulty": 1, "topics": [ + ] }, { "slug": "simple-linked-list", "difficulty": 1, "topics": [ + ] }, { "slug": "luhn", "difficulty": 1, "topics": [ + ] }, { "slug": "simple-cipher", "difficulty": 1, "topics": [ + ] }, { "slug": "wordy", "difficulty": 1, "topics": [ + ] }, { "slug": "allergies", "difficulty": 1, "topics": [ + ] }, { "slug": "poker", "difficulty": 1, "topics": [ + ] }, { "slug": "kindergarten-garden", "difficulty": 1, "topics": [ + ] }, { "slug": "linked-list", "difficulty": 1, "topics": [ + ] }, { "slug": "pythagorean-triplet", "difficulty": 1, "topics": [ + ] }, { "slug": "robot-simulator", "difficulty": 1, "topics": [ + ] }, { "slug": "twelve-days", "difficulty": 1, "topics": [ + ] }, { "slug": "circular-buffer", "difficulty": 1, "topics": [ + ] }, { "slug": "largest-series-product", "difficulty": 1, "topics": [ + ] }, { "slug": "binary-search", "difficulty": 1, "topics": [ + ] }, { "slug": "two-bucket", "difficulty": 1, "topics": [ + ] }, { "slug": "pascals-triangle", "difficulty": 1, "topics": [ + ] }, { "slug": "custom-set", "difficulty": 1, "topics": [ + ] }, { "slug": "minesweeper", "difficulty": 1, "topics": [ + ] }, { "slug": "scale-generator", "difficulty": 1, "topics": [ + ] }, { "slug": "protein-translation", "difficulty": 1, "topics": [ + ] }, { "slug": "perfect-numbers", "difficulty": 1, "topics": [ + ] }, { "slug": "connect", "difficulty": 1, "topics": [ + ] }, { "slug": "list-ops", "difficulty": 1, "topics": [ + ] }, { "slug": "diamond", "difficulty": 1, "topics": [ + ] }, { "slug": "all-your-base", "difficulty": 1, "topics": [ + ] }, { "slug": "isogram", "difficulty": 1, "topics": [ + ] }, { "slug": "transpose", "difficulty": 1, "topics": [ + ] }, { "slug": "tournament", "difficulty": 1, "topics": [ + ] }, { "slug": "dominoes", "difficulty": 1, "topics": [ + ] } ], @@ -515,12 +599,6 @@ "octal", "point-mutations" ], - "ignored": [ - "docs", - "img", - "lib", - "test" - ], "foregone": [ ] From 1f33b26d470cb54b3036626484ad77a88de873d4 Mon Sep 17 00:00:00 2001 From: Katrina Owen Date: Sat, 10 Jun 2017 11:49:32 -0600 Subject: [PATCH 08/16] Normalize format of config file This will let us script changes to it with less noise in the diffs. --- config.json | 84 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 84 insertions(+) diff --git a/config.json b/config.json index 7dc4a1ab06..cddd3ef2fc 100644 --- a/config.json +++ b/config.json @@ -10,504 +10,588 @@ "slug": "hello-world", "difficulty": 1, "topics": [ + ] }, { "slug": "hamming", "difficulty": 1, "topics": [ + ] }, { "slug": "gigasecond", "difficulty": 1, "topics": [ + ] }, { "slug": "rna-transcription", "difficulty": 1, "topics": [ + ] }, { "slug": "raindrops", "difficulty": 1, "topics": [ + ] }, { "slug": "difference-of-squares", "difficulty": 1, "topics": [ + ] }, { "slug": "pangram", "difficulty": 1, "topics": [ + ] }, { "slug": "sieve", "difficulty": 1, "topics": [ + ] }, { "slug": "roman-numerals", "difficulty": 1, "topics": [ + ] }, { "slug": "nth-prime", "difficulty": 1, "topics": [ + ] }, { "slug": "leap", "difficulty": 1, "topics": [ + ] }, { "slug": "grains", "difficulty": 1, "topics": [ + ] }, { "slug": "word-count", "difficulty": 1, "topics": [ + ] }, { "slug": "bob", "difficulty": 1, "topics": [ + ] }, { "slug": "run-length-encoding", "difficulty": 1, "topics": [ + ] }, { "slug": "binary", "difficulty": 1, "topics": [ + ] }, { "slug": "accumulate", "difficulty": 1, "topics": [ + ] }, { "slug": "sum-of-multiples", "difficulty": 1, "topics": [ + ] }, { "slug": "grade-school", "difficulty": 1, "topics": [ + ] }, { "slug": "series", "difficulty": 1, "topics": [ + ] }, { "slug": "phone-number", "difficulty": 1, "topics": [ + ] }, { "slug": "prime-factors", "difficulty": 1, "topics": [ + ] }, { "slug": "strain", "difficulty": 1, "topics": [ + ] }, { "slug": "etl", "difficulty": 1, "topics": [ + ] }, { "slug": "trinary", "difficulty": 1, "topics": [ + ] }, { "slug": "beer-song", "difficulty": 1, "topics": [ + ] }, { "slug": "bowling", "difficulty": 1, "topics": [ + ] }, { "slug": "space-age", "difficulty": 1, "topics": [ + ] }, { "slug": "anagram", "difficulty": 1, "topics": [ + ] }, { "slug": "binary-search-tree", "difficulty": 1, "topics": [ + ] }, { "slug": "crypto-square", "difficulty": 1, "topics": [ + ] }, { "slug": "clock", "difficulty": 1, "topics": [ + ] }, { "slug": "alphametics", "difficulty": 1, "topics": [ + ] }, { "slug": "rail-fence-cipher", "difficulty": 1, "topics": [ + ] }, { "slug": "acronym", "difficulty": 1, "topics": [ + ] }, { "slug": "scrabble-score", "difficulty": 1, "topics": [ + ] }, { "slug": "nucleotide-count", "difficulty": 1, "topics": [ + ] }, { "slug": "flatten-array", "difficulty": 1, "topics": [ + ] }, { "slug": "hexadecimal", "difficulty": 1, "topics": [ + ] }, { "slug": "say", "difficulty": 1, "topics": [ + ] }, { "slug": "meetup", "difficulty": 1, "topics": [ + ] }, { "slug": "robot-name", "difficulty": 6, "topics": [ + ] }, { "slug": "queen-attack", "difficulty": 1, "topics": [ + ] }, { "slug": "palindrome-products", "difficulty": 1, "topics": [ + ] }, { "slug": "bracket-push", "difficulty": 1, "topics": [ + ] }, { "slug": "food-chain", "difficulty": 1, "topics": [ + ] }, { "slug": "matrix", "difficulty": 1, "topics": [ + ] }, { "slug": "saddle-points", "difficulty": 1, "topics": [ + ] }, { "slug": "triangle", "difficulty": 1, "topics": [ + ] }, { "slug": "atbash-cipher", "difficulty": 1, "topics": [ + ] }, { "slug": "house", "difficulty": 1, "topics": [ + ] }, { "slug": "secret-handshake", "difficulty": 1, "topics": [ + ] }, { "slug": "proverb", "difficulty": 1, "topics": [ + ] }, { "slug": "ocr-numbers", "difficulty": 1, "topics": [ + ] }, { "slug": "pig-latin", "difficulty": 1, "topics": [ + ] }, { "slug": "simple-linked-list", "difficulty": 1, "topics": [ + ] }, { "slug": "luhn", "difficulty": 1, "topics": [ + ] }, { "slug": "simple-cipher", "difficulty": 1, "topics": [ + ] }, { "slug": "wordy", "difficulty": 1, "topics": [ + ] }, { "slug": "allergies", "difficulty": 1, "topics": [ + ] }, { "slug": "poker", "difficulty": 1, "topics": [ + ] }, { "slug": "kindergarten-garden", "difficulty": 1, "topics": [ + ] }, { "slug": "linked-list", "difficulty": 1, "topics": [ + ] }, { "slug": "pythagorean-triplet", "difficulty": 1, "topics": [ + ] }, { "slug": "robot-simulator", "difficulty": 1, "topics": [ + ] }, { "slug": "twelve-days", "difficulty": 1, "topics": [ + ] }, { "slug": "circular-buffer", "difficulty": 1, "topics": [ + ] }, { "slug": "largest-series-product", "difficulty": 1, "topics": [ + ] }, { "slug": "binary-search", "difficulty": 1, "topics": [ + ] }, { "slug": "two-bucket", "difficulty": 1, "topics": [ + ] }, { "slug": "pascals-triangle", "difficulty": 1, "topics": [ + ] }, { "slug": "custom-set", "difficulty": 1, "topics": [ + ] }, { "slug": "minesweeper", "difficulty": 1, "topics": [ + ] }, { "slug": "scale-generator", "difficulty": 1, "topics": [ + ] }, { "slug": "protein-translation", "difficulty": 1, "topics": [ + ] }, { "slug": "perfect-numbers", "difficulty": 1, "topics": [ + ] }, { "slug": "connect", "difficulty": 1, "topics": [ + ] }, { "slug": "list-ops", "difficulty": 1, "topics": [ + ] }, { "slug": "diamond", "difficulty": 1, "topics": [ + ] }, { "slug": "all-your-base", "difficulty": 1, "topics": [ + ] }, { "slug": "isogram", "difficulty": 1, "topics": [ + ] }, { "slug": "transpose", "difficulty": 1, "topics": [ + ] }, { "slug": "tournament", "difficulty": 1, "topics": [ + ] }, { "slug": "dominoes", "difficulty": 1, "topics": [ + ] } ], From a9c8f801ecd9547abf99aff0dc35ae03267c9ee6 Mon Sep 17 00:00:00 2001 From: kotp Date: Sun, 11 Jun 2017 10:15:55 -0400 Subject: [PATCH 09/16] BookKeeping VERSION as it relates to Generated Exercises --- README.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/README.md b/README.md index a2c549d113..433788b338 100644 --- a/README.md +++ b/README.md @@ -31,6 +31,12 @@ A few exercises use a custom test template: * `.meta/generator/test_template.erb` +### BookKeeping::VERSION + +For some, even perhaps many, of the exercises, you will find a +reference to the `BookKeeping` module, but this is only included when +tests have been generated; see [Generated Test Suites](#generated-test-suites). + ### Canonical Data **Most exercises can be generated from shared inputs/outputs, called canonical From a4e59b845cce8442e6cf21548acefdcfabbc925d Mon Sep 17 00:00:00 2001 From: kotp Date: Mon, 12 Jun 2017 15:31:00 -0400 Subject: [PATCH 10/16] Bob: New line introduced by test generator --- exercises/bob/bob_test.rb | 1 - 1 file changed, 1 deletion(-) diff --git a/exercises/bob/bob_test.rb b/exercises/bob/bob_test.rb index 4b60ba5d28..92e4814943 100755 --- a/exercises/bob/bob_test.rb +++ b/exercises/bob/bob_test.rb @@ -4,7 +4,6 @@ # Common test data version: 1.0.0 65756b1 class BobTest < Minitest::Test - def test_stating_something # skip remark = "Tom-ay-to, tom-aaaah-to." From e9f8fcacdc8ffba426e10d3effa49adf35b2cc74 Mon Sep 17 00:00:00 2001 From: Geoff Hubbard Date: Fri, 19 May 2017 09:32:34 +0100 Subject: [PATCH 11/16] Pass slug as the argument to the implementation factory method --- lib/generator/command_line.rb | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/lib/generator/command_line.rb b/lib/generator/command_line.rb index 91bd9cac7d..7750710786 100644 --- a/lib/generator/command_line.rb +++ b/lib/generator/command_line.rb @@ -16,7 +16,7 @@ def parse(args) attr_reader :paths def generators - implementations.map { |slug| generator(implementation(exercise(slug))) } + implementations.map { |slug| generator(implementation(slug)) } end def implementations @@ -35,11 +35,8 @@ def freeze? @options[:freeze] || @options[:all] end - def exercise(slug) - Exercise.new(slug: slug) - end - - def implementation(exercise) + def implementation(slug) + exercise = Exercise.new(slug: slug) LoggingImplementation.new( implementation: Implementation.new(paths: paths, exercise: exercise), logger: logger From e94060a32cf9afb3e693cc8354876d622ab81293 Mon Sep 17 00:00:00 2001 From: Geoff Hubbard Date: Fri, 19 May 2017 09:36:52 +0100 Subject: [PATCH 12/16] Add Repository class. --- lib/generator/repository.rb | 12 ++++++++++++ test/generator/repository_test.rb | 10 ++++++++++ 2 files changed, 22 insertions(+) create mode 100644 lib/generator/repository.rb create mode 100644 test/generator/repository_test.rb diff --git a/lib/generator/repository.rb b/lib/generator/repository.rb new file mode 100644 index 0000000000..44abc306a3 --- /dev/null +++ b/lib/generator/repository.rb @@ -0,0 +1,12 @@ +module Generator + class Repository + include Files::TrackFiles + include Files::MetadataFiles + + attr_reader :paths, :slug + def initialize(paths:, slug:) + @paths = paths + @slug = slug + end + end +end diff --git a/test/generator/repository_test.rb b/test/generator/repository_test.rb new file mode 100644 index 0000000000..e419697df0 --- /dev/null +++ b/test/generator/repository_test.rb @@ -0,0 +1,10 @@ +require_relative '../test_helper' + +module Generator + class RepositoryTest < Minitest::Test + def test_construction + subject = Repository.new(paths: nil, slug: nil) + assert_instance_of Repository, subject + end + end +end From 1058c372e1530d502ff129acdf5caf218ea33e8c Mon Sep 17 00:00:00 2001 From: Geoff Hubbard Date: Fri, 19 May 2017 09:52:36 +0100 Subject: [PATCH 13/16] Pass repository as an argument to Implementation. --- lib/generator/command_line.rb | 4 +++- lib/generator/implementation.rb | 12 +++++++++--- test/generator/implementation_test.rb | 15 +++++++++++---- 3 files changed, 23 insertions(+), 8 deletions(-) diff --git a/lib/generator/command_line.rb b/lib/generator/command_line.rb index 7750710786..07f93206be 100644 --- a/lib/generator/command_line.rb +++ b/lib/generator/command_line.rb @@ -13,6 +13,7 @@ def parse(args) end private + attr_reader :paths def generators @@ -37,8 +38,9 @@ def freeze? def implementation(slug) exercise = Exercise.new(slug: slug) + repository = Repository.new(paths: paths, slug: slug) LoggingImplementation.new( - implementation: Implementation.new(paths: paths, exercise: exercise), + implementation: Implementation.new(repository: repository, exercise: exercise), logger: logger ) end diff --git a/lib/generator/implementation.rb b/lib/generator/implementation.rb index b939d3703f..5797228c46 100644 --- a/lib/generator/implementation.rb +++ b/lib/generator/implementation.rb @@ -6,12 +6,12 @@ class Implementation include Files::MetadataFiles include TemplateValuesFactory - def initialize(paths:, exercise:) - @paths = paths + def initialize(repository:, exercise:) + @repository = repository @exercise = exercise end - attr_reader :paths, :exercise + attr_reader :repository, :exercise def version tests_version.to_i @@ -31,6 +31,12 @@ def build_tests values: template_values ) end + + private + + def paths + repository.paths + end end # This exists to give us a clue as to what we are delegating to. diff --git a/test/generator/implementation_test.rb b/test/generator/implementation_test.rb index c8a907ca9f..ca4df6158d 100644 --- a/test/generator/implementation_test.rb +++ b/test/generator/implementation_test.rb @@ -9,13 +9,16 @@ class ImplementationTest < Minitest::Test def test_version exercise = Minitest::Mock.new.expect :slug, 'alpha' - subject = Implementation.new(paths: FixturePaths, exercise: exercise) + repository = Repository.new(paths: FixturePaths, slug: 'alpha') + subject = Implementation.new(repository: repository, exercise: exercise) assert_equal 1, subject.version end def test_update_tests_version mock_file = Minitest::Mock.new.expect :write, '2'.length, [2] - subject = Implementation.new(paths: FixturePaths, exercise: Exercise.new(slug: 'alpha')) + exercise = Exercise.new(slug: 'alpha') + repository = Repository.new(paths: FixturePaths, slug: 'alpha') + subject = Implementation.new(repository: repository, exercise: exercise) # Verify iniital condition from fixture file assert_equal 1, subject.tests_version.to_i File.stub(:open, true, mock_file) do @@ -27,7 +30,9 @@ def test_update_tests_version def test_update_example_solution expected_content = "# This is the example\n\nclass BookKeeping\n VERSION = 1\nend\n" mock_file = Minitest::Mock.new.expect :write, expected_content.length, [expected_content] - subject = Implementation.new(paths: FixturePaths, exercise: Exercise.new(slug: 'alpha')) + exercise = Exercise.new(slug: 'alpha') + repository = Repository.new(paths: FixturePaths, slug: 'alpha') + subject = Implementation.new(repository: repository, exercise: exercise) File.stub(:open, true, mock_file) do assert_equal expected_content, subject.update_example_solution end @@ -80,7 +85,9 @@ def test_bookkeeping end TESTS_FILE mock_file = Minitest::Mock.new.expect :write, expected_content.length, [expected_content] - subject = Implementation.new(paths: FixturePaths, exercise: Exercise.new(slug: 'alpha')) + exercise = Exercise.new(slug: 'alpha') + repository = Repository.new(paths: FixturePaths, slug: 'alpha') + subject = Implementation.new(repository: repository, exercise: exercise) GitCommand.stub(:abbreviated_commit_hash, '123456789') do File.stub(:open, true, mock_file) do assert_equal expected_content, subject.build_tests From 7855aed9337e087da531ce5ae4b9a98d55aefdb4 Mon Sep 17 00:00:00 2001 From: Geoff Hubbard Date: Fri, 19 May 2017 10:13:33 +0100 Subject: [PATCH 14/16] Implementation now uses repository. Since we're using `slug` to identify a problem we can remove some now unnecessary references to `Exercise` --- lib/generator/files/metadata_files.rb | 6 +++--- lib/generator/files/track_files.rb | 10 +++++++--- lib/generator/implementation.rb | 6 ++++-- test/generator/files/metadata_files_test.rb | 4 ++-- test/generator/files/track_files_test.rb | 8 ++++---- 5 files changed, 20 insertions(+), 14 deletions(-) diff --git a/lib/generator/files/metadata_files.rb b/lib/generator/files/metadata_files.rb index 75e9db7f84..c68eedf080 100644 --- a/lib/generator/files/metadata_files.rb +++ b/lib/generator/files/metadata_files.rb @@ -3,14 +3,14 @@ module Files module MetadataFiles def canonical_data CanonicalDataFile.new( - filename: File.join(exercise_metadata_path, 'canonical-data.json'), + filename: File.join(metadata_path, 'canonical-data.json'), repository_root: paths.metadata) end private - def exercise_metadata_path - File.join(paths.metadata, 'exercises', exercise.slug) + def metadata_path + File.join(paths.metadata, 'exercises', slug) end end diff --git a/lib/generator/files/track_files.rb b/lib/generator/files/track_files.rb index 9642ecceb2..accd3f1589 100644 --- a/lib/generator/files/track_files.rb +++ b/lib/generator/files/track_files.rb @@ -22,7 +22,7 @@ def tests_template private def exercise_path - File.join(paths.track, 'exercises', exercise.slug) + File.join(paths.track, 'exercises', slug) end def meta_path @@ -34,7 +34,7 @@ def solutions_path end def minitest_tests_filename - "#{exercise.name}_test.rb" + "#{slug_underscored}_test.rb" end def version_filename @@ -42,7 +42,7 @@ def version_filename end def example_filename - "#{exercise.name}.rb" + "#{slug_underscored}.rb" end def tests_template_absolute_filename @@ -61,6 +61,10 @@ def default_tests_template_filename def tests_template_filename 'test_template.erb' end + + def slug_underscored + slug.tr('-', '_') + end end class TestsVersionFile < Writable diff --git a/lib/generator/implementation.rb b/lib/generator/implementation.rb index 5797228c46..6377841af3 100644 --- a/lib/generator/implementation.rb +++ b/lib/generator/implementation.rb @@ -1,11 +1,13 @@ require 'delegate' +require 'forwardable' module Generator class Implementation - include Files::TrackFiles - include Files::MetadataFiles + extend Forwardable include TemplateValuesFactory + def_delegators :@repository, :tests_version, :example_solution, :tests_template, :minitest_tests, :canonical_data + def initialize(repository:, exercise:) @repository = repository @exercise = exercise diff --git a/test/generator/files/metadata_files_test.rb b/test/generator/files/metadata_files_test.rb index 3c3e205fa8..82e3682f8c 100644 --- a/test/generator/files/metadata_files_test.rb +++ b/test/generator/files/metadata_files_test.rb @@ -10,9 +10,9 @@ class MetadataFilesTest < Minitest::Test class TestMetadataFiles def initialize @paths = FixturePaths - @exercise = Exercise.new(slug: 'alpha') + @slug = 'alpha' end - attr_reader :paths, :exercise + attr_reader :paths, :slug include MetadataFiles end diff --git a/test/generator/files/track_files_test.rb b/test/generator/files/track_files_test.rb index 6854b77cec..d1d5b4b7ca 100644 --- a/test/generator/files/track_files_test.rb +++ b/test/generator/files/track_files_test.rb @@ -11,9 +11,9 @@ class TrackFilesTest < Minitest::Test class TestTrackFiles def initialize @paths = FixturePaths - @exercise = Exercise.new(slug: 'alpha-beta') + @slug = 'alpha-beta' end - attr_reader :paths, :exercise + attr_reader :paths, :slug include TrackFiles end @@ -43,9 +43,9 @@ def test_tests_template class TestTrackFilesUseDefault def initialize @paths = FixturePaths - @exercise = Exercise.new(slug: 'notemplate') + @slug = 'no-template' end - attr_reader :paths, :exercise + attr_reader :paths, :slug include TrackFiles end From 4ae7423dec6524133d7b1bac389fdf1697b092dd Mon Sep 17 00:00:00 2001 From: Geoff Hubbard Date: Fri, 19 May 2017 10:34:37 +0100 Subject: [PATCH 15/16] Remove knowledge of paths from Implementation. Implementation should get everything it needs to know about from a Repostiory. There are some knock-on effects on source_filepath --- lib/generator/files/track_files.rb | 13 +++++++++++++ lib/generator/implementation.rb | 6 ------ lib/generator/template_values.rb | 3 ++- test/generator/template_values_test.rb | 7 +++---- 4 files changed, 18 insertions(+), 11 deletions(-) diff --git a/lib/generator/files/track_files.rb b/lib/generator/files/track_files.rb index accd3f1589..0ce932c175 100644 --- a/lib/generator/files/track_files.rb +++ b/lib/generator/files/track_files.rb @@ -19,6 +19,11 @@ def tests_template TestsTemplateFile.new(filename: tests_template_absolute_filename) end + # FIXME: make this like everything else + def source_filepath + File.join(generator_path, case_filename) + end + private def exercise_path @@ -29,6 +34,10 @@ def meta_path File.join(exercise_path, '.meta') end + def generator_path + File.join(meta_path, 'generator') + end + def solutions_path File.join(meta_path, 'solutions') end @@ -62,6 +71,10 @@ def tests_template_filename 'test_template.erb' end + def case_filename + "#{slug_underscored}_case.rb" + end + def slug_underscored slug.tr('-', '_') end diff --git a/lib/generator/implementation.rb b/lib/generator/implementation.rb index 6377841af3..15b4ca31ce 100644 --- a/lib/generator/implementation.rb +++ b/lib/generator/implementation.rb @@ -33,12 +33,6 @@ def build_tests values: template_values ) end - - private - - def paths - repository.paths - end end # This exists to give us a clue as to what we are delegating to. diff --git a/lib/generator/template_values.rb b/lib/generator/template_values.rb index 61f78e0af5..6794ca0d00 100644 --- a/lib/generator/template_values.rb +++ b/lib/generator/template_values.rb @@ -47,7 +47,8 @@ def extractor end def cases_load_name - Files::GeneratorCases.source_filepath(paths.track, exercise.slug) + #Files::GeneratorCases.source_filepath(paths.track, exercise.slug) + repository.source_filepath end end end diff --git a/test/generator/template_values_test.rb b/test/generator/template_values_test.rb index d2b289d9a4..7adc8d8f01 100644 --- a/test/generator/template_values_test.rb +++ b/test/generator/template_values_test.rb @@ -62,10 +62,9 @@ def canonical_data mock_canonical_data end - def paths - mock_paths = Minitest::Mock.new - mock_paths.expect :track, 'test/fixtures/xruby' - mock_paths + def repository + mock_repository = Minitest::Mock.new + mock_repository.expect :source_filepath, 'test/fixtures/xruby/exercises/alpha/.meta/generator/alpha_case.rb' end include TemplateValuesFactory From f43b807fd65fdee0c6f6a6dbe6c6aec709dc51fb Mon Sep 17 00:00:00 2001 From: Geoff Hubbard Date: Fri, 19 May 2017 10:55:11 +0100 Subject: [PATCH 16/16] Treat *_case.rb files like every other track file --- lib/generator/files/track_files.rb | 8 +++++--- lib/generator/implementation.rb | 2 +- lib/generator/template_values.rb | 3 +-- test/generator/files/track_files_test.rb | 5 +++++ test/generator/template_values_test.rb | 5 ++--- 5 files changed, 14 insertions(+), 9 deletions(-) diff --git a/lib/generator/files/track_files.rb b/lib/generator/files/track_files.rb index 0ce932c175..87f39bae96 100644 --- a/lib/generator/files/track_files.rb +++ b/lib/generator/files/track_files.rb @@ -19,9 +19,8 @@ def tests_template TestsTemplateFile.new(filename: tests_template_absolute_filename) end - # FIXME: make this like everything else - def source_filepath - File.join(generator_path, case_filename) + def test_case + TestCaseFile.new(filename: File.join(generator_path, case_filename)) end private @@ -106,5 +105,8 @@ def generate(template:, values:) class TestsTemplateFile < Readable end + + class TestCaseFile < Readable + end end end diff --git a/lib/generator/implementation.rb b/lib/generator/implementation.rb index 15b4ca31ce..196c39c957 100644 --- a/lib/generator/implementation.rb +++ b/lib/generator/implementation.rb @@ -6,7 +6,7 @@ class Implementation extend Forwardable include TemplateValuesFactory - def_delegators :@repository, :tests_version, :example_solution, :tests_template, :minitest_tests, :canonical_data + def_delegators :@repository, :tests_version, :example_solution, :tests_template, :minitest_tests, :canonical_data, :test_case def initialize(repository:, exercise:) @repository = repository diff --git a/lib/generator/template_values.rb b/lib/generator/template_values.rb index 6794ca0d00..19dced1702 100644 --- a/lib/generator/template_values.rb +++ b/lib/generator/template_values.rb @@ -47,8 +47,7 @@ def extractor end def cases_load_name - #Files::GeneratorCases.source_filepath(paths.track, exercise.slug) - repository.source_filepath + test_case.filename end end end diff --git a/test/generator/files/track_files_test.rb b/test/generator/files/track_files_test.rb index d1d5b4b7ca..127ae44952 100644 --- a/test/generator/files/track_files_test.rb +++ b/test/generator/files/track_files_test.rb @@ -39,6 +39,11 @@ def test_tests_template assert_equal expected_filename, subject.tests_template.filename end + def test_test_case + subject = TestTrackFiles.new + expected_filename = FixturePaths.track + '/exercises/alpha-beta/.meta/generator/alpha_beta_case.rb' + assert_equal expected_filename, subject.test_case.filename + end class TestTrackFilesUseDefault def initialize diff --git a/test/generator/template_values_test.rb b/test/generator/template_values_test.rb index 7adc8d8f01..79d2e8eab2 100644 --- a/test/generator/template_values_test.rb +++ b/test/generator/template_values_test.rb @@ -62,9 +62,8 @@ def canonical_data mock_canonical_data end - def repository - mock_repository = Minitest::Mock.new - mock_repository.expect :source_filepath, 'test/fixtures/xruby/exercises/alpha/.meta/generator/alpha_case.rb' + def test_case + Files::TestCaseFile.new(filename: 'test/fixtures/xruby/exercises/alpha/.meta/generator/alpha_case.rb') end include TemplateValuesFactory