diff --git a/lib/generator/command_line.rb b/lib/generator/command_line.rb index 91bd9cac7d..07f93206be 100644 --- a/lib/generator/command_line.rb +++ b/lib/generator/command_line.rb @@ -13,10 +13,11 @@ def parse(args) end private + attr_reader :paths def generators - implementations.map { |slug| generator(implementation(exercise(slug))) } + implementations.map { |slug| generator(implementation(slug)) } end def implementations @@ -35,13 +36,11 @@ 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) + 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/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..87f39bae96 100644 --- a/lib/generator/files/track_files.rb +++ b/lib/generator/files/track_files.rb @@ -19,22 +19,30 @@ def tests_template TestsTemplateFile.new(filename: tests_template_absolute_filename) end + def test_case + TestCaseFile.new(filename: File.join(generator_path, case_filename)) + end + private def exercise_path - File.join(paths.track, 'exercises', exercise.slug) + File.join(paths.track, 'exercises', slug) end 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 def minitest_tests_filename - "#{exercise.name}_test.rb" + "#{slug_underscored}_test.rb" end def version_filename @@ -42,7 +50,7 @@ def version_filename end def example_filename - "#{exercise.name}.rb" + "#{slug_underscored}.rb" end def tests_template_absolute_filename @@ -61,6 +69,14 @@ def default_tests_template_filename def tests_template_filename 'test_template.erb' end + + def case_filename + "#{slug_underscored}_case.rb" + end + + def slug_underscored + slug.tr('-', '_') + end end class TestsVersionFile < Writable @@ -89,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 b939d3703f..196c39c957 100644 --- a/lib/generator/implementation.rb +++ b/lib/generator/implementation.rb @@ -1,17 +1,19 @@ require 'delegate' +require 'forwardable' module Generator class Implementation - include Files::TrackFiles - include Files::MetadataFiles + extend Forwardable include TemplateValuesFactory - def initialize(paths:, exercise:) - @paths = paths + def_delegators :@repository, :tests_version, :example_solution, :tests_template, :minitest_tests, :canonical_data, :test_case + + def initialize(repository:, exercise:) + @repository = repository @exercise = exercise end - attr_reader :paths, :exercise + attr_reader :repository, :exercise def version tests_version.to_i 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/lib/generator/template_values.rb b/lib/generator/template_values.rb index 61f78e0af5..19dced1702 100644 --- a/lib/generator/template_values.rb +++ b/lib/generator/template_values.rb @@ -47,7 +47,7 @@ def extractor end def cases_load_name - Files::GeneratorCases.source_filepath(paths.track, exercise.slug) + test_case.filename end end end 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..127ae44952 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 @@ -39,13 +39,18 @@ 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 @paths = FixturePaths - @exercise = Exercise.new(slug: 'notemplate') + @slug = 'no-template' end - attr_reader :paths, :exercise + attr_reader :paths, :slug include TrackFiles end 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 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 diff --git a/test/generator/template_values_test.rb b/test/generator/template_values_test.rb index d2b289d9a4..79d2e8eab2 100644 --- a/test/generator/template_values_test.rb +++ b/test/generator/template_values_test.rb @@ -62,10 +62,8 @@ def canonical_data mock_canonical_data end - def paths - mock_paths = Minitest::Mock.new - mock_paths.expect :track, 'test/fixtures/xruby' - mock_paths + def test_case + Files::TestCaseFile.new(filename: 'test/fixtures/xruby/exercises/alpha/.meta/generator/alpha_case.rb') end include TemplateValuesFactory