class OptionsResolver

Public Class Methods

new() click to toggle source
# File lib/optionsresolver/optionsresolver.rb, line 8
def initialize
  @defined_options = []
  @required_options = []
  @default_values = {}
  @allowed_types = {}
  @allowed_values = {}
  @normalizers = {}
  @previous_default_values = {}
end

Public Instance Methods

get_allowed_types(option_key = nil) click to toggle source
# File lib/optionsresolver/optionsresolver.rb, line 101
def get_allowed_types option_key = nil
  return @allowed_types unless option_key

  @allowed_types[option_key]
end
get_allowed_values(option_key = nil) click to toggle source
# File lib/optionsresolver/optionsresolver.rb, line 113
def get_allowed_values option_key = nil
  return @allowed_values unless option_key

  @allowed_values
end
get_default_values(option_key = nil) click to toggle source
# File lib/optionsresolver/optionsresolver.rb, line 89
def get_default_values option_key = nil
  return @default_values unless option_key

  @default_values[option_key]
end
get_defined_options() click to toggle source
# File lib/optionsresolver/optionsresolver.rb, line 28
def get_defined_options
  @defined_options
end
get_missing_options() click to toggle source
# File lib/optionsresolver/optionsresolver.rb, line 60
def get_missing_options
  @required_options.map do |required_key|
    next if @default_values.include?(required_key)
    required_key
  end.compact
end
get_required_options() click to toggle source
# File lib/optionsresolver/optionsresolver.rb, line 48
def get_required_options
  @required_options
end
is_defined?(option_key) click to toggle source
# File lib/optionsresolver/optionsresolver.rb, line 32
def is_defined? option_key
  @defined_options.include? option_key
end
is_missing?(option_key) click to toggle source
# File lib/optionsresolver/optionsresolver.rb, line 56
def is_missing? option_key
  !@default_values.include? option_key
end
is_required?(option_key) click to toggle source
# File lib/optionsresolver/optionsresolver.rb, line 52
def is_required? option_key
  @required_options.include? option_key
end
resolve(data_object) click to toggle source
# File lib/optionsresolver/optionsresolver.rb, line 125
def resolve data_object
  raise InvalidParameter unless data_object.is_a? Hash

  # Unique @defined_options
  @defined_options.uniq!
  # Stringify hash keys
  data_object = data_object.stringify_keys
  # Check undefined options
  check_undefined_options data_object.keys
  # Set default values
  data_object = set_options_default data_object
  # Check missing required options
  check_missing_required_options data_object
  # Check invalid options type
  check_invalid_options_type data_object
  # Check invalid options value
  check_invalid_options_value data_object
  # Normalizer options value
  data_object = normalizer_options_value data_object

  data_object
end
set_allowed_types(option_key, option_value_types) click to toggle source
# File lib/optionsresolver/optionsresolver.rb, line 95
def set_allowed_types option_key, option_value_types
  @allowed_types[option_key] = option_value_types

  self
end
set_allowed_values(option_key, option_allowed_value) click to toggle source
# File lib/optionsresolver/optionsresolver.rb, line 107
def set_allowed_values option_key, option_allowed_value
  @allowed_values[option_key] = option_allowed_value

  self
end
set_default(option_key, default_value) click to toggle source
# File lib/optionsresolver/optionsresolver.rb, line 67
def set_default option_key, default_value
  @previous_default_values[option_key] = @default_values[option_key] if
    @default_values.include? option_key

  @default_values[option_key] = default_value
  self.set_defined option_key

  self
end
set_defaults(option_default_values) click to toggle source
# File lib/optionsresolver/optionsresolver.rb, line 77
def set_defaults option_default_values
  raise InvalidParameter unless option_default_values.is_a? Hash

  option_default_values.each do |opt_key, opt_value|
    opt_key = opt_key.to_s

    self.set_default(opt_key, opt_value).set_defined opt_key
  end

  self
end
set_defined(defined_keys) click to toggle source
# File lib/optionsresolver/optionsresolver.rb, line 18
def set_defined defined_keys
  if defined_keys.is_a?(Array)
    @defined_options.concat defined_keys
  else
    @defined_options.push defined_keys
  end

  self
end
set_normalizer(option_key, normalizer_value) click to toggle source
# File lib/optionsresolver/optionsresolver.rb, line 119
def set_normalizer option_key, normalizer_value
  @normalizers[option_key] = normalizer_value

  self
