class TTY::Prompt::Question
@api public
A class responsible for gathering user input
def call(message, &block)
- 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)
- Api: - public
def convert(value) @convert = value end
def convert?
- Api: - public
Returns:
-
(Boolean)-
def convert? @convert != UndefinedSetting end
def convert_result(value)
- 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))
- Api: - public
def default(value = (not_set = true)) return @default if not_set @default = value end
def default?
- Api: - public
Returns:
-
(Boolean)-
def default? @default != UndefinedSetting end
def echo(value = nil)
- Api: - public
def echo(value = nil) return @echo if value.nil? @echo = value end
def in(value = (not_set = true), message = nil)
- 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?
- Api: - public
Returns:
-
(Boolean)-
def in? @in != UndefinedSetting end
def initialize(prompt, options = {})
- 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
- Api: - public
def inspect "#<#{self.class.name} @message=#{message}, @input=#{@input}>" end
def message_for(name, tokens = nil)
- 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)
- Api: - public
Parameters:
-
rule(Symbol) --
def modify(*rules) @modifier = rules end
def process_input(question)
- 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)
- Api: - public
def raw(value = nil) return @raw if value.nil? @raw = value end
def read_input(question)
- Api: - private
def read_input(question) @prompt.read_line(question, echo: echo).chomp end
def refresh(lines, lines_to_clear)
- 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
- 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)
- 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
- 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)
- 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
- Api: - public
def to_s message.to_s end
def validate(value = nil, message = nil, &block)
- 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