From e9f8fcacdc8ffba426e10d3effa49adf35b2cc74 Mon Sep 17 00:00:00 2001 From: Geoff Hubbard Date: Fri, 19 May 2017 09:32:34 +0100 Subject: [PATCH 1/6] 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 2/6] 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 3/6] 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 4/6] 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 5/6] 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 6/6] 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