Cookstyle 6.0.19 released with 9 new Chef cops!

Hi everyone,

It's time to release this years major version release of Cookstyle. This version introduces 9 new Chef cops, updates the underlying RuboCop engine, enabled several new Ruby cops, and changes how ChefDeprecation department cops alert.

RuboCop 0.80.1 Engine

The RuboCop engine that powers Cookstyle has been updated from 0.75.1 to 0.80.1. This new engine includes hundreds of bug fixes and new features that will allow us to write even more advanced Cookstyle cops in the future. This release also renames many of RuboCop's built-in cops so if you have a complex rubocop.yml file that disables or enables rules, you may see warnings instructing you to update your config.

ChefDeprecation Cops At Warning Level

All ChefDeprecation department cops now alert at Warning level instead of Refactor. This means that these cops will now result in Cookstyle exiting with a -1 exit code, which will cause failures in CI tests. ChefDeprecation cops are important to resolve and we believe this will the use of the latest Chef Infra coding standards.

9 New Cops


The ChefDeprecations/DeprecatedWindowsVersionCheck cop detects cookbooks that use the legacy older_than_win_2012_or_8? helper method. Chef Infra Client no longer supports Windows releases before 8 / 2012. Those releases are end of life so this check can be removed from cookbooks.


The ChefDeprecations/ChefWindowsPlatformHelper cop detects cookbooks that use the deprecated helper to see if a system is running on Windows instead of using platform?('windows') or the new windows? helper.


The ChefDeprecations/LogResourceNotifications cop detects notifications in the log resource. Beginning in Chef Infra Client 16, the log resource will no longer trigger an update, so these notifications will never fire. This will create problems for users who concatenate notifications from multiple resources into a single log resource so that those notifications only fire a single time. For example, many resource updates in your cookbook may require a service to restart, but a user may only want to trigger that service to restart once. Chef Infra Client 15.8 and later ships with a notify_group resource specifically for aggregating notifications in this way. This resource should be used instead.

Aggregating Notifications with a log resource
template '/etc/foo' do
  source 'bar.erb'
  notifies :write, 'log[Aggregate notifications using a single log resource]', :immediately

log 'Aggregate notifications using a single log resource' do
  notifies :restart, 'service[foo]', :delayed
Aggregating Notifications with a notify_group resource
template '/etc/foo' do
  source 'bar.erb'
  notifies :run, 'notify_group[Aggregate notifications using a single notify_group resource]', :immediately

notify_group 'Aggregate notifications using a single notify_group resource' do
  notifies :restart, 'service[foo]', :delayed


The ChefDeprecations/ResourceWithoutNameOrProvides cop checks for legacy HWRP-style resources that do not set either resource_name or provides. These attributes are required by Chef Infra Client 16 and later.


The ChefCorrectness/ChefApplicationFatal cop detects cookbooks that use Chef::Application.fatal! to raise a failure during a Chef Infra Client run. When an error needs to be presented to a user, raise should be used instead as it provides the full stack trace to make debugging significantly easier.


The ChefCorrectness/PowershellScriptDeleteFile cop detects using a powershell_script resource to delete a file. This should be accomplished by using the file resource with the :delete action instead. The file resource offers a simpler syntax and full idempotency.


The ChefModernize/UseMultipackageInstalls cop detects cookbooks that use Ruby loops to install multiple packages using multiple package resources. When using a package provider that supports multi-package installs you can pass an array of packages to install to a single package resource. Passing multiple packages to a single package resource greatly simplifies the log output and is significantly faster. Multi-package installs are available for package installs using apt, dnf, yum, snap, dpkg, deb, and Chocolatey package management systems.


The ChefModernize/ProvidesFromInitialize cop detects legacy HWRP-style resources that set the provides name in an intialize method instead of using the provides method in the resource DSL.


The ChefModernize/DatabagHelpers cop detects cookbooks that load data bags with Chef::DataBagItem.load or Chef::EncryptedDataBagItem.load instead of the simpler data_bag_item helper.

Other Changes

  • ChefStyle/UnnecessaryOSCheck is now enabled by default. This was disabled by mistake previously.
  • Lint/SendWithMixinArgument is now enabled by default. This code simplifies how libraries are included in recipes and resources.
  • Naming/PredicateName is no longer enabled by default. The naming of methods and names doesn't impact the execution of the code, and without autocorrection any warnings required significant effort to resolve.
  • Style/MultilineWhenThen is now enabled by default. This cop simplifies case statements.
  • Style/HashEachMethod is now enabled by default. This cop detects and autocorrects overly complex code against hashes that can be simplified.
  • ChefRedundant/UnnecessaryNameProperty now detects unnecessary :Name attributes as well as properties.
  • ChefModernize/DefaultActionFromInitialize has been improved to detect more forms of default actions set in intializers.
  • ChefCorrectness/DnfPackageAllowDowngrades now supports autocorrection.
  • ChefModernize/WindowsRegistryUAC now detects additional registry key forms used to set UAC settings.
  • ChefModernize/PowerShellGuardInterpreter now also detects if the PowerShell guard is set in batch resources