Module: MR::Factory::WithAssociationsConfig::InstanceMethods

Defined in:
lib/mr/factory/config.rb

Instance Method Summary collapse

Instance Method Details

#add_association_factory(association_name, factory, options = nil) ⇒ Object



149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
# File 'lib/mr/factory/config.rb', line 149

def add_association_factory(association_name, factory, options = nil)
  reflection = self.record_class.reflect_on_association(association_name)
  if reflection.nil?
    raise NoAssociationError, "there is no #{association_name.inspect} " \
                              "association for #{self.record_class.inspect}"
  end

  options ||= {}
  if options[:force_in_stack]
    (self.force_in_stack_association_names << association_name).uniq!
  end

  add_default_factory(factory.record_class, factory)

  # for polymorphic associations add a lookup with no associated record
  # class, this will allow a polymorphic association without their foreign
  # type attribute set to use the configured factories for the association
  if reflection.options[:polymorphic]
    key = AssociationFactoriesKey.new(association_name)
    add_association_factory_by_key(key, factory)
  end

  key = AssociationFactoriesKey.new(association_name, factory.record_class)
  add_association_factory_by_key(key, factory)
end

#ar_association_for(object, name) ⇒ Object

Raises:

  • (NotImplementedError)


175
176
177
# File 'lib/mr/factory/config.rb', line 175

def ar_association_for(object, name)
  raise NotImplementedError
end

#association_factoriesObject



122
123
124
# File 'lib/mr/factory/config.rb', line 122

def association_factories
  @association_factories ||= {}
end

#build_associated_record(association_name, record_class) ⇒ Object

Raises:

  • (NotImplementedError)


145
146
147
# File 'lib/mr/factory/config.rb', line 145

def build_associated_record(association_name, record_class)
  raise NotImplementedError
end

#default_factoriesObject



112
113
114
115
116
117
118
119
120
# File 'lib/mr/factory/config.rb', line 112

def default_factories
  @default_factories ||= Hash.new do |h, record_class|
    # raise a no record class error if passed a `nil` record class, this
    # can happen when a polymorphic association is passed to `factory_for`
    # and its foreign type attribute isn't set
    raise NoRecordClassError if record_class.nil?
    h[record_class] = build_factory_for_record_class(record_class)
  end
end

#factories_for(association_name, record_class) ⇒ Object



126
127
128
129
# File 'lib/mr/factory/config.rb', line 126

def factories_for(association_name, record_class)
  key = AssociationFactoriesKey.new(association_name, record_class)
  self.association_factories[key] || [self.default_factories[record_class]]
end

#factory_config_for(association_name, record_class) ⇒ Object



135
136
137
# File 'lib/mr/factory/config.rb', line 135

def factory_config_for(association_name, record_class)
  self.factory_for(association_name, record_class).config
end

#factory_for(association_name, record_class) ⇒ Object



131
132
133
# File 'lib/mr/factory/config.rb', line 131

def factory_for(association_name, record_class)
  self.factories_for(association_name, record_class).sample
end

#force_in_stack_association?(association_name) ⇒ Boolean

Returns:

  • (Boolean)


108
109
110
# File 'lib/mr/factory/config.rb', line 108

def force_in_stack_association?(association_name)
  self.force_in_stack_association_names.include?(association_name)
end

#force_in_stack_association_namesObject



104
105
106
# File 'lib/mr/factory/config.rb', line 104

def force_in_stack_association_names
  @force_in_stack_association_names ||= []
end

#record_classObject



100
101
102
# File 'lib/mr/factory/config.rb', line 100

def record_class
  self.object_class
end

#record_classes_for(association_name) ⇒ Object



139
140
141
142
143
# File 'lib/mr/factory/config.rb', line 139

def record_classes_for(association_name)
  self.factories_for(association_name, nil).map(&:record_class)
rescue NoRecordClassError
  []
end