class Packwerk::AssociationInspector

Extracts the implicit constant reference from an active record association

Constants

CustomAssociations
RAILS_ASSOCIATIONS

Public Class Methods

new(inflector:, custom_associations: Set.new) click to toggle source
# File lib/packwerk/association_inspector.rb, line 23
def initialize(inflector:, custom_associations: Set.new)
  @inflector = inflector
  @associations = T.let(RAILS_ASSOCIATIONS + custom_associations, CustomAssociations)
end

Public Instance Methods

constant_name_from_node(node, ancestors:) click to toggle source
# File lib/packwerk/association_inspector.rb, line 33
def constant_name_from_node(node, ancestors:)
  return unless Node.method_call?(node)
  return unless association?(node)

  arguments = Node.method_arguments(node)
  return unless (association_name = association_name(arguments))

  if (class_name_node = custom_class_name(arguments))
    return unless Node.string?(class_name_node)
    Node.literal_value(class_name_node)
  else
    @inflector.classify(association_name.to_s)
  end
end

Private Instance Methods

association?(node) click to toggle source
# File lib/packwerk/association_inspector.rb, line 51
def association?(node)
  method_name = Node.method_name(node)
  @associations.include?(method_name)
end
association_name(arguments) click to toggle source
# File lib/packwerk/association_inspector.rb, line 65
def association_name(arguments)
  return unless Node.symbol?(arguments[0])

  Node.literal_value(arguments[0])
end
custom_class_name(arguments) click to toggle source
# File lib/packwerk/association_inspector.rb, line 57
def custom_class_name(arguments)
  association_options = arguments.detect { |n| Node.hash?(n) }
  return unless association_options

  Node.value_from_hash(association_options, :class_name)
end