factory_bot 4.8.2 → 5.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (76) hide show
  1. checksums.yaml +5 -5
  2. data/.yardopts +1 -0
  3. data/GETTING_STARTED.md +226 -129
  4. data/LICENSE +1 -1
  5. data/NAME.md +12 -5
  6. data/NEWS.md +351 -0
  7. data/README.md +35 -27
  8. data/lib/factory_bot/aliases.rb +1 -1
  9. data/lib/factory_bot/attribute/dynamic.rb +1 -0
  10. data/lib/factory_bot/attribute.rb +4 -39
  11. data/lib/factory_bot/attribute_assigner.rb +21 -6
  12. data/lib/factory_bot/attribute_list.rb +2 -1
  13. data/lib/factory_bot/callback.rb +3 -2
  14. data/lib/factory_bot/configuration.rb +16 -20
  15. data/lib/factory_bot/declaration/association.rb +14 -1
  16. data/lib/factory_bot/declaration/dynamic.rb +3 -1
  17. data/lib/factory_bot/declaration/implicit.rb +7 -2
  18. data/lib/factory_bot/declaration.rb +4 -4
  19. data/lib/factory_bot/declaration_list.rb +1 -1
  20. data/lib/factory_bot/decorator/attribute_hash.rb +1 -1
  21. data/lib/factory_bot/decorator/invocation_tracker.rb +1 -1
  22. data/lib/factory_bot/decorator.rb +5 -1
  23. data/lib/factory_bot/definition.rb +10 -7
  24. data/lib/factory_bot/definition_hierarchy.rb +1 -11
  25. data/lib/factory_bot/definition_proxy.rb +65 -41
  26. data/lib/factory_bot/errors.rb +7 -4
  27. data/lib/factory_bot/evaluation.rb +1 -1
  28. data/lib/factory_bot/evaluator.rb +5 -5
  29. data/lib/factory_bot/factory.rb +8 -8
  30. data/lib/factory_bot/factory_runner.rb +3 -3
  31. data/lib/factory_bot/find_definitions.rb +1 -1
  32. data/lib/factory_bot/internal.rb +104 -0
  33. data/lib/factory_bot/linter.rb +36 -19
  34. data/lib/factory_bot/null_factory.rb +4 -1
  35. data/lib/factory_bot/null_object.rb +2 -2
  36. data/lib/factory_bot/registry.rb +15 -6
  37. data/lib/factory_bot/reload.rb +3 -3
  38. data/lib/factory_bot/sequence.rb +9 -1
  39. data/lib/factory_bot/strategy/null.rb +2 -4
  40. data/lib/factory_bot/strategy/stub.rb +32 -36
  41. data/lib/factory_bot/strategy_calculator.rb +1 -1
  42. data/lib/factory_bot/strategy_syntax_method_registrar.rb +13 -2
  43. data/lib/factory_bot/syntax/default.rb +12 -24
  44. data/lib/factory_bot/syntax/methods.rb +32 -9
  45. data/lib/factory_bot/syntax.rb +2 -2
  46. data/lib/factory_bot/trait.rb +6 -3
  47. data/lib/factory_bot/version.rb +1 -1
  48. data/lib/factory_bot.rb +103 -134
  49. metadata +79 -64
  50. data/.autotest +0 -9
  51. data/.gitignore +0 -10
  52. data/.rspec +0 -2
  53. data/.simplecov +0 -4
  54. data/.travis.yml +0 -38
  55. data/Appraisals +0 -19
  56. data/Gemfile +0 -8
  57. data/Gemfile.lock +0 -103
  58. data/NEWS +0 -293
  59. data/Rakefile +0 -36
  60. data/cucumber.yml +0 -1
  61. data/factory_bot.gemspec +0 -36
  62. data/factory_girl.gemspec +0 -40
  63. data/gemfiles/3.2.gemfile +0 -10
  64. data/gemfiles/3.2.gemfile.lock +0 -105
  65. data/gemfiles/4.0.gemfile +0 -10
  66. data/gemfiles/4.0.gemfile.lock +0 -105
  67. data/gemfiles/4.1.gemfile +0 -10
  68. data/gemfiles/4.1.gemfile.lock +0 -104
  69. data/gemfiles/4.2.gemfile +0 -10
  70. data/gemfiles/4.2.gemfile.lock +0 -104
  71. data/gemfiles/5.0.gemfile +0 -10
  72. data/gemfiles/5.0.gemfile.lock +0 -103
  73. data/lib/factory_bot/attribute/static.rb +0 -16
  74. data/lib/factory_bot/declaration/static.rb +0 -26
  75. data/lib/factory_bot/decorator/class_key_hash.rb +0 -28
  76. data/lib/factory_girl.rb +0 -5
