Class: ParseConfig

Inherits:
Object
  • Object
show all
Defined in:
lib/parseconfig.rb

Overview

Note: A group is a set of parameters defined for a subpart of a config file

Constant Summary collapse

Version =
'1.0.6'

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(config_file = nil) ⇒ ParseConfig

Initialize the class with the path to the ‘config_file’ 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”



31
32
33
34
35
36
37
38
39
40
# File 'lib/parseconfig.rb', line 31

def initialize(config_file=nil)
  @config_file = config_file
  @params = {}
  @groups = []

  if(self.config_file)
    self.validate_config()
    self.import_config()
  end
end

Instance Attribute Details

#config_fileObject

Returns the value of attribute config_file.



23
24
25
# File 'lib/parseconfig.rb', line 23

def config_file
  @config_file
end

#groupsObject

Returns the value of attribute groups.



23
24
25
# File 'lib/parseconfig.rb', line 23

def groups
  @groups
end

#paramsObject

Returns the value of attribute params.



23
24
25
# File 'lib/parseconfig.rb', line 23

def params
  @params
end

Instance Method Details

#[](param) ⇒ Object

This method is a shortcut to accessing the @params variable



111
112
113
# File 'lib/parseconfig.rb', line 111

def [](param)
  return self.params[param]
end

#add(param_name, value) ⇒ Object

This method adds an element to the config object (not the config file) By adding a Hash, you create a new group



127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
# File 'lib/parseconfig.rb', line 127

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_to_group(group, param_name, value) ⇒ Object

Add parameters to a group. Note that parameters with the same name could be placed in different groups



150
151
152
153
154
155
# File 'lib/parseconfig.rb', line 150

def add_to_group(group, param_name, value)
  if ! self.groups.include?(group)
    self.add(group, {})
  end
  self.params[group][param_name] = value
end

#eql?(other) ⇒ Boolean Also known as: ==

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.

Returns:

  • (Boolean)


190
191
192
# File 'lib/parseconfig.rb', line 190

def eql?(other)
  self.params == other.params && self.groups == other.groups
end

#get_groupsObject

List available sub-groups of the config.



121
122
123
# File 'lib/parseconfig.rb', line 121

def get_groups()
  return self.groups
end

#get_paramsObject

This method returns all parameters/groups defined in a config file.



116
117
118
# File 'lib/parseconfig.rb', line 116

def get_params()
  return self.params.keys
end

#get_value(param) ⇒ Object

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



104
105
106
107
108
# File 'lib/parseconfig.rb', line 104

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

#import_configObject

Import data from the config to our config object.



52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
# File 'lib/parseconfig.rb', line 52

def import_config()
  # The config is top down.. anything after a [group] gets added as part
  # of that group until a new [group] is found.
  group = nil
  open(self.config_file) { |f| f.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(/\s*=\s*/.match(line))
        param, value = line.split(/\s*=\s*/, 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, {})

      end
    end
  end }
end

#validate_configObject

Validate the config file, and contents



43
44
45
46
47
48
49
# File 'lib/parseconfig.rb', line 43

def validate_config()
  unless File.readable?(self.config_file)
    raise Errno::EACCES, "#{self.config_file} is not readable"
  end

  # FIX ME: need to validate contents/structure?
end

#write(output_stream = STDOUT, quoted = true) ⇒ Object

Writes out the config file to output_stream



158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
# File 'lib/parseconfig.rb', line 158

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