class Gem::StreamUI
Gem::StreamUI implements a simple stream based user interface.
Attributes
The error stream
The input stream
The output stream
Public Class Methods
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 188 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
# File lib/rubygems/user_interaction.rb, line 307 def _gets_noecho @ins.noecho {@ins.gets} end
Display an informational alert. Will ask question
if it is
not nil.
# File lib/rubygems/user_interaction.rb, line 347 def alert(statement, question=nil) @outs.puts "INFO: #{statement}" ask(question) if question end
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 364 def alert_error(statement, question=nil) @errs.puts "ERROR: #{statement}" ask(question) if question end
Display a warning on stderr. Will ask question
if it is not
nil.
# File lib/rubygems/user_interaction.rb, line 355 def alert_warning(statement, question=nil) @errs.puts "WARNING: #{statement}" ask(question) if question end
Ask a question. Returns an answer if connected to a tty, nil otherwise.
# File lib/rubygems/user_interaction.rb, line 280 def ask(question) return nil if not tty? @outs.print(question + " ") @outs.flush result = @ins.gets result.chomp! if result result end
Ask for a password. Does not echo response to terminal.
# File lib/rubygems/user_interaction.rb, line 294 def ask_for_password(question) return nil if not tty? @outs.print(question, " ") @outs.flush password = _gets_noecho @outs.puts password.chomp! if password password end
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 244 def ask_yes_no(question, default=nil) unless tty? then if default.nil? then 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
Prints a formatted backtrace to the errors stream if backtraces are enabled.
# File lib/rubygems/user_interaction.rb, line 210 def backtrace exception return unless Gem.configuration.backtrace @errs.puts "\t#{exception.backtrace.join "\n\t"}" end
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 221 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 list[result], result end
Display a debug message on the same location as error messages.
# File lib/rubygems/user_interaction.rb, line 372 def debug(statement) @errs.puts statement end
Return a download reporter object chosen from the current verbosity
# File lib/rubygems/user_interaction.rb, line 524 def download_reporter(*args) if self.kind_of?(Gem::SilentUI) return SilentDownloadReporter.new(@outs, *args) end case Gem.configuration.verbose when nil, false SilentDownloadReporter.new(@outs, *args) else VerboseDownloadReporter.new(@outs, *args) end end
Return a progress reporter object chosen from the current verbosity.
# File lib/rubygems/user_interaction.rb, line 387 def progress_reporter(*args) if self.kind_of?(Gem::SilentUI) return SilentProgressReporter.new(@outs, *args) end case Gem.configuration.verbose when nil, false SilentProgressReporter.new(@outs, *args) when true SimpleProgressReporter.new(@outs, *args) else VerboseProgressReporter.new(@outs, *args) end end
Display a statement.
# File lib/rubygems/user_interaction.rb, line 340 def say(statement="") @outs.puts statement end
Terminate the application with exit code status
, running any
exit handlers that might have been defined.
# File lib/rubygems/user_interaction.rb, line 380 def terminate_interaction(status = 0) raise Gem::SystemExitException, status end
Returns true if TTY methods should be used on this StreamUI.
# File lib/rubygems/user_interaction.rb, line 198 def tty? if RUBY_VERSION < '1.9.3' and RUBY_PLATFORM =~ /mingw|mswin/ then @usetty else @usetty && @ins.tty? end end