class Pineapples::Setting

Constants

VALID_TYPES

Attributes

default[R]
name[R]
options[R]
question[R]
type[R]
value[RW]

Public Class Methods

new(name, options = {}) click to toggle source
# File lib/pineapples/setting.rb, line 8
def initialize(name, options = {})
  raise ArgumentError, "option name can't be nil" if name.nil?
  raise ArgumentError, "type can't be nil"        if options[:type].nil?

  type = options[:type].to_sym

  raise ArgumentError, "Type :#{type} is not valid for options." if type && !valid_type?(type)

  @name     = name
  @type     = type || :string
  @default  = options[:default]
  @value    = @default if @default
  @question = options[:prompt]
  @options  = Array(options[:options])

  validate_options_type!
  validate_type!(default)
  validate_value_in_options!(default)
end

Public Instance Methods

ask_setting() click to toggle source
# File lib/pineapples/setting.rb, line 52
def ask_setting
  if has_options?
    ask_with_options
  else
    if boolean?
      ask_boolean
    else
      ask
    end
  end
end
has_default?() click to toggle source
# File lib/pineapples/setting.rb, line 38
def has_default?
  @default || (@default == false)
end
has_options?() click to toggle source
# File lib/pineapples/setting.rb, line 42
def has_options?
  @options.present?
end
valid_type?(type) click to toggle source
# File lib/pineapples/setting.rb, line 34
def valid_type?(type)
  VALID_TYPES.include?(type)
end
value=(setting) click to toggle source
# File lib/pineapples/setting.rb, line 28
def value=(setting)
  validate_type!(setting)
  validate_value_in_options!(setting)
  @value = setting
end

Private Instance Methods

ask() click to toggle source
# File lib/pineapples/setting.rb, line 81
def ask
  puts
  answer = Ask.input(question_string, inquirer_options)
  puts

  self.value = cast_to_type(answer)
end
ask_boolean() click to toggle source
# File lib/pineapples/setting.rb, line 74
def ask_boolean
  puts
  answer = Ask.confirm(question_string, inquirer_options)
  puts
  self.value = cast_to_type(answer)
end
ask_with_options() click to toggle source
# File lib/pineapples/setting.rb, line 66
def ask_with_options
  puts
  index = Ask.list(question_string, options_with_color, inquirer_options)
  puts
  answer = options[index]
  self.value = cast_to_type(answer)
end
cast_to_type(setting) click to toggle source
# File lib/pineapples/setting.rb, line 103
def cast_to_type(setting)
  case type
  when :numeric
    setting.to_f
  when :string
    setting.to_s
  when :symbol
    setting.to_sym
  else
    setting
  end
end
default_string() click to toggle source
# File lib/pineapples/setting.rb, line 99
def default_string
  " (default: #{default})".light_green
end
get_type_class() click to toggle source
# File lib/pineapples/setting.rb, line 146
def get_type_class
  Object.const_get(type.to_s.capitalize)
end
inquirer_options() click to toggle source
# File lib/pineapples/setting.rb, line 150
def inquirer_options
  {clear: false, response: false}
end
options_with_color() click to toggle source
# File lib/pineapples/setting.rb, line 95
def options_with_color
  options.map{ |option| option.to_s.light_blue }
end
question_string() click to toggle source
# File lib/pineapples/setting.rb, line 89
def question_string
  result = ' ' * $terminal.indent_size
  result << question.light_yellow
  result << default_string if has_default?
end
validate_options_type!() click to toggle source
# File lib/pineapples/setting.rb, line 140
def validate_options_type!
  if options.any?{ |option| !validate_type(option) }
    raise ArgumentError, "Option #{option} value doesn't match setting type"
  end
end
validate_type(setting) click to toggle source
# File lib/pineapples/setting.rb, line 116
def validate_type(setting)
  value_type = case setting
               when nil
                 return true
               when TrueClass, FalseClass
                 :boolean
               when Numeric, Hash, Array, String, Symbol
                 setting.class.name.downcase.to_sym
               end
  type == value_type
end
validate_type!(setting) click to toggle source
# File lib/pineapples/setting.rb, line 128
def validate_type!(setting)
  if !validate_type(setting)
    raise ArgumentError, "Setting's value must match its type."
  end
end
validate_value_in_options!(setting) click to toggle source
# File lib/pineapples/setting.rb, line 134
def validate_value_in_options!(setting)
  if has_options? && !options.include?(setting)
    raise ArgumentError, "New setting value must be one of the options"
  end
end