This is a UI implementation that outputs the text as is. It doesn't add any color.
# File lib/vagrant/ui.rb, line 113 def initialize super @lock = Mutex.new end
# File lib/vagrant/ui.rb, line 131 def ask(message, opts=nil) super(message) # We can't ask questions when the output isn't a TTY. raise Errors::UIExpectsTTY if !$stdin.tty? && !Vagrant::Util::Platform.cygwin? # Setup the options so that the new line is suppressed opts ||= {} opts[:echo] = true if !opts.has_key?(:echo) opts[:new_line] = false if !opts.has_key?(:new_line) opts[:prefix] = false if !opts.has_key?(:prefix) # Output the data say(:info, message, opts) input = nil if opts[:echo] input = $stdin.gets else begin input = $stdin.noecho(&:gets) # Output a newline because without echo, the newline isn't # echoed either. say(:info, "\n", opts) rescue Errno::EBADF # This means that stdin doesn't support echoless input. say(:info, "\n#{I18n.t("vagrant.stdin_cant_hide_input")}\n ", opts) # Ask again, with echo enabled input = ask(message, opts.merge(echo: true)) end end # Get the results and chomp off the newline. We do a logical OR # here because `gets` can return a nil, for example in the case # that ctrl-D is pressed on the input. (input || "").chomp end
# File lib/vagrant/ui.rb, line 187 def clear_line # See: http://en.wikipedia.org/wiki/ANSI_escape_code reset = "\r\0033[K" info(reset, :new_line => false) end
# File lib/vagrant/ui.rb, line 223 def format_message(type, message, **opts) message end
This is used to output progress reports to the UI. Send this method progress/total and it will output it to the UI. Send `clear_line` to clear the line to show a continuous progress meter.
# File lib/vagrant/ui.rb, line 175 def report_progress(progress, total, show_parts=true) if total && total > 0 percent = (progress.to_f / total.to_f) * 100 line = "Progress: #{percent.to_i}%" line << " (#{progress} / #{total})" if show_parts else line = "Progress: #{progress}" end info(line, :new_line => false) end
This method handles actually outputting a message of a given type to the console.
# File lib/vagrant/ui.rb, line 196 def say(type, message, **opts) defaults = { :new_line => true, :prefix => true } opts = defaults.merge(@opts).merge(opts) # Don't output if we're hiding details return if type == :detail && opts[:hide_detail] # Determine whether we're expecting to output our # own new line or not. printer = opts[:new_line] ? :puts : :print # Determine the proper IO channel to send this message # to based on the type of the message channel = type == :error || opts[:channel] == :error ? $stderr : $stdout # Output! We wrap this in a lock so that it safely outputs only # one line at a time. We wrap this in a thread because as of Ruby 2.0 # we can't acquire locks in a trap context (ctrl-c), so we have to # do this. Thread.new do @lock.synchronize do safe_puts(format_message(type, message, **opts), :io => channel, :printer => printer) end end.join end