2015-04-09 20:01:23 +00:00
|
|
|
#
|
|
|
|
# Author:: BJ Dierkes <derks@datafolklabs.com>
|
|
|
|
# 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, {})
|
|
|
|
|
2015-06-22 13:51:44 +00:00
|
|
|
else
|
|
|
|
rest = line.strip
|
|
|
|
self.add(rest, true) unless rest.empty?
|
|
|
|
|
2015-04-09 20:01:23 +00:00
|
|
|
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
|