puppet-lint 0.1.9 → 0.1.10

Sign up to get free protection for your applications and to get access to all the features.
@@ -2,31 +2,59 @@
2
2
  # http://docs.puppetlabs.com/guides/style_guide.html#spacing-indentation--whitespace
3
3
 
4
4
  class PuppetLint::Plugins::CheckWhitespace < PuppetLint::CheckPlugin
5
- def test(path, data)
5
+ check 'hard_tabs' do
6
6
  line_no = 0
7
- in_resource = false
8
- selectors = []
9
- resource_indent_length = 0
10
- data.split("\n").each do |line|
7
+ manifest_lines.each do |line|
11
8
  line_no += 1
12
9
 
13
10
  # MUST NOT use literal tab characters
14
- error "tab character found on line #{line_no}" if line.include? "\t"
11
+ notify :error, :message => "tab character found", :linenumber => line_no if line.include? "\t"
12
+ end
13
+ end
14
+
15
+ check 'trailing_whitespace' do
16
+ line_no = 0
17
+ manifest_lines.each do |line|
18
+ line_no += 1
15
19
 
16
20
  # MUST NOT contain trailing white space
17
- error "trailing whitespace found on line #{line_no}" if line.end_with? " "
21
+ notify :error, :message => "trailing whitespace found", :linenumber => line_no if line.end_with? " "
22
+ end
23
+ end
24
+
25
+ check '80chars' do
26
+ line_no = 0
27
+ manifest_lines.each do |line|
28
+ line_no += 1
18
29
 
19
30
  # SHOULD NOT exceed an 80 character line width
20
31
  unless line =~ /puppet:\/\//
21
- warn "line #{line_no} has more than 80 characters" if line.length > 80
32
+ notify :warning, :message => "line has more than 80 characters", :linenumber => line_no if line.length > 80
22
33
  end
34
+ end
35
+ end
36
+
37
+ check '2sp_soft_tabs' do
38
+ line_no = 0
39
+ manifest_lines.each do |line|
40
+ line_no += 1
23
41
 
24
42
  # MUST use two-space soft tabs
25
43
  line.scan(/^ +/) do |prefix|
26
44
  unless prefix.length % 2 == 0
27
- error "two-space soft tabs not used on line #{line_no}"
45
+ notify :error, :message => "two-space soft tabs not used", :linenumber => line_no
28
46
  end
29
47
  end
48
+ end
49
+ end
50
+
51
+ check 'arrow_alignment' do
52
+ line_no = 0
53
+ in_resource = false
54
+ selectors = []
55
+ resource_indent_length = 0
56
+ manifest_lines.each do |line|
57
+ line_no += 1
30
58
 
31
59
  # SHOULD align fat comma arrows (=>) within blocks of attributes
32
60
  if line =~ /^( +.+? +)=>/
@@ -39,7 +67,7 @@ class PuppetLint::Plugins::CheckWhitespace < PuppetLint::CheckPlugin
39
67
 
40
68
  # check for length first
41
69
  unless line_indent.length == selectors.last
42
- warn "=> on line #{line_no} isn't properly aligned for selector"
70
+ notify :warning, :message => "=> on line isn't properly aligned for selector", :linenumber => line_no
43
71
  end
44
72
 
45
73
  # then for a new selector or selector finish
@@ -50,7 +78,7 @@ class PuppetLint::Plugins::CheckWhitespace < PuppetLint::CheckPlugin
50
78
  end
51
79
  else
52
80
  unless line_indent.length == resource_indent_length
53
- warn "=> on line #{line_no} isn't properly aligned for resource"
81
+ notify :warning, :message => "=> on line isn't properly aligned for resource", :linenumber => line_no
54
82
  end
55
83
 
56
84
  if line.strip.end_with? "{"
data/puppet-lint.gemspec CHANGED
@@ -1,6 +1,6 @@
1
1
  Gem::Specification.new do |s|
2
2
  s.name = 'puppet-lint'
3
- s.version = '0.1.9'
3
+ s.version = '0.1.10'
4
4
  s.homepage = 'https://github.com/rodjek/puppet-lint/'
5
5
  s.summary = 'Ensure your Puppet manifests conform with the Puppetlabs style guide'
6
6
  s.description = 'Checks your Puppet manifests against the Puppetlabs
@@ -9,6 +9,7 @@ Gem::Specification.new do |s|
9
9
  s.executables = ['puppet-lint']
