puppet-lint 1.1.0 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (30) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +1 -0
  3. data/README.md +9 -6
  4. data/lib/puppet-lint.rb +6 -0
  5. data/lib/puppet-lint/checkplugin.rb +9 -1
  6. data/lib/puppet-lint/checks.rb +1 -1
  7. data/lib/puppet-lint/data.rb +181 -2
  8. data/lib/puppet-lint/lexer.rb +3 -2
  9. data/lib/puppet-lint/lexer/token.rb +5 -0
  10. data/lib/puppet-lint/optparser.rb +14 -1
  11. data/lib/puppet-lint/plugins/check_classes.rb +12 -10
  12. data/lib/puppet-lint/plugins/check_comments.rb +1 -1
  13. data/lib/puppet-lint/plugins/check_conditionals.rb +5 -1
  14. data/lib/puppet-lint/plugins/check_nodes.rb +2 -1
  15. data/lib/puppet-lint/plugins/check_strings.rb +7 -2
  16. data/lib/puppet-lint/plugins/check_whitespace.rb +10 -9
  17. data/lib/puppet-lint/tasks/puppet-lint.rb +8 -1
  18. data/lib/puppet-lint/version.rb +1 -1
  19. data/spec/fixtures/test/manifests/url_interpolation.pp +12 -0
  20. data/spec/puppet-lint/lexer_spec.rb +1 -1
  21. data/spec/puppet-lint/plugins/check_classes/names_containing_dash_spec.rb +6 -6
  22. data/spec/puppet-lint/plugins/check_classes/variable_scope_spec.rb +22 -5
  23. data/spec/puppet-lint/plugins/check_conditionals/case_without_default_spec.rb +42 -0
  24. data/spec/puppet-lint/plugins/check_nodes/unquoted_node_name_spec.rb +13 -0
  25. data/spec/puppet-lint/plugins/check_resources/duplicate_params_spec.rb +8 -0
  26. data/spec/puppet-lint/plugins/check_strings/puppet_url_without_modules_spec.rb +43 -6
  27. data/spec/puppet-lint/plugins/check_whitespace/{80chars_spec.rb → 140chars_spec.rb} +7 -7
  28. data/spec/puppet-lint/plugins/check_whitespace/arrow_alignment_spec.rb +64 -0
  29. data/spec/puppet-lint/plugins/check_whitespace/trailing_whitespace_spec.rb +40 -0
  30. metadata +72 -94
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 42a8b6b721a2a3199c467e7e2de025cf4a5189d6
4
+ data.tar.gz: fafaf3e4ddb9cdd80176d593a52223e10783db49
5
+ SHA512:
6
+ metadata.gz: 40769d9d486fa42811c3eb8843ae74d8755cf2e10979a997de86b41037cb49824deb143abe2f8271cf2e623f49422cfa91fb88b573efd4429f3242a4ab09b82a
7
+ data.tar.gz: 0acbcca77675ffde239ee14b8bc4d071840c8a2c7ed585b080bde7da8690d8e45312a68410dc56bda0d5a7bc2260b9d16e91fd825f8243394c627bf3f4ee2fb1
data/.gitignore CHANGED
@@ -6,3 +6,4 @@ Gemfile.lock
6
6
  vendor/gems
7
7
  coverage/
8
8
  *.swp
9
+ /_site/
data/README.md CHANGED
@@ -38,7 +38,7 @@ the PuppetLint configuration by defining the task yourself.
38
38
  config.ignore_paths = ['modules/apt', 'modules/stdlib']
39
39
 
40
40
  # List of checks to disable
41
- config.disable_checks = ['documentation', '80chars']
41
+ config.disable_checks = ['documentation', '140chars']
42
42
 
43
43
  # Should puppet-lint prefix it's output with the file being checked,
44
44
  # defaults to true
@@ -59,6 +59,9 @@ the PuppetLint configuration by defining the task yourself.
59
59
 
60
60
  # Show ignored problems in the output, defaults to false
61
61
  config.show_ignored = true
62
+
63
+ # Compare module layout relative to the module root
64
+ config.relative = true
62
65
  end
63
66
 
64
67
  ## Implemented tests
@@ -70,7 +73,7 @@ At the moment, the following tests have been implemented:
70
73
  * Must use two-space soft tabs.
71
74
  * Must not use literal tab characters.
72
75
  * Must not contain trailing white space.
73
- * Should not exceed an 80 character line width
76
+ * Should not exceed an 140 character line width
74
77
  * An exception has been made for `source => 'puppet://...'` lines as
75
78
  splitting these over multiple lines decreases the readability of the
76
79
  manifests.
@@ -121,10 +124,10 @@ At the moment, the following tests have been implemented:
121
124
 
122
125
  You can disable any of the checks when running the `puppet-lint` command by
123
126
  adding a `--no-<check name>-check` flag to the command. For example, if you
124
- wanted to skip the 80 character check, you would run
127
+ wanted to skip the 140 character check, you would run
125
128
 
126
129
  ```
127
- puppet-lint --no-80chars-check /path/to/my/manifest.pp
130
+ puppet-lint --no-140chars-check /path/to/my/manifest.pp
128
131
  ```
129
132
 
130
133
  puppet-lint will also check for a `.puppet-lint.rc` file in the current
@@ -152,10 +155,10 @@ task. Simply add the following line after the `require` statement in your
152
155
  PuppetLint.configuration.send("disable_<check name>")
153
156
  ```
154
157
 
155
- So, to disable the 80 character check, you would add:
158
+ So, to disable the 140 character check, you would add:
156
159
 
157
160
  ``` ruby
