123456789_123456789_123456789_123456789_123456789_

Class: Gem::StreamUI

Relationships & Source Files
Namespace Children
Classes:
Extension / Inclusion / Inheritance Descendants
Subclasses:
Super Chains via Extension / Inclusion / Inheritance
Class Chain:
self, Deprecate
Inherits: Object
Defined in: lib/rubygems/user_interaction.rb

Overview

StreamUI implements a simple stream based user interface.

Class Method Summary

Deprecate - Extended

deprecate

Simple deprecation method that deprecates name by wrapping it up in a dummy method.

rubygems_deprecate

Simple deprecation method that deprecates name by wrapping it up in a dummy method.

rubygems_deprecate_command

Deprecation method to deprecate Rubygems commands.

skip_during

Temporarily turn off warnings.

Instance Attribute Summary

  • #errs readonly

    The error stream.

  • #ins readonly

    The input stream.

  • #outs readonly

    The output stream.

  • #tty? ⇒ Boolean readonly

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

Instance Method Summary

Constructor Details

.new(in_stream, out_stream, err_stream = STDERR, usetty = true) ⇒ StreamUI

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.

[ GitHub ]

  
# 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

Instance Attribute Details

#errs (readonly)

The error stream

[ GitHub ]

  
# File 'lib/rubygems/user_interaction.rb', line 191

attr_reader :errs

#ins (readonly)

The input stream

[ GitHub ]

  
# File 'lib/rubygems/user_interaction.rb', line 181

attr_reader :ins

#outs (readonly)

The output stream

[ GitHub ]

  
# File 'lib/rubygems/user_interaction.rb', line 186

attr_reader :outs

#tty?Boolean (readonly)

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

[ GitHub ]

  
# File 'lib/rubygems/user_interaction.rb', line 209

def tty?
  @usetty && @ins.tty?
end

Instance Method Details

#_gets_noecho

[ GitHub ]

  
# File 'lib/rubygems/user_interaction.rb', line 324

def _gets_noecho
  require_io_console
  @ins.noecho { @ins.gets }
end

#alert(statement, question = nil)

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

[ GitHub ]

  
# 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)

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

[ GitHub ]

  
# 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)

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

[ GitHub ]

  
# 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)

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

[ GitHub ]

  
# 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)

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

[ GitHub ]

  
# 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)

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.

[ GitHub ]

  
# 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)

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

[ GitHub ]

  
# 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)

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].

[ GitHub ]

  
# 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

[ GitHub ]

  
# File 'lib/rubygems/user_interaction.rb', line 370

def close
end

#download_reporter(*args)

Return a download reporter object chosen from the current verbosity

[ GitHub ]

  
# 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)

Return a progress reporter object chosen from the current verbosity.

[ GitHub ]

  
# 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

[ GitHub ]

  
# 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 = "")

Display a statement.

[ GitHub ]

  
# File 'lib/rubygems/user_interaction.rb', line 332

def say(statement="")
  @outs.puts statement
end

#terminate_interaction(status = 0)

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

[ GitHub ]

  
# File 'lib/rubygems/user_interaction.rb', line 365

def terminate_interaction(status = 0)
  close
  raise Gem::SystemExitException, status
end