# # Author:: BJ Dierkes # Copyright:: Copyright (c) 2006,2013 BJ Dierkes # License:: MIT # URL:: https://github.com/datafolklabs/ruby-parseconfig # # This class was written to simplify the parsing of configuration # files in the format of "param = value". Please review the # demo files included with this package. # # For further information please refer to the './doc' directory # as well as the ChangeLog and README files included. # # Note: A group is a set of parameters defined for a subpart of a # config file class ParseConfig Version = '1.0.6' attr_accessor :conf, :params, :groups # Initialize the class with raw config data 'conf' # The class objects are dynamically generated by the # name of the 'param' in the config file. Therefore, if # the config file is 'param = value' then the itializer # will eval "@param = value" # def initialize(conf=nil, separator = '=') @params = {} @groups = [] @splitRegex = '\s*' + separator + '\s*' self.import_config(conf) end # Import data from the config to our config object. def import_config(raw) # The config is top down.. anything after a [group] gets added as part # of that group until a new [group] is found. group = nil raw.split("\n").each_with_index do |line, i| line.strip! # force_encoding not available in all versions of ruby begin if i.eql? 0 and line.include?("\xef\xbb\xbf".force_encoding("UTF-8")) line.delete!("\xef\xbb\xbf".force_encoding("UTF-8")) end rescue NoMethodError end unless (/^\#/.match(line)) if(/#{@splitRegex}/.match(line)) param, value = line.split(/#{@splitRegex}/, 2) var_name = "#{param}".chomp.strip value = value.chomp.strip new_value = '' if (value) if value =~ /^['"](.*)['"]$/ new_value = $1 else new_value = value end else new_value = '' end if group self.add_to_group(group, var_name, new_value) else self.add(var_name, new_value) end elsif(/^\[(.+)\]$/.match(line).to_a != []) group = /^\[(.+)\]$/.match(line).to_a[1] self.add(group, {}) else rest = line.strip self.add(rest, true) unless rest.empty? end end end end # This method will provide the value held by the object "@param" # where "@param" is actually the name of the param in the config # file. # # DEPRECATED - will be removed in future versions # def get_value(param) puts "ParseConfig Deprecation Warning: get_value() is deprecated. Use " + \ "config['param'] or config['group']['param'] instead." return self.params[param] end # This method is a shortcut to accessing the @params variable def [](param) return self.params[param] end # This method returns all parameters/groups defined in a config file. def get_params() return self.params.keys end # List available sub-groups of the config. def get_groups() return self.groups end # This method adds an element to the config object (not the config file) # By adding a Hash, you create a new group def add(param_name, value) if value.class == Hash if self.params.has_key?(param_name) if self.params[param_name].class == Hash self.params[param_name].merge!(value) elsif self.params.has_key?(param_name) if self.params[param_name].class != value.class raise ArgumentError, "#{param_name} already exists, and is of different type!" end end else self.params[param_name] = value end if ! self.groups.include?(param_name) self.groups.push(param_name) end else self.params[param_name] = value end end # Add parameters to a group. Note that parameters with the same name # could be placed in different groups def add_to_group(group, param_name, value) if ! self.groups.include?(group) self.add(group, {}) end self.params[group][param_name] = value end # Writes out the config file to output_stream def write(output_stream=STDOUT, quoted=true) self.params.each do |name,value| if value.class.to_s != 'Hash' if quoted == true output_stream.puts "#{name} = \"#{value}\"" else output_stream.puts "#{name} = #{value}" end end end output_stream.puts "\n" self.groups.each do |group| output_stream.puts "[#{group}]" self.params[group].each do |param, value| if quoted == true output_stream.puts "#{param} = \"#{value}\"" else output_stream.puts "#{param} = #{value}" end end output_stream.puts "\n" end end # Public: Compare this ParseConfig to some other ParseConfig. For two config to # be equivalent, they must have the same sections with the same parameters # # other - The other ParseConfig. # # Returns true if ParseConfig are equivalent and false if they differ. def eql?(other) self.params == other.params && self.groups == other.groups end alias == eql? end