lib/tty/prompt/question.rb in tty-prompt-0.21.0 vs lib/tty/prompt/question.rb in tty-prompt-0.22.0

- old
+ new

@@ -1,13 +1,13 @@ # frozen_string_literal: true -require_relative 'converters' -require_relative 'evaluator' -require_relative 'question/modifier' -require_relative 'question/validation' -require_relative 'question/checks' -require_relative 'utils' +require_relative "converters" +require_relative "evaluator" +require_relative "question/modifier" +require_relative "question/validation" +require_relative "question/checks" +require_relative "utils" module TTY # A class responsible for shell prompt interactions. class Prompt # A class responsible for gathering user input @@ -33,35 +33,43 @@ # Initialize a Question # # @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 } + # Option deprecation + if options[:validation] + warn "[DEPRECATION] The `:validation` option is deprecated. Use `:validate` instead." + options[:validate] = options[:validation] + end + + @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(:validate) { 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 } - @value = options.fetch(:value) { UndefinedSetting } - @messages = Utils.deep_copy(options.fetch(:messages) { { } }) - @done = false + @help_color = options.fetch(:help_color) { @prompt.help_color } + @error_color = options.fetch(:error_color) { :red } + @value = options.fetch(:value) { UndefinedSetting } + @quiet = options.fetch(:quiet) { @prompt.quiet } + @messages = Utils.deep_copy(options.fetch(:messages) { { } }) + @done = false @first_render = true - @input = nil + @input = nil @evaluator = Evaluator.new(self) @evaluator << CheckRequired @evaluator << CheckDefault @evaluator << CheckRange @evaluator << CheckValidation @evaluator << CheckModifier + @evaluator << CheckConversion end # Stores all the error messages displayed to user # The currently supported messages are: # * :range? @@ -83,22 +91,22 @@ def message_for(name, tokens = nil) template = @messages[name] if template && !template.match(/\%\{/).nil? [template % tokens] else - [template || ''] + [template || ""] end end # Call the question # # @param [String] message # # @return [self] # # @api public - def call(message = '', &block) + def call(message = "", &block) @message = message block.call(self) if block @prompt.subscribe(self) do render end @@ -120,12 +128,12 @@ 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) + @prompt.print(render_question) unless @quiet + result.value end # Render question # # @return [String] @@ -139,11 +147,11 @@ if !echo? header elsif @done header << @prompt.decorate(@input.to_s, @active_color) elsif default? && !Utils.blank?(@default) - header << @prompt.decorate("(#{default})", @help_color) + ' ' + header << @prompt.decorate("(#{default})", @help_color) + " " end header << "\n" if @done header.join end @@ -175,11 +183,11 @@ # @return [String] # # @api private def render_error(errors) errors.reduce([]) do |acc, err| - acc << @prompt.decorate('>>', :red) + ' ' + err + acc << @prompt.decorate(">>", :red) + " " + err acc end.join("\n") end # Determine area of the screen to clear @@ -209,22 +217,32 @@ # # @param [Object] value # # @api private def convert_result(value) - if convert? & !Utils.blank?(value) - Converters.convert(@convert, value) + if convert? && !Utils.blank?(value) + case @convert + when Proc + @convert.call(value) + else + Converters.convert(@convert, value) + end else value end end # Specify answer conversion # # @api public - def convert(value) - @convert = value + def convert(value = (not_set = true), message = nil) + messages[:convert?] = message if message + if not_set + @convert + else + @convert = value + end end # Check if conversion is set # # @return [Boolean] @@ -341,9 +359,16 @@ # @return [Boolean] # # @api public def in? @in != UndefinedSetting + end + + # Set quiet mode. + # + # @api public + def quiet(value) + @quiet = value end # @api public def to_s message.to_s