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.
-
#presenter ⇒ Object
readonly
Returns the value of attribute presenter.
-
#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.
45 46 47 48 |
# File 'lib/chef/knife/core/ui.rb', line 45 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.
37 38 39 |
# File 'lib/chef/knife/core/ui.rb', line 37 def config @config end |
#presenter ⇒ Object (readonly)
Returns the value of attribute presenter.
39 40 41 |
# File 'lib/chef/knife/core/ui.rb', line 39 def presenter @presenter end |
#stderr ⇒ Object (readonly)
Returns the value of attribute stderr.
35 36 37 |
# File 'lib/chef/knife/core/ui.rb', line 35 def stderr @stderr end |
#stdin ⇒ Object (readonly)
Returns the value of attribute stdin.
36 37 38 |
# File 'lib/chef/knife/core/ui.rb', line 36 def stdin @stdin end |
#stdout ⇒ Object (readonly)
Returns the value of attribute stdout.
34 35 36 |
# File 'lib/chef/knife/core/ui.rb', line 34 def stdout @stdout end |
Instance Method Details
#ask(*args, &block) ⇒ Object
107 108 109 |
# File 'lib/chef/knife/core/ui.rb', line 107 def ask(*args, &block) highline.ask(*args, &block) end |
#ask_question(question, opts = {}) ⇒ Object
128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 |
# File 'lib/chef/knife/core/ui.rb', line 128 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
92 93 94 95 96 97 98 |
# File 'lib/chef/knife/core/ui.rb', line 92 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
103 104 105 |
# File 'lib/chef/knife/core/ui.rb', line 103 def color? Chef::Config[:color] && stdout.tty? && !Chef::Platform.windows? end |
#confirm(question, append_instructions = true) ⇒ Object
197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 |
# File 'lib/chef/knife/core/ui.rb', line 197 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
149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 |
# File 'lib/chef/knife/core/ui.rb', line 149 def edit_data(data, parse_output=true) output = Chef::JSONCompat.to_json_pretty(data) if (!config[:disable_editing]) 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
171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 |
# File 'lib/chef/knife/core/ui.rb', line 171 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.
73 74 75 |
# File 'lib/chef/knife/core/ui.rb', line 73 def err() stderr.puts end |
#error(message) ⇒ Object
Print an error message
83 84 85 |
# File 'lib/chef/knife/core/ui.rb', line 83 def error() err("#{color('ERROR:', :red, :bold)} #{}") end |
#fatal(message) ⇒ Object
Print a message describing a fatal error.
88 89 90 |
# File 'lib/chef/knife/core/ui.rb', line 88 def fatal() err("#{color('FATAL:', :red, :bold)} #{}") end |
#highline ⇒ Object
57 58 59 60 61 62 |
# File 'lib/chef/knife/core/ui.rb', line 57 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
124 125 126 |
# File 'lib/chef/knife/core/ui.rb', line 124 def interchange? @presenter.interchange? end |
#list(*args) ⇒ Object
111 112 113 |
# File 'lib/chef/knife/core/ui.rb', line 111 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.
66 67 68 |
# File 'lib/chef/knife/core/ui.rb', line 66 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
118 119 120 |
# File 'lib/chef/knife/core/ui.rb', line 118 def output(data) msg @presenter.format(data) end |
#pretty_print(data) ⇒ Object
145 146 147 |
# File 'lib/chef/knife/core/ui.rb', line 145 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.
53 54 55 |
# File 'lib/chef/knife/core/ui.rb', line 53 def use_presenter(presenter_class) @presenter = presenter_class.new(self, config) end |
#warn(message) ⇒ Object
Print a warning message
78 79 80 |
# File 'lib/chef/knife/core/ui.rb', line 78 def warn() err("#{color('WARNING:', :yellow, :bold)} #{}") end |