cookstyle 7.28.2 → 7.30.1

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: 205f14a7f600dc2fe712e9407e16165b72cadab5624913efba78a6f0748f65ae
4
- data.tar.gz: c03813392f90967e5036e49a8886d6c1b7e31ea7319da75c12008d3a01c635f8
3
+ metadata.gz: af05586e951fed9a9a11777583d2f8b0ec7634cca38b3b5b9641e2afb11be50b
4
+ data.tar.gz: 8d727e0f4898bf20149fa74ee6d15782840577c98eeb9fe25048ae71ab13c4b1
5
5
  SHA512:
6
- metadata.gz: 6f7f8c8c719dbb83b740882be2f247250c95fb7f330a82a0cf8d7b5b96fa7071ca7b55761a8a599ac4801f2c75eb403f64c04bde4245f31fc12b8f753418d3f5
7
- data.tar.gz: 8a32adeedb7654948337162eeb9a8c660f66ab13655ec537aa584b15a156f726130f16630dddb2f1fa0169d10e5dd4a84b7353392591431490f12129ed0245c4
6
+ metadata.gz: dbd9a0129be207bd120c0ba860260726c4547b8e0356eda5c221b70d29aaf9ec92fdce5af7450b919f8a74774b79820c128220749e883c226de4c82f45c21915
7
+ data.tar.gz: 74e57634c9aef93e952858a542cac3966c849fa3e1deb2dd5b0ef4b7cd9f8167eba767e55635b72c2cbc7f3d08228a3fed26ed4f2e072e4eb6d8c78a09c3b151
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
  module Cookstyle
3
- VERSION = "7.28.2" # rubocop: disable Style/StringLiterals
3
+ VERSION = "7.30.1" # rubocop: disable Style/StringLiterals
4
4
  RUBOCOP_VERSION = '1.24.1'
5
5
  end
@@ -111,6 +111,8 @@ module RuboCop
111
111
  case node.type
112
112
  when :send
113
113
  yield(node) if node.receiver.nil? # if it's not nil then we're not in a property foo we're in bar.foo
114
+ when :block # ie: not_if { ruby_foo }
115
+ yield(node)
114
116
  when :while
115
117
  extract_send_types(node.body) { |t| yield(t) }
116
118
  when :if
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
  #
3
- # Copyright:: 2019, Chef Software, Inc.
3
+ # Copyright:: 2019-2022, Chef Software, Inc.
4
4
  # Author:: Tim Smith (<tsmith@chef.io>)
5
5
  #
6
6
  # Licensed under the Apache License, Version 2.0 (the "License");
@@ -26,6 +26,7 @@ module RuboCop
26
26
  # #### incorrect
27
27
  # depends 'poise'
28
28
  # depends 'poise-service'
29
+ # depends 'poise-hoist'
29
30
  #
30
31
  class CookbookDependsOnPoise < Base
31
32
  MSG = 'Cookbooks should not depend on the deprecated Poise framework'
@@ -37,7 +38,7 @@ module RuboCop
37
38
 
38
39
  def on_send(node)
39
40
  depends_method?(node) do |arg|
40
- add_offense(node, message: MSG, severity: :warning) if %w(poise poise-service).include?(arg.value)
41
+ add_offense(node, message: MSG, severity: :warning) if %w(poise poise-service poise-hoist).include?(arg.value)
41
42
  end
42
43
  end
43
44
  end
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
  #
3
- # Copyright:: 2020, Chef Software, Inc.
3
+ # Copyright:: 2020-2022, Chef Software, Inc.
4
4
  # Author:: Tim Smith (<tsmith@chef.io>)
5
5
  #
6
6
  # Licensed under the Apache License, Version 2.0 (the "License");
@@ -19,7 +19,7 @@ module RuboCop
19
19
  module Cop
20
20
  module Chef
21
21
  module RedundantCode
22
- # Use the :create_if_missing action instead of not_if with a ::File.exist(FOO) check.
22
+ # Use the `:create_if_missing` action instead of `not_if` with a `::File.exist(FOO)` check.
23
23
  #
24
24
  # @example
25
25
  #
@@ -32,6 +32,15 @@ module RuboCop
32
32
  # not_if { ::File.exists?('/logs/foo/error.log') }
33
33
  # end
34
34
  #
