Class: Hashery::IniHash

Inherits:
Object show all
Defined in:
lib/hashery/ini_hash.rb

Overview

Hash class with methods to read from and write into ini files.

A ini file is a text file in a specific format, it may include several fields which are sparated by field headlines which are enclosured by "[]". Each field may include several key-value pairs.

Each key-value pair is represented by one line and the value is sparated from the key by a "=".

Examples

Example ini file

# this is the first comment which will be saved in the comment attribute
mail=info@example.com
domain=example.com # this is a comment which will not be saved
[database]
db=example
user=john
passwd=very-secure
host=localhost
# this is another comment
[filepaths]
tmp=/tmp/example
lib=/home/john/projects/example/lib
htdocs=/home/john/projects/example/htdocs
[ texts ]
wellcome=Wellcome on my new website!
Website description = This is only a example. # and another comment

Example object

Ini#comment stores:

"this is the first comment which will be saved in the comment attribute"

Ini's internal hash stores:

{
 "mail" => "info@example.com",
 "domain" => "example.com",
 "database" => {
  "db" => "example",
  "user" => "john",
  "passwd" => "very-secure",
  "host" => "localhost"
 },
 "filepaths" => {
  "tmp" => "/tmp/example",
  "lib" => "/home/john/projects/example/lib",
  "htdocs" => "/home/john/projects/example/htdocs"
 }
 "texts" => {
  "wellcome" => "Wellcome on my new website!",
  "Website description" => "This is only a example."
 }
}

As you can see this module gets rid of all comments, linebreaks and unnecessary spaces at the beginning and the end of each field headline, key or value.

Using the object

Using the object is stright forward:

ini = IniHash.new("path/settings.ini")
ini["mail"] = "info@example.com"
ini["filepaths"] = { "tmp" => "/tmp/example" }
ini.comment = "This is\na comment"
puts ini["filepaths"]["tmp"]
# => /tmp/example
ini.write()

Acknowlegements

IniHash is based on ini.rb.

Copyright (C) 2007 Jeena Paradies <info@jeenaparadies.net>

Instance Attribute Summary (collapse)

Class Method Summary (collapse)

Instance Method Summary (collapse)

Constructor Details

- (IniHash) initialize(path, load = nil)

Creating a new Ini object

path is a path to the ini file load if nil restores the data if possible

if true restores the data, if not possible raises an error
if false does not resotre the data


102
103
104
105
106
107
108
109
# File 'lib/hashery/ini_hash.rb', line 102

def initialize(path, load=nil)
  @path = path
  @inihash = {}
  
  if load or ( load.nil? and FileTest.readable_real? @path )
    restore()
  end
end

Dynamic Method Handling

This class handles dynamic methods through the method_missing method

- (Object) method_missing(s, *a, &b)



149
150
151
# File 'lib/hashery/ini_hash.rb', line 149

def method_missing(s,*a,&b)
  @inihash.send(s, *a, &b) if @inihash.respond_to?(s)
end

Instance Attribute Details

- (Object) comment

:inihash is a hash which holds all ini data :comment is a string which holds the comments on the top of the file



92
93
94
# File 'lib/hashery/ini_hash.rb', line 92

def comment
  @comment
end

- (Object) inihash

:inihash is a hash which holds all ini data :comment is a string which holds the comments on the top of the file



92
93
94
# File 'lib/hashery/ini_hash.rb', line 92

def inihash
  @inihash
end

Class Method Details

+ (Object) read_comment_from_file(path)

Reading comments from file

path is a path to the ini file

Returns a string with comments from the beginning of the ini file.



205
206
207
208
209
210
211
212
213
214
215
216
# File 'lib/hashery/ini_hash.rb', line 205

def self.read_comment_from_file(path)
  comment = ""
  
  IO.foreach(path) do |line|
    line.strip!
    break unless line[0,1] == "#" or line == ""
    
    comment << "#{line[1, line.length ].strip}\n"
  end
  
  comment
end

+ (Object) read_from_file(path)

Reading data from file

path is a path to the ini file

returns a hash which represents the data from the file



160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
# File 'lib/hashery/ini_hash.rb', line 160

def self.read_from_file(path)
      
  inihash = {}
  headline = nil
  
  IO.foreach(path) do |line|

    line = line.strip.split(/#/)[0]
    
    # read it only if the line doesn't begin with a "=" and is long enough
    unless line.length < 2 and line[0,1] == "="
      
      # it's a headline if the line begins with a "[" and ends with a "]"
      if line[0,1] == "[" and line[line.length - 1, line.length] == "]"
        
        # get rid of the [] and unnecessary spaces
        headline = line[1, line.length - 2 ].strip
        inihash[headline] = {}
      else
      
        key, value = line.split(/=/, 2)
        
        key = key.strip unless key.nil?
        value = value.strip unless value.nil?
        
        unless headline.nil?
          inihash[headline][key] = value
        else
          inihash[key] = value unless key.nil?
        end
      end        
    end
  end
  
  inihash
end

+ (Object) to_s(inihash = {})

Turn a hash (up to 2 levels deepness) into a ini string

inihash is a hash representing the ini File. Default is a empty hash.

Returns a string in the ini file format.



250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
# File 'lib/hashery/ini_hash.rb', line 250

def self.to_s(inihash={})
  str = ""
  
  inihash.each do |key, value|

    if value.is_a? Hash
      str << "[#{key.to_s}]\n"
      
      value.each do |under_key, under_value|
        str << "#{under_key.to_s}=#{under_value.to_s unless under_value.nil?}\n"
      end

    else
      str << "#{key.to_s}=#{value.to_s unless value2.nil?}\n"
    end
  end
  
  str
end

+ (Object) write_to_file(path, inihash = {}, comment = nil)

Writing a ini hash into a file

path is a path to the ini file inihash is a hash representing the ini File. Default is a empty hash. comment is a string with comments which appear on the

top of the file. Each line will get a "#" before.
Default is no comment.

Raises:

  • (TypeError)


227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
# File 'lib/hashery/ini_hash.rb', line 227

def self.write_to_file(path, inihash={}, comment=nil)
  raise TypeError, "String expected" unless comment.is_a? String or comment.nil?
  
  raise TypeError, "Hash expected" unless inihash.is_a? Hash
  File.open(path, "w") { |file|
    
    unless comment.nil?
      comment.each do |line|
        file << "# #{line}"
      end
    end

    file << IniHash.to_s(inihash)
  }
end

Instance Method Details

- (Object) [](key)

Retrive the ini data for the key key



114
115
116
# File 'lib/hashery/ini_hash.rb', line 114

def [](key)
  @inihash[key]
end

- (Object) []=(key, value)

Set the ini data for the key key

Raises:

  • (TypeError)


121
122
123
124
125
126
# File 'lib/hashery/ini_hash.rb', line 121

def []=(key, value)
  raise TypeError, "String expected" unless key.is_a? String
  raise TypeError, "String or Hash expected" unless value.is_a? String or value.is_a? Hash
  
  @inihash[key] = value
end

- (Object) restore

Restores the data from file into the object



131
132
133
134
# File 'lib/hashery/ini_hash.rb', line 131

def restore()
  @inihash = Ini.read_from_file(@path)
  @comment = Ini.read_comment_from_file(@path)
end

- (Object) to_h



144
145
146
# File 'lib/hashery/ini_hash.rb', line 144

def to_h
  @inihash.dup
end

- (Object) update

Store data from the object in the file



139
140
141
# File 'lib/hashery/ini_hash.rb', line 139

def update()
  IniHash.write_to_file(@path, @inihash, @comment)
end