Class: FactoryBot::Factory Private

Inherits:
Object
  • Object
show all
Defined in:
lib/factory_bot/factory.rb

This class is part of a private API. You should avoid using this class if possible, as it may be removed or be changed in the future.

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(name, options = {}) ⇒ Factory

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Returns a new instance of Factory.



9
10
11
12
13
14
15
16
17
# 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

Instance Attribute Details

#definitionObject (readonly)

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.



7
8
9
# File 'lib/factory_bot/factory.rb', line 7

def definition
  @definition
end

#nameObject (readonly)

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.



7
8
9
# File 'lib/factory_bot/factory.rb', line 7

def name
  @name
end

Instance Method Details

#associationsObject

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.



52
53
54
# File 'lib/factory_bot/factory.rb', line 52

def associations
  evaluator_class.attribute_list.associations
end

#build_classObject

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.



22
23
24
25
26
27
28
29
30
# File 'lib/factory_bot/factory.rb', line 22

def build_class
  @build_class ||= if class_name.is_a? Class
    class_name
  elsif class_name.to_s.safe_constantize
    class_name.to_s.safe_constantize
  else
    class_name.to_s.camelize.constantize
  end
end

#compileObject

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.



85
86
87
88
89
90
91
92
93
# File 'lib/factory_bot/factory.rb', line 85

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_namesObject

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.



48
49
50
# File 'lib/factory_bot/factory.rb', line 48

def human_names
  names.map { |name| name.to_s.humanize.downcase }
end

#namesObject

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

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


81
82
83
# File 'lib/factory_bot/factory.rb', line 81

def names
  [name] + @aliases
end

#run(build_strategy, overrides, &block) ⇒ Object

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.



32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
# File 'lib/factory_bot/factory.rb', line 32

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)

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

  strategy.result(evaluation).tap(&block)
end

#with_traits(traits) ⇒ Object

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.



95
96
97
98
99
# File 'lib/factory_bot/factory.rb', line 95

def with_traits(traits)
  clone.tap do |factory_with_traits|
    factory_with_traits.append_traits traits
  end
end