lib/rails-settings/settings.rb in rails-settings-cached-0.5.6 vs lib/rails-settings/settings.rb in rails-settings-cached-0.6.0

- old
+ new

@@ -1,9 +1,119 @@ module RailsSettings - class Settings < Base - def self.inherited(subclass) - Kernel.warn 'DEPRECATION WARNING: RailsSettings::Settings is deprecated and it will removed in 0.6.0. ' << - 'Please use RailsSettings::Base instead.' - super(subclass) + class Settings < ActiveRecord::Base + self.table_name = table_name_prefix + 'settings' + + class SettingNotFound < RuntimeError; end + + belongs_to :thing, polymorphic: true + + # get the value field, YAML decoded + def value + YAML.load(self[:value]) if self[:value].present? + end + + # set the value field, YAML encoded + def value=(new_value) + self[:value] = new_value.to_yaml + end + + class << self + # get or set a variable with the variable as the called method + def method_missing(method, *args) + method_name = method.to_s + super(method, *args) + rescue NoMethodError + # set a value for a variable + if method_name[-1] == '=' + var_name = method_name.sub('=', '') + value = args.first + self[var_name] = value + else + # retrieve a value + self[method_name] + end + end + + # destroy the specified settings record + def destroy(var_name) + var_name = var_name.to_s + obj = object(var_name) + raise SettingNotFound, "Setting variable \"#{var_name}\" not found" if obj.nil? + + obj.destroy + true + end + + # retrieve all settings as a hash (optionally starting with a given namespace) + def get_all(starting_with = nil) + vars = thing_scoped.select('var, value') + vars = vars.where("var LIKE '#{starting_with}%'") if starting_with + + result = {} + vars.each do |record| + result[record.var] = record.value + end + + defaults = {} + if Default.enabled? + defaults = starting_with.nil? ? Default.instance : Default.instance.fetch(starting_with, {}) + end + + result.merge! defaults + + result.with_indifferent_access + end + + def where(sql = nil) + vars = thing_scoped.where(sql) if sql + vars + end + + # get a setting value by [] notation + def [](var_name) + if var = object(var_name) + val = var.value + elsif Default.enabled? + val = Default[var_name] + else + val = nil + end + val + end + + # set a setting value by [] notation + def []=(var_name, value) + var_name = var_name.to_s + + record = object(var_name) || thing_scoped.new(var: var_name) + record.value = value + record.save! + + value + end + + def merge!(var_name, hash_value) + raise ArgumentError unless hash_value.is_a?(Hash) + + old_value = self[var_name] || {} + raise TypeError, "Existing value is not a hash, can't merge!" unless old_value.is_a?(Hash) + + new_value = old_value.merge(hash_value) + self[var_name] = new_value if new_value != old_value + + new_value + end + + def object(var_name) + thing_scoped.where(var: var_name.to_s).first + end + + def thing_scoped + unscoped.where('thing_type is NULL and thing_id is NULL') + end + + def source(filename) + Default.source(filename) + end end end end