Gem::StreamUI
implements a simple stream based user interface.
The input stream
The output stream
The error stream
# File tmp/rubies/ruby-3.0.5/lib/rubygems/user_interaction.rb, line 198
def initialize(in_stream, out_stream, err_stream=STDERR, usetty=true)
@ins = in_stream
@outs = out_stream
@errs = err_stream
@usetty = usetty
end
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 tmp/rubies/ruby-3.0.5/lib/rubygems/user_interaction.rb, line 322
def _gets_noecho
require_io_console
@ins.noecho { @ins.gets }
end
# File tmp/rubies/ruby-3.0.5/lib/rubygems/user_interaction.rb, line 337
def alert(statement, question=nil)
@outs.puts "INFO: #{statement}"
ask(question) if question
end
Display an informational alert. Will ask question
if it is not nil.
# File tmp/rubies/ruby-3.0.5/lib/rubygems/user_interaction.rb, line 354
def alert_error(statement, question=nil)
@errs.puts "ERROR: #{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 tmp/rubies/ruby-3.0.5/lib/rubygems/user_interaction.rb, line 345
def alert_warning(statement, question=nil)
@errs.puts "WARNING: #{statement}"
ask(question) if question
end
Display a warning on stderr. Will ask question
if it is not nil.
# File tmp/rubies/ruby-3.0.5/lib/rubygems/user_interaction.rb, line 286
def ask(question)
return nil if not tty?
@outs.print(question + " ")
@outs.flush
result = @ins.gets
result.chomp! if result
result
end
Ask a question. Returns an answer if connected to a tty, nil otherwise.
# File tmp/rubies/ruby-3.0.5/lib/rubygems/user_interaction.rb, line 300
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 for a password. Does not echo response to terminal.
# File tmp/rubies/ruby-3.0.5/lib/rubygems/user_interaction.rb, line 250
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
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 tmp/rubies/ruby-3.0.5/lib/rubygems/user_interaction.rb, line 216
def backtrace(exception)
return unless Gem.configuration.backtrace
@errs.puts "\t#{exception.backtrace.join "\n\t"}"
end
Prints a formatted backtrace to the errors stream if backtraces are enabled.
# File tmp/rubies/ruby-3.0.5/lib/rubygems/user_interaction.rb, line 227
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
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 tmp/rubies/ruby-3.0.5/lib/rubygems/user_interaction.rb, line 368
def close
end
# File tmp/rubies/ruby-3.0.5/lib/rubygems/user_interaction.rb, line 503
def download_reporter(*args)
if [nil, false].include?(Gem.configuration.verbose) || !@outs.tty?
SilentDownloadReporter.new(@outs, *args)
else
ThreadedDownloadReporter.new(@outs, *args)
end
end
Return a download reporter object chosen from the current verbosity
# File tmp/rubies/ruby-3.0.5/lib/rubygems/user_interaction.rb, line 374
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
Return a progress reporter object chosen from the current verbosity.
# File tmp/rubies/ruby-3.0.5/lib/rubygems/user_interaction.rb, line 312
def require_io_console
@require_io_console ||= begin
begin
require 'io/console'
rescue LoadError
end
true
end
end
# File tmp/rubies/ruby-3.0.5/lib/rubygems/user_interaction.rb, line 330
def say(statement="")
@outs.puts statement
end
Display a statement.
# File tmp/rubies/ruby-3.0.5/lib/rubygems/user_interaction.rb, line 363
def terminate_interaction(status = 0)
close
raise Gem::SystemExitException, status
end
Terminate the application with exit code status
, running any exit handlers that might have been defined.
# File tmp/rubies/ruby-3.0.5/lib/rubygems/user_interaction.rb, line 208
def tty?
@usetty && @ins.tty?
end
Returns true if TTY methods should be used on this StreamUI
.