Merge pull request #9 from cprice-puppet/feature/master/allow-override-of-separator-str

Allow overriding separator string between key/val pairs
This commit is contained in:
Chris Price 2012-09-20 12:53:59 -07:00
commit 4ff4995d9e
5 changed files with 91 additions and 11 deletions

View file

@ -14,6 +14,7 @@ Puppet::Type.type(:ini_setting).provide(:ruby) do
private
def ini_file
@ini_file ||= Puppet::Util::IniFile.new(resource[:path])
@ini_file ||= Puppet::Util::IniFile.new(resource[:path],
resource[:key_val_separator])
end
end

View file

@ -30,4 +30,17 @@ Puppet::Type.newtype(:ini_setting) do
end
end
newparam(:key_val_separator) do
desc 'The separator string to use between each setting name and value. ' +
'Defaults to " = ", but you could use this to override e.g. whether ' +
'or not the separator should include whitespace.'
defaultto(" = ")
validate do |value|
unless value.scan('=').size == 1
raise Puppet::Error, ":key_val_separator must contain exactly one = character."
end
end
end
end

View file

@ -8,8 +8,9 @@ module Util
SECTION_REGEX = /^\s*\[([\w\d\.\\\/\-\:]+)\]\s*$/
SETTING_REGEX = /^\s*([\w\d\.\\\/\-]+)\s*=\s*([\S]+)\s*$/
def initialize(path)
def initialize(path, key_val_separator = ' = ')
@path = path
@key_val_separator = key_val_separator
@section_names = []
@sections_hash = {}
if File.file?(@path)
@ -56,7 +57,7 @@ module Util
end
section.additional_settings.each_pair do |key, value|
fh.puts("#{key} = #{value}")
fh.puts("#{key}#{@key_val_separator}#{value}")
end
end
end
@ -106,7 +107,7 @@ module Util
(section.start_line..section.end_line).each do |line_num|
if (match = SETTING_REGEX.match(lines[line_num]))
if (match[1] == setting)
lines[line_num] = "#{setting} = #{value}"
lines[line_num] = "#{setting}#{@key_val_separator}#{value}"
end
end
end

View file

@ -392,4 +392,68 @@ bar = baz
end
end
context "when overriding the separator" do
let(:orig_content) {
<<-EOS
[section2]
foo=bar
EOS
}
it "should fail if the separator doesn't include an equals sign" do
expect {
Puppet::Type::Ini_setting.new(common_params.merge(
:section => 'section2',
:setting => 'foo',
:value => 'yippee',
:key_val_separator => '+'))
}.to raise_error Puppet::Error, /must contain exactly one/
end
it "should fail if the separator includes more than one equals sign" do
expect {
Puppet::Type::Ini_setting.new(common_params.merge(
:section => 'section2',
:setting => 'foo',
:value => 'yippee',
:key_val_separator => ' = foo = '))
}.to raise_error Puppet::Error, /must contain exactly one/
end
it "should modify an existing setting" do
resource = Puppet::Type::Ini_setting.new(common_params.merge(
:section => 'section2',
:setting => 'foo',
:value => 'yippee',
:key_val_separator => '='))
provider = described_class.new(resource)
provider.exists?.should == false
provider.create
validate_file(<<-EOS
[section2]
foo=yippee
EOS
)
end
it "should add a new setting" do
resource = Puppet::Type::Ini_setting.new(common_params.merge(
:section => 'section2',
:setting => 'bar',
:value => 'baz',
:key_val_separator => '='))
provider = described_class.new(resource)
provider.exists?.should == false
provider.create
validate_file(<<-EOS
[section2]
foo=bar
bar=baz
EOS
)
end
end
end

View file

@ -11,6 +11,7 @@ ini_setting { "sample setting2":
section => 'bar',
setting => 'barsetting',
value => 'BAR!',
key_value_separator => '=',
ensure => present,
require => Ini_setting["sample setting"],
}