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