Gem::StreamUI
implements a simple stream based user interface.
The input stream
The output stream
The error stream
# File tmp/rubies/ruby-2.5.9/lib/rubygems/user_interaction.rb, line 197
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-2.5.9/lib/rubygems/user_interaction.rb, line 325
def _gets_noecho
require_io_console
if IO.method_defined?(:noecho) then
@ins.noecho {@ins.gets}
elsif Gem.win_platform?
require "Win32API"
password = ''
while char = Win32API.new("crtdll", "_getch", [ ], "L").Call do
break if char == 10 || char == 13 # received carriage return or newline
if char == 127 || char == 8 # backspace and delete
password.slice!(-1, 1)
else
password << char.chr
end
end
password
else
system "stty -echo"
begin
@ins.gets
ensure
system "stty echo"
end
end
end
# File tmp/rubies/ruby-2.5.9/lib/rubygems/user_interaction.rb, line 362
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-2.5.9/lib/rubygems/user_interaction.rb, line 379
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-2.5.9/lib/rubygems/user_interaction.rb, line 370
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-2.5.9/lib/rubygems/user_interaction.rb, line 289
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-2.5.9/lib/rubygems/user_interaction.rb, line 303
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-2.5.9/lib/rubygems/user_interaction.rb, line 253
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
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-2.5.9/lib/rubygems/user_interaction.rb, line 219
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-2.5.9/lib/rubygems/user_interaction.rb, line 230
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-2.5.9/lib/rubygems/user_interaction.rb, line 400
def close
end
# File tmp/rubies/ruby-2.5.9/lib/rubygems/user_interaction.rb, line 387
def debug(statement)
@errs.puts statement
end
Display a debug message on the same location as error messages.
# File tmp/rubies/ruby-2.5.9/lib/rubygems/user_interaction.rb, line 539
def download_reporter(*args)
case Gem.configuration.verbose
when nil, false
SilentDownloadReporter.new(@outs, *args)
else
VerboseDownloadReporter.new(@outs, *args)
end
end
Return a download reporter object chosen from the current verbosity
# File tmp/rubies/ruby-2.5.9/lib/rubygems/user_interaction.rb, line 406
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-2.5.9/lib/rubygems/user_interaction.rb, line 315
def require_io_console
@require_io_console ||= begin
begin
require 'io/console'
rescue LoadError
end
true
end
end
# File tmp/rubies/ruby-2.5.9/lib/rubygems/user_interaction.rb, line 355
def say(statement="")
@outs.puts statement
end
Display a statement.
# File tmp/rubies/ruby-2.5.9/lib/rubygems/user_interaction.rb, line 395
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-2.5.9/lib/rubygems/user_interaction.rb, line 207
def tty?
if RUBY_VERSION < '1.9.3' and RUBY_PLATFORM =~ /mingw|mswin/ then
@usetty
else
@usetty && @ins.tty?
end
end
Returns true if TTY methods should be used on this StreamUI
.