class RuboCop::Cop::RSpec::FactoryBot::AttributeDefinedStatically

count { 1 }
# good
count 1
# bad
closed_at { 1.day.from_now }
# good
closed_at 1.day.from_now
# bad
kind { [:active, :rejected].sample }
# good
kind [:active, :rejected].sample
# bad
@example
Always declare attribute values as blocks.

def attribute_defining_method?(method_name)

def attribute_defining_method?(method_name)
  RuboCop::RSpec::FactoryBot.attribute_defining_methods
    .include?(method_name)
end

def autocorrect(corrector, node)

def autocorrect(corrector, node)
  if node.parenthesized?
    autocorrect_replacing_parens(corrector, node)
  else
    autocorrect_without_parens(corrector, node)
  end
end

def autocorrect_replacing_parens(corrector, node)

def autocorrect_replacing_parens(corrector, node)
  left_braces, right_braces = braces(node)
  corrector.replace(node.location.begin, " #{left_braces}")
  corrector.replace(node.location.end, right_braces)
end

def autocorrect_without_parens(corrector, node)

def autocorrect_without_parens(corrector, node)
  left_braces, right_braces = braces(node)
  argument = node.first_argument
  expression = argument.location.expression
  corrector.insert_before(expression, left_braces)
  corrector.insert_after(expression, right_braces)
end

def braces(node)

def braces(node)
  if value_hash_without_braces?(node.first_argument)
    ['{ { ', ' } }']
  else
    ['{ ', ' }']
  end
end

def offensive_receiver?(receiver, node)

def offensive_receiver?(receiver, node)
  receiver.nil? ||
    receiver.self_type? ||
    receiver_matches_first_block_argument?(receiver, node)
end

def on_block(node)

def on_block(node)
  attributes = factory_attributes(node) || []
  attributes = [attributes] unless attributes.is_a?(Array) # rubocop:disable Style/ArrayCoercion, Lint/RedundantCopDisableDirective
  attributes.each do |attribute|
    next unless offensive_receiver?(attribute.receiver, node)
    next if proc?(attribute) || association?(attribute.first_argument)
    add_offense(attribute) do |corrector|
      autocorrect(corrector, attribute)
    end
  end
end

def proc?(attribute)

def proc?(attribute)
  value_matcher(attribute).to_a.all?(&:block_pass_type?)
end

def receiver_matches_first_block_argument?(receiver, node)

def receiver_matches_first_block_argument?(receiver, node)
  first_block_argument = node.arguments.first
  !first_block_argument.nil? &&
    receiver.lvar_type? &&
    receiver.node_parts == first_block_argument.node_parts
end

def reserved_method?(method_name)

def reserved_method?(method_name)
  RuboCop::RSpec::FactoryBot.reserved_methods.include?(method_name)
end

def value_hash_without_braces?(node)

def value_hash_without_braces?(node)
  node.hash_type? && !node.braces?
end