cookstyle 8.7.6 → 9.0.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.
Files changed (87) hide show
  1. checksums.yaml +4 -4
  2. data/config/chefstyle.yml +2 -0
  3. data/config/cookstyle.yml +145 -6
  4. data/lib/cookstyle/version.rb +2 -2
  5. data/lib/rubocop/chef/cookbook_helpers.rb +23 -0
  6. data/lib/rubocop/chef.rb +1 -1
  7. data/lib/rubocop/cop/chef/correctness/chef_application_fatal.rb +16 -4
  8. data/lib/rubocop/cop/chef/correctness/conditional_unified_mode_true.rb +91 -0
  9. data/lib/rubocop/cop/chef/correctness/empty_resource_guard.rb +18 -2
  10. data/lib/rubocop/cop/chef/correctness/execute_delete_file.rb +127 -0
  11. data/lib/rubocop/cop/chef/correctness/invalid_checksum.rb +79 -0
  12. data/lib/rubocop/cop/chef/correctness/invalid_platform_family_helper.rb +1 -1
  13. data/lib/rubocop/cop/chef/correctness/invalid_platform_family_values_in_case.rb +10 -0
  14. data/lib/rubocop/cop/chef/correctness/invalid_platform_values_in_case.rb +10 -0
  15. data/lib/rubocop/cop/chef/correctness/invalid_value_for_platform_helper.rb +1 -0
  16. data/lib/rubocop/cop/chef/correctness/openssl_password_helpers.rb +1 -1
  17. data/lib/rubocop/cop/chef/correctness/platform_version_string_comparison.rb +66 -0
  18. data/lib/rubocop/cop/chef/correctness/powershell_delete_file.rb +5 -5
  19. data/lib/rubocop/cop/chef/correctness/powershell_file_exists.rb +1 -1
  20. data/lib/rubocop/cop/chef/correctness/resource_with_none_action.rb +3 -3
  21. data/lib/rubocop/cop/chef/correctness/ruby_guard_without_block.rb +91 -0
  22. data/lib/rubocop/cop/chef/correctness/service_resource.rb +71 -20
  23. data/lib/rubocop/cop/chef/deprecation/chef_handler_recipe.rb +8 -1
  24. data/lib/rubocop/cop/chef/deprecation/chef_rest.rb +4 -1
  25. data/lib/rubocop/cop/chef/deprecation/chef_shellout.rb +2 -2
  26. data/lib/rubocop/cop/chef/deprecation/chef_sugar_helpers.rb +6 -0
  27. data/lib/rubocop/cop/chef/deprecation/chef_windows_platform_helper.rb +1 -1
  28. data/lib/rubocop/cop/chef/deprecation/chocolatey_package_uninstall_action.rb +3 -3
  29. data/lib/rubocop/cop/chef/deprecation/depends_partial_search.rb +4 -0
  30. data/lib/rubocop/cop/chef/deprecation/deprecated_mixins.rb +2 -2
  31. data/lib/rubocop/cop/chef/deprecation/hwrp_without_provides.rb +4 -4
  32. data/lib/rubocop/cop/chef/deprecation/hwrp_without_unified_mode_true.rb +2 -2
  33. data/lib/rubocop/cop/chef/deprecation/inherits_compat_resource.rb +3 -3
  34. data/lib/rubocop/cop/chef/deprecation/legacy_yum_cookbook_recipes.rb +9 -1
  35. data/lib/rubocop/cop/chef/deprecation/locale_lc_all_property.rb +5 -0
  36. data/lib/rubocop/cop/chef/deprecation/resource_uses_only_resource_name.rb +9 -1
  37. data/lib/rubocop/cop/chef/deprecation/resource_uses_provider_base_method.rb +4 -0
  38. data/lib/rubocop/cop/chef/deprecation/ruby_block_create_action.rb +42 -3
  39. data/lib/rubocop/cop/chef/deprecation/use_automatic_resource_name.rb +9 -0
  40. data/lib/rubocop/cop/chef/deprecation/use_yaml_dump.rb +5 -0
  41. data/lib/rubocop/cop/chef/deprecation/xml_ruby_recipe.rb +5 -1
  42. data/lib/rubocop/cop/chef/modernize/apt_default_recipe.rb +1 -1
  43. data/lib/rubocop/cop/chef/modernize/build_essential.rb +4 -1
  44. data/lib/rubocop/cop/chef/modernize/chef_14_resources.rb +8 -0
  45. data/lib/rubocop/cop/chef/modernize/chef_15_resources.rb +11 -0
  46. data/lib/rubocop/cop/chef/modernize/chef_gem_nokogiri.rb +4 -0
  47. data/lib/rubocop/cop/chef/modernize/conditional_using_test.rb +10 -3
  48. data/lib/rubocop/cop/chef/modernize/cron_d_file_or_template.rb +6 -4
  49. data/lib/rubocop/cop/chef/modernize/databag_helpers.rb +6 -3
  50. data/lib/rubocop/cop/chef/modernize/depends_chef_vault_cookbook.rb +4 -0
  51. data/lib/rubocop/cop/chef/modernize/depends_chocolatey_cookbooks.rb +7 -0
  52. data/lib/rubocop/cop/chef/modernize/depends_kernel_module_cookbook.rb +6 -0
  53. data/lib/rubocop/cop/chef/modernize/depends_locale_cookbook.rb +6 -0
  54. data/lib/rubocop/cop/chef/modernize/depends_openssl_cookbook.rb +9 -0
  55. data/lib/rubocop/cop/chef/modernize/depends_timezone_lwrp_cookbook.rb +4 -0
  56. data/lib/rubocop/cop/chef/modernize/depends_windows_firewall_cookbook.rb +8 -0
  57. data/lib/rubocop/cop/chef/modernize/depends_zypper_cookbook.rb +7 -0
  58. data/lib/rubocop/cop/chef/modernize/dsl_include_in_resource.rb +1 -1
  59. data/lib/rubocop/cop/chef/modernize/execute_apt_update.rb +3 -1
  60. data/lib/rubocop/cop/chef/modernize/execute_archive_extract.rb +121 -0
  61. data/lib/rubocop/cop/chef/modernize/execute_update_alternatives.rb +100 -0
  62. data/lib/rubocop/cop/chef/modernize/includes_mixin_shellout.rb +4 -0
  63. data/lib/rubocop/cop/chef/modernize/libarchive_file.rb +5 -3
  64. data/lib/rubocop/cop/chef/modernize/ohai_default_recipe.rb +6 -1
  65. data/lib/rubocop/cop/chef/modernize/powershell_download_file.rb +64 -0
  66. data/lib/rubocop/cop/chef/modernize/powershell_expand_archive.rb +8 -1
  67. data/lib/rubocop/cop/chef/modernize/powershell_guard_interpreter.rb +4 -4
  68. data/lib/rubocop/cop/chef/modernize/sc_windows_resource.rb +2 -2
  69. data/lib/rubocop/cop/chef/modernize/seven_zip_archive.rb +7 -1
  70. data/lib/rubocop/cop/chef/modernize/shellouts_to_chocolatey.rb +15 -4
  71. data/lib/rubocop/cop/chef/modernize/use_require_relative.rb +1 -1
  72. data/lib/rubocop/cop/chef/modernize/windows_default_recipe.rb +1 -1
  73. data/lib/rubocop/cop/chef/modernize/windows_zipfile.rb +8 -2
  74. data/lib/rubocop/cop/chef/modernize/zipfile_resource.rb +7 -1
  75. data/lib/rubocop/cop/chef/modernize/zypper_repo.rb +2 -2
  76. data/lib/rubocop/cop/chef/redundant/custom_resource_with_allowed_actions.rb +10 -0
  77. data/lib/rubocop/cop/chef/redundant/double_compile_time.rb +22 -8
  78. data/lib/rubocop/cop/chef/redundant/service_guard_on_stop_disable.rb +117 -0
  79. data/lib/rubocop/cop/chef/redundant/string_property_with_nil_default.rb +2 -2
  80. data/lib/rubocop/cop/chef/redundant/unnecessary_name_property.rb +1 -1
  81. data/lib/rubocop/cop/chef/security/insecure_remote_file_source.rb +82 -0
  82. data/lib/rubocop/cop/chef/security/ssh_private_key.rb +9 -0
  83. data/lib/rubocop/cop/chef/sharing/empty_property_description.rb +62 -0
  84. data/lib/rubocop/cop/chef/style/include_recipe_with_parentheses.rb +5 -2
  85. data/lib/rubocop/cop/chef/style/true_false_resource_properties.rb +1 -1
  86. data/lib/rubocop/monkey_patches/directive_comment.rb +21 -3
  87. metadata +15 -4
