diff --git a/lib/generator/case_values.rb b/lib/generator/case_values.rb index 9d109d9edc..d025fbc2a8 100644 --- a/lib/generator/case_values.rb +++ b/lib/generator/case_values.rb @@ -1,39 +1,24 @@ module Generator module CaseValues - class Extractor - attr_reader :exercise_name, :exercise_data - - def self.extract(exercise_name:, exercise_data:) - self.new( - exercise_name: exercise_name, - exercise_data: exercise_data - ).extract - end - - def initialize(exercise_name:, exercise_data:) - @exercise_name = exercise_name - @exercise_data = exercise_data + def initialize(case_class:) + @case_class = case_class end - def extract - extract_test_cases.map.with_index do |test, index| - test_case_class.new(test.merge('index' => index)) + def call(exercise_data) + parsed_data = JSON.parse(exercise_data)['cases'] + extract_test_cases(data: parsed_data).map.with_index do |test, index| + @case_class.new(test.merge('index' => index)) end end private - def extract_test_cases(data: JSON.parse(exercise_data)['cases']) + def extract_test_cases(data:) data.flat_map do |entry| entry.key?('cases') ? extract_test_cases(data: entry['cases']) : entry end end - - def test_case_class - Object.const_get(Files::GeneratorCases.class_name(exercise_name)) - end end - end end diff --git a/lib/generator/template_values.rb b/lib/generator/template_values.rb index b4dceeaa63..700d8c585b 100644 --- a/lib/generator/template_values.rb +++ b/lib/generator/template_values.rb @@ -27,11 +27,13 @@ def template_values def extract load cases_load_name + extractor.call(canonical_data.to_s) + end - CaseValues::Extractor.extract( - exercise_name: exercise_name, - exercise_data: canonical_data.to_s - ) + def extractor + CaseValues::Extractor.new( + case_class: Object.const_get(Files::GeneratorCases.class_name(exercise_name)) + ) end def cases_load_name diff --git a/test/generator/case_values_test.rb b/test/generator/case_values_test.rb index 7f57e8f80a..4560cfd048 100644 --- a/test/generator/case_values_test.rb +++ b/test/generator/case_values_test.rb @@ -10,10 +10,10 @@ module Generator module CaseValues class ExtractorTest < Minitest::Test def test_multi_level_auto_extraction + canonical_data = File.read('test/fixtures/metadata/exercises/complex/canonical-data.json') cases = Extractor.new( - exercise_name: 'complex', - exercise_data: File.read('test/fixtures/metadata/exercises/complex/canonical-data.json') - ).extract + case_class: ComplexCase, + ).call(canonical_data) expected = [ ComplexCase.new(description: 'first generic verse', property: 'verse', number: 99,