Fixed regex to match sections and settings with non alphanumeric

characters. Fixed writing to file without any sections at all.
Fixed exists checking for variable type by always casting to string
and added all the tests for the above items.
This commit is contained in:
Stephen 2012-08-14 13:38:08 +01:00
parent e2954b26c1
commit d2c1e07e80
3 changed files with 67 additions and 8 deletions

View file

@ -2,7 +2,7 @@ require File.expand_path('../../../util/ini_file', __FILE__)
Puppet::Type.type(:ini_setting).provide(:ruby) do
def exists?
ini_file.get_value(resource[:section], resource[:setting]) == resource[:value]
ini_file.get_value(resource[:section], resource[:setting]) == resource[:value].to_s
end
def create

View file

@ -5,14 +5,13 @@ module Puppet
module Util
class IniFile
SECTION_REGEX = /^\s*\[([\w\d\.]+)\]\s*$/
SETTING_REGEX = /^\s*([\w\d\.]+)\s*=\s*([\w\d\.]+)\s*$/
SECTION_REGEX = /^\s*\[([\S.]+)\]\s*$/
SETTING_REGEX = /^\s*([\S]+)\s*=\s*([\S]+)\s*$/
def initialize(path)
@path = path
@section_names = []
@sections_hash = {}
parse_file
end
@ -43,7 +42,8 @@ module Util
def save
File.open(@path, 'w') do |fh|
first_section = @sections_hash[@section_names[0]]
(0..first_section.start_line - 1).each do |line_num|
first_section.start_line == nil ? start_line = 0 : start_line = first_section.start_line
(0..start_line - 1).each do |line_num|
fh.puts(lines[line_num])
end
@ -93,7 +93,6 @@ module Util
elsif (match = SETTING_REGEX.match(line))
settings[match[1]] = match[2]
end
line_iter.next
end
end
@ -129,4 +128,4 @@ module Util
end
end
end
end

View file

@ -6,6 +6,7 @@ describe provider_class do
include PuppetlabsSpec::Files
let(:tmpfile) { tmpfilename("ini_setting_test") }
let(:emptyfile) { tmpfilename("ini_setting_test_empty") }
let(:orig_content) {
<<-EOS
# This is a comment
@ -14,16 +15,18 @@ describe provider_class do
foo=foovalue
bar = barvalue
master = true
[section2]
foo= foovalue2
baz=bazvalue
url = http://192.168.1.1:8080
#another comment
; yet another comment
EOS
}
def validate_file(expected_content)
def validate_file(expected_content,tmpfile = tmpfile)
File.read(tmpfile).should == expected_content
end
@ -32,6 +35,9 @@ baz=bazvalue
File.open(tmpfile, 'w') do |fh|
fh.write(orig_content)
end
File.open(emptyfile, 'w') do |fh|
fh.write("")
end
end
context "when ensuring that a setting is present" do
@ -54,10 +60,12 @@ baz=bazvalue
foo=foovalue
bar = barvalue
master = true
[section2]
foo= foovalue2
baz=bazvalue
url = http://192.168.1.1:8080
#another comment
; yet another comment
yahoo = yippee
@ -78,16 +86,44 @@ yahoo = yippee
foo=foovalue
bar = barvalue
master = true
[section2]
foo= foovalue2
baz = bazvalue2
url = http://192.168.1.1:8080
#another comment
; yet another comment
EOS
)
end
it "should be able to handle settings with non alphanumbering settings " do
resource = Puppet::Type::Ini_setting.new(common_params.merge(
:setting => 'url', :value => 'http://192.168.0.1:8080'))
provider = described_class.new(resource)
provider.exists?.should == false
provider.create
validate_file( <<-EOS
# This is a comment
[section1]
; This is also a comment
foo=foovalue
bar = barvalue
master = true
[section2]
foo= foovalue2
baz=bazvalue
url = http://192.168.0.1:8080
#another comment
; yet another comment
EOS
)
end
it "should recognize an existing setting with the specified value" do
resource = Puppet::Type::Ini_setting.new(common_params.merge(
:setting => 'baz', :value => 'bazvalue'))
@ -108,10 +144,12 @@ baz = bazvalue2
foo=foovalue
bar = barvalue
master = true
[section2]
foo= foovalue2
baz=bazvalue
url = http://192.168.1.1:8080
#another comment
; yet another comment
@ -120,5 +158,27 @@ huzzah = shazaam
EOS
)
end
it "should add a new section if no sections exists" do
resource = Puppet::Type::Ini_setting.new(common_params.merge(
:section => "section1", :setting => 'setting1', :value => 'hellowworld', :path => emptyfile))
provider = described_class.new(resource)
provider.exists?.should == false
provider.create
validate_file("
[section1]
setting1 = hellowworld
", emptyfile)
end
it "should be able to handle variables of any type" do
resource = Puppet::Type::Ini_setting.new(common_params.merge(
:section => "section1", :setting => 'master', :value => true))
provider = described_class.new(resource)
provider.exists?.should == true
provider.create
end
end
end