Class: Chef::Knife::UI
- Extended by:
- Forwardable
- Defined in:
- lib/chef/knife/core/ui.rb
Overview
Chef::Knife::UI
The User Interaction class used by knife.
Instance Attribute Summary collapse
-
#config ⇒ Object
readonly
Returns the value of attribute config.
-
#stderr ⇒ Object
readonly
Returns the value of attribute stderr.
-
#stdin ⇒ Object
readonly
Returns the value of attribute stdin.
-
#stdout ⇒ Object
readonly
Returns the value of attribute stdout.
Instance Method Summary collapse
- #ask(*args, &block) ⇒ Object
- #ask_question(question, opts = {}) ⇒ Object
- #color(string, *colors) ⇒ Object
-
#color? ⇒ Boolean
Should colored output be used? For output to a terminal, this is determined by the value of ‘config`.
- #confirm(question, append_instructions = true) ⇒ Object
- #edit_data(data, parse_output = true) ⇒ Object
- #edit_object(klass, name) ⇒ Object
-
#err(message) ⇒ Object
Prints a msg to stderr.
-
#error(message) ⇒ Object
Print an error message.
-
#fatal(message) ⇒ Object
Print a message describing a fatal error.
- #highline ⇒ Object
-
#initialize(stdout, stderr, stdin, config) ⇒ UI
constructor
A new instance of UI.
-
#interchange? ⇒ Boolean
Determines if the output format is a data interchange format, i.e., JSON or YAML.
- #list(*args) ⇒ Object
-
#msg(message) ⇒ Object
(also: #info)
Prints a message to stdout.
-
#output(data) ⇒ Object
Formats
data
using the configured presenter and outputs the result viamsg
. - #pretty_print(data) ⇒ Object
-
#use_presenter(presenter_class) ⇒ Object
Creates a new
presenter_class
object and uses it to format structured data for display. -
#warn(message) ⇒ Object
Print a warning message.
Constructor Details
#initialize(stdout, stderr, stdin, config) ⇒ UI
Returns a new instance of UI.
42 43 44 45 |
# File 'lib/chef/knife/core/ui.rb', line 42 def initialize(stdout, stderr, stdin, config) @stdout, @stderr, @stdin, @config = stdout, stderr, stdin, config @presenter = Chef::Knife::Core::GenericPresenter.new(self, config) end |
Instance Attribute Details
#config ⇒ Object (readonly)
Returns the value of attribute config.
36 37 38 |
# File 'lib/chef/knife/core/ui.rb', line 36 def config @config end |
#stderr ⇒ Object (readonly)
Returns the value of attribute stderr.
34 35 36 |
# File 'lib/chef/knife/core/ui.rb', line 34 def stderr @stderr end |
#stdin ⇒ Object (readonly)
Returns the value of attribute stdin.
35 36 37 |
# File 'lib/chef/knife/core/ui.rb', line 35 def stdin @stdin end |
#stdout ⇒ Object (readonly)
Returns the value of attribute stdout.
33 34 35 |
# File 'lib/chef/knife/core/ui.rb', line 33 def stdout @stdout end |
Instance Method Details
#ask(*args, &block) ⇒ Object
104 105 106 |
# File 'lib/chef/knife/core/ui.rb', line 104 def ask(*args, &block) highline.ask(*args, &block) end |
#ask_question(question, opts = {}) ⇒ Object
125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 |
# File 'lib/chef/knife/core/ui.rb', line 125 def ask_question(question, opts={}) question = question + "[#{opts[:default]}] " if opts[:default] if opts[:default] and config[:defaults] opts[:default] else stdout.print question a = stdin.readline.strip if opts[:default] a.empty? ? opts[:default] : a else a end end end |
#color(string, *colors) ⇒ Object
89 90 91 92 93 94 95 |
# File 'lib/chef/knife/core/ui.rb', line 89 def color(string, *colors) if color? highline.color(string, *colors) else string end end |
#color? ⇒ Boolean
Should colored output be used? For output to a terminal, this is determined by the value of ‘config`. When output is not to a terminal, colored output is never used
100 101 102 |
# File 'lib/chef/knife/core/ui.rb', line 100 def color? Chef::Config[:color] && stdout.tty? && (RUBY_PLATFORM !~ /mswin|mingw32|windows/) end |
#confirm(question, append_instructions = true) ⇒ Object
194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 |
# File 'lib/chef/knife/core/ui.rb', line 194 def confirm(question, append_instructions=true) return true if config[:yes] stdout.print question stdout.print "? (Y/N) " if append_instructions answer = stdin.readline answer.chomp! case answer when "Y", "y" true when "N", "n" self.msg("You said no, so I'm done here.") exit 3 else self.msg("I have no idea what to do with #{answer}") self.msg("Just say Y or N, please.") confirm(question) end end |
#edit_data(data, parse_output = true) ⇒ Object
146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 |
# File 'lib/chef/knife/core/ui.rb', line 146 def edit_data(data, parse_output=true) output = Chef::JSONCompat.to_json_pretty(data) if (!config[:no_editor]) filename = "knife-edit-" 0.upto(20) { filename += rand(9).to_s } filename << ".js" filename = File.join(Dir.tmpdir, filename) tf = File.open(filename, "w") tf.sync = true tf.puts output tf.close raise "Please set EDITOR environment variable" unless system("#{config[:editor]} #{tf.path}") tf = File.open(filename, "r") output = tf.gets(nil) tf.close File.unlink(filename) end parse_output ? Chef::JSONCompat.from_json(output) : output end |
#edit_object(klass, name) ⇒ Object
168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 |
# File 'lib/chef/knife/core/ui.rb', line 168 def edit_object(klass, name) object = klass.load(name) output = edit_data(object) # Only make the save if the user changed the object. # # Output JSON for the original (object) and edited (output), then parse # them without reconstituting the objects into real classes # (create_additions=false). Then, compare the resulting simple objects, # which will be Array/Hash/String/etc. # # We wouldn't have to do these shenanigans if all the editable objects # implemented to_hash, or if to_json against a hash returned a string # with stable key order. object_parsed_again = Chef::JSONCompat.from_json(Chef::JSONCompat.to_json(object), :create_additions => false) output_parsed_again = Chef::JSONCompat.from_json(Chef::JSONCompat.to_json(output), :create_additions => false) if object_parsed_again != output_parsed_again output.save self.msg("Saved #{output}") else self.msg("Object unchanged, not saving") end output(format_for_display(object)) if config[:print_after] end |
#err(message) ⇒ Object
Prints a msg to stderr. Used for warn, error, and fatal.
70 71 72 |
# File 'lib/chef/knife/core/ui.rb', line 70 def err() stderr.puts end |
#error(message) ⇒ Object
Print an error message
80 81 82 |
# File 'lib/chef/knife/core/ui.rb', line 80 def error() err("#{color('ERROR:', :red, :bold)} #{}") end |
#fatal(message) ⇒ Object
Print a message describing a fatal error.
85 86 87 |
# File 'lib/chef/knife/core/ui.rb', line 85 def fatal() err("#{color('FATAL:', :red, :bold)} #{}") end |
#highline ⇒ Object
54 55 56 57 58 59 |
# File 'lib/chef/knife/core/ui.rb', line 54 def highline @highline ||= begin require 'highline' HighLine.new end end |
#interchange? ⇒ Boolean
Determines if the output format is a data interchange format, i.e., JSON or YAML
121 122 123 |
# File 'lib/chef/knife/core/ui.rb', line 121 def interchange? @presenter.interchange? end |
#list(*args) ⇒ Object
108 109 110 |
# File 'lib/chef/knife/core/ui.rb', line 108 def list(*args) highline.list(*args) end |
#msg(message) ⇒ Object Also known as: info
Prints a message to stdout. Aliased as info
for compatibility with the logger API.
63 64 65 |
# File 'lib/chef/knife/core/ui.rb', line 63 def msg() stdout.puts end |
#output(data) ⇒ Object
Formats data
using the configured presenter and outputs the result via msg
. Formatting can be customized by configuring a different presenter. See use_presenter
115 116 117 |
# File 'lib/chef/knife/core/ui.rb', line 115 def output(data) msg @presenter.format(data) end |
#pretty_print(data) ⇒ Object
142 143 144 |
# File 'lib/chef/knife/core/ui.rb', line 142 def pretty_print(data) stdout.puts data end |
#use_presenter(presenter_class) ⇒ Object
Creates a new presenter_class
object and uses it to format structured data for display. By default, a Chef::Knife::Core::GenericPresenter object is used.
50 51 52 |
# File 'lib/chef/knife/core/ui.rb', line 50 def use_presenter(presenter_class) @presenter = presenter_class.new(self, config) end |
#warn(message) ⇒ Object
Print a warning message
75 76 77 |
# File 'lib/chef/knife/core/ui.rb', line 75 def warn() err("#{color('WARNING:', :yellow, :bold)} #{}") end |