Spec-Zone.ru › Ruby 2.6

класс Bundler::Thor::Shell::Basic

Родитель:
Объект

Атрибуты

base[RW]
padding[R]

Публичные методы экземпляров

ask(statement, *args) Показать исходный код
# 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)

error(statement) Показать исходный код
# 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_collision(destination) { || ... } Показать исходный код
# 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

indent(count = 1) { || ... } Показать исходный код
# 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

Устанавливает отступ вывода при выполнении блока и сбрасывает его.

mute() { || ... } Показать исходный код
# File lib/bundler/vendor/thor/lib/thor/shell/basic.rb, line 18
def mute
  @mute = true
  yield
ensure
  @mute = false
end

Выключает вывод внутри данного блока

mute?() Показать исходный код
# File lib/bundler/vendor/thor/lib/thor/shell/basic.rb, line 27
def mute?
  @mute
end

Проверяет, выключен ли вывод

no?(statement, color = nil) Показать исходный код
# 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» или «нет».

padding=(value) Показать исходный код
# File lib/bundler/vendor/thor/lib/thor/shell/basic.rb, line 33
def padding=(value)
  @padding = [0, value].max
end

Устанавливает отступ вывода, не позволяя значениям быть меньше нуля.

print_in_columns(array) Показать исходный код
# 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, …]

print_table(array, options = {}) Показать исходный код
# 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 пробелов.

print_wrapped(message, options = {}) Показать исходный код
# 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.

Параметры

String

Опции

indent<Целое число>

Отступает каждую строку выводимого абзаца на значение indent.

say(message = "", color = nil, force_new_line = (message.to_s !~ /( |\t)\Z/)) Показать исходный код
# 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(“Я знаю, что ты это знал.”)

say_status(status, message, log_status = true) Показать исходный код
# 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, он используется в качестве цвета.

terminal_width() Показать исходный код
# 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

yes?(statement, color = nil) Показать исходный код
# 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» или «да».

Защищённые методы экземпляра

as_unicode() { || ... } Показать исходный код
# File lib/bundler/vendor/thor/lib/thor/shell/basic.rb, line 394
def as_unicode
  yield
end
ask_filtered(statement, color, options) Показать исходный код
# 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
ask_simply(statement, color, options) Показать исходный код
# 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
can_display_colors?() Показать исходный код
# File lib/bundler/vendor/thor/lib/thor/shell/basic.rb, line 312
def can_display_colors?
  false
end
dynamic_width() Показать исходный код
# 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

Рассчитать динамическую ширину терминала

dynamic_width_stty() Показать исходный код
# 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
dynamic_width_tput() Показать исходный код
# File lib/bundler/vendor/thor/lib/thor/shell/basic.rb, line 374
def dynamic_width_tput
  `tput cols 2>/dev/null`.to_i
end
lookup_color(color) Показать исходный код
# 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
prepare_message(message, *color) Показать исходный код
# 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
stderr() Показать исходный код
# File lib/bundler/vendor/thor/lib/thor/shell/basic.rb, line 325
def stderr
  $stderr
end
stdout() Показать исходный код
# File lib/bundler/vendor/thor/lib/thor/shell/basic.rb, line 321
def stdout
  $stdout
end
truncate(string, width) Показать исходный код
# 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
unix?() Показать исходный код
# 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.

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API