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

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(config_file = nil, separator = '=', comments = ['#', ';']) ⇒ 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”



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

def initialize(config_file = nil, separator = '=', comments = ['#', ';'])
  @config_file = config_file
  @params = {}
  @groups = []
  @split_regex = '\s*' + separator + '\s*'
  @comments = comments

  return unless config_file

  validate_config
  import_config
end

Instance Attribute Details

#config_fileObject

Returns the value of attribute config_file.



20
21
22
# File 'lib/parseconfig.rb', line 20

def config_file
  @config_file
end

#groupsObject

Returns the value of attribute groups.



20
21
22
# File 'lib/parseconfig.rb', line 20

def groups
  @groups
end

#paramsObject

Returns the value of attribute params.



20
21
22
# File 'lib/parseconfig.rb', line 20

def params
  @params
end

Instance Method Details

#[](param) ⇒ Object

This method is a shortcut to accessing the @params variable



124
125
126
# File 'lib/parseconfig.rb', line 124

def [](param)
  params[param]
end

#add(param_name, value, override = false) ⇒ Object

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



140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
# File 'lib/parseconfig.rb', line 140

def add(param_name, value, override = false)
  if value.class == Hash
    if params.key? param_name
      if params[param_name].class == Hash
        if override
          params[param_name] = value
        else
          params[param_name].merge!(value)
        end
      elsif params.key? param_name
        if params[param_name].class != value.class
          raise ArgumentError, "#{param_name} already exists, and is of different type!"
        end
      end
    else
      params[param_name] = value
    end
    unless groups.include?(param_name)
      groups.push(param_name)
    end
  else
    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



167
168
169
170
# File 'lib/parseconfig.rb', line 167

def add_to_group(group, param_name, value)
  add(group, {}) unless groups.include?(group)
  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)


205
206
207
# File 'lib/parseconfig.rb', line 205

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

#escaped_comment_regexObject



107
108
109
# File 'lib/parseconfig.rb', line 107

def escaped_comment_regex
  /[#{Regexp.escape(@comments.join(''))}]/
end

#get_groupsObject

List available sub-groups of the config.



134
135
136
# File 'lib/parseconfig.rb', line 134

def get_groups
  groups
end

#get_paramsObject

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



129
130
131
# File 'lib/parseconfig.rb', line 129

def get_params
  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



117
118
119
120
121
# File 'lib/parseconfig.rb', line 117

def get_value(param)
  puts 'ParseConfig Deprecation Warning: get_value() is deprecated. Use ' \
       "config['param'] or config['group']['param'] instead."
  params[param]
end

#import_configObject

Import data from the config to our config object.



51
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
97
98
99
100
101
102
103
104
105
# File 'lib/parseconfig.rb', line 51

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(config_file) do |f|
    f.each_with_index do |line, i|
      line.strip!

      # force_encoding not available in all versions of ruby
      begin
        if i.eql? 0 && line.include?("\xef\xbb\xbf".force_encoding('UTF-8'))
          line.delete!("\xef\xbb\xbf".force_encoding('UTF-8'))
        end
      rescue NoMethodError
      end

      is_comment = false
      @comments.each do |comment|
        if /^#{comment}/.match(line)
          is_comment = true
          break
        end
      end

      unless is_comment
        if /#{@split_regex}/.match(line)
          param, value = line.split(/#{@split_regex}/, 2)
          var_name = param.to_s.chomp.strip
          value = value.chomp.strip
          new_value = ''
          if value
            if value =~ /^['"](.*)['"]$/
              new_value = Regexp.last_match(1)
            else
              new_value = value
            end
          else
            new_value = ''
          end

          if group
            add_to_group(group, var_name, new_value)
          else
            add(var_name, new_value)
          end
        elsif /^\[(.+)\](\s*#{escaped_comment_regex}+.*)?$/.match(line).to_a != []
          group = /^\[(.+)\](\s*#{escaped_comment_regex}+.*)?$/.match(line).to_a[1]
          add(group, {})
        elsif /\w+/.match(line)
          add(line.to_s.chomp.strip, true)
        end
      end
    end
  end
end

#validate_configObject

Validate the config file, and contents

Raises:

  • (Errno::EACCES)


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

def validate_config
  return if File.readable?(config_file)

  raise Errno::EACCES, "#{config_file} is not readable"

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

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

Writes out the config file to output_stream



173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
# File 'lib/parseconfig.rb', line 173

def write(output_stream = STDOUT, quoted = true)
  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"

  groups.each do |group|
    output_stream.puts "[#{group}]"
    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