class Exercise class << self def all exercise_names.map { |e| new(e) } end private def exercise_names FileList['exercises/*'].pathmap('%f').exclude('TRACK_HINTS.md') end end attr_reader :name alias :to_s :name def initialize(name) @name = name end def directory "exercises/#{name}/." end def example_file File.exist?(File.join(directory, example_filename)) ? example_filename : legacy_example_filename end def testable_example_file "#{base_file_name}.rb" end def test_file "#{base_file_name}_test.rb" end private def example_filename File.join('.meta', 'solutions', "#{name}.rb") end def legacy_example_filename 'example.rb' end def base_file_name @_base_file_name ||= name.tr('-', '_') end end