end
set_required(required_keys) click to toggle source
# File lib/optionsresolver/optionsresolver.rb, line 36
def set_required required_keys
  if required_keys.is_a?(Array)
    @required_options.concat required_keys
    @defined_options.concat required_keys
  else
    @required_options.push required_keys
    @defined_options.push required_keys
  end

  self
end

Private Instance Methods

check_invalid_options_type(data_object) click to toggle source
# File lib/optionsresolver/optionsresolver.rb, line 177
def check_invalid_options_type data_object
  @allowed_types.each do |option_key, allowed_type|
    option_key = option_key.to_s
    option_value = data_object[option_key]

    case allowed_type.downcase
    when "int", "integer"
      throw_invalid_options_exception option_key, option_value, "int" unless option_value.is_a? Integer
    when "str", "string"
      throw_invalid_options_exception option_key, option_value, "str" unless option_value.is_a? String
    when "arr", "array"
      throw_invalid_options_exception option_key, option_value, "array" unless option_value.is_a? Array
    when "bool", "boolean"
      throw_invalid_options_exception option_key, option_value, "boolean" unless [true, false].include? option_value
    when "float"
      throw_invalid_options_exception option_key, option_value, "float" unless option_value.is_a? Float
    when "hash"
      throw_invalid_options_exception option_key, option_value, "hash" unless option_value.is_a? Hash
    when "sym", "symbol"
      throw_invalid_options_exception option_key, option_value, "symbol" unless option_value.is_a? Symbol
    when "range"
      throw_invalid_options_exception option_key, option_value, "range" unless option_value.is_a? Range
    when "regexp"
      throw_invalid_options_exception option_key, option_value, "regexp" unless option_value.is_a? Regexp
    when "proc"
      throw_invalid_options_exception option_key, option_value, "proc" unless option_value.is_a? Proc
    end
  end
end
check_invalid_options_value(data_object) click to toggle source
# File lib/optionsresolver/optionsresolver.rb, line 207
def check_invalid_options_value data_object
  @allowed_values.each do |option_key, allowed_value|
    option_key = option_key.to_s
    option_value = data_object[option_key]
    is_valid_value = true
    accepted_value_msg = ""

    if allowed_value.is_a? Array
      is_valid_value = allowed_value.include? option_value
      accepted_value_msg = " Accepted values are \"#{allowed_value.join("\", \"")}\""
    elsif allowed_value.is_a? Proc
      is_valid_value = allowed_value.call option_value
    else
      is_valid_value = (option_value == allowed_value)
    end

    raise "The option \"#{option_key}\" with value \"#{option_value}\" is invalid.#{accepted_value_msg}" unless is_valid_value
  end
end
check_missing_required_options(data_object) click to toggle source
# File lib/optionsresolver/optionsresolver.rb, line 169
def check_missing_required_options data_object
  @required_options.each do |required_key|
    next if data_object[required_key.to_s]

    raise MissingOptions, "The required options \"#{required_key}\" is missing."
  end
end
check_undefined_options(option_keys) click to toggle source
# File lib/optionsresolver/optionsresolver.rb, line 149
def check_undefined_options option_keys
  know_options_str = "\"#{@defined_options.join("\", \"")}\""

  option_keys.each do |opt_key|
    raise UndefinedOptions, "The option \"#{opt_key}\" does not exist. Know options are: #{know_options_str}" unless
      @defined_options.include? opt_key.to_s
  end
end
normalizer_options_value(data_object) click to toggle source
# File lib/optionsresolver/optionsresolver.rb, line 227
def normalizer_options_value data_object
  @normalizers.each do |option_key, normalizer_method|
    raise InvalidParameter "Normalizer for key \"#{option_key}\" has invalid method." unless normalizer_method.is_a? Proc

    option_value = data_object[option_key]
    data_object[option_key] = normalizer_method.call data_object, option_value
  end

  data_object
end
set_options_default(data_object) click to toggle source
# File lib/optionsresolver/optionsresolver.rb, line 158
def set_options_default data_object
  @default_values.each do |option_key, default_value|
    next unless data_object[option_key].nil?

    previous_default_value = @previous_default_values[option_key]
    data_object[option_key] = default_value.is_a?(Proc) ? default_value.call(data_object, previous_default_value) : default_value
  end

  data_object
end
throw_invalid_options_exception(key, val, expected_type) click to toggle source
# File lib/optionsresolver/optionsresolver.rb, line 238
def throw_invalid_options_exception key, val, expected_type
  msg = "The option \"#{key}\" with \"#{val}\" is expected to be of type \"#{expected_type}\""
  raise InvalidOptions, msg
end