Module: Thor::Actions

Overview

Patch some Thor actions

Instance Method Summary collapse

Instance Method Details

#run_with_input(command, input, config = {}) ⇒ Object

Replace ‘run` with IO::popen to accept STDIN



15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
# File 'lib/builderator/patch/thor-actions.rb', line 15

def run_with_input(command, input, config = {})
  return unless behavior == :invoke

  destination = relative_to_original_destination_root(destination_root, false)
  desc = "#{command} from #{destination.inspect}"

  if config[:with]
    desc = "#{File.basename(config[:with].to_s)} #{desc}"
    command = "#{config[:with]} #{command}"
  end

  say_status :run, desc, config.fetch(:verbose, true)
  return if options[:pretend]

  output = config.fetch(:stdout, STDOUT)

  IO.popen(command, 'r+') do |io|
    io.write(input)
    io.close_write

    ## Stream output
    loop do
      break if io.eof?

      output.write(io.readpartial(4096))
      output.flush
    end
  end
end

#run_without_bundler(command, config = {}) ⇒ Object

Run an external command without bundler’s injected environment variables (e.g. keep vagrant happy in it’s own little vendor full of unicorns)



49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
# File 'lib/builderator/patch/thor-actions.rb', line 49

def run_without_bundler(command, config = {})
  destination = relative_to_original_destination_root(destination_root, false)
  desc = "#{command} from #{destination.inspect}"

  if config[:with]
    desc = "#{File.basename(config[:with].to_s)} #{desc}"
    command = "#{config[:with]} #{command}"
  end

  say_status :run, desc, config.fetch(:verbose, true)
  return if options[:pretend]

  output = config.fetch(:stdout, STDOUT)

  Bundler.with_clean_env do
    if config.fetch(:childprocess, false)
      process = ChildProcess.build(*command.split(' '))
      process.io.inherit!

      process.start
      process.wait
      return process.exit_code
    end

    IO.popen(command, 'r+') do |io|
      ## Stream output
      loop do
        break if io.eof?

        output.write(io.readpartial(4096))
        output.flush
      end
    end
  end
end

#template(source, destination, config = {}) ⇒ Object

Make ‘template` load from a sane path and render in the context of Config



88
89
90
91
92
93
# File 'lib/builderator/patch/thor-actions.rb', line 88

def template(source, destination, config = {})
  content = ERB.new(Builderator::Util.source_path(source).binread,
                    nil, '-', '@output_buffer').result(Builderator::Config.instance_eval('binding'))

  create_file Builderator::Util.relative_path(destination), content, config
end