module-inifile/lib/puppet/util/setting_value.rb
Morgan Haskel 2ab47100c7 MODULES-2212 - Add use_exact_match parameter for subsettings
There's no way to distinguish between a subsetting with a value and a
subsetting with no value, so add a parameter to allow that to be
specified.
2015-07-31 16:11:27 -07:00

103 lines
2.9 KiB
Ruby

module Puppet
module Util
class SettingValue
def initialize(setting_value, subsetting_separator = ' ', default_quote_char = nil)
@setting_value = setting_value
@subsetting_separator = subsetting_separator
default_quote_char ||= ''
if @setting_value
unquoted, @quote_char = unquote_setting_value(setting_value)
@subsetting_items = unquoted.scan(Regexp.new("(?:(?:[^\\#{@subsetting_separator}]|\\.)+)")) # an item can contain escaped separator
@subsetting_items.map! { |item| item.strip }
@quote_char = default_quote_char if @quote_char.empty?
else
@subsetting_items = []
@quote_char = default_quote_char
end
end
def unquote_setting_value(setting_value)
quote_char = ""
if (setting_value.start_with?('"') and setting_value.end_with?('"'))
quote_char = '"'
elsif (setting_value.start_with?("'") and setting_value.end_with?("'"))
quote_char = "'"
end
unquoted = setting_value
if (quote_char != "")
unquoted = setting_value[1, setting_value.length - 2]
end
[unquoted, quote_char]
end
def get_value
result = ""
first = true
@subsetting_items.each { |item|
result << @subsetting_separator unless first
result << item
first = false
}
@quote_char + result + @quote_char
end
def get_subsetting_value(subsetting, use_exact_match=:false)
value = nil
@subsetting_items.each { |item|
if(use_exact_match == :false and item.start_with?(subsetting))
value = item[subsetting.length, item.length - subsetting.length]
break
elsif(use_exact_match == :true and item.eql?(subsetting))
return true
end
}
value
end
def add_subsetting(subsetting, subsetting_value, use_exact_match=:false)
new_item = subsetting + (subsetting_value || '')
found = false
@subsetting_items.map! { |item|
if use_exact_match == :false and item.start_with?(subsetting)
value = new_item
found = true
elsif use_exact_match == :true and item.eql?(subsetting)
value = new_item
found = true
else
value = item
end
value
}
unless found
@subsetting_items.push(new_item)
end
end
def remove_subsetting(subsetting, use_exact_match=:false)
if use_exact_match == :false
@subsetting_items = @subsetting_items.map { |item| item.start_with?(subsetting) ? nil : item }.compact
else
@subsetting_items = @subsetting_items.map { |item| item.eql?(subsetting) ? nil : item }.compact
end
end
end
end
end