158
- PuppetLint.configuration.send("disable_80chars")
161
+ PuppetLint.configuration.send("disable_140chars")
159
162
  ```
160
163
 
161
164
  The Rake task also supports ignoring certain paths
@@ -164,6 +164,12 @@ class PuppetLint
164
164
  raise PuppetLint::NoCodeError
165
165
  end
166
166
 
167
+ if @code.empty?
168
+ @problems = []
169
+ @manifest = []
170
+ return
171
+ end
172
+
167
173
  linter = PuppetLint::Checks.new
168
174
  @problems = linter.run(@path, @code)
169
175
  @problems.each { |problem| @statistics[problem[:kind]] += 1 }
@@ -35,7 +35,7 @@ class PuppetLint::CheckPlugin
35
35
  #
36
36
  # Returns an Array of problem Hashes.
37
37
  def fix_problems
38
- @problems.each do |problem|
38
+ @problems.reject { |problem| problem[:kind] == :ignored }.each do |problem|
39
39
  if self.respond_to?(:fix)
40
40
  begin
41
41
  fix(problem)
@@ -90,6 +90,14 @@ class PuppetLint::CheckPlugin
90
90
  PuppetLint::Data.defined_type_indexes
91
91
  end
92
92
 
93
+ # Public: Provides positional information for any node definitions in the
94
+ # tokens array to the check plugins.
95
+ #
96
+ # Returns an Array of Hashes containing the position information.
97
+ def node_indexes
98
+ PuppetLint::Data.node_indexes
99
+ end
100
+
93
101
  # Public: Provides the expanded path of the file being analysed to check
94
102
  # plugins.
95
103
  #
@@ -20,7 +20,7 @@ class PuppetLint::Checks
20
20
  def load_data(path, content)
21
21
  lexer = PuppetLint::Lexer.new
22
22
  PuppetLint::Data.path = path
23
- PuppetLint::Data.manifest_lines = content.split("\n")
23
+ PuppetLint::Data.manifest_lines = content.split("\n", -1)
24
24
  begin
25
25
  PuppetLint::Data.tokens = lexer.tokenise(content)
26
26
  PuppetLint::Data.parse_control_comments
@@ -25,13 +25,23 @@ class PuppetLint::Data
25
25
  @resource_indexes = nil
26
26
  @class_indexes = nil
27
27
  @defined_type_indexes = nil
28
+ @function_indexes = nil
29
+ @array_indexes = nil
30
+ @hash_indexes = nil
31
+ @defaults_indexes = nil
28
32
  end
29
33
 
30
34
  # Public: Get the tokenised manifest.
31
35
  #
32
36
  # Returns an Array of PuppetLint::Lexer::Token objects.
33
37
  def tokens
34
- if caller[0][/`.*'/][1..-2] == 'check'
38
+ calling_method = begin
39
+ caller[0][/`.*'/][1..-2]
40
+ rescue NoMethodError
41
+ caller[1][/`.*'/][1..-2]
42
+ end
43
+
44
+ if calling_method == 'check'
35
45
  @tokens.dup
36
46
  else
37
47
  @tokens
@@ -100,7 +110,7 @@ class PuppetLint::Data
100
110
  if tokens[token_idx].type == :COLON
101
111
  next_token = tokens[token_idx].next_code_token
102
112
  depth = 1
103
- if next_token.type != :LBRACE
113
+ if next_token && next_token.type != :LBRACE
104
114
  tokens[(token_idx + 1)..-1].each_index do |idx|
105
115
  real_idx = token_idx + idx + 1
106
116
  if tokens[real_idx].type == :LBRACE
@@ -179,6 +189,20 @@ class PuppetLint::Data
179
189
  @defined_type_indexes ||= definition_indexes(:DEFINE)
180
190
  end
181
191
 
192
+ # Internal: Calculate the positions of all node definitions within the
193
+ # `tokens` Array.
194
+ #
195
+ # Returns an Array of Hashes, each containing:
196
+ # :start - An Integer position in the `tokens` Array pointing to the
197
+ # first Token of a defined type definition.
198
+ # :end - An Integer position in the `tokens` Array pointing to the last
199
+ # Token of a defined type definition.
200
+ # :tokens - An Array consisting of all the Token objects that make up the
201
+ # defined type.
202
+ def node_indexes
203
+ @node_indexes ||= definition_indexes(:NODE)
204
+ end
205
+
182
206
  # Internal: Calculate the positions of all the specified defintion types
183
207
  # within the `tokens` Array.
184
208
  #
@@ -232,6 +256,161 @@ class PuppetLint::Data
232
256
  result
233
257
  end
234
258
 
259
+ # Internal: Calculate the positions of all function calls within
260
+ # `tokens` Array.
261
+ #
262
+ # Returns an Array of Hashes, each containing:
263
+ # :start - An Integer position in the `tokens` Array pointing to the
264
+ # first Token of a function call
265
+ # :end - An Integer position in the `tokens` Array pointing to the last
266
+ # Token of a function call
267
+ # :tokens - An Array consisting of all the Token objects that make up the
268
+ # function call.
269
+ def function_indexes
270
+ @function_indexes ||= Proc.new do
271
+ functions = []
272
+ tokens.each_with_index do |token, token_idx|
273
+ if token.type == :NAME && \
274
+ (token_idx == 0 || (token_idx == 1 && tokens[0].type == :WHITESPACE) || token.prev_token.type == :NEWLINE || token.prev_token.type == :INDENT || \
275
+ # function in a function
276
+ (token.prev_code_token && token.prev_code_token.type == :LPAREN))
277
+
278
+ # Hash key
279
+ next if token.next_code_token && token.next_code_token.type == :FARROW
280
+
281
+ level = 0
282
+ real_idx = 0
283
+ in_paren = false
284
+ tokens[token_idx+1..-1].each_with_index do |cur_token, cur_token_idx|
285
+ break if level == 0 && in_paren
286
+ break if level == 0 && cur_token.type == :NEWLINE
287
+
288
+ if cur_token.type == :LPAREN
289
+ level += 1
290
+ in_paren = true
291
+ end
292
+ level -= 1 if cur_token.type == :RPAREN
293
+ real_idx = token_idx + 1 + cur_token_idx
294
+ end
295
+
296
+ functions << {
297
+ :start => token_idx,
298
+ :end => real_idx,
299
+ :tokens => tokens[token_idx..real_idx],
300
+ }
301
+ end
302
+ end
303
+ functions
304
+ end.call
305
+ end
306
+
307
+ # Internal: Calculate the positions of all array values within
308
+ # `tokens` Array.
309
+ #
310
+ # Returns an Array of Hashes, each containing:
311
+ # :start - An Integer position in the `tokens` Array pointing to the
312
+ # first Token of an array value
313
+ # :end - An Integer position in the `tokens` Array pointing to the last
314
+ # Token of an array value
315
+ # :tokens - An Array consisting of all the Token objects that make up the
316
+ # array value.
317
+ def array_indexes
318
+ @array_indexes ||= Proc.new do
319
+ arrays = []
320
+ tokens.each_with_index do |token, token_idx|
321
+ if token.type == :LBRACK
322
+ real_idx = 0
323
+ tokens[token_idx+1..-1].each_with_index do |cur_token, cur_token_idx|
324
+ real_idx = token_idx + 1 + cur_token_idx
325
+ break if cur_token.type == :RBRACK
326
+ end
327
+
328
+ # Ignore resource references
329
+ next if token.prev_code_token && \
330
+ token.prev_code_token.type == :CLASSREF
331
+ arrays << {
332
+ :start => token_idx,
333
+ :end => real_idx,
334
+ :tokens => tokens[token_idx..real_idx],
335
+ }
336
+ end
337
+ end
338
+ arrays
339
+ end.call
340
+ end
341
+
342
+ # Internal: Calculate the positions of all hash values within
343
+ # `tokens` Array.
344
+ #
345
+ # Returns an Array of Hashes, each containing:
346
+ # :start - An Integer position in the `tokens` Array pointing to the
347
+ # first Token of an hash value
348
+ # :end - An Integer position in the `tokens` Array pointing to the last
349
+ # Token of an hash value
350
+ # :tokens - An Array consisting of all the Token objects that make up the
351
+ # hash value.
352
+ def hash_indexes
353
+ @hash_indexes ||= Proc.new do
354
+ hashes = []
355
+ tokens.each_with_index do |token, token_idx|
356
+ next unless token.prev_code_token
357
+ next unless [:EQUALS, :ISEQUAL, :FARROW, :LPAREN].include? token.prev_code_token.type
358
+ if token.type == :LBRACE
359
+ level = 0
360
+ real_idx = 0
361
+ tokens[token_idx+1..-1].each_with_index do |cur_token, cur_token_idx|
362
+ real_idx = token_idx + 1 + cur_token_idx
363
+
364
+ level += 1 if cur_token.type == :LBRACE
365
+ level -= 1 if cur_token.type == :RBRACE
366
+ break if level < 0
367
+ end
368
+
369
+ hashes << {
370
+ :start => token_idx,
371
+ :end => real_idx,
372
+ :tokens => tokens[token_idx..real_idx],
373
+ }
374
+ end
375
+ end
376
+ hashes
377
+ end.call
378
+ end
379
+
380
+ # Internal: Calculate the positions of all defaults declarations within
381
+ # `tokens` Array.
382
+ #
383
+ # Returns an Array of Hashes, each containing:
384
+ # :start - An Integer position in the `tokens` Array pointing to the
385
+ # first Token of the defaults declaration
386
+ # :end - An Integer position in the `tokens` Array pointing to the last
387
+ # Token of the defaults declaration
388
+ # :tokens - An Array consisting of all the Token objects that make up the
389
+ # defaults declaration.
390
+ def defaults_indexes
391
+ @defaults_indexes ||= Proc.new do
392
+ defaults = []
393
+ tokens.each_with_index do |token, token_idx|
394
+ if token.type == :CLASSREF && token.next_code_token && \
395
+ token.next_code_token.type == :LBRACE
396
+ real_idx = 0
397
+
398
+ tokens[token_idx+1..-1].each_with_index do |cur_token, cur_token_idx|
399
+ real_idx = token_idx + 1 + cur_token_idx
400
+ break if cur_token.type == :RBRACE
401
+ end
402
+
403
+ defaults << {
404
+ :start => token_idx,
405
+ :end => real_idx,
406
+ :tokens => tokens[token_idx..real_idx],
407
+ }
408
+ end
409
+ end
410
+ defaults
411
+ end.call
412
+ end
413
+
235
414
  # Internal: Finds all the tokens that make up the defined type or class
236
415
  # definition parameters.
237
416
  #
@@ -195,11 +195,12 @@ class PuppetLint
195
195
 
196
196
  elsif mlcomment = chunk[/\A(\/\*.*?\*\/)/m, 1]
197
197
  length = mlcomment.size
198
+ mlcomment_raw = mlcomment.dup
198
199
  mlcomment.sub!(/\A\/\* ?/, '')
199
200
  mlcomment.sub!(/ ?\*\/\Z/, '')
200
- mlcomment.gsub!(/ *\* ?/, '')
201
- mlcomment.strip!
201
+ mlcomment.gsub!(/^ *\*/, '')
202
202
  tokens << new_token(:MLCOMMENT, mlcomment, length)
203
+ tokens.last.raw = mlcomment_raw
203
204
 
204
205
  elsif chunk.match(/\A\/.*?\//) && possible_regex?
205
206
  str_content = StringScanner.new(code[i+1..-1]).scan_until(/(\A|[^\\])(\\\\)*\//m)
@@ -9,6 +9,9 @@ class PuppetLint
9
9
  # Public: Returns the String value of the Token.
10
10
  attr_accessor :value
11
11
 
12
+ # Public: Returns the raw value of the Token.
13
+ attr_accessor :raw
14
+
12
15
  # Public: Returns the Integer line number of the manifest text where
13
16
  # the Token can be found.
14
17
  attr_reader :line
@@ -87,6 +90,8 @@ class PuppetLint
87
90
  "##{@value}"
88
91
  when :REGEX
89
92
  "/#{@value}/"
93
+ when :MLCOMMENT
94
+ @raw
90
95
  else
91
96
  @value
92
97
  end
@@ -58,6 +58,14 @@ class PuppetLint::OptParser
58
58
  load f
59
59
  end
60
60
 
61
+ opts.on('--load-from-puppet MODULEPATH', 'Load plugins from the given Puppet module path.') do |path|
62
+ path.split(':').each do |p|
63
+ Dir["#{p}/*/lib/puppet-lint/plugins/*.rb"].each do |file|
64
+ load file
65
+ end
66
+ end
67
+ end
68
+
61
69
  opts.on('-f', '--fix', 'Attempt to automatically fix errors') do
62
70
  PuppetLint.configuration.fix = true
63
71
  end
@@ -98,7 +106,12 @@ class PuppetLint::OptParser
98
106
  end
99
107
 
100
108
  opts.load('/etc/puppet-lint.rc')
101
- opts.load(File.expand_path('~/.puppet-lint.rc')) if ENV['HOME']
109
+ begin
110
+ opts.load(File.expand_path('~/.puppet-lint.rc')) if ENV['HOME']
111
+ rescue Errno::EACCES
112
+ # silently skip loading this file if HOME is set to a directory that
113
+ # the user doesn't have read access to.
114
+ end
102
115
  opts.load('.puppet-lint.rc')
103
116
  end
104
117
  end
@@ -45,7 +45,7 @@ PuppetLint.new_check(:autoloader_layout) do
45
45
  end
46
46
 
47
47
  # Public: Check the manifest tokens for any classes or defined types that
48
- # have a dash in their name and record a warning for each instance found.
48
+ # have a dash in their name and record an error for each instance found.
49
49
  PuppetLint.new_check(:names_containing_dash) do
50
50
  def check
51
51
  (class_indexes + defined_type_indexes).each do |class_idx|
@@ -56,7 +56,7 @@ PuppetLint.new_check(:names_containing_dash) do
56
56
  obj_type = 'defined type'
57
57
  end
58
58
 
59
- notify :warning, {
59
+ notify :error, {
60
60
  :message => "#{obj_type} name containing a dash",
61
61
  :line => class_idx[:name_token].line,
62
62
  :column => class_idx[:name_token].column,
@@ -263,17 +263,19 @@ PuppetLint.new_check(:variable_scope) do
263
263
  msg = "top-scope variable being used without an explicit namespace"
264
264
  referenced_variables.each do |token|
265
265
  unless future_parser_scopes[token.line].nil?
266
- next if future_parser_scopes[token.line].include?(token.value)
266
+ next if future_parser_scopes[token.line].include?(token.value.gsub(/\[.+\]\Z/, ''))
267
267
  end
268
268
 
269
269
  unless token.value.include? '::'
270
- unless variables_in_scope.include? token.value.gsub(/\[.+\]\Z/, '')
271
- unless token.value =~ /\A\d+\Z/
272
- notify :warning, {
273
- :message => msg,
274
- :line => token.line,
275
- :column => token.column,
276
- }
270
+ unless token.value =~ /^(facts|trusted)\[.+\]/
271
+ unless variables_in_scope.include? token.value.gsub(/\[.+\]\Z/, '')
272
+ unless token.value =~ /\A\d+\Z/
273
+ notify :warning, {
274
+ :message => msg,
275
+ :line => token.line,
276
+ :column => token.column,
277
+ }
278
+ end
277
279
  end
278
280
  end
279
281
  end
@@ -36,7 +36,7 @@ PuppetLint.new_check(:star_comments) do
36
36
  end
37
37
 
38
38
  def fix(problem)
39
- comment_lines = problem[:token].value.split("\n")
39
+ comment_lines = problem[:token].value.strip.split("\n").map(&:strip)
40
40
  first_line = comment_lines.shift
41
41
  problem[:token].type = :COMMENT
42
42
  problem[:token].value = " #{first_line}"
@@ -46,9 +46,13 @@ PuppetLint.new_check(:case_without_default) do
46
46
  end
47
47
  end
48
48
 
49
- case_indexes.each do |kase|
49
+ case_indexes.each_with_index do |kase,kase_index|
50
50
  case_tokens = tokens[kase[:start]..kase[:end]]
51
51
 
52
+ case_indexes[(kase_index + 1)..-1].each do |successor_kase|
53
+ case_tokens -= tokens[successor_kase[:start]..successor_kase[:end]]
54
+ end
55
+
52
56
  unless case_tokens.index { |r| r.type == :DEFAULT }
53
57
  notify :warning, {
54
58
  :message => 'case statement without a default case',
@@ -5,7 +5,8 @@ PuppetLint.new_check(:unquoted_node_name) do
5
5
  node_tokens = tokens.select { |token| token.type == :NODE }
6
6
  node_tokens.each do |node|
7
7
  node_token_idx = tokens.index(node)
8
- node_lbrace_idx = tokens.index(tokens.find { |token| token.type == :LBRACE })
8
+ node_lbrace_tok = tokens[node_token_idx..-1].find { |token| token.type == :LBRACE }
9
+ node_lbrace_idx = tokens.index(node_lbrace_tok)
9
10
 
10
11
  tokens[node_token_idx..node_lbrace_idx].select { |token|
11
12
  token.type == :NAME
@@ -155,15 +155,20 @@ end
155
155
  PuppetLint.new_check(:puppet_url_without_modules) do
156
156
  def check
157
157
  tokens.select { |token|
158
- token.type == :SSTRING && token.value.start_with?('puppet://')
158
+ (token.type == :SSTRING || token.type == :STRING || token.type == :DQPRE) && token.value.start_with?('puppet://')
159
159
  }.reject { |token|
160
- token.value[/puppet:\/\/.*?\/(.+)/, 1].start_with?('modules/')
160
+ token.value[/puppet:\/\/.*?\/(.+)/, 1].start_with?('modules/') unless token.value[/puppet:\/\/.*?\/(.+)/, 1].nil?
161
161
  }.each do |token|
162
162
  notify :warning, {
163
163
  :message => 'puppet:// URL without modules/ found',
164
164
  :line => token.line,
165
165
  :column => token.column,
166
+ :token => token,
166
167
  }
167
168
  end
168
169
  end
170
+
171
+ def fix(problem)
172
+ problem[:token].value.gsub!(/(puppet:\/\/.*?\/)/, '\1modules/')
173
+ end
169
174
  end
@@ -26,7 +26,7 @@ end
26
26
  PuppetLint.new_check(:trailing_whitespace) do
27
27
  def check
28
28
  tokens.select { |token|
29
- token.type == :WHITESPACE
29
+ [:WHITESPACE, :INDENT].include?(token.type)
30
30
  }.select { |token|
31
31
  token.next_token.nil? || token.next_token.type == :NEWLINE
32
32
  }.each do |token|
@@ -48,19 +48,19 @@ PuppetLint.new_check(:trailing_whitespace) do
48
48
  end
49
49
  end
50
50
 
51
- # Public: Test the raw manifest string for lines containing more than 80
51
+ # Public: Test the raw manifest string for lines containing more than 140
52
52
  # characters and record a warning for each instance found. The only exceptions
53
53
  # to this rule are lines containing URLs and template() calls which would hurt
54
54
  # readability if split.
55
- PuppetLint.new_check(:'80chars') do
55
+ PuppetLint.new_check(:'140chars') do
56
56
  def check
57
57
  manifest_lines.each_with_index do |line, idx|
58
58
  unless line =~ /:\/\// || line =~ /template\(/
59
- if line.scan(/./mu).size > 80
59
+ if line.scan(/./mu).size > 140
60
60
  notify :warning, {
61
- :message => 'line has more than 80 characters',
61
+ :message => 'line has more than 140 characters',
62
62
  :line => idx + 1,
63
- :column => 80,
63
+ :column => 140,
64
64
  }
65
65
  end
66
66
  end
@@ -112,7 +112,8 @@ PuppetLint.new_check(:arrow_alignment) do
112
112
  if token.type == :FARROW
113
113
  (level_tokens[indent_depth_idx] ||= []) << token
114
114
  prev_indent_token = resource_tokens[0..idx].rindex { |t| t.type == :INDENT }
115
- indent_length = resource_tokens[prev_indent_token].to_manifest.length + token.prev_code_token.to_manifest.length + 2
115
+ indent_token_length = prev_indent_token.nil? ? 0 : resource_tokens[prev_indent_token].to_manifest.length
116
+ indent_length = indent_token_length + token.prev_code_token.to_manifest.length + 2
116
117
 
117
118
  if indent_depth[indent_depth_idx] < indent_length
118
119
  indent_depth[indent_depth_idx] = indent_length
@@ -122,9 +123,9 @@ PuppetLint.new_check(:arrow_alignment) do
122
123
  indent_depth_idx += 1
123
124
  indent_depth << 0
124
125
  level_tokens[indent_depth_idx] ||= []
125
- elsif token.type == :RBRACE
126
+ elsif token.type == :RBRACE || token.type == :SEMIC
126
127
  level_tokens[indent_depth_idx].each do |arrow_tok|
127
- unless arrow_tok.column == indent_depth[indent_depth_idx]
128
+ unless arrow_tok.column == indent_depth[indent_depth_idx] || level_tokens[indent_depth_idx].size == 1
128
129
  arrows_on_line = level_tokens[indent_depth_idx].select { |t| t.line == arrow_tok.line }
129
130
  notify :warning, {
130
131
  :message => 'indentation of => is not properly aligned',
@@ -26,6 +26,7 @@ class PuppetLint
26
26
  attr_accessor :with_context
27
27
  attr_accessor :fix
28
28
  attr_accessor :show_ignored
29
+ attr_accessor :relative
29
30
 
30
31
  # Public: Initialise a new PuppetLint::RakeTask.
31
32
  #
@@ -49,6 +50,8 @@ class PuppetLint
49
50
 
50
51
  task_block.call(*[self, args].slice(0, task_block.arity)) if task_block
51
52
 
53
+ # clear any (auto-)pre-existing task
54
+ Rake::Task[@name].clear if Rake::Task.task_defined?(@name)
52
55
  task @name do
53
56
  PuppetLint::OptParser.build
54
57
 
@@ -56,11 +59,15 @@ class PuppetLint
56
59
  PuppetLint.configuration.send("disable_#{check}")
57
60
  end
58
61
 
59
- %w{with_filename fail_on_warnings error_level log_format with_context fix show_ignored}.each do |config|
62
+ %w{with_filename fail_on_warnings error_level log_format with_context fix show_ignored relative}.each do |config|
60
63
  value = instance_variable_get("@#{config}")
61
64
  PuppetLint.configuration.send("#{config}=".to_sym, value) unless value.nil?
62
65
  end
63
66
 
67
+ if PuppetLint.configuration.ignore_paths
68
+ @ignore_paths = PuppetLint.configuration.ignore_paths
69
+ end
70
+
64
71
  RakeFileUtils.send(:verbose, true) do
65
72
  linter = PuppetLint.new
66
73
  matched_files = FileList[@pattern]
@@ -1,3 +1,3 @@
1
1
  class PuppetLint
2
- VERSION = '1.1.0'
2
+ VERSION = '2.0.0'
3
3
  end
@@ -0,0 +1,12 @@
1
+ file { 'test1':
2
+ source => 'puppet:///foo'
3
+ }
4
+ file { 'test2':
5
+ source => "puppet:///foo/${::fqdn}"
6
+ }
7
+ file { 'test3':
8
+ source => "puppet:///${::fqdn}/foo"
9
+ }
10
+ file { 'test4':
11
+ source => "puppet:///foo/${::fqdn}/bar"
12
+ }
@@ -687,7 +687,7 @@ describe PuppetLint::Lexer do
687
687
  it 'should match comments on multiple lines' do
688
688
  token = @lexer.tokenise("/* foo\n * bar\n*/").first
689
689
  expect(token.type).to eq(:MLCOMMENT)
690
- expect(token.value).to eq("foo\nbar")
690
+ expect(token.value).to eq("foo\n bar\n")
691
691
  end
692
692
  end
693
693
 
@@ -12,8 +12,8 @@ describe 'names_containing_dash' do
12
12
  expect(problems).to have(1).problem
13
13
  end
14
14
 
15
- it 'should create a warning' do
16
- expect(problems).to contain_warning(class_msg).on_line(1).in_column(7)
15
+ it 'should create an error' do
16
+ expect(problems).to contain_error(class_msg).on_line(1).in_column(7)
17
17
  end
18
18
  end
19
19
 
@@ -25,8 +25,8 @@ describe 'names_containing_dash' do
25
25
  expect(problems).to have(1).problem
26
26
  end
27
27
 
28
- it 'should create a warning' do
29
- expect(problems).to contain_warning(define_msg).on_line(1).in_column(8)
28
+ it 'should create an error' do
29
+ expect(problems).to contain_error(define_msg).on_line(1).in_column(8)
30
30
  end
31
31
  end
32
32
 
@@ -38,8 +38,8 @@ describe 'names_containing_dash' do
38
38
  expect(problems).to have(1).problem
39
39
  end
40
40
 
41
- it 'should create a warning' do
42
- expect(problems).to contain_warning(class_msg).on_line(1).in_column(7)
41
+ it 'should create an error' do
42
+ expect(problems).to contain_error(class_msg).on_line(1).in_column(7)
43
43
  end
44
44
  end
45
45
  end
@@ -147,16 +147,19 @@ describe 'variable_scope' do
147
147
  context 'future parser blocks' do
148
148
  let(:code) { "
149
149
  class foo() {
150
- $foo = [1,2]
150
+ $foo = {1=>2, 3=>4}
151
151
  $foo.each |$a, $b| {
152
- $a
153
- $c
152
+ $a # should cause no warnings
153
+ $c # top-scope variable warning
154
+ }
155
+ $b # top-scope variable warning
156
+ $foo.each |$d| {
157
+ $d[1] # should cause no warnings
154
158
  }
155
- $b
156
159
  }
157
160
  " }
158
161
 
159
- it 'should only detect a single problem' do
162
+ it 'should only detect two problems' do
160
163
  expect(problems).to have(2).problem
161
164
  end
162
165
 
@@ -179,4 +182,18 @@ describe 'variable_scope' do
179
182
  end
180
183
  end
181
184
  end
185
+
186
+ context 'support the use of facts and trusted facts for Puppet 3.5 onwards' do
187
+ let(:code) { "
188
+ class foo() {
189
+ if $facts['osfamily'] == 'redhat' or $trusted['osfamily'] == 'redhat' {
190
+ $redhat = true
191
+ }
192
+ }
193
+ " }
194
+
195
+ it 'should not detect any problems' do
196
+ expect(problems).to have(0).problems
197
+ end
198
+ end
182
199
  end
@@ -32,6 +32,48 @@ describe 'case_without_default' do
32
32
  expect(problems).to contain_warning(msg).on_line(2).in_column(7)
33
33
  end
34
34
  end
35
+
36
+ context 'nested case statements without a default case on the outermost' do
37
+ let(:code) { "
38
+ case $foo {
39
+ case $foop {
40
+ bar: {}
41
+ default: {}
42
+ }
43
+ }"
44
+ }
45
+
46
+ it 'should only detect a single problem' do
47
+ expect(problems).to have(1).problem
48
+ end
49
+
50
+ it 'should create a warning' do
51
+ expect(problems).to contain_warning(msg)
52
+ end
53
+ end
54
+
55
+ context 'three nested case statements with two missing default cases' do
56
+ let(:code) { "
57
+ case $foo {
58
+ case $foop {
59
+ bar: {}
60
+ case $woop {
61
+ baz: {}
62
+ }
63
+ default: {}
64
+ }
65
+ }"
66
+ }
67
+
68
+ it 'should detect two problems' do
69
+ expect(problems).to have(2).problems
70
+ end
71
+
72
+ it 'should create two warnings' do
73
+ expect(problems).to contain_warning(msg).on_line(2).in_column(7)
74
+ expect(problems).to contain_warning(msg).on_line(5).in_column(4)
75
+ end
76
+ end
35
77
 
36
78
  context 'issue-117' do
37
79
  let(:code) { "
@@ -66,6 +66,19 @@ describe 'unquoted_node_name' do
66
66
  expect(problems).to contain_warning(msg).on_line(1).in_column(18)
67
67
  end
68
68
  end
69
+
70
+ context 'multiple node blocks' do
71
+ let(:code) { "node foo { } node bar { }" }
72
+
73
+ it 'should detect 2 problems' do
74
+ expect(problems).to have(2).problems
75
+ end
76
+
77
+ it 'should create 2 warnings' do
78
+ expect(problems).to contain_warning(msg).on_line(1).in_column(6)
79
+ expect(problems).to contain_warning(msg).on_line(1).in_column(19)
80
+ end
81
+ end
69
82
  end
70
83
 
71
84
  context 'with fix enabled' do
@@ -89,4 +89,12 @@ describe 'duplicate_params' do
89
89
  expect(problems).to have(0).problems
90
90
  end
91
91
  end
92
+
93
+ context 'colon as last token in file' do
94
+ let(:code) { "}:" }
95
+
96
+ it 'should not detect any problems' do
97
+ expect(problems).to have(0).problems
98
+ end
99
+ end
92
100
  end
@@ -11,15 +11,52 @@ describe 'puppet_url_without_modules' do
11
11
  end
12
12
  end
13
13
 
14
- context 'puppet:// url without modules' do
15
- let(:code) { "'puppet:///foo'" }
14
+ context 'with fix disabled' do
15
+ context 'puppet:// url without modules' do
16
+ let(:code) { "'puppet:///foo'" }
16
17
 
17
- it 'should only detect a single problem' do
18
- expect(problems).to have(1).problem
18
+ it 'should only detect a single problem' do
19
+ expect(problems).to have(1).problem
20
+ end
21
+
22
+ it 'should create a warning' do
23
+ expect(problems).to contain_warning(msg).on_line(1).in_column(1)
24
+ end
25
+ end
26
+ end
27
+
28
+ context 'with fix enabled' do
29
+ before do
30
+ PuppetLint.configuration.fix = true
19
31
  end
20
32
 
21
- it 'should create a warning' do
22
- expect(problems).to contain_warning(msg).on_line(1).in_column(1)
33
+ after do
34
+ PuppetLint.configuration.fix = false
23
35
  end
36
+
37
+ context 'puppet:// url without modules' do
38
+ let(:code) { "'puppet:///foo'" }
39
+
40
+ it 'should only detect a single problem' do
41
+ expect(problems).to have(1).problem
42
+ end
43
+
44
+ it 'should fix the manifest' do
45
+ expect(problems).to contain_fixed(msg).on_line(1).in_column(1)
46
+ end
47
+
48
+ it 'should insert modules into the path' do
49
+ expect(manifest).to eq("'puppet:///modules/foo'")
50
+ end
51
+ end
52
+ end
53
+
54
+ context 'double string wrapped puppet:// urls' do
55
+ let(:code) { File.read('spec/fixtures/test/manifests/url_interpolation.pp') }
56
+
57
+ it 'should detect several problems' do
58
+ expect(problems).to have(4).problem
59
+ end
60
+
24
61
  end
25
62
  end
@@ -1,10 +1,10 @@
1
1
  # encoding: utf-8
2
2
  require 'spec_helper'
3
3
 
4
- describe '80chars' do
5
- let(:msg) { 'line has more than 80 characters' }
4
+ describe '140chars' do
5
+ let(:msg) { 'line has more than 140 characters' }
6
6
 
7
- context 'file resource with a source line > 80c' do
7
+ context 'file resource with a source line > 140c' do
8
8
  let(:code) { "
9
9
  file {
10
10
  source => 'puppet:///modules/certificates/etc/ssl/private/wildcard.example.com.crt',
@@ -16,7 +16,7 @@ describe '80chars' do
16
16
  end
17
17
  end
18
18
 
19
- context 'file resource with a template line > 80c' do
19
+ context 'file resource with a template line > 140c' do
20
20
  let(:code) { "
21
21
  file {
22
22
  content => template('mymodule/this/is/a/truely/absurdly/long/path/that/should/make/you/feel/bad'),
@@ -40,15 +40,15 @@ describe '80chars' do
40
40
  end
41
41
  end
42
42
 
43
- context '81 character line' do
44
- let(:code) { 'a' * 81 }
43
+ context '141 character line' do
44
+ let(:code) { 'a' * 141 }
45
45
 
46
46
  it 'should only detect a single problem' do
47
47
  expect(problems).to have(1).problem
48
48
  end
49
49
 
50
50
  it 'should create a warning' do
51
- expect(problems).to contain_warning(msg).on_line(1).in_column(80)
51
+ expect(problems).to contain_warning(msg).on_line(1).in_column(140)
52
52
  end
53
53
  end
54
54
  end
@@ -126,6 +126,28 @@ describe 'arrow_alignment' do
126
126
  end
127
127
  end
128
128
 
129
+ context 'single resource with a misaligned => and semicolon at the end' do
130
+ let(:code) { "
131
+ file { '/tmp/bar':
132
+ foo => 1,
133
+ bar => 2,
134
+ gronk => 3,
135
+ baz => 4,
136
+ meh => 5;
137
+ }"
138
+ }
139
+
140
+ it 'should detect four problems' do
141
+ expect(problems).to have(4).problems
142
+ end
143
+
144
+ it 'should create four warnings' do
145
+ expect(problems).to contain_warning(msg).on_line(3).in_column(15)
146
+ expect(problems).to contain_warning(msg).on_line(4).in_column(15)
147
+ expect(problems).to contain_warning(msg).on_line(6).in_column(16)
148
+ expect(problems).to contain_warning(msg).on_line(7).in_column(15)
149
+ end
150
+ end
129
151
  context 'complex resource with a misaligned =>' do
130
152
  let(:code) { "
131
153
  file { '/tmp/foo':
@@ -171,6 +193,34 @@ describe 'arrow_alignment' do
171
193
  end
172
194
  end
173
195
 
196
+ context 'multi-resource with a misaligned => and semicolons' do
197
+ let(:code) { "
198
+ file {
199
+ '/tmp/foo':
200
+ ensure => 'directory',
201
+ owner => 'root',
202
+ mode => '0755';
203
+ '/tmp/bar':
204
+ ensure => 'directory';
205
+ '/tmp/baz':
206
+ ensure => 'directory',
207
+ owner => 'root',
208
+ mode => '0755';
209
+ }"
210
+ }
211
+
212
+ it 'should only detect a single problem' do
213
+ expect(problems).to have(4).problem
214
+ end
215
+
216
+ it 'should create a warning' do
217
+ expect(problems).to contain_warning(msg).on_line(5).in_column(19)
218
+ expect(problems).to contain_warning(msg).on_line(6).in_column(18)
219
+ expect(problems).to contain_warning(msg).on_line(11).in_column(19)
220
+ expect(problems).to contain_warning(msg).on_line(12).in_column(18)
221
+ end
222
+ end
223
+
174
224
  context 'multiple single line resources' do
175
225
  let(:code) { "
176
226
  file { 'foo': ensure => file }
@@ -268,6 +318,20 @@ describe 'arrow_alignment' do
268
318
  expect(problems).to contain_warning(msg).on_line(3).in_column(26)
269
319
  end
270
320
  end
321
+
322
+ context 'resource param containing a single-element same-line hash' do
323
+ let(:code) { "
324
+ foo { 'foo':
325
+ a => true,
326
+ b => { 'a' => 'b' }
327
+ }
328
+ "}
329
+
330
+ it 'should not detect any problems' do
331
+ expect(problems).to have(0).problems
332
+ end
333
+ end
334
+
271
335
  end
272
336
 
273
337
  context 'with fix enabled' do
@@ -15,6 +15,22 @@ describe 'trailing_whitespace' do
15
15
  expect(problems).to contain_error(msg).on_line(1).in_column(4)
16
16
  end
17
17
  end
18
+
19
+ context 'line without code and trailing whitespace' do
20
+ let(:code) { "
21
+ class {
22
+
23
+ }
24
+ " }
25
+
26
+ it 'should only detect a single problem' do
27
+ expect(problems).to have(1).problem
28
+ end
29
+
30
+ it 'should create an error' do
31
+ expect(problems).to contain_error(msg).on_line(3).in_column(1)
32
+ end
33
+ end
18
34
  end
19
35
 
20
36
  context 'with fix enabled' do
@@ -57,5 +73,29 @@ describe 'trailing_whitespace' do
57
73
  expect(manifest).to eq("foo\nbar")
58
74
  end
59
75
  end
76
+
77
+ context 'line without code and trailing whitespace' do
78
+ let(:code) { "
79
+ class foo {
80
+
81
+ }
82
+ " }
83
+ let(:fixed) { "
84
+ class foo {
85
+
86
+ }
87
+ " }
88
+ it 'should only detect a single problem' do
89
+ expect(problems).to have(1).problem
90
+ end
91
+
92
+ it 'should create an error' do
93
+ expect(problems).to contain_fixed(msg).on_line(3).in_column(1)
94
+ end
95
+
96
+ it 'should remove the trailing whitespace' do
97
+ expect(manifest).to eq(fixed)
98
+ end
99
+ end
60
100
  end
61
101
  end
metadata CHANGED
@@ -1,94 +1,80 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: puppet-lint
3
- version: !ruby/object:Gem::Version
4
- hash: 19
5
- prerelease:
6
- segments:
7
- - 1
8
- - 1
9
- - 0
10
- version: 1.1.0
3
+ version: !ruby/object:Gem::Version
4
+ version: 2.0.0
11
5
  platform: ruby
12
- authors:
6
+ authors:
13
7
  - Tim Sharpe
14
8
  autorequire:
15
9
  bindir: bin
16
10
  cert_chain: []
17
-
18
- date: 2014-09-23 00:00:00 -07:00
19
- default_executable:
20
- dependencies:
21
- - !ruby/object:Gem::Dependency
11
+ date: 2016-06-22 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
22
14
  name: rake
23
- prerelease: false
24
- requirement: &id001 !ruby/object:Gem::Requirement
25
- none: false
26
- requirements:
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
27
17
  - - ~>
28
- - !ruby/object:Gem::Version
29
- hash: 35
30
- segments:
31
- - 10
32
- - 0
33
- version: "10.0"
18
+ - !ruby/object:Gem::Version
19
+ version: '10.0'
34
20
  type: :development
35
- version_requirements: *id001
36
- - !ruby/object:Gem::Dependency
37
- name: rspec
38
21
  prerelease: false
39
- requirement: &id002 !ruby/object:Gem::Requirement
40
- none: false
41
- requirements:
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ~>
25
+ - !ruby/object:Gem::Version
26
+ version: '10.0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rspec
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
42
31
  - - ~>
43
- - !ruby/object:Gem::Version
44
- hash: 7
45
- segments:
46
- - 3
47
- - 0
48
- version: "3.0"
32
+ - !ruby/object:Gem::Version
33
+ version: '3.0'
49
34
  type: :development
50
- version_requirements: *id002
51
- - !ruby/object:Gem::Dependency
52
- name: rspec-its
53
35
  prerelease: false
54
- requirement: &id003 !ruby/object:Gem::Requirement
55
- none: false
56
- requirements:
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ~>
39
+ - !ruby/object:Gem::Version
40
+ version: '3.0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rspec-its
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
57
45
  - - ~>
58
- - !ruby/object:Gem::Version
59
- hash: 15
60
- segments:
61
- - 1
62
- - 0
63
- version: "1.0"
46
+ - !ruby/object:Gem::Version
47
+ version: '1.0'
64
48
  type: :development
65
- version_requirements: *id003
66
- - !ruby/object:Gem::Dependency
67
- name: rspec-collection_matchers
68
49
  prerelease: false
69
- requirement: &id004 !ruby/object:Gem::Requirement
70
- none: false
71
- requirements:
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ~>
53
+ - !ruby/object:Gem::Version
54
+ version: '1.0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rspec-collection_matchers
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
72
59
  - - ~>
73
- - !ruby/object:Gem::Version
74
- hash: 15
75
- segments:
76
- - 1
77
- - 0
78
- version: "1.0"
60
+ - !ruby/object:Gem::Version
61
+ version: '1.0'
79
62
  type: :development
80
- version_requirements: *id004
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ~>
67
+ - !ruby/object:Gem::Version
68
+ version: '1.0'
81
69
  description: |-
82
70
  Checks your Puppet manifests against the Puppetlabs
83
71
  style guide and alerts you to any discrepancies.
84
72
  email: tim@sharpe.id.au
85
- executables:
73
+ executables:
86
74
  - puppet-lint
87
75
  extensions: []
88
-
89
76
  extra_rdoc_files: []
90
-
91
- files:
77
+ files:
92
78
  - .gitignore
93
79
  - .travis.yml
94
80
  - Gemfile
@@ -128,6 +114,7 @@ files:
128
114
  - spec/fixtures/test/manifests/ignore_reason.pp
129
115
  - spec/fixtures/test/manifests/init.pp
130
116
  - spec/fixtures/test/manifests/malformed.pp
117
+ - spec/fixtures/test/manifests/url_interpolation.pp
131
118
  - spec/fixtures/test/manifests/warning.pp
132
119
  - spec/puppet-lint/bin_spec.rb
133
120
  - spec/puppet-lint/configuration_spec.rb
@@ -161,48 +148,37 @@ files:
161
148
  - spec/puppet-lint/plugins/check_strings/single_quote_string_with_variables_spec.rb
162
149
  - spec/puppet-lint/plugins/check_strings/variables_not_enclosed_spec.rb
163
150
  - spec/puppet-lint/plugins/check_variables/variable_contains_dash_spec.rb
151
+ - spec/puppet-lint/plugins/check_whitespace/140chars_spec.rb
164
152
  - spec/puppet-lint/plugins/check_whitespace/2sp_soft_tabs_spec.rb
165
- - spec/puppet-lint/plugins/check_whitespace/80chars_spec.rb
166
153
  - spec/puppet-lint/plugins/check_whitespace/arrow_alignment_spec.rb
167
154
  - spec/puppet-lint/plugins/check_whitespace/hard_tabs_spec.rb
168
155
  - spec/puppet-lint/plugins/check_whitespace/trailing_whitespace_spec.rb
169
156
  - spec/puppet-lint_spec.rb
170
157
  - spec/spec_helper.rb
171
- has_rdoc: true
172
158
  homepage: https://github.com/rodjek/puppet-lint/
173
159
  licenses: []
174
-
160
+ metadata: {}
175
161
  post_install_message:
176
162
  rdoc_options: []
177
-
178
- require_paths:
163
+ require_paths:
179
164
  - lib
180
- required_ruby_version: !ruby/object:Gem::Requirement
181
- none: false
182
- requirements:
183
- - - ">="
184
- - !ruby/object:Gem::Version
185
- hash: 3
186
- segments:
187
- - 0
188
- version: "0"
189
- required_rubygems_version: !ruby/object:Gem::Requirement
190
- none: false
191
- requirements:
192
- - - ">="
193
- - !ruby/object:Gem::Version
194
- hash: 3
195
- segments:
196
- - 0
197
- version: "0"
165
+ required_ruby_version: !ruby/object:Gem::Requirement
166
+ requirements:
167
+ - - '>='
168
+ - !ruby/object:Gem::Version
169
+ version: '0'
170
+ required_rubygems_version: !ruby/object:Gem::Requirement
171
+ requirements:
172
+ - - '>='
173
+ - !ruby/object:Gem::Version
174
+ version: '0'
198
175
  requirements: []
199
-
200
176
  rubyforge_project:
201
- rubygems_version: 1.6.2
177
+ rubygems_version: 2.0.14
202
178
  signing_key:
203
- specification_version: 3
179
+ specification_version: 4
204
180
  summary: Ensure your Puppet manifests conform with the Puppetlabs style guide
205
- test_files:
181
+ test_files:
206
182
  - spec/fixtures/test/manifests/fail.pp
207
183
  - spec/fixtures/test/manifests/ignore.pp
208
184
  - spec/fixtures/test/manifests/ignore_multiple_block.pp
@@ -210,6 +186,7 @@ test_files:
210
186
  - spec/fixtures/test/manifests/ignore_reason.pp
211
187
  - spec/fixtures/test/manifests/init.pp
212
188
  - spec/fixtures/test/manifests/malformed.pp
189
+ - spec/fixtures/test/manifests/url_interpolation.pp
213
190
  - spec/fixtures/test/manifests/warning.pp
214
191
  - spec/puppet-lint/bin_spec.rb
215
192
  - spec/puppet-lint/configuration_spec.rb
@@ -243,10 +220,11 @@ test_files:
243
220
  - spec/puppet-lint/plugins/check_strings/single_quote_string_with_variables_spec.rb
244
221
  - spec/puppet-lint/plugins/check_strings/variables_not_enclosed_spec.rb
245
222
  - spec/puppet-lint/plugins/check_variables/variable_contains_dash_spec.rb
223
+ - spec/puppet-lint/plugins/check_whitespace/140chars_spec.rb
246
224
  - spec/puppet-lint/plugins/check_whitespace/2sp_soft_tabs_spec.rb
247
- - spec/puppet-lint/plugins/check_whitespace/80chars_spec.rb
248
225
  - spec/puppet-lint/plugins/check_whitespace/arrow_alignment_spec.rb
249
226
  - spec/puppet-lint/plugins/check_whitespace/hard_tabs_spec.rb
250
227
  - spec/puppet-lint/plugins/check_whitespace/trailing_whitespace_spec.rb
251
228
  - spec/puppet-lint_spec.rb
252
229
  - spec/spec_helper.rb
230
+ has_rdoc: