lib/faker_maker/factory.rb in faker_maker-1.1.7 vs lib/faker_maker/factory.rb in faker_maker-1.1.8
- old
+ new
@@ -12,28 +12,33 @@
@class_name = (options[:class] || @name).to_s.camelcase
@attributes = []
@klass = nil
@parent = options[:parent]
end
-
+
def parent_class
- if @parent
+ if @parent
Object.const_get( FakerMaker[@parent].class_name )
else
Object
end
end
def attach_attribute( attribute )
- @attributes << attribute
+ @attributes << attribute
end
+ def instance
+ @instance ||= instantiate
+ end
+
def build( attributes = {} )
- instance = instantiate
+ before_build if respond_to? :before_build
assert_only_known_attributes_for_override( attributes )
populate_instance instance, attributes
yield instance if block_given?
+ after_build if respond_to? :after_build
instance
end
def assemble
if @klass.nil?
@@ -71,44 +76,43 @@
def attribute_names( collection = [] )
collection |= FakerMaker[parent].attribute_names( collection ) if parent?
collection | @attributes.map( &:name )
end
-
+
def attributes( collection = [] )
collection |= FakerMaker[parent].attributes( collection ) if parent?
collection | @attributes
end
-
+
def find_attribute( name = '' )
attributes.filter { |a| [a.name, a.translation].include? name }.first
end
- protected
+ protected
- def populate_instance( instance, attr_override_values )
+ def populate_instance( instance, attr_override_values )
FakerMaker[parent].populate_instance instance, attr_override_values if parent?
@attributes.each do |attr|
value = value_for_attribute( instance, attr, attr_override_values )
instance.send "#{attr.name}=", value
end
instance.instance_variable_set( :@fm_factory, self )
end
-
-
+
private
-
+
def assert_only_known_attributes_for_override( attr_override_values )
unknown_attrs = attr_override_values.keys - attribute_names
issue = "Can't build an instance of '#{class_name}' " \
"setting '#{unknown_attrs.join( ', ' )}', no such attribute(s)"
raise FakerMaker::NoSuchAttributeError, issue unless unknown_attrs.empty?
end
-
+
def attribute_hash_overridden_value?( attr, attr_override_values )
attr_override_values.keys.include?( attr.name )
end
-
+
def value_for_attribute( instance, attr, attr_override_values )
if attribute_hash_overridden_value?( attr, attr_override_values )
attr_override_values[attr.name]
elsif attr.array?
[].tap { |a| attr.cardinality.times { a << instance.instance_eval(&attr.block) } }