@@ -0,0 +1,117 @@
1
+ # frozen_string_literal: true
2
+ #
3
+ # Copyright:: Copyright (c) 2016-2025 Progress Software Corporation and/or its subsidiaries or affiliates. All Rights Reserved.
4
+ # Author:: Tim Smith (<tsmith84@gmail.com>)
5
+ #
6
+ # Licensed under the Apache License, Version 2.0 (the "License");
7
+ # you may not use this file except in compliance with the License.
8
+ # You may obtain a copy of the License at
9
+ #
10
+ # http://www.apache.org/licenses/LICENSE-2.0
11
+ #
12
+ # Unless required by applicable law or agreed to in writing, software
13
+ # distributed under the License is distributed on an "AS IS" BASIS,
14
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15
+ # See the License for the specific language governing permissions and
16
+ # limitations under the License.
17
+ #
18
+ module RuboCop
19
+ module Cop
20
+ module Chef
21
+ module RedundantCode
22
+ # The `:stop` and `:disable` actions of the `service` resource are already no-ops when the service
23
+ # isn't installed, so guarding them with a check for the init script or unit file adds nothing. The
24
+ # base provider only converges these actions when `current_resource.running`/`current_resource.enabled`
25
+ # is set, and the platform providers never set that state for a service they can't find.
26
+ #
27
+ # The guard is also actively harmful because it hardcodes a single path while the provider searches
28
+ # several. A guard on `/usr/local/etc/rc.d/snmpd` skips a FreeBSD host running the service out of
29
+ # `/etc/rc.d`, and the run then reports success while leaving the service enabled.
30
+ #
31
+ # This cop only fires when every action is `:stop` or `:disable`. Actions like `:start`, `:enable`,
32
+ # `:restart`, and `:reload` are asserted against the init script, so a guard there is meaningful. The
33
+ # `systemd_unit` resource shells out unconditionally, so its guards are meaningful as well and are
34
+ # never flagged.
35
+ #
36
+ # @example
37
+ #
38
+ # # bad
39
+ # service 'snmpd' do
40
+ # action %i(stop disable)
41
+ # only_if { ::File.exist?('/usr/local/etc/rc.d/snmpd') }
42
+ # end
43
+ #
44
+ # # good
45
+ # service 'snmpd' do
46
+ # action %i(stop disable)
47
+ # end
48
+ #
49
+ class ServiceGuardOnStopDisable < Base
50
+ include RuboCop::Chef::CookbookHelpers
51
+ include RangeHelp
52
+ extend AutoCorrector
53
+
54
+ MSG = 'A service resource that only stops or disables a service does not need a guard checking for the init script or unit file. Chef Infra Client already skips these actions when the service does not exist, and hardcoding a single path can silently skip services installed elsewhere.'
55
+
56
+ # actions that Chef Infra Client treats as no-ops when the service can't be found
57
+ NO_OP_ACTIONS = %i(stop disable).freeze
58
+
59
+ # the directories the various service providers search for init scripts and unit files
60
+ INIT_SCRIPT_PATH = %r{/(?:etc/init\.d|etc/rc\.d|usr/local/etc/rc\.d|etc/sv|systemd/system)/}.freeze
61
+
62
+ def_node_matcher :file_exist_check, <<~PATTERN
63
+ (send (const {nil? cbase} :File) {:exist? :exists? :executable? :file? :readable?} $_)
64
+ PATTERN
65
+
66
+ def_node_search :action_nodes, '(send nil? :action $...)'
67
+
68
+ def on_block(node)
69
+ match_property_in_resource?(:service, %i(only_if not_if), node) do |guard|
70
+ # a string guard like `only_if 'test -f /etc/init.d/foo'` isn't a Ruby block
71
+ next unless guard.block_type?
72
+ next unless only_no_op_actions?(node)
73
+
74
+ # `guard.body` is only a bare send when the block does nothing but the existence check.
75
+ # Anything more (a `&&`, a second statement) is a guard we shouldn't touch.
76
+ path = file_exist_check(guard.body)
77
+ next unless path && INIT_SCRIPT_PATH.match?(path.source)
78
+
79
+ add_offense(guard, severity: :refactor) do |corrector|
80
+ corrector.remove(range_by_whole_lines(guard.source_range, include_final_newline: true))
81
+ end
82
+ end
83
+ end
84
+
85
+ private
86
+
87
+ # @param [RuboCop::AST::BlockNode] node the resource block
88
+ #
89
+ # @return [Boolean] the resource declares at least one action and all of them are no-ops
90
+ # for a service that isn't installed
91
+ def only_no_op_actions?(node)
92
+ actions = action_nodes(node).flat_map { |args| args.flat_map { |arg| action_symbols(arg) } }
93
+ !actions.empty? && actions.all? { |action| NO_OP_ACTIONS.include?(action) }
94
+ end
95
+
96
+ # Unwrap the ways an action can be written: `action :stop`, `action %i(stop disable)`,
97
+ # and `action [:stop, :disable]`. Anything else (a variable, a node attribute) yields nil,
98
+ # which fails the NO_OP_ACTIONS check and leaves the resource alone.
99
+ #
100
+ # @param [RuboCop::AST::Node] node
101
+ #
102
+ # @return [Array<Symbol, nil>]
103
+ def action_symbols(node)
104
+ case node.type
105
+ when :sym
106
+ [node.value]
107
+ when :array
108
+ node.values.flat_map { |value| action_symbols(value) }
109
+ else
110
+ [nil]
111
+ end
112
+ end
113
+ end
114
+ end
115
+ end
116
+ end
117
+ end
@@ -40,13 +40,13 @@ module RuboCop
40
40
 
