Spec-Zone.ru › Ruby 2.7

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

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

Константы

DEFAULT_TERMINAL_WIDTH

Атрибуты

base[RW]
padding[R]

Открытые методы экземпляров

ask(statement, *args) Показать исходный код
# File lib/bundler/vendor/thor/lib/thor/shell/basic.rb, line 78
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(“Какая планета дальше всего от Солнца?”, :default => “Плутон”)

ask(“Какой ваш любимый неаполитанский вкус?”, :limited_to => [“клубника”, “шоколад”, “ванили”])

ask(“Ваш пароль?”, :echo => false)

ask(“Куда сохранить файл?”, :path => true)

error(statement) Показать исходный код
# File lib/bundler/vendor/thor/lib/thor/shell/basic.rb, line 321
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 264
def file_collision(destination)
  return true if @always_force
  options = block_given? ? "[Ynaqdhm]" : "[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..."
    when is?(:merge)
      if block_given? && !merge_tool.empty?
        merge(destination, yield)
        return nil
      end

      say "Please specify merge tool to `THOR_MERGE` env."
    else
      say file_collision_help
    end
  end
end

Обрабатывает конфликт имен файлов и возвращает true, если файл следует перезаписать, и false в противном случае. Если передан блок, он использует ответ блока в качестве содержимого для разницы.

Параметры

destination<String>

файл назначения для решения конфликтов

block<Proc>

необязательный блок, который возвращает значение, используемое в разнице и слиянии

indent(count = 1) { || ... } Показать исходный код
# File lib/bundler/vendor/thor/lib/thor/shell/basic.rb, line 41
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 20
def mute
  @mute = true
  yield
ensure
  @mute = false
end

Отключает все, что находится внутри данного блока

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

Проверяет, заглушен ли base

no?(statement, color = nil) Показать исходный код
# File lib/bundler/vendor/thor/lib/thor/shell/basic.rb, line 134
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 35
def padding=(value)
  @padding = [0, value].max
end

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

print_in_columns(array) Показать исходный код
# File lib/bundler/vendor/thor/lib/thor/shell/basic.rb, line 143
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 165
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 227
def print_wrapped(message, options = {})
  indent = options[:indent] || 0
  width = terminal_width - indent
  paras = message.split("\n\n")

  paras.map! do |unwrapped|
    counter = 0
    unwrapped.split(" ").inject do |memo, word|
      word = word.gsub(/\n\005/, "\n").gsub(/\005/, "\n")
      counter = 0 if word.include? "\n"
      if (counter + word.length + 1) < width
        memo = "#{memo} #{word}"
        counter += (word.length + 1)
      else
        memo = "#{memo}\n#{word}"
        counter = word.length
      end
      memo
    end
  end.compact!

  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 96
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

Выводит (печатает) что-либо пользователю. Если предложение заканчивается пробелом или символом табуляции, новая строка не добавляется (print + flush). В противном случае передаются непосредственно в puts (поведение взято от Highline).

Пример

say(“Я знаю, что вы это знали.”)

say_status(status, message, log_status = true) Показать исходный код
# File lib/bundler/vendor/thor/lib/thor/shell/basic.rb, line 109
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 305
def terminal_width
  result = if ENV["THOR_COLUMNS"]
    ENV["THOR_COLUMNS"].to_i
  else
    unix? ? dynamic_width : DEFAULT_TERMINAL_WIDTH
  end
  result < 10 ? DEFAULT_TERMINAL_WIDTH : result
rescue
  DEFAULT_TERMINAL_WIDTH
end

Этот код скопирован из Rake, доступен по MIT-LICENSE Авторские права © 2003, 2004 Jim Weirich

yes?(statement, color = nil) Показать исходный код
# File lib/bundler/vendor/thor/lib/thor/shell/basic.rb, line 127
def yes?(statement, color = nil)
  !!(ask(statement, color, :add_to_history => false) =~ is?(:yes))
end

Задает вопрос пользователю и возвращает true, если пользователь отвечает “y” или “да”.

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

answer_match(possibilities, answer, case_insensitive) Показать исходный код
# File lib/bundler/vendor/thor/lib/thor/shell/basic.rb, line 465
def answer_match(possibilities, answer, case_insensitive)
  if case_insensitive
    possibilities.detect{ |possibility| possibility.downcase == answer.downcase }
  else
    possibilities.detect{ |possibility| possibility == answer }
  end
end
as_unicode() { || ... } Показать исходный код
# File lib/bundler/vendor/thor/lib/thor/shell/basic.rb, line 422
def as_unicode
  yield
end
ask_filtered(statement, color, options) Показать исходный код
# File lib/bundler/vendor/thor/lib/thor/shell/basic.rb, line 452
def ask_filtered(statement, color, options)
  answer_set = options[:limited_to]
  case_insensitive = options.fetch(:case_insensitive, false)
  correct_answer = nil
  until correct_answer
    answers = answer_set.join(", ")
    answer = ask_simply("#{statement} [#{answers}]", color, options)
    correct_answer = answer_match(answer_set, answer, case_insensitive)
    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 435
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 339
def can_display_colors?
  false
end
dynamic_width() Показать исходный код
# File lib/bundler/vendor/thor/lib/thor/shell/basic.rb, line 394
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 398
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 402
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 343
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 334
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 352
def stderr
  $stderr
end
stdout() Показать исходный код
# File lib/bundler/vendor/thor/lib/thor/shell/basic.rb, line 348
def stdout
  $stdout
end
truncate(string, width) Показать исходный код
# File lib/bundler/vendor/thor/lib/thor/shell/basic.rb, line 410
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 406
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