класс Bundler::Thor::Shell::Basic
Атрибуты
Публичные методы экземпляров
# File lib/bundler/vendor/thor/lib/thor/shell/basic.rb, line 70
def ask(statement, *args)
options = args.last.is_a?(Hash) ? args.pop : {}
color = args.first
if options[:limited_to]
ask_filtered(statement, color, options)
else
ask_simply(statement, color, options)
end
end Задает вопрос пользователю и получает ответ.
Если необходимо ограничить допустимые ответы, можно передать массив допустимых ответов. Если пользователь введет недопустимый ответ, ему будет показано сообщение с указанием допустимых ответов, и вопрос будет задан повторно.
Если запрашивается конфиденциальная информация, опция :echo может быть установлена в false, чтобы скрыть ввод пользователя из $stdin.
Если требуемый ввод — путь, установите опцию path в true. Это позволит использовать автодополнение для путей файлов, относительных к текущей рабочей директории, на системах, поддерживающих Readline.
Пример
ask(“Как вас зовут?”)
ask(“Какой ваш любимый неаполитанский вкус?”, :limited_to => [“клубника”, “шоколад”, “ваниль”])
ask(“Какой ваш пароль?”, :echo => false)
ask(“Где нужно сохранить файл?”, :path => true)
# File lib/bundler/vendor/thor/lib/thor/shell/basic.rb, line 294 def error(statement) stderr.puts statement end
Вызывается, если во время выполнения что-то идёт не так. Используется внутри Bundler::Thor и не должно использоваться в ваших скриптах. Если что-то пошло не так, всегда можно бросить исключение. Если вы бросите исключение Bundler::Thor::Error, оно будет перехвачено и обернуто в методе ниже.
# File lib/bundler/vendor/thor/lib/thor/shell/basic.rb, line 244
def file_collision(destination)
return true if @always_force
options = block_given? ? "[Ynaqdh]" : "[Ynaqh]"
loop do
answer = ask(
%[Overwrite #{destination}? (enter "h" for help) #{options}],
:add_to_history => false
)
case answer
when nil
say ""
return true
when is?(:yes), is?(:force), ""
return true
when is?(:no), is?(:skip)
return false
when is?(:always)
return @always_force = true
when is?(:quit)
say "Aborting..."
raise SystemExit
when is?(:diff)
show_diff(destination, yield) if block_given?
say "Retrying..."
else
say file_collision_help
end
end
end Обрабатывает конфликты файлов и возвращает true, если файл должен быть перезаписан, и false в противном случае. Если задан блок, он использует ответ блока в качестве содержимого diff.
Параметры
- destination<String>
-
целевой файл для решения конфликтов
- block<Proc>
-
необязательный блок, возвращающий значение, используемое в diff
# File lib/bundler/vendor/thor/lib/thor/shell/basic.rb, line 39 def indent(count = 1) orig_padding = padding self.padding = padding + count yield self.padding = orig_padding end
Устанавливает отступ вывода при выполнении блока и сбрасывает его.
# File lib/bundler/vendor/thor/lib/thor/shell/basic.rb, line 18 def mute @mute = true yield ensure @mute = false end
Выключает вывод внутри данного блока
# File lib/bundler/vendor/thor/lib/thor/shell/basic.rb, line 27 def mute? @mute end
Проверяет, выключен ли вывод
# File lib/bundler/vendor/thor/lib/thor/shell/basic.rb, line 126 def no?(statement, color = nil) !!(ask(statement, color, :add_to_history => false) =~ is?(:no)) end
Задает вопрос пользователю и возвращает true, если пользователь отвечает «n» или «нет».
# File lib/bundler/vendor/thor/lib/thor/shell/basic.rb, line 33 def padding=(value) @padding = [0, value].max end
Устанавливает отступ вывода, не позволяя значениям быть меньше нуля.
# File lib/bundler/vendor/thor/lib/thor/shell/basic.rb, line 135
def print_in_columns(array)
return if array.empty?
colwidth = (array.map { |el| el.to_s.size }.max || 0) + 2
array.each_with_index do |value, index|
# Don't output trailing spaces when printing the last column
if ((((index + 1) % (terminal_width / colwidth))).zero? && !index.zero?) || index + 1 == array.length
stdout.puts value
else
stdout.printf("%-#{colwidth}s", value)
end
end
end Выводит значения в столбцы
Параметры
Массив[Строка, String, …]
# File lib/bundler/vendor/thor/lib/thor/shell/basic.rb, line 157
def print_table(array, options = {}) # rubocop:disable MethodLength
return if array.empty?
formats = []
indent = options[:indent].to_i
colwidth = options[:colwidth]
options[:truncate] = terminal_width if options[:truncate] == true
formats << "%-#{colwidth + 2}s".dup if colwidth
start = colwidth ? 1 : 0
colcount = array.max { |a, b| a.size <=> b.size }.size
maximas = []
start.upto(colcount - 1) do |index|
maxima = array.map { |row| row[index] ? row[index].to_s.size : 0 }.max
maximas << maxima
formats << if index == colcount - 1
# Don't output 2 trailing spaces when printing the last column
"%-s".dup
else
"%-#{maxima + 2}s".dup
end
end
formats[0] = formats[0].insert(0, " " * indent)
formats << "%s"
array.each do |row|
sentence = "".dup
row.each_with_index do |column, index|
maxima = maximas[index]
f = if column.is_a?(Numeric)
if index == row.size - 1
# Don't output 2 trailing spaces when printing the last column
"%#{maxima}s"
else
"%#{maxima}s "
end
else
formats[index]
end
sentence << f % column.to_s
end
sentence = truncate(sentence, options[:truncate]) if options[:truncate]
stdout.puts sentence
end
end Выводит таблицу.
Параметры
Массив[Массив[Строка, String, …]]
Опции
- indent<Целое число>
-
Отступает первый столбец на значение indent.
- colwidth<Целое число>
-
Принудительно устанавливает ширину первого столбца в colwidth пробелов.
# File lib/bundler/vendor/thor/lib/thor/shell/basic.rb, line 219
def print_wrapped(message, options = {})
indent = options[:indent] || 0
width = terminal_width - indent
paras = message.split("\n\n")
paras.map! do |unwrapped|
unwrapped.strip.tr("\n", " ").squeeze(" ").gsub(/.{1,#{width}}(?:\s|\Z)/) { ($& + 5.chr).gsub(/\n\005/, "\n").gsub(/\005/, "\n") }
end
paras.each do |para|
para.split("\n").each do |line|
stdout.puts line.insert(0, " " * indent)
end
stdout.puts unless para == paras.last
end
end Выводит длинную строку, переносит текст на следующую строку до текущей ширины терминала. Идеально подходит для вывода heredocs.
Параметры
Опции
- indent<Целое число>
-
Отступает каждую строку выводимого абзаца на значение indent.
# File lib/bundler/vendor/thor/lib/thor/shell/basic.rb, line 88
def say(message = "", color = nil, force_new_line = (message.to_s !~ /( |\t)\Z/))
buffer = prepare_message(message, *color)
buffer << "\n" if force_new_line && !message.to_s.end_with?("\n")
stdout.print(buffer)
stdout.flush
end Выводит сообщение пользователю. Если предложение заканчивается пробелом или табуляцией, новая строка не добавляется (вывод + сброс). В противном случае передается непосредственно в puts (поведение взято от Highline).
Пример
say(“Я знаю, что ты это знал.”)
# File lib/bundler/vendor/thor/lib/thor/shell/basic.rb, line 101
def say_status(status, message, log_status = true)
return if quiet? || log_status == false
spaces = " " * (padding + 1)
color = log_status.is_a?(Symbol) ? log_status : :green
status = status.to_s.rjust(12)
status = set_color status, color, true if color
buffer = "#{status}#{spaces}#{message}"
buffer = "#{buffer}\n" unless buffer.end_with?("\n")
stdout.print(buffer)
stdout.flush
end Выводит статус с заданным цветом и добавляет сообщение. Поскольку этот метод часто используется действиями, он позволяет передавать nil или false в log_status, чтобы не отображать сообщение. Если в log_status передаётся Symbol, он используется в качестве цвета.
# File lib/bundler/vendor/thor/lib/thor/shell/basic.rb, line 278
def terminal_width
result = if ENV["THOR_COLUMNS"]
ENV["THOR_COLUMNS"].to_i
else
unix? ? dynamic_width : 80
end
result < 10 ? 80 : result
rescue
80
end Этот код был скопирован из Rake, доступен по лицензии MIT. Авторское право © 2003, 2004 Jim Weirich
# File lib/bundler/vendor/thor/lib/thor/shell/basic.rb, line 119 def yes?(statement, color = nil) !!(ask(statement, color, :add_to_history => false) =~ is?(:yes)) end
Задает вопрос пользователю и возвращает true, если пользователь отвечает «y» или «да».
Защищённые методы экземпляра
# File lib/bundler/vendor/thor/lib/thor/shell/basic.rb, line 394 def as_unicode yield end
# File lib/bundler/vendor/thor/lib/thor/shell/basic.rb, line 424
def ask_filtered(statement, color, options)
answer_set = options[:limited_to]
correct_answer = nil
until correct_answer
answers = answer_set.join(", ")
answer = ask_simply("#{statement} [#{answers}]", color, options)
correct_answer = answer_set.include?(answer) ? answer : nil
say("Your response must be one of: [#{answers}]. Please try again.") unless correct_answer
end
correct_answer
end # File lib/bundler/vendor/thor/lib/thor/shell/basic.rb, line 407
def ask_simply(statement, color, options)
default = options[:default]
message = [statement, ("(#{default})" if default), nil].uniq.join(" ")
message = prepare_message(message, *color)
result = Bundler::Thor::LineEditor.readline(message, options)
return unless result
result = result.strip
if default && result == ""
default
else
result
end
end # File lib/bundler/vendor/thor/lib/thor/shell/basic.rb, line 312 def can_display_colors? false end
# File lib/bundler/vendor/thor/lib/thor/shell/basic.rb, line 366 def dynamic_width @dynamic_width ||= (dynamic_width_stty.nonzero? || dynamic_width_tput) end
Рассчитать динамическую ширину терминала
# File lib/bundler/vendor/thor/lib/thor/shell/basic.rb, line 370 def dynamic_width_stty `stty size 2>/dev/null`.split[1].to_i end
# File lib/bundler/vendor/thor/lib/thor/shell/basic.rb, line 374 def dynamic_width_tput `tput cols 2>/dev/null`.to_i end
# File lib/bundler/vendor/thor/lib/thor/shell/basic.rb, line 316 def lookup_color(color) return color unless color.is_a?(Symbol) self.class.const_get(color.to_s.upcase) end
# File lib/bundler/vendor/thor/lib/thor/shell/basic.rb, line 307 def prepare_message(message, *color) spaces = " " * padding spaces + set_color(message.to_s, *color) end
# File lib/bundler/vendor/thor/lib/thor/shell/basic.rb, line 325 def stderr $stderr end
# File lib/bundler/vendor/thor/lib/thor/shell/basic.rb, line 321 def stdout $stdout end
# File lib/bundler/vendor/thor/lib/thor/shell/basic.rb, line 382
def truncate(string, width)
as_unicode do
chars = string.chars.to_a
if chars.length <= width
chars.join
else
chars[0, width - 3].join + "..."
end
end
end # File lib/bundler/vendor/thor/lib/thor/shell/basic.rb, line 378 def unix? RUBY_PLATFORM =~ /(aix|darwin|linux|(net|free|open)bsd|cygwin|solaris|irix|hpux)/i end
Ruby Core © 1993–2017 Yukihiro Matsumoto
Licensed under the Ruby License.
Ruby Standard Library © contributors
Licensed under their own licenses.