/
etl_cases.rb
48 lines (38 loc) · 1013 Bytes
/
etl_cases.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
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