cookstyle 6.14.7 → 6.16.7

Sign up to get free protection for your applications and to get access to all the features.
Files changed (211) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +0 -1
  3. data/config/cookstyle.yml +54 -16
  4. data/config/disable_all.yml +48 -4
  5. data/config/upstream.yml +175 -27
  6. data/cookstyle.gemspec +1 -0
  7. data/lib/cookstyle.rb +2 -2
  8. data/lib/cookstyle/version.rb +2 -2
  9. data/lib/rubocop/cop/chef/correctness/block_guard_clause_string_only.rb +7 -9
  10. data/lib/rubocop/cop/chef/correctness/chef_application_fatal.rb +5 -9
  11. data/lib/rubocop/cop/chef/correctness/conditional_ruby_shellout.rb +5 -9
  12. data/lib/rubocop/cop/chef/correctness/dnf_package_allow_downgrades.rb +5 -8
  13. data/lib/rubocop/cop/chef/correctness/incorrect_library_injection.rb +11 -9
  14. data/lib/rubocop/cop/chef/correctness/invalid_default_action.rb +3 -2
  15. data/lib/rubocop/cop/chef/correctness/invalid_notification_timing.rb +3 -2
  16. data/lib/rubocop/cop/chef/correctness/invalid_platform_family_helper.rb +16 -21
  17. data/lib/rubocop/cop/chef/correctness/invalid_platform_family_values_in_case.rb +15 -23
  18. data/lib/rubocop/cop/chef/correctness/invalid_platform_helper.rb +3 -2
  19. data/lib/rubocop/cop/chef/correctness/invalid_platform_metadata.rb +13 -14
  20. data/lib/rubocop/cop/chef/correctness/invalid_platform_values_in_case.rb +13 -22
  21. data/lib/rubocop/cop/chef/correctness/invalid_value_for_platform_family_helper.rb +5 -3
  22. data/lib/rubocop/cop/chef/correctness/invalid_value_for_platform_helper.rb +5 -3
  23. data/lib/rubocop/cop/chef/correctness/invalid_version_metadata.rb +3 -4
  24. data/lib/rubocop/cop/chef/correctness/lazy_eval_node_attribute_defaults.rb +5 -8
  25. data/lib/rubocop/cop/chef/correctness/macos_userdefaults_invalid_type.rb +2 -3
  26. data/lib/rubocop/cop/chef/correctness/malformed_value_for_platform.rb +6 -7
  27. data/lib/rubocop/cop/chef/correctness/metadata_missing_name.rb +5 -12
  28. data/lib/rubocop/cop/chef/correctness/node_normal.rb +2 -2
  29. data/lib/rubocop/cop/chef/correctness/node_normal_unless.rb +2 -2
  30. data/lib/rubocop/cop/chef/correctness/node_save.rb +2 -2
  31. data/lib/rubocop/cop/chef/correctness/notifies_action_not_symbol.rb +7 -7
  32. data/lib/rubocop/cop/chef/correctness/openssl_password_helpers.rb +2 -2
  33. data/lib/rubocop/cop/chef/correctness/powershell_delete_file.rb +4 -4
  34. data/lib/rubocop/cop/chef/correctness/resource_sets_internal_properties.rb +2 -2
  35. data/lib/rubocop/cop/chef/correctness/resource_sets_name_property.rb +2 -2
  36. data/lib/rubocop/cop/chef/correctness/resource_with_none_action.rb +6 -2
  37. data/lib/rubocop/cop/chef/correctness/scoped_file_exist.rb +6 -8
  38. data/lib/rubocop/cop/chef/correctness/service_resource.rb +3 -2
  39. data/lib/rubocop/cop/chef/correctness/supports_must_be_float.rb +1 -0
  40. data/lib/rubocop/cop/chef/correctness/tmp_path.rb +4 -4
  41. data/lib/rubocop/cop/chef/deprecation/ use_automatic_resource_name.rb +1 -2
  42. data/lib/rubocop/cop/chef/{correctness → deprecation}/cb_depends_on_self.rb +7 -11
  43. data/lib/rubocop/cop/chef/deprecation/chef_handler_recipe.rb +6 -8
  44. data/lib/rubocop/cop/chef/deprecation/chef_handler_supports.rb +7 -10
  45. data/lib/rubocop/cop/chef/deprecation/chef_rest.rb +4 -3
  46. data/lib/rubocop/cop/chef/deprecation/chef_rewind.rb +16 -28
  47. data/lib/rubocop/cop/chef/deprecation/chef_windows_platform_helper.rb +5 -8
  48. data/lib/rubocop/cop/chef/deprecation/chefdk_generators.rb +3 -6
  49. data/lib/rubocop/cop/chef/deprecation/cheffile.rb +3 -5
  50. data/lib/rubocop/cop/chef/deprecation/chefspec_coverage_report.rb +5 -8
  51. data/lib/rubocop/cop/chef/deprecation/chefspec_legacy_runner.rb +5 -8
  52. data/lib/rubocop/cop/chef/deprecation/chocolatey_package_uninstall_action.rb +6 -8
  53. data/lib/rubocop/cop/chef/deprecation/depends_compat_resource.rb +6 -8
  54. data/lib/rubocop/cop/chef/deprecation/depends_partial_search.rb +3 -2
  55. data/lib/rubocop/cop/chef/deprecation/depends_poise.rb +3 -2
  56. data/lib/rubocop/cop/chef/deprecation/deprecated_chefspec_platform.rb +11 -14
  57. data/lib/rubocop/cop/chef/deprecation/deprecated_mixins.rb +12 -10
  58. data/lib/rubocop/cop/chef/deprecation/deprecated_platform_methods.rb +2 -2
  59. data/lib/rubocop/cop/chef/deprecation/deprecated_shellout_methods.rb +11 -12
  60. data/lib/rubocop/cop/chef/deprecation/deprecated_windows_version_check.rb +3 -2
  61. data/lib/rubocop/cop/chef/deprecation/deprecated_yum_repository_properties.rb +8 -8
  62. data/lib/rubocop/cop/chef/deprecation/easy_install.rb +3 -2
  63. data/lib/rubocop/cop/chef/deprecation/eol_audit_mode.rb +3 -2
  64. data/lib/rubocop/cop/chef/deprecation/epic_fail.rb +5 -6
  65. data/lib/rubocop/cop/chef/deprecation/erl_call.rb +3 -2
  66. data/lib/rubocop/cop/chef/deprecation/hwrp_without_provides.rb +11 -12
  67. data/lib/rubocop/cop/chef/deprecation/inherits_compat_resource.rb +6 -8
  68. data/lib/rubocop/cop/chef/deprecation/launchd_deprecated_hash_property.rb +6 -9
  69. data/lib/rubocop/cop/chef/deprecation/legacy_notify_syntax.rb +6 -9
  70. data/lib/rubocop/cop/chef/deprecation/legacy_yum_cookbook_recipes.rb +3 -2
  71. data/lib/rubocop/cop/chef/deprecation/locale_lc_all_property.rb +2 -2
  72. data/lib/rubocop/cop/chef/deprecation/name_property_and_default.rb +5 -9
  73. data/lib/rubocop/cop/chef/deprecation/node_methods_not_attributes.rb +6 -8
  74. data/lib/rubocop/cop/chef/deprecation/node_set.rb +6 -8
  75. data/lib/rubocop/cop/chef/deprecation/node_set_unless.rb +6 -8
  76. data/lib/rubocop/cop/chef/deprecation/node_set_without_level.rb +6 -4
  77. data/lib/rubocop/cop/chef/deprecation/partial_search_class_usage.rb +2 -2
  78. data/lib/rubocop/cop/chef/deprecation/partial_search_helper_usage.rb +3 -2
  79. data/lib/rubocop/cop/chef/deprecation/poise_archive.rb +6 -3
  80. data/lib/rubocop/cop/chef/deprecation/powershell_cookbook_helpers.rb +5 -9
  81. data/lib/rubocop/cop/chef/deprecation/require_recipe.rb +8 -7
  82. data/lib/rubocop/cop/chef/deprecation/resource_overrides_provides_method.rb +3 -4
  83. data/lib/rubocop/cop/chef/deprecation/resource_uses_dsl_name_method.rb +3 -2
  84. data/lib/rubocop/cop/chef/deprecation/resource_uses_only_resource_name.rb +8 -11
  85. data/lib/rubocop/cop/chef/deprecation/resource_uses_provider_base_method.rb +3 -2
  86. data/lib/rubocop/cop/chef/deprecation/resource_uses_updated_method.rb +2 -2
  87. data/lib/rubocop/cop/chef/deprecation/ruby_27_keyword_argument_warnings.rb +7 -10
  88. data/lib/rubocop/cop/chef/deprecation/ruby_block_create_action.rb +6 -8
  89. data/lib/rubocop/cop/chef/deprecation/run_command_helper.rb +5 -4
  90. data/lib/rubocop/cop/chef/deprecation/search_uses_positional_parameters.rb +7 -8
  91. data/lib/rubocop/cop/chef/deprecation/use_inline_resources.rb +10 -13
  92. data/lib/rubocop/cop/chef/deprecation/user_supports_property.rb +11 -14
  93. data/lib/rubocop/cop/chef/deprecation/verify_property_file_expansion.rb +6 -8
  94. data/lib/rubocop/cop/chef/deprecation/windows_feature_servermanagercmd.rb +2 -2
  95. data/lib/rubocop/cop/chef/deprecation/windows_task_change_action.rb +11 -16
  96. data/lib/rubocop/cop/chef/deprecation/windows_version_helpers.rb +4 -9
  97. data/lib/rubocop/cop/chef/deprecation/xml_ruby_recipe.rb +7 -8
  98. data/lib/rubocop/cop/chef/deprecation/yum_dnf_compat_recipe.rb +6 -8
  99. data/lib/rubocop/cop/chef/effortless/berksfile.rb +3 -5
  100. data/lib/rubocop/cop/chef/effortless/data_bags.rb +3 -2
  101. data/lib/rubocop/cop/chef/effortless/node_environment.rb +6 -3
  102. data/lib/rubocop/cop/chef/effortless/node_policygroup.rb +6 -3
  103. data/lib/rubocop/cop/chef/effortless/node_roles.rb +6 -3
  104. data/lib/rubocop/cop/chef/effortless/search_for_environments_or_roles.rb +4 -3
  105. data/lib/rubocop/cop/chef/effortless/search_used.rb +3 -2
  106. data/lib/rubocop/cop/chef/modernize/allowed_actions_initializer.rb +16 -16
  107. data/lib/rubocop/cop/chef/modernize/apt_default_recipe.rb +3 -2
  108. data/lib/rubocop/cop/chef/modernize/berksfile_source.rb +10 -9
  109. data/lib/rubocop/cop/chef/modernize/build_essential.rb +7 -8
  110. data/lib/rubocop/cop/chef/modernize/chef_14_resources.rb +6 -8
  111. data/lib/rubocop/cop/chef/modernize/chef_gem_nokogiri.rb +12 -10
  112. data/lib/rubocop/cop/chef/modernize/compile_time_resources.rb +2 -2
  113. data/lib/rubocop/cop/chef/modernize/conditional_using_test.rb +6 -8
  114. data/lib/rubocop/cop/chef/modernize/cron_d_file_or_template.rb +2 -2
  115. data/lib/rubocop/cop/chef/modernize/cron_manage_resource.rb +4 -6
  116. data/lib/rubocop/cop/chef/modernize/databag_helpers.rb +7 -8
  117. data/lib/rubocop/cop/chef/modernize/default_action_initializer.rb +11 -13
  118. data/lib/rubocop/cop/chef/modernize/defines_chefspec_matchers.rb +5 -8
  119. data/lib/rubocop/cop/chef/modernize/definitions.rb +2 -2
  120. data/lib/rubocop/cop/chef/modernize/depends_zypper_cookbook.rb +6 -8
  121. data/lib/rubocop/cop/chef/modernize/dsl_include_in_resource.rb +6 -8
  122. data/lib/rubocop/cop/chef/modernize/empty_resource_initialize.rb +5 -8
  123. data/lib/rubocop/cop/chef/modernize/execute_apt_update.rb +7 -4
  124. data/lib/rubocop/cop/chef/modernize/execute_sc_exe.rb +7 -9
  125. data/lib/rubocop/cop/chef/modernize/execute_sleep.rb +7 -11
  126. data/lib/rubocop/cop/chef/modernize/execute_sysctl.rb +6 -9
  127. data/lib/rubocop/cop/chef/modernize/execute_tzutil.rb +8 -4
  128. data/lib/rubocop/cop/chef/modernize/foodcritic_comments.rb +7 -12
  129. data/lib/rubocop/cop/chef/modernize/if_provides_default_action.rb +4 -6
  130. data/lib/rubocop/cop/chef/modernize/includes_mixin_shellout.rb +6 -8
  131. data/lib/rubocop/cop/chef/modernize/libarchive_file.rb +13 -9
  132. data/lib/rubocop/cop/chef/modernize/macos_user_defaults.rb +4 -6
  133. data/lib/rubocop/cop/chef/modernize/minitest_handler_usage.rb +6 -8
  134. data/lib/rubocop/cop/chef/modernize/node_roles_include.rb +5 -9
  135. data/lib/rubocop/cop/chef/modernize/ohai_default_recipe.rb +3 -2
  136. data/lib/rubocop/cop/chef/modernize/openssl_rsa_key_resource.rb +4 -6
  137. data/lib/rubocop/cop/chef/modernize/openssl_x509_resource.rb +4 -6
  138. data/lib/rubocop/cop/chef/modernize/osx_config_profile_resource.rb +5 -6
  139. data/lib/rubocop/cop/chef/modernize/powershell_expand_archive.rb +3 -4
  140. data/lib/rubocop/cop/chef/modernize/powershell_guard_interpreter.rb +5 -9
  141. data/lib/rubocop/cop/chef/modernize/powershell_install_package.rb +3 -4
  142. data/lib/rubocop/cop/chef/modernize/powershell_install_windowsfeature.rb +3 -4
  143. data/lib/rubocop/cop/chef/modernize/property_with_name_attribute.rb +6 -9
  144. data/lib/rubocop/cop/chef/modernize/provides_initializer.rb +13 -15
  145. data/lib/rubocop/cop/chef/modernize/resource_name_initializer.rb +10 -14
  146. data/lib/rubocop/cop/chef/modernize/resource_set_or_return.rb +3 -4
  147. data/lib/rubocop/cop/chef/modernize/resource_with_attributes.rb +8 -8
  148. data/lib/rubocop/cop/chef/modernize/respond_to_compile_time.rb +4 -9
  149. data/lib/rubocop/cop/chef/modernize/respond_to_metadata.rb +20 -16
  150. data/lib/rubocop/cop/chef/modernize/respond_to_provides.rb +6 -8
  151. data/lib/rubocop/cop/chef/modernize/respond_to_resource_name.rb +6 -8
  152. data/lib/rubocop/cop/chef/modernize/sc_windows_resource.rb +2 -1
  153. data/lib/rubocop/cop/chef/modernize/seven_zip_archive.rb +3 -2
  154. data/lib/rubocop/cop/chef/modernize/shell_out_helper.rb +3 -8
  155. data/lib/rubocop/cop/chef/modernize/shellouts_to_chocolatey.rb +5 -7
  156. data/lib/rubocop/cop/chef/modernize/simplify_apt_ppa_setup.rb +6 -10
  157. data/lib/rubocop/cop/chef/modernize/{systctl_param_resource.rb → sysctl_param_resource.rb} +4 -6
  158. data/lib/rubocop/cop/chef/modernize/unnecessary_mixlib_shellout_require.rb +6 -8
  159. data/lib/rubocop/cop/chef/modernize/use_multipackage_installs.rb +11 -10
  160. data/lib/rubocop/cop/chef/modernize/use_require_relative.rb +7 -9
  161. data/lib/rubocop/cop/chef/modernize/whyrun_supported_true.rb +5 -8
  162. data/lib/rubocop/cop/chef/modernize/windows_default_recipe.rb +6 -8
  163. data/lib/rubocop/cop/chef/modernize/windows_registry_uac.rb +6 -7
  164. data/lib/rubocop/cop/chef/modernize/windows_zipfile.rb +3 -2
  165. data/lib/rubocop/cop/chef/modernize/zipfile_resource.rb +4 -3
  166. data/lib/rubocop/cop/chef/modernize/zypper_repo.rb +4 -6
  167. data/lib/rubocop/cop/chef/redundant/apt_repository_distribution_default.rb +5 -8
  168. data/lib/rubocop/cop/chef/redundant/apt_repository_notifies_apt_update.rb +6 -8
  169. data/lib/rubocop/cop/chef/redundant/attribute_metadata.rb +4 -6
  170. data/lib/rubocop/cop/chef/redundant/conflicts_metadata.rb +4 -6
  171. data/lib/rubocop/cop/chef/redundant/custom_resource_with_allowed_actions.rb +5 -13
  172. data/lib/rubocop/cop/chef/redundant/grouping_metadata.rb +4 -6
  173. data/lib/rubocop/cop/chef/redundant/long_description_metadata.rb +4 -6
  174. data/lib/rubocop/cop/chef/redundant/multiple_platform_checks.rb +7 -9
  175. data/lib/rubocop/cop/chef/redundant/name_property_and_required.rb +2 -2
  176. data/lib/rubocop/cop/chef/redundant/ohai_attribute_to_string.rb +4 -8
  177. data/lib/rubocop/cop/chef/redundant/property_splat_regex.rb +8 -9
  178. data/lib/rubocop/cop/chef/redundant/property_with_default_and_required.rb +5 -9
  179. data/lib/rubocop/cop/chef/redundant/provides_metadata.rb +4 -6
  180. data/lib/rubocop/cop/chef/redundant/recipe_metadata.rb +4 -6
  181. data/lib/rubocop/cop/chef/redundant/replaces_metadata.rb +4 -6
  182. data/lib/rubocop/cop/chef/redundant/resource_with_nothing_action.rb +5 -8
  183. data/lib/rubocop/cop/chef/redundant/sensitive_property_in_resource.rb +6 -7
  184. data/lib/rubocop/cop/chef/redundant/string_property_with_nil_default.rb +7 -9
  185. data/lib/rubocop/cop/chef/redundant/suggests_metadata.rb +4 -6
  186. data/lib/rubocop/cop/chef/redundant/unnecessary_desired_state.rb +1 -0
  187. data/lib/rubocop/cop/chef/redundant/unnecessary_name_property.rb +10 -9
  188. data/lib/rubocop/cop/chef/redundant/use_create_if_missing.rb +7 -9
  189. data/lib/rubocop/cop/chef/sharing/default_maintainer_metadata.rb +3 -2
  190. data/lib/rubocop/cop/chef/sharing/empty_metadata_field.rb +4 -3
  191. data/lib/rubocop/cop/chef/sharing/include_property_descriptions.rb +4 -3
  192. data/lib/rubocop/cop/chef/sharing/include_resource_descriptions.rb +5 -5
  193. data/lib/rubocop/cop/chef/sharing/include_resource_examples.rb +4 -4
  194. data/lib/rubocop/cop/chef/sharing/insecure_cookbook_url.rb +7 -8
  195. data/lib/rubocop/cop/chef/sharing/invalid_license_string.rb +8 -12
  196. data/lib/rubocop/cop/chef/style/chef_whaaat.rb +3 -4
  197. data/lib/rubocop/cop/chef/style/comment_sentence_spacing.rb +5 -7
  198. data/lib/rubocop/cop/chef/style/comments_copyright_format.rb +5 -9
  199. data/lib/rubocop/cop/chef/style/comments_default_copyright.rb +5 -7
  200. data/lib/rubocop/cop/chef/style/comments_format.rb +13 -16
  201. data/lib/rubocop/cop/chef/style/file_mode.rb +1 -0
  202. data/lib/rubocop/cop/chef/style/immediate_notification_timing.rb +7 -8
  203. data/lib/rubocop/cop/chef/style/include_recipe_with_parentheses.rb +1 -0
  204. data/lib/rubocop/cop/chef/style/negating_only_if.rb +5 -9
  205. data/lib/rubocop/cop/chef/style/overly_complex_supports_depends_metadata.rb +5 -9
  206. data/lib/rubocop/cop/chef/style/simplify_platform_major_version_check.rb +6 -8
  207. data/lib/rubocop/cop/chef/style/true_false_resource_properties.rb +6 -9
  208. data/lib/rubocop/cop/chef/style/unnecessary_os_check.rb +17 -28
  209. data/lib/rubocop/cop/chef/style/unnecessary_platform_case_statement.rb +5 -9
  210. data/lib/rubocop/cop/chef/style/use_platform_helpers.rb +11 -19
  211. metadata +7 -7
