class FactoryBot::Definition
@api private
Attributes
Public Class Methods
Source
# File lib/factory_bot/definition.rb, line 7 def initialize(name, base_traits = [], **opts) @name = name @uri_manager = opts[:uri_manager] @declarations = DeclarationList.new(name) @callbacks = [] @defined_traits = Set.new @registered_enums = [] @to_create = nil @base_traits = base_traits @additional_traits = [] @constructor = nil @attributes = nil @compiled = false @expanded_enum_traits = false end
Public Instance Methods
Source
# File lib/factory_bot/definition.rb, line 87 def add_callback(callback) @callbacks << callback end
Source
# File lib/factory_bot/definition.rb, line 115 def after(*names, &block) callback(*names.map { |name| "after_#{name}" }, &block) end
Source
# File lib/factory_bot/definition.rb, line 83 def append_traits(new_traits) @additional_traits += new_traits end
Source
# File lib/factory_bot/definition.rb, line 25 def attributes @attributes ||= AttributeList.new.tap do |attribute_list| attribute_lists = aggregate_from_traits_and_self(:attributes) { declarations.attributes } attribute_lists.each do |attributes| attribute_list.apply_attributes attributes end end end
Source
# File lib/factory_bot/definition.rb, line 111 def before(*names, &block) callback(*names.map { |name| "before_#{name}" }, &block) end
Source
# File lib/factory_bot/definition.rb, line 119 def callback(*names, &block) names.each do |name| add_callback(Callback.new(name, block)) end end
Source
# File lib/factory_bot/definition.rb, line 46 def callbacks aggregate_from_traits_and_self(:callbacks) { @callbacks } end
Source
# File lib/factory_bot/definition.rb, line 50 def compile(klass = nil) unless @compiled expand_enum_traits(klass) unless klass.nil? declarations.attributes self.klass ||= klass defined_traits.each do |defined_trait| defined_trait.klass ||= klass base_traits.each { |bt| bt.define_trait defined_trait } additional_traits.each { |at| at.define_trait defined_trait } end @compiled = true ActiveSupport::Notifications.instrument "factory_bot.compile_factory", { name: name, attributes: declarations.attributes, traits: defined_traits, class: klass || self.klass } end end
Source
# File lib/factory_bot/definition.rb, line 42 def constructor aggregate_from_traits_and_self(:constructor) { @constructor }.last end
Source
# File lib/factory_bot/definition.rb, line 107 def define_constructor(&block) @constructor = block end
Source
# File lib/factory_bot/definition.rb, line 95 def define_trait(trait) @defined_traits.add(trait) end
Source
# File lib/factory_bot/definition.rb, line 99 def defined_traits_names @defined_traits.map(&:name) end
Source
# File lib/factory_bot/definition.rb, line 79 def inherit_traits(new_traits) @base_traits += new_traits end
Source
# File lib/factory_bot/definition.rb, line 74 def overridable declarations.overridable self end
Source
# File lib/factory_bot/definition.rb, line 103 def register_enum(enum) @registered_enums << enum end
Source
# File lib/factory_bot/definition.rb, line 91 def skip_create @to_create = ->(instance) {} end
Source
# File lib/factory_bot/definition.rb, line 34 def to_create(&block) if block @to_create = block else aggregate_from_traits_and_self(:to_create) { @to_create }.last end end
Private Instance Methods
Source
# File lib/factory_bot/definition.rb, line 156 def additional_traits @additional_traits.map { |name| trait_by_name(name) } end
Source
# File lib/factory_bot/definition.rb, line 176 def aggregate_from_traits_and_self(method_name, &block) compile [ base_traits.map(&method_name), instance_exec(&block), additional_traits.map(&method_name) ].flatten.compact end
Source
# File lib/factory_bot/definition.rb, line 201 def automatically_register_defined_enums(klass) klass.defined_enums.each_key { |name| register_enum(Enum.new(name)) } end
Source
# File lib/factory_bot/definition.rb, line 205 def automatically_register_defined_enums?(klass) FactoryBot.automatically_define_enum_traits && klass.respond_to?(:defined_enums) end
Source
# File lib/factory_bot/definition.rb, line 127 def base_traits @base_traits.map { |name| trait_by_name(name) } rescue KeyError => error raise error_with_definition_name(error) end
Source
# File lib/factory_bot/definition.rb, line 136 def error_with_definition_name(error) message = error.message + " referenced within \"#{name}\" definition" error.class.new(message, key: error.key, receiver: error.receiver) .tap { |new_error| new_error.set_backtrace(error.backtrace) } end
Source
# File lib/factory_bot/definition.rb, line 186 def expand_enum_traits(klass) return if @expanded_enum_traits if automatically_register_defined_enums?(klass) automatically_register_defined_enums(klass) end registered_enums.each do |enum| traits = enum.build_traits(klass) traits.each { |trait| define_trait(trait) } end @expanded_enum_traits = true end
Source
# File lib/factory_bot/definition.rb, line 169 def initialize_copy(source) super @attributes = nil @compiled = false @defined_traits_by_name = nil end
Calls superclass method
Source
# File lib/factory_bot/definition.rb, line 160 def trait_by_name(name) trait_for(name) || Internal.trait_by_name(name, klass) end
Source
# File lib/factory_bot/definition.rb, line 164 def trait_for(name) @defined_traits_by_name ||= defined_traits.each_with_object({}) { |t, memo| memo[t.name] ||= t } @defined_traits_by_name[name.to_s] end