class SettingsHolder

Part of the “rails-settings” gem, this class is designed to store several OpenStruct representing ‘settings’. It can load them from a YAML file, reload them, and accept queries.

This class is usually not used directly but through the ‘settings’ module, offering shortcuts.


Attributes

environment[RW]

Public Class Methods

new() click to toggle source
# File lib/settings_tree/settings_holder.rb, line 120
def initialize
        @settings_list = Hash.new
        
        if defined? Rails then
                @environment = Rails.env
        end
end

Public Instance Methods

debug_inspect() click to toggle source

a convenience function which displays the datas

# File lib/settings_tree/settings_holder.rb, line 35
def debug_inspect
        puts "*** Current settings :"
        #puts @settings_list.inspect
        @settings_list.each do |key, value|
                puts "Settings.#{key}."
                @settings_list[key][:data].debug_inspect(1)
        end
end
environment=(env) click to toggle source

same same

# File lib/settings_tree/settings_holder.rb, line 88
def environment=(env)
        set_environment(env)
end
get_settings(name) click to toggle source

Return this group of settings as an openstruct

# File lib/settings_tree/settings_holder.rb, line 70
def get_settings(name)
        #puts name.inspect
        #puts @settings_list.inspect
        if !@settings_list.has_key?(name) then
                raise ArgumentError, "Settings : unknown settings group '#{name.to_s}'"
        else
                return @settings_list[name][:data]
        end
end
register_settings_file(name, file) click to toggle source

Register a source file for a group. The group will be created if not already existing.

# File lib/settings_tree/settings_holder.rb, line 46
def register_settings_file(name, file)
        
        group_just_created = false
        
        # create the group if not already here
        unless has_group?(name)
                register_new_group(name) unless has_group?(name)
                group_just_created = true
        end
        
        # add this file as source
        res = false
        begin
                res = register_new_src_file_for_group(name, file)
        rescue Exception => e
                # delete group if just created ? Not for now.
                # proceed with exception
                raise e
        end
        
        return res
end
reload_all() click to toggle source
# File lib/settings_tree/settings_holder.rb, line 92
def reload_all
        @settings_list.each do |key, value|
                reload_group(key)
        end
end
reload_group(name) click to toggle source
# File lib/settings_tree/settings_holder.rb, line 98
def reload_group(name)
        
        res = false
        
        if !has_group?(name) then
                raise ArgumentError, "This group doesn't exist !"
        else
                data = Hash.new
                
                @settings_list[name.to_sym][:src].each do |src|
                        data.deep_merge!(hash_data_for_src(src))
                end
                
                @settings_list[name.to_sym][:data] = RecursiveOpenStruct.new(data)
                res = true
        end # check parameters
        
        return res
end
reset() click to toggle source

a convenience function which reset the settings, forgetting about all the groups, files, etc.

# File lib/settings_tree/settings_holder.rb, line 30
def reset
        initialize
end
set_environment(env) click to toggle source

Set the environment to be used for conditional settings.

# File lib/settings_tree/settings_holder.rb, line 81
def set_environment(env)
        @environment = env
        
        # need to reload all
        reload_all
end

Protected Instance Methods

group_has_src?(name, type, value) click to toggle source
# File lib/settings_tree/settings_holder.rb, line 144
def group_has_src?(name, type, value)
        
        if !has_group?(name) then
                raise ArgumentError, "This group doesn't exist !"
        else
                @settings_list[name.to_sym][:src].any? {|src| src[:type] == type && src[:value] == value}
        end # check parameters
end
has_group?(name) click to toggle source
# File lib/settings_tree/settings_holder.rb, line 128
def has_group?(name)
        #puts @settings_list.inspect
        return @settings_list.has_key?(name.to_sym)
end
hash_data_for_src(src) click to toggle source
# File lib/settings_tree/settings_holder.rb, line 184
def hash_data_for_src(src)
        data = nil
        
        case src[:type]
        when :file
                begin
                        complete_config    = YAML.load_file( src[:value] ) || {}
                        default_config     = complete_config['defaults'] || {}
                        specialized_config = @environment.nil? ? {} : (complete_config[@environment] || {})
                        
                        data = default_config.deep_merge(specialized_config)
                rescue Errno::ENOENT => e
                        # no file, classic error.
                        # resend as is
                        raise e
                rescue Exception => e
                        # unexpected error : add details.
                        #puts e.inspect
                        raise RuntimeError, "XXX There was a problem in parsing the file #{src[:value]}. Please investigate... #{e.message}"
                end
        else  
                raise RuntimeError, "Unknown source type : #{src[:type]}"
        end
        
        return data
end
register_new_group(name) click to toggle source
# File lib/settings_tree/settings_holder.rb, line 133
def register_new_group(name)
        
        if has_group?(name) then
                raise ArgumentError, "This group already exists !"
        else
                @settings_list[name.to_sym] = {:data => nil, :src => Array.new }
        end # check parameters
        
        true
end
register_new_src_file_for_group(name, file) click to toggle source
# File lib/settings_tree/settings_holder.rb, line 153
def register_new_src_file_for_group(name, file)
        
        res = false
        
        if !has_group?(name) then
                raise ArgumentError, "This group doesn't exist !"
        elsif group_has_src?(name, :file, file) then
                # this source is already registered. Ignore.
                # should signal it ?
                # res stays false, like in 'require'
        else
                @settings_list[name.to_sym][:src] << { :type => :file,  :value => file}
                # don't forget to update to take the new infos into account
                begin
                        res = reload_group(name)
                rescue Exception => e
                        # remove the src, since it's invalid
                        @settings_list[name.to_sym][:src].each_with_index do |item, index|
                                if item[:type] == :file && item[:value] == file then
                                        @settings_list[name.to_sym][:src].delete_at(index)
                                        break
                                end
                        end
                        # proceed with exception
                        raise e
                end
        end # check parameters
        
        return res
end