module Exercise::RenderMethods

Public Instance Methods

render_exercise(template, digest_component: '') click to toggle source

rubocop:disable Metrics/AbcSize rubocop:disable Metrics/MethodLength

# File lib/commands/exercise/render_methods.rb, line 64
def render_exercise(template, digest_component: '')
  say "Rendering: #{template}"
  template = full_path(template)
  current_dir = Dir.pwd

  content = render(template)
  File.open(filename(template), 'w') { |f| f.write("#{content}\n#{stamp(digest_component, template)}") }

  say ok "Finished: #{template}"
  true
rescue StandardError => e
  say error "Failed to generate file from: #{template}"
  say "#{e.message}\n#{e.backtrace}"
  false
ensure
  Dir.chdir(current_dir)
end
render_file_path(template) click to toggle source

rubocop:enable Metrics/AbcSize rubocop:enable Metrics/MethodLength

# File lib/commands/exercise/render_methods.rb, line 85
def render_file_path(template)
  template.gsub(%r{.templates/.*?erb}, File.basename(template)).gsub('.erb', '')
end
templates_directory(template) click to toggle source
# File lib/commands/exercise/render_methods.rb, line 89
def templates_directory(template)
  full_path(File.dirname(template))
end

Private Instance Methods

anonymise(string) click to toggle source
# File lib/commands/exercise/render_methods.rb, line 95
def anonymise(string)
  substitutes.each do |key, value|
    string = string.gsub(key, value)
  end
  string
end
filename(template) click to toggle source
# File lib/commands/exercise/render_methods.rb, line 127
def filename(template)
  "#{File.expand_path("#{File.dirname(template)}/..")}/#{File.basename(template, '.erb')}"
end
render(template) click to toggle source
# File lib/commands/exercise/render_methods.rb, line 113
def render(template)
  reset
  template_content = File.read(File.expand_path(template))

  erb_template = ERB.new(template_content)

  result = run_in_temp_dir?(template_content) ? render_in_temp_dir(erb_template) : erb_template.result(binding)

  anonymise(result)
ensure
  after_rendering_commands.each { |command| test_command(command) }
  say '' if quiet?
end
render_in_temp_dir(erb_template) click to toggle source
# File lib/commands/exercise/render_methods.rb, line 131
def render_in_temp_dir(erb_template)
  output = nil
  Dir.mktmpdir do |path|
    original_dir = Dir.pwd
    Dir.chdir(path)
    output = erb_template.result(binding)
    Dir.chdir(original_dir)
  end
  output
end
reset() click to toggle source
# File lib/commands/exercise/render_methods.rb, line 108
def reset
  @result = nil
  @after_rendering_commands = []
end
run_in_temp_dir?(template_content) click to toggle source
# File lib/commands/exercise/render_methods.rb, line 142
def run_in_temp_dir?(template_content)
  /<%#\s*instruction:run_in_temp_directory\s*%>/.match?(template_content)
end
sanitise(string) click to toggle source
# File lib/commands/exercise/render_methods.rb, line 146
def sanitise(string)
  string.chomp.strip
end
stamp(digest_component, template) click to toggle source
# File lib/commands/exercise/render_methods.rb, line 102
def stamp(digest_component, template)
  "  \n\nRevision: #{digest(path: full_path("#{templates_directory(template)}/.."),
                            digest_component: digest_component.to_s,
                            excludes: excluded_files(template))}"
end