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