@@ -31,8 +31,11 @@ module RuboCop
31
31
  # # good
32
32
  # build_essential 'install compilation tools'
33
33
  #
34
- class UseBuildEssentialResource < Cop
34
+ class UseBuildEssentialResource < Base
35
+ extend AutoCorrector
36
+
35
37
  MSG = 'Use the build_essential resource instead of the legacy build-essential recipe. This resource ships in the build-essential cookbook v5.0+ and is built into Chef Infra Client 14+'
38
+ RESTRICT_ON_SEND = [:include_recipe].freeze
36
39
 
37
40
  def_node_matcher :build_essential_recipe_usage?, <<-PATTERN
38
41
  (send nil? :include_recipe (str {"build-essential" "build-essential::default"}))
@@ -40,13 +43,9 @@ module RuboCop
40
43
 
41
44
  def on_send(node)
42
45
  build_essential_recipe_usage?(node) do
43
- add_offense(node, location: :expression, message: MSG, severity: :refactor)
44
- end
45
- end
46
-
47
- def autocorrect(node)
48
- lambda do |corrector|
49
- corrector.replace(node.loc.expression, "build_essential 'install compilation tools'")
46
+ add_offense(node, message: MSG, severity: :refactor) do |corrector|
47
+ corrector.replace(node.loc.expression, "build_essential 'install compilation tools'")
48
+ end
50
49
  end
