cookstyle 7.32.8 → 8.1.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 +4 -4
- data/Gemfile +25 -29
- data/LICENSE +201 -201
- data/bin/cookstyle +31 -31
- data/bin/cookstyle-profile +31 -31
- data/config/chefstyle.yml +892 -741
- data/config/cookstyle.yml +3273 -3131
- data/config/default.yml +2 -2
- data/cookstyle.gemspec +30 -30
- data/lib/cookstyle/chefstyle.rb +5 -5
- data/lib/cookstyle/version.rb +5 -5
- data/lib/cookstyle.rb +48 -45
- data/lib/rubocop/chef/autocorrect_helpers.rb +33 -33
- data/lib/rubocop/chef/cookbook_helpers.rb +127 -127
- data/lib/rubocop/chef/cookbook_only.rb +76 -76
- data/lib/rubocop/chef/platform_helpers.rb +72 -72
- data/lib/rubocop/chef.rb +11 -11
- data/lib/rubocop/cop/chef/correctness/block_guard_clause_string_only.rb +61 -61
- data/lib/rubocop/cop/chef/correctness/chef_application_fatal.rb +56 -56
- data/lib/rubocop/cop/chef/correctness/conditional_ruby_shellout.rb +69 -69
- data/lib/rubocop/cop/chef/correctness/dnf_package_allow_downgrades.rb +55 -55
- data/lib/rubocop/cop/chef/correctness/incorrect_library_injection.rb +77 -77
- data/lib/rubocop/cop/chef/correctness/invalid_cookbook_name.rb +47 -47
- data/lib/rubocop/cop/chef/correctness/invalid_default_action.rb +48 -48
- data/lib/rubocop/cop/chef/correctness/invalid_notification_resource.rb +59 -59
- data/lib/rubocop/cop/chef/correctness/invalid_notification_timing.rb +55 -55
- data/lib/rubocop/cop/chef/correctness/invalid_platform_family_helper.rb +72 -72
- data/lib/rubocop/cop/chef/correctness/invalid_platform_family_values_in_case.rb +70 -70
- data/lib/rubocop/cop/chef/correctness/invalid_platform_helper.rb +57 -57
- data/lib/rubocop/cop/chef/correctness/invalid_platform_metadata.rb +89 -89
- data/lib/rubocop/cop/chef/correctness/invalid_platform_values_in_case.rb +70 -70
- data/lib/rubocop/cop/chef/correctness/invalid_value_for_platform_family_helper.rb +70 -70
- data/lib/rubocop/cop/chef/correctness/invalid_value_for_platform_helper.rb +69 -69
- data/lib/rubocop/cop/chef/correctness/invalid_version_metadata.rb +48 -48
- data/lib/rubocop/cop/chef/correctness/lazy_eval_node_attribute_defaults.rb +53 -53
- data/lib/rubocop/cop/chef/correctness/lazy_in_resource_guard.rb +67 -67
- data/lib/rubocop/cop/chef/correctness/macos_userdefaults_invalid_type.rb +67 -67
- data/lib/rubocop/cop/chef/correctness/malformed_value_for_platform.rb +67 -67
- data/lib/rubocop/cop/chef/correctness/metadata_malformed_version.rb +58 -58
- data/lib/rubocop/cop/chef/correctness/metadata_missing_name.rb +54 -54
- data/lib/rubocop/cop/chef/correctness/metadata_missing_version.rb +51 -51
- data/lib/rubocop/cop/chef/correctness/node_normal.rb +53 -53
- data/lib/rubocop/cop/chef/correctness/node_normal_unless.rb +53 -53
- data/lib/rubocop/cop/chef/correctness/node_save.rb +46 -46
- data/lib/rubocop/cop/chef/correctness/notifies_action_not_symbol.rb +64 -64
- data/lib/rubocop/cop/chef/correctness/octal_mode_as_string.rb +48 -48
- data/lib/rubocop/cop/chef/correctness/openssl_password_helpers.rb +46 -46
- data/lib/rubocop/cop/chef/correctness/powershell_delete_file.rb +54 -54
- data/lib/rubocop/cop/chef/correctness/powershell_file_exists.rb +50 -50
- data/lib/rubocop/cop/chef/correctness/property_without_type.rb +59 -59
- data/lib/rubocop/cop/chef/correctness/resource_sets_internal_properties.rb +51 -51
- data/lib/rubocop/cop/chef/correctness/resource_sets_name_property.rb +50 -50
- data/lib/rubocop/cop/chef/correctness/resource_with_none_action.rb +56 -56
- data/lib/rubocop/cop/chef/correctness/scoped_file_exist.rb +52 -52
- data/lib/rubocop/cop/chef/correctness/service_resource.rb +56 -56
- data/lib/rubocop/cop/chef/correctness/supports_must_be_float.rb +52 -52
- data/lib/rubocop/cop/chef/correctness/tmp_path.rb +59 -59
- data/lib/rubocop/cop/chef/deprecation/cb_depends_on_self.rb +57 -57
- data/lib/rubocop/cop/chef/deprecation/chef_handler_recipe.rb +52 -52
- data/lib/rubocop/cop/chef/deprecation/chef_handler_supports.rb +55 -55
- data/lib/rubocop/cop/chef/deprecation/chef_rest.rb +57 -57
- data/lib/rubocop/cop/chef/deprecation/chef_rewind.rb +98 -98
- data/lib/rubocop/cop/chef/deprecation/chef_shellout.rb +83 -83
- data/lib/rubocop/cop/chef/deprecation/chef_sugar_helpers.rb +55 -55
- data/lib/rubocop/cop/chef/deprecation/chef_windows_platform_helper.rb +55 -55
- data/lib/rubocop/cop/chef/deprecation/chefdk_generators.rb +56 -56
- data/lib/rubocop/cop/chef/deprecation/cheffile.rb +39 -39
- data/lib/rubocop/cop/chef/deprecation/chefspec_coverage_report.rb +49 -49
- data/lib/rubocop/cop/chef/deprecation/chefspec_legacy_runner.rb +61 -61
- data/lib/rubocop/cop/chef/deprecation/chocolatey_package_uninstall_action.rb +56 -56
- data/lib/rubocop/cop/chef/deprecation/delivery.rb +48 -48
- data/lib/rubocop/cop/chef/deprecation/depends_chef_nginx_cookbook.rb +54 -54
- data/lib/rubocop/cop/chef/deprecation/depends_chef_reporting_cookbook.rb +51 -51
- data/lib/rubocop/cop/chef/deprecation/depends_compat_resource.rb +54 -54
- data/lib/rubocop/cop/chef/deprecation/depends_omnibus_updater_cookbook.rb +54 -54
- data/lib/rubocop/cop/chef/deprecation/depends_partial_search.rb +50 -50
- data/lib/rubocop/cop/chef/deprecation/depends_poise.rb +48 -48
- data/lib/rubocop/cop/chef/deprecation/deprecated_chefspec_platform.rb +129 -129
- data/lib/rubocop/cop/chef/deprecation/deprecated_mixins.rb +78 -78
- data/lib/rubocop/cop/chef/deprecation/deprecated_platform_methods.rb +61 -61
- data/lib/rubocop/cop/chef/deprecation/deprecated_shellout_methods.rb +64 -64
- data/lib/rubocop/cop/chef/deprecation/deprecated_sudo_actions.rb +65 -65
- data/lib/rubocop/cop/chef/deprecation/deprecated_windows_version_check.rb +42 -42
- data/lib/rubocop/cop/chef/deprecation/deprecated_yum_repository_actions.rb +67 -67
- data/lib/rubocop/cop/chef/deprecation/deprecated_yum_repository_properties.rb +69 -69
- data/lib/rubocop/cop/chef/deprecation/easy_install.rb +42 -42
- data/lib/rubocop/cop/chef/deprecation/eol_audit_mode.rb +49 -49
- data/lib/rubocop/cop/chef/deprecation/epic_fail.rb +51 -51
- data/lib/rubocop/cop/chef/deprecation/erl_call.rb +42 -42
- data/lib/rubocop/cop/chef/deprecation/execute_path_property.rb +50 -50
- data/lib/rubocop/cop/chef/deprecation/execute_relative_creates_without_cwd.rb +66 -66
- data/lib/rubocop/cop/chef/deprecation/foodcritic_file.rb +41 -41
- data/lib/rubocop/cop/chef/deprecation/foodcritic_testing.rb +43 -43
- data/lib/rubocop/cop/chef/deprecation/hwrp_without_provides.rb +140 -140
- data/lib/rubocop/cop/chef/deprecation/hwrp_without_unified_mode_true.rb +86 -86
- data/lib/rubocop/cop/chef/deprecation/inherits_compat_resource.rb +59 -59
- data/lib/rubocop/cop/chef/deprecation/launchd_deprecated_hash_property.rb +56 -56
- data/lib/rubocop/cop/chef/deprecation/legacy_notify_syntax.rb +91 -91
- data/lib/rubocop/cop/chef/deprecation/legacy_yum_cookbook_recipes.rb +53 -53
- data/lib/rubocop/cop/chef/deprecation/librarian_chefspec.rb +42 -42
- data/lib/rubocop/cop/chef/deprecation/locale_lc_all_property.rb +46 -46
- data/lib/rubocop/cop/chef/deprecation/log_resource_notifications.rb +63 -63
- data/lib/rubocop/cop/chef/deprecation/macos_userdefaults_global_property.rb +60 -60
- data/lib/rubocop/cop/chef/deprecation/name_property_and_default.rb +60 -60
- data/lib/rubocop/cop/chef/deprecation/node_deep_fetch.rb +65 -65
- data/lib/rubocop/cop/chef/deprecation/node_methods_not_attributes.rb +80 -80
- data/lib/rubocop/cop/chef/deprecation/node_set.rb +54 -54
- data/lib/rubocop/cop/chef/deprecation/node_set_unless.rb +54 -54
- data/lib/rubocop/cop/chef/deprecation/node_set_without_level.rb +70 -70
- data/lib/rubocop/cop/chef/deprecation/partial_search_class_usage.rb +67 -67
- data/lib/rubocop/cop/chef/deprecation/partial_search_helper_usage.rb +61 -61
- data/lib/rubocop/cop/chef/deprecation/poise_archive.rb +63 -63
- data/lib/rubocop/cop/chef/deprecation/policyfile_community_source.rb +53 -53
- data/lib/rubocop/cop/chef/deprecation/powershell_cookbook_helpers.rb +59 -59
- data/lib/rubocop/cop/chef/deprecation/require_recipe.rb +53 -53
- data/lib/rubocop/cop/chef/deprecation/resource_overrides_provides_method.rb +48 -48
- data/lib/rubocop/cop/chef/deprecation/resource_uses_dsl_name_method.rb +46 -46
- data/lib/rubocop/cop/chef/deprecation/resource_uses_only_resource_name.rb +84 -84
- data/lib/rubocop/cop/chef/deprecation/resource_uses_provider_base_method.rb +40 -40
- data/lib/rubocop/cop/chef/deprecation/resource_uses_updated_method.rb +50 -50
- data/lib/rubocop/cop/chef/deprecation/resource_without_unified_mode_true.rb +87 -87
- data/lib/rubocop/cop/chef/deprecation/ruby_27_keyword_argument_warnings.rb +56 -56
- data/lib/rubocop/cop/chef/deprecation/ruby_block_create_action.rb +62 -62
- data/lib/rubocop/cop/chef/deprecation/run_command_helper.rb +63 -63
- data/lib/rubocop/cop/chef/deprecation/search_uses_positional_parameters.rb +136 -136
- data/lib/rubocop/cop/chef/deprecation/use_automatic_resource_name.rb +52 -52
- data/lib/rubocop/cop/chef/deprecation/use_inline_resources.rb +57 -57
- data/lib/rubocop/cop/chef/deprecation/use_yaml_dump.rb +47 -47
- data/lib/rubocop/cop/chef/deprecation/user_supports_property.rb +71 -71
- data/lib/rubocop/cop/chef/deprecation/verify_property_file_expansion.rb +57 -57
- data/lib/rubocop/cop/chef/deprecation/windows_feature_servermanagercmd.rb +58 -58
- data/lib/rubocop/cop/chef/deprecation/windows_package_installer_type_string.rb +60 -60
- data/lib/rubocop/cop/chef/deprecation/windows_task_change_action.rb +83 -83
- data/lib/rubocop/cop/chef/deprecation/windows_version_helpers.rb +71 -71
- data/lib/rubocop/cop/chef/deprecation/xml_ruby_recipe.rb +51 -51
- data/lib/rubocop/cop/chef/deprecation/yum_dnf_compat_recipe.rb +53 -53
- data/lib/rubocop/cop/chef/effortless/berksfile.rb +39 -39
- data/lib/rubocop/cop/chef/effortless/chef_vault_used.rb +87 -87
- data/lib/rubocop/cop/chef/effortless/data_bags.rb +40 -40
- data/lib/rubocop/cop/chef/effortless/depends_chef_vault.rb +47 -47
- data/lib/rubocop/cop/chef/effortless/node_environment.rb +45 -45
- data/lib/rubocop/cop/chef/effortless/node_policygroup.rb +44 -44
- data/lib/rubocop/cop/chef/effortless/node_roles.rb +45 -45
- data/lib/rubocop/cop/chef/effortless/search_for_environments_or_roles.rb +43 -43
- data/lib/rubocop/cop/chef/effortless/search_used.rb +40 -40
- data/lib/rubocop/cop/chef/modernize/action_method_in_resource.rb +57 -57
- data/lib/rubocop/cop/chef/modernize/allowed_actions_initializer.rb +77 -77
- data/lib/rubocop/cop/chef/modernize/apt_default_recipe.rb +54 -54
- data/lib/rubocop/cop/chef/modernize/berksfile_source.rb +70 -70
- data/lib/rubocop/cop/chef/modernize/build_essential.rb +55 -55
- data/lib/rubocop/cop/chef/modernize/chef_14_resources.rb +60 -60
- data/lib/rubocop/cop/chef/modernize/chef_15_resources.rb +57 -57
- data/lib/rubocop/cop/chef/modernize/chef_gem_nokogiri.rb +63 -63
- data/lib/rubocop/cop/chef/modernize/class_eval_action_class.rb +63 -63
- data/lib/rubocop/cop/chef/modernize/compile_time_resources.rb +53 -53
- data/lib/rubocop/cop/chef/modernize/conditional_using_test.rb +55 -55
- data/lib/rubocop/cop/chef/modernize/cron_d_file_or_template.rb +121 -121
- data/lib/rubocop/cop/chef/modernize/cron_manage_resource.rb +50 -50
- data/lib/rubocop/cop/chef/modernize/databag_helpers.rb +59 -59
- data/lib/rubocop/cop/chef/modernize/declare_action_class.rb +54 -54
- data/lib/rubocop/cop/chef/modernize/default_action_initializer.rb +74 -74
- data/lib/rubocop/cop/chef/modernize/defines_chefspec_matchers.rb +54 -54
- data/lib/rubocop/cop/chef/modernize/definitions.rb +36 -36
- data/lib/rubocop/cop/chef/modernize/depends_chef_vault_cookbook.rb +54 -54
- data/lib/rubocop/cop/chef/modernize/depends_chocolatey_cookbooks.rb +55 -55
- data/lib/rubocop/cop/chef/modernize/depends_kernel_module_cookbook.rb +54 -54
- data/lib/rubocop/cop/chef/modernize/depends_locale_cookbook.rb +54 -54
- data/lib/rubocop/cop/chef/modernize/depends_openssl_cookbook.rb +54 -54
- data/lib/rubocop/cop/chef/modernize/depends_timezone_lwrp_cookbook.rb +54 -54
- data/lib/rubocop/cop/chef/modernize/depends_windows_firewall_cookbook.rb +54 -54
- data/lib/rubocop/cop/chef/modernize/depends_zypper_cookbook.rb +54 -54
- data/lib/rubocop/cop/chef/modernize/dsl_include_in_resource.rb +55 -55
- data/lib/rubocop/cop/chef/modernize/empty_resource_initialize.rb +52 -52
- data/lib/rubocop/cop/chef/modernize/execute_apt_update.rb +81 -81
- data/lib/rubocop/cop/chef/modernize/execute_sc_exe.rb +67 -67
- data/lib/rubocop/cop/chef/modernize/execute_sleep.rb +76 -76
- data/lib/rubocop/cop/chef/modernize/execute_sysctl.rb +70 -70
- data/lib/rubocop/cop/chef/modernize/execute_tzutil.rb +83 -83
- data/lib/rubocop/cop/chef/modernize/foodcritic_comments.rb +46 -46
- data/lib/rubocop/cop/chef/modernize/if_provides_default_action.rb +48 -48
- data/lib/rubocop/cop/chef/modernize/includes_mixin_shellout.rb +83 -83
- data/lib/rubocop/cop/chef/modernize/libarchive_file.rb +70 -70
- data/lib/rubocop/cop/chef/modernize/macos_user_defaults.rb +58 -58
- data/lib/rubocop/cop/chef/modernize/minitest_handler_usage.rb +51 -51
- data/lib/rubocop/cop/chef/modernize/node_init_package.rb +89 -89
- data/lib/rubocop/cop/chef/modernize/node_roles_include.rb +57 -57
- data/lib/rubocop/cop/chef/modernize/ohai_default_recipe.rb +47 -47
- data/lib/rubocop/cop/chef/modernize/openssl_rsa_key_resource.rb +54 -54
- data/lib/rubocop/cop/chef/modernize/openssl_x509_resource.rb +60 -60
- data/lib/rubocop/cop/chef/modernize/osx_config_profile_resource.rb +51 -51
- data/lib/rubocop/cop/chef/modernize/powershell_expand_archive.rb +50 -50
- data/lib/rubocop/cop/chef/modernize/powershell_guard_interpreter.rb +68 -68
- data/lib/rubocop/cop/chef/modernize/powershell_install_package.rb +53 -53
- data/lib/rubocop/cop/chef/modernize/powershell_install_windowsfeature.rb +56 -56
- data/lib/rubocop/cop/chef/modernize/property_with_name_attribute.rb +56 -56
- data/lib/rubocop/cop/chef/modernize/provides_initializer.rb +68 -68
- data/lib/rubocop/cop/chef/modernize/resource_name_initializer.rb +63 -63
- data/lib/rubocop/cop/chef/modernize/resource_set_or_return.rb +49 -49
- data/lib/rubocop/cop/chef/modernize/resource_with_attributes.rb +66 -66
- data/lib/rubocop/cop/chef/modernize/respond_to_compile_time.rb +94 -94
- data/lib/rubocop/cop/chef/modernize/respond_to_metadata.rb +77 -77
- data/lib/rubocop/cop/chef/modernize/respond_to_provides.rb +63 -63
- data/lib/rubocop/cop/chef/modernize/respond_to_resource_name.rb +52 -52
- data/lib/rubocop/cop/chef/modernize/sc_windows_resource.rb +53 -53
- data/lib/rubocop/cop/chef/modernize/seven_zip_archive.rb +46 -46
- data/lib/rubocop/cop/chef/modernize/shell_out_helper.rb +60 -60
- data/lib/rubocop/cop/chef/modernize/shellouts_to_chocolatey.rb +58 -58
- data/lib/rubocop/cop/chef/modernize/simplify_apt_ppa_setup.rb +63 -63
- data/lib/rubocop/cop/chef/modernize/sysctl_param_resource.rb +55 -55
- data/lib/rubocop/cop/chef/modernize/unnecessary_mixlib_shellout_require.rb +51 -51
- data/lib/rubocop/cop/chef/modernize/use_chef_language_cloud_helpers.rb +93 -93
- data/lib/rubocop/cop/chef/modernize/use_chef_language_env_helpers.rb +69 -69
- data/lib/rubocop/cop/chef/modernize/use_chef_language_systemd_helper.rb +60 -60
- data/lib/rubocop/cop/chef/modernize/use_multipackage_installs.rb +113 -113
- data/lib/rubocop/cop/chef/modernize/use_require_relative.rb +60 -60
- data/lib/rubocop/cop/chef/modernize/whyrun_supported_true.rb +58 -58
- data/lib/rubocop/cop/chef/modernize/windows_default_recipe.rb +52 -52
- data/lib/rubocop/cop/chef/modernize/windows_registry_uac.rb +92 -92
- data/lib/rubocop/cop/chef/modernize/windows_zipfile.rb +46 -46
- data/lib/rubocop/cop/chef/modernize/zipfile_resource.rb +59 -59
- data/lib/rubocop/cop/chef/modernize/zypper_repo.rb +60 -60
- data/lib/rubocop/cop/chef/redundant/apt_repository_distribution_default.rb +65 -65
- data/lib/rubocop/cop/chef/redundant/apt_repository_notifies_apt_update.rb +60 -60
- data/lib/rubocop/cop/chef/redundant/attribute_metadata.rb +52 -52
- data/lib/rubocop/cop/chef/redundant/conflicts_metadata.rb +46 -46
- data/lib/rubocop/cop/chef/redundant/custom_resource_with_allowed_actions.rb +60 -60
- data/lib/rubocop/cop/chef/redundant/double_compile_time.rb +68 -68
- data/lib/rubocop/cop/chef/redundant/grouping_metadata.rb +46 -46
- data/lib/rubocop/cop/chef/redundant/long_description_metadata.rb +46 -46
- data/lib/rubocop/cop/chef/redundant/multiple_platform_checks.rb +58 -58
- data/lib/rubocop/cop/chef/redundant/name_property_and_required.rb +81 -81
- data/lib/rubocop/cop/chef/redundant/ohai_attribute_to_string.rb +65 -65
- data/lib/rubocop/cop/chef/redundant/property_splat_regex.rb +59 -59
- data/lib/rubocop/cop/chef/redundant/property_with_default_and_required.rb +61 -61
- data/lib/rubocop/cop/chef/redundant/provides_metadata.rb +46 -46
- data/lib/rubocop/cop/chef/redundant/recipe_metadata.rb +47 -47
- data/lib/rubocop/cop/chef/redundant/replaces_metadata.rb +46 -46
- data/lib/rubocop/cop/chef/redundant/resource_with_nothing_action.rb +52 -52
- data/lib/rubocop/cop/chef/redundant/sensitive_property_in_resource.rb +50 -50
- data/lib/rubocop/cop/chef/redundant/string_property_with_nil_default.rb +64 -64
- data/lib/rubocop/cop/chef/redundant/suggests_metadata.rb +46 -46
- data/lib/rubocop/cop/chef/redundant/unnecessary_desired_state.rb +60 -60
- data/lib/rubocop/cop/chef/redundant/unnecessary_name_property.rb +67 -67
- data/lib/rubocop/cop/chef/redundant/use_create_if_missing.rb +116 -116
- data/lib/rubocop/cop/chef/security/ssh_private_key.rb +49 -49
- data/lib/rubocop/cop/chef/sharing/default_maintainer_metadata.rb +50 -50
- data/lib/rubocop/cop/chef/sharing/empty_metadata_field.rb +47 -47
- data/lib/rubocop/cop/chef/sharing/include_property_descriptions.rb +55 -55
- data/lib/rubocop/cop/chef/sharing/include_resource_descriptions.rb +52 -52
- data/lib/rubocop/cop/chef/sharing/include_resource_examples.rb +60 -60
- data/lib/rubocop/cop/chef/sharing/insecure_cookbook_url.rb +62 -62
- data/lib/rubocop/cop/chef/sharing/invalid_license_string.rb +542 -542
- data/lib/rubocop/cop/chef/style/attribute_keys.rb +94 -95
- data/lib/rubocop/cop/chef/style/chef_whaaat.rb +49 -49
- data/lib/rubocop/cop/chef/style/comment_sentence_spacing.rb +42 -42
- data/lib/rubocop/cop/chef/style/comments_copyright_format.rb +101 -101
- data/lib/rubocop/cop/chef/style/comments_default_copyright.rb +50 -50
- data/lib/rubocop/cop/chef/style/comments_format.rb +71 -71
- data/lib/rubocop/cop/chef/style/file_mode.rb +86 -86
- data/lib/rubocop/cop/chef/style/immediate_notification_timing.rb +59 -59
- data/lib/rubocop/cop/chef/style/include_recipe_with_parentheses.rb +58 -58
- data/lib/rubocop/cop/chef/style/negating_only_if.rb +69 -69
- data/lib/rubocop/cop/chef/style/overly_complex_supports_depends_metadata.rb +70 -70
- data/lib/rubocop/cop/chef/style/simplify_platform_major_version_check.rb +89 -89
- data/lib/rubocop/cop/chef/style/true_false_resource_properties.rb +53 -53
- data/lib/rubocop/cop/chef/style/unnecessary_os_check.rb +103 -103
- data/lib/rubocop/cop/chef/style/unnecessary_platform_case_statement.rb +100 -100
- data/lib/rubocop/cop/chef/style/use_platform_helpers.rb +86 -86
- data/lib/rubocop/cop/chefstyle/ruby/gemspec_license.rb +55 -55
- data/lib/rubocop/cop/chefstyle/ruby/gemspec_require_rubygems.rb +46 -46
- data/lib/rubocop/cop/chefstyle/ruby/legacy_powershell_out_methods.rb +36 -36
- data/lib/rubocop/cop/chefstyle/ruby/require_net_https.rb +54 -54
- data/lib/rubocop/cop/chefstyle/ruby/unless_defined_require.rb +122 -122
- data/lib/rubocop/cop/inspec/deprecation/attribute_default.rb +53 -53
- data/lib/rubocop/cop/inspec/deprecation/attribute_helper.rb +47 -47
- data/lib/rubocop/cop/target_chef_version.rb +22 -22
- data/lib/rubocop/monkey_patches/allow_invalid_ruby.rb +28 -28
- data/lib/rubocop/monkey_patches/base.rb +11 -11
- data/lib/rubocop/monkey_patches/config.rb +15 -15
- data/lib/rubocop/monkey_patches/directive_comment.rb +12 -12
- data/lib/rubocop/monkey_patches/registry_cop.rb +15 -15
- data/lib/rubocop/monkey_patches/team.rb +25 -24
- metadata +9 -9
data/config/default.yml
CHANGED
@@ -1,2 +1,2 @@
|
|
1
|
-
inherit_from:
|
2
|
-
- cookstyle.yml
|
1
|
+
inherit_from:
|
2
|
+
- cookstyle.yml
|
data/cookstyle.gemspec
CHANGED
@@ -1,30 +1,30 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
lib = File.expand_path('lib', __dir__)
|
3
|
-
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
-
require 'cookstyle/version'
|
5
|
-
|
6
|
-
Gem::Specification.new do |spec|
|
7
|
-
spec.name = 'cookstyle'
|
8
|
-
spec.version = Cookstyle::VERSION
|
9
|
-
spec.authors = ['Thom May', 'Tim Smith']
|
10
|
-
spec.email = ['thom@chef.io', 'tsmith84@gmail.com']
|
11
|
-
spec.summary = 'Cookstyle is a code linting tool that helps you to write better Chef Infra cookbooks by detecting and automatically correcting style, syntax, and logic mistakes in your code.'
|
12
|
-
spec.license = 'Apache-2.0'
|
13
|
-
spec.homepage = 'https://docs.chef.io/workstation/cookstyle/'
|
14
|
-
spec.required_ruby_version = '>= 2.7'
|
15
|
-
|
16
|
-
# the gemspec and Gemfile are necessary for appbundling of the gem
|
17
|
-
spec.files = %w(LICENSE cookstyle.gemspec Gemfile) + Dir.glob('{lib,bin,config}/**/*')
|
18
|
-
spec.executables = %w(cookstyle)
|
19
|
-
spec.require_paths = ['lib']
|
20
|
-
|
21
|
-
spec.add_dependency('rubocop', Cookstyle::RUBOCOP_VERSION)
|
22
|
-
|
23
|
-
spec.metadata = {
|
24
|
-
'homepage_uri' => 'https://github.com/chef/cookstyle',
|
25
|
-
'changelog_uri' => 'https://github.com/chef/cookstyle/blob/main/CHANGELOG.md',
|
26
|
-
'source_code_uri' => 'https://github.com/chef/cookstyle',
|
27
|
-
'documentation_uri' => 'https://docs.chef.io/workstation/cookstyle/',
|
28
|
-
'bug_tracker_uri' => 'https://github.com/chef/cookstyle/issues',
|
29
|
-
}
|
30
|
-
end
|
1
|
+
# frozen_string_literal: true
|
2
|
+
lib = File.expand_path('lib', __dir__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'cookstyle/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |spec|
|
7
|
+
spec.name = 'cookstyle'
|
8
|
+
spec.version = Cookstyle::VERSION
|
9
|
+
spec.authors = ['Thom May', 'Tim Smith']
|
10
|
+
spec.email = ['thom@chef.io', 'tsmith84@gmail.com']
|
11
|
+
spec.summary = 'Cookstyle is a code linting tool that helps you to write better Chef Infra cookbooks by detecting and automatically correcting style, syntax, and logic mistakes in your code.'
|
12
|
+
spec.license = 'Apache-2.0'
|
13
|
+
spec.homepage = 'https://docs.chef.io/workstation/cookstyle/'
|
14
|
+
spec.required_ruby_version = '>= 2.7'
|
15
|
+
|
16
|
+
# the gemspec and Gemfile are necessary for appbundling of the gem
|
17
|
+
spec.files = %w(LICENSE cookstyle.gemspec Gemfile) + Dir.glob('{lib,bin,config}/**/*')
|
18
|
+
spec.executables = %w(cookstyle)
|
19
|
+
spec.require_paths = ['lib']
|
20
|
+
|
21
|
+
spec.add_dependency('rubocop', Cookstyle::RUBOCOP_VERSION)
|
22
|
+
|
23
|
+
spec.metadata = {
|
24
|
+
'homepage_uri' => 'https://github.com/chef/cookstyle',
|
25
|
+
'changelog_uri' => 'https://github.com/chef/cookstyle/blob/main/CHANGELOG.md',
|
26
|
+
'source_code_uri' => 'https://github.com/chef/cookstyle',
|
27
|
+
'documentation_uri' => 'https://docs.chef.io/workstation/cookstyle/',
|
28
|
+
'bug_tracker_uri' => 'https://github.com/chef/cookstyle/issues',
|
29
|
+
}
|
30
|
+
end
|
data/lib/cookstyle/chefstyle.rb
CHANGED
@@ -1,5 +1,5 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
module Cookstyle
|
3
|
-
CHEFSTYLE_CONFIG = true
|
4
|
-
end
|
5
|
-
require_relative '../cookstyle'
|
1
|
+
# frozen_string_literal: true
|
2
|
+
module Cookstyle
|
3
|
+
CHEFSTYLE_CONFIG = true
|
4
|
+
end
|
5
|
+
require_relative '../cookstyle'
|
data/lib/cookstyle/version.rb
CHANGED
@@ -1,5 +1,5 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
module Cookstyle
|
3
|
-
VERSION = "
|
4
|
-
RUBOCOP_VERSION = '1.
|
5
|
-
end
|
1
|
+
# frozen_string_literal: true
|
2
|
+
module Cookstyle
|
3
|
+
VERSION = "8.1.1" # rubocop: disable Style/StringLiterals
|
4
|
+
RUBOCOP_VERSION = '1.75.3'
|
5
|
+
end
|
data/lib/cookstyle.rb
CHANGED
@@ -1,45 +1,48 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
require_relative 'cookstyle/version'
|
3
|
-
|
4
|
-
require 'pathname' unless defined?(Pathname)
|
5
|
-
require 'yaml' unless defined?(YAML)
|
6
|
-
|
7
|
-
# ensure the desired target version of RuboCop is gem activated
|
8
|
-
gem 'rubocop', "= #{Cookstyle::RUBOCOP_VERSION}"
|
9
|
-
require 'rubocop'
|
10
|
-
require_relative 'rubocop/monkey_patches/directive_comment'
|
11
|
-
|
12
|
-
# monkey patches needed for the TargetChefVersion config option
|
13
|
-
require_relative 'rubocop/monkey_patches/config'
|
14
|
-
require_relative 'rubocop/monkey_patches/base'
|
15
|
-
require_relative 'rubocop/monkey_patches/team'
|
16
|
-
require_relative 'rubocop/monkey_patches/registry_cop'
|
17
|
-
|
18
|
-
# Cookstyle patches the RuboCop tool to set a new default configuration that
|
19
|
-
# is vendored in the Cookstyle codebase.
|
20
|
-
module Cookstyle
|
21
|
-
# @return [String] the absolute path to the main RuboCop configuration YAML file
|
22
|
-
def self.config
|
23
|
-
config_file = const_defined?(
|
24
|
-
File.realpath(File.join(__dir__, '..', 'config', config_file))
|
25
|
-
end
|
26
|
-
end
|
27
|
-
|
28
|
-
require_relative 'rubocop/chef'
|
29
|
-
require_relative 'rubocop/chef/autocorrect_helpers'
|
30
|
-
require_relative 'rubocop/chef/cookbook_helpers'
|
31
|
-
require_relative 'rubocop/chef/platform_helpers'
|
32
|
-
require_relative 'rubocop/chef/cookbook_only'
|
33
|
-
require_relative 'rubocop/cop/target_chef_version'
|
34
|
-
|
35
|
-
# Chef Infra specific cops
|
36
|
-
Dir.glob(__dir__ + '/rubocop/cop/**/*.rb') do |file|
|
37
|
-
next if File.directory?(file)
|
38
|
-
|
39
|
-
require_relative file # not actually relative but require_relative is faster
|
40
|
-
end
|
41
|
-
|
42
|
-
# stub default value of TargetChefVersion to avoid STDERR noise
|
43
|
-
RuboCop::ConfigLoader.default_configuration['AllCops']['TargetChefVersion']
|
44
|
-
|
45
|
-
RuboCop::ConfigLoader.default_configuration = RuboCop::ConfigLoader.configuration_from_file(Cookstyle.config)
|
1
|
+
# frozen_string_literal: true
|
2
|
+
require_relative 'cookstyle/version'
|
3
|
+
|
4
|
+
require 'pathname' unless defined?(Pathname)
|
5
|
+
require 'yaml' unless defined?(YAML)
|
6
|
+
|
7
|
+
# ensure the desired target version of RuboCop is gem activated
|
8
|
+
gem 'rubocop', "= #{Cookstyle::RUBOCOP_VERSION}"
|
9
|
+
require 'rubocop'
|
10
|
+
require_relative 'rubocop/monkey_patches/directive_comment'
|
11
|
+
|
12
|
+
# monkey patches needed for the TargetChefVersion config option
|
13
|
+
require_relative 'rubocop/monkey_patches/config'
|
14
|
+
require_relative 'rubocop/monkey_patches/base'
|
15
|
+
require_relative 'rubocop/monkey_patches/team'
|
16
|
+
require_relative 'rubocop/monkey_patches/registry_cop'
|
17
|
+
|
18
|
+
# Cookstyle patches the RuboCop tool to set a new default configuration that
|
19
|
+
# is vendored in the Cookstyle codebase.
|
20
|
+
module Cookstyle
|
21
|
+
# @return [String] the absolute path to the main RuboCop configuration YAML file
|
22
|
+
def self.config
|
23
|
+
config_file = const_defined?(:CHEFSTYLE_CONFIG) ? 'chefstyle.yml' : 'default.yml'
|
24
|
+
File.realpath(File.join(__dir__, '..', 'config', config_file))
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
require_relative 'rubocop/chef'
|
29
|
+
require_relative 'rubocop/chef/autocorrect_helpers'
|
30
|
+
require_relative 'rubocop/chef/cookbook_helpers'
|
31
|
+
require_relative 'rubocop/chef/platform_helpers'
|
32
|
+
require_relative 'rubocop/chef/cookbook_only'
|
33
|
+
require_relative 'rubocop/cop/target_chef_version'
|
34
|
+
|
35
|
+
# Chef Infra specific cops
|
36
|
+
Dir.glob(__dir__ + '/rubocop/cop/**/*.rb') do |file|
|
37
|
+
next if File.directory?(file)
|
38
|
+
|
39
|
+
require_relative file # not actually relative but require_relative is faster
|
40
|
+
end
|
41
|
+
|
42
|
+
# stub default value of TargetChefVersion to avoid STDERR noise when ConfigLoader.configuration_from_file runs
|
43
|
+
RuboCop::ConfigLoader.default_configuration['AllCops']['TargetChefVersion'] ||= nil
|
44
|
+
|
45
|
+
RuboCop::ConfigLoader.default_configuration = RuboCop::ConfigLoader.configuration_from_file(Cookstyle.config)
|
46
|
+
|
47
|
+
# re-stub TargetChefVersion to avoid STDERR noise on *next* configuration load
|
48
|
+
RuboCop::ConfigLoader.default_configuration['AllCops']['TargetChefVersion'] ||= nil
|
@@ -1,33 +1,33 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
#
|
3
|
-
# Copyright:: Copyright 2020, Chef Software Inc.
|
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 Chef
|
20
|
-
# Helpers for use in autocorrection
|
21
|
-
module AutocorrectHelpers
|
22
|
-
# if the node has a heredoc as an argument you'll only get the start of the heredoc and removing
|
23
|
-
# the node will result in broken ruby. This way we match the node and the entire heredoc for removal
|
24
|
-
def expression_including_heredocs(node)
|
25
|
-
if node.arguments.last.respond_to?(:heredoc?) && node.arguments.last.heredoc?
|
26
|
-
node.loc.expression.join(node.arguments.last.loc.heredoc_end)
|
27
|
-
else
|
28
|
-
node.loc.expression
|
29
|
-
end
|
30
|
-
end
|
31
|
-
end
|
32
|
-
end
|
33
|
-
end
|
1
|
+
# frozen_string_literal: true
|
2
|
+
#
|
3
|
+
# Copyright:: Copyright 2020, Chef Software Inc.
|
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 Chef
|
20
|
+
# Helpers for use in autocorrection
|
21
|
+
module AutocorrectHelpers
|
22
|
+
# if the node has a heredoc as an argument you'll only get the start of the heredoc and removing
|
23
|
+
# the node will result in broken ruby. This way we match the node and the entire heredoc for removal
|
24
|
+
def expression_including_heredocs(node)
|
25
|
+
if node.arguments.last.respond_to?(:heredoc?) && node.arguments.last.heredoc?
|
26
|
+
node.loc.expression.join(node.arguments.last.loc.heredoc_end)
|
27
|
+
else
|
28
|
+
node.loc.expression
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -1,127 +1,127 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
#
|
3
|
-
# Copyright:: Copyright 2019, Chef Software Inc.
|
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 Chef
|
20
|
-
# Common node helpers used for matching against Chef Infra Cookbooks
|
21
|
-
module CookbookHelpers
|
22
|
-
def resource_block_name_if_string(node)
|
23
|
-
if looks_like_resource?(node) && node.children.first.arguments.first.respond_to?(:value)
|
24
|
-
node.children.first.arguments.first.value
|
25
|
-
end
|
26
|
-
end
|
27
|
-
|
28
|
-
# Match a particular resource
|
29
|
-
#
|
30
|
-
# @param [String] resource_name The name of the resource to match
|
31
|
-
# @param [RuboCop::AST::Node] node The rubocop ast node to search
|
32
|
-
#
|
33
|
-
# @yield
|
34
|
-
#
|
35
|
-
def match_resource_type?(resource_name, node)
|
36
|
-
return unless looks_like_resource?(node)
|
37
|
-
# bail out if we're not in the resource we care about or nil was passed (all resources)
|
38
|
-
yield(node) if node.children.first.method?(resource_name.to_sym)
|
39
|
-
end
|
40
|
-
|
41
|
-
# Match particular properties within a resource
|
42
|
-
#
|
43
|
-
# @param [Symbol, Array<Symbol>] resource_names The name of the resources to match
|
44
|
-
# @param [String] property_names The name of the property to match (or action)
|
45
|
-
# @param [RuboCop::AST::Node] node The rubocop ast node to search
|
46
|
-
#
|
47
|
-
# @yield
|
48
|
-
#
|
49
|
-
def match_property_in_resource?(resource_names, property_names, node)
|
50
|
-
return unless looks_like_resource?(node)
|
51
|
-
# bail out if we're not in the resource we care about or nil was passed (all resources)
|
52
|
-
return unless resource_names.nil? || Array(resource_names).include?(node.children.first.method_name) # see if we're in the right resource
|
53
|
-
|
54
|
-
resource_block = node.children[2] # the 3rd child is the actual block in the resource
|
55
|
-
return unless resource_block # nil would be an empty block
|
56
|
-
|
57
|
-
if resource_block.begin_type? # if begin_type we need to iterate over the children
|
58
|
-
resource_block.children.each do |resource_blk_child|
|
59
|
-
extract_send_types(resource_blk_child) do |p|
|
60
|
-
yield(p) if symbolized_property_types(property_names).include?(p.method_name)
|
61
|
-
end
|
62
|
-
end
|
63
|
-
else # there's only a single property to check
|
64
|
-
extract_send_types(resource_block) do |p|
|
65
|
-
yield(p) if symbolized_property_types(property_names).include?(p.method_name)
|
66
|
-
end
|
67
|
-
end
|
68
|
-
end
|
69
|
-
|
70
|
-
def method_arg_ast_to_string(ast)
|
71
|
-
# a property without a value. This is totally bogus, but they exist
|
72
|
-
return if ast.children[2].nil?
|
73
|
-
# https://rubular.com/r/6uzOMd6WCHewOu
|
74
|
-
m = ast.children[2].source.match(/^("|')(.*)("|')$/)
|
75
|
-
|
76
|
-
end
|
77
|
-
|
78
|
-
private
|
79
|
-
|
80
|
-
# @param [String, Array] property
|
81
|
-
#
|
82
|
-
# @return [Array]
|
83
|
-
def symbolized_property_types(property)
|
84
|
-
Array(property).map(&:to_sym)
|
85
|
-
end
|
86
|
-
|
87
|
-
#
|
88
|
-
# given a node object does it look like a chef resource or not?
|
89
|
-
# warning: currently this requires a resource with properties since we key off blocks and property-less resources look like methods
|
90
|
-
#
|
91
|
-
# @param [RuboCop::AST::Node] node AST object to test
|
92
|
-
#
|
93
|
-
# @return [boolean]
|
94
|
-
#
|
95
|
-
def looks_like_resource?(node)
|
96
|
-
return false unless node.block_type? # resources are blocks if they have properties
|
97
|
-
return false unless node.children.first.receiver.nil? # resource blocks don't have a receiver
|
98
|
-
return false if node.send_node.arguments.first.is_a?(RuboCop::AST::SymbolNode) # resources have a string name. resource actions have symbols
|
99
|
-
|
100
|
-
# bail if the block doesn't have a name a resource *generally* has a name.
|
101
|
-
# This isn't 100% true with things like apt_update and build_essential, but we'll live
|
102
|
-
# with that for now to avoid the false positives of getting stuck in generic blocks in resources
|
103
|
-
return false if node.children.first.arguments.empty?
|
104
|
-
|
105
|
-
# if we made it this far we're probably in a resource
|
106
|
-
true
|
107
|
-
end
|
108
|
-
|
109
|
-
def extract_send_types(node)
|
110
|
-
return if node.nil? # there are cases we can be passed an empty node
|
111
|
-
case node.type
|
112
|
-
when :send
|
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)
|
116
|
-
when :while
|
117
|
-
extract_send_types(node.body) { |t| yield(t) }
|
118
|
-
when :if
|
119
|
-
node.branches.each { |n| extract_send_types(n) { |t| yield(t) } }
|
120
|
-
when :case
|
121
|
-
node.when_branches.each { |n| extract_send_types(n.body) { |t| yield(t) } } # unless node.when_branches.nil?
|
122
|
-
extract_send_types(node.else_branch) { |t| yield(t) } if node.else_branch
|
123
|
-
end
|
124
|
-
end
|
125
|
-
end
|
126
|
-
end
|
127
|
-
end
|
1
|
+
# frozen_string_literal: true
|
2
|
+
#
|
3
|
+
# Copyright:: Copyright 2019, Chef Software Inc.
|
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 Chef
|
20
|
+
# Common node helpers used for matching against Chef Infra Cookbooks
|
21
|
+
module CookbookHelpers
|
22
|
+
def resource_block_name_if_string(node)
|
23
|
+
if looks_like_resource?(node) && node.children.first.arguments.first.respond_to?(:value)
|
24
|
+
node.children.first.arguments.first.value
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
# Match a particular resource
|
29
|
+
#
|
30
|
+
# @param [String] resource_name The name of the resource to match
|
31
|
+
# @param [RuboCop::AST::Node] node The rubocop ast node to search
|
32
|
+
#
|
33
|
+
# @yield
|
34
|
+
#
|
35
|
+
def match_resource_type?(resource_name, node)
|
36
|
+
return unless looks_like_resource?(node)
|
37
|
+
# bail out if we're not in the resource we care about or nil was passed (all resources)
|
38
|
+
yield(node) if node.children.first.method?(resource_name.to_sym)
|
39
|
+
end
|
40
|
+
|
41
|
+
# Match particular properties within a resource
|
42
|
+
#
|
43
|
+
# @param [Symbol, Array<Symbol>] resource_names The name of the resources to match
|
44
|
+
# @param [String] property_names The name of the property to match (or action)
|
45
|
+
# @param [RuboCop::AST::Node] node The rubocop ast node to search
|
46
|
+
#
|
47
|
+
# @yield
|
48
|
+
#
|
49
|
+
def match_property_in_resource?(resource_names, property_names, node)
|
50
|
+
return unless looks_like_resource?(node)
|
51
|
+
# bail out if we're not in the resource we care about or nil was passed (all resources)
|
52
|
+
return unless resource_names.nil? || Array(resource_names).include?(node.children.first.method_name) # see if we're in the right resource
|
53
|
+
|
54
|
+
resource_block = node.children[2] # the 3rd child is the actual block in the resource
|
55
|
+
return unless resource_block # nil would be an empty block
|
56
|
+
|
57
|
+
if resource_block.begin_type? # if begin_type we need to iterate over the children
|
58
|
+
resource_block.children.each do |resource_blk_child|
|
59
|
+
extract_send_types(resource_blk_child) do |p|
|
60
|
+
yield(p) if symbolized_property_types(property_names).include?(p.method_name)
|
61
|
+
end
|
62
|
+
end
|
63
|
+
else # there's only a single property to check
|
64
|
+
extract_send_types(resource_block) do |p|
|
65
|
+
yield(p) if symbolized_property_types(property_names).include?(p.method_name)
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
def method_arg_ast_to_string(ast)
|
71
|
+
# a property without a value. This is totally bogus, but they exist
|
72
|
+
return if ast.children[2].nil?
|
73
|
+
# https://rubular.com/r/6uzOMd6WCHewOu
|
74
|
+
m = ast.children[2].source.match(/^("|')(.*)("|')$/)
|
75
|
+
m[2] unless m.nil?
|
76
|
+
end
|
77
|
+
|
78
|
+
private
|
79
|
+
|
80
|
+
# @param [String, Array] property
|
81
|
+
#
|
82
|
+
# @return [Array]
|
83
|
+
def symbolized_property_types(property)
|
84
|
+
Array(property).map(&:to_sym)
|
85
|
+
end
|
86
|
+
|
87
|
+
#
|
88
|
+
# given a node object does it look like a chef resource or not?
|
89
|
+
# warning: currently this requires a resource with properties since we key off blocks and property-less resources look like methods
|
90
|
+
#
|
91
|
+
# @param [RuboCop::AST::Node] node AST object to test
|
92
|
+
#
|
93
|
+
# @return [boolean]
|
94
|
+
#
|
95
|
+
def looks_like_resource?(node)
|
96
|
+
return false unless node.block_type? # resources are blocks if they have properties
|
97
|
+
return false unless node.children.first.receiver.nil? # resource blocks don't have a receiver
|
98
|
+
return false if node.send_node.arguments.first.is_a?(RuboCop::AST::SymbolNode) # resources have a string name. resource actions have symbols
|
99
|
+
|
100
|
+
# bail if the block doesn't have a name a resource *generally* has a name.
|
101
|
+
# This isn't 100% true with things like apt_update and build_essential, but we'll live
|
102
|
+
# with that for now to avoid the false positives of getting stuck in generic blocks in resources
|
103
|
+
return false if node.children.first.arguments.empty?
|
104
|
+
|
105
|
+
# if we made it this far we're probably in a resource
|
106
|
+
true
|
107
|
+
end
|
108
|
+
|
109
|
+
def extract_send_types(node)
|
110
|
+
return if node.nil? # there are cases we can be passed an empty node
|
111
|
+
case node.type
|
112
|
+
when :send
|
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)
|
116
|
+
when :while
|
117
|
+
extract_send_types(node.body) { |t| yield(t) }
|
118
|
+
when :if
|
119
|
+
node.branches.each { |n| extract_send_types(n) { |t| yield(t) } }
|
120
|
+
when :case
|
121
|
+
node.when_branches.each { |n| extract_send_types(n.body) { |t| yield(t) } } # unless node.when_branches.nil?
|
122
|
+
extract_send_types(node.else_branch) { |t| yield(t) } if node.else_branch
|
123
|
+
end
|
124
|
+
end
|
125
|
+
end
|
126
|
+
end
|
127
|
+
end
|
@@ -1,76 +1,76 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module RuboCop
|
4
|
-
module Chef
|
5
|
-
# Mixin for cops that skips non-cookbook files
|
6
|
-
#
|
7
|
-
# The criteria for whether cookstyle analyzes a certain ruby file
|
8
|
-
# is configured via `AllCops/Chef`. For example, if you want to
|
9
|
-
# customize your project to scan all files within a `test/` directory
|
10
|
-
# then you could add this to your configuration:
|
11
|
-
#
|
12
|
-
# @example configuring analyzed paths
|
13
|
-
#
|
14
|
-
# AllCops:
|
15
|
-
# Chef:
|
16
|
-
# Patterns:
|
17
|
-
# - '_spec.rb$'
|
18
|
-
# - '(?:^|/)spec/'
|
19
|
-
#
|
20
|
-
module CookbookOnly
|
21
|
-
DEFAULT_CONFIGURATION = CONFIG.fetch('AllCops')
|
22
|
-
COOKBOOK_SEGMENTS = %w(attributes definitions libraries metadata providers recipes resources).freeze
|
23
|
-
|
24
|
-
def relevant_file?(file)
|
25
|
-
cookbook_pattern =~ file && super
|
26
|
-
end
|
27
|
-
|
28
|
-
private
|
29
|
-
|
30
|
-
def cookbook_pattern
|
31
|
-
patterns = []
|
32
|
-
COOKBOOK_SEGMENTS.each do |segment|
|
33
|
-
next unless self.class.cookbook_only_segments[segment.to_sym]
|
34
|
-
|
35
|
-
cookbook_pattern_config(segment).each do |pattern|
|
36
|
-
patterns << Regexp.new(pattern)
|
37
|
-
end
|
38
|
-
end
|
39
|
-
Regexp.union(patterns)
|
40
|
-
end
|
41
|
-
|
42
|
-
def cookbook_pattern_config(segment)
|
43
|
-
config_key = "Chef#{segment.capitalize}"
|
44
|
-
config
|
45
|
-
.for_all_cops
|
46
|
-
.fetch(config_key, DEFAULT_CONFIGURATION.fetch(config_key))
|
47
|
-
.fetch('Patterns')
|
48
|
-
end
|
49
|
-
|
50
|
-
module ClassMethods
|
51
|
-
attr_writer :cookbook_only_segments
|
52
|
-
|
53
|
-
def cookbook_only_segments
|
54
|
-
@cookbook_only_segments || Hash.new(true)
|
55
|
-
end
|
56
|
-
|
57
|
-
def included(klass)
|
58
|
-
super
|
59
|
-
klass.extend(ClassMethods)
|
60
|
-
end
|
61
|
-
end
|
62
|
-
|
63
|
-
extend ClassMethods
|
64
|
-
end
|
65
|
-
|
66
|
-
def self.CookbookOnly(segments)
|
67
|
-
Module.new do |mod|
|
68
|
-
mod.define_singleton_method(:included) do |klass|
|
69
|
-
super(klass)
|
70
|
-
klass.include(CookbookOnly)
|
71
|
-
klass.cookbook_only_segments = segments
|
72
|
-
end
|
73
|
-
end
|
74
|
-
end
|
75
|
-
end
|
76
|
-
end
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RuboCop
|
4
|
+
module Chef
|
5
|
+
# Mixin for cops that skips non-cookbook files
|
6
|
+
#
|
7
|
+
# The criteria for whether cookstyle analyzes a certain ruby file
|
8
|
+
# is configured via `AllCops/Chef`. For example, if you want to
|
9
|
+
# customize your project to scan all files within a `test/` directory
|
10
|
+
# then you could add this to your configuration:
|
11
|
+
#
|
12
|
+
# @example configuring analyzed paths
|
13
|
+
#
|
14
|
+
# AllCops:
|
15
|
+
# Chef:
|
16
|
+
# Patterns:
|
17
|
+
# - '_spec.rb$'
|
18
|
+
# - '(?:^|/)spec/'
|
19
|
+
#
|
20
|
+
module CookbookOnly
|
21
|
+
DEFAULT_CONFIGURATION = CONFIG.fetch('AllCops')
|
22
|
+
COOKBOOK_SEGMENTS = %w(attributes definitions libraries metadata providers recipes resources).freeze
|
23
|
+
|
24
|
+
def relevant_file?(file)
|
25
|
+
cookbook_pattern =~ file && super
|
26
|
+
end
|
27
|
+
|
28
|
+
private
|
29
|
+
|
30
|
+
def cookbook_pattern
|
31
|
+
patterns = []
|
32
|
+
COOKBOOK_SEGMENTS.each do |segment|
|
33
|
+
next unless self.class.cookbook_only_segments[segment.to_sym]
|
34
|
+
|
35
|
+
cookbook_pattern_config(segment).each do |pattern|
|
36
|
+
patterns << Regexp.new(pattern)
|
37
|
+
end
|
38
|
+
end
|
39
|
+
Regexp.union(patterns)
|
40
|
+
end
|
41
|
+
|
42
|
+
def cookbook_pattern_config(segment)
|
43
|
+
config_key = "Chef#{segment.capitalize}"
|
44
|
+
config
|
45
|
+
.for_all_cops
|
46
|
+
.fetch(config_key, DEFAULT_CONFIGURATION.fetch(config_key))
|
47
|
+
.fetch('Patterns')
|
48
|
+
end
|
49
|
+
|
50
|
+
module ClassMethods
|
51
|
+
attr_writer :cookbook_only_segments
|
52
|
+
|
53
|
+
def cookbook_only_segments
|
54
|
+
@cookbook_only_segments || Hash.new(true)
|
55
|
+
end
|
56
|
+
|
57
|
+
def included(klass)
|
58
|
+
super
|
59
|
+
klass.extend(ClassMethods)
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
extend ClassMethods
|
64
|
+
end
|
65
|
+
|
66
|
+
def self.CookbookOnly(segments)
|
67
|
+
Module.new do |mod|
|
68
|
+
mod.define_singleton_method(:included) do |klass|
|
69
|
+
super(klass)
|
70
|
+
klass.include(CookbookOnly)
|
71
|
+
klass.cookbook_only_segments = segments
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|