module Spreeference::Preferable

Public Instance Methods

clear_preferences() click to toggle source
# File lib/spreeference/preferable.rb, line 51
def clear_preferences
  preferences.keys.each {|pref| preferences.delete pref}
end
default_preferences() click to toggle source
# File lib/spreeference/preferable.rb, line 43
def default_preferences
  Hash[
    defined_preferences.map do |preference|
      [preference, preference_default(preference)]
    end
  ]
end
defined_preferences() click to toggle source
# File lib/spreeference/preferable.rb, line 37
def defined_preferences
  methods.grep(/\Apreferred_.*=\Z/).map do |pref_method|
    pref_method.to_s.gsub(/\Apreferred_|=\Z/, '').to_sym
  end
end
get_preference(name) click to toggle source
# File lib/spreeference/preferable.rb, line 9
def get_preference(name)
  has_preference! name
  send self.class.preference_getter_method(name)
end
has_preference!(name) click to toggle source
# File lib/spreeference/preferable.rb, line 29
def has_preference!(name)
  raise NoMethodError.new "#{name} preference not defined" unless has_preference? name
end
has_preference?(name) click to toggle source
# File lib/spreeference/preferable.rb, line 33
def has_preference?(name)
  respond_to? self.class.preference_getter_method(name)
end
preference_default(name) click to toggle source
# File lib/spreeference/preferable.rb, line 24
def preference_default(name)
  has_preference! name
  send self.class.preference_default_getter_method(name)
end
preference_type(name) click to toggle source
# File lib/spreeference/preferable.rb, line 19
def preference_type(name)
  has_preference! name
  send self.class.preference_type_getter_method(name)
end
set_preference(name, value) click to toggle source
# File lib/spreeference/preferable.rb, line 14
def set_preference(name, value)
  has_preference! name
  send self.class.preference_setter_method(name), value
end

Private Instance Methods

convert_preference_value(value, type) click to toggle source
# File lib/spreeference/preferable.rb, line 57
def convert_preference_value(value, type)
  case type
  when :string, :text
    value.to_s
  when :password
    value.to_s
  when :decimal
    BigDecimal.new(value.to_s)
  when :integer
    value.to_i
  when :boolean
    if value.is_a?(FalseClass) ||
       value.nil? ||
       value == 0 ||
       value =~ /^(f|false|0)$/i ||
       (value.respond_to? :empty? and value.empty?)
       false
    else
       true
    end
  when :array
    value.is_a?(Array) ? value : Array.wrap(value)
  when :hash
    case value.class.to_s
    when "Hash"
      value
    when "String"
      # only works with hashes whose keys are strings
      JSON.parse value.gsub('=>', ':')
    when "Array"
      begin
        value.try(:to_h)
      rescue TypeError
        Hash[*value]
      rescue ArgumentError
        raise 'An even count is required when passing an array to be converted to a hash'
      end
    else
      value.class.ancestors.include?(Hash) ? value : {}
    end
  else
    value
  end
end