puppet-lint 2.5.2 → 3.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.rubocop.yml +522 -0
- data/lib/puppet-lint/bin.rb +71 -6
- data/lib/puppet-lint/checkplugin.rb +43 -9
- data/lib/puppet-lint/checks.rb +16 -16
- data/lib/puppet-lint/configuration.rb +134 -134
- data/lib/puppet-lint/data.rb +28 -28
- data/lib/puppet-lint/lexer/string_slurper.rb +138 -140
- data/lib/puppet-lint/lexer/token.rb +188 -190
- data/lib/puppet-lint/lexer.rb +416 -417
- data/lib/puppet-lint/monkeypatches.rb +1 -1
- data/lib/puppet-lint/optparser.rb +5 -1
- data/lib/puppet-lint/plugins/check_classes/arrow_on_right_operand_line.rb +6 -4
- data/lib/puppet-lint/plugins/check_classes/autoloader_layout.rb +5 -3
- data/lib/puppet-lint/plugins/check_classes/class_inherits_from_params_class.rb +6 -4
- data/lib/puppet-lint/plugins/check_classes/code_on_top_scope.rb +5 -3
- data/lib/puppet-lint/plugins/check_classes/inherits_across_namespaces.rb +5 -3
- data/lib/puppet-lint/plugins/check_classes/names_containing_dash.rb +5 -3
- data/lib/puppet-lint/plugins/check_classes/names_containing_uppercase.rb +7 -5
- data/lib/puppet-lint/plugins/check_classes/nested_classes_or_defines.rb +5 -3
- data/lib/puppet-lint/plugins/check_classes/parameter_order.rb +7 -4
- data/lib/puppet-lint/plugins/check_classes/right_to_left_relationship.rb +5 -3
- data/lib/puppet-lint/plugins/check_classes/variable_scope.rb +15 -13
- data/lib/puppet-lint/plugins/check_comments/slash_comments.rb +9 -7
- data/lib/puppet-lint/plugins/check_comments/star_comments.rb +10 -8
- data/lib/puppet-lint/plugins/check_conditionals/case_without_default.rb +6 -4
- data/lib/puppet-lint/plugins/check_conditionals/selector_inside_resource.rb +5 -3
- data/lib/puppet-lint/plugins/check_documentation/documentation.rb +7 -3
- data/lib/puppet-lint/plugins/check_nodes/unquoted_node_name.rb +15 -11
- data/lib/puppet-lint/plugins/check_resources/duplicate_params.rb +5 -3
- data/lib/puppet-lint/plugins/check_resources/ensure_first_param.rb +8 -5
- data/lib/puppet-lint/plugins/check_resources/ensure_not_symlink_target.rb +11 -8
- data/lib/puppet-lint/plugins/check_resources/file_mode.rb +14 -9
- data/lib/puppet-lint/plugins/check_resources/unquoted_file_mode.rb +11 -6
- data/lib/puppet-lint/plugins/check_resources/unquoted_resource_title.rb +6 -4
- data/lib/puppet-lint/plugins/check_strings/double_quoted_strings.rb +12 -7
- data/lib/puppet-lint/plugins/check_strings/only_variable_string.rb +8 -6
- data/lib/puppet-lint/plugins/check_strings/puppet_url_without_modules.rb +14 -8
- data/lib/puppet-lint/plugins/check_strings/quoted_booleans.rb +11 -7
- data/lib/puppet-lint/plugins/check_strings/single_quote_string_with_variables.rb +11 -6
- data/lib/puppet-lint/plugins/check_strings/variables_not_enclosed.rb +12 -8
- data/lib/puppet-lint/plugins/check_variables/variable_contains_dash.rb +11 -7
- data/lib/puppet-lint/plugins/check_variables/variable_is_lowercase.rb +11 -7
- data/lib/puppet-lint/plugins/check_whitespace/140chars.rb +3 -8
- data/lib/puppet-lint/plugins/check_whitespace/2sp_soft_tabs.rb +10 -8
- data/lib/puppet-lint/plugins/check_whitespace/80chars.rb +3 -8
- data/lib/puppet-lint/plugins/check_whitespace/arrow_alignment.rb +10 -8
- data/lib/puppet-lint/plugins/check_whitespace/hard_tabs.rb +11 -7
- data/lib/puppet-lint/plugins/check_whitespace/line_length.rb +29 -0
- data/lib/puppet-lint/plugins/check_whitespace/trailing_whitespace.rb +13 -7
- data/lib/puppet-lint/plugins.rb +60 -61
- data/lib/puppet-lint/report/github.rb +17 -0
- data/lib/puppet-lint/report/sarif_template.json +63 -0
- data/lib/puppet-lint/tasks/puppet-lint.rb +84 -83
- data/lib/puppet-lint/tasks/release_test.rb +4 -1
- data/lib/puppet-lint/version.rb +1 -1
- data/lib/puppet-lint.rb +27 -12
- data/spec/acceptance/puppet_lint_spec.rb +46 -0
- data/spec/spec_helper.rb +92 -91
- data/spec/spec_helper_acceptance.rb +6 -0
- data/spec/spec_helper_acceptance_local.rb +38 -0
- data/spec/{puppet-lint → unit/puppet-lint}/bin_spec.rb +79 -35
- data/spec/{puppet-lint → unit/puppet-lint}/checks_spec.rb +36 -36
- data/spec/unit/puppet-lint/configuration_spec.rb +88 -0
- data/spec/{puppet-lint → unit/puppet-lint}/data_spec.rb +6 -3
- data/spec/{puppet-lint → unit/puppet-lint}/ignore_overrides_spec.rb +17 -17
- data/spec/{puppet-lint → unit/puppet-lint}/lexer/string_slurper_spec.rb +128 -128
- data/spec/{puppet-lint → unit/puppet-lint}/lexer/token_spec.rb +1 -1
- data/spec/{puppet-lint → unit/puppet-lint}/lexer_spec.rb +653 -671
- data/spec/{puppet-lint → unit/puppet-lint}/plugins/check_classes/arrow_on_right_operand_line_spec.rb +16 -16
- data/spec/{puppet-lint → unit/puppet-lint}/plugins/check_classes/autoloader_layout_spec.rb +13 -13
- data/spec/{puppet-lint → unit/puppet-lint}/plugins/check_classes/class_inherits_from_params_class_spec.rb +3 -3
- data/spec/{puppet-lint → unit/puppet-lint}/plugins/check_classes/code_on_top_scope_spec.rb +4 -4
- data/spec/{puppet-lint → unit/puppet-lint}/plugins/check_classes/inherits_across_namespaces_spec.rb +4 -4
- data/spec/{puppet-lint → unit/puppet-lint}/plugins/check_classes/name_contains_uppercase_spec.rb +10 -10
- data/spec/{puppet-lint → unit/puppet-lint}/plugins/check_classes/names_containing_dash_spec.rb +7 -7
- data/spec/{puppet-lint → unit/puppet-lint}/plugins/check_classes/nested_classes_or_defines_spec.rb +7 -7
- data/spec/{puppet-lint → unit/puppet-lint}/plugins/check_classes/parameter_order_spec.rb +9 -9
- data/spec/{puppet-lint → unit/puppet-lint}/plugins/check_classes/right_to_left_relationship_spec.rb +3 -3
- data/spec/{puppet-lint → unit/puppet-lint}/plugins/check_classes/variable_scope_spec.rb +25 -25
- data/spec/{puppet-lint → unit/puppet-lint}/plugins/check_comments/slash_comments_spec.rb +7 -7
- data/spec/{puppet-lint → unit/puppet-lint}/plugins/check_comments/star_comments_spec.rb +13 -13
- data/spec/{puppet-lint → unit/puppet-lint}/plugins/check_conditionals/case_without_default_spec.rb +10 -10
- data/spec/{puppet-lint → unit/puppet-lint}/plugins/check_conditionals/selector_inside_resource_spec.rb +3 -3
- data/spec/{puppet-lint → unit/puppet-lint}/plugins/check_documentation/documentation_spec.rb +8 -8
- data/spec/{puppet-lint → unit/puppet-lint}/plugins/check_nodes/unquoted_node_name_spec.rb +24 -24
- data/spec/{puppet-lint → unit/puppet-lint}/plugins/check_resources/duplicate_params_spec.rb +9 -9
- data/spec/{puppet-lint → unit/puppet-lint}/plugins/check_resources/ensure_first_param_spec.rb +19 -19
- data/spec/{puppet-lint → unit/puppet-lint}/plugins/check_resources/ensure_not_symlink_target_spec.rb +10 -10
- data/spec/{puppet-lint → unit/puppet-lint}/plugins/check_resources/file_mode_spec.rb +40 -40
- data/spec/{puppet-lint → unit/puppet-lint}/plugins/check_resources/unquoted_file_mode_spec.rb +20 -20
- data/spec/{puppet-lint → unit/puppet-lint}/plugins/check_resources/unquoted_resource_title_spec.rb +24 -24
- data/spec/{puppet-lint → unit/puppet-lint}/plugins/check_strings/double_quoted_strings_spec.rb +27 -27
- data/spec/{puppet-lint → unit/puppet-lint}/plugins/check_strings/only_variable_string_spec.rb +18 -18
- data/spec/{puppet-lint → unit/puppet-lint}/plugins/check_strings/puppet_url_without_modules_spec.rb +9 -9
- data/spec/{puppet-lint → unit/puppet-lint}/plugins/check_strings/quoted_booleans_spec.rb +22 -22
- data/spec/{puppet-lint → unit/puppet-lint}/plugins/check_strings/single_quote_string_with_variables_spec.rb +2 -2
- data/spec/{puppet-lint → unit/puppet-lint}/plugins/check_strings/variables_not_enclosed_spec.rb +21 -21
- data/spec/{puppet-lint → unit/puppet-lint}/plugins/check_variables/variable_contains_dash_spec.rb +6 -6
- data/spec/{puppet-lint → unit/puppet-lint}/plugins/check_variables/variable_is_lowercase_spec.rb +7 -7
- data/spec/{puppet-lint → unit/puppet-lint}/plugins/check_whitespace/140chars_spec.rb +5 -5
- data/spec/{puppet-lint → unit/puppet-lint}/plugins/check_whitespace/2sp_soft_tabs_spec.rb +2 -2
- data/spec/{puppet-lint → unit/puppet-lint}/plugins/check_whitespace/80chars_spec.rb +6 -6
- data/spec/{puppet-lint → unit/puppet-lint}/plugins/check_whitespace/arrow_alignment_spec.rb +127 -127
- data/spec/{puppet-lint → unit/puppet-lint}/plugins/check_whitespace/hard_tabs_spec.rb +7 -7
- data/spec/{puppet-lint → unit/puppet-lint}/plugins/check_whitespace/trailing_whitespace_spec.rb +15 -15
- data/spec/unit/puppet-lint/puppet-lint_spec.rb +18 -0
- metadata +63 -119
- data/CHANGELOG.md +0 -33
- data/HISTORY.md +0 -1130
- data/spec/puppet-lint/configuration_spec.rb +0 -66
- data/spec/puppet-lint_spec.rb +0 -16
@@ -48,7 +48,7 @@ class PuppetLint::OptParser
|
|
48
48
|
opts.on(
|
49
49
|
'--error-level LEVEL',
|
50
50
|
[:all, :warning, :error],
|
51
|
-
'The level of error to return (warning, error or all).'
|
51
|
+
'The level of error to return (warning, error or all).',
|
52
52
|
) do |el|
|
53
53
|
PuppetLint.configuration.error_level = el
|
54
54
|
end
|
@@ -98,6 +98,10 @@ class PuppetLint::OptParser
|
|
98
98
|
PuppetLint.configuration.json = true
|
99
99
|
end
|
100
100
|
|
101
|
+
opts.on('--sarif', 'Log output as SARIF') do
|
102
|
+
PuppetLint.configuration.sarif = true
|
103
|
+
end
|
104
|
+
|
101
105
|
opts.on('--list-checks', 'List available check names.') do
|
102
106
|
PuppetLint.configuration.list_checks = true
|
103
107
|
end
|
@@ -9,10 +9,12 @@ PuppetLint.new_check(:arrow_on_right_operand_line) do
|
|
9
9
|
|
10
10
|
notify(
|
11
11
|
:warning,
|
12
|
-
:
|
13
|
-
:
|
14
|
-
:
|
15
|
-
:
|
12
|
+
message: "arrow should be on the right operand's line",
|
13
|
+
line: token.line,
|
14
|
+
column: token.column,
|
15
|
+
token: token,
|
16
|
+
description: 'Test the manifest tokens for chaining arrow that is on the line of the left operand when the right operand is on another line.',
|
17
|
+
help_uri: 'https://puppet.com/docs/puppet/latest/style_guide.html#chaining-arrow-syntax',
|
16
18
|
)
|
17
19
|
end
|
18
20
|
end
|
@@ -25,9 +25,11 @@ PuppetLint.new_check(:autoloader_layout) do
|
|
25
25
|
|
26
26
|
notify(
|
27
27
|
:error,
|
28
|
-
:
|
29
|
-
:
|
30
|
-
:
|
28
|
+
message: "#{title_token.value} not in autoload module layout",
|
29
|
+
line: title_token.line,
|
30
|
+
column: title_token.column,
|
31
|
+
description: 'Test the manifest tokens for any classes or defined types that are not in an appropriately named file for the autoloader to detect and record an error of each instance found.',
|
32
|
+
help_uri: 'https://puppet.com/docs/puppet/latest/style_guide.html#separate-files',
|
31
33
|
)
|
32
34
|
end
|
33
35
|
end
|
@@ -5,13 +5,15 @@
|
|
5
5
|
PuppetLint.new_check(:class_inherits_from_params_class) do
|
6
6
|
def check
|
7
7
|
class_indexes.each do |class_idx|
|
8
|
-
next unless class_idx[:inherited_token] && class_idx[:inherited_token]
|
8
|
+
next unless class_idx[:inherited_token] && class_idx[:inherited_token]&.value&.end_with?('::params')
|
9
9
|
|
10
10
|
notify(
|
11
11
|
:warning,
|
12
|
-
:
|
13
|
-
:
|
14
|
-
:
|
12
|
+
message: 'class inheriting from params class',
|
13
|
+
line: class_idx[:inherited_token].line,
|
14
|
+
column: class_idx[:inherited_token].column,
|
15
|
+
description: 'Check the manifest tokens for any classes that inherit a params subclass and record a warning for each instance found.',
|
16
|
+
help_uri: nil,
|
15
17
|
)
|
16
18
|
end
|
17
19
|
end
|
@@ -11,9 +11,11 @@ PuppetLint.new_check(:code_on_top_scope) do
|
|
11
11
|
|
12
12
|
notify(
|
13
13
|
:warning,
|
14
|
-
:
|
15
|
-
:
|
16
|
-
:
|
14
|
+
message: "code outside of class or define block - #{token.value}",
|
15
|
+
line: token.line,
|
16
|
+
column: token.column,
|
17
|
+
description: 'Test that no code is outside of a class or define scope.',
|
18
|
+
help_uri: nil,
|
17
19
|
)
|
18
20
|
end
|
19
21
|
end
|
@@ -14,9 +14,11 @@ PuppetLint.new_check(:inherits_across_namespaces) do
|
|
14
14
|
|
15
15
|
notify(
|
16
16
|
:warning,
|
17
|
-
:
|
18
|
-
:
|
19
|
-
:
|
17
|
+
message: 'class inherits across module namespaces',
|
18
|
+
line: class_idx[:inherited_token].line,
|
19
|
+
column: class_idx[:inherited_token].column,
|
20
|
+
description: 'Test the manifest tokens for any classes that inherit across namespaces and record a warning for each instance found.',
|
21
|
+
help_uri: 'https://puppet.com/docs/puppet/latest/style_guide.html#class-inheritance',
|
20
22
|
)
|
21
23
|
end
|
22
24
|
end
|
@@ -15,9 +15,11 @@ PuppetLint.new_check(:names_containing_dash) do
|
|
15
15
|
|
16
16
|
notify(
|
17
17
|
:error,
|
18
|
-
:
|
19
|
-
:
|
20
|
-
:
|
18
|
+
message: "#{obj_type} name containing a dash",
|
19
|
+
line: class_idx[:name_token].line,
|
20
|
+
column: class_idx[:name_token].column,
|
21
|
+
description: 'Check the manifest tokens for any classes or defined types that have a dash in their name and record an error for each instance found.',
|
22
|
+
help_uri: nil,
|
21
23
|
)
|
22
24
|
end
|
23
25
|
end
|
@@ -5,7 +5,7 @@
|
|
5
5
|
PuppetLint.new_check(:names_containing_uppercase) do
|
6
6
|
def check
|
7
7
|
(class_indexes + defined_type_indexes).each do |class_idx|
|
8
|
-
next unless
|
8
|
+
next unless %r{[A-Z]}.match?(class_idx[:name_token].value)
|
9
9
|
|
10
10
|
obj_type = if class_idx[:type] == :CLASS
|
11
11
|
'class'
|
@@ -15,10 +15,12 @@ PuppetLint.new_check(:names_containing_uppercase) do
|
|
15
15
|
|
16
16
|
notify(
|
17
17
|
:error,
|
18
|
-
:
|
19
|
-
:
|
20
|
-
:
|
21
|
-
:
|
18
|
+
message: "#{obj_type} '#{class_idx[:name_token].value}' contains illegal uppercase",
|
19
|
+
line: class_idx[:name_token].line,
|
20
|
+
column: class_idx[:name_token].column,
|
21
|
+
token: class_idx[:name_token],
|
22
|
+
description: 'Find and warn about module names with illegal uppercase characters.',
|
23
|
+
help_uri: 'https://puppet.com/docs/puppet/latest/modules_fundamentals.html#allowed-module-names',
|
22
24
|
)
|
23
25
|
end
|
24
26
|
end
|
@@ -17,9 +17,11 @@ PuppetLint.new_check(:nested_classes_or_defines) do
|
|
17
17
|
|
18
18
|
notify(
|
19
19
|
:warning,
|
20
|
-
:
|
21
|
-
:
|
22
|
-
:
|
20
|
+
message: "#{type} defined inside a class",
|
21
|
+
line: token.line,
|
22
|
+
column: token.column,
|
23
|
+
description: 'Test the manifest tokens for any classes or defined types that are defined inside another class.',
|
24
|
+
help_uri: 'https://puppet.com/docs/puppet/latest/style_guide.html#nested-classes-or-defined-types',
|
23
25
|
)
|
24
26
|
end
|
25
27
|
end
|
@@ -31,9 +31,12 @@ PuppetLint.new_check(:parameter_order) do
|
|
31
31
|
msg = 'optional parameter listed before required parameter'
|
32
32
|
notify(
|
33
33
|
:warning,
|
34
|
-
:
|
35
|
-
:
|
36
|
-
:
|
34
|
+
message: msg,
|
35
|
+
line: token.line,
|
36
|
+
column: token.column,
|
37
|
+
description: 'Test the manifest tokens for any parameterised classes or defined types that take '\
|
38
|
+
'parameters and record a warning if there are any optional parameters listed before required parameters.',
|
39
|
+
help_uri: 'https://puppet.com/docs/puppet/latest/style_guide.html#display-order-of-parameters',
|
37
40
|
)
|
38
41
|
end
|
39
42
|
end
|
@@ -52,7 +55,7 @@ PuppetLint.new_check(:parameter_order) do
|
|
52
55
|
end
|
53
56
|
|
54
57
|
def required_parameter?(token)
|
55
|
-
data_type = token.prev_token_of(:TYPE, :
|
58
|
+
data_type = token.prev_token_of(:TYPE, skip_blocks: true)
|
56
59
|
return false if data_type && data_type.value == 'Optional'
|
57
60
|
|
58
61
|
if token.next_code_token.nil? || [:COMMA, :RPAREN].include?(token.next_code_token.type)
|
@@ -7,9 +7,11 @@ PuppetLint.new_check(:right_to_left_relationship) do
|
|
7
7
|
tokens.select { |r| r.type == :OUT_EDGE }.each do |token|
|
8
8
|
notify(
|
9
9
|
:warning,
|
10
|
-
:
|
11
|
-
:
|
12
|
-
:
|
10
|
+
message: 'right-to-left (<-) relationship',
|
11
|
+
line: token.line,
|
12
|
+
column: token.column,
|
13
|
+
description: 'Test the manifest tokens for any right-to-left (<-) chaining operators and record a warning for each instance found.',
|
14
|
+
help_uri: 'https://puppet.com/docs/puppet/latest/style_guide.html#chaining-arrow-syntax',
|
13
15
|
)
|
14
16
|
end
|
15
17
|
end
|
@@ -41,13 +41,11 @@ PuppetLint.new_check(:variable_scope) do
|
|
41
41
|
referenced_variables = Set[]
|
42
42
|
object_tokens = idx[:tokens]
|
43
43
|
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
next unless POST_VAR_TOKENS.include?(token.next_code_token.type)
|
44
|
+
idx[:param_tokens]&.each do |token|
|
45
|
+
next unless token.type == :VARIABLE
|
46
|
+
next unless POST_VAR_TOKENS.include?(token.next_code_token.type)
|
48
47
|
|
49
|
-
|
50
|
-
end
|
48
|
+
variables_in_scope << token.value
|
51
49
|
end
|
52
50
|
|
53
51
|
future_parser_scopes = {}
|
@@ -63,7 +61,7 @@ PuppetLint.new_check(:variable_scope) do
|
|
63
61
|
temp_token = token
|
64
62
|
|
65
63
|
brack_depth = 0
|
66
|
-
while temp_token = temp_token.prev_code_token
|
64
|
+
while (temp_token = temp_token.prev_code_token)
|
67
65
|
case temp_token.type
|
68
66
|
when :VARIABLE
|
69
67
|
variables_in_scope << temp_token.value
|
@@ -72,7 +70,7 @@ PuppetLint.new_check(:variable_scope) do
|
|
72
70
|
when :LBRACK
|
73
71
|
brack_depth -= 1
|
74
72
|
break if brack_depth.zero?
|
75
|
-
when :COMMA
|
73
|
+
when :COMMA
|
76
74
|
# ignore
|
77
75
|
else # unexpected
|
78
76
|
break
|
@@ -124,15 +122,19 @@ PuppetLint.new_check(:variable_scope) do
|
|
124
122
|
end
|
125
123
|
|
126
124
|
next if token.value.include?('::')
|
127
|
-
next if
|
125
|
+
next if %r{^(facts|trusted)\[.+\]}.match?(token.value)
|
128
126
|
next if variables_in_scope.include?(token.value.gsub(%r{\[.+\]\Z}, ''))
|
129
|
-
next if
|
127
|
+
next if %r{\A\d+\Z}.match?(token.value)
|
130
128
|
|
131
129
|
notify(
|
132
130
|
:warning,
|
133
|
-
:
|
134
|
-
:
|
135
|
-
:
|
131
|
+
message: msg,
|
132
|
+
line: token.line,
|
133
|
+
column: token.column,
|
134
|
+
description: 'Test the manifest tokens for any variables that are referenced in the manifest. ' \
|
135
|
+
'If the variables are not fully qualified or one of the variables automatically created in the scope, ' \
|
136
|
+
'check that they have been defined in the local scope and record a warning for each variable that has not.',
|
137
|
+
help_uri: 'https://puppet.com/docs/puppet/latest/style_guide.html#namespacing-variables',
|
136
138
|
)
|
137
139
|
end
|
138
140
|
end
|
@@ -4,15 +4,17 @@
|
|
4
4
|
# https://puppet.com/docs/puppet/latest/style_guide.html#comments
|
5
5
|
PuppetLint.new_check(:slash_comments) do
|
6
6
|
def check
|
7
|
-
tokens.select { |token|
|
8
|
-
|
9
|
-
|
7
|
+
invalid_tokens = tokens.select { |token| token.type == :SLASH_COMMENT }
|
8
|
+
|
9
|
+
invalid_tokens.each do |token|
|
10
10
|
notify(
|
11
11
|
:warning,
|
12
|
-
:
|
13
|
-
:
|
14
|
-
:
|
15
|
-
:
|
12
|
+
message: '// comment found',
|
13
|
+
line: token.line,
|
14
|
+
column: token.column,
|
15
|
+
token: token,
|
16
|
+
description: 'Check the manifest tokens for any comments started with slashes (//) and record a warning for each instance found.',
|
17
|
+
help_uri: 'https://puppet.com/docs/puppet/latest/style_guide.html#comments',
|
16
18
|
)
|
17
19
|
end
|
18
20
|
end
|
@@ -4,15 +4,17 @@
|
|
4
4
|
# https://puppet.com/docs/puppet/latest/style_guide.html#comments
|
5
5
|
PuppetLint.new_check(:star_comments) do
|
6
6
|
def check
|
7
|
-
tokens.select { |token|
|
8
|
-
|
9
|
-
|
7
|
+
invalid_tokens = tokens.select { |token| token.type == :MLCOMMENT }
|
8
|
+
|
9
|
+
invalid_tokens.each do |token|
|
10
10
|
notify(
|
11
11
|
:warning,
|
12
|
-
:
|
13
|
-
:
|
14
|
-
:
|
15
|
-
:
|
12
|
+
message: '/* */ comment found',
|
13
|
+
line: token.line,
|
14
|
+
column: token.column,
|
15
|
+
token: token,
|
16
|
+
description: 'Check the manifest tokens for any comments encapsulated with slash-asterisks (/* */) and record a warning for each instance found.',
|
17
|
+
help_uri: 'https://puppet.com/docs/puppet/latest/style_guide.html#comments',
|
16
18
|
)
|
17
19
|
end
|
18
20
|
end
|
@@ -25,7 +27,7 @@ PuppetLint.new_check(:star_comments) do
|
|
25
27
|
problem[:token].value = " #{first_line}"
|
26
28
|
|
27
29
|
index = tokens.index(problem[:token].next_token) || 1
|
28
|
-
comment_lines.
|
30
|
+
comment_lines.reverse_each do |line|
|
29
31
|
indent = problem[:token].prev_token.nil? ? nil : problem[:token].prev_token.value.dup
|
30
32
|
add_token(index, PuppetLint::Lexer::Token.new(:COMMENT, " #{line}", 0, 0))
|
31
33
|
add_token(index, PuppetLint::Lexer::Token.new(:INDENT, indent, 0, 0)) if indent
|
@@ -17,7 +17,7 @@ PuppetLint.new_check(:case_without_default) do
|
|
17
17
|
elsif tokens[idx].type == :RBRACE
|
18
18
|
depth -= 1
|
19
19
|
if depth.zero?
|
20
|
-
case_indexes << { :
|
20
|
+
case_indexes << { start: token_idx, end: idx }
|
21
21
|
break
|
22
22
|
end
|
23
23
|
end
|
@@ -49,9 +49,11 @@ PuppetLint.new_check(:case_without_default) do
|
|
49
49
|
|
50
50
|
notify(
|
51
51
|
:warning,
|
52
|
-
:
|
53
|
-
:
|
54
|
-
:
|
52
|
+
message: 'case statement without a default case',
|
53
|
+
line: case_tokens.first.line,
|
54
|
+
column: case_tokens.first.column,
|
55
|
+
description: 'Test the manifest tokens for any case statements that do not contain a "default" case and record a warning for each instance found.',
|
56
|
+
help_uri: 'https://puppet.com/docs/puppet/latest/style_guide.html#defaults-for-case-statements-and-selectors',
|
55
57
|
)
|
56
58
|
end
|
57
59
|
end
|
@@ -12,9 +12,11 @@ PuppetLint.new_check(:selector_inside_resource) do
|
|
12
12
|
|
13
13
|
notify(
|
14
14
|
:warning,
|
15
|
-
:
|
16
|
-
:
|
17
|
-
:
|
15
|
+
message: 'selector inside resource block',
|
16
|
+
line: token.line,
|
17
|
+
column: token.column,
|
18
|
+
description: 'Test the manifest tokens for any selectors embedded within resource declarations and record a warning for each instance found.',
|
19
|
+
help_uri: 'https://puppet.com/docs/puppet/latest/style_guide.html#keep-resource-declarations-simple',
|
18
20
|
)
|
19
21
|
end
|
20
22
|
end
|
@@ -22,9 +22,13 @@ PuppetLint.new_check(:documentation) do
|
|
22
22
|
|
23
23
|
notify(
|
24
24
|
:warning,
|
25
|
-
:
|
26
|
-
:
|
27
|
-
:
|
25
|
+
message: "#{type} not documented",
|
26
|
+
line: first_token.line,
|
27
|
+
column: first_token.column,
|
28
|
+
description: 'Check the manifest tokens for any class or defined type that does not '\
|
29
|
+
'have a comment directly above it (hopefully, explaining the usage of it) and record '\
|
30
|
+
'a warning for each instance found.',
|
31
|
+
help_uri: 'https://puppet.com/docs/puppet/latest/style_guide.html#public-and-private',
|
28
32
|
)
|
29
33
|
end
|
30
34
|
end
|
@@ -11,25 +11,29 @@ PuppetLint.new_check(:unquoted_node_name) do
|
|
11
11
|
if node_lbrace_tok.nil?
|
12
12
|
notify(
|
13
13
|
:error,
|
14
|
-
:
|
15
|
-
:
|
16
|
-
:
|
17
|
-
:
|
14
|
+
check: :syntax,
|
15
|
+
message: 'Syntax error (try running `puppet parser validate <file>`)',
|
16
|
+
line: node.line,
|
17
|
+
column: node.column,
|
18
|
+
description: 'Check for any syntax error and record an error of each instance found.',
|
19
|
+
help_uri: nil,
|
18
20
|
)
|
19
21
|
next
|
20
22
|
end
|
21
23
|
|
22
24
|
node_lbrace_idx = tokens.index(node_lbrace_tok)
|
23
25
|
|
24
|
-
tokens[node_token_idx..node_lbrace_idx].select { |token|
|
25
|
-
|
26
|
-
|
26
|
+
invalid_tokens = tokens[node_token_idx..node_lbrace_idx].select { |token| token.type == :NAME && token.value != 'default' }
|
27
|
+
|
28
|
+
invalid_tokens.each do |token|
|
27
29
|
notify(
|
28
30
|
:warning,
|
29
|
-
:
|
30
|
-
:
|
31
|
-
:
|
32
|
-
:
|
31
|
+
message: 'unquoted node name found',
|
32
|
+
line: token.line,
|
33
|
+
column: token.column,
|
34
|
+
token: token,
|
35
|
+
description: 'Check the manifest for unquoted node names and record a warning for each instance found.',
|
36
|
+
help_uri: nil,
|
33
37
|
)
|
34
38
|
end
|
35
39
|
end
|
@@ -24,9 +24,11 @@ PuppetLint.new_check(:duplicate_params) do
|
|
24
24
|
if (seen_params[level] ||= Set.new).include?(prev_token.value)
|
25
25
|
notify(
|
26
26
|
:error,
|
27
|
-
:
|
28
|
-
:
|
29
|
-
:
|
27
|
+
message: 'duplicate parameter found in resource',
|
28
|
+
line: prev_token.line,
|
29
|
+
column: prev_token.column,
|
30
|
+
description: 'Check the tokens of each resource instance for any duplicate parameters and record a warning for each instance found.',
|
31
|
+
help_uri: nil,
|
30
32
|
)
|
31
33
|
else
|
32
34
|
seen_params[level] << prev_token.value
|
@@ -17,10 +17,13 @@ PuppetLint.new_check(:ensure_first_param) do
|
|
17
17
|
ensure_token = resource[:param_tokens][ensure_attr_index]
|
18
18
|
notify(
|
19
19
|
:warning,
|
20
|
-
:
|
21
|
-
:
|
22
|
-
:
|
23
|
-
:
|
20
|
+
message: "ensure found on line but it's not the first attribute",
|
21
|
+
line: ensure_token.line,
|
22
|
+
column: ensure_token.column,
|
23
|
+
resource: resource,
|
24
|
+
description: 'Check the tokens of each resource instance for an ensure parameter and if '\
|
25
|
+
'found, check that it is the first parameter listed. If it is not the first parameter, record a warning.',
|
26
|
+
help_uri: 'https://puppet.com/docs/puppet/latest/style_guide.html#attribute-ordering',
|
24
27
|
)
|
25
28
|
end
|
26
29
|
end
|
@@ -28,7 +31,7 @@ PuppetLint.new_check(:ensure_first_param) do
|
|
28
31
|
def fix(problem)
|
29
32
|
first_param_name_token = problem[:resource][:param_tokens].first
|
30
33
|
first_param_comma_token = first_param_name_token.next_token_of(:COMMA)
|
31
|
-
ensure_param_name_token = first_param_comma_token.next_token_of(:NAME, :
|
34
|
+
ensure_param_name_token = first_param_comma_token.next_token_of(:NAME, value: 'ensure')
|
32
35
|
|
33
36
|
raise PuppetLint::NoFix if ensure_param_name_token.nil?
|
34
37
|
|
@@ -8,19 +8,22 @@ PuppetLint.new_check(:ensure_not_symlink_target) do
|
|
8
8
|
resource_indexes.each do |resource|
|
9
9
|
next unless resource[:type].value == 'file'
|
10
10
|
|
11
|
-
resource[:param_tokens].select { |param_token|
|
12
|
-
|
13
|
-
|
11
|
+
resources = resource[:param_tokens].select { |param_token| param_token.value == 'ensure' }
|
12
|
+
|
13
|
+
resources.each do |ensure_token|
|
14
14
|
value_token = ensure_token.next_code_token.next_code_token
|
15
15
|
next unless value_token.value.start_with?('/')
|
16
16
|
|
17
17
|
notify(
|
18
18
|
:warning,
|
19
|
-
:
|
20
|
-
:
|
21
|
-
:
|
22
|
-
:
|
23
|
-
:
|
19
|
+
message: 'symlink target specified in ensure attr',
|
20
|
+
line: value_token.line,
|
21
|
+
column: value_token.column,
|
22
|
+
param_token: ensure_token,
|
23
|
+
value_token: value_token,
|
24
|
+
description: 'Check the tokens of each File resource instance for an ensure parameter and '\
|
25
|
+
'record a warning if the value of that parameter looks like a symlink target (starts with a \'/\').',
|
26
|
+
help_uri: 'https://puppet.com/docs/puppet/latest/style_guide.html#symbolic-links',
|
24
27
|
)
|
25
28
|
end
|
26
29
|
end
|
@@ -7,33 +7,38 @@ PuppetLint.new_check(:file_mode) do
|
|
7
7
|
MSG = 'mode should be represented as a 4 digit octal value or symbolic mode'.freeze
|
8
8
|
SYM_RE = '([ugoa]*[-=+][-=+rstwxXugo]*)(,[ugoa]*[-=+][-=+rstwxXugo]*)*'.freeze
|
9
9
|
IGNORE_TYPES = Set[:VARIABLE, :UNDEF, :FUNCTION_NAME]
|
10
|
-
MODE_RE = %r{\A([0-7]{4}|#{SYM_RE})\Z}
|
10
|
+
MODE_RE = %r{\A([0-7]{4}|#{SYM_RE})\Z}.freeze
|
11
11
|
|
12
12
|
def check
|
13
13
|
resource_indexes.each do |resource|
|
14
14
|
next unless resource[:type].value == 'file' || resource[:type].value == 'concat'
|
15
15
|
|
16
|
-
resource[:param_tokens].select
|
16
|
+
resources = resource[:param_tokens].select do |param_token|
|
17
17
|
param_token.value == 'mode'
|
18
|
-
|
18
|
+
end
|
19
|
+
|
20
|
+
resources.each do |param_token|
|
19
21
|
value_token = param_token.next_code_token.next_code_token
|
20
22
|
|
21
23
|
break if IGNORE_TYPES.include?(value_token.type)
|
22
|
-
break if value_token.value
|
24
|
+
break if MODE_RE.match?(value_token.value)
|
23
25
|
|
24
26
|
notify(
|
25
27
|
:warning,
|
26
|
-
:
|
27
|
-
:
|
28
|
-
:
|
29
|
-
:
|
28
|
+
message: MSG,
|
29
|
+
line: value_token.line,
|
30
|
+
column: value_token.column,
|
31
|
+
token: value_token,
|
32
|
+
description: 'Check the tokens of each File resource instance for a mode parameter and if found, ' \
|
33
|
+
'record a warning if the value of that parameter is not a 4 digit octal value (0755) or a symbolic mode (\'o=rwx,g\+r\').',
|
34
|
+
help_uri: 'https://puppet.com/docs/puppet/latest/style_guide.html#file-modes',
|
30
35
|
)
|
31
36
|
end
|
32
37
|
end
|
33
38
|
end
|
34
39
|
|
35
40
|
def fix(problem)
|
36
|
-
raise PuppetLint::NoFix unless
|
41
|
+
raise PuppetLint::NoFix unless %r{\A[0-7]{3}\Z}.match?(problem[:token].value)
|
37
42
|
|
38
43
|
problem[:token].type = :SSTRING
|
39
44
|
problem[:token].value = "0#{problem[:token].value}"
|
@@ -10,17 +10,22 @@ PuppetLint.new_check(:unquoted_file_mode) do
|
|
10
10
|
resource_indexes.each do |resource|
|
11
11
|
next unless resource[:type].value == 'file' || resource[:type].value == 'concat'
|
12
12
|
|
13
|
-
resource[:param_tokens].select
|
13
|
+
resources = resource[:param_tokens].select do |param_token|
|
14
14
|
param_token.value == 'mode' &&
|
15
15
|
TOKEN_TYPES.include?(param_token.next_code_token.next_code_token.type)
|
16
|
-
|
16
|
+
end
|
17
|
+
|
18
|
+
resources.each do |param_token|
|
17
19
|
value_token = param_token.next_code_token.next_code_token
|
18
20
|
notify(
|
19
21
|
:warning,
|
20
|
-
:
|
21
|
-
:
|
22
|
-
:
|
23
|
-
:
|
22
|
+
message: 'unquoted file mode',
|
23
|
+
line: value_token.line,
|
24
|
+
column: value_token.column,
|
25
|
+
token: value_token,
|
26
|
+
description: 'Check the tokens of each File resource instance for a mode parameter '\
|
27
|
+
'and if found, record a warning if the value of that parameter is not a quoted string.',
|
28
|
+
help_uri: 'https://puppet.com/docs/puppet/latest/style_guide.html#file-modes',
|
24
29
|
)
|
25
30
|
end
|
26
31
|
end
|
@@ -9,10 +9,12 @@ PuppetLint.new_check(:unquoted_resource_title) do
|
|
9
9
|
|
10
10
|
notify(
|
11
11
|
:warning,
|
12
|
-
:
|
13
|
-
:
|
14
|
-
:
|
15
|
-
:
|
12
|
+
message: 'unquoted resource title',
|
13
|
+
line: token.line,
|
14
|
+
column: token.column,
|
15
|
+
token: token,
|
16
|
+
description: 'Check the manifest tokens for any resource titles / namevars that are not quoted and record a warning for each instance found.',
|
17
|
+
help_uri: 'https://puppet.com/docs/puppet/latest/style_guide.html#resource-names',
|
16
18
|
)
|
17
19
|
end
|
18
20
|
end
|