class Vagrant::UI::Basic

This is a UI implementation that outputs the text as is. It doesn’t add any color.

Public Class Methods

new() click to toggle source
Calls superclass method Vagrant::UI::Interface::new
# File lib/vagrant/ui.rb, line 153
def initialize
  super

  @lock = Mutex.new
end

Public Instance Methods

ask(message, **opts) click to toggle source
Calls superclass method
# File lib/vagrant/ui.rb, line 171
def ask(message, **opts)
  super(message)

  # We can't ask questions when the output isn't a TTY.
  raise Errors::UIExpectsTTY if !@stdin.tty? && !Vagrant::Util::Platform.windows?

  # Setup the options so that the new line is suppressed
  opts ||= {}
  opts[:echo]     = true  if !opts.key?(:echo)
  opts[:new_line] = false if !opts.key?(:new_line)
  opts[:prefix]   = false if !opts.key?(:prefix)

  # Output the data
  say(:info, message, opts)

  input = nil
  if opts[:echo] || !@stdin.respond_to?(:noecho)
    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
clear_line() click to toggle source
# File lib/vagrant/ui.rb, line 227
def clear_line
  # See: https://en.wikipedia.org/wiki/ANSI_escape_code
  reset = "\r\033[K"

  info(reset, new_line: false)
end
format_message(type, message, **opts) click to toggle source
# File lib/vagrant/ui.rb, line 263
def format_message(type, message, **opts)
  Util::CredentialScrubber.desensitize(message)
end
report_progress(progress, total, show_parts=true) click to toggle source

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 215
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
say(type, message, opts={}) click to toggle source

This method handles actually outputting a message of a given type to the console.

# File lib/vagrant/ui.rb, line 236
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(THREAD_MAX_JOIN_TIMEOUT)
end