51
50
  end
52
51
  end
@@ -32,13 +32,15 @@ module RuboCop
32
32
  # depends 'swap'
33
33
  # depends 'sysctl'
34
34
  #
35
- class UnnecessaryDependsChef14 < Cop
35
+ class UnnecessaryDependsChef14 < Base
36
+ extend AutoCorrector
36
37
  extend TargetChefVersion
37
38
  include RangeHelp
38
39
 
39
40
  minimum_target_chef_version '14.0'
40
41
 
41
42
  MSG = "Don't depend on cookbooks made obsolete by Chef Infra Client 14+. These community cookbooks contain resources that are now included in Chef Infra Client itself."
43
+ RESTRICT_ON_SEND = [:depends].freeze
42
44
 
43
45
  def_node_matcher :legacy_depends?, <<-PATTERN
44
46
  (send nil? :depends (str {"build-essential" "chef_handler" "chef_hostname" "dmg" "mac_os_x" "swap" "sysctl"}) ... )
@@ -46,13 +48,9 @@ module RuboCop
46
48
 
47
49
  def on_send(node)
48
50
  legacy_depends?(node) do
49
- add_offense(node, location: :expression, message: MSG, severity: :refactor)
50
- end
51
- end
52
-
53
- def autocorrect(node)
54
- lambda do |corrector|
55
- corrector.remove(range_with_surrounding_space(range: node.loc.expression, side: :left))
51
+ add_offense(node, message: MSG, severity: :refactor) do |corrector|
52
+ corrector.remove(range_with_surrounding_space(range: node.loc.expression, side: :left))
53
+ end
56
54
  end
