cookstyle 5.0.4 → 5.1.19
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 +4 -4
- data/Gemfile +9 -0
- data/bin/cookstyle +7 -0
- data/config/cookstyle.yml +195 -7
- data/config/upstream.yml +1 -1
- data/lib/cookstyle.rb +1 -0
- data/lib/cookstyle/version.rb +1 -1
- data/lib/rubocop/chef/cookbook_only.rb +4 -3
- data/lib/rubocop/cop/chef/correctness/insecure_cookbook_url.rb +60 -0
- data/lib/rubocop/cop/chef/correctness/name_property_and_required.rb +94 -0
- data/lib/rubocop/cop/chef/correctness/node_normal.rb +53 -0
- data/lib/rubocop/cop/chef/correctness/node_normal_unless.rb +53 -0
- data/lib/rubocop/cop/chef/correctness/property_with_default_and_required.rb +67 -0
- data/lib/rubocop/cop/chef/correctness/property_with_name_attribute.rb +59 -0
- data/lib/rubocop/cop/chef/{service_resource.rb → correctness/service_resource.rb} +1 -1
- data/lib/rubocop/cop/chef/{tmp_path.rb → correctness/tmp_path.rb} +1 -1
- data/lib/rubocop/cop/chef/deprecation/attribute_metadata.rb +49 -0
- data/lib/rubocop/cop/chef/deprecation/conflicts_metadata.rb +44 -0
- data/lib/rubocop/cop/chef/deprecation/depends_compat_resource.rb +48 -0
- data/lib/rubocop/cop/chef/deprecation/depends_partial_search.rb +42 -0
- data/lib/rubocop/cop/chef/deprecation/depends_poise.rb +42 -0
- data/lib/rubocop/cop/chef/deprecation/easy_install.rb +39 -0
- data/lib/rubocop/cop/chef/deprecation/epic_fail.rb +50 -0
- data/lib/rubocop/cop/chef/deprecation/erl_call.rb +39 -0
- data/lib/rubocop/cop/chef/{node_set.rb → deprecation/node_set.rb} +2 -2
- data/lib/rubocop/cop/chef/deprecation/node_set_unless.rb +53 -0
- data/lib/rubocop/cop/chef/deprecation/provides_metadata.rb +44 -0
- data/lib/rubocop/cop/chef/deprecation/replaces_metadata.rb +44 -0
- data/lib/rubocop/cop/chef/deprecation/suggests_metadata.rb +44 -0
- data/lib/rubocop/cop/chef/effortless/data_bags.rb +36 -0
- data/lib/rubocop/cop/chef/effortless/search_used.rb +36 -0
- data/lib/rubocop/cop/chef/modernize/berksfile_source.rb +59 -0
- data/lib/rubocop/cop/chef/modernize/build_essential.rb +52 -0
- data/lib/rubocop/cop/chef/modernize/chef_14_resources.rb +54 -0
- data/lib/rubocop/cop/chef/modernize/why_run_supported_true.rb +46 -0
- data/lib/rubocop/cop/chef/{attribute_keys.rb → style/attribute_keys.rb} +2 -2
- data/lib/rubocop/cop/chef/style/comment_sentence_spacing.rb +42 -0
- data/lib/rubocop/cop/chef/{comments_copyright_format.rb → style/comments_copyright_format.rb} +5 -2
- data/lib/rubocop/cop/chef/{comments_format.rb → style/comments_format.rb} +4 -2
- data/lib/rubocop/cop/chef/{file_mode.rb → style/file_mode.rb} +1 -3
- metadata +34 -9
@@ -0,0 +1,53 @@
|
|
1
|
+
#
|
2
|
+
# Copyright:: Copyright 2019-2019, Chef Software Inc.
|
3
|
+
#
|
4
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
5
|
+
# you may not use this file except in compliance with the License.
|
6
|
+
# You may obtain a copy of the License at
|
7
|
+
#
|
8
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
9
|
+
#
|
10
|
+
# Unless required by applicable law or agreed to in writing, software
|
11
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
12
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
13
|
+
# See the License for the specific language governing permissions and
|
14
|
+
# limitations under the License.
|
15
|
+
#
|
16
|
+
module RuboCop
|
17
|
+
module Cop
|
18
|
+
module Chef
|
19
|
+
# Normal attributes are discouraged since their semantics differ importantly from the
|
20
|
+
# default and override levels. Their values persist in the node object even after
|
21
|
+
# all code referencing them has been deleted, unlike default and override.
|
22
|
+
#
|
23
|
+
# Code should be updated to use default or override levels, but this will change
|
24
|
+
# attribute merging behavior so needs to be validated manually and force_default or
|
25
|
+
# force_override levels may need to be used in recipe code.
|
26
|
+
#
|
27
|
+
# @example
|
28
|
+
#
|
29
|
+
# # bad
|
30
|
+
# node.normal['foo'] = true
|
31
|
+
#
|
32
|
+
# # good
|
33
|
+
# node.default['foo'] = true
|
34
|
+
# node.override['foo'] = true
|
35
|
+
# node.force_default['foo'] = true
|
36
|
+
# node.force_override['foo'] = true
|
37
|
+
#
|
38
|
+
class NodeNormal < Cop
|
39
|
+
MSG = 'Do not use node.normal. Replace with default/override/force_default/force_override attribute levels.'.freeze
|
40
|
+
|
41
|
+
def_node_matcher :node_normal?, <<-PATTERN
|
42
|
+
(send (send _ :node) :normal)
|
43
|
+
PATTERN
|
44
|
+
|
45
|
+
def on_send(node)
|
46
|
+
node_normal?(node) do
|
47
|
+
add_offense(node, location: :expression, message: MSG, severity: :refactor)
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
@@ -0,0 +1,53 @@
|
|
1
|
+
#
|
2
|
+
# Copyright:: Copyright 2019-2019, Chef Software Inc.
|
3
|
+
#
|
4
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
5
|
+
# you may not use this file except in compliance with the License.
|
6
|
+
# You may obtain a copy of the License at
|
7
|
+
#
|
8
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
9
|
+
#
|
10
|
+
# Unless required by applicable law or agreed to in writing, software
|
11
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
12
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
13
|
+
# See the License for the specific language governing permissions and
|
14
|
+
# limitations under the License.
|
15
|
+
#
|
16
|
+
module RuboCop
|
17
|
+
module Cop
|
18
|
+
module Chef
|
19
|
+
# Normal attributes are discouraged since their semantics differ importantly from the
|
20
|
+
# default and override levels. Their values persist in the node object even after
|
21
|
+
# all code referencing them has been deleted, unlike default and override.
|
22
|
+
#
|
23
|
+
# Code should be updated to use default or override levels, but this will change
|
24
|
+
# attribute merging behavior so needs to be validated manually and force_default or
|
25
|
+
# force_override levels may need to be used in recipe code.
|
26
|
+
#
|
27
|
+
# @example
|
28
|
+
#
|
29
|
+
# # bad
|
30
|
+
# node.normal_unless['foo'] = true
|
31
|
+
#
|
32
|
+
# # good
|
33
|
+
# node.default_unless['foo'] = true
|
34
|
+
# node.override_unless['foo'] = true
|
35
|
+
# node.force_default_unless['foo'] = true
|
36
|
+
# node.force_override_unless['foo'] = true
|
37
|
+
#
|
38
|
+
class NodeNormalUnless < Cop
|
39
|
+
MSG = 'Do not use node.normal_unless. Replace with default/override/force_default/force_override attribute levels.'.freeze
|
40
|
+
|
41
|
+
def_node_matcher :node_normal_unless?, <<-PATTERN
|
42
|
+
(send (send _ :node) :normal_unless)
|
43
|
+
PATTERN
|
44
|
+
|
45
|
+
def on_send(node)
|
46
|
+
node_normal_unless?(node) do
|
47
|
+
add_offense(node, location: :expression, message: MSG, severity: :refactor)
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
@@ -0,0 +1,67 @@
|
|
1
|
+
#
|
2
|
+
# Copyright:: Copyright 2019, Chef Software Inc.
|
3
|
+
# Author:: Tim Smith (<tsmith@chef.io>)
|
4
|
+
#
|
5
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
6
|
+
# you may not use this file except in compliance with the License.
|
7
|
+
# You may obtain a copy of the License at
|
8
|
+
#
|
9
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
10
|
+
#
|
11
|
+
# Unless required by applicable law or agreed to in writing, software
|
12
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
13
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14
|
+
# See the License for the specific language governing permissions and
|
15
|
+
# limitations under the License.
|
16
|
+
#
|
17
|
+
module RuboCop
|
18
|
+
module Cop
|
19
|
+
module Chef
|
20
|
+
# When using properties in a custom resource you shouldn't set a property to
|
21
|
+
# required and then provide a default value. If a property is required the
|
22
|
+
# user will always pass in a value and the default will never be used.
|
23
|
+
#
|
24
|
+
# @example
|
25
|
+
#
|
26
|
+
# # bad
|
27
|
+
# property :bob, String, required: true, default: 'foo'
|
28
|
+
#
|
29
|
+
# # good
|
30
|
+
# property :bob, String, required: true
|
31
|
+
#
|
32
|
+
class PropertyWithRequiredAndDefault < Cop
|
33
|
+
MSG = 'Resource property should not be both required and have a default value'.freeze
|
34
|
+
|
35
|
+
def on_send(node)
|
36
|
+
if required_property?(node) && property_has_default?(node)
|
37
|
+
add_offense(node, location: :expression, message: MSG, severity: :refactor)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
private
|
42
|
+
|
43
|
+
def required_property?(node)
|
44
|
+
if node.method_name == :property
|
45
|
+
node.arguments.each do |arg|
|
46
|
+
if arg.type == :hash
|
47
|
+
return true if arg.source.match?(/required:\s*true/)
|
48
|
+
end
|
49
|
+
end
|
50
|
+
false # no required: true found
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
def property_has_default?(node)
|
55
|
+
if node.method_name == :property
|
56
|
+
node.arguments.each do |arg|
|
57
|
+
if arg.type == :hash
|
58
|
+
return true if arg.source.match?(/default:/)
|
59
|
+
end
|
60
|
+
end
|
61
|
+
false # no default: found
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
@@ -0,0 +1,59 @@
|
|
1
|
+
#
|
2
|
+
# Copyright:: Copyright 2019, Chef Software Inc.
|
3
|
+
# Author:: Tim Smith (<tsmith@chef.io>)
|
4
|
+
#
|
5
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
6
|
+
# you may not use this file except in compliance with the License.
|
7
|
+
# You may obtain a copy of the License at
|
8
|
+
#
|
9
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
10
|
+
#
|
11
|
+
# Unless required by applicable law or agreed to in writing, software
|
12
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
13
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14
|
+
# See the License for the specific language governing permissions and
|
15
|
+
# limitations under the License.
|
16
|
+
#
|
17
|
+
module RuboCop
|
18
|
+
module Cop
|
19
|
+
module Chef
|
20
|
+
# When using properties in a custom resource you should use name_property not
|
21
|
+
# the legacy name_attribute from the days of attributes
|
22
|
+
#
|
23
|
+
# @example
|
24
|
+
#
|
25
|
+
# # bad
|
26
|
+
# property :bob, String, name_attribute: true
|
27
|
+
#
|
28
|
+
# # good
|
29
|
+
# property :bob, String, name_property: true
|
30
|
+
#
|
31
|
+
class PropertyWithNameAttribute < Cop
|
32
|
+
MSG = 'Resource property sets name_attribute not name_property'.freeze
|
33
|
+
|
34
|
+
def on_send(node)
|
35
|
+
add_offense(node, location: :expression, message: MSG, severity: :refactor) if attribute_method_mix?(node)
|
36
|
+
end
|
37
|
+
|
38
|
+
def autocorrect(node)
|
39
|
+
lambda do |corrector|
|
40
|
+
corrector.replace(node.loc.expression, node.source.gsub('name_attribute', 'name_property'))
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
private
|
45
|
+
|
46
|
+
def attribute_method_mix?(node)
|
47
|
+
if node.method_name == :property
|
48
|
+
node.arguments.each do |arg|
|
49
|
+
if arg.type == :hash
|
50
|
+
return true if arg.source.match?(/name_attribute:/)
|
51
|
+
end
|
52
|
+
end
|
53
|
+
false # no name_attribute found
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
@@ -35,7 +35,7 @@ module RuboCop
|
|
35
35
|
def on_send(node)
|
36
36
|
execute_command?(node) do |command|
|
37
37
|
if starts_service?(command)
|
38
|
-
add_offense(command, location: :expression, message: MSG, severity: :
|
38
|
+
add_offense(command, location: :expression, message: MSG, severity: :refactor)
|
39
39
|
end
|
40
40
|
end
|
41
41
|
end
|
@@ -38,7 +38,7 @@ module RuboCop
|
|
38
38
|
def on_send(node)
|
39
39
|
remote_file?(node) do |command|
|
40
40
|
if hardcoded_tmp?(command) && !file_cache_path?(command)
|
41
|
-
add_offense(command, location: :expression, message: MSG, severity: :
|
41
|
+
add_offense(command, location: :expression, message: MSG, severity: :refactor)
|
42
42
|
end
|
43
43
|
end
|
44
44
|
end
|
@@ -0,0 +1,49 @@
|
|
1
|
+
#
|
2
|
+
# Copyright:: 2019, Chef Software Inc.
|
3
|
+
# Author:: Tim Smith (<tsmith@chef.io>)
|
4
|
+
#
|
5
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
6
|
+
# you may not use this file except in compliance with the License.
|
7
|
+
# You may obtain a copy of the License at
|
8
|
+
#
|
9
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
10
|
+
#
|
11
|
+
# Unless required by applicable law or agreed to in writing, software
|
12
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
13
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14
|
+
# See the License for the specific language governing permissions and
|
15
|
+
# limitations under the License.
|
16
|
+
#
|
17
|
+
|
18
|
+
module RuboCop
|
19
|
+
module Cop
|
20
|
+
module Chef
|
21
|
+
# Don't use the deprecated 'attribute' metadata value
|
22
|
+
#
|
23
|
+
# @example
|
24
|
+
#
|
25
|
+
# # bad in metadata.rb:
|
26
|
+
#
|
27
|
+
# attribute 'zookeeper_bridge/server',
|
28
|
+
# display_name: 'zookeeper server',
|
29
|
+
# description: 'Zookeeper server address.',
|
30
|
+
# type: 'string',
|
31
|
+
# required: 'optional',
|
32
|
+
# default: '"127.0.0.1:2181"'
|
33
|
+
|
34
|
+
class AttributeMetadata < Cop
|
35
|
+
MSG = "Don't use the deprecated 'attribute' metadata value".freeze
|
36
|
+
|
37
|
+
def on_send(node)
|
38
|
+
add_offense(node, location: :expression, message: MSG, severity: :refactor) if node.method_name == :attribute
|
39
|
+
end
|
40
|
+
|
41
|
+
def autocorrect(node)
|
42
|
+
lambda do |corrector|
|
43
|
+
corrector.remove(node.loc.expression)
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
#
|
2
|
+
# Copyright:: 2019, Chef Software Inc.
|
3
|
+
# Author:: Tim Smith (<tsmith@chef.io>)
|
4
|
+
#
|
5
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
6
|
+
# you may not use this file except in compliance with the License.
|
7
|
+
# You may obtain a copy of the License at
|
8
|
+
#
|
9
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
10
|
+
#
|
11
|
+
# Unless required by applicable law or agreed to in writing, software
|
12
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
13
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14
|
+
# See the License for the specific language governing permissions and
|
15
|
+
# limitations under the License.
|
16
|
+
#
|
17
|
+
|
18
|
+
module RuboCop
|
19
|
+
module Cop
|
20
|
+
module Chef
|
21
|
+
# Don't use the deprecated 'conflicts' metadata value
|
22
|
+
#
|
23
|
+
# @example
|
24
|
+
#
|
25
|
+
# # bad in metadata.rb:
|
26
|
+
#
|
27
|
+
# conflicts "another_cookbook"
|
28
|
+
#
|
29
|
+
class ConflictsMetadata < Cop
|
30
|
+
MSG = "Don't use the deprecated 'conflicts' metadata value".freeze
|
31
|
+
|
32
|
+
def on_send(node)
|
33
|
+
add_offense(node, location: :expression, message: MSG, severity: :refactor) if node.method_name == :conflicts
|
34
|
+
end
|
35
|
+
|
36
|
+
def autocorrect(node)
|
37
|
+
lambda do |corrector|
|
38
|
+
corrector.remove(node.loc.expression)
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
@@ -0,0 +1,48 @@
|
|
1
|
+
#
|
2
|
+
# Copyright:: 2019, Chef Software, Inc.
|
3
|
+
# Author:: Tim Smith (<tsmith@chef.io>)
|
4
|
+
#
|
5
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
6
|
+
# you may not use this file except in compliance with the License.
|
7
|
+
# You may obtain a copy of the License at
|
8
|
+
#
|
9
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
10
|
+
#
|
11
|
+
# Unless required by applicable law or agreed to in writing, software
|
12
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
13
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14
|
+
# See the License for the specific language governing permissions and
|
15
|
+
# limitations under the License.
|
16
|
+
#
|
17
|
+
module RuboCop
|
18
|
+
module Cop
|
19
|
+
module Chef
|
20
|
+
# Don't depend on the deprecated compat_resource cookbook made obsolete by Chef 12.19+
|
21
|
+
#
|
22
|
+
# @example
|
23
|
+
#
|
24
|
+
# # bad
|
25
|
+
# depends 'compat_resource'
|
26
|
+
#
|
27
|
+
class CookbookDependsOnCompatResource < Cop
|
28
|
+
MSG = "Don't depend on the deprecated compat_resource cookbook made obsolete by Chef 12.19+".freeze
|
29
|
+
|
30
|
+
def_node_matcher :depends_compat_resource?, <<-PATTERN
|
31
|
+
(send nil? :depends (str {"compat_resource"}))
|
32
|
+
PATTERN
|
33
|
+
|
34
|
+
def on_send(node)
|
35
|
+
depends_compat_resource?(node) do
|
36
|
+
add_offense(node, location: :expression, message: MSG, severity: :refactor)
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
def autocorrect(node)
|
41
|
+
lambda do |corrector|
|
42
|
+
corrector.remove(node.loc.expression)
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
#
|
2
|
+
# Copyright:: 2019, Chef Software, Inc.
|
3
|
+
# Author:: Tim Smith (<tsmith@chef.io>)
|
4
|
+
#
|
5
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
6
|
+
# you may not use this file except in compliance with the License.
|
7
|
+
# You may obtain a copy of the License at
|
8
|
+
#
|
9
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
10
|
+
#
|
11
|
+
# Unless required by applicable law or agreed to in writing, software
|
12
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
13
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14
|
+
# See the License for the specific language governing permissions and
|
15
|
+
# limitations under the License.
|
16
|
+
#
|
17
|
+
module RuboCop
|
18
|
+
module Cop
|
19
|
+
module Chef
|
20
|
+
# Don't depend on the partial_search cookbook made obsolete by Chef 13
|
21
|
+
#
|
22
|
+
# @example
|
23
|
+
#
|
24
|
+
# # bad
|
25
|
+
# depends 'partial_search'
|
26
|
+
#
|
27
|
+
class CookbookDependsOnPartialSearch < Cop
|
28
|
+
MSG = "Don't depend on the deprecated partial_search cookbook made obsolete by Chef 13".freeze
|
29
|
+
|
30
|
+
def_node_matcher :depends_partial_search?, <<-PATTERN
|
31
|
+
(send nil? :depends (str {"partial_search"}))
|
32
|
+
PATTERN
|
33
|
+
|
34
|
+
def on_send(node)
|
35
|
+
depends_partial_search?(node) do
|
36
|
+
add_offense(node, location: :expression, message: MSG, severity: :refactor)
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|