35
+ # remote_file 'Download file' do
36
+ # path '/foo/bar'
37
+ # source 'https://foo.com/bar'
38
+ # owner 'root'
39
+ # group 'root'
40
+ # mode '0644'
41
+ # not_if { ::File.exist?('/foo/bar') }
42
+ # end
43
+ #
35
44
  # #### correct
36
45
  # cookbook_file '/logs/foo/error.log' do
37
46
  # source 'error.log'
@@ -41,30 +50,61 @@ module RuboCop
41
50
  # action :create_if_missing
42
51
  # end
43
52
  #
53
+ # remote_file 'Download file' do
54
+ # path '/foo/bar'
55
+ # source 'https://foo.com/bar'
56
+ # owner 'root'
57
+ # group 'root'
58
+ # mode '0644'
59
+ # action :create_if_missing
60
+ # end
61
+ #
44
62
  class UseCreateIfMissing < Base
45
63
  include RuboCop::Chef::CookbookHelpers
46
64
  extend AutoCorrector
65
+ include RangeHelp
47
66
 
48
67
  MSG = 'Use the :create_if_missing action instead of not_if with a ::File.exist(FOO) check.'
68
+ RESOURCES = %i(cookbook_file file remote_directory cron_d remote_file template).freeze
49
69
 
50
- def_node_matcher :not_if_file_exist?, <<-PATTERN
51
- (block (send nil? :not_if) (args) (send (const {nil? (cbase)} :File) {:exist? :exists?} $(str ...)))
70
+ def_node_matcher :file_exist_value, <<-PATTERN
71
+ (send (const {nil? (cbase)} :File) {:exist? :exists?} $(...))
52
72
  PATTERN
53
73
 
54
- def_node_matcher :file_like_resource?, <<-PATTERN
55
- (block (send nil? {:cookbook_file :file :remote_directory :cron_d :remote_file :template} $str) ... )
56
- PATTERN
74
+ def_node_search :has_action?, '(send nil? :action ...)'
57
75
 
58
- def_node_search :create_action?, '(send nil? :action $sym)'
76
+ def_node_search :create_action, '(send nil? :action $sym)'
77
+
78
+ def_node_search :path_property_node, '(send nil? :path $...)'
59
79
 
60
80
  def on_block(node)
61
- not_if_file_exist?(node) do |props|
62
- file_like_resource?(node.parent.parent) do |resource_blk_name|
63
- # the not_if file name is the same as the resource name and there's no action defined (it's the default)
64
- return unless props == resource_blk_name && create_action?(node.parent.parent).nil?
81
+ match_property_in_resource?(RESOURCES, :not_if, node) do |prop|
82
+ # if it's not a block type then it's not a ruby block with a file.exist
83
+ return unless prop.block_type?
84
+
85
+ file_exist_value(prop.body) do |exists_content| # check the contents of the ruby block that's passed
86
+ # not an offense if:
87
+ # - The resource block name (the last arg of the send) doesn't match the exists check content
88
+ # - If a path property is used it doesn't match the exists check content
89
+ return unless exists_content == node.send_node.last_argument ||
90
+ exists_content == path_property_node(node)&.first&.first
91
+
92
+ # we have an action so check if it is :create. If that's the case we can replace that value
93
+ # and delete the not_if line. Otherwise it's an action like :remove and while the whole resource
94
+ # no longer makes sense that's not our problem here.
95
+ create_action(node) do |create_action|
96
+ return unless create_action == s(:sym, :create)
97
+ add_offense(prop, message: MSG, severity: :refactor) do |corrector|
98
+ corrector.replace(create_action, ':create_if_missing')
99
+ corrector.remove(range_by_whole_lines(prop.source_range, include_final_newline: true))
100
+ end
101
+ return
102
+ end
65
103
 
66
- add_offense(node, message: MSG, severity: :refactor) do |corrector|
67
- corrector.replace(node, 'action :create_if_missing')
104
+ # if we got this far we didn't return above when we had an action
105
+ # so we can just replace the not_if line with a new :create_if_missing action
106
+ add_offense(prop, message: MSG, severity: :refactor) do |corrector|
107
+ corrector.replace(prop, 'action :create_if_missing')
68
108
  end
69
109
  end
70
110
  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: 7.28.2
4
+ version: 7.30.1
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: 2022-01-14 00:00:00.000000000 Z
12
+ date: 2022-01-17 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rubocop