@@ -0,0 +1,104 @@
1
+ module FactoryBot
2
+ # @api private
3
+ module Internal
4
+ class << self
5
+ delegate :after,
6
+ :before,
7
+ :callback_names,
8
+ :callbacks,
9
+ :constructor,
10
+ :factories,
11
+ :initialize_with,
12
+ :inline_sequences,
13
+ :sequences,
14
+ :skip_create,
15
+ :strategies,
16
+ :to_create,
17
+ :traits,
18
+ to: :configuration
19
+
20
+ def configuration
21
+ @configuration ||= Configuration.new
22
+ end
23
+
24
+ def reset_configuration
25
+ @configuration = nil
26
+ end
27
+
28
+ def register_inline_sequence(sequence)
29
+ inline_sequences.push(sequence)
30
+ end
31
+
32
+ def rewind_inline_sequences
33
+ inline_sequences.each(&:rewind)
34
+ end
35
+
36
+ def register_trait(trait)
37
+ trait.names.each do |name|
38
+ traits.register(name, trait)
39
+ end
40
+ trait
41
+ end
42
+
43
+ def trait_by_name(name)
44
+ traits.find(name)
45
+ end
46
+
47
+ def register_sequence(sequence)
48
+ sequence.names.each do |name|
49
+ sequences.register(name, sequence)
50
+ end
51
+ sequence
52
+ end
53
+
54
+ def sequence_by_name(name)
55
+ sequences.find(name)
56
+ end
57
+
58
+ def rewind_sequences
59
+ sequences.each(&:rewind)
60
+ rewind_inline_sequences
61
+ end
62
+
63
+ def register_factory(factory)
64
+ factory.names.each do |name|
65
+ factories.register(name, factory)
66
+ end
67
+ factory
68
+ end
69
+
70
+ def factory_by_name(name)
71
+ factories.find(name)
72
+ end
73
+
74
+ def register_strategy(strategy_name, strategy_class)
75
+ strategies.register(strategy_name, strategy_class)
76
+ StrategySyntaxMethodRegistrar.new(strategy_name).define_strategy_methods
77
+ end
78
+
79
+ def strategy_by_name(name)
80
+ strategies.find(name)
81
+ end
82
+
83
+ def register_default_strategies
84
+ register_strategy(:build, FactoryBot::Strategy::Build)
85
+ register_strategy(:create, FactoryBot::Strategy::Create)
86
+ register_strategy(:attributes_for, FactoryBot::Strategy::AttributesFor)
87
+ register_strategy(:build_stubbed, FactoryBot::Strategy::Stub)
88
+ register_strategy(:null, FactoryBot::Strategy::Null)
89
+ end
90
+
91
+ def register_default_callbacks
92
+ register_callback(:after_create)
93
+ register_callback(:after_build)
94
+ register_callback(:after_stub)
95
+ register_callback(:before_create)
96
+ end
97
+
98
+ def register_callback(name)
99
+ name = name.to_sym
100
+ callback_names << name
101
+ end
102
+ end
103
+ end
104
+ end
@@ -1,10 +1,10 @@
1
1
  module FactoryBot
2
2
  class Linter
3
-
4
- def initialize(factories, linting_strategy, factory_strategy = :create)
3
+ def initialize(factories, strategy: :create, traits: false, verbose: false)
5
4
  @factories_to_lint = factories
6
- @linting_method = "lint_#{linting_strategy}"
7
- @factory_strategy = factory_strategy
5
+ @factory_strategy = strategy
6
+ @traits = traits
7
+ @verbose = verbose
8
8
  @invalid_factories = calculate_invalid_factories
9
9
  end