10
10
  s.files = [
11
11
  'bin/puppet-lint',
12
+ 'lib/puppet-lint/configuration.rb',
12
13
  'lib/puppet-lint/plugin.rb',
13
14
  'lib/puppet-lint/plugins/check_classes.rb',
14
15
  'lib/puppet-lint/plugins/check_conditionals.rb',
@@ -33,6 +34,7 @@ Gem::Specification.new do |s|
33
34
  ]
34
35
 
35
36
  s.add_development_dependency 'rspec'
37
+ s.add_development_dependency 'rdoc'
36
38
 
37
39
  s.authors = ['Tim Sharpe']
38
40
  s.email = 'tim@sharpe.id.au'
@@ -3,29 +3,29 @@ require 'spec_helper'
3
3
  describe PuppetLint::Plugins::CheckClasses do
4
4
  subject do
5
5
  klass = described_class.new
6
- klass.test(defined?(path).nil? ? '' : path, code)
6
+ klass.run(defined?(path).nil? ? '' : path, code)
7
7
  klass
8
8
  end
9
9
 
10
10
  describe 'chain 2 resources left to right' do
11
11
  let(:code) { "Class[foo] -> Class[bar]" }
12
12
 
13
- its(:warnings) { should be_empty }
14
- its(:errors) { should be_empty }
13
+ its(:problems) { should be_empty }
15
14
  end
16
15
 
17
16
  describe 'chain 2 resources right to left' do
18
17
  let(:code) { "Class[foo] <- Class[bar]" }
19
18
 
20
- its(:warnings) { should include "right-to-left (<-) relationship on line 1" }
21
- its(:errors) { should be_empty }
19
+ its(:problems) {
20
+ should have_problem :kind => :warning, :message => "right-to-left (<-) relationship", :linenumber => 1
21
+ should_not have_problem :kind => :error
22
+ }
22
23
  end
23
24
 
24
25
  describe 'class on its own' do
25
26
  let(:code) { "class foo { }" }
26
27
 
27
- its(:warnings) { should be_empty }
28
- its(:errors) { should be_empty }
28
+ its(:problems) { should be_empty }
29
29
  end
30
30
 
31
31
  describe 'class inside a class' do
@@ -36,8 +36,10 @@ describe PuppetLint::Plugins::CheckClasses do
36
36
  }"
37
37
  }
38
38
 
39
- its(:warnings) { should include "class defined inside a class on line 3" }
40
- its(:errors) { should be_empty }
39
+ its(:problems) {
40
+ should have_problem :kind => :warning, :message => "class defined inside a class", :linenumber => 3
41
+ should_not have_problem :kind => :error
42
+ }
41
43
  end
42
44
 
43
45
  describe 'define inside a class' do
@@ -48,50 +50,55 @@ describe PuppetLint::Plugins::CheckClasses do
48
50
  }"
49
51
  }
50
52
 
51
- its(:warnings) { should include "define defined inside a class on line 3" }
52
- its(:errors) { should be_empty }
53
+ its(:problems) {
54
+ should have_problem :kind => :warning, :message => "define defined inside a class", :linenumber => 3
55
+ should_not have_problem :kind => :error
56
+ }
53
57
  end
54
58
 
55
59
  describe 'class inheriting from its namespace' do
56
60
  let(:code) { "class foo::bar inherits foo { }" }
57
61
 
58
- its(:warnings) { should be_empty }
59
- its(:errors) { should be_empty }
62
+ its(:problems) { should be_empty }
60
63
  end
61
64
 
62
65
  describe 'class inheriting from another namespace' do
63
66
  let(:code) { "class foo::bar inherits baz { }" }
64
67
 
65
- its(:warnings) { should include "class inherits across namespaces on line 1" }
66
- its(:errors) { should be_empty }
68
+ its(:problems) {
69
+ should have_problem :kind => :warning, :message => "class inherits across namespaces", :linenumber => 1
70
+ should_not have_problem :kind => :error
71
+ }
67
72
  end
68
73
 
69
74
  describe 'class with attrs in order' do
70
75
  let(:code) { "class foo($bar, $baz='gronk') { }" }
71
76
 
72
- its(:warnings) { should be_empty }
73
- its(:errors) { should be_empty }
77
+ its(:problems) { should be_empty }
74
78
  end