41
41
  def_node_matcher :string_property_with_nil_default?, <<-PATTERN
42
42
  (send nil? :property (sym _)
43
- {(const nil? :String) #string_and_nil_like?}
43
+ {(const {nil? cbase} :String) #string_and_nil_like?}
44
44
  (hash <$(pair (sym :default) (nil)) ...>))
45
45
  PATTERN
46
46
 
47
47
  # An array of types that includes String & either NilClass or nil
48
48
  def_node_matcher :string_and_nil_like?, <<-PATTERN
49
- (array <(const nil? :String) {(const nil? :NilClass) (nil)}>)
49
+ (array <(const {nil? cbase} :String) {(const {nil? cbase} :NilClass) (nil)}>)
50
50
  PATTERN
51
51
 
52
52
  def on_send(node)
@@ -39,7 +39,7 @@ module RuboCop
39
39
  def_node_matcher :name_property?, <<-PATTERN
40
40
  (send nil? {:attribute :property}
41
41
  (sym :name)
42
- (const nil? :String)?
42
+ (const {nil? cbase} :String)?
43
43
  (hash $...)?
44
44
  )
45
45
  PATTERN
@@ -0,0 +1,82 @@
1
+ # frozen_string_literal: true
2
+ #
3
+ # Copyright:: Copyright (c) 2016-2025 Progress Software Corporation and/or its subsidiaries or affiliates. All Rights Reserved.
4
+ # Author:: Tim Smith (<tsmith84@gmail.com>)
5
+ #
6
+ # Licensed under the Apache License, Version 2.0 (the "License");
7
+ # you may not use this file except in compliance with the License.
8
+ # You may obtain a copy of the License at
9
+ #
10
+ # http://www.apache.org/licenses/LICENSE-2.0
11
+ #
12
+ # Unless required by applicable law or agreed to in writing, software
13
+ # distributed under the License is distributed on an "AS IS" BASIS,
14
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15
+ # See the License for the specific language governing permissions and
16
+ # limitations under the License.
17
+ #
18
+ module RuboCop
19
+ module Cop
20
+ module Chef
21
+ module Security
22
+ # Files downloaded over plain HTTP or FTP can be modified in transit, and the resource will
23
+ # use whatever it receives. Fetch them over HTTPS so the transport is authenticated.
24
+ #
25
+ # Where an HTTPS endpoint genuinely isn't available, a `checksum` on the resource at least
26
+ # detects tampering, since the digest is compared before the file is used.
27
+ #
28
+ # @example
29
+ #
30
+ # # bad
31
+ # remote_file '/tmp/foo.tar.gz' do
32
+ # source 'http://example.com/foo.tar.gz'
33
+ # end
34
+ #
35
+ # # good
36
+ # remote_file '/tmp/foo.tar.gz' do
37
+ # source 'https://example.com/foo.tar.gz'
38
+ # end
39
+ #
40
+ class InsecureRemoteFileSource < Base
41
+ include RuboCop::Chef::CookbookHelpers
42
+
43
+ MSG = 'Fetch remote files over HTTPS. A file downloaded over plain HTTP or FTP can be modified in transit and the resource will use whatever it receives.'
44
+
45
+ # the resources that download a file from the source property
46
+ RESOURCES = %i(remote_file windows_package msu_package dmg_package cab_package).freeze
47
+
48
+ # transports with no authentication of the server or the payload
49
+ INSECURE_SCHEME = %r{\A(?:http|ftp)://}i.freeze
50
+
51
+ def on_block(node)
52
+ match_property_in_resource?(RESOURCES, 'source', node) do |source|
53
+ source.arguments.each do |argument|
54
+ # remote_file also accepts an array of mirrors, any one of which may be insecure
55
+ urls = argument.array_type? ? argument.values : [argument]
56
+ urls.each { |url| add_offense(url, severity: :warning) if insecure_url?(url) }
57
+ end
58
+ end
59
+ end
60
+
61
+ private
62
+
63
+ # A dstr's leading literal is enough to read the scheme off an interpolated URL. Anything
64
+ # that isn't a literal string, such as a node attribute, tells us nothing and is left alone.
65
+ #
66
+ # @param [RuboCop::AST::Node] node
67
+ #
68
+ # @return [Boolean]
69
+ def insecure_url?(node)
70
+ literal = if node.str_type?
71
+ node.value
72
+ elsif node.dstr_type? && node.children.first&.str_type?
73
+ node.children.first.value
74
+ end
75
+
76
+ literal ? INSECURE_SCHEME.match?(literal) : false
77
+ end
78
+ end
79
+ end
80
+ end
81
+ end
82
+ end
@@ -29,6 +29,15 @@ module RuboCop
29
29
  # mode '600'
30
30
  # end
31
31
  #
32
+ # # good
33
+ # # fetch the key from a secrets management system instead
34
+ # file '/home/bob/.ssh/id_rsa' do
35
+ # content chef_vault_item('ssh_keys', 'bob')['private_key']
36
+ # mode '600'
37
+ # owner 'bob'
38
+ # sensitive true
39
+ # end
40
+ #
32
41
  class SshPrivateKey < Base
33
42
  MSG = 'Do not include plain text SSH private keys in your cookbook code. This sensitive data should be fetched from secrets management systems so that secrets are not uploaded in plain text to the Chef Infra Server or committed to source control systems.'
34
43
 
@@ -0,0 +1,62 @@
1
+ # frozen_string_literal: true
2
+ #
3
+ # Copyright:: Copyright (c) 2016-2025 Progress Software Corporation and/or its subsidiaries or affiliates. All Rights Reserved.
4
+ # Author:: Tim Smith (<tsmith84@gmail.com>)
5
+ #
6
+ # Licensed under the Apache License, Version 2.0 (the "License");
7
+ # you may not use this file except in compliance with the License.
8
+ # You may obtain a copy of the License at
9
+ #
10
+ # http://www.apache.org/licenses/LICENSE-2.0
11
+ #
12
+ # Unless required by applicable law or agreed to in writing, software
13
+ # distributed under the License is distributed on an "AS IS" BASIS,
14
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15
+ # See the License for the specific language governing permissions and
16
+ # limitations under the License.
17
+ #
18
+ module RuboCop
19
+ module Cop
20
+ module Chef
21
+ module Sharing
22
+ # Resource properties should not set an empty `description`. Automated documentation tools have
23
+ # nothing to render from it, so it does no more than a missing field would while looking like the
24
+ # property has been documented.
25
+ #
26
+ # @example
27
+ #
28
+ # # bad
29
+ # property :site_name, String,
30
+ # name_property: true,
31
+ # description: ''
32
+ #
33
+ # # good
34
+ # property :site_name, String,
35
+ # name_property: true,
36
+ # description: 'The name of the site'
37
+ #
38
+ class EmptyPropertyDescription < Base
39
+ MSG = 'Resource properties should not set an empty `description`. Either describe the property or leave the field off entirely.'
40
+ RESTRICT_ON_SEND = [:property].freeze
41
+
42
+ # any method named property being called with a symbol argument and an options hash.
43
+ # capturing the hash rather than searching the whole send keeps us off `description`
44
+ # keys nested inside another option's value, such as `default: { description: '' }`
45
+ def_node_matcher :property_options, '(send nil? :property (sym _) ... $hash)'
46
+
47
+ def on_send(node)
48
+ property_options(node) do |options|
49
+ options.pairs.each do |pair|
50
+ next unless pair.key.sym_type? && pair.key.value == :description
51
+ # a description built by interpolation isn't a literal str node, so we can't tell
52
+ # whether it's empty and leave it alone
53
+ next unless pair.value.str_type? && pair.value.value.strip.empty?
54
+ add_offense(pair, severity: :refactor)
55
+ end
56
+ end
57
+ end
58
+ end
59
+ end
60
+ end
61
+ end
62
+ end
@@ -36,7 +36,7 @@ module RuboCop
36
36
  RESTRICT_ON_SEND = [:include_recipe].freeze
37
37
 
38
38
  def_node_matcher :include_recipe?, <<-PATTERN
39
- (send nil? :include_recipe $(str _))
39
+ (send {nil? (send nil? :run_context)} :include_recipe $(str _))
40
40
  PATTERN
41
41
 
42
42
  def on_send(node)
@@ -47,7 +47,10 @@ module RuboCop
47
47
  return if node.parent&.send_type?
48
48
 
49
49
  add_offense(node, severity: :refactor) do |corrector|
50
- corrector.replace(node, "include_recipe #{recipe.source}")
50
+ # keep any receiver, otherwise run_context.include_recipe('foo') would correct to a
51
+ # bare include_recipe and lose the run_context
52
+ receiver = node.receiver ? "#{node.receiver.source}." : ''
53
+ corrector.replace(node, "#{receiver}include_recipe #{recipe.source}")
51
54
  end
52
55
  end
53
56
  end
@@ -36,7 +36,7 @@ module RuboCop
36
36
  RESTRICT_ON_SEND = [:property, :attribute].freeze
37
37
 
38
38
  def_node_matcher :trueclass_falseclass_property?, <<-PATTERN
39
- (send nil? {:property :attribute} (sym _) $(array (const nil? :TrueClass) (const nil? :FalseClass)) ... )
39
+ (send nil? {:property :attribute} (sym _) $(array (const {nil? cbase} :TrueClass) (const {nil? cbase} :FalseClass)) ... )
40
40
  PATTERN
41
41
 
42
42
  def on_send(node)
@@ -1,12 +1,30 @@
1
1
  # frozen_string_literal: true
2
2
  module RuboCop
3
- # we're monkey patching the config regex to allow for "cookstyle: disable whatever"
4
- # in addition to the "rubocop: disable whatever that comes with RuboCop"
3
+ # we're monkey patching the directive marker to allow for "cookstyle: disable whatever"
4
+ # in addition to the "rubocop: disable whatever" that comes with RuboCop.
5
+ #
6
+ # Everything below the marker is rebuilt exactly the way RuboCop builds it, from
7
+ # RuboCop's own constants, so that directive modes added upstream (push, pop,
8
+ # disable-next, todo-next, ...) keep working here without another patch.
5
9
  class DirectiveComment
10
+ remove_const(:DIRECTIVE_MARKER_PATTERN)
11
+ DIRECTIVE_MARKER_PATTERN = '# (?:rubocop|cookstyle) : '
12
+
13
+ remove_const(:DIRECTIVE_MARKER_REGEXP)
14
+ DIRECTIVE_MARKER_REGEXP = Regexp.new(DIRECTIVE_MARKER_PATTERN.gsub(' ', '\s*'))
15
+
16
+ remove_const(:DIRECTIVE_HEADER_PATTERN)
17
+ DIRECTIVE_HEADER_PATTERN = "#{DIRECTIVE_MARKER_PATTERN}((?:#{MODES_PATTERN}))\\b"
18
+
6
19
  remove_const(:DIRECTIVE_COMMENT_REGEXP)
7
20
  DIRECTIVE_COMMENT_REGEXP = Regexp.new(
8
- "# (?:rubocop|cookstyle) : ((?:disable|enable|todo))\\b #{COPS_PATTERN}"
21
+ "#{DIRECTIVE_HEADER_PATTERN}(?:\\s+#{COPS_PATTERN}|\\s+#{PUSH_POP_ARGS_PATTERN})?"
9
22
  .gsub(' ', '\s*')
10
23
  )
24
+
25
+ remove_const(:MALFORMED_DIRECTIVE_WITHOUT_COP_NAME_REGEXP)
26
+ MALFORMED_DIRECTIVE_WITHOUT_COP_NAME_REGEXP = Regexp.new(
27
+ "\\A#{DIRECTIVE_HEADER_PATTERN}\\s*\\z".gsub(' ', '\s*')
28
+ )
11
29
  end
12
30
  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: 8.7.6
4
+ version: 9.0.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: 2026-06-21 00:00:00.000000000 Z
12
+ date: 2026-08-24 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rubocop
@@ -17,14 +17,14 @@ dependencies:
17
17
  requirements:
18
18
  - - '='
19
19
  - !ruby/object:Gem::Version
20
- version: 1.86.1
20
+ version: 1.90.0
21
21
  type: :runtime
22
22
  prerelease: false
23
23
  version_requirements: !ruby/object:Gem::Requirement
24
24
  requirements:
25
25
  - - '='
26
26
  - !ruby/object:Gem::Version
27
- version: 1.86.1
27
+ version: 1.90.0
28
28
  description:
29
29
  email:
30
30
  - thom@chef.io
@@ -53,9 +53,12 @@ files:
53
53
  - lib/rubocop/cop/chef/correctness/block_guard_clause_string_only.rb
54
54
  - lib/rubocop/cop/chef/correctness/chef_application_fatal.rb
55
55
  - lib/rubocop/cop/chef/correctness/conditional_ruby_shellout.rb
56
+ - lib/rubocop/cop/chef/correctness/conditional_unified_mode_true.rb
56
57
  - lib/rubocop/cop/chef/correctness/dnf_package_allow_downgrades.rb
57
58
  - lib/rubocop/cop/chef/correctness/empty_resource_guard.rb
59
+ - lib/rubocop/cop/chef/correctness/execute_delete_file.rb
58
60
  - lib/rubocop/cop/chef/correctness/incorrect_library_injection.rb
61
+ - lib/rubocop/cop/chef/correctness/invalid_checksum.rb
59
62
  - lib/rubocop/cop/chef/correctness/invalid_cookbook_name.rb
60
63
  - lib/rubocop/cop/chef/correctness/invalid_default_action.rb
61
64
  - lib/rubocop/cop/chef/correctness/invalid_notification_resource.rb
@@ -81,12 +84,14 @@ files:
81
84
  - lib/rubocop/cop/chef/correctness/notifies_action_not_symbol.rb
82
85
  - lib/rubocop/cop/chef/correctness/octal_mode_as_string.rb
83
86
  - lib/rubocop/cop/chef/correctness/openssl_password_helpers.rb
87
+ - lib/rubocop/cop/chef/correctness/platform_version_string_comparison.rb
84
88
  - lib/rubocop/cop/chef/correctness/powershell_delete_file.rb
85
89
  - lib/rubocop/cop/chef/correctness/powershell_file_exists.rb
86
90
  - lib/rubocop/cop/chef/correctness/property_without_type.rb
87
91
  - lib/rubocop/cop/chef/correctness/resource_sets_internal_properties.rb
88
92
  - lib/rubocop/cop/chef/correctness/resource_sets_name_property.rb
89
93
  - lib/rubocop/cop/chef/correctness/resource_with_none_action.rb
94
+ - lib/rubocop/cop/chef/correctness/ruby_guard_without_block.rb
90
95
  - lib/rubocop/cop/chef/correctness/scoped_file_exist.rb
91
96
  - lib/rubocop/cop/chef/correctness/service_resource.rb
92
97
  - lib/rubocop/cop/chef/correctness/supports_must_be_float.rb
@@ -208,10 +213,12 @@ files:
208
213
  - lib/rubocop/cop/chef/modernize/dsl_include_in_resource.rb
209
214
  - lib/rubocop/cop/chef/modernize/empty_resource_initialize.rb
210
215
  - lib/rubocop/cop/chef/modernize/execute_apt_update.rb
216
+ - lib/rubocop/cop/chef/modernize/execute_archive_extract.rb
211
217
  - lib/rubocop/cop/chef/modernize/execute_sc_exe.rb
212
218
  - lib/rubocop/cop/chef/modernize/execute_sleep.rb
213
219
  - lib/rubocop/cop/chef/modernize/execute_sysctl.rb
214
220
  - lib/rubocop/cop/chef/modernize/execute_tzutil.rb
221
+ - lib/rubocop/cop/chef/modernize/execute_update_alternatives.rb
215
222
  - lib/rubocop/cop/chef/modernize/foodcritic_comments.rb
216
223
  - lib/rubocop/cop/chef/modernize/if_provides_default_action.rb
217
224
  - lib/rubocop/cop/chef/modernize/includes_mixin_shellout.rb
@@ -224,6 +231,7 @@ files:
224
231
  - lib/rubocop/cop/chef/modernize/openssl_rsa_key_resource.rb
225
232
  - lib/rubocop/cop/chef/modernize/openssl_x509_resource.rb
226
233
  - lib/rubocop/cop/chef/modernize/osx_config_profile_resource.rb
234
+ - lib/rubocop/cop/chef/modernize/powershell_download_file.rb
227
235
  - lib/rubocop/cop/chef/modernize/powershell_expand_archive.rb
228
236
  - lib/rubocop/cop/chef/modernize/powershell_guard_interpreter.rb
229
237
  - lib/rubocop/cop/chef/modernize/powershell_install_package.rb
@@ -273,14 +281,17 @@ files:
273
281
  - lib/rubocop/cop/chef/redundant/replaces_metadata.rb
274
282
  - lib/rubocop/cop/chef/redundant/resource_with_nothing_action.rb
275
283
  - lib/rubocop/cop/chef/redundant/sensitive_property_in_resource.rb
284
+ - lib/rubocop/cop/chef/redundant/service_guard_on_stop_disable.rb
276
285
  - lib/rubocop/cop/chef/redundant/string_property_with_nil_default.rb
277
286
  - lib/rubocop/cop/chef/redundant/suggests_metadata.rb
278
287
  - lib/rubocop/cop/chef/redundant/unnecessary_desired_state.rb
279
288
  - lib/rubocop/cop/chef/redundant/unnecessary_name_property.rb
280
289
  - lib/rubocop/cop/chef/redundant/use_create_if_missing.rb
290
+ - lib/rubocop/cop/chef/security/insecure_remote_file_source.rb
281
291
  - lib/rubocop/cop/chef/security/ssh_private_key.rb
282
292
  - lib/rubocop/cop/chef/sharing/default_maintainer_metadata.rb
283
293
  - lib/rubocop/cop/chef/sharing/empty_metadata_field.rb
294
+ - lib/rubocop/cop/chef/sharing/empty_property_description.rb
284
295
  - lib/rubocop/cop/chef/sharing/include_property_descriptions.rb
285
296
  - lib/rubocop/cop/chef/sharing/include_resource_descriptions.rb
286
297
  - lib/rubocop/cop/chef/sharing/include_resource_examples.rb