10
10
 
@@ -20,7 +20,7 @@ module FactoryBot
20
20
 
21
21
  def calculate_invalid_factories
22
22
  factories_to_lint.reduce(Hash.new([])) do |result, factory|
23
- errors = send(@linting_method, factory)
23
+ errors = lint(factory)
24
24
  result[factory] |= errors unless errors.empty?
25
25
  result
26
26
  end
@@ -37,6 +37,13 @@ module FactoryBot
37
37
  "* #{location} - #{message} (#{@wrapped_error.class.name})"
38
38
  end
39
39
 
40
+ def verbose_message
41
+ <<~MESSAGE
42
+ #{message}
43
+ #{@wrapped_error.backtrace.join("\n ")}
44
+ MESSAGE
45
+ end
46
+
40
47
  def location
41
48
  @factory.name
42
49
  end
@@ -53,12 +60,20 @@ module FactoryBot
53
60
  end
54
61
  end
55
62
 
63
+ def lint(factory)
64
+ if @traits
65
+ lint_factory(factory) + lint_traits(factory)
66
+ else
67
+ lint_factory(factory)
68
+ end
69
+ end
70
+
56
71
  def lint_factory(factory)
57
72
  result = []
58
73
  begin
59
74
  FactoryBot.public_send(factory_strategy, factory.name)
60
- rescue => error
61
- result |= [FactoryError.new(error, factory)]
75
+ rescue StandardError => e
76
+ result |= [FactoryError.new(e, factory)]
62
77
  end
63
78
  result
64
79
  end
@@ -68,30 +83,32 @@ module FactoryBot
68
83
  factory.definition.defined_traits.map(&:name).each do |trait_name|
69
84
  begin
70
85
  FactoryBot.public_send(factory_strategy, factory.name, trait_name)
71
- rescue => error
86
+ rescue StandardError => e
72
87
  result |=
73
- [FactoryTraitError.new(error, factory, trait_name)]
88
+ [FactoryTraitError.new(e, factory, trait_name)]
74
89
  end
75
90
  end
76
91
  result
77
92
  end
78
93
 
79
- def lint_factory_and_traits(factory)
80
- errors = lint_factory(factory)
81
- errors |= lint_traits(factory)
82
- errors
83
- end
84
-
85
94
  def error_message
86
95
  lines = invalid_factories.map do |_factory, exceptions|
87
- exceptions.map(&:message)
96
+ exceptions.map(&error_message_type)
88
97
  end.flatten
89
98
 
90
- <<-ERROR_MESSAGE.strip
91
- The following factories are invalid:
99
+ <<~ERROR_MESSAGE.strip
100
+ The following factories are invalid:
92
101
 
93
- #{lines.join("\n")}
102
+ #{lines.join("\n")}
94
103
  ERROR_MESSAGE
95
104
  end
105
+
106
+ def error_message_type
107
+ if @verbose
108
+ :verbose_message
109
+ else
110
+ :message
111
+ end
112
+ end
96
113
  end
97
114
  end
@@ -8,11 +8,14 @@ module FactoryBot
8
8
  end
9
9
 
10
10
  delegate :defined_traits, :callbacks, :attributes, :constructor,
11
- :to_create, to: :definition
11
+ :to_create, to: :definition
12
12
 
13
13
  def compile; end
14
+
14
15
  def class_name; end
16
+
15
17
  def evaluator_class; FactoryBot::Evaluator; end
18
+
16
19
  def hierarchy_class; FactoryBot::DefinitionHierarchy; end
17
20
  end
18
21
  end
@@ -13,11 +13,11 @@ module FactoryBot
13
13
  end
14
14
  end
15
15
 
16
- def respond_to?(method, include_private=false)
16
+ def respond_to?(method, _include_private = false)
17
17
  @methods_to_respond_to.include? method.to_s
18
18
  end
19
19
 
20
- def respond_to_missing?(*args)
20
+ def respond_to_missing?(*)
21
21
  false
22
22
  end
23
23
  end
@@ -1,3 +1,5 @@
1
+ require "active_support/core_ext/hash/indifferent_access"
2
+
1
3
  module FactoryBot
2
4
  class Registry
3
5
  include Enumerable
