module UserPrefs

Constants

VERSION

Public Class Methods

included(base) click to toggle source
# File lib/user_prefs.rb, line 10
def included(base)
  validate_column_and_type(base) unless RUBY_ENGINE == :opal

  base.class_eval do
    class_attribute :defined_prefs, :default_prefs

    self.defined_prefs ||= []
    self.default_prefs ||= {}

    serialize(prefs_column.to_sym, RUBY_ENGINE == 'opal' ? Hash : HashWithIndifferentAccess)
  end

  base.extend(ClassMethods)
end

Private Class Methods

name_conflict?(base) click to toggle source
# File lib/user_prefs.rb, line 31
def name_conflict?(base)
  base.prefs_column == 'prefs'
end
no_column?(base) click to toggle source
# File lib/user_prefs.rb, line 27
def no_column?(base)
  !base.columns_hash[base.prefs_column]
end
validate_column_and_type(base) click to toggle source
# File lib/user_prefs.rb, line 40
def validate_column_and_type(base)
  raise ColumnError, "Preference column name cannot be named 'prefs'." if name_conflict?(base)
  raise ColumnError, "#{base.name} must have column '#{base.prefs_column}'." if no_column?(base)
  raise ColumnError, "#{base.prefs_column} must be of type 'text'." if wrong_type?(base)
end
wrong_type?(base) click to toggle source
# File lib/user_prefs.rb, line 35
def wrong_type?(base)
  base.columns_hash[base.prefs_column] &&
    base.columns_hash[base.prefs_column].type.to_s != 'text'
end

Public Instance Methods

add_pref(key, value) click to toggle source
# File lib/user_prefs.rb, line 51
def add_pref(key, value)
  self.prefs_attr = prefs_attr.merge(Hash[key, value])
end
delete_pref(key) click to toggle source
# File lib/user_prefs.rb, line 55
def delete_pref(key)
  self.prefs_attr = prefs_attr.reject { |k, _v| k.to_s == key.to_s }
end
method_missing(method_name, *args, &block) click to toggle source
Calls superclass method
# File lib/user_prefs.rb, line 59
def method_missing(method_name, *args, &block)
  if (match_data = method_name.to_s.match(/(\w+)_pref(=|\?)?/))
    preference_method(match_data[1], match_data[2], args.first)
  else
    super
  end
end
prefs() click to toggle source
# File lib/user_prefs.rb, line 47
def prefs
  prefs_attr.merge(Hash[self.class.defined_prefs.map { |k| [k, send("#{k}_pref")] }])
end
respond_to_missing?(method_name, include_private = false) click to toggle source
Calls superclass method
# File lib/user_prefs.rb, line 67
def respond_to_missing?(method_name, include_private = false)
  method_name =~ /(\w+)_pref(=|\?)?/ || super
end

Private Instance Methods

preference_method(key, method = nil, new_value = nil) click to toggle source
# File lib/user_prefs.rb, line 81
def preference_method(key, method = nil, new_value = nil)
  case method
  when '?' then prefs_attr.key?(key)
  when '=' then prefs_attr[key] = new_value
  else prefs_attr[key]
  end
end
prefs_attr() click to toggle source
# File lib/user_prefs.rb, line 73
def prefs_attr
  send(self.class.prefs_column)
end
prefs_attr=(value) click to toggle source
# File lib/user_prefs.rb, line 77
def prefs_attr=(value)
  send("#{self.class.prefs_column}=", value)
end