# class Gem::StreamUI

`Gem::StreamUI` implements a simple stream based user interface.

### Attributes

errs[R]

The error stream

ins[R]

The input stream

outs[R]

The output stream

### Public Class Methods

new(in_stream, out_stream, err_stream=STDERR, usetty=true) click to toggle source

Creates a new `StreamUI` wrapping `in_stream` for user input, `out_stream` for standard output, `err_stream` for error output. If `usetty` is true then special operations (like asking for passwords) will use the TTY commands to disable character echo.

    # File lib/rubygems/user_interaction.rb, line 199
    def initialize(in_stream, out_stream, err_stream=STDERR, usetty=true)
      @ins = in_stream
      @outs = out_stream
      @errs = err_stream
      @usetty = usetty
    end

### Public Instance Methods

_gets_noecho() click to toggle source

    # File lib/rubygems/user_interaction.rb, line 324
    def _gets_noecho
      require_io_console
      @ins.noecho { @ins.gets }
    end

alert(statement, question=nil) click to toggle source

Display an informational alert. Will ask `question` if it is not nil.

    # File lib/rubygems/user_interaction.rb, line 339
    def alert(statement, question=nil)
      @outs.puts "INFO:  #{statement}"
      ask(question) if question
    end

alert_error(statement, question=nil) click to toggle source

Display an error message in a location expected to get error messages. Will ask `question` if it is not nil.

    # File lib/rubygems/user_interaction.rb, line 356
    def alert_error(statement, question=nil)
      @errs.puts "ERROR:  #{statement}"
      ask(question) if question
    end

alert_warning(statement, question=nil) click to toggle source

Display a warning on stderr. Will ask `question` if it is not nil.

    # File lib/rubygems/user_interaction.rb, line 347
    def alert_warning(statement, question=nil)
      @errs.puts "WARNING:  #{statement}"
      ask(question) if question
    end

ask(question) click to toggle source

Ask a question. Returns an answer if connected to a tty, nil otherwise.

    # File lib/rubygems/user_interaction.rb, line 288
    def ask(question)
      return nil if !tty?

      @outs.print(question + "  ")
      @outs.flush

      result = @ins.gets
      result&.chomp!
      result
    end

ask_for_password(question) click to toggle source

Ask for a password. Does not echo response to terminal.

    # File lib/rubygems/user_interaction.rb, line 302
    def ask_for_password(question)
      return nil if !tty?

      @outs.print(question, "  ")
      @outs.flush

      password = _gets_noecho
      @outs.puts
      password&.chomp!
      password
    end

ask_yes_no(question, default=nil) click to toggle source

Ask a question. Returns a true for yes, false for no. If not connected to a tty, raises an exception if default is nil, otherwise returns default.

    # File lib/rubygems/user_interaction.rb, line 252
    def ask_yes_no(question, default=nil)
      unless tty?
        if default.nil?
          raise Gem::OperationNotSupportedError,
                "Not connected to a tty and no default specified"
        else
          return default
        end
      end

      default_answer = case default
      when nil
        "yn"
      when true
        "Yn"
      else
        "yN"
      end

      result = nil

      while result.nil? do
        result = case ask "#{question} [#{default_answer}]"
        when /^y/i then true
        when /^n/i then false
        when /^$/  then default
        else            nil
        end
      end

      return result
    end

backtrace(exception) click to toggle source

Prints a formatted backtrace to the errors stream if backtraces are enabled.

    # File lib/rubygems/user_interaction.rb, line 217
    def backtrace(exception)
      return unless Gem.configuration.backtrace

      @errs.puts "\t#{exception.backtrace.join "\n\t"}"
    end

choose_from_list(question, list) click to toggle source

Choose from a list of options. `question` is a prompt displayed above the list. `list` is a list of option strings. Returns the pair [option_name, option_index].

    # File lib/rubygems/user_interaction.rb, line 228
    def choose_from_list(question, list)
      @outs.puts question

      list.each_with_index do |item, index|
        @outs.puts " #{index + 1}. #{item}"
      end

      @outs.print "> "
      @outs.flush

      result = @ins.gets

      return nil, nil unless result

      result = result.strip.to_i - 1
      return nil, nil unless (0...list.size) === result
      return list[result], result
    end

close() click to toggle source

    # File lib/rubygems/user_interaction.rb, line 370
    def close
    end

download_reporter(*args) click to toggle source

Return a download reporter object chosen from the current verbosity

    # File lib/rubygems/user_interaction.rb, line 505
    def download_reporter(*args)
      if [nil, false].include?(Gem.configuration.verbose) || !@outs.tty?
        SilentDownloadReporter.new(@outs, *args)
      else
        ThreadedDownloadReporter.new(@outs, *args)
      end
    end

progress_reporter(*args) click to toggle source

Return a progress reporter object chosen from the current verbosity.

    # File lib/rubygems/user_interaction.rb, line 376
    def progress_reporter(*args)
      case Gem.configuration.verbose
      when nil, false
        SilentProgressReporter.new(@outs, *args)
      when true
        SimpleProgressReporter.new(@outs, *args)
      else
        VerboseProgressReporter.new(@outs, *args)
      end
    end

require_io_console() click to toggle source

    # File lib/rubygems/user_interaction.rb, line 314
    def require_io_console
      @require_io_console ||= begin
        begin
          require "io/console"
        rescue LoadError
        end
        true
      end
    end

say(statement="") click to toggle source

Display a statement.

    # File lib/rubygems/user_interaction.rb, line 332
    def say(statement="")
      @outs.puts statement
    end

terminate_interaction(status = 0) click to toggle source

Terminate the application with exit code `status`, running any exit handlers that might have been defined.

    # File lib/rubygems/user_interaction.rb, line 365
    def terminate_interaction(status = 0)
      close
      raise Gem::SystemExitException, status
    end

tty?() click to toggle source

Returns true if TTY methods should be used on this `StreamUI`.

    # File lib/rubygems/user_interaction.rb, line 209
    def tty?
      @usetty && @ins.tty?
    end