From d9110818223a24b105775d5beab2985b3f0be230 Mon Sep 17 00:00:00 2001 From: Valerie Burzynski Date: Tue, 30 Sep 2025 12:29:53 -0500 Subject: [PATCH 01/12] refactor: refactor internal traits --- lib/factory_bot.rb | 1 + lib/factory_bot/configuration.rb | 1 - lib/factory_bot/internal.rb | 15 +++------------ lib/factory_bot/internal/traits.rb | 26 ++++++++++++++++++++++++++ spec/factory_bot/internal_spec.rb | 3 +-- 5 files changed, 31 insertions(+), 15 deletions(-) create mode 100644 lib/factory_bot/internal/traits.rb diff --git a/lib/factory_bot.rb b/lib/factory_bot.rb index de541d0e6..641921db9 100644 --- a/lib/factory_bot.rb +++ b/lib/factory_bot.rb @@ -5,6 +5,7 @@ require "active_support/deprecation" require "active_support/notifications" +require "factory_bot/internal/traits" require "factory_bot/internal" require "factory_bot/definition_hierarchy" require "factory_bot/configuration" diff --git a/lib/factory_bot/configuration.rb b/lib/factory_bot/configuration.rb index ccfc3d9ca..fd25a1fc6 100644 --- a/lib/factory_bot/configuration.rb +++ b/lib/factory_bot/configuration.rb @@ -13,7 +13,6 @@ class Configuration def initialize @factories = Decorator::DisallowsDuplicatesRegistry.new(Registry.new("Factory")) @sequences = Decorator::DisallowsDuplicatesRegistry.new(Registry.new("Sequence")) - @traits = Decorator::DisallowsDuplicatesRegistry.new(Registry.new("Trait")) @strategies = Registry.new("Strategy") @callback_names = Set.new @definition = Definition.new(:configuration) diff --git a/lib/factory_bot/internal.rb b/lib/factory_bot/internal.rb index 77230cbf6..86a0f51ef 100644 --- a/lib/factory_bot/internal.rb +++ b/lib/factory_bot/internal.rb @@ -13,15 +13,17 @@ class << self :skip_create, :strategies, :to_create, - :traits, to: :configuration + delegate :traits, :register_trait, :trait_by_name, to: Internal::Traits + def configuration @configuration ||= Configuration.new end def reset_configuration @configuration = nil + Internal::Traits.reset_traits end def register_inline_sequence(sequence) @@ -33,17 +35,6 @@ def rewind_inline_sequences inline_sequences.each(&:rewind) end - def register_trait(trait) - trait.names.each do |name| - traits.register(name, trait) - end - trait - end - - def trait_by_name(name, klass) - traits.find(name).tap { |t| t.klass = klass } - end - def register_sequence(sequence) sequence.names.each do |name| sequences.register(name, sequence) diff --git a/lib/factory_bot/internal/traits.rb b/lib/factory_bot/internal/traits.rb new file mode 100644 index 000000000..abbbfddc8 --- /dev/null +++ b/lib/factory_bot/internal/traits.rb @@ -0,0 +1,26 @@ +module FactoryBot + # @api private + module Internal + module Traits + def self.traits + @traits ||= Decorator::DisallowsDuplicatesRegistry.new(Registry.new("Trait")) + end + + def self.reset_traits + @traits = nil + traits + end + + def self.register_trait(trait) + trait.names.each do |name| + traits.register(name, trait) + end + trait + end + + def self.trait_by_name(name, klass) + traits.find(name).tap { |t| t.klass = klass } + end + end + end +end diff --git a/spec/factory_bot/internal_spec.rb b/spec/factory_bot/internal_spec.rb index 747886cb1..4c01e7b99 100644 --- a/spec/factory_bot/internal_spec.rb +++ b/spec/factory_bot/internal_spec.rb @@ -2,10 +2,9 @@ describe ".register_trait" do it "registers the provided trait" do trait = FactoryBot::Trait.new(:admin) - configuration = FactoryBot::Internal.configuration expect { FactoryBot::Internal.register_trait(trait) } - .to change { configuration.traits.count } + .to change { FactoryBot::Internal::Traits.traits.count } .from(0) .to(1) end From 9e838b598989d2968a8469514a0a26e4df5268b9 Mon Sep 17 00:00:00 2001 From: Valerie Burzynski Date: Tue, 30 Sep 2025 12:29:53 -0500 Subject: [PATCH 02/12] refactor: internal factories --- lib/factory_bot.rb | 1 + lib/factory_bot/configuration.rb | 3 --- lib/factory_bot/internal.rb | 23 ++++++++++------------- lib/factory_bot/internal/factories.rb | 25 +++++++++++++++++++++++++ lib/factory_bot/internal/traits.rb | 1 - spec/factory_bot/internal_spec.rb | 6 ++---- 6 files changed, 38 insertions(+), 21 deletions(-) create mode 100644 lib/factory_bot/internal/factories.rb diff --git a/lib/factory_bot.rb b/lib/factory_bot.rb index 641921db9..90243a3d8 100644 --- a/lib/factory_bot.rb +++ b/lib/factory_bot.rb @@ -6,6 +6,7 @@ require "active_support/notifications" require "factory_bot/internal/traits" +require "factory_bot/internal/factories" require "factory_bot/internal" require "factory_bot/definition_hierarchy" require "factory_bot/configuration" diff --git a/lib/factory_bot/configuration.rb b/lib/factory_bot/configuration.rb index fd25a1fc6..47f02b51c 100644 --- a/lib/factory_bot/configuration.rb +++ b/lib/factory_bot/configuration.rb @@ -3,15 +3,12 @@ module FactoryBot class Configuration attr_reader( :callback_names, - :factories, :inline_sequences, :sequences, :strategies, - :traits ) def initialize - @factories = Decorator::DisallowsDuplicatesRegistry.new(Registry.new("Factory")) @sequences = Decorator::DisallowsDuplicatesRegistry.new(Registry.new("Sequence")) @strategies = Registry.new("Strategy") @callback_names = Set.new diff --git a/lib/factory_bot/internal.rb b/lib/factory_bot/internal.rb index 86a0f51ef..9a1ef3a4f 100644 --- a/lib/factory_bot/internal.rb +++ b/lib/factory_bot/internal.rb @@ -6,7 +6,6 @@ class << self :before, :callbacks, :constructor, - :factories, :initialize_with, :inline_sequences, :sequences, @@ -15,7 +14,15 @@ class << self :to_create, to: :configuration - delegate :traits, :register_trait, :trait_by_name, to: Internal::Traits + delegate :traits, + :register_trait, + :trait_by_name, + to: Internal::Traits + + delegate :factories, + :register_factory, + :factory_by_name, + to: Internal::Factories def configuration @configuration ||= Configuration.new @@ -24,6 +31,7 @@ def configuration def reset_configuration @configuration = nil Internal::Traits.reset_traits + Internal::Factories.reset_factories end def register_inline_sequence(sequence) @@ -67,17 +75,6 @@ def set_sequence(*uri_parts, value) sequence.set_value(value) end - def register_factory(factory) - factory.names.each do |name| - factories.register(name, factory) - end - factory - end - - def factory_by_name(name) - factories.find(name) - end - def register_strategy(strategy_name, strategy_class) strategies.register(strategy_name, strategy_class) StrategySyntaxMethodRegistrar.new(strategy_name).define_strategy_methods diff --git a/lib/factory_bot/internal/factories.rb b/lib/factory_bot/internal/factories.rb new file mode 100644 index 000000000..3da9e6298 --- /dev/null +++ b/lib/factory_bot/internal/factories.rb @@ -0,0 +1,25 @@ +module FactoryBot + module Internal + module Factories + def self.factories + @factories ||= Decorator::DisallowsDuplicatesRegistry.new(Registry.new("Factory")) + end + + def self.reset_factories + @factories = nil + factories + end + + def self.register_factory(factory) + factory.names.each do |name| + factories.register(name, factory) + end + factory + end + + def self.factory_by_name(name) + factories.find(name) + end + end + end +end diff --git a/lib/factory_bot/internal/traits.rb b/lib/factory_bot/internal/traits.rb index abbbfddc8..14bf9111e 100644 --- a/lib/factory_bot/internal/traits.rb +++ b/lib/factory_bot/internal/traits.rb @@ -1,5 +1,4 @@ module FactoryBot - # @api private module Internal module Traits def self.traits diff --git a/spec/factory_bot/internal_spec.rb b/spec/factory_bot/internal_spec.rb index 4c01e7b99..c6c1e9ef8 100644 --- a/spec/factory_bot/internal_spec.rb +++ b/spec/factory_bot/internal_spec.rb @@ -75,10 +75,9 @@ describe ".register_factory" do it "registers the provided factory" do factory = FactoryBot::Factory.new(:object) - configuration = FactoryBot::Internal.configuration expect { FactoryBot::Internal.register_factory(factory) } - .to change { configuration.factories.count } + .to change { FactoryBot::Internal::Factories.factories.count } .from(0) .to(1) end @@ -102,9 +101,8 @@ describe ".register_factory" do it "registers the provided factory" do factory = FactoryBot::Factory.new(:object) - configuration = FactoryBot::Internal.configuration expect { FactoryBot::Internal.register_factory(factory) } - .to change { configuration.factories.count } + .to change { FactoryBot::Internal::Factories.factories.count } .from(0) .to(1) end From 350c471f2d6f011b59ff0ad34bae779cac3f98be Mon Sep 17 00:00:00 2001 From: Valerie Burzynski Date: Tue, 30 Sep 2025 12:29:53 -0500 Subject: [PATCH 03/12] refactor: internal sequences --- lib/factory_bot.rb | 1 + lib/factory_bot/configuration.rb | 4 -- lib/factory_bot/internal.rb | 71 +++++------------------- lib/factory_bot/internal/sequences.rb | 77 +++++++++++++++++++++++++++ spec/factory_bot/internal_spec.rb | 3 +- 5 files changed, 91 insertions(+), 65 deletions(-) create mode 100644 lib/factory_bot/internal/sequences.rb diff --git a/lib/factory_bot.rb b/lib/factory_bot.rb index 90243a3d8..255a5e036 100644 --- a/lib/factory_bot.rb +++ b/lib/factory_bot.rb @@ -7,6 +7,7 @@ require "factory_bot/internal/traits" require "factory_bot/internal/factories" +require "factory_bot/internal/sequences" require "factory_bot/internal" require "factory_bot/definition_hierarchy" require "factory_bot/configuration" diff --git a/lib/factory_bot/configuration.rb b/lib/factory_bot/configuration.rb index 47f02b51c..e935cfd06 100644 --- a/lib/factory_bot/configuration.rb +++ b/lib/factory_bot/configuration.rb @@ -3,17 +3,13 @@ module FactoryBot class Configuration attr_reader( :callback_names, - :inline_sequences, - :sequences, :strategies, ) def initialize - @sequences = Decorator::DisallowsDuplicatesRegistry.new(Registry.new("Sequence")) @strategies = Registry.new("Strategy") @callback_names = Set.new @definition = Definition.new(:configuration) - @inline_sequences = [] to_create(&:save!) initialize_with { new } diff --git a/lib/factory_bot/internal.rb b/lib/factory_bot/internal.rb index 9a1ef3a4f..74fa7d334 100644 --- a/lib/factory_bot/internal.rb +++ b/lib/factory_bot/internal.rb @@ -7,8 +7,6 @@ class << self :callbacks, :constructor, :initialize_with, - :inline_sequences, - :sequences, :skip_create, :strategies, :to_create, @@ -24,6 +22,17 @@ class << self :factory_by_name, to: Internal::Factories + delegate :sequences, + :inline_sequences, + :register_inline_sequence, + :rewind_inline_sequences, + :register_sequence, + :sequence_by_name, + :rewind_sequence, + :rewind_sequences, + :set_sequence, + to: Internal::Sequences + def configuration @configuration ||= Configuration.new end @@ -32,47 +41,7 @@ def reset_configuration @configuration = nil Internal::Traits.reset_traits Internal::Factories.reset_factories - end - - def register_inline_sequence(sequence) - inline_sequences.push(sequence) - sequence - end - - def rewind_inline_sequences - inline_sequences.each(&:rewind) - end - - def register_sequence(sequence) - sequence.names.each do |name| - sequences.register(name, sequence) - end - sequence - end - - def sequence_by_name(name) - sequences.find(name) - end - - def rewind_sequences - sequences.each(&:rewind) - rewind_inline_sequences - end - - def rewind_sequence(*uri_parts) - fail_argument_count(0, "1+") if uri_parts.empty? - - uri = build_uri(uri_parts) - sequence = Sequence.find_by_uri(uri) || fail_unregistered_sequence(uri) - - sequence.rewind - end - - def set_sequence(*uri_parts, value) - uri = build_uri(uri_parts) || fail_argument_count(uri_parts.size, "2+") - sequence = Sequence.find(*uri) || fail_unregistered_sequence(uri) - - sequence.set_value(value) + Internal::Sequences.reset end def register_strategy(strategy_name, strategy_class) @@ -91,22 +60,6 @@ def register_default_strategies register_strategy(:build_stubbed, FactoryBot::Strategy::Stub) register_strategy(:null, FactoryBot::Strategy::Null) end - - private - - def build_uri(...) - FactoryBot::UriManager.build_uri(...) - end - - def fail_argument_count(received, expected) - fail ArgumentError, - "wrong number of arguments (given #{received}, expected #{expected})" - end - - def fail_unregistered_sequence(uri) - fail KeyError, - "Sequence not registered: '#{uri}'." - end end end end diff --git a/lib/factory_bot/internal/sequences.rb b/lib/factory_bot/internal/sequences.rb new file mode 100644 index 000000000..0c0e0c113 --- /dev/null +++ b/lib/factory_bot/internal/sequences.rb @@ -0,0 +1,77 @@ +module FactoryBot + module Internal + module Sequences + def self.sequences + @sequences ||= Decorator::DisallowsDuplicatesRegistry.new(Registry.new("Sequence")) + end + + def self.inline_sequences + @inline_sequences ||= [] + end + + def self.reset + @sequences = nil + @inline_sequences = [] + sequences + end + + def self.register_inline_sequence(sequence) + inline_sequences.push(sequence) + sequence + end + + def self.rewind_inline_sequences + inline_sequences.each(&:rewind) + end + + def self.register_sequence(sequence) + sequence.names.each do |name| + sequences.register(name, sequence) + end + sequence + end + + def self.sequence_by_name(name) + sequences.find(name) + end + + def self.rewind_sequences + sequences.each(&:rewind) + rewind_inline_sequences + end + + def self.rewind_sequence(*uri_parts) + fail_argument_count(0, "1+") if uri_parts.empty? + + uri = build_uri(uri_parts) + sequence = Sequence.find_by_uri(uri) || fail_unregistered_sequence(uri) + + sequence.rewind + end + + def self.set_sequence(*uri_parts, value) + uri = build_uri(uri_parts) || fail_argument_count(uri_parts.size, "2+") + sequence = Sequence.find(*uri) || fail_unregistered_sequence(uri) + + sequence.set_value(value) + end + + def self.build_uri(...) + FactoryBot::UriManager.build_uri(...) + end + private_class_method :build_uri + + def self.fail_argument_count(received, expected) + fail ArgumentError, + "wrong number of arguments (given #{received}, expected #{expected})" + end + private_class_method :fail_argument_count + + def self.fail_unregistered_sequence(uri) + fail KeyError, + "Sequence not registered: '#{uri}'." + end + private_class_method :fail_unregistered_sequence + end + end +end diff --git a/spec/factory_bot/internal_spec.rb b/spec/factory_bot/internal_spec.rb index c6c1e9ef8..4876c5526 100644 --- a/spec/factory_bot/internal_spec.rb +++ b/spec/factory_bot/internal_spec.rb @@ -31,10 +31,9 @@ describe ".register_sequence" do it "registers the provided sequence" do sequence = FactoryBot::Sequence.new(:email) - configuration = FactoryBot::Internal.configuration expect { FactoryBot::Internal.register_sequence(sequence) } - .to change { configuration.sequences.count } + .to change { FactoryBot::Internal::Sequences.sequences.count } .from(0) .to(1) end From 6382adbe25f013a62236b3d8643bbf8531c5a8a1 Mon Sep 17 00:00:00 2001 From: Valerie Burzynski Date: Tue, 30 Sep 2025 12:29:53 -0500 Subject: [PATCH 04/12] refactor: internal strategies --- lib/factory_bot.rb | 1 + lib/factory_bot/configuration.rb | 4 +--- lib/factory_bot/internal.rb | 24 ++++++-------------- lib/factory_bot/internal/strategies.rb | 31 ++++++++++++++++++++++++++ spec/factory_bot/internal_spec.rb | 7 +++--- 5 files changed, 43 insertions(+), 24 deletions(-) create mode 100644 lib/factory_bot/internal/strategies.rb diff --git a/lib/factory_bot.rb b/lib/factory_bot.rb index 255a5e036..856366409 100644 --- a/lib/factory_bot.rb +++ b/lib/factory_bot.rb @@ -8,6 +8,7 @@ require "factory_bot/internal/traits" require "factory_bot/internal/factories" require "factory_bot/internal/sequences" +require "factory_bot/internal/strategies" require "factory_bot/internal" require "factory_bot/definition_hierarchy" require "factory_bot/configuration" diff --git a/lib/factory_bot/configuration.rb b/lib/factory_bot/configuration.rb index e935cfd06..75f4d8015 100644 --- a/lib/factory_bot/configuration.rb +++ b/lib/factory_bot/configuration.rb @@ -2,12 +2,10 @@ module FactoryBot # @api private class Configuration attr_reader( - :callback_names, - :strategies, + :callback_names ) def initialize - @strategies = Registry.new("Strategy") @callback_names = Set.new @definition = Definition.new(:configuration) diff --git a/lib/factory_bot/internal.rb b/lib/factory_bot/internal.rb index 74fa7d334..f432b49da 100644 --- a/lib/factory_bot/internal.rb +++ b/lib/factory_bot/internal.rb @@ -33,6 +33,12 @@ class << self :set_sequence, to: Internal::Sequences + delegate :strategies, + :register_strategy, + :strategy_by_name, + :register_default_strategies, + to: Internal::Strategies + def configuration @configuration ||= Configuration.new end @@ -42,23 +48,7 @@ def reset_configuration Internal::Traits.reset_traits Internal::Factories.reset_factories Internal::Sequences.reset - end - - def register_strategy(strategy_name, strategy_class) - strategies.register(strategy_name, strategy_class) - StrategySyntaxMethodRegistrar.new(strategy_name).define_strategy_methods - end - - def strategy_by_name(name) - strategies.find(name) - end - - def register_default_strategies - register_strategy(:build, FactoryBot::Strategy::Build) - register_strategy(:create, FactoryBot::Strategy::Create) - register_strategy(:attributes_for, FactoryBot::Strategy::AttributesFor) - register_strategy(:build_stubbed, FactoryBot::Strategy::Stub) - register_strategy(:null, FactoryBot::Strategy::Null) + Internal::Strategies.reset end end end diff --git a/lib/factory_bot/internal/strategies.rb b/lib/factory_bot/internal/strategies.rb new file mode 100644 index 000000000..bc075009b --- /dev/null +++ b/lib/factory_bot/internal/strategies.rb @@ -0,0 +1,31 @@ +module FactoryBot + module Internal + module Strategies + def self.strategies + @strategies ||= Registry.new("Strategy") + end + + def self.reset + @strategies = nil + strategies + end + + def self.register_strategy(strategy_name, strategy_class) + strategies.register(strategy_name, strategy_class) + StrategySyntaxMethodRegistrar.new(strategy_name).define_strategy_methods + end + + def self.strategy_by_name(name) + strategies.find(name) + end + + def self.register_default_strategies + register_strategy(:build, FactoryBot::Strategy::Build) + register_strategy(:create, FactoryBot::Strategy::Create) + register_strategy(:attributes_for, FactoryBot::Strategy::AttributesFor) + register_strategy(:build_stubbed, FactoryBot::Strategy::Stub) + register_strategy(:null, FactoryBot::Strategy::Null) + end + end + end +end diff --git a/spec/factory_bot/internal_spec.rb b/spec/factory_bot/internal_spec.rb index 4876c5526..98ab602f4 100644 --- a/spec/factory_bot/internal_spec.rb +++ b/spec/factory_bot/internal_spec.rb @@ -121,12 +121,11 @@ end describe ".register_strategy" do - it "register the provided strategy name with the class" do - configuration = FactoryBot::Internal.configuration - initial_strategies_count = configuration.strategies.count + it "registers the provided strategy name with the class" do + initial_strategies_count = FactoryBot::Internal::Strategies.strategies.count expect { FactoryBot::Internal.register_strategy(:strategy_name, :strategy_class) - }.to change { configuration.strategies.count } + }.to change { FactoryBot::Internal::Strategies.strategies.count } .from(initial_strategies_count) .to(initial_strategies_count + 1) end From c8d51aee65046c1fe9f568d847ea92ab5af638e2 Mon Sep 17 00:00:00 2001 From: Valerie Burzynski Date: Tue, 30 Sep 2025 12:29:53 -0500 Subject: [PATCH 05/12] refactor: rename reset methods --- lib/factory_bot/internal.rb | 4 ++-- lib/factory_bot/internal/factories.rb | 2 +- lib/factory_bot/internal/traits.rb | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/lib/factory_bot/internal.rb b/lib/factory_bot/internal.rb index f432b49da..a169a712d 100644 --- a/lib/factory_bot/internal.rb +++ b/lib/factory_bot/internal.rb @@ -45,8 +45,8 @@ def configuration def reset_configuration @configuration = nil - Internal::Traits.reset_traits - Internal::Factories.reset_factories + Internal::Traits.reset + Internal::Factories.reset Internal::Sequences.reset Internal::Strategies.reset end diff --git a/lib/factory_bot/internal/factories.rb b/lib/factory_bot/internal/factories.rb index 3da9e6298..b9c5f75f8 100644 --- a/lib/factory_bot/internal/factories.rb +++ b/lib/factory_bot/internal/factories.rb @@ -5,7 +5,7 @@ def self.factories @factories ||= Decorator::DisallowsDuplicatesRegistry.new(Registry.new("Factory")) end - def self.reset_factories + def self.reset @factories = nil factories end diff --git a/lib/factory_bot/internal/traits.rb b/lib/factory_bot/internal/traits.rb index 14bf9111e..3fed0cdee 100644 --- a/lib/factory_bot/internal/traits.rb +++ b/lib/factory_bot/internal/traits.rb @@ -5,7 +5,7 @@ def self.traits @traits ||= Decorator::DisallowsDuplicatesRegistry.new(Registry.new("Trait")) end - def self.reset_traits + def self.reset @traits = nil traits end From 2e4088deed0341903c33c19abcbeeb651f85e367 Mon Sep 17 00:00:00 2001 From: Valerie Burzynski Date: Tue, 30 Sep 2025 12:49:09 -0500 Subject: [PATCH 06/12] fix: remove dead code from configuration I believe the code that used callback_names was removed in 7cfa23377526b30bd78e0ef72be9898caed95ccd --- lib/factory_bot/configuration.rb | 5 ----- 1 file changed, 5 deletions(-) diff --git a/lib/factory_bot/configuration.rb b/lib/factory_bot/configuration.rb index 75f4d8015..5b13e799c 100644 --- a/lib/factory_bot/configuration.rb +++ b/lib/factory_bot/configuration.rb @@ -1,12 +1,7 @@ module FactoryBot # @api private class Configuration - attr_reader( - :callback_names - ) - def initialize - @callback_names = Set.new @definition = Definition.new(:configuration) to_create(&:save!) From a81203d7e60fb01c3d0ae895e3c9f337d79b330d Mon Sep 17 00:00:00 2001 From: Valerie Burzynski Date: Tue, 30 Sep 2025 12:50:55 -0500 Subject: [PATCH 07/12] lint: format code inside configuration --- lib/factory_bot/configuration.rb | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/lib/factory_bot/configuration.rb b/lib/factory_bot/configuration.rb index 5b13e799c..7aefa4685 100644 --- a/lib/factory_bot/configuration.rb +++ b/lib/factory_bot/configuration.rb @@ -8,8 +8,14 @@ def initialize initialize_with { new } end - delegate :to_create, :skip_create, :constructor, :before, :after, - :callback, :callbacks, to: :@definition + delegate :to_create, + :skip_create, + :constructor, + :before, + :after, + :callback, + :callbacks, + to: :@definition def initialize_with(&block) @definition.define_constructor(&block) From 3036c94cb8b23a55720e5f010abf2861d6ef140e Mon Sep 17 00:00:00 2001 From: Valerie Burzynski Date: Tue, 30 Sep 2025 18:24:21 -0500 Subject: [PATCH 08/12] refactor: cleanup internal modules --- lib/factory_bot.rb | 2 +- lib/factory_bot/configuration.rb | 5 +---- lib/factory_bot/definition.rb | 1 + lib/factory_bot/internal/factories.rb | 3 +-- lib/factory_bot/internal/sequences.rb | 2 +- lib/factory_bot/internal/strategies.rb | 3 +-- lib/factory_bot/internal/traits.rb | 3 +-- lib/factory_bot/registry.rb | 6 +++++- 8 files changed, 12 insertions(+), 13 deletions(-) diff --git a/lib/factory_bot.rb b/lib/factory_bot.rb index 856366409..deacf9837 100644 --- a/lib/factory_bot.rb +++ b/lib/factory_bot.rb @@ -115,8 +115,8 @@ class << self # set_sequence("factory_name/trait_name/sequence_name", 450) delegate :factories, :register_strategy, - :rewind_sequences, :rewind_sequence, + :rewind_sequences, :set_sequence, :strategy_by_name, to: Internal diff --git a/lib/factory_bot/configuration.rb b/lib/factory_bot/configuration.rb index 7aefa4685..d0afa56a7 100644 --- a/lib/factory_bot/configuration.rb +++ b/lib/factory_bot/configuration.rb @@ -15,10 +15,7 @@ def initialize :after, :callback, :callbacks, + :initialize_with, to: :@definition - - def initialize_with(&block) - @definition.define_constructor(&block) - end end end diff --git a/lib/factory_bot/definition.rb b/lib/factory_bot/definition.rb index b393882a3..43f21b8f5 100644 --- a/lib/factory_bot/definition.rb +++ b/lib/factory_bot/definition.rb @@ -107,6 +107,7 @@ def register_enum(enum) def define_constructor(&block) @constructor = block end + alias_method :initialize_with, :define_constructor def before(*names, &block) callback(*names.map { |name| "before_#{name}" }, &block) diff --git a/lib/factory_bot/internal/factories.rb b/lib/factory_bot/internal/factories.rb index b9c5f75f8..baecf6c2f 100644 --- a/lib/factory_bot/internal/factories.rb +++ b/lib/factory_bot/internal/factories.rb @@ -6,8 +6,7 @@ def self.factories end def self.reset - @factories = nil - factories + @factories&.reset end def self.register_factory(factory) diff --git a/lib/factory_bot/internal/sequences.rb b/lib/factory_bot/internal/sequences.rb index 0c0e0c113..6bdc5074a 100644 --- a/lib/factory_bot/internal/sequences.rb +++ b/lib/factory_bot/internal/sequences.rb @@ -10,7 +10,7 @@ def self.inline_sequences end def self.reset - @sequences = nil + @sequences&.reset @inline_sequences = [] sequences end diff --git a/lib/factory_bot/internal/strategies.rb b/lib/factory_bot/internal/strategies.rb index bc075009b..df3588841 100644 --- a/lib/factory_bot/internal/strategies.rb +++ b/lib/factory_bot/internal/strategies.rb @@ -6,8 +6,7 @@ def self.strategies end def self.reset - @strategies = nil - strategies + @strategies&.reset end def self.register_strategy(strategy_name, strategy_class) diff --git a/lib/factory_bot/internal/traits.rb b/lib/factory_bot/internal/traits.rb index 3fed0cdee..6cecff364 100644 --- a/lib/factory_bot/internal/traits.rb +++ b/lib/factory_bot/internal/traits.rb @@ -6,8 +6,7 @@ def self.traits end def self.reset - @traits = nil - traits + @traits&.reset end def self.register_trait(trait) diff --git a/lib/factory_bot/registry.rb b/lib/factory_bot/registry.rb index 2b1eea49a..9ac8984aa 100644 --- a/lib/factory_bot/registry.rb +++ b/lib/factory_bot/registry.rb @@ -8,7 +8,7 @@ class Registry def initialize(name) @name = name - @items = ActiveSupport::HashWithIndifferentAccess.new + reset end def clear @@ -35,6 +35,10 @@ def registered?(name) @items.key?(name) end + def reset + @items = ActiveSupport::HashWithIndifferentAccess.new + end + private def key_error_with_custom_message(key_error) From 147b90825a3a5f953444dfc411caa9a1bf87b266 Mon Sep 17 00:00:00 2001 From: Valerie Burzynski Date: Tue, 30 Sep 2025 18:59:56 -0500 Subject: [PATCH 09/12] refactor: get rid of Configuration class --- lib/factory_bot.rb | 2 +- lib/factory_bot/configuration.rb | 40 +++++++++++++++++++------------- lib/factory_bot/internal.rb | 20 +++++++--------- lib/factory_bot/reload.rb | 2 +- 4 files changed, 34 insertions(+), 30 deletions(-) diff --git a/lib/factory_bot.rb b/lib/factory_bot.rb index deacf9837..f2f9b2f56 100644 --- a/lib/factory_bot.rb +++ b/lib/factory_bot.rb @@ -9,9 +9,9 @@ require "factory_bot/internal/factories" require "factory_bot/internal/sequences" require "factory_bot/internal/strategies" +require "factory_bot/configuration" require "factory_bot/internal" require "factory_bot/definition_hierarchy" -require "factory_bot/configuration" require "factory_bot/errors" require "factory_bot/factory_runner" require "factory_bot/strategy_syntax_method_registrar" diff --git a/lib/factory_bot/configuration.rb b/lib/factory_bot/configuration.rb index d0afa56a7..06bd9fc4c 100644 --- a/lib/factory_bot/configuration.rb +++ b/lib/factory_bot/configuration.rb @@ -1,21 +1,29 @@ module FactoryBot - # @api private - class Configuration - def initialize - @definition = Definition.new(:configuration) + module Internal + module Definition + def self.definition + @definition ||= FactoryBot::Definition.new(:configuration).tap do |definition| + definition.to_create(&:save!) + definition.initialize_with { new } + end + end - to_create(&:save!) - initialize_with { new } - end + def self.reset + @definition = nil + definition + end - delegate :to_create, - :skip_create, - :constructor, - :before, - :after, - :callback, - :callbacks, - :initialize_with, - to: :@definition + class << self + delegate :to_create, + :skip_create, + :constructor, + :before, + :after, + :callback, + :callbacks, + :initialize_with, + to: :definition + end + end end end diff --git a/lib/factory_bot/internal.rb b/lib/factory_bot/internal.rb index a169a712d..d8f6b03cb 100644 --- a/lib/factory_bot/internal.rb +++ b/lib/factory_bot/internal.rb @@ -10,7 +10,7 @@ class << self :skip_create, :strategies, :to_create, - to: :configuration + to: Internal::Definition delegate :traits, :register_trait, @@ -38,18 +38,14 @@ class << self :strategy_by_name, :register_default_strategies, to: Internal::Strategies + end - def configuration - @configuration ||= Configuration.new - end - - def reset_configuration - @configuration = nil - Internal::Traits.reset - Internal::Factories.reset - Internal::Sequences.reset - Internal::Strategies.reset - end + def self.reset + Internal::Traits.reset + Internal::Factories.reset + Internal::Sequences.reset + Internal::Strategies.reset + Internal::Definition.reset end end end diff --git a/lib/factory_bot/reload.rb b/lib/factory_bot/reload.rb index 3ef871943..6ccaf1585 100644 --- a/lib/factory_bot/reload.rb +++ b/lib/factory_bot/reload.rb @@ -1,6 +1,6 @@ module FactoryBot def self.reload - Internal.reset_configuration + Internal.reset Internal.register_default_strategies find_definitions end From b8708f229f11927ae457e3d575d86719c194b333 Mon Sep 17 00:00:00 2001 From: Valerie Burzynski Date: Tue, 30 Sep 2025 19:01:05 -0500 Subject: [PATCH 10/12] refactor: move files --- lib/factory_bot.rb | 4 ++-- lib/factory_bot/{configuration.rb => internal/definition.rb} | 0 2 files changed, 2 insertions(+), 2 deletions(-) rename lib/factory_bot/{configuration.rb => internal/definition.rb} (100%) diff --git a/lib/factory_bot.rb b/lib/factory_bot.rb index f2f9b2f56..976c45517 100644 --- a/lib/factory_bot.rb +++ b/lib/factory_bot.rb @@ -5,11 +5,11 @@ require "active_support/deprecation" require "active_support/notifications" -require "factory_bot/internal/traits" +require "factory_bot/internal/definition" require "factory_bot/internal/factories" require "factory_bot/internal/sequences" require "factory_bot/internal/strategies" -require "factory_bot/configuration" +require "factory_bot/internal/traits" require "factory_bot/internal" require "factory_bot/definition_hierarchy" require "factory_bot/errors" diff --git a/lib/factory_bot/configuration.rb b/lib/factory_bot/internal/definition.rb similarity index 100% rename from lib/factory_bot/configuration.rb rename to lib/factory_bot/internal/definition.rb From 6f81609e4917ed574d233ac9830fed03293a1bb6 Mon Sep 17 00:00:00 2001 From: Valerie Burzynski Date: Tue, 30 Sep 2025 19:02:17 -0500 Subject: [PATCH 11/12] refactor: move internal sub-module require statements --- lib/factory_bot.rb | 5 ----- lib/factory_bot/internal.rb | 6 ++++++ 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/lib/factory_bot.rb b/lib/factory_bot.rb index 976c45517..4830c7cf4 100644 --- a/lib/factory_bot.rb +++ b/lib/factory_bot.rb @@ -5,11 +5,6 @@ require "active_support/deprecation" require "active_support/notifications" -require "factory_bot/internal/definition" -require "factory_bot/internal/factories" -require "factory_bot/internal/sequences" -require "factory_bot/internal/strategies" -require "factory_bot/internal/traits" require "factory_bot/internal" require "factory_bot/definition_hierarchy" require "factory_bot/errors" diff --git a/lib/factory_bot/internal.rb b/lib/factory_bot/internal.rb index d8f6b03cb..67c7a453d 100644 --- a/lib/factory_bot/internal.rb +++ b/lib/factory_bot/internal.rb @@ -1,3 +1,9 @@ +require "factory_bot/internal/definition" +require "factory_bot/internal/factories" +require "factory_bot/internal/sequences" +require "factory_bot/internal/strategies" +require "factory_bot/internal/traits" + module FactoryBot # @api private module Internal From 92e7a1f9bac3a4b2a475ecc921f8853a7ec105e2 Mon Sep 17 00:00:00 2001 From: Valerie Burzynski Date: Fri, 27 Mar 2026 16:49:29 -0500 Subject: [PATCH 12/12] fix: avoid having both #reset and #clear inside Registry class --- lib/factory_bot/internal/factories.rb | 2 +- lib/factory_bot/internal/sequences.rb | 2 +- lib/factory_bot/internal/strategies.rb | 2 +- lib/factory_bot/internal/traits.rb | 2 +- lib/factory_bot/registry.rb | 6 +----- 5 files changed, 5 insertions(+), 9 deletions(-) diff --git a/lib/factory_bot/internal/factories.rb b/lib/factory_bot/internal/factories.rb index baecf6c2f..e92f7d438 100644 --- a/lib/factory_bot/internal/factories.rb +++ b/lib/factory_bot/internal/factories.rb @@ -6,7 +6,7 @@ def self.factories end def self.reset - @factories&.reset + @factories&.clear end def self.register_factory(factory) diff --git a/lib/factory_bot/internal/sequences.rb b/lib/factory_bot/internal/sequences.rb index 6bdc5074a..952539c12 100644 --- a/lib/factory_bot/internal/sequences.rb +++ b/lib/factory_bot/internal/sequences.rb @@ -10,7 +10,7 @@ def self.inline_sequences end def self.reset - @sequences&.reset + @sequences&.clear @inline_sequences = [] sequences end diff --git a/lib/factory_bot/internal/strategies.rb b/lib/factory_bot/internal/strategies.rb index df3588841..094450eb5 100644 --- a/lib/factory_bot/internal/strategies.rb +++ b/lib/factory_bot/internal/strategies.rb @@ -6,7 +6,7 @@ def self.strategies end def self.reset - @strategies&.reset + @strategies&.clear end def self.register_strategy(strategy_name, strategy_class) diff --git a/lib/factory_bot/internal/traits.rb b/lib/factory_bot/internal/traits.rb index 6cecff364..080ea8086 100644 --- a/lib/factory_bot/internal/traits.rb +++ b/lib/factory_bot/internal/traits.rb @@ -6,7 +6,7 @@ def self.traits end def self.reset - @traits&.reset + @traits&.clear end def self.register_trait(trait) diff --git a/lib/factory_bot/registry.rb b/lib/factory_bot/registry.rb index 9ac8984aa..2b1eea49a 100644 --- a/lib/factory_bot/registry.rb +++ b/lib/factory_bot/registry.rb @@ -8,7 +8,7 @@ class Registry def initialize(name) @name = name - reset + @items = ActiveSupport::HashWithIndifferentAccess.new end def clear @@ -35,10 +35,6 @@ def registered?(name) @items.key?(name) end - def reset - @items = ActiveSupport::HashWithIndifferentAccess.new - end - private def key_error_with_custom_message(key_error)