class FactoryBot::StrategySyntaxMethodRegistrar
@api private
def self.with_index(block, index)
def self.with_index(block, index) if block&.arity == 2 ->(instance) { block.call(instance, index) } else block end end
def define_list_strategy_method
def define_list_strategy_method strategy_name = @strategy_name define_syntax_method("#{strategy_name}_list") do |name, amount, *traits_and_overrides, &block| unless amount.respond_to?(:times) raise ArgumentError, "count missing for #{strategy_name}_list" end Array.new(amount) do |i| block_with_index = StrategySyntaxMethodRegistrar.with_index(block, i) send(strategy_name, name, *traits_and_overrides, &block_with_index) end end end
def define_pair_strategy_method
def define_pair_strategy_method strategy_name = @strategy_name define_syntax_method("#{strategy_name}_pair") do |name, *traits_and_overrides, &block| Array.new(2) { send(strategy_name, name, *traits_and_overrides, &block) } end end
def define_singular_strategy_method
def define_singular_strategy_method strategy_name = @strategy_name define_syntax_method(strategy_name) do |name, *traits_and_overrides, &block| FactoryRunner.new(name, strategy_name, traits_and_overrides).run(&block) end end
def define_strategy_methods
def define_strategy_methods define_singular_strategy_method define_list_strategy_method define_pair_strategy_method end
def define_syntax_method(name, &block)
def define_syntax_method(name, &block) FactoryBot::Syntax::Methods.module_exec do if method_defined?(name) || private_method_defined?(name) undef_method(name) end define_method(name, &block) end end
def initialize(strategy_name)
def initialize(strategy_name) @strategy_name = strategy_name end