@@ -6,7 +8,7 @@ module FactoryBot
6
8
 
7
9
  def initialize(name)
8
10
  @name = name
9
- @items = Decorator::ClassKeyHash.new({})
11
+ @items = ActiveSupport::HashWithIndifferentAccess.new
10
12
  end
11
13
 
12
14
  def clear
@@ -18,11 +20,9 @@ module FactoryBot
18
20
  end
19
21
 
20
22
  def find(name)
21
- if registered?(name)
22
- @items[name]
23
- else
24
- raise ArgumentError, "#{@name} not registered: #{name}"
25
- end
23
+ @items.fetch(name)
24
+ rescue KeyError => e
25
+ raise key_error_with_custom_message(e)
26
26
  end
27
27
 
28
28
  alias :[] :find
@@ -34,5 +34,14 @@ module FactoryBot
34
34
  def registered?(name)
35
35
  @items.key?(name)
36
36
  end
37
+
38
+ private
39
+
40
+ def key_error_with_custom_message(key_error)
41
+ message = key_error.message.sub("key not found", "#{@name} not registered")
42
+ error = KeyError.new(message)
43
+ error.set_backtrace(key_error.backtrace)
44
+ error
45
+ end
37
46
  end
38
47
  end
@@ -1,8 +1,8 @@
1
1
  module FactoryBot
2
2
  def self.reload
3
- reset_configuration
4
- register_default_strategies
5
- register_default_callbacks
3
+ Internal.reset_configuration
4
+ Internal.register_default_strategies
5
+ Internal.register_default_callbacks
6
6
  find_definitions
7
7
  end
8
8
  end
@@ -1,5 +1,4 @@
1
1
  module FactoryBot
2
-
3
2
  # Sequences are defined using sequence within a FactoryBot.define block.
4
3
  # Sequence values are generated using next.
5
4
  # @api private
@@ -35,6 +34,10 @@ module FactoryBot
35
34
  [@name] + @aliases
36
35
  end
37
36
 
37
+ def rewind
38
+ @value.rewind
39
+ end
40
+
38
41
  private
39
42
 
40
43
  def value
@@ -47,6 +50,7 @@ module FactoryBot
47
50
 
48
51
  class EnumeratorAdapter
49
52
  def initialize(value)
53
+ @first_value = value
50
54
  @value = value
51
55
  end
52
56
 
@@ -57,6 +61,10 @@ module FactoryBot
57
61
  def next
58
62
  @value = @value.next
59
63
  end
64
+
65
+ def rewind
66
+ @value = @first_value
67
+ end
60
68
  end
61
69
  end
62
70
  end
@@ -1,11 +1,9 @@
1
1
  module FactoryBot
2
2
  module Strategy
3
3
  class Null
4
- def association(runner)
5
- end
4
+ def association(runner); end
6
5
 
7
- def result(evaluation)
8
- end
6
+ def result(evaluation); end
9
7
  end
10
8
  end
11
9
  end
