class RuboCop::Cop::Chef::Deprecations::HWRPWithoutProvides

Chef Infra Client 16 and later a legacy HWRP resource must use `provides` to define how the resource is called in recipes or other resources. To maintain compatibility with Chef Infra Client < 16 use both `resource_name` and `provides`.

@example

 #### incorrect
 class Chef
   class Resource
     class UlimitRule < Chef::Resource
       property :type, [Symbol, String], required: true
       property :item, [Symbol, String], required: true

       # additional resource code
     end
   end
 end

 #### incorrect
 class Chef
   class Resource
     class UlimitRule < Chef::Resource
       resource_name :ulimit_rule

       property :type, [Symbol, String], required: true
       property :item, [Symbol, String], required: true

       # additional resource code
     end
   end
 end

#### correct when Chef Infra Client < 15 (but compatible with 16+ as well)
 class Chef
   class Resource
     class UlimitRule < Chef::Resource
       resource_name :ulimit_rule
       provides :ulimit_rule

       property :type, [Symbol, String], required: true
       property :item, [Symbol, String], required: true

       # additional resource code
     end
   end
 end

#### correct when Chef Infra Client 16+
 class Chef
   class Resource
     class UlimitRule < Chef::Resource
       provides :ulimit_rule

       property :type, [Symbol, String], required: true
       property :item, [Symbol, String], required: true

       # additional resource code
     end
   end
 end

# better
Convert your legacy HWRPs to custom resources

Constants

MSG

Public Instance Methods

has_provides?() click to toggle source
# File lib/rubocop/cop/chef/deprecation/hwrp_without_provides.rb, line 118
def has_provides?
  provides_ast = provides(processed_source.ast)
  return false if provides_ast.count == 0

  resource_ast = resource_name(processed_source.ast)

  if resource_ast.count == 0
    true # no resource_name, but provides
  else
    # since we have a resource and provides make sure the there is a provides that
    # matches the resource name
    provides_ast.include?(resource_ast.first)
  end
end
indentation(node) click to toggle source
# File lib/rubocop/cop/chef/deprecation/hwrp_without_provides.rb, line 133
def indentation(node)
  node.source_range.source_line =~ /\S/
end
on_class(node) click to toggle source
# File lib/rubocop/cop/chef/deprecation/hwrp_without_provides.rb, line 105
def on_class(node)
  return if has_provides?
  HWRP?(node) do |inherit|
    add_offense(inherit, message: MSG, severity: :warning) do |corrector|
      resource_name_ast(node) do |ast_match|
        # build a new string to add after that includes the new line and the proper indentation
        new_string = "\n" + ast_match.source.dup.gsub('resource_name', 'provides').prepend(' ' * indentation(ast_match))
        corrector.insert_after(ast_match.source_range, new_string)
      end
    end
  end
end