75
79
 
76
80
  describe 'class with attrs out of order' do
77
81
  let(:code) { "class foo($bar='baz', $gronk) { }" }
78
82
 
79
- its(:warnings) { should include "optional parameter listed before required parameter on line 1" }
80
- its(:errors) { should be_empty }
83
+ its(:problems) {
84
+ should have_problem :kind => :warning, :message => "optional parameter listed before required parameter", :linenumber => 1
85
+ should_not have_problem :kind => :error
86
+ }
81
87
  end
82
88
 
83
89
  describe 'define with attrs in order' do
84
90
  let(:code) { "define foo($bar, $baz='gronk') { }" }
85
91
 
86
- its(:warnings) { should be_empty }
87
- its(:errors) { should be_empty }
92
+ its(:problems) { should be_empty }
88
93
  end
89
94
 
90
95
  describe 'define with attrs out of order' do
91
96
  let(:code) { "define foo($bar='baz', $gronk) { }" }
92
97
 
93
- its(:warnings) { should include "optional parameter listed before required parameter on line 1" }
94
- its(:errors) { should be_empty }
98
+ its(:problems) {
99
+ should have_problem :kind => :warning, :message => "optional parameter listed before required parameter", :linenumber => 1
100
+ should_not have_problem :kind => :error
101
+ }
95
102
  end
96
103
 
97
104
  describe 'class with no variables declared accessing top scope' do
@@ -101,8 +108,10 @@ describe PuppetLint::Plugins::CheckClasses do
101
108
  }"
102
109
  }
103
110
 
104
- its(:warnings) { should include "top-scope variable being used without an explicit namespace on line 3" }
105
- its(:errors) { should be_empty}
111
+ its(:problems) {
112
+ should have_problem :kind => :warning, :message => "top-scope variable being used without an explicit namespace", :linenumber => 3
113
+ should_not have_problem :kind => :error
114
+ }
106
115
  end
107
116
 
108
117
  describe 'class with no variables declared accessing top scope explicitly' do
@@ -112,8 +121,7 @@ describe PuppetLint::Plugins::CheckClasses do
112
121
  }"
113
122
  }
114
123
 
115
- its(:warnings) { should be_empty }
116
- its(:errors) { should be_empty }
124
+ its(:problems) { should be_empty }
117
125
  end
118
126
 
119
127
  describe 'class with variables declared accessing local scope' do
@@ -124,8 +132,7 @@ describe PuppetLint::Plugins::CheckClasses do
124
132
  }"
125
133
  }
126
134
 
127
- its(:warnings) { should be_empty }
128
- its(:errors) { should be_empty }
135
+ its(:problems) { should be_empty }
129
136
  end
130
137
 
131
138
  describe 'class with parameters accessing local scope' do
@@ -135,8 +142,7 @@ describe PuppetLint::Plugins::CheckClasses do
135
142
  }"
136
143
  }
137
144
 
138
- its(:warnings) { should be_empty }
139
- its(:errors) { should be_empty }
145
+ its(:problems) { should be_empty }
140
146
  end
141
147
 
142
148
  describe 'defined type with no variables declared accessing top scope' do
@@ -146,8 +152,10 @@ describe PuppetLint::Plugins::CheckClasses do
146
152
  }"
147
153
  }
148
154
 
149
- its(:warnings) { should include "top-scope variable being used without an explicit namespace on line 3" }
150
- its(:errors) { should be_empty }
155
+ its(:problems) {
156
+ should have_problem :kind => :warning, :message => "top-scope variable being used without an explicit namespace", :linenumber => 3
157
+ should_not have_problem :kind => :error
158
+ }
151
159
  end
152
160
 
153
161
  describe 'defined type with no variables declared accessing top scope explicitly' do
@@ -157,19 +165,20 @@ describe PuppetLint::Plugins::CheckClasses do
157
165
  }"
158
166
  }
159
167
 
160
- its(:warnings) { should be_empty }
161
- its(:errors) { should be_empty }
168
+ its(:problems) { should be_empty }
162
169
  end
163
170
 
164
171
  describe '$name should be auto defined' do
165
172
  let(:code) { "
166
173
  define foo() {
167
174
  $bar = $name
175
+ $baz = $title
176
+ $gronk = $module_name
177
+ $meep = $1
168
178
  }"
169
179
  }
170
180
 