57
55
  end
58
56
  end
@@ -27,11 +27,13 @@ module RuboCop
27
27
  # # bad
28
28
  # chef_gem 'nokogiri'
29
29
  #
30
- class ChefGemNokogiri < Cop
30
+ class ChefGemNokogiri < Base
31
+ extend AutoCorrector
31
32
  include RangeHelp
32
33
  include RuboCop::Chef::CookbookHelpers
33
34
 
34
35
  MSG = 'The nokogiri gem ships in Chef Infra Client 12+ and does not need to be installed before being used.'
36
+ RESTRICT_ON_SEND = [:chef_gem].freeze
35
37
 
36
38
  def_node_matcher :nokogiri_install?, <<-PATTERN
37
39
  (send nil? :chef_gem (str "nokogiri"))
@@ -39,20 +41,20 @@ module RuboCop
39
41
 
40
42
  def on_block(node)
41
43
  match_property_in_resource?(:chef_gem, 'package_name', node) do |pkg_name|
42
- add_offense(node, location: :expression, message: MSG, severity: :refactor) if pkg_name.arguments&.first&.str_content == 'nokogiri'
44
+ return unless pkg_name.arguments&.first&.str_content == 'nokogiri'
45
+ add_offense(node, message: MSG, severity: :refactor) do |corrector|
46
+ node = node.parent if node.parent&.block_type? # make sure we get the whole block not just the method in the block
47
+ corrector.remove(range_with_surrounding_space(range: node.loc.expression, side: :left))
48
+ end
43
49
  end
