2012-07-29 06:59:54 +02:00
|
|
|
module Puppet
|
|
|
|
module Util
|
|
|
|
class IniFile
|
|
|
|
class Section
|
2012-10-21 08:14:39 +02:00
|
|
|
# Some implementation details:
|
|
|
|
#
|
|
|
|
# * `name` will be set to the empty string for the 'global' section.
|
|
|
|
# * there will always be a 'global' section, with a `start_line` of 0,
|
|
|
|
# but if the file actually begins with a real section header on
|
|
|
|
# the first line, then the 'global' section will have an
|
|
|
|
# `end_line` of `nil`.
|
|
|
|
# * `start_line` and `end_line` will be set to `nil` for a new non-global
|
|
|
|
# section.
|
2012-10-20 09:08:06 +02:00
|
|
|
def initialize(name, start_line, end_line, settings, indentation)
|
2012-07-29 06:59:54 +02:00
|
|
|
@name = name
|
|
|
|
@start_line = start_line
|
|
|
|
@end_line = end_line
|
|
|
|
@existing_settings = settings.nil? ? {} : settings
|
|
|
|
@additional_settings = {}
|
2012-10-20 09:08:06 +02:00
|
|
|
@indentation = indentation
|
2012-07-29 06:59:54 +02:00
|
|
|
end
|
|
|
|
|
2012-10-20 09:08:06 +02:00
|
|
|
attr_reader :name, :start_line, :end_line, :additional_settings, :indentation
|
2012-07-29 06:59:54 +02:00
|
|
|
|
2012-10-21 08:14:39 +02:00
|
|
|
def is_global?()
|
|
|
|
@name == ''
|
|
|
|
end
|
|
|
|
|
|
|
|
def is_new_section?()
|
|
|
|
# a new section (global or named) will always have `end_line`
|
|
|
|
# set to `nil`
|
|
|
|
@end_line.nil?
|
|
|
|
end
|
|
|
|
|
2013-01-08 00:54:41 +01:00
|
|
|
def setting_names
|
|
|
|
@existing_settings.keys | @additional_settings.keys
|
|
|
|
end
|
|
|
|
|
2012-07-29 06:59:54 +02:00
|
|
|
def get_value(setting_name)
|
|
|
|
@existing_settings[setting_name] || @additional_settings[setting_name]
|
|
|
|
end
|
|
|
|
|
|
|
|
def has_existing_setting?(setting_name)
|
|
|
|
@existing_settings.has_key?(setting_name)
|
|
|
|
end
|
|
|
|
|
|
|
|
def update_existing_setting(setting_name, value)
|
|
|
|
@existing_settings[setting_name] = value
|
|
|
|
end
|
|
|
|
|
2012-10-11 02:40:38 +02:00
|
|
|
def remove_existing_setting(setting_name)
|
2012-10-17 22:27:28 +02:00
|
|
|
if (@existing_settings.delete(setting_name))
|
|
|
|
if @end_line
|
|
|
|
@end_line = @end_line - 1
|
|
|
|
end
|
|
|
|
end
|
2012-10-11 02:40:38 +02:00
|
|
|
end
|
|
|
|
|
2012-10-27 02:24:37 +02:00
|
|
|
# This is a hacky method; it's basically called when we need to insert
|
|
|
|
# a new setting but we don't want it to appear at the very end of the
|
|
|
|
# section. Instead we hack it into the existing settings list and
|
|
|
|
# increment our end_line number--this assumes that the caller (`ini_file`)
|
|
|
|
# is doing some babysitting w/rt the other sections and the actual data
|
|
|
|
# of the lines.
|
|
|
|
def insert_inline_setting(setting_name, value)
|
|
|
|
@existing_settings[setting_name] = value
|
|
|
|
if @end_line
|
|
|
|
@end_line = @end_line + 1
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2012-07-29 06:59:54 +02:00
|
|
|
def set_additional_setting(setting_name, value)
|
|
|
|
@additional_settings[setting_name] = value
|
|
|
|
end
|
|
|
|
|
2012-10-17 22:27:28 +02:00
|
|
|
# Decrement the start and end line numbers for the section (if they are
|
|
|
|
# defined); this is intended to be called when a setting is removed
|
|
|
|
# from a section that comes before this section in the ini file.
|
|
|
|
def decrement_line_nums()
|
|
|
|
if @start_line
|
|
|
|
@start_line = @start_line - 1
|
|
|
|
end
|
|
|
|
if @end_line
|
|
|
|
@end_line = @end_line - 1
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2012-10-27 02:24:37 +02:00
|
|
|
# Increment the start and end line numbers for the section (if they are
|
|
|
|
# defined); this is intended to be called when an inline setting is added
|
|
|
|
# to a section that comes before this section in the ini file.
|
|
|
|
def increment_line_nums()
|
|
|
|
if @start_line
|
|
|
|
@start_line = @start_line + 1
|
|
|
|
end
|
|
|
|
if @end_line
|
|
|
|
@end_line = @end_line + 1
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2012-07-29 06:59:54 +02:00
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
2012-10-11 02:40:38 +02:00
|
|
|
end
|