class Duct::Runner

Public Class Methods

new(config) click to toggle source
# File lib/duct/runner.rb, line 7
def initialize(config)
  @config = config
end

Public Instance Methods

data() click to toggle source
# File lib/duct/runner.rb, line 19
def data
  @data ||= file_content.last
end
file_content() click to toggle source
# File lib/duct/runner.rb, line 11
def file_content
  @file_content ||= File.read(@config.filename).split(/^__END__$/, 2)
end
preamble() click to toggle source
# File lib/duct/runner.rb, line 23
def preamble
  @preamble ||= data.split(/^@@\s*(.*\S)\s*$/, 2).first
end
run() click to toggle source
# File lib/duct/runner.rb, line 27
def run
  copy_embedded_files
  system "BUNDLE_GEMFILE=#{tempdir}/Gemfile bundle #{@config.command}"
  update_embedded_files
  exec script_command unless @config.command
end
script() click to toggle source
# File lib/duct/runner.rb, line 15
def script
  @script ||= file_content.first
end
script_command() click to toggle source
# File lib/duct/runner.rb, line 34
def script_command
  filename = @config.filename.shellescape
  params = @config.params.join(' ')
  "BUNDLE_GEMFILE=#{tempdir}/Gemfile bundle exec ruby #{filename} #{params}; rm -rf #{tempdir}"
end

Private Instance Methods

copy_embedded_files() click to toggle source
# File lib/duct/runner.rb, line 42
def copy_embedded_files
  embedded_files.each do |file, contents|
    IO.write("#{tempdir}/#{file}", contents)
  end
end
embedded_files() click to toggle source
# File lib/duct/runner.rb, line 62
def embedded_files
  @embedded_files ||= {}.tap do |files|
    file = nil
    data.each_line do |line|
      if line =~ /^@@\s*(.*\S)\s*$/
        file = ''
        files[$1.to_sym] = file
      elsif file
        file << line
      end
    end
  end
end
tempdir() click to toggle source
# File lib/duct/runner.rb, line 76
def tempdir
  @tempdir ||= Dir.mktmpdir
end
update_embedded_files() click to toggle source
# File lib/duct/runner.rb, line 48
def update_embedded_files
  contents = script.dup

  contents << "__END__"
  contents << preamble

  Dir.glob("#{tempdir}/*") do |filename|
    contents << "@@ #{File.basename(filename)}\n"
    contents << File.read(filename)
  end

  IO.write(@config.filename, contents)
end