cookstyle 5.19.9 → 5.20.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/config/cookstyle.yml +12 -0
- data/lib/cookstyle.rb +1 -1
- data/lib/cookstyle/version.rb +1 -1
- data/lib/rubocop/cop/chef/deprecation/chef_handler_supports.rb +3 -1
- data/lib/rubocop/cop/chef/deprecation/deprecated_chefspec_platform.rb +128 -0
- data/lib/rubocop/cop/chef/modernize/execute_sysctl.rb +2 -5
- data/lib/rubocop/cop/chef/modernize/libarchive_file.rb +22 -3
- data/lib/rubocop/cop/chef/style/chef_whaaat.rb +50 -0
- data/lib/rubocop/cop/chef/style/unnecessary_platform_case_statement.rb +28 -15
- metadata +4 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 5c8af7267fe94ef01b9da1d3b84c221101cdb7e8976217cbca2bd8f43c475858
|
4
|
+
data.tar.gz: 3f6196cac78246fc8b36a013f4bbb335470824f3ef23974869596087c8082925
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ef274262f9b3e41204d9ee5153c9c4022958659b69a6a4d781848a523d6bb37336101fafe5c30ece1d072118b13422803bfa629ba97605c75bd9588c8ef21e36
|
7
|
+
data.tar.gz: 6fbff49a1400321bee3bec46011d0b3193d8460a702c9749a84e11c9992c5642e75b2e3857ab1c84461c23a31b0e5b4c4dcd186e9ea4a0cc588974fd3e28d4b7
|
data/config/cookstyle.yml
CHANGED
@@ -122,6 +122,11 @@ ChefStyle/OverlyComplexSupportsDependsMetadata:
|
|
122
122
|
Include:
|
123
123
|
- '**/metadata.rb'
|
124
124
|
|
125
|
+
ChefStyle/ChefWhaaat:
|
126
|
+
Description: Do you mean Chef (the company) or a Chef product (e.g. Chef Infra, Chef InSpec, etc)?
|
127
|
+
Enabled: false
|
128
|
+
VersionAdded: '5.20.0'
|
129
|
+
|
125
130
|
###############################
|
126
131
|
# ChefCorrectness: Avoiding potential problems
|
127
132
|
###############################
|
@@ -700,6 +705,13 @@ ChefDeprecations/DeprecatedPlatformMethods:
|
|
700
705
|
- '**/resources/*.rb'
|
701
706
|
- '**/providers/*.rb'
|
702
707
|
|
708
|
+
ChefDeprecations/DeprecatedChefSpecPlatform:
|
709
|
+
Description: Use currently supported platforms in ChefSpec listed at https://github.com/chefspec/fauxhai/blob/master/PLATFORMS.md. Fauxhai / ChefSpec will perform fuzzy matching on platform version so it's always best to be less specific ie. 10 instead of 10.3
|
710
|
+
Enabled: true
|
711
|
+
VersionAdded: '5.20.0'
|
712
|
+
Include:
|
713
|
+
- '**/spec/**/*.rb'
|
714
|
+
|
703
715
|
###############################
|
704
716
|
# ChefModernize: Cleaning up legacy code and using new built-in resources
|
705
717
|
###############################
|
data/lib/cookstyle.rb
CHANGED
@@ -43,7 +43,7 @@ require_relative 'rubocop/chef/platform_helpers'
|
|
43
43
|
require_relative 'rubocop/chef/cookbook_only'
|
44
44
|
require_relative 'rubocop/cop/target_chef_version'
|
45
45
|
|
46
|
-
# Chef specific cops
|
46
|
+
# Chef Infra specific cops
|
47
47
|
Dir.glob(File.dirname(__FILE__) + '/rubocop/cop/chef/**/*.rb') do |file|
|
48
48
|
next if File.directory?(file)
|
49
49
|
|
data/lib/cookstyle/version.rb
CHANGED
@@ -46,7 +46,9 @@ module RuboCop
|
|
46
46
|
|
47
47
|
def autocorrect(node)
|
48
48
|
lambda do |corrector|
|
49
|
-
|
49
|
+
# make sure to delete leading and trailing {}s that would create invalid ruby syntax
|
50
|
+
extracted_val = node.arguments.first.source.gsub(/{|}/, '')
|
51
|
+
corrector.replace(node.loc.expression, "type #{extracted_val}")
|
50
52
|
end
|
51
53
|
end
|
52
54
|
end
|
@@ -0,0 +1,128 @@
|
|
1
|
+
#
|
2
|
+
# Copyright:: 2020, 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
|
+
module ChefDeprecations
|
22
|
+
# Use currently supported platforms in ChefSpec listed at https://github.com/chefspec/fauxhai/blob/master/PLATFORMS.md. Fauxhai / ChefSpec will perform fuzzy matching on platform version so it's always best to be less specific ie. 10 instead of 10.3
|
23
|
+
#
|
24
|
+
# @example
|
25
|
+
#
|
26
|
+
# let(:chef_run) { ChefSpec::ServerRunner.new(platform: 'ubuntu', version: '14.04') }
|
27
|
+
#
|
28
|
+
class DeprecatedChefSpecPlatform < Cop
|
29
|
+
include RuboCop::Chef::CookbookHelpers
|
30
|
+
|
31
|
+
MSG = "Use currently supported platforms in ChefSpec listed at https://github.com/chefspec/fauxhai/blob/master/PLATFORMS.md. Fauxhai / ChefSpec will perform fuzzy matching on platform version so it's always best to be less specific ie. 10 instead of 10.3".freeze
|
32
|
+
|
33
|
+
Gem::Dependency.new('', ['~> 1.4.5', '>= 1.4.6']).match?('', '1.4.6')
|
34
|
+
|
35
|
+
DEPRECATED_MAPPING = {
|
36
|
+
'amazon' => {
|
37
|
+
'2017.12' => '2',
|
38
|
+
},
|
39
|
+
'aix' => {
|
40
|
+
'~> 6' => true,
|
41
|
+
},
|
42
|
+
'smartos' => {
|
43
|
+
'5.10' => true,
|
44
|
+
},
|
45
|
+
'ubuntu' => {
|
46
|
+
'< 16.04' => true,
|
47
|
+
'> 16.04, < 18.04' => true,
|
48
|
+
},
|
49
|
+
'fedora' => {
|
50
|
+
'< 30' => '30',
|
51
|
+
},
|
52
|
+
'freebsd' => {
|
53
|
+
'< 11' => '12',
|
54
|
+
},
|
55
|
+
'mac_os_x' => {
|
56
|
+
'< 10.12' => '10.15',
|
57
|
+
},
|
58
|
+
'opensuse' => {
|
59
|
+
'< 14' => true,
|
60
|
+
'~> 42.0' => true,
|
61
|
+
},
|
62
|
+
'debian' => {
|
63
|
+
'< 8' => true,
|
64
|
+
'> 8.0, < 8.9' => '8',
|
65
|
+
'> 9.0, < 9.8' => '9',
|
66
|
+
},
|
67
|
+
'centos' => {
|
68
|
+
'< 6.0' => true,
|
69
|
+
'~> 6.0, < 6.8' => '6',
|
70
|
+
'~> 7.0, < 7.6 ' => '7',
|
71
|
+
},
|
72
|
+
'redhat' => {
|
73
|
+
'< 6.0' => true,
|
74
|
+
'~> 6.0, < 6.8' => '6',
|
75
|
+
'~> 7.0, < 7.6' => '7',
|
76
|
+
},
|
77
|
+
'oracle' => {
|
78
|
+
'< 6.0' => true,
|
79
|
+
'~> 6.0, < 6.8' => '6',
|
80
|
+
'~> 7.0, < 7.6 ' => '7',
|
81
|
+
},
|
82
|
+
}.freeze
|
83
|
+
|
84
|
+
def_node_matcher :chefspec_definition?, <<-PATTERN
|
85
|
+
(send (const (const nil? :ChefSpec) ... ) :new (hash <(pair (sym :platform) $(str ... )) (pair (sym :version) $(str ... )) ... >))
|
86
|
+
PATTERN
|
87
|
+
|
88
|
+
def legacy_chefspec_platform(platform, version)
|
89
|
+
return false unless DEPRECATED_MAPPING.key?(platform)
|
90
|
+
|
91
|
+
DEPRECATED_MAPPING[platform].each_pair do |match_string, replacement|
|
92
|
+
return true if Gem::Dependency.new('', match_string.split(',')).match?('', version) &&
|
93
|
+
replacement != version # we want to catch '7.0' and suggest '7', but not alert on '7'
|
94
|
+
end
|
95
|
+
|
96
|
+
false
|
97
|
+
end
|
98
|
+
|
99
|
+
def replacement_string(platform, version)
|
100
|
+
DEPRECATED_MAPPING[platform].each_pair do |match_string, replacement|
|
101
|
+
return replacement if Gem::Dependency.new('', match_string.split(',')).match?('', version) &&
|
102
|
+
replacement != version && # we want to catch '7.0' and suggest '7', but not alert on '7'
|
103
|
+
replacement != true # true means it's busted, but requires human intervention to fix
|
104
|
+
end
|
105
|
+
|
106
|
+
nil # we don't have a replacement os return nil
|
107
|
+
end
|
108
|
+
|
109
|
+
def on_send(node)
|
110
|
+
chefspec_definition?(node) do |plat, ver|
|
111
|
+
add_offense(node, location: :expression, message: MSG, severity: :refactor) if legacy_chefspec_platform(plat.value, ver.value)
|
112
|
+
end
|
113
|
+
end
|
114
|
+
|
115
|
+
def autocorrect(node)
|
116
|
+
chefspec_definition?(node) do |plat, ver|
|
117
|
+
if replacement = replacement_string(plat.value, ver.value) # rubocop: disable Lint/AssignmentInCondition
|
118
|
+
lambda do |corrector|
|
119
|
+
corrector.replace(ver.loc.expression, "'#{replacement}'")
|
120
|
+
end
|
121
|
+
end
|
122
|
+
end
|
123
|
+
end
|
124
|
+
end
|
125
|
+
end
|
126
|
+
end
|
127
|
+
end
|
128
|
+
end
|
@@ -22,10 +22,7 @@ module RuboCop
|
|
22
22
|
#
|
23
23
|
# # bad
|
24
24
|
# file '/etc/sysctl.d/ipv4.conf' do
|
25
|
-
#
|
26
|
-
# group 'root'
|
27
|
-
# mode '0755'
|
28
|
-
# notifies :run, 'service[sysctl -p /etc/sysctl.d/ipv4.conf]', :immediately
|
25
|
+
# notifies :run, 'execute[sysctl -p /etc/sysctl.d/ipv4.conf]', :immediately
|
29
26
|
# content '9000 65500'
|
30
27
|
# end
|
31
28
|
#
|
@@ -61,7 +58,7 @@ module RuboCop
|
|
61
58
|
def on_block(node)
|
62
59
|
match_property_in_resource?(:execute, 'command', node) do |code_property|
|
63
60
|
property_data = method_arg_ast_to_string(code_property)
|
64
|
-
if property_data && property_data.match?(
|
61
|
+
if property_data && property_data.match?(%r{^(/sbin/)?sysctl -p}i)
|
65
62
|
add_offense(node, location: :expression, message: MSG, severity: :refactor)
|
66
63
|
end
|
67
64
|
end
|
@@ -1,5 +1,5 @@
|
|
1
1
|
#
|
2
|
-
# Copyright:: 2019, Chef Software Inc.
|
2
|
+
# Copyright:: 2019-2020, Chef Software Inc.
|
3
3
|
# Author:: Tim Smith (<tsmith@chef.io>)
|
4
4
|
#
|
5
5
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
@@ -19,12 +19,17 @@ module RuboCop
|
|
19
19
|
module Cop
|
20
20
|
module Chef
|
21
21
|
module ChefModernize
|
22
|
-
# Use the archive_file resource built into Chef Infra Client 15+ instead of the libarchive_file resource
|
22
|
+
# Use the archive_file resource built into Chef Infra Client 15+ instead of the libarchive_file resource.
|
23
23
|
#
|
24
24
|
# @example
|
25
25
|
#
|
26
26
|
# # bad
|
27
|
-
#
|
27
|
+
# libarchive_file "C:\file.zip" do
|
28
|
+
# path 'C:\expand_here'
|
29
|
+
# end
|
30
|
+
#
|
31
|
+
# # good
|
32
|
+
# archive_file "C:\file.zip" do
|
28
33
|
# path 'C:\expand_here'
|
29
34
|
# end
|
30
35
|
#
|
@@ -35,8 +40,22 @@ module RuboCop
|
|
35
40
|
|
36
41
|
MSG = 'Use the archive_file resource built into Chef Infra Client 15+ instead of the libarchive file resource'.freeze
|
37
42
|
|
43
|
+
def_node_matcher :notification_property?, <<-PATTERN
|
44
|
+
(send nil? {:notifies :subscribes} (sym _) $(...) (sym _))
|
45
|
+
PATTERN
|
46
|
+
|
38
47
|
def on_send(node)
|
39
48
|
add_offense(node, location: :expression, message: MSG, severity: :refactor) if node.method_name == :libarchive_file
|
49
|
+
|
50
|
+
notification_property?(node) do |val|
|
51
|
+
add_offense(val, location: :expression, message: MSG, severity: :refactor) if val.str_content&.start_with?('libarchive_file')
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
def autocorrect(node)
|
56
|
+
lambda do |corrector|
|
57
|
+
corrector.replace(node.loc.expression, node.source.gsub('libarchive_file', 'archive_file'))
|
58
|
+
end
|
40
59
|
end
|
41
60
|
end
|
42
61
|
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
#
|
2
|
+
# Copyright:: 2020, 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
|
+
module ChefStyle
|
22
|
+
# Checks for comments that mention "Chef" without context. Do you mean Chef Infra or Chef Software?
|
23
|
+
#
|
24
|
+
# @example
|
25
|
+
#
|
26
|
+
# # bad
|
27
|
+
# Chef makes software
|
28
|
+
# Chef configures your systems
|
29
|
+
#
|
30
|
+
# # good
|
31
|
+
# Chef Software makes software
|
32
|
+
# Chef Infra configures your systems
|
33
|
+
#
|
34
|
+
class ChefWhaaat < Cop
|
35
|
+
MSG = 'Do you mean Chef (the company) or a Chef product (e.g. Chef Infra, Chef InSpec, etc)?'.freeze
|
36
|
+
|
37
|
+
def investigate(processed_source)
|
38
|
+
return unless processed_source.ast
|
39
|
+
|
40
|
+
processed_source.comments.each do |comment|
|
41
|
+
if comment.text.match?(/Chef [a-z]/) # https://rubular.com/r/0YzfDAbwJrDHix
|
42
|
+
add_offense(comment, location: comment.loc.expression, message: MSG, severity: :refactor)
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
@@ -60,29 +60,42 @@ module RuboCop
|
|
60
60
|
def autocorrect(node)
|
61
61
|
lambda do |corrector|
|
62
62
|
platform_case?(node) do |node_, type|
|
63
|
-
|
63
|
+
# we have at least one supermarket cookbook with an entirely empty platform case statement
|
64
|
+
# we can't actually fix that so let's do nothing here.
|
65
|
+
unless empty_case_statement?(node)
|
66
|
+
condition_string = node.when_branches.first.conditions.map(&:source).join(', ')
|
64
67
|
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
68
|
+
# single line bodies without an else statement should be transformed into `X if platform?('ubuntu')` style statements
|
69
|
+
# while multiline statements should just have the case and when bits replace with `if platform?('ubuntu')`
|
70
|
+
if !node.else? && !node.when_branches.first.body.multiline?
|
71
|
+
new_source = "#{node.when_branches.first.body.source} if #{type.value}?(#{condition_string})"
|
72
|
+
corrector.replace(node.loc.expression, new_source)
|
73
|
+
else
|
74
|
+
# find the range from the beginning of the case to the end of the node['platform'] or node['platform_family']
|
75
|
+
case_range = node.loc.keyword.join(node_.loc.expression.end)
|
73
76
|
|
74
|
-
|
75
|
-
|
77
|
+
# replace the complete conditional range with a new if statement
|
78
|
+
corrector.replace(case_range, "if #{type.value}?(#{condition_string})")
|
76
79
|
|
77
|
-
|
78
|
-
|
80
|
+
# find the range from the start of the when to the end of the last argument
|
81
|
+
conditional_range = node.when_branches.first.conditions[-1].source_range.join(node.when_branches.first.loc.keyword.begin)
|
79
82
|
|
80
|
-
|
81
|
-
|
83
|
+
# remove the when XYZ condition along with any leading spaces so that we remove the whole empty line
|
84
|
+
corrector.remove(range_with_surrounding_space(range: conditional_range, side: :left))
|
85
|
+
end
|
82
86
|
end
|
83
87
|
end
|
84
88
|
end
|
85
89
|
end
|
90
|
+
|
91
|
+
private
|
92
|
+
|
93
|
+
# determine if each branch of the case statement contains no code
|
94
|
+
#
|
95
|
+
# @private
|
96
|
+
def empty_case_statement?(node)
|
97
|
+
node.else_branch.nil? && node.when_branches.all? { |x| x.body.nil? }
|
98
|
+
end
|
86
99
|
end
|
87
100
|
end
|
88
101
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: cookstyle
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 5.
|
4
|
+
version: 5.20.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Thom May
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2020-01-
|
12
|
+
date: 2020-01-23 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rubocop
|
@@ -81,6 +81,7 @@ files:
|
|
81
81
|
- lib/rubocop/cop/chef/deprecation/depends_compat_resource.rb
|
82
82
|
- lib/rubocop/cop/chef/deprecation/depends_partial_search.rb
|
83
83
|
- lib/rubocop/cop/chef/deprecation/depends_poise.rb
|
84
|
+
- lib/rubocop/cop/chef/deprecation/deprecated_chefspec_platform.rb
|
84
85
|
- lib/rubocop/cop/chef/deprecation/deprecated_mixins.rb
|
85
86
|
- lib/rubocop/cop/chef/deprecation/deprecated_platform_methods.rb
|
86
87
|
- lib/rubocop/cop/chef/deprecation/deprecated_yum_repository_properties.rb
|
@@ -196,6 +197,7 @@ files:
|
|
196
197
|
- lib/rubocop/cop/chef/sharing/insecure_cookbook_url.rb
|
197
198
|
- lib/rubocop/cop/chef/sharing/invalid_license_string.rb
|
198
199
|
- lib/rubocop/cop/chef/style/attribute_keys.rb
|
200
|
+
- lib/rubocop/cop/chef/style/chef_whaaat.rb
|
199
201
|
- lib/rubocop/cop/chef/style/comment_sentence_spacing.rb
|
200
202
|
- lib/rubocop/cop/chef/style/comments_copyright_format.rb
|
201
203
|
- lib/rubocop/cop/chef/style/comments_default_copyright.rb
|