class IniParse::Generator

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

Attributes

context[R]
document[R]

Public Class Methods

gen(opts = {}, &blk) click to toggle source

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

Returns

IniParse::Document

# File lib/iniparse/generator.rb, line 95
def self.gen(opts = {}, &blk)
  new(opts).gen(&blk)
end

Public Instance Methods

blank() click to toggle source

Adds a new blank line to the document.

# File lib/iniparse/generator.rb, line 169
def blank
  @context.lines << Lines::Blank.new
end
comment(comment, opts = {}) click to toggle source

Adds a new comment line to the document.

Parameters

comment<String>

The text for the comment line.

# File lib/iniparse/generator.rb, line 162
def comment(comment, opts = {})
  @context.lines << Lines::Comment.new(
    line_options(opts.merge(:comment => comment))
  )
end
option(key, value, opts = {}) click to toggle source

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.

# File lib/iniparse/generator.rb, line 146
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 = {}) { |self| ... } click to toggle source

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.

# 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

  if @document.has_section?(name.to_s())
    @context = @document[name.to_s()]
  else
    @context = Lines::Section.new(name, line_options(opts))
    @document.lines << @context
  end

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