class Gem::StreamUI

Gem::StreamUI 实现了一个简单的基于流的用户界面。

属性

errs[R]

错误流

ins[R]

输入流

outs[R]

输出流

公共类方法

new(in_stream, out_stream, err_stream=$stderr, usetty=true) 点击切换源码

创建一个新的 StreamUI,它封装了 in_stream 用于用户输入,out_stream 用于标准输出,err_stream 用于错误输出。如果 usetty 为 true,则特殊操作(例如请求密码)将使用 TTY 命令来禁用字符回显。

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

公共实例方法

_gets_noecho() 点击切换源码
# File rubygems/user_interaction.rb, line 320
def _gets_noecho
  require_io_console
  @ins.noecho { @ins.gets }
end
alert(statement, question=nil) 点击切换源码

显示一个信息提示。如果 question 不为 nil,则会询问 question

# File rubygems/user_interaction.rb, line 335
def alert(statement, question=nil)
  @outs.puts "INFO:  #{statement}"
  ask(question) if question
end
alert_error(statement, question=nil) 点击切换源码

在预期获取错误消息的位置显示错误消息。如果 question 不为 nil,则会询问 question

# File rubygems/user_interaction.rb, line 352
def alert_error(statement, question=nil)
  @errs.puts "ERROR:  #{statement}"
  ask(question) if question
end
alert_warning(statement, question=nil) 点击切换源码

在 stderr 上显示警告。如果 question 不为 nil,则会询问 question

# File rubygems/user_interaction.rb, line 343
def alert_warning(statement, question=nil)
  @errs.puts "WARNING:  #{statement}"
  ask(question) if question
end
ask(question) 点击切换源码

提出一个问题。如果连接到 tty,则返回答案,否则返回 nil。

# File 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_for_password(question) 点击切换源码

请求密码。不将响应回显到终端。

# File 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_yes_no(question, default=nil) 点击切换源码

提出一个问题。对于是,返回 true,对于否,返回 false。如果未连接到 tty,则如果 default 为 nil,则会引发异常,否则返回 default。

# File 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
backtrace(exception) 点击切换源码

如果启用了回溯,则将格式化的回溯打印到错误流。

# File rubygems/user_interaction.rb, line 214
def backtrace(exception)
  return unless Gem.configuration.backtrace

  @errs.puts "\t#{exception.backtrace.join "\n\t"}"
end
choose_from_list(question, list) 点击切换源码

从选项列表中选择。 question 是显示在列表上方的提示。 list 是选项字符串列表。返回 [option_name, option_index] 对。

# File 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
close() 点击切换源码
# File rubygems/user_interaction.rb, line 366
def close
end
download_reporter(*args) 点击切换源码

返回根据当前详细程度选择的下载报告器对象

# File 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
progress_reporter(*args) 点击切换源码

返回根据当前详细程度选择的进度报告器对象。

# File 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
require_io_console() 点击切换源码
# File rubygems/user_interaction.rb, line 310
def require_io_console
  @require_io_console ||= begin
    begin
      require "io/console"
    rescue LoadError
    end
    true
  end
end
say(statement="") 点击切换源码

显示一条语句。

# File rubygems/user_interaction.rb, line 328
def say(statement="")
  @outs.puts statement
end
terminate_interaction(status = 0) 点击切换源码

使用退出代码 status 终止应用程序,运行可能已定义的任何退出处理程序。

# File rubygems/user_interaction.rb, line 361
def terminate_interaction(status = 0)
  close
  raise Gem::SystemExitException, status
end
tty?() 点击切换源码

如果应在此 StreamUI 上使用 TTY 方法,则返回 true。

# File rubygems/user_interaction.rb, line 206
def tty?
  @usetty && @ins.tty?
end