Class: RuboCop::Cop::Chef::Modernize::AllowedActionsFromInitialize

Inherits:
Base
  • Object
show all
Extended by:
AutoCorrector
Includes:
RangeHelp
Defined in:
lib/rubocop/cop/chef/modernize/allowed_actions_initializer.rb

Overview

The allowed actions can now be specified using the ‘allowed_actions` helper instead of using the @actions or @allowed_actions variables in the resource’s initialize method. In general we recommend against writing HWRPs, but if HWRPs are necessary you should utilize as much of the resource DSL as possible.

Examples:


### incorrect
def initialize(*args)
  super
  @actions = [ :create, :add ]
end

# also bad
def initialize(*args)
  super
  @allowed_actions = [ :create, :add ]
end

### correct
allowed_actions [ :create, :add ]

Constant Summary collapse

MSG =
'The allowed actions of a resource can be set with the "allowed_actions" helper instead of using the initialize method.'

Instance Method Summary collapse

Methods inherited from Base

#target_chef_version

Instance Method Details

#on_def(node) ⇒ Object



47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
# File 'lib/rubocop/cop/chef/modernize/allowed_actions_initializer.rb', line 47

def on_def(node)
  return unless node.method?(:initialize)
  return if node.body.nil? # nil body is an empty initialize method

  node.body.each_node do |x|
    next unless x.assignment? &&
                !x.parent.op_asgn_type? &&
                !x.node_parts.empty? &&
                %i(@actions @allowed_actions).include?(x.node_parts.first)

    add_offense(x, severity: :refactor) do |corrector|
      # insert the new allowed_actions call above the initialize method, but not if one already exists (this is sadly common)
      unless action_methods?(processed_source.ast)
        initialize_node = initialize_method(processed_source.ast).first
        corrector.insert_before(initialize_node.source_range, "allowed_actions #{x.descendants.first.source}\n\n")
      end

      # remove the variable from the initialize method
      corrector.remove(range_with_surrounding_space(range: x.loc.expression, side: :left))
    end
  end
end