171
- its(:warnings) { should be_empty }
172
- its(:errors) { should be_empty }
181
+ its(:problems) { should be_empty }
173
182
  end
174
183
 
175
184
  describe 'instantiating a parametised class inside a class' do
@@ -181,8 +190,7 @@ describe PuppetLint::Plugins::CheckClasses do
181
190
  }"
182
191
  }
183
192
 
184
- its(:warnings) { should be_empty }
185
- its(:errors) { should be_empty }
193
+ its(:problems) { should be_empty }
186
194
  end
187
195
 
188
196
  describe 'instantiating a parametised class inside a define' do
@@ -194,8 +202,7 @@ describe PuppetLint::Plugins::CheckClasses do
194
202
  }"
195
203
  }
196
204
 
197
- its(:warnings) { should be_empty }
198
- its(:errors) { should be_empty }
205
+ its(:problems) { should be_empty }
199
206
  end
200
207
 
201
208
  describe 'class/define parameter set to another variable' do
@@ -204,8 +211,7 @@ describe PuppetLint::Plugins::CheckClasses do
204
211
  }"
205
212
  }
206
213
 
207
- its(:warnings) { should be_empty }
208
- its(:errors) { should be_empty }
214
+ its(:problems) { should be_empty }
209
215
  end
210
216
 
211
217
  describe 'class/define parameter set to another variable with incorrect order' do
@@ -214,39 +220,39 @@ describe PuppetLint::Plugins::CheckClasses do
214
220
  }"
215
221
  }
216
222
 
217
- its(:warnings) { should include "optional parameter listed before required parameter on line 2" }
218
- its(:errors) { should be_empty }
223
+ its(:problems) {
224
+ should have_problem :kind => :warning, :message => "optional parameter listed before required parameter", :linenumber => 2
225
+ should_not have_problem :kind => :error
226
+ }
219
227
  end
220
228
 
221
229
  describe 'foo::bar in foo/manifests/bar.pp' do
222
230
  let(:code) { "class foo::bar { }" }
223
231
  let(:path) { '/etc/puppet/modules/foo/manifests/bar.pp' }
224
232
 
225
- its(:warnings) { should be_empty }
226
- its(:errors) { should be_empty }
233
+ its(:problems) { should be_empty }
227
234
  end
228
235
 
229
236
  describe 'foo::bar::baz in foo/manifests/bar/baz.pp' do
230
237
  let(:code) { 'define foo::bar::baz() { }' }
231
238
  let(:path) { '/etc/puppet/modules/foo/manifests/bar/baz.pp' }
232
239
 
233
- its(:warnings) { should be_empty }
234
- its(:errors) { should be_empty }
240
+ its(:problems) { should be_empty }
235
241
  end
236
242
 
237
243
  describe 'foo in foo/manifests/init.pp' do
238
244
  let(:code) { 'class foo { }' }
239
245
  let(:path) { '/etc/puppet/modules/foo/manifests/init.pp' }
240
246
 
241
- its(:warnings) { should be_empty }
242
- its(:errors) { should be_empty }
247
+ its(:problems) { should be_empty }
243
248
  end
244
249
 
245
250
  describe 'foo::bar in foo/manifests/init.pp' do
246
251
  let(:code) { 'class foo::bar { }' }
247
252
  let(:path) { '/etc/puppet/modules/foo/manifests/init.pp' }
248
253
 
249
- its(:warnings) { should be_empty }
250
- its(:errors) { should include "foo::bar not in autoload module layout on line 1" }
254
+ its(:problems) {
255
+ should only_have_problem :kind => :error, :message => "foo::bar not in autoload module layout", :linenumber => 1
256
+ }
251
257
  end
252
258
  end
@@ -3,7 +3,7 @@ require 'spec_helper'
3
3
  describe PuppetLint::Plugins::CheckConditionals do
4
4
  subject do
5
5
  klass = described_class.new
6
- klass.test(defined?(path).nil? ? '' : path, code)
6
+ klass.run(defined?(path).nil? ? '' : path, code)
7
7
  klass
8
8
  end
9
9
 
@@ -17,8 +17,7 @@ describe PuppetLint::Plugins::CheckConditionals do
17
17
  }"
18
18
  }
19
19
 
20
- its(:warnings) { should include "selector inside resource block on line 3" }
21
- its(:errors) { should be_empty }
20
+ its(:problems) { should only_have_problem :kind => :warning, :message => "selector inside resource block", :linenumber => 3 }
22
21
  end
