From d85ace44029c9529cefae929aeb742950d18ded5 Mon Sep 17 00:00:00 2001 From: Geoff Hubbard Date: Wed, 26 Apr 2017 21:38:40 +0100 Subject: [PATCH 1/5] Pass the data to be extracted to the extract method. (We're not making use of it yet, but now it is there we can.) --- lib/generator/case_values.rb | 3 +-- lib/generator/template_values.rb | 5 ++--- test/generator/case_values_test.rb | 5 +++-- 3 files changed, 6 insertions(+), 7 deletions(-) diff --git a/lib/generator/case_values.rb b/lib/generator/case_values.rb index 9d109d9edc..8ad2b40d85 100644 --- a/lib/generator/case_values.rb +++ b/lib/generator/case_values.rb @@ -16,7 +16,7 @@ def initialize(exercise_name:, exercise_data:) @exercise_data = exercise_data end - def extract + def extract(_) extract_test_cases.map.with_index do |test, index| test_case_class.new(test.merge('index' => index)) end @@ -34,6 +34,5 @@ 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..61523637c0 100644 --- a/lib/generator/template_values.rb +++ b/lib/generator/template_values.rb @@ -27,11 +27,10 @@ def template_values def extract load cases_load_name - - CaseValues::Extractor.extract( + CaseValues::Extractor.new( exercise_name: exercise_name, exercise_data: canonical_data.to_s - ) + ).extract(canonical_data.to_s) end def cases_load_name diff --git a/test/generator/case_values_test.rb b/test/generator/case_values_test.rb index 7f57e8f80a..672bc7b7b5 100644 --- a/test/generator/case_values_test.rb +++ b/test/generator/case_values_test.rb @@ -10,10 +10,11 @@ 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 + exercise_data: canonical_data + ).extract(canonical_data) expected = [ ComplexCase.new(description: 'first generic verse', property: 'verse', number: 99, From 4818a04e3a2692c820f5748e5e0b517bf265a4d6 Mon Sep 17 00:00:00 2001 From: Geoff Hubbard Date: Wed, 26 Apr 2017 21:50:48 +0100 Subject: [PATCH 2/5] Pass the 'case_class'name in as an argument to Extractor --- lib/generator/case_values.rb | 16 +++------------- lib/generator/template_values.rb | 13 +++++++++---- test/generator/case_values_test.rb | 2 ++ 3 files changed, 14 insertions(+), 17 deletions(-) diff --git a/lib/generator/case_values.rb b/lib/generator/case_values.rb index 8ad2b40d85..e4b462e9d1 100644 --- a/lib/generator/case_values.rb +++ b/lib/generator/case_values.rb @@ -4,21 +4,15 @@ 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:) + def initialize(exercise_name:, exercise_data:, case_class:) @exercise_name = exercise_name @exercise_data = exercise_data + @case_class = case_class end def extract(_) extract_test_cases.map.with_index do |test, index| - test_case_class.new(test.merge('index' => index)) + @case_class.new(test.merge('index' => index)) end end @@ -29,10 +23,6 @@ def extract_test_cases(data: JSON.parse(exercise_data)['cases']) 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 61523637c0..fbcdb655e9 100644 --- a/lib/generator/template_values.rb +++ b/lib/generator/template_values.rb @@ -27,10 +27,15 @@ def template_values def extract load cases_load_name - CaseValues::Extractor.new( - exercise_name: exercise_name, - exercise_data: canonical_data.to_s - ).extract(canonical_data.to_s) + extractor.extract(canonical_data.to_s) + end + + def extractor + CaseValues::Extractor.new( + case_class: Object.const_get(Files::GeneratorCases.class_name(exercise_name)), + exercise_name: exercise_name, + exercise_data: canonical_data.to_s + ) end def cases_load_name diff --git a/test/generator/case_values_test.rb b/test/generator/case_values_test.rb index 672bc7b7b5..42cbb17741 100644 --- a/test/generator/case_values_test.rb +++ b/test/generator/case_values_test.rb @@ -12,8 +12,10 @@ 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( + case_class: ComplexCase, exercise_name: 'complex', exercise_data: canonical_data + ).extract(canonical_data) expected = [ From bbde073dde310ddfd5cfca0f4f76106d29167c9d Mon Sep 17 00:00:00 2001 From: Geoff Hubbard Date: Wed, 26 Apr 2017 22:07:27 +0100 Subject: [PATCH 3/5] Don't use exercise_data in the initializer anymore. --- lib/generator/case_values.rb | 12 ++++++------ lib/generator/template_values.rb | 3 +-- test/generator/case_values_test.rb | 2 -- 3 files changed, 7 insertions(+), 10 deletions(-) diff --git a/lib/generator/case_values.rb b/lib/generator/case_values.rb index e4b462e9d1..41c6b0b998 100644 --- a/lib/generator/case_values.rb +++ b/lib/generator/case_values.rb @@ -2,23 +2,23 @@ module Generator module CaseValues class Extractor - attr_reader :exercise_name, :exercise_data + attr_reader :exercise_name - def initialize(exercise_name:, exercise_data:, case_class:) + def initialize(exercise_name:, case_class:) @exercise_name = exercise_name - @exercise_data = exercise_data @case_class = case_class end - def extract(_) - extract_test_cases.map.with_index do |test, index| + def extract(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 diff --git a/lib/generator/template_values.rb b/lib/generator/template_values.rb index fbcdb655e9..dc0444971b 100644 --- a/lib/generator/template_values.rb +++ b/lib/generator/template_values.rb @@ -33,8 +33,7 @@ def extract def extractor CaseValues::Extractor.new( case_class: Object.const_get(Files::GeneratorCases.class_name(exercise_name)), - exercise_name: exercise_name, - exercise_data: canonical_data.to_s + exercise_name: exercise_name ) end diff --git a/test/generator/case_values_test.rb b/test/generator/case_values_test.rb index 42cbb17741..b877143b32 100644 --- a/test/generator/case_values_test.rb +++ b/test/generator/case_values_test.rb @@ -14,8 +14,6 @@ def test_multi_level_auto_extraction cases = Extractor.new( case_class: ComplexCase, exercise_name: 'complex', - exercise_data: canonical_data - ).extract(canonical_data) expected = [ From 96dbd2b0cae7d08b67259a644a6e643b82419896 Mon Sep 17 00:00:00 2001 From: Geoff Hubbard Date: Wed, 26 Apr 2017 22:10:43 +0100 Subject: [PATCH 4/5] exercise_name is not required by AutoExtractor anymore. --- lib/generator/case_values.rb | 6 +----- lib/generator/template_values.rb | 3 +-- test/generator/case_values_test.rb | 1 - 3 files changed, 2 insertions(+), 8 deletions(-) diff --git a/lib/generator/case_values.rb b/lib/generator/case_values.rb index 41c6b0b998..34872abe7a 100644 --- a/lib/generator/case_values.rb +++ b/lib/generator/case_values.rb @@ -1,11 +1,7 @@ module Generator module CaseValues - class Extractor - attr_reader :exercise_name - - def initialize(exercise_name:, case_class:) - @exercise_name = exercise_name + def initialize(case_class:) @case_class = case_class end diff --git a/lib/generator/template_values.rb b/lib/generator/template_values.rb index dc0444971b..48bac51b6f 100644 --- a/lib/generator/template_values.rb +++ b/lib/generator/template_values.rb @@ -32,8 +32,7 @@ def extract def extractor CaseValues::Extractor.new( - case_class: Object.const_get(Files::GeneratorCases.class_name(exercise_name)), - exercise_name: exercise_name + case_class: Object.const_get(Files::GeneratorCases.class_name(exercise_name)) ) end diff --git a/test/generator/case_values_test.rb b/test/generator/case_values_test.rb index b877143b32..856724485e 100644 --- a/test/generator/case_values_test.rb +++ b/test/generator/case_values_test.rb @@ -13,7 +13,6 @@ def test_multi_level_auto_extraction canonical_data = File.read('test/fixtures/metadata/exercises/complex/canonical-data.json') cases = Extractor.new( case_class: ComplexCase, - exercise_name: 'complex', ).extract(canonical_data) expected = [ From 42ff562c71a29527ac2c39c5a7b88a75be16d3e5 Mon Sep 17 00:00:00 2001 From: Geoff Hubbard Date: Wed, 26 Apr 2017 22:15:14 +0100 Subject: [PATCH 5/5] Rename 'extract' method to 'call' --- lib/generator/case_values.rb | 2 +- lib/generator/template_values.rb | 2 +- test/generator/case_values_test.rb | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/generator/case_values.rb b/lib/generator/case_values.rb index 34872abe7a..d025fbc2a8 100644 --- a/lib/generator/case_values.rb +++ b/lib/generator/case_values.rb @@ -5,7 +5,7 @@ def initialize(case_class:) @case_class = case_class end - def extract(exercise_data) + 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)) diff --git a/lib/generator/template_values.rb b/lib/generator/template_values.rb index 48bac51b6f..700d8c585b 100644 --- a/lib/generator/template_values.rb +++ b/lib/generator/template_values.rb @@ -27,7 +27,7 @@ def template_values def extract load cases_load_name - extractor.extract(canonical_data.to_s) + extractor.call(canonical_data.to_s) end def extractor diff --git a/test/generator/case_values_test.rb b/test/generator/case_values_test.rb index 856724485e..4560cfd048 100644 --- a/test/generator/case_values_test.rb +++ b/test/generator/case_values_test.rb @@ -13,7 +13,7 @@ def test_multi_level_auto_extraction canonical_data = File.read('test/fixtures/metadata/exercises/complex/canonical-data.json') cases = Extractor.new( case_class: ComplexCase, - ).extract(canonical_data) + ).call(canonical_data) expected = [ ComplexCase.new(description: 'first generic verse', property: 'verse', number: 99,