44
50
  end
45
51
 
46
52
  def on_send(node)
47
53
  nokogiri_install?(node) do
48
- add_offense(node, location: :expression, message: MSG, severity: :refactor)
49
- end
50
- end
51
-
52
- def autocorrect(node)
53
- lambda do |corrector|
54
- node = node.parent if node.parent&.block_type? # make sure we get the whole block not just the method in the block
55
- corrector.remove(range_with_surrounding_space(range: node.loc.expression, side: :left))
54
+ add_offense(node, message: MSG, severity: :refactor) do |corrector|
55
+ node = node.parent if node.parent&.block_type? # make sure we get the whole block not just the method in the block
56
+ corrector.remove(range_with_surrounding_space(range: node.loc.expression, side: :left))
57
+ end
56
58
  end
57
59
  end
58
60
  end
@@ -33,7 +33,7 @@ module RuboCop
33
33
  # compile_time true
34
34
  # end
35
35
  #
36
- class ResourceForcingCompileTime < Cop
36
+ class ResourceForcingCompileTime < Base
37
37
  MSG = "Set 'compile_time true' in resources when available instead of forcing resources to run at compile time by setting an action on the block."
38
38
 
39
39
  def_node_matcher :compile_time_resource?, <<-PATTERN
@@ -42,7 +42,7 @@ module RuboCop
42
42
 
43
43
  def on_send(node)
44
44
  compile_time_resource?(node) do
45
- add_offense(node, location: :expression, message: MSG, severity: :refactor)
45
+ add_offense(node, message: MSG, severity: :refactor)
46
46
  end
47
47
  end
48
48
  end
