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.
- checksums.yaml +4 -4
- data/config/chefstyle.yml +2 -0
- data/config/cookstyle.yml +145 -6
- data/lib/cookstyle/version.rb +2 -2
- data/lib/rubocop/chef/cookbook_helpers.rb +23 -0
- data/lib/rubocop/chef.rb +1 -1
- data/lib/rubocop/cop/chef/correctness/chef_application_fatal.rb +16 -4
- data/lib/rubocop/cop/chef/correctness/conditional_unified_mode_true.rb +91 -0
- data/lib/rubocop/cop/chef/correctness/empty_resource_guard.rb +18 -2
- data/lib/rubocop/cop/chef/correctness/execute_delete_file.rb +127 -0
- data/lib/rubocop/cop/chef/correctness/invalid_checksum.rb +79 -0
- data/lib/rubocop/cop/chef/correctness/invalid_platform_family_helper.rb +1 -1
- data/lib/rubocop/cop/chef/correctness/invalid_platform_family_values_in_case.rb +10 -0
- data/lib/rubocop/cop/chef/correctness/invalid_platform_values_in_case.rb +10 -0
- data/lib/rubocop/cop/chef/correctness/invalid_value_for_platform_helper.rb +1 -0
- data/lib/rubocop/cop/chef/correctness/openssl_password_helpers.rb +1 -1
- data/lib/rubocop/cop/chef/correctness/platform_version_string_comparison.rb +66 -0
- data/lib/rubocop/cop/chef/correctness/powershell_delete_file.rb +5 -5
- data/lib/rubocop/cop/chef/correctness/powershell_file_exists.rb +1 -1
- data/lib/rubocop/cop/chef/correctness/resource_with_none_action.rb +3 -3
- data/lib/rubocop/cop/chef/correctness/ruby_guard_without_block.rb +91 -0
- data/lib/rubocop/cop/chef/correctness/service_resource.rb +71 -20
- data/lib/rubocop/cop/chef/deprecation/chef_handler_recipe.rb +8 -1
- data/lib/rubocop/cop/chef/deprecation/chef_rest.rb +4 -1
- data/lib/rubocop/cop/chef/deprecation/chef_shellout.rb +2 -2
- data/lib/rubocop/cop/chef/deprecation/chef_sugar_helpers.rb +6 -0
- data/lib/rubocop/cop/chef/deprecation/chef_windows_platform_helper.rb +1 -1
- data/lib/rubocop/cop/chef/deprecation/chocolatey_package_uninstall_action.rb +3 -3
- data/lib/rubocop/cop/chef/deprecation/depends_partial_search.rb +4 -0
- data/lib/rubocop/cop/chef/deprecation/deprecated_mixins.rb +2 -2
- data/lib/rubocop/cop/chef/deprecation/hwrp_without_provides.rb +4 -4
- data/lib/rubocop/cop/chef/deprecation/hwrp_without_unified_mode_true.rb +2 -2
- data/lib/rubocop/cop/chef/deprecation/inherits_compat_resource.rb +3 -3
- data/lib/rubocop/cop/chef/deprecation/legacy_yum_cookbook_recipes.rb +9 -1
- data/lib/rubocop/cop/chef/deprecation/locale_lc_all_property.rb +5 -0
- data/lib/rubocop/cop/chef/deprecation/resource_uses_only_resource_name.rb +9 -1
- data/lib/rubocop/cop/chef/deprecation/resource_uses_provider_base_method.rb +4 -0
- data/lib/rubocop/cop/chef/deprecation/ruby_block_create_action.rb +42 -3
- data/lib/rubocop/cop/chef/deprecation/use_automatic_resource_name.rb +9 -0
- data/lib/rubocop/cop/chef/deprecation/use_yaml_dump.rb +5 -0
- data/lib/rubocop/cop/chef/deprecation/xml_ruby_recipe.rb +5 -1
- data/lib/rubocop/cop/chef/modernize/apt_default_recipe.rb +1 -1
- data/lib/rubocop/cop/chef/modernize/build_essential.rb +4 -1
- data/lib/rubocop/cop/chef/modernize/chef_14_resources.rb +8 -0
- data/lib/rubocop/cop/chef/modernize/chef_15_resources.rb +11 -0
- data/lib/rubocop/cop/chef/modernize/chef_gem_nokogiri.rb +4 -0
- data/lib/rubocop/cop/chef/modernize/conditional_using_test.rb +10 -3
- data/lib/rubocop/cop/chef/modernize/cron_d_file_or_template.rb +6 -4
- data/lib/rubocop/cop/chef/modernize/databag_helpers.rb +6 -3
- data/lib/rubocop/cop/chef/modernize/depends_chef_vault_cookbook.rb +4 -0
- data/lib/rubocop/cop/chef/modernize/depends_chocolatey_cookbooks.rb +7 -0
- data/lib/rubocop/cop/chef/modernize/depends_kernel_module_cookbook.rb +6 -0
- data/lib/rubocop/cop/chef/modernize/depends_locale_cookbook.rb +6 -0
- data/lib/rubocop/cop/chef/modernize/depends_openssl_cookbook.rb +9 -0
- data/lib/rubocop/cop/chef/modernize/depends_timezone_lwrp_cookbook.rb +4 -0
- data/lib/rubocop/cop/chef/modernize/depends_windows_firewall_cookbook.rb +8 -0
- data/lib/rubocop/cop/chef/modernize/depends_zypper_cookbook.rb +7 -0
- data/lib/rubocop/cop/chef/modernize/dsl_include_in_resource.rb +1 -1
- data/lib/rubocop/cop/chef/modernize/execute_apt_update.rb +3 -1
- data/lib/rubocop/cop/chef/modernize/execute_archive_extract.rb +121 -0
- data/lib/rubocop/cop/chef/modernize/execute_update_alternatives.rb +100 -0
- data/lib/rubocop/cop/chef/modernize/includes_mixin_shellout.rb +4 -0
- data/lib/rubocop/cop/chef/modernize/libarchive_file.rb +5 -3
- data/lib/rubocop/cop/chef/modernize/ohai_default_recipe.rb +6 -1
- data/lib/rubocop/cop/chef/modernize/powershell_download_file.rb +64 -0
- data/lib/rubocop/cop/chef/modernize/powershell_expand_archive.rb +8 -1
- data/lib/rubocop/cop/chef/modernize/powershell_guard_interpreter.rb +4 -4
- data/lib/rubocop/cop/chef/modernize/sc_windows_resource.rb +2 -2
- data/lib/rubocop/cop/chef/modernize/seven_zip_archive.rb +7 -1
- data/lib/rubocop/cop/chef/modernize/shellouts_to_chocolatey.rb +15 -4
- data/lib/rubocop/cop/chef/modernize/use_require_relative.rb +1 -1
- data/lib/rubocop/cop/chef/modernize/windows_default_recipe.rb +1 -1
- data/lib/rubocop/cop/chef/modernize/windows_zipfile.rb +8 -2
- data/lib/rubocop/cop/chef/modernize/zipfile_resource.rb +7 -1
- data/lib/rubocop/cop/chef/modernize/zypper_repo.rb +2 -2
- data/lib/rubocop/cop/chef/redundant/custom_resource_with_allowed_actions.rb +10 -0
- data/lib/rubocop/cop/chef/redundant/double_compile_time.rb +22 -8
- data/lib/rubocop/cop/chef/redundant/service_guard_on_stop_disable.rb +117 -0
- data/lib/rubocop/cop/chef/redundant/string_property_with_nil_default.rb +2 -2
- data/lib/rubocop/cop/chef/redundant/unnecessary_name_property.rb +1 -1
- data/lib/rubocop/cop/chef/security/insecure_remote_file_source.rb +82 -0
- data/lib/rubocop/cop/chef/security/ssh_private_key.rb +9 -0
- data/lib/rubocop/cop/chef/sharing/empty_property_description.rb +62 -0
- data/lib/rubocop/cop/chef/style/include_recipe_with_parentheses.rb +5 -2
- data/lib/rubocop/cop/chef/style/true_false_resource_properties.rb +1 -1
- data/lib/rubocop/monkey_patches/directive_comment.rb +21 -3
- 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)
|
|
@@ -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
|
-
|
|
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
|
|
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
|
-
"#
|
|
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:
|
|
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-
|
|
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.
|
|
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.
|
|
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
|