class FactoryBot::AttributeAssigner

@api private

Public Class Methods

new(evaluator, build_class, &instance_builder) click to toggle source
# File lib/factory_bot/attribute_assigner.rb, line 4
def initialize(evaluator, build_class, &instance_builder)
  @build_class = build_class
  @instance_builder = instance_builder
  @evaluator = evaluator
  @attribute_list = evaluator.class.attribute_list
  @attribute_names_assigned = []
end

Public Instance Methods

hash() click to toggle source
# File lib/factory_bot/attribute_assigner.rb, line 22
def hash
  @evaluator.instance = build_hash

  attributes_to_set_on_hash.each_with_object({}) do |attribute, result|
    result[attribute] = get(attribute)
  end
end
object() click to toggle source
# File lib/factory_bot/attribute_assigner.rb, line 12
def object
  @evaluator.instance = build_class_instance
  build_class_instance.tap do |instance|
    attributes_to_set_on_instance.each do |attribute|
      instance.public_send("#{attribute}=", get(attribute))
      @attribute_names_assigned << attribute
    end
  end
end

Private Instance Methods

alias_names_to_ignore() click to toggle source
# File lib/factory_bot/attribute_assigner.rb, line 98
def alias_names_to_ignore
  @attribute_list.non_ignored.flat_map { |attribute|
    override_names.map do |override|
      attribute.name if ignorable_alias?(attribute, override)
    end
  }.compact
end
association_names() click to toggle source
# File lib/factory_bot/attribute_assigner.rb, line 86
def association_names
  @attribute_list.associations.names
end
attribute_names_to_assign() click to toggle source
# File lib/factory_bot/attribute_assigner.rb, line 70
def attribute_names_to_assign
  @attribute_names_to_assign ||=
    non_ignored_attribute_names +
    override_names -
    ignored_attribute_names -
    alias_names_to_ignore
end
attributes_to_set_on_hash() click to toggle source
# File lib/factory_bot/attribute_assigner.rb, line 66
def attributes_to_set_on_hash
  attribute_names_to_assign - association_names
end
attributes_to_set_on_instance() click to toggle source
# File lib/factory_bot/attribute_assigner.rb, line 62
def attributes_to_set_on_instance
  (attribute_names_to_assign - @attribute_names_assigned - methods_invoked_on_evaluator).uniq
end
build_class_instance() click to toggle source
# File lib/factory_bot/attribute_assigner.rb, line 50
def build_class_instance
  @build_class_instance ||= method_tracking_evaluator.instance_exec(&@instance_builder)
end
build_hash() click to toggle source
# File lib/factory_bot/attribute_assigner.rb, line 54
def build_hash
  @build_hash ||= NullObject.new(hash_instance_methods_to_respond_to)
end
decorated_evaluator() click to toggle source
# File lib/factory_bot/attribute_assigner.rb, line 39
def decorated_evaluator
  Decorator::NewConstructor.new(
    Decorator::InvocationTracker.new(@evaluator),
    @build_class
  )
end
get(attribute_name) click to toggle source
# File lib/factory_bot/attribute_assigner.rb, line 58
def get(attribute_name)
  @evaluator.send(attribute_name)
end
hash_instance_methods_to_respond_to() click to toggle source
# File lib/factory_bot/attribute_assigner.rb, line 94
def hash_instance_methods_to_respond_to
  @attribute_list.names + override_names + @build_class.instance_methods
end
ignorable_alias?(attribute, override) click to toggle source
# File lib/factory_bot/attribute_assigner.rb, line 106
def ignorable_alias?(attribute, override)
  attribute.alias_for?(override) &&
    attribute.name != override &&
    !ignored_attribute_names.include?(override)
end
ignored_attribute_names() click to toggle source
# File lib/factory_bot/attribute_assigner.rb, line 82
def ignored_attribute_names
  @attribute_list.ignored.names
end
method_tracking_evaluator() click to toggle source
# File lib/factory_bot/attribute_assigner.rb, line 32
def method_tracking_evaluator
  @method_tracking_evaluator ||= Decorator::AttributeHash.new(
    decorated_evaluator,
    attribute_names_to_assign
  )
end
methods_invoked_on_evaluator() click to toggle source
# File lib/factory_bot/attribute_assigner.rb, line 46
def methods_invoked_on_evaluator
  method_tracking_evaluator.__invoked_methods__
end
non_ignored_attribute_names() click to toggle source
# File lib/factory_bot/attribute_assigner.rb, line 78
def non_ignored_attribute_names
  @attribute_list.non_ignored.names
end
override_names() click to toggle source
# File lib/factory_bot/attribute_assigner.rb, line 90
def override_names
  @evaluator.__override_names__
end