class RuboCop::Cop::RSpec::LeadingSubject


it { expect_something_else }
it { expect_something }
subject { described_class.new(params) }
# good
before { do_something }
subject { described_class.new(params) }
# good
let(:params) { blah }
subject { described_class.new(params) }
# good
it { expect_something_else }
subject { described_class.new(params) }
it { expect_something }
subject { described_class.new(params) }
before { do_something }
subject { described_class.new(params) }
let(:params) { blah }
# bad
@example
Enforce that subject is the first definition in the test.

def autocorrect(node)

def autocorrect(node)
  lambda do |corrector|
    first_node = find_first_offending_node(node)
    RuboCop::RSpec::Corrector::MoveNode.new(
      node, corrector, processed_source
    ).move_before(first_node)
  end
end

def check_previous_nodes(node)

def check_previous_nodes(node)
  node.parent.each_child_node do |sibling|
    if offending?(sibling)
      add_offense(
        node,
        message: format(MSG, offending: sibling.method_name)
      )
    end
    break if offending?(sibling) || sibling.equal?(node)
  end
end

def find_first_offending_node(node)

def find_first_offending_node(node)
  node.parent.children.find { |sibling| offending?(sibling) }
end

def in_spec_block?(node)

def in_spec_block?(node)
  node.each_ancestor(:block).any? do |ancestor|
    example?(ancestor)
  end
end

def offending?(node)

def offending?(node)
  let?(node) || hook?(node) || example?(node)
end

def on_block(node)

def on_block(node)
  return unless subject?(node) && !in_spec_block?(node)
  check_previous_nodes(node)
end