From aa8b42c8649299367070e33476f766f3fe201eff Mon Sep 17 00:00:00 2001 From: Mark Isaac Date: Tue, 14 Jul 2026 13:14:09 +0100 Subject: [PATCH 1/2] fix: allow non-hash overrides for embedded factory attributes --add: spec tests for omit, nil, and hash override behaviour --- lib/faker_maker/factory.rb | 2 +- spec/faker_maker/factory_spec.rb | 63 ++++++++++++++++++++++++++++++++ 2 files changed, 64 insertions(+), 1 deletion(-) diff --git a/lib/faker_maker/factory.rb b/lib/faker_maker/factory.rb index 0c877bc..0ea2536 100644 --- a/lib/faker_maker/factory.rb +++ b/lib/faker_maker/factory.rb @@ -255,7 +255,7 @@ def overridden_value?( attr, attr_override_values ) end def value_for_attribute( instance, attr, attr_override_values, chaos: false ) - if !attr.embedded_factories? && overridden_value?( attr, attr_override_values ) + if overridden_value?( attr, attr_override_values ) && !attr_override_values[attr.name].is_a?( Hash ) attr_override_values[attr.name] elsif attr.array? [].tap do |a| diff --git a/spec/faker_maker/factory_spec.rb b/spec/faker_maker/factory_spec.rb index c0d488f..3a27de6 100644 --- a/spec/faker_maker/factory_spec.rb +++ b/spec/faker_maker/factory_spec.rb @@ -374,6 +374,69 @@ end end + describe 'overriding embedded factory attributes' do + it 'allows FakerMaker::OMIT to be passed as an override for an embedded factory attribute' do + embed = FakerMaker::Factory.new( :override_embed ) + embed.attach_attribute( FakerMaker::Attribute.new( :street, proc { '123 High St' } ) ) + embed.attach_attribute( FakerMaker::Attribute.new( :city, proc { 'Swansea' } ) ) + FakerMaker.register_factory( embed ) + + factory = FakerMaker::Factory.new( :override_parent ) + factory.attach_attribute( FakerMaker::Attribute.new( :name, proc { 'Alice' } ) ) + factory.attach_attribute( FakerMaker::Attribute.new( :address, nil, factory: :override_embed ) ) + FakerMaker.register_factory( factory ) + + fake = factory.build( attributes: { address: FakerMaker::OMIT } ) + expect( fake.address ).to eq FakerMaker::OMIT + end + + it 'omits the embedded factory attribute from JSON when overridden with FakerMaker::OMIT' do + embed = FakerMaker::Factory.new( :override_embed ) + embed.attach_attribute( FakerMaker::Attribute.new( :street, proc { '123 High St' } ) ) + embed.attach_attribute( FakerMaker::Attribute.new( :city, proc { 'Swansea' } ) ) + FakerMaker.register_factory( embed ) + + factory = FakerMaker::Factory.new( :override_parent ) + factory.attach_attribute( FakerMaker::Attribute.new( :name, proc { 'Alice' } ) ) + factory.attach_attribute( FakerMaker::Attribute.new( :address, nil, factory: :override_embed ) ) + FakerMaker.register_factory( factory ) + + fake = factory.build( attributes: { address: FakerMaker::OMIT } ) + expect( fake.as_json ).not_to have_key 'address' + end + + it 'allows nil to be passed as an override for an embedded factory attribute' do + embed = FakerMaker::Factory.new( :override_embed ) + embed.attach_attribute( FakerMaker::Attribute.new( :street, proc { '123 High St' } ) ) + embed.attach_attribute( FakerMaker::Attribute.new( :city, proc { 'Swansea' } ) ) + FakerMaker.register_factory( embed ) + + factory = FakerMaker::Factory.new( :override_parent ) + factory.attach_attribute( FakerMaker::Attribute.new( :name, proc { 'Alice' } ) ) + factory.attach_attribute( FakerMaker::Attribute.new( :address, nil, factory: :override_embed ) ) + FakerMaker.register_factory( factory ) + + fake = factory.build( attributes: { address: nil } ) + expect( fake.address ).to be_nil + end + + it 'still passes Hash overrides through to the embedded factory' do + embed = FakerMaker::Factory.new( :override_embed ) + embed.attach_attribute( FakerMaker::Attribute.new( :street, proc { '123 High St' } ) ) + embed.attach_attribute( FakerMaker::Attribute.new( :city, proc { 'Swansea' } ) ) + FakerMaker.register_factory( embed ) + + factory = FakerMaker::Factory.new( :override_parent ) + factory.attach_attribute( FakerMaker::Attribute.new( :name, proc { 'Alice' } ) ) + factory.attach_attribute( FakerMaker::Attribute.new( :address, nil, factory: :override_embed ) ) + FakerMaker.register_factory( factory ) + + fake = factory.build( attributes: { address: { street: '456 Low Rd' } } ) + expect( fake.address.street ).to eq '456 Low Rd' + expect( fake.address.city ).to eq 'Swansea' + end + end + describe '#instance' do it 'returns the instance' do factory = FakerMaker::Factory.new( :factory ) From 77fddd303e2bc78e08e75582f8aa933cd973a5ab Mon Sep 17 00:00:00 2001 From: Mark Isaac Date: Tue, 14 Jul 2026 13:55:18 +0100 Subject: [PATCH 2/2] bump patch version --- lib/faker_maker/version.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/faker_maker/version.rb b/lib/faker_maker/version.rb index 312220b..d01f334 100644 --- a/lib/faker_maker/version.rb +++ b/lib/faker_maker/version.rb @@ -1,5 +1,5 @@ # frozen_string_literal: true module FakerMaker - VERSION = '5.0.1' + VERSION = '5.0.2' end