class TTY::Prompt::Question

@api public
A class responsible for gathering user input

def call(message, &block)

Other tags:
    Api: - public

Returns:
  • (self) -

Parameters:
  • message (String) --
def call(message, &block)
  return if Utils.blank?(message)
  @message = message
  block.call(self) if block
  @prompt.subscribe(self) do
    render
  end
end

def convert(value)

Other tags:
    Api: - public
def convert(value)
  @convert = value
end

def convert?

Other tags:
    Api: - public

Returns:
  • (Boolean) -
def convert?
  @convert != UndefinedSetting
end

def convert_result(value)

Other tags:
    Api: - private

Parameters:
  • value (Object) --
def convert_result(value)
  if convert? & !Utils.blank?(value)
    Converters.convert(@convert, value)
  else
    value
  end
end

def default(value = (not_set = true))

Other tags:
    Api: - public
def default(value = (not_set = true))
  return @default if not_set
  @default = value
end

def default?

Other tags:
    Api: - public

Returns:
  • (Boolean) -
def default?
  @default != UndefinedSetting
end

def echo(value = nil)

Other tags:
    Api: - public
def echo(value = nil)
  return @echo if value.nil?
  @echo = value
end

def in(value = (not_set = true), message = nil)

Other tags:
    Api: - public

Parameters:
  • value (String) --
def in(value = (not_set = true), message = nil)
  messages[:range?] = message if message
  if in? && !@in.is_a?(Range)
    @in = Converters.convert(:range, @in)
  end
  return @in if not_set
  @in = Converters.convert(:range, value)
end

def in?

Other tags:
    Api: - public

Returns:
  • (Boolean) -
def in?
  @in != UndefinedSetting
end

def initialize(prompt, options = {})

Other tags:
    Api: - public
def initialize(prompt, options = {})
  @prompt     = prompt
  @prefix     = options.fetch(:prefix) { @prompt.prefix }
  @default    = options.fetch(:default) { UndefinedSetting }
  @required   = options.fetch(:required) { false }
  @echo       = options.fetch(:echo) { true }
  @in         = options.fetch(:in) { UndefinedSetting }
  @modifier   = options.fetch(:modifier) { [] }
  @validation = options.fetch(:validation) { UndefinedSetting }
  @convert    = options.fetch(:convert) { UndefinedSetting }
  @active_color = options.fetch(:active_color) { @prompt.active_color }
  @help_color = options.fetch(:help_color) { @prompt.help_color }
  @error_color = options.fetch(:error_color) { :red }
  @messages   = Utils.deep_copy(options.fetch(:messages) { { } })
  @done       = false
  @input      = nil
  @evaluator = Evaluator.new(self)
  @evaluator << CheckRequired
  @evaluator << CheckDefault
  @evaluator << CheckRange
  @evaluator << CheckValidation
  @evaluator << CheckModifier
end

def inspect

Other tags:
    Api: - public
def inspect
  "#<#{self.class.name} @message=#{message}, @input=#{@input}>"
end

def message_for(name, tokens = nil)

Other tags:
    Api: - private

Returns:
  • (Array[String]) -

Parameters:
  • tokens (Hash) --
  • name (Symbol) --
def message_for(name, tokens = nil)
  template = @messages[name]
  if template && !template.match(/\%\{/).nil?
    [template % tokens]
  else
    [template || '']
  end
end

def modify(*rules)

Other tags:
    Api: - public

Parameters:
  • rule (Symbol) --
def modify(*rules)
  @modifier = rules
end

def process_input(question)

Other tags:
    Api: - private
def process_input(question)
  @input = read_input(question)
  if Utils.blank?(@input)
    @input = default? ? default : nil
  end
  @evaluator.(@input)
end

def raw(value = nil)

Other tags:
    Api: - public
def raw(value = nil)
  return @raw if value.nil?
  @raw = value
end

def read_input(question)

Other tags:
    Api: - private
def read_input(question)
  @prompt.read_line(question, echo: echo).chomp
end

def refresh(lines, lines_to_clear)

Other tags:
    Api: - private

Returns:
  • (String) -

Parameters:
  • lines (Integer) --
def refresh(lines, lines_to_clear)
  output = []
  if @done
    if @errors.count.zero?
      output << @prompt.cursor.up(lines)
    else
      lines += @errors.count
      lines_to_clear += @errors.count
    end
  else
    output << @prompt.cursor.up(lines)
  end
  output.join + @prompt.clear_lines(lines_to_clear)
end

def render

Other tags:
    Api: - private
def render
  @errors = []
  until @done
    result = process_input(render_question)
    if result.failure?
      @errors = result.errors
      @prompt.print(render_error(result.errors))
    else
      @done = true
    end
    question    = render_question
    input_line  = question + result.value.to_s
    total_lines = @prompt.count_screen_lines(input_line)
    @prompt.print(refresh(question.lines.count, total_lines))
  end
  @prompt.print(render_question)
  convert_result(result.value)
end

def render_error(errors)

Other tags:
    Api: - private

Returns:
  • (String) -
def render_error(errors)
  errors.reduce([]) do |acc, err|
    acc << @prompt.decorate('>>', :red) + ' ' + err
    acc
  end.join("\n")
end

def render_question

Other tags:
    Api: - private

Returns:
  • (String) -
def render_question
  header = ["#{@prefix}#{message} "]
  if !echo?
    header
  elsif @done
    header << @prompt.decorate(@input.to_s, @active_color)
  elsif default? && !Utils.blank?(@default)
    header << @prompt.decorate("(#{default})", @help_color) + ' '
  end
  header << "\n" if @done
  header.join
end

def required(value = (not_set = true), message = nil)

Other tags:
    Api: - public

Returns:
  • (Boolean) -
def required(value = (not_set = true), message = nil)
  messages[:required?] = message if message
  return @required if not_set
  @required = value
end

def to_s

Other tags:
    Api: - public
def to_s
  message.to_s
end

def validate(value = nil, message = nil, &block)

Other tags:
    Api: - public

Returns:
  • (Question) -

Parameters:
  • value (Object) --
def validate(value = nil, message = nil, &block)
  messages[:valid?] = message if message
  @validation = (value || block)
end

def validation?

def validation?
  @validation != UndefinedSetting
end