@@ -6,17 +6,14 @@ module FactoryBot
6
6
  DISABLED_PERSISTENCE_METHODS = [
7
7
  :connection,
8
8
  :decrement!,
9
- :decrement,
10
9
  :delete,
11
10
  :destroy!,
12
11
  :destroy,
13
12
  :increment!,
14
- :increment,
15
13
  :reload,
16
14
  :save!,
17
15
  :save,
18
16
  :toggle!,
19
- :toggle,
20
17
  :touch,
21
18
  :update!,
22
19
  :update,
@@ -34,7 +31,8 @@ module FactoryBot
34
31
  def result(evaluation)
35
32
  evaluation.object.tap do |instance|
36
33
  stub_database_interaction_on_result(instance)
37
- clear_changed_attributes_on_result(instance)
34
+ set_timestamps(instance)
35
+ clear_changes_information(instance)
38
36
  evaluation.notify(:after_stub, instance)
39
37
  end
40
38
  end
@@ -46,15 +44,17 @@ module FactoryBot
46
44
  end
47
45
 
48
46
  def stub_database_interaction_on_result(result_instance)
49
- result_instance.id ||= next_id
47
+ if has_settable_id?(result_instance)
48
+ result_instance.id ||= next_id
49
+ end
50
50
 
51
51
  result_instance.instance_eval do
52
52
  def persisted?
53
- !new_record?
53
+ true
54
54
  end
55
55
 
56
56
  def new_record?
57
- id.nil?
57
+ false
58
58
  end
59
59
 
60
60
  def destroyed?
@@ -63,48 +63,44 @@ module FactoryBot
63
63
 
64
64
  DISABLED_PERSISTENCE_METHODS.each do |write_method|
65
65
  define_singleton_method(write_method) do |*args|
66
- raise "stubbed models are not allowed to access the database - #{self.class}##{write_method}(#{args.join(",")})"
66
+ raise "stubbed models are not allowed to access the database - "\
67
+ "#{self.class}##{write_method}(#{args.join(',')})"
67
68
  end
68
69
  end
69
70
  end
71
+ end
70
72
 
71
- created_at_missing_default = result_instance.respond_to?(:created_at) && !result_instance.created_at
72
- result_instance_missing_created_at = !result_instance.respond_to?(:created_at)
73
+ def has_settable_id?(result_instance)
74
+ !result_instance.class.respond_to?(:primary_key) ||
75
+ result_instance.class.primary_key
76
+ end
73
77
 
74
- if created_at_missing_default || result_instance_missing_created_at
75
- result_instance.instance_eval do
76
- def created_at
77
- @created_at ||= Time.now.in_time_zone
78
- end
79
- end
78
+ def clear_changes_information(result_instance)
79
+ if result_instance.respond_to?(:clear_changes_information)
80
+ result_instance.clear_changes_information
80
81
  end
82
+ end
81
83
 
82
- has_updated_at = result_instance.respond_to?(:updated_at)
83
- updated_at_no_default = has_updated_at && !result_instance.updated_at
84
- result_instance_missing_updated_at = !has_updated_at
85
-
86
- if updated_at_no_default || result_instance_missing_updated_at
87
- result_instance.instance_eval do
88
- def updated_at
89
- @updated_at ||= Time.current
90
- end
91
- end
84
+ def set_timestamps(result_instance)
85
+ if missing_created_at?(result_instance)
86
+ result_instance.created_at = Time.current
92
87
  end
93
- end
94
88
 
95
- def clear_changed_attributes_on_result(result_instance)
96
- unless result_instance.respond_to?(:clear_changes_information)
97
- result_instance.extend ActiveModelDirtyBackport
89
+ if missing_updated_at?(result_instance)
90
+ result_instance.updated_at = Time.current
98
91
  end
92
+ end
99
93
 
100
- result_instance.clear_changes_information
94
+ def missing_created_at?(result_instance)
95
+ result_instance.respond_to?(:created_at) &&
96
+ result_instance.respond_to?(:created_at=) &&
97
+ result_instance.created_at.blank?
101
98
  end
102
- end
103
99
 
104
- module ActiveModelDirtyBackport
105
- def clear_changes_information
106
- @previously_changed = ActiveSupport::HashWithIndifferentAccess.new
107
- @changed_attributes = ActiveSupport::HashWithIndifferentAccess.new
100
+ def missing_updated_at?(result_instance)
101
+ result_instance.respond_to?(:updated_at) &&
102
+ result_instance.respond_to?(:updated_at=) &&
103
+ result_instance.updated_at.blank?
108
104
  end
109
105
  end
110
106
  end
@@ -20,7 +20,7 @@ module FactoryBot
20
20
  end
21
21
 
22
22
  def strategy_name_to_object
23
- FactoryBot.strategy_by_name(@name_or_object)
23
+ FactoryBot::Internal.strategy_by_name(@name_or_object)
24
24
  end
25
25
  end
26
26
  end
@@ -11,6 +11,14 @@ module FactoryBot
11
11
  define_pair_strategy_method
12
12
  end
13
13
 
14
+ def self.with_index(block, index)
15
+ if block&.arity == 2
16
+ ->(instance) { block.call(instance, index) }
17
+ else
18
+ block
19
+ end
20
+ end
21
+
14
22
  private
15
23
 
16
24
  def define_singular_strategy_method
@@ -29,7 +37,10 @@ module FactoryBot
29
37
  raise ArgumentError, "count missing for #{strategy_name}_list"
30
38
  end
31
39
 
32
- amount.times.map { send(strategy_name, name, *traits_and_overrides, &block) }
40
+ Array.new(amount) do |i|
41
+ block_with_index = StrategySyntaxMethodRegistrar.with_index(block, i)
42
+ send(strategy_name, name, *traits_and_overrides, &block_with_index)
43
+ end
33
44
  end
34
45
  end
35
46
 
@@ -37,7 +48,7 @@ module FactoryBot
37
48
  strategy_name = @strategy_name
38
49
 
39
50
  define_syntax_method("#{strategy_name}_pair") do |name, *traits_and_overrides, &block|
40
- 2.times.map { send(strategy_name, name, *traits_and_overrides, &block) }
51
+ Array.new(2) { send(strategy_name, name, *traits_and_overrides, &block) }
41
52
  end
42
53
  end
43
54
 
@@ -17,7 +17,7 @@ module FactoryBot
17
17
  proxy = FactoryBot::DefinitionProxy.new(factory.definition)
18
18
  proxy.instance_eval(&block) if block_given?
19
19
 
20
- FactoryBot.register_factory(factory)
20
+ Internal.register_factory(factory)
21
21
 
22
22
  proxy.child_factories.each do |(child_name, child_options, child_block)|
23
23
  parent_factory = child_options.delete(:parent) || name
@@ -26,41 +26,29 @@ module FactoryBot
26
26
  end
27
27
 
28
28
  def sequence(name, *args, &block)
29
- FactoryBot.register_sequence(Sequence.new(name, *args, &block))
29
+ Internal.register_sequence(Sequence.new(name, *args, &block))
30
30
  end
31
31
 
32
32
  def trait(name, &block)
33
- FactoryBot.register_trait(Trait.new(name, &block))
34
- end
35
-
36
- def to_create(&block)
37
- FactoryBot.to_create(&block)
38
- end
39
-
40
- def skip_create
41
- FactoryBot.skip_create
42
- end
43
-
44
- def initialize_with(&block)
45
- FactoryBot.initialize_with(&block)
33
+ Internal.register_trait(Trait.new(name, &block))
46
34
  end
47
35
 
48
36
  def self.run(block)
49
37
  new.instance_eval(&block)
50
38
  end
51
39
 
52
- delegate :before, :after, :callback, to: :configuration
53
-
54
- private
55
-
56
- def configuration
57
- FactoryBot.configuration
58
- end
40
+ delegate :after,
41
+ :before,
42
+ :callback,
43
+ :initialize_with,
44
+ :skip_create,
45
+ :to_create,
46
+ to: FactoryBot::Internal
59
47
  end
60
48
 
61
49
  class ModifyDSL
62
- def factory(name, options = {}, &block)
63
- factory = FactoryBot.factory_by_name(name)
50
+ def factory(name, _options = {}, &block)
51
+ factory = Internal.factory_by_name(name)
64
52
  proxy = FactoryBot::DefinitionProxy.new(factory.definition.overridable)
65
53
  proxy.instance_eval(&block)
66
54
  end
@@ -2,8 +2,8 @@ module FactoryBot
2
2
  module Syntax
3
3
  ## This module is a container for all strategy methods provided by
4
4
  ## FactoryBot. This includes all the default strategies provided ({Methods#build},
5
- ## {Methods#create}, {Methods#build_stubbed}, and {Methods#attributes_for}), as well as
6
- ## the complementary *_list methods.
5
+ ## {Methods#create}, {Methods#build_stubbed}, and {Methods#attributes_for}), as
6
+ ## well as the complementary *_list and *_pair methods.
7
7
  ## @example singular factory execution
8
8
  ## # basic use case
9
9
  ## build(:completed_order)
@@ -30,7 +30,7 @@ module FactoryBot
30
30
  ## # factory with traits and attribute override
31
31
  ## build_stubbed_list(:user, 15, :admin, :male, name: "John Doe")
32
32
  module Methods
33
- # @!parse FactoryBot.register_default_strategies
33
+ # @!parse FactoryBot::Internal.register_default_strategies
34
34
  # @!method build(name, *traits_and_overrides, &block)
35
35
  # (see #strategy_method)
36
36
  # Builds a registered factory by name.
@@ -51,22 +51,38 @@ module FactoryBot
51
51
  # Generates a hash of attributes for a registered factory by name.
52
52
  # @return [Hash] hash of attributes for the factory
53
53
 
54
- # @!method build_list(name, amount, *traits_and_overrides)
54
+ # @!method build_list(name, amount, *traits_and_overrides, &block)
55
55
  # (see #strategy_method_list)
56
56
  # @return [Array] array of built objects defined by the factory
57
57
 
58
- # @!method create_list(name, amount, *traits_and_overrides)
58
+ # @!method create_list(name, amount, *traits_and_overrides, &block)
59
59
  # (see #strategy_method_list)
60
60
  # @return [Array] array of created objects defined by the factory
61
61
 
62
- # @!method build_stubbed_list(name, amount, *traits_and_overrides)
62
+ # @!method build_stubbed_list(name, amount, *traits_and_overrides, &block)
63
63
  # (see #strategy_method_list)
64
64
  # @return [Array] array of stubbed objects defined by the factory
65
65
 
66
- # @!method attributes_for_list(name, amount, *traits_and_overrides)
66
+ # @!method attributes_for_list(name, amount, *traits_and_overrides, &block)
67
67
  # (see #strategy_method_list)
68
68
  # @return [Array<Hash>] array of attribute hashes for the factory
69
69
 
70
+ # @!method build_pair(name, *traits_and_overrides, &block)
71
+ # (see #strategy_method_pair)
72
+ # @return [Array] pair of built objects defined by the factory
73
+
74
+ # @!method create_pair(name, *traits_and_overrides, &block)
75
+ # (see #strategy_method_pair)
76
+ # @return [Array] pair of created objects defined by the factory
77
+
78
+ # @!method build_stubbed_pair(name, *traits_and_overrides, &block)
79
+ # (see #strategy_method_pair)
80
+ # @return [Array] pair of stubbed objects defined by the factory
81
+
82
+ # @!method attributes_for_pair(name, *traits_and_overrides, &block)
83
+ # (see #strategy_method_pair)
84
+ # @return [Array<Hash>] pair of attribute hashes for the factory
85
+
70
86
  # @!method strategy_method
71
87
  # @!visibility private
72
88
  # @param [Symbol] name the name of the factory to build
@@ -78,6 +94,13 @@ module FactoryBot
78
94
  # @param [Symbol] name the name of the factory to execute
79
95
  # @param [Integer] amount the number of instances to execute
80
96
  # @param [Array<Symbol, Symbol, Hash>] traits_and_overrides splat args traits and a hash of overrides
97
+ # @param [Proc] block block to be executed
98
+
99
+ # @!method strategy_method_pair
100
+ # @!visibility private
101
+ # @param [Symbol] name the name of the factory to execute
102
+ # @param [Array<Symbol, Symbol, Hash>] traits_and_overrides splat args traits and a hash of overrides
103
+ # @param [Proc] block block to be executed
81
104
 
82
105
  # Generates and returns the next value in a sequence.
83
106
  #
@@ -88,7 +111,7 @@ module FactoryBot
88
111
  # Returns:
89
112
  # The next value in the sequence. (Object)
90
113
  def generate(name)
91
- FactoryBot.sequence_by_name(name).next
114
+ Internal.sequence_by_name(name).next
92
115
  end
93
116
 
94
117
  # Generates and returns the list of values in a sequence.
@@ -103,7 +126,7 @@ module FactoryBot
103
126
  # The next value in the sequence. (Object)
104
127
  def generate_list(name, count)
105
128
  (1..count).map do
106
- FactoryBot.sequence_by_name(name).next
129
+ Internal.sequence_by_name(name).next
107
130
  end
108
131
  end
109
132
  end
@@ -1,5 +1,5 @@
1
- require 'factory_bot/syntax/methods'
2
- require 'factory_bot/syntax/default'
1
+ require "factory_bot/syntax/methods"
2
+ require "factory_bot/syntax/default"
3
3
 
4
4
  module FactoryBot
5
5
  module Syntax