Class: IniParse::Generator

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

Overview

Generator provides a means for easily creating new INI documents.

Rather than trying to hack together new INI documents by manually creating Document, Section and Option instances, it is preferable to use Generator which will handle it all for you.

The Generator is exposed through IniParse.gen.

IniParse.gen do |doc|
  doc.section("vehicle") do |vehicle|
    vehicle.option("road_side", "left")
    vehicle.option("realistic_acceleration", true)
    vehicle.option("max_trains", 500)
  end

  doc.section("construction") do |construction|
    construction.option("build_on_slopes", true)
    construction.option("autoslope", true)
  end
end

# => IniParse::Document

This can be simplified further if you don’t mind the small overhead which comes with method_missing:

IniParse.gen do |doc|
  doc.vehicle do |vehicle|
    vehicle.road_side = "left"
    vehicle.realistic_acceleration = true
    vehicle.max_trains = 500
  end

  doc.construction do |construction|
    construction.build_on_slopes = true
    construction.autoslope = true
  end
end

# => IniParse::Document

If you want to add slightly more complicated formatting to your document, each line type (except blanks) takes a number of optional parameters:

:comment

Adds an inline comment at the end of the line.

:comment_offset

Indent the comment. Measured in characters from beginning of the line. See String#ljust.

:indent

Adds the supplied text to the beginning of the line.

If you supply :indent, :comment_sep, or :comment_offset options when adding a section, the same options will be inherited by all of the options which belong to it.

IniParse.gen do |doc|
  doc.section("vehicle",
    :comment => "Options for vehicles", :indent  => "    "
  ) do |vehicle|
    vehicle.option("road_side", "left")
    vehicle.option("realistic_acceleration", true)
    vehicle.option("max_trains", 500, :comment => "More = slower")
  end
end.to_ini

    [vehicle] ; Options for vehicles
    road_side = left
    realistic_acceleration = true
    max_trains = 500 ; More = slower

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(opts = {}) ⇒ Generator

:nodoc:



77
78
79
80
81
82
83
# File 'lib/iniparse/generator.rb', line 77

def initialize(opts = {}) # :nodoc:
  @document   = IniParse::Document.new
  @context    = @document

  @in_section = false
  @opt_stack  = [opts]
end

Dynamic Method Handling

This class handles dynamic methods through the method_missing method

#method_missing(name, *args, &blk) ⇒ Object

:nodoc:



178
179
180
181
182
183
184
# File 'lib/iniparse/generator.rb', line 178

def method_missing(name, *args, &blk) # :nodoc:
  if m = name.to_s.match(/(.*)=$/)
    option(m[1], *args)
  else
    section(name.to_s, *args, &blk)
  end
end

Instance Attribute Details

#contextObject (readonly)

Returns the value of attribute context.



74
75
76
# File 'lib/iniparse/generator.rb', line 74

def context
  @context
end

#documentObject (readonly)

Returns the value of attribute document.



75
76
77
# File 'lib/iniparse/generator.rb', line 75

def document
  @document
end

Class Method Details

.gen(opts = {}, &blk) ⇒ Object

Creates a new IniParse::Document with the given sections and options.

Returns

IniParse::Document



95
96
97
# File 'lib/iniparse/generator.rb', line 95

def self.gen(opts = {}, &blk)
  new(opts).gen(&blk)
end

Instance Method Details

#blankObject

Adds a new blank line to the document.



165
166
167
# File 'lib/iniparse/generator.rb', line 165

def blank
  @context.lines << Lines::Blank.new
end

#comment(comment, opts = {}) ⇒ Object

Adds a new comment line to the document.

Parameters

comment<String>

The text for the comment line.



158
159
160
161
162
# File 'lib/iniparse/generator.rb', line 158

def comment(comment, opts = {})
  @context.lines << Lines::Comment.new(
    line_options(opts.merge(:comment => comment))
  )
end

#gen {|_self| ... } ⇒ Object

:nodoc:

Yields:

  • (_self)

Yield Parameters:



85
86
87
88
# File 'lib/iniparse/generator.rb', line 85

def gen # :nodoc:
  yield self
  @document
end

#option(key, value, opts = {}) ⇒ Object

Adds a new option to the current section.

Can only be called as part of a section block, or after at least one section has been added to the document.

Parameters

key<String>

The key (name) for this option.

value

The option’s value.

opts<Hash>

Extra options for the line (formatting, etc).

Raises

IniParse::NoSectionError

If no section has been added to the document yet.



142
143
144
145
146
147
148
149
150
151
# File 'lib/iniparse/generator.rb', line 142

def option(key, value, opts = {})
  @context.lines << Lines::Option.new(
    key, value, line_options(opts)
  )
rescue LineNotAllowed
  # Tried to add an Option to a Document.
  raise NoSectionError,
    'Your INI document contains an option before the first section is ' \
    'declared which is not allowed.'
end

#section(name, opts = {}) ⇒ Object

Creates a new section with the given name and adds it to the document.

You can optionally supply a block (as detailed in the documentation for Generator#gen) in order to add options to the section.

Parameters

name<String>

A name for the given section.



107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
# File 'lib/iniparse/generator.rb', line 107

def section(name, opts = {})
  if @in_section
    # Nesting sections is bad, mmmkay?
    raise LineNotAllowed, "You can't nest sections in INI files."
  end

  @context = Lines::Section.new(name, line_options(opts))
  @document.lines << @context

  if block_given?
    begin
      @in_section = true
      with_options(opts) { yield self }
      @context = @document
      blank()
    ensure
      @in_section = false
    end
  end
end

#with_options(opts = {}) {|_self| ... } ⇒ Object

Wraps lines, setting default options for each.

Yields:

  • (_self)

Yield Parameters:



170
171
172
173
174
175
176
# File 'lib/iniparse/generator.rb', line 170

def with_options(opts = {}) # :nodoc:
  opts = opts.dup
  opts.delete(:comment)
  @opt_stack.push( @opt_stack.last.merge(opts))
  yield self
  @opt_stack.pop
end