@@ -29,8 +29,11 @@ module RuboCop
29
29
  # # good
30
30
  # only_if { ::File.exist?('bin/foo') }
31
31
  #
32
- class ConditionalUsingTest < Cop
32
+ class ConditionalUsingTest < Base
33
+ extend AutoCorrector
34
+
33
35
  MSG = "Use ::File.exist?('/foo/bar') instead of the slower 'test -f /foo/bar' which requires shelling out"
36
+ RESTRICT_ON_SEND = [:not_if, :only_if].freeze
34
37
 
35
38
  def_node_matcher :resource_conditional?, <<~PATTERN
36
39
  (send nil? {:not_if :only_if} $str )
@@ -38,13 +41,8 @@ module RuboCop
38
41
 
39
42
  def on_send(node)
40
43
  resource_conditional?(node) do |conditional|
41
- add_offense(node, location: :expression, message: MSG, severity: :refactor) if conditional.value.match?(/^test -[ef] \S*$/)
42
- end
43
- end
44
-
45
- def autocorrect(node)
46
- lambda do |corrector|
47
- resource_conditional?(node) do |conditional|
44
+ return unless conditional.value.match?(/^test -[ef] \S*$/)
45
+ add_offense(node, message: MSG, severity: :refactor) do |corrector|
48
46
  new_string = "{ ::File.exist?('#{conditional.value.match(/^test -[ef] (\S*)$/)[1]}') }"
49
47
  corrector.replace(conditional.loc.expression, new_string)
50
48
  end
@@ -60,7 +60,7 @@ module RuboCop
60
60
  # action :delete
61
61
  # end
62
62
  #
63
- class CronDFileOrTemplate < Cop
63
+ class CronDFileOrTemplate < Base
64
64
  extend TargetChefVersion
65
65
 
66
66
  minimum_target_chef_version '14.4'
@@ -78,7 +78,7 @@ module RuboCop
78
78
  def on_block(node)
79
79
  file_or_template?(node) do |file_name|
80
80
  return unless file_name.start_with?('/etc/cron.d/')
81
- add_offense(node, location: :expression, message: MSG, severity: :refactor)
81
+ add_offense(node, message: MSG, severity: :refactor)
82
82
  end
83
83
  end
84
84
  end
@@ -29,19 +29,17 @@ module RuboCop
29
29
  # # good
30
30
  # cron_access 'mike'
31
31
  #
32
- class CronManageResource < Cop
32
+ class CronManageResource < Base
33
33
  extend TargetChefVersion
34
+ extend AutoCorrector
34
35
 
35
36
  minimum_target_chef_version '14.4'
36
37
 
37
38
  MSG = 'The cron_manage resource was renamed to cron_access in the 6.1 release of the cron cookbook and later shipped in Chef Infra Client 14.4. The new resource name should be used.'
39
+ RESTRICT_ON_SEND = [:cron_manage].freeze
38
40
 
39
41
  def on_send(node)
40
- add_offense(node, location: :expression, message: MSG, severity: :refactor) if node.method_name == :cron_manage
41
- end
42
-
43
- def autocorrect(node)
44
- lambda do |corrector|
42
+ add_offense(node, message: MSG, severity: :refactor) do |corrector|
45
43
  corrector.replace(node.loc.expression, node.source.gsub(/^cron_manage/, 'cron_access'))
46
44
  end
47
45
  end
@@ -31,7 +31,9 @@ module RuboCop
31
31
  # plain_text_data = data_bag_item('foo', 'bar')
32
32
  # encrypted_data = data_bag_item('foo2', 'bar2')
33
33
  #
34
- class DatabagHelpers < Cop
34
+ class DatabagHelpers < Base
35
+ extend AutoCorrector
36
+
35
37
  MSG = 'Use the `data_bag_item` helper instead of `Chef::DataBagItem.load` or `Chef::EncryptedDataBagItem.load`.'
36
38
 
37
39
  def_node_matcher :data_bag_class_load?, <<-PATTERN
@@ -43,13 +45,10 @@ module RuboCop
43
45
 
44
46
  def on_send(node)
45
47
  data_bag_class_load?(node) do
46
- add_offense(node, location: :expression, message: MSG, severity: :refactor)
47
- end
48
- end
49
-
50
- def autocorrect(node)
51
- lambda do |corrector|
52
- corrector.replace(node.loc.expression, node.source.gsub(/Chef::(EncryptedDataBagItem|DataBagItem).load/, 'data_bag_item'))
48
+ add_offense(node, message: MSG, severity: :refactor) do |corrector|
49
+ corrector.replace(node.loc.expression,
50
+ node.source.gsub(/Chef::(EncryptedDataBagItem|DataBagItem).load/, 'data_bag_item'))
51
+ end
53
52
  end
54
53
  end
55
54
  end
@@ -38,7 +38,8 @@ module RuboCop
38
38
  # # good
39
39
  # default_action :create
40
40
 
41
- class DefaultActionFromInitialize < Cop
41
+ class DefaultActionFromInitialize < Base
42
+ extend AutoCorrector
42
43
  include RangeHelp
43
44
 
44
45
  MSG = 'The default action of a resource can be set with the "default_action" helper instead of using the initialize method.'
@@ -53,20 +54,17 @@ module RuboCop
53
54
 
54
55
  def on_ivasgn(node)
55
56
  action_variable_assignment?(node) do