23
22
 
24
23
  describe 'resource with a variable as a attr value' do
@@ -28,8 +27,7 @@ describe PuppetLint::Plugins::CheckConditionals do
28
27
  }"
29
28
  }
30
29
 
31
- its(:warnings) { should be_empty }
32
- its(:errors) { should be_empty }
30
+ its(:problems) { should be_empty }
33
31
  end
34
32
 
35
33
  describe 'case statement with a default case' do
@@ -40,8 +38,7 @@ describe PuppetLint::Plugins::CheckConditionals do
40
38
  }"
41
39
  }
42
40
 
43
- its(:warnings) { should be_empty }
44
- its(:errors) { should be_empty }
41
+ its(:problems) { should be_empty }
45
42
  end
46
43
 
47
44
  describe 'case statement without a default case' do
@@ -52,7 +49,6 @@ describe PuppetLint::Plugins::CheckConditionals do
52
49
  }"
53
50
  }
54
51
 
55
- its(:warnings) { should include "case statement without a default case on line 2" }
56
- its(:errors) { should be_empty }
52
+ its(:problems) { should only_have_problem :kind => :warning, :message => "case statement without a default case", :linenumber => 2 }
57
53
  end
58
54
  end
@@ -3,36 +3,35 @@ require 'spec_helper'
3
3
  describe PuppetLint::Plugins::CheckResources do
4
4
  subject do
5
5
  klass = described_class.new
6
- klass.test(defined?(path).nil? ? '' : path, code)
6
+ klass.run(defined?(path).nil? ? '' : path, code)
7
7
  klass
8
8
  end
9
9
 
10
10
  describe '3 digit file mode' do
11
11
  let(:code) { "file { 'foo': mode => 777 }" }
12
12
 
13
- its(:warnings) { should include "mode should be represented as a 4 digit octal value on line 1" }
14
- its(:errors) { should be_empty }
13
+ its(:problems) {
14
+ should have_problem :kind => :warning, :message => "mode should be represented as a 4 digit octal value", :linenumber => 1
15
+ should_not have_problem :kind => :error
16
+ }
15
17
  end
16
18
 
17
19
  describe '4 digit file mode' do
18
20
  let(:code) { "file { 'foo': mode => '0777' }" }
19
21
 
20
- its(:warnings) { should be_empty }
21
- its(:errors) { should be_empty }
22
+ its(:problems) { should be_empty }
22
23
  end
23
24
 
24
25
  describe 'file mode as a variable' do
25
26
  let(:code) { "file { 'foo': mode => $file_mode }" }
26
27
 
27
- its(:warnings) { should be_empty }
28
- its(:errors) { should be_empty }
28
+ its(:problems) { should be_empty }
29
29
  end
30
30
 
31
31
  describe 'ensure as only attr in a single line resource' do
32
32
  let(:code) { "file { 'foo': ensure => present }" }
33
33
 
34
- its(:warnings) { should be_empty }
35
- its(:errors) { should be_empty }
34
+ its(:problems) { should be_empty }
36
35
  end
37
36
 
38
37
  describe 'ensure as only attr in a multi line resource' do
@@ -42,8 +41,7 @@ describe PuppetLint::Plugins::CheckResources do
42
41
  }"
43
42
  }
44
43
 
45
- its(:warnings) { should be_empty }
46
- its(:errors) { should be_empty }
44
+ its(:problems) { should be_empty }
47
45
  end
48
46
 
49
47
  describe 'ensure as second attr in a multi line resource' do
@@ -54,8 +52,10 @@ describe PuppetLint::Plugins::CheckResources do
54
52
  }"
55
53
  }
56
54
 
57
- its(:warnings) { should include "ensure found on line 4 but it's not the first attribute" }
58
- its(:errors) { should be_empty }
55
+ its(:problems) {
56
+ should have_problem :kind => :warning, :message => "ensure found on line but it's not the first attribute", :linenumber => 4
57
+ should_not have_problem :kind => :error
58
+ }
59
59
  end
60
60
 
61
61
  describe 'ensure as first attr in a multi line resource' do
@@ -66,22 +66,22 @@ describe PuppetLint::Plugins::CheckResources do
66
66
  }"
67
67
  }
68
68
 
