cookstyle 5.19.9 → 5.20.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 0f5cc0916309f625be3469422c3feb76f7e1340fca4ae99cc5110b0b80f857f6
4
- data.tar.gz: 1c813c90c2bef8b8c869c4d9a826be958507a31db227c4b67ff1025192ab624c
3
+ metadata.gz: 5c8af7267fe94ef01b9da1d3b84c221101cdb7e8976217cbca2bd8f43c475858
4
+ data.tar.gz: 3f6196cac78246fc8b36a013f4bbb335470824f3ef23974869596087c8082925
5
5
  SHA512:
6
- metadata.gz: 0e8ae2b07a6b712889fa67ececde059ae3063fa89627fe6937668ed101a9874bfc98d2faaf5ac36cf99063fb14c9835595052213ffc299d5bc0b5aac28502153
7
- data.tar.gz: 61747c1c26cf1708cfd82ca7945850c8fb2022a18d16c33145ed805741c313ee6bb0c0fc849ba90dad4a0a65ae53e10ea9d4b0291f5b14faaafc43ea18d7a8b0
6
+ metadata.gz: ef274262f9b3e41204d9ee5153c9c4022958659b69a6a4d781848a523d6bb37336101fafe5c30ece1d072118b13422803bfa629ba97605c75bd9588c8ef21e36
7
+ data.tar.gz: 6fbff49a1400321bee3bec46011d0b3193d8460a702c9749a84e11c9992c5642e75b2e3857ab1c84461c23a31b0e5b4c4dcd186e9ea4a0cc588974fd3e28d4b7
@@ -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
  ###############################
@@ -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
 
@@ -1,4 +1,4 @@
1
1
  module Cookstyle
2
- VERSION = "5.19.9".freeze # rubocop: disable Style/StringLiterals
2
+ VERSION = "5.20.0".freeze # rubocop: disable Style/StringLiterals
3
3
  RUBOCOP_VERSION = '0.75.1'.freeze
4
4
  end
@@ -46,7 +46,9 @@ module RuboCop
46
46
 
47
47
  def autocorrect(node)
48
48
  lambda do |corrector|
49
- corrector.replace(node.loc.expression, "type #{node.arguments.first.source}")
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
- # owner 'root'
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?(/^sysctl -p/i)
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
- # libarchive "C:\file.zip" do
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
- condition_string = node.when_branches.first.conditions.map(&:source).join(', ')
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
- # single line bodies without an else statement should be transformed into `X if platform?('ubuntu')` style statements
66
- # while multiline statements should just have the case and when bits replace with `if platform?('ubuntu')`
67
- if !node.else? && !node.when_branches.first.body.multiline?
68
- new_source = "#{node.when_branches.first.body.source} if #{type.value}?(#{condition_string})"
69
- corrector.replace(node.loc.expression, new_source)
70
- else
71
- # find the range from the beginning of the case to the end of the node['platform'] or node['platform_family']
72
- case_range = node.loc.keyword.join(node_.loc.expression.end)
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
- # replace the complete conditional range with a new if statement
75
- corrector.replace(case_range, "if #{type.value}?(#{condition_string})")
77
+ # replace the complete conditional range with a new if statement
78
+ corrector.replace(case_range, "if #{type.value}?(#{condition_string})")
76
79
 
77
- # find the range from the start of the when to the end of the last argument
78
- conditional_range = node.when_branches.first.conditions[-1].source_range.join(node.when_branches.first.loc.keyword.begin)
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
- # remove the when XYZ condition along with any leading spaces so that we remove the whole empty line
81
- corrector.remove(range_with_surrounding_space(range: conditional_range, side: :left))
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.19.9
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-07 00:00:00.000000000 Z
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