56
- add_offense(node, location: :expression, message: MSG, severity: :refactor) if initialize_method(node.parent.parent)
57
- end
58
- end
57
+ return unless initialize_method(node.parent.parent)
58
+ add_offense(node, message: MSG, severity: :refactor) do |corrector|
59
+ # insert the new default_action call above the initialize method, but not if one already exists (this is sadly common)
60
+ unless default_action_method?(processed_source.ast)
61
+ initialize_node = initialize_method(processed_source.ast).first
62
+ corrector.insert_before(initialize_node.source_range, "default_action #{node.descendants.first.source}\n\n")
63
+ end
59
64
 
60
- def autocorrect(node)
61
- lambda do |corrector|
62
- # insert the new default_action call above the initialize method, but not if one already exists (this is sadly common)
63
- unless default_action_method?(processed_source.ast)
64
- initialize_node = initialize_method(processed_source.ast).first
65
- corrector.insert_before(initialize_node.source_range, "default_action #{node.descendants.first.source}\n\n")
65
+ # remove the variable from the initialize method
66
+ corrector.remove(range_with_surrounding_space(range: node.loc.expression, side: :left))
66
67
  end
67
-
68
- # remove the variable from the initialize method
69
- corrector.remove(range_with_surrounding_space(range: node.loc.expression, side: :left))
70
68
  end
71
69
  end
72
70
  end
@@ -30,7 +30,8 @@ module RuboCop
30
30
  # end
31
31
  # end
32
32
  #
33
- class DefinesChefSpecMatchers < Cop
33
+ class DefinesChefSpecMatchers < Base
34
+ extend AutoCorrector
34
35
  include RangeHelp
35
36
 
36
37
  MSG = 'ChefSpec matchers are now auto generated by ChefSpec 7.1+ and do not need to be defined in a cookbook'
@@ -41,13 +42,9 @@ module RuboCop
41
42
 
42
43
  def on_if(node)
43
44
  chefspec_matcher?(node) do
44
- add_offense(node, location: :expression, message: MSG, severity: :refactor)
45
- end
46
- end
47
-
48
- def autocorrect(node)
49
- lambda do |corrector|
50
- corrector.remove(range_with_surrounding_space(range: node.loc.expression, side: :left))
45
+ add_offense(node, message: MSG, severity: :refactor) do |corrector|
46
+ corrector.remove(range_with_surrounding_space(range: node.loc.expression, side: :left))
47
+ end
51
48
  end
52
49
  end
53
50
  end
@@ -21,13 +21,13 @@ module RuboCop
21
21
  module ChefModernize
22
22
  # In 2016 with Chef Infra Client 12.5 Custom Resources were introduced as a way of writing reusable resource code that could be shipped in cookbooks. Custom Resources offer many advantages of legacy Definitions including unit testing with ChefSpec, input validation, actions, common properties like not_if/only_if, and resource reporting.
23
23
  #
24
- class Definitions < Cop
24
+ class Definitions < Base
25
25
  include RuboCop::Chef::CookbookHelpers
26
26
 
27
27
  MSG = 'Legacy Chef Infra definitions should be rewritten as custom resources to take full advantage of the Chef Infra feature set.'
28
28
 
29
29
  def on_block(node)
30
- add_offense(node, location: :expression, message: MSG, severity: :refactor) if node.respond_to?(:method_name) && node.method_name == :define
30
+ add_offense(node, message: MSG, severity: :refactor) if node.respond_to?(:method_name) && node.method_name == :define
31
31
  end
32
32
  end
33
33
  end
@@ -26,13 +26,15 @@ module RuboCop
26
26
  # # bad
27
27
  # depends 'zypper'
28
28
  #
29
- class DependsOnZypperCookbook < Cop
29
+ class DependsOnZypperCookbook < Base
30
+ extend AutoCorrector
30
31
  extend TargetChefVersion
31
32
  include RangeHelp
32
33
 
33
34
  minimum_target_chef_version '13.3'
34
35
 
35
36
  MSG = "Don't depend on the zypper cookbook as the zypper_repository resource is built into Chef Infra Client 13.3+"
37
+ RESTRICT_ON_SEND = [:depends].freeze
36
38
 
37
39
  def_node_matcher :zypper_depends?, <<-PATTERN
38
40
  (send nil? :depends (str "zypper"))
@@ -40,13 +42,9 @@ module RuboCop
40
42
 
41
43
  def on_send(node)
42
44
  zypper_depends?(node) do
43
- add_offense(node, location: :expression, message: MSG, severity: :refactor)
44
- end
45
- end
46
-
47
- def autocorrect(node)
48
- lambda do |corrector|
49
- corrector.remove(range_with_surrounding_space(range: node.loc.expression, side: :left))
45
+ add_offense(node, message: MSG, severity: :refactor) do |corrector|
46
+ corrector.remove(range_with_surrounding_space(range: node.loc.expression, side: :left))
47
+ end
50
48
  end
51
49
  end
52
50
  end
@@ -25,10 +25,12 @@ module RuboCop
25
25
  # include Chef::DSL::Recipe
26
26
  # include Chef::DSL::IncludeRecipe
27
27
  #
28
- class DslIncludeInResource < Cop
28
+ class DslIncludeInResource < Base
29
+ extend AutoCorrector
29
30
  include RangeHelp
30
31
 
31
32
  MSG = 'Chef Infra Client 12.4+ includes the Chef::DSL::Recipe in the resource and provider classed by default so there is no need to include this DSL in your resources or providers.'
33
+ RESTRICT_ON_SEND = [:include].freeze
32
34
 