69
- its(:warnings) { should be_empty }
70
- its(:errors) { should be_empty }
69
+ its(:problems) { should be_empty }
71
70
  end
72
71
 
73
72
  describe 'quoted resource title on single line resource' do
74
73
  let(:code) { "file { 'foo': }" }
75
74
 
76
- its(:warnings) { should be_empty }
77
- its(:errors) { should be_empty }
75
+ its(:problems) { should be_empty }
78
76
  end
79
77
 
80
78
  describe 'unquoted resource title on single line resource' do
81
79
  let(:code) { "file { foo: }" }
82
80
 
83
- its(:warnings) { should include "unquoted resource title on line 1" }
84
- its(:errors) { should be_empty }
81
+ its(:problems) {
82
+ should have_problem :kind => :warning, :message => "unquoted resource title", :linenumber => 1
83
+ should_not have_problem :kind => :error
84
+ }
85
85
  end
86
86
 
87
87
  describe 'quoted resource title on multi line resource' do
@@ -90,8 +90,7 @@ describe PuppetLint::Plugins::CheckResources do
90
90
  }"
91
91
  }
92
92
 
93
- its(:warnings) { should be_empty }
94
- its(:errors) { should be_empty }
93
+ its(:problems) { should be_empty }
95
94
  end
96
95
 
97
96
  describe 'unquoted resource title on multi line resource' do
@@ -100,8 +99,10 @@ describe PuppetLint::Plugins::CheckResources do
100
99
  }"
101
100
  }
102
101
 
103
- its(:warnings) { should include "unquoted resource title on line 2" }
104
- its(:errors) { should be_empty }
102
+ its(:problems) {
103
+ should have_problem :kind => :warning, :message => "unquoted resource title", :linenumber => 2
104
+ should_not have_problem :kind => :error
105
+ }
105
106
  end
106
107
 
107
108
  describe 'condensed resources with quoted titles' do
@@ -112,8 +113,7 @@ describe PuppetLint::Plugins::CheckResources do
112
113
  }"
113
114
  }
114
115
 
115
- its(:warnings) { should be_empty }
116
- its(:errors) { should be_empty }
116
+ its(:problems) { should be_empty }
117
117
  end
118
118
 
119
119
  describe 'condensed resources with an unquoted title' do
@@ -124,15 +124,16 @@ describe PuppetLint::Plugins::CheckResources do
124
124
  }"
125
125
  }
126
126
 
127
- its(:warnings) { should include "unquoted resource title on line 4" }
128
- its(:errors) { should be_empty }
127
+ its(:problems) {
128
+ should have_problem :kind => :warning, :message => "unquoted resource title", :linenumber => 4
129
+ should_not have_problem :kind => :error
130
+ }
129
131
  end
130
132
 
131
133
  describe 'single line resource with an array of titles (all quoted)' do
132
134
  let(:code) { "file { ['foo', 'bar']: }" }
133
135
 
134
- its(:warnings) { should be_empty }
135
- its(:errors) { should be_empty }
136
+ its(:problems) { should be_empty }
136
137
  end
137
138
 
138
139
  describe 'resource inside a case statement' do
@@ -146,8 +147,7 @@ describe PuppetLint::Plugins::CheckResources do
146
147
  }"
147
148
  }
148
149
 
149
- its(:warnings) { should be_empty }
150
- its(:errors) { should be_empty }
150
+ its(:problems) { should be_empty }
151
151
  end
152
152
 
153
153
  describe 'file resource creating a symlink with seperate target attr' do
@@ -158,8 +158,7 @@ describe PuppetLint::Plugins::CheckResources do
158
158
  }"
159
159
  }
160
160
 
161
- its(:warnings) { should be_empty }
162
- its(:errors) { should be_empty }
161
+ its(:problems) { should be_empty }
163
162
  end
164
163
 
165
164
  describe 'file resource creating a symlink with target specified in ensure' do
@@ -169,7 +168,9 @@ describe PuppetLint::Plugins::CheckResources do
169
168
  }"
170
169
  }
171
170
 
172
- its(:warnings) { should include "symlink target specified in ensure attr on line 3" }
173
- its(:errors) { should be_empty }
171
+ its(:problems) {
172
+ should have_problem :kind => :warning, :message => "symlink target specified in ensure attr", :linenumber => 3
173
+ should_not have_problem :kind => :error
174
+ }
174
175
  end
175
176
  end