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
-
#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
99 100 101 |
# File 'lib/chef/knife/core/ui.rb', line 99 def ask(*args, &block) highline.ask(*args, &block) end |
#ask_question(question, opts = {}) ⇒ Object
120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 |
# File 'lib/chef/knife/core/ui.rb', line 120 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
84 85 86 87 88 89 90 |
# File 'lib/chef/knife/core/ui.rb', line 84 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
95 96 97 |
# File 'lib/chef/knife/core/ui.rb', line 95 def color? Chef::Config[:color] && stdout.tty? && (RUBY_PLATFORM !~ /mswin|mingw32|windows/) end |
#confirm(question, append_instructions = true) ⇒ Object
189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 |
# File 'lib/chef/knife/core/ui.rb', line 189 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
141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 |
# File 'lib/chef/knife/core/ui.rb', line 141 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
163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 |
# File 'lib/chef/knife/core/ui.rb', line 163 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 |
#error(message) ⇒ Object
Print an error message
75 76 77 |
# File 'lib/chef/knife/core/ui.rb', line 75 def error() msg("#{color('ERROR:', :red, :bold)} #{}") end |
#fatal(message) ⇒ Object
Print a message describing a fatal error.
80 81 82 |
# File 'lib/chef/knife/core/ui.rb', line 80 def fatal() msg("#{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
116 117 118 |
# File 'lib/chef/knife/core/ui.rb', line 116 def interchange? @presenter.interchange? end |
#list(*args) ⇒ Object
103 104 105 |
# File 'lib/chef/knife/core/ui.rb', line 103 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
110 111 112 |
# File 'lib/chef/knife/core/ui.rb', line 110 def output(data) msg @presenter.format(data) end |
#pretty_print(data) ⇒ Object
137 138 139 |
# File 'lib/chef/knife/core/ui.rb', line 137 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
70 71 72 |
# File 'lib/chef/knife/core/ui.rb', line 70 def warn() msg("#{color('WARNING:', :yellow, :bold)} #{}") end |