33
35
  def_node_matcher :dsl_include?, <<-PATTERN
34
36
  (send nil? :include
@@ -39,13 +41,9 @@ module RuboCop
39
41
 
40
42
  def on_send(node)
41
43
  dsl_include?(node) do
42
- add_offense(node, location: :expression, message: MSG, severity: :refactor)
43
- end
44
- end
45
-
46
- def autocorrect(node)
47
- lambda do |corrector|
48
- corrector.remove(range_with_surrounding_space(range: node.loc.expression, side: :left))
44
+ add_offense(node, message: MSG, severity: :refactor) do |corrector|
45
+ corrector.remove(range_with_surrounding_space(range: node.loc.expression, side: :left))
46
+ end
49
47
  end
50
48
  end
51
49
  end
@@ -28,7 +28,8 @@ module RuboCop
28
28
  # super
29
29
  # end
30
30
  #
31
- class EmptyResourceInitializeMethod < Cop
31
+ class EmptyResourceInitializeMethod < Base
32
+ extend AutoCorrector
32
33
  include RangeHelp
33
34
 
34
35
  MSG = 'There is no need for an empty initialize method in a resource'
@@ -39,13 +40,9 @@ module RuboCop
39
40
 
40
41
  def on_def(node)
41
42
  empty_initialize?(node) do
42
- add_offense(node, location: :expression, message: MSG, severity: :refactor)
43
- end
44
- end
45
-
46
- def autocorrect(node)
47
- lambda do |corrector|
48
- corrector.remove(range_with_surrounding_space(range: node.loc.expression, side: :left))
43
+ add_offense(node, message: MSG, severity: :refactor) do |corrector|
44
+ corrector.remove(range_with_surrounding_space(range: node.loc.expression, side: :left))
45
+ end
49
46
  end
50
47
  end
51
48
  end
@@ -42,8 +42,11 @@ module RuboCop
42
42
  # notifies :update, 'apt_update[update apt cache]', :immediately
43
43
  # end
44
44
  #
45
- class ExecuteAptUpdate < Cop
45
+ class ExecuteAptUpdate < Base
46
+ extend AutoCorrector
47
+
46
48
  MSG = 'Use the apt_update resource instead of the execute resource to run an apt-get update package cache update'
49
+ RESTRICT_ON_SEND = [:execute, :notifies, :subscribes, :command].freeze
47
50
 
48
51
  def_node_matcher :execute_apt_update?, <<-PATTERN
49
52
  (send nil? :execute (str { "apt-get update" "apt-get update -y" "apt-get -y update" }))
@@ -59,15 +62,15 @@ module RuboCop
59
62
 
60
63
  def on_send(node)
61
64
  execute_apt_update?(node) do
62
- add_offense(node, location: :expression, message: MSG, severity: :refactor)
65
+ add_offense(node, message: MSG, severity: :refactor)
63
66
  end
64
67
 
65
68
  notification_property?(node) do |val|
66
- add_offense(val, location: :expression, message: MSG, severity: :refactor) if val.str_content&.start_with?('execute[apt-get update]')
69
+ add_offense(val, message: MSG, severity: :refactor) if val.str_content&.start_with?('execute[apt-get update]')
67
70
  end
68
71
 
69
72
  execute_command?(node) do |val|
70
- add_offense(node, location: :expression, message: MSG, severity: :refactor) if val.str_content == 'apt-get update'
73
+ add_offense(node, message: MSG, severity: :refactor) if val.str_content == 'apt-get update'
71
74
  end
72
75
  end
73
76
  end
@@ -32,32 +32,30 @@ module RuboCop
32
32
  # action :delete
33
33
  # end
34
34
  #
35
- class ExecuteScExe < Cop
35
+ class ExecuteScExe < Base
36
36
  include RuboCop::Chef::CookbookHelpers
37
37
  extend TargetChefVersion
38
38
 
39
39
  minimum_target_chef_version '14.0'
40
40
 
41
41
  MSG = 'Chef Infra Client 14.0 and later includes :create, :delete, and :configure actions with the full idempotency of the windows_service resource. See the windows_service documentation at https://docs.chef.io/resource_windows_service.html for additional details on creating services with the windows_service resource'
42
+ RESTRICT_ON_SEND = [:execute].freeze
42
43
 
43
44
  # non block execute resources
44
45
  def on_send(node)
45
- return unless node.method_name == :execute
46
-
47
46
  # use a regex on source instead of .value in case there's string interpolation which adds a complex dstr type
48
47
  # with a nested string and a begin. Source allows us to avoid a lot of defensive programming here
49
- if node&.arguments.first&.source&.match?(/^("|')sc.exe/)
50
- add_offense(node, location: :expression, message: MSG, severity: :refactor)
51
- end
48
+ return unless node&.arguments.first&.source&.match?(/^("|')sc.exe/)
49
+
50
+ add_offense(node, message: MSG, severity: :refactor)
52
51
  end
53
52
 
54
53
  # block execute resources
55
54
  def on_block(node)
56
55
  match_property_in_resource?(:execute, 'command', node) do |code_property|
57
56
  property_data = method_arg_ast_to_string(code_property)
58
- if property_data && property_data.match?(/^sc.exe/i)
59
- add_offense(node, location: :expression, message: MSG, severity: :refactor)
60
- end
57
+ return unless property_data && property_data.match?(/^sc.exe/i)
58
+ add_offense(node, message: MSG, severity: :refactor)
61
59
  end
62
60
  end
63
61
  end