Gem::StreamUI
implements a simple stream based user interface.
The input stream
The output stream
The error stream
# File tmp/rubies/ruby-3.3.0/lib/rubygems/user_interaction.rb, line 196
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.3.0/lib/rubygems/user_interaction.rb, line 320
def _gets_noecho
require_io_console
@ins.noecho { @ins.gets }
end
# File tmp/rubies/ruby-3.3.0/lib/rubygems/user_interaction.rb, line 335
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.3.0/lib/rubygems/user_interaction.rb, line 352
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.3.0/lib/rubygems/user_interaction.rb, line 343
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.3.0/lib/rubygems/user_interaction.rb, line 284
def ask(question)
return nil unless tty?
@outs.print(question + " ")
@outs.flush
result = @ins.gets
result&.chomp!
result
end
Ask a question. Returns an answer if connected to a tty, nil otherwise.
# File tmp/rubies/ruby-3.3.0/lib/rubygems/user_interaction.rb, line 298
def ask_for_password(question)
return nil unless tty?
@outs.print(question, " ")
@outs.flush
password = _gets_noecho
@outs.puts
password&.chomp!
password
end
Ask for a password. Does not echo response to terminal.
# File tmp/rubies/ruby-3.3.0/lib/rubygems/user_interaction.rb, line 249
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
end
end
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.3.0/lib/rubygems/user_interaction.rb, line 214
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.3.0/lib/rubygems/user_interaction.rb, line 225
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
[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.3.0/lib/rubygems/user_interaction.rb, line 366
def close
end
# File tmp/rubies/ruby-3.3.0/lib/rubygems/user_interaction.rb, line 499
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.3.0/lib/rubygems/user_interaction.rb, line 372
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.3.0/lib/rubygems/user_interaction.rb, line 310
def require_io_console
@require_io_console ||= begin
begin
require "io/console"
rescue LoadError
end
true
end
end
# File tmp/rubies/ruby-3.3.0/lib/rubygems/user_interaction.rb, line 328
def say(statement="")
@outs.puts statement
end
Display a statement.
# File tmp/rubies/ruby-3.3.0/lib/rubygems/user_interaction.rb, line 361
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.3.0/lib/rubygems/user_interaction.rb, line 206
def tty?
@usetty && @ins.tty?
end
Returns true if TTY methods should be used on this StreamUI
.