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.
- checksums.yaml +7 -0
- data/.gitignore +1 -0
- data/README.md +9 -6
- data/lib/puppet-lint.rb +6 -0
- data/lib/puppet-lint/checkplugin.rb +9 -1
- data/lib/puppet-lint/checks.rb +1 -1
- data/lib/puppet-lint/data.rb +181 -2
- data/lib/puppet-lint/lexer.rb +3 -2
- data/lib/puppet-lint/lexer/token.rb +5 -0
- data/lib/puppet-lint/optparser.rb +14 -1
- data/lib/puppet-lint/plugins/check_classes.rb +12 -10
- data/lib/puppet-lint/plugins/check_comments.rb +1 -1
- data/lib/puppet-lint/plugins/check_conditionals.rb +5 -1
- data/lib/puppet-lint/plugins/check_nodes.rb +2 -1
- data/lib/puppet-lint/plugins/check_strings.rb +7 -2
- data/lib/puppet-lint/plugins/check_whitespace.rb +10 -9
- data/lib/puppet-lint/tasks/puppet-lint.rb +8 -1
- data/lib/puppet-lint/version.rb +1 -1
- data/spec/fixtures/test/manifests/url_interpolation.pp +12 -0
- data/spec/puppet-lint/lexer_spec.rb +1 -1
- data/spec/puppet-lint/plugins/check_classes/names_containing_dash_spec.rb +6 -6
- data/spec/puppet-lint/plugins/check_classes/variable_scope_spec.rb +22 -5
- data/spec/puppet-lint/plugins/check_conditionals/case_without_default_spec.rb +42 -0
- data/spec/puppet-lint/plugins/check_nodes/unquoted_node_name_spec.rb +13 -0
- data/spec/puppet-lint/plugins/check_resources/duplicate_params_spec.rb +8 -0
- data/spec/puppet-lint/plugins/check_strings/puppet_url_without_modules_spec.rb +43 -6
- data/spec/puppet-lint/plugins/check_whitespace/{80chars_spec.rb → 140chars_spec.rb} +7 -7
- data/spec/puppet-lint/plugins/check_whitespace/arrow_alignment_spec.rb +64 -0
- data/spec/puppet-lint/plugins/check_whitespace/trailing_whitespace_spec.rb +40 -0
- metadata +72 -94
checksums.yaml
ADDED
@@ -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
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', '
|
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
|
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
|
127
|
+
wanted to skip the 140 character check, you would run
|
125
128
|
|
126
129
|
```
|
127
|
-
puppet-lint --no-
|
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
|
158
|
+
So, to disable the 140 character check, you would add:
|
156
159
|
|
157
160
|
``` ruby
|
158
|
-
PuppetLint.configuration.send("
|
161
|
+
PuppetLint.configuration.send("disable_140chars")
|
159
162
|
```
|
160
163
|
|
161
164
|
The Rake task also supports ignoring certain paths
|
data/lib/puppet-lint.rb
CHANGED
@@ -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
|
#
|
data/lib/puppet-lint/checks.rb
CHANGED
@@ -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
|
data/lib/puppet-lint/data.rb
CHANGED
@@ -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
|
-
|
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
|
#
|
data/lib/puppet-lint/lexer.rb
CHANGED
@@ -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
|
-
|
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
|
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 :
|
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
|
271
|
-
unless token.value
|
272
|
-
|
273
|
-
:
|
274
|
-
|
275
|
-
|
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.
|
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
|
-
|
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
|
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
|
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(:'
|
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 >
|
59
|
+
if line.scan(/./mu).size > 140
|
60
60
|
notify :warning, {
|
61
|
-
:message => 'line has more than
|
61
|
+
:message => 'line has more than 140 characters',
|
62
62
|
:line => idx + 1,
|
63
|
-
:column =>
|
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
|
-
|
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]
|
data/lib/puppet-lint/version.rb
CHANGED
@@ -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\
|
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
|
16
|
-
expect(problems).to
|
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
|
29
|
-
expect(problems).to
|
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
|
42
|
-
expect(problems).to
|
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 =
|
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
|
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 '
|
15
|
-
|
14
|
+
context 'with fix disabled' do
|
15
|
+
context 'puppet:// url without modules' do
|
16
|
+
let(:code) { "'puppet:///foo'" }
|
16
17
|
|
17
|
-
|
18
|
-
|
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
|
-
|
22
|
-
|
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 '
|
5
|
-
let(:msg) { 'line has more than
|
4
|
+
describe '140chars' do
|
5
|
+
let(:msg) { 'line has more than 140 characters' }
|
6
6
|
|
7
|
-
context 'file resource with a source line >
|
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 >
|
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 '
|
44
|
-
let(:code) { 'a' *
|
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(
|
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
|
-
|
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
|
-
|
19
|
-
|
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
|
-
|
24
|
-
|
25
|
-
none: false
|
26
|
-
requirements:
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
27
17
|
- - ~>
|
28
|
-
- !ruby/object:Gem::Version
|
29
|
-
|
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
|
-
|
40
|
-
|
41
|
-
|
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
|
-
|
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
|
-
|
55
|
-
|
56
|
-
|
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
|
-
|
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
|
-
|
70
|
-
|
71
|
-
|
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
|
-
|
75
|
-
segments:
|
76
|
-
- 1
|
77
|
-
- 0
|
78
|
-
version: "1.0"
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '1.0'
|
79
62
|
type: :development
|
80
|
-
|
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
|
-
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
|
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:
|
177
|
+
rubygems_version: 2.0.14
|
202
178
|
signing_key:
|
203
|
-
specification_version:
|
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:
|