class FactoryBot::Factory

@api private

Attributes

definition[R]
name[R]

Public Class Methods

new(name, options = {}) click to toggle source
# File lib/factory_bot/factory.rb, line 9
def initialize(name, options = {})
  assert_valid_options(options)
  @name = name.respond_to?(:to_sym) ? name.to_sym : name.to_s.underscore.to_sym
  @parent = options[:parent]
  @aliases = options[:aliases] || []
  @class_name = options[:class]
  @definition = Definition.new(@name, options[:traits] || [])
  @compiled = false
end

Public Instance Methods

associations() click to toggle source
# File lib/factory_bot/factory.rb, line 50
def associations
  evaluator_class.attribute_list.associations
end
build_class() click to toggle source
# File lib/factory_bot/factory.rb, line 22
def build_class
  @build_class ||= if class_name.is_a? Class
    class_name
  else
    class_name.to_s.camelize.constantize
  end
end
compile() click to toggle source
# File lib/factory_bot/factory.rb, line 83
def compile
  unless @compiled
    parent.compile
    parent.defined_traits.each { |trait| define_trait(trait) }
    @definition.compile(build_class)
    build_hierarchy
    @compiled = true
  end
end
human_names() click to toggle source
# File lib/factory_bot/factory.rb, line 46
def human_names
  names.map { |name| name.to_s.humanize.downcase }
end
names() click to toggle source

Names for this factory, including aliases.

Example:

factory :user, aliases: [:author] do
  # ...
end

FactoryBot.create(:author).class
# => User

Because an attribute defined without a value or block will build an association with the same name, this allows associations to be defined without factories, such as:

factory :user, aliases: [:author] do
  # ...
end

factory :post do
  author
end

FactoryBot.create(:post).author.class
# => User
# File lib/factory_bot/factory.rb, line 79
def names
  [name] + @aliases
end
run(build_strategy, overrides, &block) click to toggle source
# File lib/factory_bot/factory.rb, line 30
def run(build_strategy, overrides, &block)
  block ||= ->(result) { result }
  compile

  strategy = StrategyCalculator.new(build_strategy).strategy.new

  evaluator = evaluator_class.new(strategy, overrides.symbolize_keys)
  attribute_assigner = AttributeAssigner.new(evaluator, build_class, &compiled_constructor)

  evaluation =
    Evaluation.new(evaluator, attribute_assigner, compiled_to_create)
  evaluation.add_observer(CallbacksObserver.new(callbacks, evaluator))

  strategy.result(evaluation).tap(&block)
end
with_traits(traits) click to toggle source
# File lib/factory_bot/factory.rb, line 93
def with_traits(traits)
  clone.tap do |factory_with_traits|
    factory_with_traits.append_traits traits
  end
end

Protected Instance Methods

attributes() click to toggle source
# File lib/factory_bot/factory.rb, line 109
def attributes
  compile
  AttributeList.new(@name).tap do |list|
    list.apply_attributes definition.attributes
  end
end
build_hierarchy() click to toggle source
# File lib/factory_bot/factory.rb, line 124
def build_hierarchy
  hierarchy_class.build_from_definition definition
end
callbacks() click to toggle source
# File lib/factory_bot/factory.rb, line 128
def callbacks
  hierarchy_instance.callbacks
end
class_name() click to toggle source
# File lib/factory_bot/factory.rb, line 101
def class_name
  @class_name || parent.class_name || name
end
compiled_constructor() click to toggle source
# File lib/factory_bot/factory.rb, line 136
def compiled_constructor
  hierarchy_instance.constructor
end
compiled_to_create() click to toggle source
# File lib/factory_bot/factory.rb, line 132
def compiled_to_create
  hierarchy_instance.to_create
end
evaluator_class() click to toggle source
# File lib/factory_bot/factory.rb, line 105
def evaluator_class
  @evaluator_class ||= EvaluatorClassDefiner.new(attributes, parent.evaluator_class).evaluator_class
end
hierarchy_class() click to toggle source
# File lib/factory_bot/factory.rb, line 116
def hierarchy_class
  @hierarchy_class ||= Class.new(parent.hierarchy_class)
end
hierarchy_instance() click to toggle source
# File lib/factory_bot/factory.rb, line 120
def hierarchy_instance
  @hierarchy_instance ||= hierarchy_class.new
end

Private Instance Methods

assert_valid_options(options) click to toggle source
# File lib/factory_bot/factory.rb, line 142
def assert_valid_options(options)
  options.assert_valid_keys(:class, :parent, :aliases, :traits)
end
initialize_copy(source) click to toggle source
Calls superclass method
# File lib/factory_bot/factory.rb, line 154
def initialize_copy(source)
  super
  @definition = @definition.clone
  @evaluator_class = nil
  @hierarchy_class = nil
  @hierarchy_instance = nil
  @compiled = false
end
parent() click to toggle source
# File lib/factory_bot/factory.rb, line 146
def parent
  if @parent
    FactoryBot::Internal.factory_by_name(@parent)
  else
    NullFactory.new
  end
end