Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 6 additions & 7 deletions lib/generator/command_line.rb
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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
Expand Down
6 changes: 3 additions & 3 deletions lib/generator/files/metadata_files.rb
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down
25 changes: 22 additions & 3 deletions lib/generator/files/track_files.rb
Original file line number Diff line number Diff line change
Expand Up @@ -19,30 +19,38 @@ 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
'.version'
end

def example_filename
"#{exercise.name}.rb"
"#{slug_underscored}.rb"
end

def tests_template_absolute_filename
Expand All @@ -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
Expand Down Expand Up @@ -89,5 +105,8 @@ def generate(template:, values:)

class TestsTemplateFile < Readable
end

class TestCaseFile < Readable
end
end
end
12 changes: 7 additions & 5 deletions lib/generator/implementation.rb
Original file line number Diff line number Diff line change
@@ -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
Expand Down
12 changes: 12 additions & 0 deletions lib/generator/repository.rb
Original file line number Diff line number Diff line change
@@ -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
2 changes: 1 addition & 1 deletion lib/generator/template_values.rb
Original file line number Diff line number Diff line change
Expand Up @@ -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
4 changes: 2 additions & 2 deletions test/generator/files/metadata_files_test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down
13 changes: 9 additions & 4 deletions test/generator/files/track_files_test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand All @@ -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'
Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Added a hyphen so we don't need to worry about whether it's an emplate or not.

end
attr_reader :paths, :exercise
attr_reader :paths, :slug
include TrackFiles
end

Expand Down
15 changes: 11 additions & 4 deletions test/generator/implementation_test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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
Expand Down Expand Up @@ -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
Expand Down
10 changes: 10 additions & 0 deletions test/generator/repository_test.rb
Original file line number Diff line number Diff line change
@@ -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
6 changes: 2 additions & 4 deletions test/generator/template_values_test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down