puppet-lint 3.4.0 → 4.0.0.rc.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/puppet-lint/bin.rb +7 -11
- data/lib/puppet-lint/checkplugin.rb +4 -8
- data/lib/puppet-lint/checks.rb +7 -9
- data/lib/puppet-lint/configuration.rb +2 -2
- data/lib/puppet-lint/data.rb +35 -39
- data/lib/puppet-lint/lexer/string_slurper.rb +2 -3
- data/lib/puppet-lint/lexer/token.rb +6 -5
- data/lib/puppet-lint/lexer.rb +35 -38
- data/lib/puppet-lint/monkeypatches.rb +4 -4
- data/lib/puppet-lint/optparser.rb +1 -1
- data/lib/puppet-lint/plugins/check_classes/arrow_on_right_operand_line.rb +1 -0
- data/lib/puppet-lint/plugins/check_classes/autoloader_layout.rb +2 -4
- data/lib/puppet-lint/plugins/check_classes/class_inherits_from_params_class.rb +2 -2
- data/lib/puppet-lint/plugins/check_classes/code_on_top_scope.rb +1 -1
- data/lib/puppet-lint/plugins/check_classes/nested_classes_or_defines.rb +5 -5
- data/lib/puppet-lint/plugins/check_classes/parameter_order.rb +8 -9
- data/lib/puppet-lint/plugins/check_classes/variable_scope.rb +32 -34
- data/lib/puppet-lint/plugins/check_conditionals/case_without_default.rb +2 -2
- data/lib/puppet-lint/plugins/check_documentation/documentation.rb +7 -6
- data/lib/puppet-lint/plugins/check_nodes/unquoted_node_name.rb +1 -1
- data/lib/puppet-lint/plugins/check_resources/ensure_first_param.rb +3 -5
- data/lib/puppet-lint/plugins/check_resources/ensure_not_symlink_target.rb +2 -2
- data/lib/puppet-lint/plugins/check_resources/file_mode.rb +6 -6
- data/lib/puppet-lint/plugins/check_resources/unquoted_file_mode.rb +4 -4
- data/lib/puppet-lint/plugins/check_strings/double_quoted_strings.rb +4 -4
- data/lib/puppet-lint/plugins/check_strings/only_variable_string.rb +4 -5
- data/lib/puppet-lint/plugins/check_strings/quoted_booleans.rb +4 -4
- data/lib/puppet-lint/plugins/check_strings/single_quote_string_with_variables.rb +2 -2
- data/lib/puppet-lint/plugins/check_strings/variables_not_enclosed.rb +8 -7
- data/lib/puppet-lint/plugins/check_variables/variable_contains_dash.rb +3 -3
- data/lib/puppet-lint/plugins/check_variables/variable_is_lowercase.rb +2 -2
- data/lib/puppet-lint/plugins/check_whitespace/140chars.rb +1 -0
- data/lib/puppet-lint/plugins/check_whitespace/80chars.rb +2 -1
- data/lib/puppet-lint/plugins/check_whitespace/arrow_alignment.rb +9 -9
- data/lib/puppet-lint/plugins/check_whitespace/hard_tabs.rb +2 -2
- data/lib/puppet-lint/plugins/check_whitespace/line_length.rb +6 -6
- data/lib/puppet-lint/plugins/legacy_facts/legacy_facts.rb +106 -105
- data/lib/puppet-lint/plugins/top_scope_facts/top_scope_facts.rb +3 -2
- data/lib/puppet-lint/plugins.rb +3 -4
- data/lib/puppet-lint/report/codeclimate.rb +3 -2
- data/lib/puppet-lint/report/github.rb +1 -0
- data/lib/puppet-lint/tasks/puppet-lint.rb +7 -26
- data/lib/puppet-lint/tasks/release_test.rb +4 -4
- data/lib/puppet-lint/version.rb +1 -1
- data/lib/puppet-lint.rb +5 -3
- data/rubocop_baseline.yml +3 -440
- data/spec/spec_helper.rb +3 -2
- data/spec/spec_helper_acceptance_local.rb +1 -1
- data/spec/unit/puppet-lint/bin_spec.rb +12 -2
- data/spec/unit/puppet-lint/configuration_spec.rb +14 -14
- data/spec/unit/puppet-lint/lexer/string_slurper_spec.rb +3 -5
- data/spec/unit/puppet-lint/lexer_spec.rb +10 -11
- data/spec/unit/puppet-lint/plugins/check_classes/parameter_order_spec.rb +2 -2
- data/spec/unit/puppet-lint/plugins/check_conditionals/case_without_default_spec.rb +5 -5
- data/spec/unit/puppet-lint/plugins/check_strings/double_quoted_strings_spec.rb +1 -1
- data/spec/unit/puppet-lint/plugins/check_strings/only_variable_string_spec.rb +1 -1
- data/spec/unit/puppet-lint/plugins/check_whitespace/140chars_spec.rb +0 -2
- data/spec/unit/puppet-lint/plugins/check_whitespace/80chars_spec.rb +1 -3
- data/spec/unit/puppet-lint/plugins/legacy_facts/legacy_facts_spec.rb +16 -0
- data/spec/unit/puppet-lint/plugins/top_scope_facts/top_scope_facts_spec.rb +1 -0
- metadata +5 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 434d2ed87adc1be458686f91bd8463abb7e677437f120944c47db58cfb56fa3c
|
4
|
+
data.tar.gz: f37a50155b77bac0570244abdbc6e2c02650b62a0adfe38d0b3e5f23bd44aeeb
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ca94a402ba348e31914b04d9412d2ecf799be67f9d7c9646d0e4d1b748600ee8251c27166b4e4cb11540bb55c0dfcbfcfa27087e9105160a7e38f8f8b90f7237
|
7
|
+
data.tar.gz: 42eb871e6adf2d611139a1e907eae815d8a55a4e8d7a6a62e200da8fed4f12b4347ecaeb19475d1766bab09fcd7f721d3a6c2a50ec5510a14bb39735d875cb5a
|
data/lib/puppet-lint/bin.rb
CHANGED
@@ -49,7 +49,7 @@ class PuppetLint::Bin
|
|
49
49
|
|
50
50
|
begin
|
51
51
|
path = @args[0]
|
52
|
-
full_path = File.expand_path(path, ENV
|
52
|
+
full_path = File.expand_path(path, ENV.fetch('PWD', nil))
|
53
53
|
full_base_path = if File.directory?(full_path)
|
54
54
|
full_path
|
55
55
|
else
|
@@ -79,19 +79,17 @@ class PuppetLint::Bin
|
|
79
79
|
|
80
80
|
path.each do |f|
|
81
81
|
next if ignore_paths.any? { |p| File.fnmatch(p, f) }
|
82
|
+
|
82
83
|
l = PuppetLint.new
|
83
84
|
l.file = f
|
84
85
|
l.run
|
85
86
|
all_problems << l.print_problems
|
86
87
|
|
87
|
-
if l.errors? || (l.warnings? && PuppetLint.configuration.fail_on_warnings)
|
88
|
-
return_val = 1
|
89
|
-
end
|
88
|
+
return_val = 1 if l.errors? || (l.warnings? && PuppetLint.configuration.fail_on_warnings)
|
90
89
|
|
91
90
|
next unless PuppetLint.configuration.fix && l.problems.none? { |r| r[:check] == :syntax }
|
92
|
-
|
93
|
-
|
94
|
-
end
|
91
|
+
|
92
|
+
File.binwrite(f, l.manifest)
|
95
93
|
end
|
96
94
|
|
97
95
|
if PuppetLint.configuration.sarif
|
@@ -105,9 +103,7 @@ class PuppetLint::Bin
|
|
105
103
|
puts JSON.pretty_generate(all_problems)
|
106
104
|
end
|
107
105
|
|
108
|
-
if PuppetLint.configuration.codeclimate_report_file
|
109
|
-
PuppetLint::Report::CodeClimateReporter.write_report_file(all_problems, PuppetLint.configuration.codeclimate_report_file)
|
110
|
-
end
|
106
|
+
PuppetLint::Report::CodeClimateReporter.write_report_file(all_problems, PuppetLint.configuration.codeclimate_report_file) if PuppetLint.configuration.codeclimate_report_file
|
111
107
|
|
112
108
|
return_val
|
113
109
|
rescue PuppetLint::NoCodeError
|
@@ -148,7 +144,7 @@ class PuppetLint::Bin
|
|
148
144
|
'ruleIndex' => rule_index,
|
149
145
|
'message' => { 'text' => message[:message] },
|
150
146
|
'locations' => [{ 'physicalLocation' => { 'artifactLocation' => { 'uri' => relative_path, 'uriBaseId' => 'ROOTPATH' },
|
151
|
-
'region' => { 'startLine' => message[:line], 'startColumn' => message[:column] } } }]
|
147
|
+
'region' => { 'startLine' => message[:line], 'startColumn' => message[:column] } } }]
|
152
148
|
}
|
153
149
|
results << result
|
154
150
|
end
|
@@ -179,10 +179,10 @@ class PuppetLint::CheckPlugin
|
|
179
179
|
# Returns a Hash of default problem information.
|
180
180
|
def default_info
|
181
181
|
@default_info ||= {
|
182
|
-
check: self.class.const_get(
|
182
|
+
check: self.class.const_get(:NAME),
|
183
183
|
fullpath: fullpath,
|
184
184
|
path: path,
|
185
|
-
filename: filename
|
185
|
+
filename: filename
|
186
186
|
}
|
187
187
|
end
|
188
188
|
|
@@ -202,14 +202,10 @@ class PuppetLint::CheckPlugin
|
|
202
202
|
problem[:kind] = kind
|
203
203
|
problem.merge!(default_info) { |_key, v1, _v2| v1 }
|
204
204
|
|
205
|
-
unless [:warning, :error, :fixed].include?(kind)
|
206
|
-
raise ArgumentError, 'unknown value passed for kind'
|
207
|
-
end
|
205
|
+
raise ArgumentError, 'unknown value passed for kind' unless [:warning, :error, :fixed].include?(kind)
|
208
206
|
|
209
207
|
[:message, :line, :column, :check].each do |attr|
|
210
|
-
unless problem.key?(attr)
|
211
|
-
raise ArgumentError, "problem hash must contain #{attr.inspect}"
|
212
|
-
end
|
208
|
+
raise ArgumentError, "problem hash must contain #{attr.inspect}" unless problem.key?(attr)
|
213
209
|
end
|
214
210
|
|
215
211
|
@problems << problem
|
data/lib/puppet-lint/checks.rb
CHANGED
@@ -39,7 +39,7 @@ class PuppetLint::Checks
|
|
39
39
|
column: e.column,
|
40
40
|
fullpath: PuppetLint::Data.fullpath,
|
41
41
|
path: PuppetLint::Data.path,
|
42
|
-
filename: PuppetLint::Data.filename
|
42
|
+
filename: PuppetLint::Data.filename
|
43
43
|
}
|
44
44
|
PuppetLint::Data.tokens = []
|
45
45
|
end
|
@@ -76,15 +76,15 @@ class PuppetLint::Checks
|
|
76
76
|
kind: :error,
|
77
77
|
check: :syntax,
|
78
78
|
message: 'Syntax error',
|
79
|
-
fullpath: File.expand_path(fileinfo, ENV
|
79
|
+
fullpath: File.expand_path(fileinfo, ENV.fetch('PWD', nil)),
|
80
80
|
filename: File.basename(fileinfo),
|
81
81
|
path: fileinfo,
|
82
82
|
line: e.token.line,
|
83
|
-
column: e.token.column
|
83
|
+
column: e.token.column
|
84
84
|
}
|
85
85
|
|
86
86
|
@problems
|
87
|
-
rescue => e
|
87
|
+
rescue StandardError => e
|
88
88
|
$stdout.puts <<-END.gsub(%r{^ {6}}, '')
|
89
89
|
Whoops! It looks like puppet-lint has encountered an error that it doesn't
|
90
90
|
know how to handle. Please open an issue at https://github.com/puppetlabs/puppet-lint
|
@@ -120,10 +120,8 @@ class PuppetLint::Checks
|
|
120
120
|
#
|
121
121
|
# Returns an Array of String check names.
|
122
122
|
def enabled_checks
|
123
|
-
@enabled_checks ||=
|
124
|
-
PuppetLint.configuration.
|
125
|
-
PuppetLint.configuration.send("#{check}_enabled?")
|
126
|
-
end
|
123
|
+
@enabled_checks ||= PuppetLint.configuration.checks.select do |check|
|
124
|
+
PuppetLint.configuration.send("#{check}_enabled?")
|
127
125
|
end
|
128
126
|
end
|
129
127
|
|
@@ -131,6 +129,6 @@ class PuppetLint::Checks
|
|
131
129
|
#
|
132
130
|
# Returns the manifest as a String.
|
133
131
|
def manifest
|
134
|
-
PuppetLint::Data.tokens.map(&:to_manifest).join
|
132
|
+
PuppetLint::Data.tokens.map(&:to_manifest).join
|
135
133
|
end
|
136
134
|
end
|
@@ -18,7 +18,7 @@ class PuppetLint::Configuration
|
|
18
18
|
#
|
19
19
|
# Returns true if the check is enabled, otherwise return false.
|
20
20
|
define_method("#{check}_enabled?") do
|
21
|
-
settings["#{check}_disabled"]
|
21
|
+
settings["#{check}_disabled"] != true
|
22
22
|
end
|
23
23
|
|
24
24
|
# Public: Disable the named check.
|
@@ -153,6 +153,6 @@ class PuppetLint::Configuration
|
|
153
153
|
self.show_ignored = false
|
154
154
|
self.ignore_paths = ['vendor/**/*.pp']
|
155
155
|
self.github_actions = ENV.key?('GITHUB_ACTION')
|
156
|
-
self.codeclimate_report_file = ENV
|
156
|
+
self.codeclimate_report_file = ENV.fetch('CODECLIMATE_REPORT_FILE', nil)
|
157
157
|
end
|
158
158
|
end
|
data/lib/puppet-lint/data.rb
CHANGED
@@ -72,7 +72,7 @@ class PuppetLint::Data
|
|
72
72
|
|
73
73
|
unless formatting_tokens.include?(token.type)
|
74
74
|
current_token.next_token.prev_code_token = token unless current_token.next_token.nil?
|
75
|
-
next_nf_idx = tokens[index
|
75
|
+
next_nf_idx = tokens[index..].index { |r| !formatting_tokens.include?(r.type) }
|
76
76
|
unless next_nf_idx.nil?
|
77
77
|
next_nf_token = tokens[index + next_nf_idx]
|
78
78
|
token.next_code_token = next_nf_token
|
@@ -92,9 +92,7 @@ class PuppetLint::Data
|
|
92
92
|
end
|
93
93
|
|
94
94
|
current_token.next_token = token
|
95
|
-
unless formatting_tokens.include?(token.type)
|
96
|
-
current_token.next_code_token = token
|
97
|
-
end
|
95
|
+
current_token.next_code_token = token unless formatting_tokens.include?(token.type)
|
98
96
|
|
99
97
|
tokens.insert(index, token)
|
100
98
|
end
|
@@ -123,7 +121,7 @@ class PuppetLint::Data
|
|
123
121
|
@fullpath = nil
|
124
122
|
@filename = nil
|
125
123
|
else
|
126
|
-
@fullpath = File.expand_path(val, ENV
|
124
|
+
@fullpath = File.expand_path(val, ENV.fetch('PWD', nil))
|
127
125
|
@filename = File.basename(val)
|
128
126
|
end
|
129
127
|
end
|
@@ -184,12 +182,14 @@ class PuppetLint::Data
|
|
184
182
|
next unless colon_token.next_code_token && colon_token.next_code_token.type != :LBRACE
|
185
183
|
next if classref?(colon_token)
|
186
184
|
|
187
|
-
rel_start_idx = tokens[marker
|
185
|
+
rel_start_idx = tokens[marker..].index(colon_token)
|
188
186
|
break if rel_start_idx.nil?
|
187
|
+
|
189
188
|
start_idx = rel_start_idx + marker
|
190
189
|
end_token = colon_token.next_token_of([:SEMIC, :RBRACE])
|
191
|
-
rel_end_idx = tokens[start_idx
|
190
|
+
rel_end_idx = tokens[start_idx..].index(end_token)
|
192
191
|
raise PuppetLint::SyntaxError, colon_token if rel_end_idx.nil?
|
192
|
+
|
193
193
|
marker = rel_end_idx + start_idx
|
194
194
|
|
195
195
|
result << {
|
@@ -197,7 +197,7 @@ class PuppetLint::Data
|
|
197
197
|
end: marker,
|
198
198
|
tokens: tokens[start_idx..marker],
|
199
199
|
type: find_resource_type_token(start_idx),
|
200
|
-
param_tokens: find_resource_param_tokens(tokens[start_idx..marker])
|
200
|
+
param_tokens: find_resource_param_tokens(tokens[start_idx..marker])
|
201
201
|
}
|
202
202
|
end
|
203
203
|
result
|
@@ -237,9 +237,7 @@ class PuppetLint::Data
|
|
237
237
|
|
238
238
|
break unless resource_tokens.include?(iter_token)
|
239
239
|
|
240
|
-
if iter_token && iter_token.next_code_token.type == :FARROW
|
241
|
-
param_tokens << iter_token
|
242
|
-
end
|
240
|
+
param_tokens << iter_token if iter_token && iter_token.next_code_token.type == :FARROW
|
243
241
|
end
|
244
242
|
|
245
243
|
param_tokens
|
@@ -306,7 +304,7 @@ class PuppetLint::Data
|
|
306
304
|
paren_depth = 0
|
307
305
|
in_params = false
|
308
306
|
inherited_class = nil
|
309
|
-
tokens[i + 1
|
307
|
+
tokens[i + 1..].each_with_index do |definition_token, j|
|
310
308
|
case definition_token.type
|
311
309
|
when :INHERITS
|
312
310
|
inherited_class = definition_token.next_code_token
|
@@ -320,19 +318,17 @@ class PuppetLint::Data
|
|
320
318
|
brace_depth += 1
|
321
319
|
when :RBRACE
|
322
320
|
brace_depth -= 1
|
323
|
-
if brace_depth.zero? && !in_params
|
324
|
-
|
325
|
-
|
326
|
-
|
327
|
-
|
328
|
-
|
329
|
-
|
330
|
-
|
331
|
-
|
332
|
-
|
333
|
-
|
334
|
-
break
|
335
|
-
end
|
321
|
+
if brace_depth.zero? && !in_params && (token.next_code_token.type != :LBRACE)
|
322
|
+
result << {
|
323
|
+
start: i,
|
324
|
+
end: i + j + 1,
|
325
|
+
tokens: tokens[i..(i + j + 1)],
|
326
|
+
param_tokens: param_tokens(tokens[i..(i + j + 1)]),
|
327
|
+
type: type,
|
328
|
+
name_token: token.next_code_token,
|
329
|
+
inherited_token: inherited_class
|
330
|
+
}
|
331
|
+
break
|
336
332
|
end
|
337
333
|
end
|
338
334
|
end
|
@@ -367,7 +363,7 @@ class PuppetLint::Data
|
|
367
363
|
level = 0
|
368
364
|
real_idx = 0
|
369
365
|
in_paren = false
|
370
|
-
tokens[token_idx + 1
|
366
|
+
tokens[token_idx + 1..].each_with_index do |cur_token, cur_token_idx|
|
371
367
|
break if level.zero? && in_paren
|
372
368
|
break if level.zero? && cur_token.type == :NEWLINE
|
373
369
|
|
@@ -382,7 +378,7 @@ class PuppetLint::Data
|
|
382
378
|
functions << {
|
383
379
|
start: token_idx,
|
384
380
|
end: real_idx,
|
385
|
-
tokens: tokens[token_idx..real_idx]
|
381
|
+
tokens: tokens[token_idx..real_idx]
|
386
382
|
}
|
387
383
|
end
|
388
384
|
functions
|
@@ -406,7 +402,7 @@ class PuppetLint::Data
|
|
406
402
|
next unless token.type == :LBRACK
|
407
403
|
|
408
404
|
real_idx = 0
|
409
|
-
tokens[token_idx + 1
|
405
|
+
tokens[token_idx + 1..].each_with_index do |cur_token, cur_token_idx|
|
410
406
|
real_idx = token_idx + 1 + cur_token_idx
|
411
407
|
break if cur_token.type == :RBRACK
|
412
408
|
end
|
@@ -418,7 +414,7 @@ class PuppetLint::Data
|
|
418
414
|
arrays << {
|
419
415
|
start: token_idx,
|
420
416
|
end: real_idx,
|
421
|
-
tokens: tokens[token_idx..real_idx]
|
417
|
+
tokens: tokens[token_idx..real_idx]
|
422
418
|
}
|
423
419
|
end
|
424
420
|
arrays
|
@@ -445,18 +441,18 @@ class PuppetLint::Data
|
|
445
441
|
|
446
442
|
level = 0
|
447
443
|
real_idx = 0
|
448
|
-
tokens[token_idx + 1
|
444
|
+
tokens[token_idx + 1..].each_with_index do |cur_token, cur_token_idx|
|
449
445
|
real_idx = token_idx + 1 + cur_token_idx
|
450
446
|
|
451
447
|
level += 1 if cur_token.type == :LBRACE
|
452
448
|
level -= 1 if cur_token.type == :RBRACE
|
453
|
-
break if level
|
449
|
+
break if level.negative?
|
454
450
|
end
|
455
451
|
|
456
452
|
hashes << {
|
457
453
|
start: token_idx,
|
458
454
|
end: real_idx,
|
459
|
-
tokens: tokens[token_idx..real_idx]
|
455
|
+
tokens: tokens[token_idx..real_idx]
|
460
456
|
}
|
461
457
|
end
|
462
458
|
hashes
|
@@ -482,7 +478,7 @@ class PuppetLint::Data
|
|
482
478
|
|
483
479
|
real_idx = 0
|
484
480
|
|
485
|
-
tokens[token_idx + 1
|
481
|
+
tokens[token_idx + 1..].each_with_index do |cur_token, cur_token_idx|
|
486
482
|
real_idx = token_idx + 1 + cur_token_idx
|
487
483
|
break if cur_token.type == :RBRACE
|
488
484
|
end
|
@@ -490,7 +486,7 @@ class PuppetLint::Data
|
|
490
486
|
defaults << {
|
491
487
|
start: token_idx,
|
492
488
|
end: real_idx,
|
493
|
-
tokens: tokens[token_idx..real_idx]
|
489
|
+
tokens: tokens[token_idx..real_idx]
|
494
490
|
}
|
495
491
|
end
|
496
492
|
defaults
|
@@ -564,7 +560,7 @@ class PuppetLint::Data
|
|
564
560
|
comment_token_types.include?(token.type)
|
565
561
|
end
|
566
562
|
control_comment_tokens = comment_tokens.select do |token|
|
567
|
-
token.value.strip =~ %r{\Alint
|
563
|
+
token.value.strip =~ %r{\Alint:(ignore:[\w\d]+|endignore)}
|
568
564
|
end
|
569
565
|
|
570
566
|
stack = []
|
@@ -574,12 +570,12 @@ class PuppetLint::Data
|
|
574
570
|
|
575
571
|
comment_words = token.value.strip.split(%r{\s+})
|
576
572
|
comment_words.each_with_index do |word, i|
|
577
|
-
if %r{\Alint
|
573
|
+
if %r{\Alint:(ignore|endignore)}.match?(word)
|
578
574
|
comment_data << word
|
579
575
|
else
|
580
576
|
# Once we reach the first non-controlcomment word, assume the rest
|
581
577
|
# of the words are the reason.
|
582
|
-
reason = comment_words[i
|
578
|
+
reason = comment_words[i..]
|
583
579
|
break
|
584
580
|
end
|
585
581
|
end
|
@@ -604,7 +600,7 @@ class PuppetLint::Data
|
|
604
600
|
if top_override.nil?
|
605
601
|
# TODO: refactor to provide a way to expose problems from
|
606
602
|
# PuppetLint::Data via the normal problem reporting mechanism.
|
607
|
-
|
603
|
+
warn "WARNING: lint:endignore comment with no opening lint:ignore:<check> comment found on line #{token.line}"
|
608
604
|
else
|
609
605
|
top_override.each do |start|
|
610
606
|
next if start.nil?
|
@@ -620,7 +616,7 @@ class PuppetLint::Data
|
|
620
616
|
end
|
621
617
|
|
622
618
|
stack.each do |control|
|
623
|
-
|
619
|
+
warn "WARNING: lint:ignore:#{control[0][2]} comment on line #{control[0][0]} with no closing lint:endignore comment"
|
624
620
|
end
|
625
621
|
end
|
626
622
|
end
|
@@ -1,11 +1,10 @@
|
|
1
1
|
require 'strscan'
|
2
2
|
|
3
|
+
# rubocop:disable Style/ClassAndModuleChildren
|
3
4
|
class PuppetLint::Lexer
|
4
5
|
# Internal: A class for slurping strings from a Puppet manifest.
|
5
6
|
class StringSlurper
|
6
|
-
attr_accessor :scanner
|
7
|
-
attr_accessor :results
|
8
|
-
attr_accessor :interp_stack
|
7
|
+
attr_accessor :scanner, :results, :interp_stack
|
9
8
|
|
10
9
|
START_INTERP_PATTERN = %r{\$\{}.freeze
|
11
10
|
END_INTERP_PATTERN = %r{\}}.freeze
|
@@ -1,3 +1,4 @@
|
|
1
|
+
# rubocop:disable Style/ClassAndModuleChildren
|
1
2
|
class PuppetLint::Lexer
|
2
3
|
# Public: Stores a fragment of the manifest and the information about its
|
3
4
|
# location in the manifest.
|
@@ -175,12 +176,10 @@ class PuppetLint::Lexer
|
|
175
176
|
|
176
177
|
token_iter = send("#{direction}_token".to_sym)
|
177
178
|
until token_iter.nil?
|
178
|
-
if to_find.include?(token_iter.type)
|
179
|
-
return token_iter if opts[:value].nil? || token_iter.value == opts[:value]
|
180
|
-
end
|
179
|
+
return token_iter if to_find.include?(token_iter.type) && (opts[:value].nil? || token_iter.value == opts[:value])
|
181
180
|
|
182
|
-
opening_token = direction == :next ? 'L' : 'R'
|
183
|
-
closing_token = direction == :next ? 'R' : 'L'
|
181
|
+
opening_token = (direction == :next) ? 'L' : 'R'
|
182
|
+
closing_token = (direction == :next) ? 'R' : 'L'
|
184
183
|
|
185
184
|
if opts[:skip_blocks]
|
186
185
|
case token_iter.type
|
@@ -194,6 +193,7 @@ class PuppetLint::Lexer
|
|
194
193
|
end
|
195
194
|
|
196
195
|
return nil if token_iter.nil?
|
196
|
+
|
197
197
|
token_iter = token_iter.send("#{direction}_token".to_sym)
|
198
198
|
end
|
199
199
|
nil
|
@@ -202,6 +202,7 @@ class PuppetLint::Lexer
|
|
202
202
|
def interpolated_variable?
|
203
203
|
return false if type == :TYPE && value != 'type'
|
204
204
|
return true if type == :NAME
|
205
|
+
|
205
206
|
PuppetLint::Lexer::KEYWORDS.include?(type.to_s.downcase)
|
206
207
|
end
|
207
208
|
end
|
data/lib/puppet-lint/lexer.rb
CHANGED
@@ -1,6 +1,3 @@
|
|
1
|
-
# encoding: utf-8
|
2
|
-
|
3
|
-
require 'pp'
|
4
1
|
require 'strscan'
|
5
2
|
require 'set'
|
6
3
|
require 'puppet-lint/lexer/token'
|
@@ -56,27 +53,27 @@ class PuppetLint::Lexer
|
|
56
53
|
# From https://github.com/puppetlabs/puppet/blob/master/lib/puppet/pops/parser/lexer2.rb#L116-L137
|
57
54
|
# or thereabouts
|
58
55
|
KEYWORDS = {
|
59
|
-
'case'
|
60
|
-
'class'
|
61
|
-
'default'
|
62
|
-
'define'
|
63
|
-
'import'
|
64
|
-
'if'
|
65
|
-
'elsif'
|
66
|
-
'else'
|
56
|
+
'case' => true,
|
57
|
+
'class' => true,
|
58
|
+
'default' => true,
|
59
|
+
'define' => true,
|
60
|
+
'import' => true,
|
61
|
+
'if' => true,
|
62
|
+
'elsif' => true,
|
63
|
+
'else' => true,
|
67
64
|
'inherits' => true,
|
68
|
-
'node'
|
69
|
-
'and'
|
70
|
-
'or'
|
71
|
-
'undef'
|
72
|
-
'false'
|
73
|
-
'true'
|
74
|
-
'in'
|
75
|
-
'unless'
|
65
|
+
'node' => true,
|
66
|
+
'and' => true,
|
67
|
+
'or' => true,
|
68
|
+
'undef' => true,
|
69
|
+
'false' => true,
|
70
|
+
'true' => true,
|
71
|
+
'in' => true,
|
72
|
+
'unless' => true,
|
76
73
|
'function' => true,
|
77
|
-
'type'
|
78
|
-
'attr'
|
79
|
-
'private'
|
74
|
+
'type' => true,
|
75
|
+
'attr' => true,
|
76
|
+
'private' => true
|
80
77
|
}.freeze
|
81
78
|
|
82
79
|
# Internal: A Hash whose keys are Strings representing reserved keywords in
|
@@ -86,9 +83,9 @@ class PuppetLint::Lexer
|
|
86
83
|
# Currently unused
|
87
84
|
APP_MANAGEMENT_TOKENS = {
|
88
85
|
'application' => true,
|
89
|
-
'consumes'
|
90
|
-
'produces'
|
91
|
-
'site'
|
86
|
+
'consumes' => true,
|
87
|
+
'produces' => true,
|
88
|
+
'site' => true
|
92
89
|
}.freeze
|
93
90
|
|
94
91
|
# Internal: A Hash whose keys are Symbols representing token types which
|
@@ -104,7 +101,7 @@ class PuppetLint::Lexer
|
|
104
101
|
IF: true,
|
105
102
|
ELSIF: true,
|
106
103
|
LPAREN: true,
|
107
|
-
EQUALS: true
|
104
|
+
EQUALS: true
|
108
105
|
}.freeze
|
109
106
|
|
110
107
|
# Internal: some commonly used regular expressions
|
@@ -112,7 +109,7 @@ class PuppetLint::Lexer
|
|
112
109
|
# \v == vertical tab
|
113
110
|
# \f == form feed
|
114
111
|
# \p{Zs} == ASCII + Unicode non-linebreaking whitespace
|
115
|
-
WHITESPACE_RE = RUBY_VERSION == '1.8.7' ? %r{[\t\v\f ]} : %r{[\t\v\f\p{Zs}]}
|
112
|
+
WHITESPACE_RE = (RUBY_VERSION == '1.8.7') ? %r{[\t\v\f ]} : %r{[\t\v\f\p{Zs}]}
|
116
113
|
|
117
114
|
LINE_END_RE = %r{(?:\r\n|\r|\n)}.freeze
|
118
115
|
|
@@ -182,7 +179,7 @@ class PuppetLint::Lexer
|
|
182
179
|
COMMENT: true,
|
183
180
|
MLCOMMENT: true,
|
184
181
|
SLASH_COMMENT: true,
|
185
|
-
INDENT: true
|
182
|
+
INDENT: true
|
186
183
|
}.freeze
|
187
184
|
|
188
185
|
# Internal: Access the internal token storage.
|
@@ -203,7 +200,7 @@ class PuppetLint::Lexer
|
|
203
200
|
i = 0
|
204
201
|
|
205
202
|
while i < code.size
|
206
|
-
chunk = code[i
|
203
|
+
chunk = code[i..]
|
207
204
|
|
208
205
|
found = false
|
209
206
|
|
@@ -233,12 +230,12 @@ class PuppetLint::Lexer
|
|
233
230
|
tokens << new_token(:VARIABLE, var_name, opts)
|
234
231
|
|
235
232
|
elsif %r{\A'.*?'}m.match?(chunk)
|
236
|
-
str_content = StringScanner.new(code[i + 1
|
233
|
+
str_content = StringScanner.new(code[i + 1..]).scan_until(%r{(\A|[^\\])(\\\\)*'}m)
|
237
234
|
length = str_content.size + 1
|
238
235
|
tokens << new_token(:SSTRING, str_content[0..-2])
|
239
236
|
|
240
237
|
elsif chunk.start_with?('"')
|
241
|
-
slurper = PuppetLint::Lexer::StringSlurper.new(code[i + 1
|
238
|
+
slurper = PuppetLint::Lexer::StringSlurper.new(code[i + 1..])
|
242
239
|
begin
|
243
240
|
string_segments = slurper.parse
|
244
241
|
process_string_segments(string_segments)
|
@@ -271,7 +268,7 @@ class PuppetLint::Lexer
|
|
271
268
|
tokens << new_token(:MLCOMMENT, mlcomment, raw: mlcomment_raw)
|
272
269
|
|
273
270
|
elsif chunk.match(%r{\A/.*?/}m) && possible_regex?
|
274
|
-
str_content = StringScanner.new(code[i + 1
|
271
|
+
str_content = StringScanner.new(code[i + 1..]).scan_until(%r{(\A|[^\\])(\\\\)*/}m)
|
275
272
|
length = str_content.size + 1
|
276
273
|
tokens << new_token(:REGEX, str_content[0..-2])
|
277
274
|
|
@@ -286,7 +283,7 @@ class PuppetLint::Lexer
|
|
286
283
|
length += indent.size
|
287
284
|
else
|
288
285
|
heredoc_tag = heredoc_queue.shift
|
289
|
-
slurper = PuppetLint::Lexer::StringSlurper.new(code[i + length
|
286
|
+
slurper = PuppetLint::Lexer::StringSlurper.new(code[i + length..])
|
290
287
|
heredoc_segments = slurper.parse_heredoc(heredoc_tag)
|
291
288
|
process_heredoc_segments(heredoc_segments)
|
292
289
|
length += slurper.consumed_chars
|
@@ -298,7 +295,7 @@ class PuppetLint::Lexer
|
|
298
295
|
|
299
296
|
unless heredoc_queue.empty?
|
300
297
|
heredoc_tag = heredoc_queue.shift
|
301
|
-
slurper = PuppetLint::Lexer::StringSlurper.new(code[i + length
|
298
|
+
slurper = PuppetLint::Lexer::StringSlurper.new(code[i + length..])
|
302
299
|
heredoc_segments = slurper.parse_heredoc(heredoc_tag)
|
303
300
|
process_heredoc_segments(heredoc_segments)
|
304
301
|
length += slurper.consumed_chars
|
@@ -419,11 +416,11 @@ class PuppetLint::Lexer
|
|
419
416
|
lexer = PuppetLint::Lexer.new
|
420
417
|
lexer.tokenise(segment[1])
|
421
418
|
lexer.tokens.each_with_index do |t, i|
|
422
|
-
type = i.zero? && t.interpolated_variable? ? :VARIABLE : t.type
|
419
|
+
type = (i.zero? && t.interpolated_variable?) ? :VARIABLE : t.type
|
423
420
|
tokens << new_token(type, t.value, raw: t.raw)
|
424
421
|
end
|
425
422
|
when :UNENC_VAR
|
426
|
-
tokens << new_token(:UNENC_VARIABLE, segment[1].
|
423
|
+
tokens << new_token(:UNENC_VARIABLE, segment[1].delete_prefix('$'))
|
427
424
|
else
|
428
425
|
tokens << new_token(:DQMID, segment[1])
|
429
426
|
end
|
@@ -451,11 +448,11 @@ class PuppetLint::Lexer
|
|
451
448
|
lexer = PuppetLint::Lexer.new
|
452
449
|
lexer.tokenise(segment[1])
|
453
450
|
lexer.tokens.each_with_index do |t, i|
|
454
|
-
type = i.zero? && t.interpolated_variable? ? :VARIABLE : t.type
|
451
|
+
type = (i.zero? && t.interpolated_variable?) ? :VARIABLE : t.type
|
455
452
|
tokens << new_token(type, t.value, raw: t.raw)
|
456
453
|
end
|
457
454
|
when :UNENC_VAR
|
458
|
-
tokens << new_token(:UNENC_VARIABLE, segment[1].
|
455
|
+
tokens << new_token(:UNENC_VARIABLE, segment[1].delete_prefix('$'))
|
459
456
|
else
|
460
457
|
tokens << new_token(:HEREDOC_MID, segment[1])
|
461
458
|
end
|
@@ -1,9 +1,9 @@
|
|
1
1
|
begin
|
2
2
|
'%{test}' % { test: 'replaced' } == 'replaced'
|
3
|
-
rescue
|
3
|
+
rescue StandardError
|
4
4
|
# monkeypatch String#% into Ruby 1.8.7
|
5
5
|
class String
|
6
|
-
Percent = instance_method(
|
6
|
+
Percent = instance_method(:%) unless defined?(Percent)
|
7
7
|
|
8
8
|
def %(*a, &b)
|
9
9
|
a.flatten!
|
@@ -18,7 +18,7 @@ rescue
|
|
18
18
|
if a.empty?
|
19
19
|
string
|
20
20
|
else
|
21
|
-
Percent.
|
21
|
+
Percent.bind_call(string, a, &b)
|
22
22
|
end
|
23
23
|
end
|
24
24
|
|
@@ -28,7 +28,7 @@ rescue
|
|
28
28
|
vars.each do |var, value|
|
29
29
|
var = var.to_s
|
30
30
|
var.gsub!(%r{[^a-zA-Z0-9_]}, '')
|
31
|
-
changed = gsub!(%r{
|
31
|
+
changed = gsub!(%r{%\{#{var}\}}, value.to_s)
|
32
32
|
end
|
33
33
|
break unless changed
|
34
34
|
end
|
@@ -143,7 +143,7 @@ class PuppetLint::OptParser
|
|
143
143
|
|
144
144
|
unless args.include?('--no-config')
|
145
145
|
opt_parser.load('/etc/puppet-lint.rc')
|
146
|
-
if
|
146
|
+
if File.readable?(Dir.home)
|
147
147
|
home_dotfile_path = File.expand_path('~/.puppet-lint.rc')
|
148
148
|
opt_parser.load(home_dotfile_path) if File.readable?(home_dotfile_path)
|
149
149
|
end
|
@@ -35,6 +35,7 @@ PuppetLint.new_check(:arrow_on_right_operand_line) do
|
|
35
35
|
|
36
36
|
# Remove trailing whitespace after left operand (if it exists)
|
37
37
|
return unless left_operand_token.next_token.type == :WHITESPACE
|
38
|
+
|
38
39
|
trailing_whitespace_token = left_operand_token.next_token
|
39
40
|
remove_token(trailing_whitespace_token) if [:NEWLINE, :WHITESPACE].include?(trailing_whitespace_token.next_token.type)
|
40
41
|
end
|
@@ -12,14 +12,12 @@ PuppetLint.new_check(:autoloader_layout) do
|
|
12
12
|
split_title = title_token.value.split('::')
|
13
13
|
mod = split_title.first
|
14
14
|
expected_path = if split_title.length > 1
|
15
|
-
"/#{mod}/manifests/#{split_title[1
|
15
|
+
"/#{mod}/manifests/#{split_title[1..].join('/')}.pp"
|
16
16
|
else
|
17
17
|
"/#{title_token.value}/manifests/init.pp"
|
18
18
|
end
|
19
19
|
|
20
|
-
if PuppetLint.configuration.relative
|
21
|
-
expected_path = expected_path.gsub(%r{^/}, '').split('/')[1..-1].join('/')
|
22
|
-
end
|
20
|
+
expected_path = expected_path.gsub(%r{^/}, '').split('/')[1..].join('/') if PuppetLint.configuration.relative
|
23
21
|
|
24
22
|
next if fullpath.end_with?(expected_path)
|
25
23
|
|