Class: Bolt::Outputter::Human

Inherits:
Bolt::Outputter show all
Defined in:
lib/bolt/outputter/human.rb

Constant Summary collapse

COLORS =
{ red: "31",
green: "32",
yellow: "33" }.freeze

Instance Method Summary collapse

Methods inherited from Bolt::Outputter

for_format, #initialize, #print_message, #replace_data_type

Constructor Details

This class inherits a constructor from Bolt::Outputter

Instance Method Details

#colorize(color, string) ⇒ Object



11
12
13
14
15
16
17
# File 'lib/bolt/outputter/human.rb', line 11

def colorize(color, string)
  if @stream.isatty
    "\033[#{COLORS[color]}m#{string}\033[0m"
  else
    string
  end
end

#fatal_error(e) ⇒ Object



170
171
172
173
174
175
# File 'lib/bolt/outputter/human.rb', line 170

def fatal_error(e)
  @stream.puts(colorize(:red, e.message))
  if e.is_a? Bolt::RunFailure
    @stream.puts ::JSON.pretty_generate(e.result_set)
  end
end

#indent(indent, string) ⇒ Object



19
20
21
22
# File 'lib/bolt/outputter/human.rb', line 19

def indent(indent, string)
  indent = ' ' * indent
  string.gsub(/^/, indent.to_s)
end


28
29
30
31
32
33
34
35
# File 'lib/bolt/outputter/human.rb', line 28

def print_event(event)
  case event[:type]
  when :node_start
    print_start(event[:target])
  when :node_result
    print_result(event[:result])
  end
end


9
# File 'lib/bolt/outputter/human.rb', line 9

def print_head; end

Parameters:

  • A (Hash)

    hash representing the plan



127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
# File 'lib/bolt/outputter/human.rb', line 127

def print_plan_info(plan)
  # Building lots of strings...
  pretty_params = ""
  plan_info = ""
  usage = "bolt plan run #{plan['name']}"

  if plan['parameters']
    plan['parameters'].each do |p|
      name = p['name']
      pretty_params << "- #{name}: #{p['type']}\n"
      usage << if p.include?('default_value')
                 # TODO: print the default value when available
                 " [#{name}=<value>]"
               else
                 " #{name}=<value>"
               end
    end
  end

  plan_info << "\n#{plan['name']}"
  plan_info << "\n\n"
  plan_info << "USAGE:\n#{usage}\n\n"
  plan_info << "PARAMETERS:\n#{pretty_params}\n" if plan['parameters']
  @stream.puts(plan_info)
end

Parameters:

  • A (Hash)

    hash representing the plan result



154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
# File 'lib/bolt/outputter/human.rb', line 154

def print_plan_result(result)
  # If the object has a json representation display it
  if result.respond_to?(:to_json)
    # Guard against to_json methods that don't accept options
    # and don't print empty results on multiple lines
    if result.method(:to_json).arity == 0 ||
       (result.respond_to?(:empty?) && result.empty?)
      @stream.puts(result.to_json)
    else
      @stream.puts(::JSON.pretty_generate(result, quirks_mode: true))
    end
  else
    @stream.puts result.to_s
  end
end


41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
# File 'lib/bolt/outputter/human.rb', line 41

def print_result(result)
  if result.success?
    @stream.puts(colorize(:green, "Finished on #{result.target.host}:"))
  else
    @stream.puts(colorize(:red, "Failed on #{result.target.host}:"))
  end

  if result.error_hash
    @stream.puts(colorize(:red, remove_trail(indent(2, result.error_hash['msg']))))
  end

  if result.message
    @stream.puts(remove_trail(indent(2, result.message)))
  end

  # There is more information to output
  if result.generic_value
    # Use special handling if the result looks like a command or script result
    if result.generic_value.keys == %w[stdout stderr exit_code]
      unless result['stdout'].strip.empty?
        @stream.puts(indent(2, "STDOUT:"))
        @stream.puts(indent(4, result['stdout']))
      end
      unless result['stderr'].strip.empty?
        @stream.puts(indent(2, "STDERR:"))
        @stream.puts(indent(4, result['stderr']))
      end
    else
      @stream.puts(indent(2, ::JSON.pretty_generate(result.generic_value)))
    end
  end
end


37
38
39
# File 'lib/bolt/outputter/human.rb', line 37

def print_start(target)
  @stream.puts(colorize(:green, "Started on #{target.host}..."))
end


74
75
76
77
78
79
# File 'lib/bolt/outputter/human.rb', line 74

def print_summary(results, elapsed_time)
  @stream.puts format("Ran on %d node%s in %.2f seconds",
                      results.size,
                      results.size == 1 ? '' : 's',
                      elapsed_time)
end


81
82
83
84
85
86
87
88
89
90
91
92
93
94
# File 'lib/bolt/outputter/human.rb', line 81

def print_table(results)
  @stream.puts Terminal::Table.new(
    rows: results,
    style: {
      border_x: '',
      border_y: '',
      border_i: '',
      padding_left: 0,
      padding_right: 3,
      border_top: false,
      border_bottom: false
    }
  )
end

Parameters:

  • A (Hash)

    hash representing the task



97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
# File 'lib/bolt/outputter/human.rb', line 97

def print_task_info(task)
  # Building lots of strings...
  pretty_params = ""
  task_info = ""
  usage = "bolt task run --nodes, -n <node-name> #{task['name']}"

  if task['parameters']
    replace_data_type(task['parameters'])
    task['parameters'].each do |k, v|
      pretty_params << "- #{k}: #{v['type']}\n"
      pretty_params << "    #{v['description']}\n" if v['description']
      usage << if v['type'].is_a?(Puppet::Pops::Types::POptionalType)
                 " [#{k}=<value>]"
               else
                 " #{k}=<value>"
               end
    end
  end

  usage << " [--noop]" if task['supports_noop']

  task_info << "\n#{task['name']}"
  task_info << " - #{task['description']}" if task['description']
  task_info << "\n\n"
  task_info << "USAGE:\n#{usage}\n\n"
  task_info << "PARAMETERS:\n#{pretty_params}\n" if task['parameters']
  @stream.puts(task_info)
end

#remove_trail(string) ⇒ Object



24
25
26
# File 'lib/bolt/outputter/human.rb', line 24

def remove_trail(string)
  string.sub(/\s\z/, '')
end