class RuboCop::Cop::Chef::Modernize::UseMultipackageInstalls

Pass an array of packages to package resources instead of iterating over an array of packages when using multi-package capable package subsystem such as apt, yum, chocolatey, dnf, or zypper. Multi-package installs are faster and simplify logs.

@example

#### incorrect
%w(bmon htop vim curl).each do |pkg|
  package pkg do
    action :install
  end
end

#### correct
package %w(bmon htop vim curl)

Constants

MSG
MULTIPACKAGE_PLATS

Public Instance Methods

multipackage_platforms?(condition_obj) click to toggle source

see if all platforms in the when condition are multi-package compliant

# File lib/rubocop/cop/chef/modernize/use_multipackage_installs.rb, line 79
def multipackage_platforms?(condition_obj)
  condition_obj.all? do |p|
    # make sure it's a string (not a regex) and it's in the array
    p.str_type? && MULTIPACKAGE_PLATS.include?(p.value)
  end
end
on_if(node) click to toggle source
# File lib/rubocop/cop/chef/modernize/use_multipackage_installs.rb, line 98
def on_if(node)
  platform_helper?(node) do |plats, blk, _pkgs|
    return unless multipackage_platforms?(plats)

    add_offense(blk, message: MSG, severity: :refactor) do |corrector|
      package_array_install(blk) do |install_block, pkgs|
        corrector.replace(install_block, "package #{pkgs.source}")
      end
    end
  end
end
on_when(node) click to toggle source
# File lib/rubocop/cop/chef/modernize/use_multipackage_installs.rb, line 86
def on_when(node)
  return unless platform_or_platform_family?(node.parent.condition) &&
                multipackage_platforms?(node.conditions)
  return if node.body.nil? # don't blow up on empty whens

  package_array_install(node.body) do |install_block, pkgs|
    add_offense(install_block, message: MSG, severity: :refactor) do |corrector|
      corrector.replace(install_block, "package #{pkgs.source}")
    end
  end
end