class UserInput::Prompt

Prompt object

Public Class Methods

new(params = {}, &block) click to toggle source

Build new prompt object and set defaults

# File lib/userinput/prompt.rb, line 9
def initialize(params = {}, &block)
  @attempts = params[:attempts]
  @message = params[:message] || ''
  @separator = params[:separator] || '?'
  @default = params[:default]
  @secret = params[:secret] || false
  @fd = params[:fd] || STDOUT
  @validation = block || params[:validation]
end

Public Instance Methods

ask() click to toggle source

Request user input

# File lib/userinput/prompt.rb, line 21
def ask
  @fd.print full_message
  disable_echo if @secret

  input = _ask
  return input if valid(input)

  check_counter
  ask
ensure
  enable_echo if @secret
end

Private Instance Methods

_ask() click to toggle source

Parse user input

# File lib/userinput/prompt.rb, line 55
def _ask
  input = STDIN.gets.chomp
  input = @default if input.empty? && @default
  @fd.puts if @secret
  input
end
check_counter() click to toggle source

Track attempt counter

# File lib/userinput/prompt.rb, line 64
def check_counter
  return if @attempts.nil?
  @attempts -= 1
  raise ArgumentError, 'No valid input provided' if @attempts.zero?
end
disable_echo() click to toggle source

Disable terminal display of user input

# File lib/userinput/prompt.rb, line 72
def disable_echo
  toggle_echo false
end
enable_echo() click to toggle source

Enable terminal display of user input

# File lib/userinput/prompt.rb, line 78
def enable_echo
  toggle_echo true
end
full_message() click to toggle source
# File lib/userinput/prompt.rb, line 36
def full_message
  MESSAGE_TEMPLATE % {
    message: @message,
    separator: @separator,
    default: @default.nil? ? '' : "[#{@default}] "
  }
end
toggle_echo(state) click to toggle source

Toggle terminal display of user input

# File lib/userinput/prompt.rb, line 84
def toggle_echo(state)
  setting = state ? '' : '-'
  `stty #{setting}echo`
rescue
  nil
end
valid(input) click to toggle source

Validate user input

# File lib/userinput/prompt.rb, line 46
def valid(input)
  return true unless @validation
  _, method = VALIDATIONS.find { |klass, _| @validation.is_a? klass }
  return @validation.send(method, input) if method
  raise "Supported validation type not provided #{@validation.class}"
end