From 8326281748aa4c439590e81c00520b2ff000b56f Mon Sep 17 00:00:00 2001 From: ajwann Date: Mon, 13 Feb 2017 19:16:16 -0500 Subject: [PATCH] etl: added generator --- exercises/etl/.meta/.version | 1 + exercises/etl/etl_test.rb | 115 ++++++++++++++++++++++++++--------- exercises/etl/example.rb | 4 ++ exercises/etl/example.tt | 17 ++++++ lib/etl_cases.rb | 48 +++++++++++++++ 5 files changed, 155 insertions(+), 30 deletions(-) create mode 100644 exercises/etl/.meta/.version create mode 100644 exercises/etl/example.tt create mode 100644 lib/etl_cases.rb diff --git a/exercises/etl/.meta/.version b/exercises/etl/.meta/.version new file mode 100644 index 0000000000..d00491fd7e --- /dev/null +++ b/exercises/etl/.meta/.version @@ -0,0 +1 @@ +1 diff --git a/exercises/etl/etl_test.rb b/exercises/etl/etl_test.rb index 2a8b81d02c..e6dc4ac14e 100755 --- a/exercises/etl/etl_test.rb +++ b/exercises/etl/etl_test.rb @@ -1,58 +1,113 @@ -#!/usr/bin/env ruby -gem 'minitest', '>= 5.0.0' require 'minitest/autorun' require_relative 'etl' -class TransformTest < Minitest::Test - def test_transform_one_value - old = { 1 => ['A'] } - expected = { 'a' => 1 } +# Test data version: 040a24f +class EtlTest < Minitest::Test + def test_a_single_letter + # skip + old = { + '1' => ["A"], + } + expected = { + 'a' => '1', + } assert_equal expected, ETL.transform(old) end - def test_transform_more_values + def test_single_score_with_multiple_letters skip - old = { 1 => %w(A E I O U) } - expected = { 'a' => 1, 'e' => 1, 'i' => 1, 'o' => 1, 'u' => 1 } + old = { + '1' => ["A", "E", "I", "O", "U"], + } + expected = { + 'a' => '1', + 'e' => '1', + 'i' => '1', + 'o' => '1', + 'u' => '1', + } assert_equal expected, ETL.transform(old) end - def test_more_keys + def test_multiple_scores_with_multiple_letters skip - old = { 1 => %w(A E), 2 => %w(D G) } + old = { + '1' => ["A", "E"], + '2' => ["D", "G"], + } expected = { - 'a' => 1, - 'e' => 1, - 'd' => 2, - 'g' => 2 + 'a' => '1', + 'e' => '1', + 'd' => '2', + 'g' => '2', } assert_equal expected, ETL.transform(old) end - def test_full_dataset + def test_multiple_scores_with_differing_numbers_of_letters skip old = { - 1 => %w(A E I O U L N R S T), - 2 => %w(D G), - 3 => %w(B C M P), - 4 => %w(F H V W Y), - 5 => %w(K), - 8 => %w(J X), - 10 => %w(Q Z) + '1' => ["A", "E", "I", "O", "U", "L", "N", "R", "S", "T"], + '2' => ["D", "G"], + '3' => ["B", "C", "M", "P"], + '4' => ["F", "H", "V", "W", "Y"], + '5' => ["K"], + '8' => ["J", "X"], + '10' => ["Q", "Z"], } - expected = { - 'a' => 1, 'b' => 3, 'c' => 3, 'd' => 2, 'e' => 1, - 'f' => 4, 'g' => 2, 'h' => 4, 'i' => 1, 'j' => 8, - 'k' => 5, 'l' => 1, 'm' => 3, 'n' => 1, 'o' => 1, - 'p' => 3, 'q' => 10, 'r' => 1, 's' => 1, 't' => 1, - 'u' => 1, 'v' => 4, 'w' => 4, 'x' => 8, 'y' => 4, - 'z' => 10 + 'a' => '1', + 'b' => '3', + 'c' => '3', + 'd' => '2', + 'e' => '1', + 'f' => '4', + 'g' => '2', + 'h' => '4', + 'i' => '1', + 'j' => '8', + 'k' => '5', + 'l' => '1', + 'm' => '3', + 'n' => '1', + 'o' => '1', + 'p' => '3', + 'q' => '10', + 'r' => '1', + 's' => '1', + 't' => '1', + 'u' => '1', + 'v' => '4', + 'w' => '4', + 'x' => '8', + 'y' => '4', + 'z' => '10', } assert_equal expected, ETL.transform(old) 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 diff --git a/exercises/etl/example.rb b/exercises/etl/example.rb index 8797e0952c..a88d7f0fbd 100644 --- a/exercises/etl/example.rb +++ b/exercises/etl/example.rb @@ -1,3 +1,7 @@ +module BookKeeping + VERSION = 1 +end + class ETL def self.transform(old) data = {} diff --git a/exercises/etl/example.tt b/exercises/etl/example.tt new file mode 100644 index 0000000000..c4a58f240a --- /dev/null +++ b/exercises/etl/example.tt @@ -0,0 +1,17 @@ +require 'minitest/autorun' +require_relative 'etl' + +# Test data version: <%= abbreviated_commit_hash %> +class EtlTest < Minitest::Test<% test_cases.each do |test_case| %> + def <%= test_case.test_name %> + <%= test_case.skipped %> + <%= test_case.workload %> + end +<% end %> + +<%= IO.read(XRUBY_LIB + '/bookkeeping.md') %> + def test_bookkeeping + skip + assert_equal <%= version.next %>, BookKeeping::VERSION + end +end diff --git a/lib/etl_cases.rb b/lib/etl_cases.rb new file mode 100644 index 0000000000..210f75e4af --- /dev/null +++ b/lib/etl_cases.rb @@ -0,0 +1,48 @@ +require 'exercise_cases' + +class EtlCase < OpenStruct + def test_name + 'test_%s' % description.tr(' ,-', '_').downcase + end + + def workload + [ + "old = #{format_hash(integerize_keys(input))}", + " expected = #{format_hash(expected)}\n", + indent(4, assertion), + ].join("\n") + end + + def skipped + index.zero? ? '# skip' : 'skip' + end + + private + + def indent(size, text) + text.lines.each_with_object('') { |line, obj| obj << ' ' * size + line } + end + + def assertion + "assert_equal expected, ETL.transform(old)" + end + + def integerize_keys(input) + input.reduce({}) { |hash, (k, v)| hash[k.to_i] = v; hash } + end + + def format_hash(hash) + middle = hash.each_pair.with_object('') do |(k, v), obj| + value = v.class == Array ? v : "'#{v}'" + obj << " '#{k}' => #{value},\n " + end + "{\n #{middle} }" + end + +end + +EtlCases = proc do |data| + JSON.parse(data)['transform']['cases'].map.with_index do |row, i| + EtlCase.new(row.merge(index: i)) + end +end