factory_bot 5.0.2 → 5.1.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.
- checksums.yaml +4 -4
- data/GETTING_STARTED.md +13 -13
- data/NEWS.md +8 -0
- data/README.md +11 -4
- data/lib/factory_bot.rb +39 -77
- data/lib/factory_bot/attribute_assigner.rb +1 -1
- data/lib/factory_bot/callback.rb +2 -2
- data/lib/factory_bot/declaration/association.rb +11 -0
- data/lib/factory_bot/declaration/implicit.rb +4 -1
- data/lib/factory_bot/definition.rb +2 -2
- data/lib/factory_bot/definition_proxy.rb +13 -6
- data/lib/factory_bot/errors.rb +3 -0
- data/lib/factory_bot/evaluator.rb +1 -1
- data/lib/factory_bot/factory.rb +1 -1
- data/lib/factory_bot/factory_runner.rb +1 -1
- data/lib/factory_bot/internal.rb +79 -1
- data/lib/factory_bot/reload.rb +2 -2
- data/lib/factory_bot/strategy/stub.rb +10 -3
- data/lib/factory_bot/strategy_calculator.rb +1 -1
- data/lib/factory_bot/syntax/default.rb +5 -5
- data/lib/factory_bot/syntax/methods.rb +3 -3
- data/lib/factory_bot/trait.rb +4 -2
- data/lib/factory_bot/version.rb +1 -1
- metadata +3 -17
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 33780ea65377b4977bbc2ee3e16e126da53fbca4b820bd621537fa5b14bb8d85
|
4
|
+
data.tar.gz: f42bcc279ad3d3109ac513bcf73f07da96901fe00def25b8fbe4788ac96d1751
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f51989b517d39a8254751e63b49b4705b8f104cb7a0ff52f073fd65243e7199ea39e8bad88c37edb1b3397fb362027be843bd196586f01a29d98b4d2accad112
|
7
|
+
data.tar.gz: 2768474e23632487e2f8cec649a48d1721858c6cb7c4baf9ca79f3b5688d29e9fb448e42cca5cb6e20c046f90b458829055dae4e3d6ec5fc4a7983880ad5d8f5
|
data/GETTING_STARTED.md
CHANGED
@@ -30,7 +30,7 @@ Configure your test suite
|
|
30
30
|
|
31
31
|
### RSpec
|
32
32
|
|
33
|
-
If you're using Rails
|
33
|
+
If you're using Rails, add the following configuration to `spec/support/factory_bot.rb` and be sure to require that file in `rails_helper.rb`:
|
34
34
|
|
35
35
|
```ruby
|
36
36
|
RSpec.configure do |config|
|
@@ -387,7 +387,7 @@ post.new_record? # => true
|
|
387
387
|
post.author.new_record? # => false
|
388
388
|
```
|
389
389
|
|
390
|
-
To not save the associated object, specify strategy: :build in the factory:
|
390
|
+
To not save the associated object, specify `strategy: :build` in the factory:
|
391
391
|
|
392
392
|
```ruby
|
393
393
|
FactoryBot.use_parent_strategy = false
|
@@ -510,20 +510,20 @@ create(:profile_with_languages, languages_count: 15).languages.length # 15
|
|
510
510
|
|
511
511
|
Polymorphic associations can be handled with traits:
|
512
512
|
|
513
|
-
```
|
513
|
+
```ruby
|
514
514
|
FactoryBot.define do
|
515
515
|
factory :video
|
516
516
|
factory :photo
|
517
517
|
|
518
518
|
factory :comment do
|
519
|
-
for_photo
|
519
|
+
for_photo # default to the :for_photo trait if none is specified
|
520
520
|
|
521
521
|
trait :for_video do
|
522
|
-
association
|
522
|
+
association :commentable, factory: :video
|
523
523
|
end
|
524
524
|
|
525
525
|
trait :for_photo do
|
526
|
-
association
|
526
|
+
association :commentable, factory: :photo
|
527
527
|
end
|
528
528
|
end
|
529
529
|
end
|
@@ -531,7 +531,7 @@ end
|
|
531
531
|
|
532
532
|
This allows us to do:
|
533
533
|
|
534
|
-
```
|
534
|
+
```ruby
|
535
535
|
create(:comment)
|
536
536
|
create(:comment, :for_video)
|
537
537
|
create(:comment, :for_photo)
|
@@ -961,7 +961,7 @@ If a gem were to give you a User factory:
|
|
961
961
|
```ruby
|
962
962
|
FactoryBot.define do
|
963
963
|
factory :user do
|
964
|
-
full_name "John Doe"
|
964
|
+
full_name { "John Doe" }
|
965
965
|
sequence(:username) { |n| "user#{n}" }
|
966
966
|
password { "password" }
|
967
967
|
end
|
@@ -1066,10 +1066,11 @@ Example Rake task:
|
|
1066
1066
|
namespace :factory_bot do
|
1067
1067
|
desc "Verify that all FactoryBot factories are valid"
|
1068
1068
|
task lint: :environment do
|
1069
|
-
if Rails.env.test?
|
1070
|
-
|
1071
|
-
|
1069
|
+
if Rails.env.test?
|
1070
|
+
conn = ActiveRecord::Base.connection
|
1071
|
+
conn.transaction do
|
1072
1072
|
FactoryBot.lint
|
1073
|
+
raise ActiveRecord::Rollback
|
1073
1074
|
end
|
1074
1075
|
else
|
1075
1076
|
system("bundle exec rake factory_bot:lint RAILS_ENV='test'")
|
@@ -1081,8 +1082,7 @@ end
|
|
1081
1082
|
|
1082
1083
|
After calling `FactoryBot.lint`, you'll likely want to clear out the
|
1083
1084
|
database, as records will most likely be created. The provided example above
|
1084
|
-
uses
|
1085
|
-
gem to your Gemfile under the appropriate groups.
|
1085
|
+
uses an sql transaction and rollback to leave the database clean.
|
1086
1086
|
|
1087
1087
|
You can lint factories selectively by passing only factories you want linted:
|
1088
1088
|
|
data/NEWS.md
CHANGED
@@ -1,5 +1,13 @@
|
|
1
1
|
# News
|
2
2
|
|
3
|
+
## 5.1.0 (September 21, 2019)
|
4
|
+
* Added: "Did you mean?" style error message to help with typos in association declarations
|
5
|
+
* Changed: `NoMethodError` for static attributes now offers a "Did you mean?" style message
|
6
|
+
* Fixed: avoid undefining inherited evaluator methods
|
7
|
+
* Fixed: avoid stubbing id for records without a primary key
|
8
|
+
* Fixed: raise a helpful error for self-referencing traits to avoid a `SystemStackError`
|
9
|
+
* Deprecated: top-level methods meant only for internal use: `allow_class_lookup`, `allow_class_lookup`=, `register_trait`, `trait_by_name`, `traits`, `sequence_by_name`, `sequences`, `factory_by_name`, `register_factory`, `callback_names`, `register_callback`, `register_default_callbacks`, `register_default_strategies`, `strategies`
|
10
|
+
|
3
11
|
## 5.0.2 (February 22, 2019)
|
4
12
|
* Bugfix: raise "Trait not registered" error when passing invalid trait arguments
|
5
13
|
|
data/README.md
CHANGED
@@ -5,7 +5,7 @@ factory_bot is a fixtures replacement with a straightforward definition syntax,
|
|
5
5
|
If you want to use factory_bot with Rails, see
|
6
6
|
[factory_bot_rails](https://github.com/thoughtbot/factory_bot_rails).
|
7
7
|
|
8
|
-
_[Interested in the history of the project name?]
|
8
|
+
_[Interested in the history of the project name?][NAME]_
|
9
9
|
|
10
10
|
|
11
11
|
### Transitioning from factory\_girl?
|
@@ -59,9 +59,13 @@ More Information
|
|
59
59
|
* [Issues](https://github.com/thoughtbot/factory_bot/issues)
|
60
60
|
* [GIANT ROBOTS SMASHING INTO OTHER GIANT ROBOTS](https://robots.thoughtbot.com/)
|
61
61
|
|
62
|
-
|
62
|
+
[GETTING_STARTED]: https://github.com/thoughtbot/factory_bot/blob/master/GETTING_STARTED.md
|
63
|
+
[NAME]: https://github.com/thoughtbot/factory_bot/blob/master/NAME.md
|
63
64
|
|
64
|
-
|
65
|
+
Useful Tools
|
66
|
+
------------
|
67
|
+
|
68
|
+
* [FactoryTrace](https://github.com/djezzzl/factory_trace) - helps to find unused factories and traits.
|
65
69
|
|
66
70
|
Contributing
|
67
71
|
------------
|
@@ -77,7 +81,10 @@ License
|
|
77
81
|
|
78
82
|
factory_bot is Copyright © 2008-2019 Joe Ferris and thoughtbot. It is free
|
79
83
|
software, and may be redistributed under the terms specified in the
|
80
|
-
[LICENSE]
|
84
|
+
[LICENSE] file.
|
85
|
+
|
86
|
+
[LICENSE]: https://github.com/thoughtbot/factory_bot/blob/master/LICENSE
|
87
|
+
|
81
88
|
|
82
89
|
About thoughtbot
|
83
90
|
----------------
|
data/lib/factory_bot.rb
CHANGED
@@ -48,7 +48,7 @@ require "factory_bot/version"
|
|
48
48
|
require "factory_bot/internal"
|
49
49
|
|
50
50
|
module FactoryBot
|
51
|
-
|
51
|
+
Deprecation = ActiveSupport::Deprecation.new("6.0", "factory_bot")
|
52
52
|
|
53
53
|
def self.configuration
|
54
54
|
Internal.configuration
|
@@ -75,89 +75,51 @@ module FactoryBot
|
|
75
75
|
end
|
76
76
|
|
77
77
|
class << self
|
78
|
-
delegate :
|
78
|
+
delegate :callbacks,
|
79
|
+
:callback_names,
|
80
|
+
:constructor,
|
81
|
+
:factories,
|
82
|
+
:initialize_with,
|
79
83
|
:sequences,
|
80
|
-
:
|
81
|
-
:callbacks,
|
84
|
+
:skip_create,
|
82
85
|
:strategies,
|
83
|
-
:callback_names,
|
84
86
|
:to_create,
|
85
|
-
:
|
86
|
-
:initialize_with,
|
87
|
-
:constructor,
|
87
|
+
:traits,
|
88
88
|
to: :configuration
|
89
89
|
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
end
|
104
|
-
|
105
|
-
def self.register_sequence(sequence)
|
106
|
-
sequence.names.each do |name|
|
107
|
-
sequences.register(name, sequence)
|
108
|
-
end
|
109
|
-
sequence
|
110
|
-
end
|
111
|
-
|
112
|
-
def self.sequence_by_name(name)
|
113
|
-
sequences.find(name)
|
114
|
-
end
|
115
|
-
|
116
|
-
def self.rewind_sequences
|
117
|
-
sequences.each(&:rewind)
|
118
|
-
Internal.rewind_inline_sequences
|
119
|
-
end
|
120
|
-
|
121
|
-
def self.register_trait(trait)
|
122
|
-
trait.names.each do |name|
|
123
|
-
traits.register(name, trait)
|
124
|
-
end
|
125
|
-
trait
|
126
|
-
end
|
127
|
-
|
128
|
-
def self.trait_by_name(name)
|
129
|
-
traits.find(name)
|
130
|
-
end
|
90
|
+
delegate :factory_by_name,
|
91
|
+
:register_callback,
|
92
|
+
:register_default_callbacks,
|
93
|
+
:register_default_strategies,
|
94
|
+
:register_factory,
|
95
|
+
:register_sequence,
|
96
|
+
:register_strategy,
|
97
|
+
:register_trait,
|
98
|
+
:rewind_sequences,
|
99
|
+
:sequence_by_name,
|
100
|
+
:strategy_by_name,
|
101
|
+
:trait_by_name,
|
102
|
+
to: Internal
|
131
103
|
|
132
|
-
|
133
|
-
strategies.register(strategy_name, strategy_class)
|
134
|
-
StrategySyntaxMethodRegistrar.new(strategy_name).define_strategy_methods
|
135
|
-
end
|
136
|
-
|
137
|
-
def self.strategy_by_name(name)
|
138
|
-
strategies.find(name)
|
139
|
-
end
|
140
|
-
|
141
|
-
def self.register_default_strategies
|
142
|
-
register_strategy(:build, FactoryBot::Strategy::Build)
|
143
|
-
register_strategy(:create, FactoryBot::Strategy::Create)
|
144
|
-
register_strategy(:attributes_for, FactoryBot::Strategy::AttributesFor)
|
145
|
-
register_strategy(:build_stubbed, FactoryBot::Strategy::Stub)
|
146
|
-
register_strategy(:null, FactoryBot::Strategy::Null)
|
147
|
-
end
|
148
|
-
|
149
|
-
def self.register_default_callbacks
|
150
|
-
register_callback(:after_build)
|
151
|
-
register_callback(:after_create)
|
152
|
-
register_callback(:after_stub)
|
153
|
-
register_callback(:before_create)
|
154
|
-
end
|
104
|
+
attr_accessor :allow_class_lookup
|
155
105
|
|
156
|
-
|
157
|
-
|
158
|
-
|
106
|
+
deprecate :allow_class_lookup,
|
107
|
+
:allow_class_lookup=,
|
108
|
+
:callback_names,
|
109
|
+
:factory_by_name,
|
110
|
+
:register_callback,
|
111
|
+
:register_default_callbacks,
|
112
|
+
:register_default_strategies,
|
113
|
+
:register_factory,
|
114
|
+
:register_trait,
|
115
|
+
:sequence_by_name,
|
116
|
+
:sequences,
|
117
|
+
:strategies,
|
118
|
+
:trait_by_name,
|
119
|
+
:traits,
|
120
|
+
deprecator: Deprecation
|
159
121
|
end
|
160
122
|
end
|
161
123
|
|
162
|
-
FactoryBot.register_default_strategies
|
163
|
-
FactoryBot.register_default_callbacks
|
124
|
+
FactoryBot::Internal.register_default_strategies
|
125
|
+
FactoryBot::Internal.register_default_callbacks
|
@@ -2,7 +2,7 @@ module FactoryBot
|
|
2
2
|
# @api private
|
3
3
|
class AttributeAssigner
|
4
4
|
def initialize(evaluator, build_class, &instance_builder)
|
5
|
-
@build_class
|
5
|
+
@build_class = build_class
|
6
6
|
@instance_builder = instance_builder
|
7
7
|
@evaluator = evaluator
|
8
8
|
@attribute_list = evaluator.class.attribute_list
|
data/lib/factory_bot/callback.rb
CHANGED
@@ -28,9 +28,9 @@ module FactoryBot
|
|
28
28
|
private
|
29
29
|
|
30
30
|
def ensure_valid_callback_name!
|
31
|
-
unless FactoryBot.callback_names.include?(name)
|
31
|
+
unless FactoryBot::Internal.callback_names.include?(name)
|
32
32
|
raise InvalidCallbackNameError, "#{name} is not a valid callback name. " +
|
33
|
-
"Valid callback names are #{FactoryBot.callback_names.inspect}"
|
33
|
+
"Valid callback names are #{FactoryBot::Internal.callback_names.inspect}"
|
34
34
|
end
|
35
35
|
end
|
36
36
|
|
@@ -22,9 +22,20 @@ module FactoryBot
|
|
22
22
|
private
|
23
23
|
|
24
24
|
def build
|
25
|
+
ensure_factory_is_not_a_declaration!
|
26
|
+
|
25
27
|
factory_name = @overrides[:factory] || name
|
26
28
|
[Attribute::Association.new(name, factory_name, [@traits, @overrides.except(:factory)].flatten)]
|
27
29
|
end
|
30
|
+
|
31
|
+
def ensure_factory_is_not_a_declaration!
|
32
|
+
if @overrides[:factory].is_a?(Declaration)
|
33
|
+
raise ArgumentError.new(<<~MSG)
|
34
|
+
Association '#{name}' received an invalid factory argument.
|
35
|
+
Did you mean? 'factory: :#{@overrides[:factory].name}'
|
36
|
+
MSG
|
37
|
+
end
|
38
|
+
end
|
28
39
|
end
|
29
40
|
end
|
30
41
|
end
|
@@ -23,8 +23,11 @@ module FactoryBot
|
|
23
23
|
def build
|
24
24
|
if FactoryBot.factories.registered?(name)
|
25
25
|
[Attribute::Association.new(name, name, {})]
|
26
|
-
elsif FactoryBot.sequences.registered?(name)
|
26
|
+
elsif FactoryBot::Internal.sequences.registered?(name)
|
27
27
|
[Attribute::Sequence.new(name, name, @ignored)]
|
28
|
+
elsif @factory.name.to_s == name.to_s
|
29
|
+
message = "Self-referencing trait '#{@name}'"
|
30
|
+
raise TraitDefinitionError, message
|
28
31
|
else
|
29
32
|
@factory.inherit_traits([name])
|
30
33
|
[]
|
@@ -95,7 +95,7 @@ module FactoryBot
|
|
95
95
|
|
96
96
|
def callback(*names, &block)
|
97
97
|
names.each do |name|
|
98
|
-
FactoryBot.register_callback(name)
|
98
|
+
FactoryBot::Internal.register_callback(name)
|
99
99
|
add_callback(Callback.new(name, block))
|
100
100
|
end
|
101
101
|
end
|
@@ -111,7 +111,7 @@ module FactoryBot
|
|
111
111
|
end
|
112
112
|
|
113
113
|
def trait_by_name(name)
|
114
|
-
trait_for(name) ||
|
114
|
+
trait_for(name) || Internal.trait_by_name(name)
|
115
115
|
end
|
116
116
|
|
117
117
|
def trait_for(name)
|
@@ -89,14 +89,17 @@ module FactoryBot
|
|
89
89
|
#
|
90
90
|
# are equivalent.
|
91
91
|
def method_missing(name, *args, &block) # rubocop:disable Style/MethodMissing
|
92
|
-
|
92
|
+
association_options = args.first
|
93
|
+
|
94
|
+
if association_options.nil?
|
93
95
|
__declare_attribute__(name, block)
|
94
|
-
elsif
|
95
|
-
association(name,
|
96
|
+
elsif __valid_association_options?(association_options)
|
97
|
+
association(name, association_options)
|
96
98
|
else
|
97
|
-
raise NoMethodError.new(
|
98
|
-
|
99
|
-
|
99
|
+
raise NoMethodError.new(<<~MSG)
|
100
|
+
undefined method '#{name}' in '#{@definition.name}' factory
|
101
|
+
Did you mean? '#{name} { #{association_options.inspect} }'
|
102
|
+
MSG
|
100
103
|
end
|
101
104
|
end
|
102
105
|
|
@@ -187,5 +190,9 @@ module FactoryBot
|
|
187
190
|
add_attribute(name, &block)
|
188
191
|
end
|
189
192
|
end
|
193
|
+
|
194
|
+
def __valid_association_options?(options)
|
195
|
+
options.respond_to?(:has_key?) && options.has_key?(:factory)
|
196
|
+
end
|
190
197
|
end
|
191
198
|
end
|
data/lib/factory_bot/errors.rb
CHANGED
@@ -2,6 +2,9 @@ module FactoryBot
|
|
2
2
|
# Raised when a factory is defined that attempts to instantiate itself.
|
3
3
|
class AssociationDefinitionError < RuntimeError; end
|
4
4
|
|
5
|
+
# Raised when a trait is defined that references itself.
|
6
|
+
class TraitDefinitionError < RuntimeError; end
|
7
|
+
|
5
8
|
# Raised when a callback is defined that has an invalid name
|
6
9
|
class InvalidCallbackNameError < RuntimeError; end
|
7
10
|
|
data/lib/factory_bot/factory.rb
CHANGED
data/lib/factory_bot/internal.rb
CHANGED
@@ -1,8 +1,26 @@
|
|
1
1
|
module FactoryBot
|
2
2
|
# @api private
|
3
3
|
module Internal
|
4
|
+
DEFAULT_STRATEGIES = {
|
5
|
+
build: FactoryBot::Strategy::Build,
|
6
|
+
create: FactoryBot::Strategy::Create,
|
7
|
+
attributes_for: FactoryBot::Strategy::AttributesFor,
|
8
|
+
build_stubbed: FactoryBot::Strategy::Stub,
|
9
|
+
null: FactoryBot::Strategy::Null,
|
10
|
+
}.freeze
|
11
|
+
|
12
|
+
DEFAULT_CALLBACKS = [
|
13
|
+
:after_create, :after_build, :after_stub, :after_create
|
14
|
+
].freeze
|
15
|
+
|
4
16
|
class << self
|
5
|
-
delegate :
|
17
|
+
delegate :callback_names,
|
18
|
+
:factories,
|
19
|
+
:inline_sequences,
|
20
|
+
:sequences,
|
21
|
+
:strategies,
|
22
|
+
:traits,
|
23
|
+
to: :configuration
|
6
24
|
|
7
25
|
def configuration
|
8
26
|
@configuration ||= Configuration.new
|
@@ -19,6 +37,66 @@ module FactoryBot
|
|
19
37
|
def rewind_inline_sequences
|
20
38
|
inline_sequences.each(&:rewind)
|
21
39
|
end
|
40
|
+
|
41
|
+
def register_trait(trait)
|
42
|
+
trait.names.each do |name|
|
43
|
+
traits.register(name, trait)
|
44
|
+
end
|
45
|
+
trait
|
46
|
+
end
|
47
|
+
|
48
|
+
def trait_by_name(name)
|
49
|
+
traits.find(name)
|
50
|
+
end
|
51
|
+
|
52
|
+
def register_sequence(sequence)
|
53
|
+
sequence.names.each do |name|
|
54
|
+
sequences.register(name, sequence)
|
55
|
+
end
|
56
|
+
sequence
|
57
|
+
end
|
58
|
+
|
59
|
+
def sequence_by_name(name)
|
60
|
+
sequences.find(name)
|
61
|
+
end
|
62
|
+
|
63
|
+
def rewind_sequences
|
64
|
+
sequences.each(&:rewind)
|
65
|
+
rewind_inline_sequences
|
66
|
+
end
|
67
|
+
|
68
|
+
def register_factory(factory)
|
69
|
+
factory.names.each do |name|
|
70
|
+
factories.register(name, factory)
|
71
|
+
end
|
72
|
+
factory
|
73
|
+
end
|
74
|
+
|
75
|
+
def factory_by_name(name)
|
76
|
+
factories.find(name)
|
77
|
+
end
|
78
|
+
|
79
|
+
def register_strategy(strategy_name, strategy_class)
|
80
|
+
strategies.register(strategy_name, strategy_class)
|
81
|
+
StrategySyntaxMethodRegistrar.new(strategy_name).define_strategy_methods
|
82
|
+
end
|
83
|
+
|
84
|
+
def strategy_by_name(name)
|
85
|
+
strategies.find(name)
|
86
|
+
end
|
87
|
+
|
88
|
+
def register_default_strategies
|
89
|
+
DEFAULT_STRATEGIES.each(&method(:register_strategy))
|
90
|
+
end
|
91
|
+
|
92
|
+
def register_default_callbacks
|
93
|
+
DEFAULT_CALLBACKS.each(&method(:register_callback))
|
94
|
+
end
|
95
|
+
|
96
|
+
def register_callback(name)
|
97
|
+
name = name.to_sym
|
98
|
+
callback_names << name
|
99
|
+
end
|
22
100
|
end
|
23
101
|
end
|
24
102
|
end
|
data/lib/factory_bot/reload.rb
CHANGED
@@ -44,15 +44,17 @@ module FactoryBot
|
|
44
44
|
end
|
45
45
|
|
46
46
|
def stub_database_interaction_on_result(result_instance)
|
47
|
-
result_instance
|
47
|
+
if has_settable_id?(result_instance)
|
48
|
+
result_instance.id ||= next_id
|
49
|
+
end
|
48
50
|
|
49
51
|
result_instance.instance_eval do
|
50
52
|
def persisted?
|
51
|
-
|
53
|
+
true
|
52
54
|
end
|
53
55
|
|
54
56
|
def new_record?
|
55
|
-
|
57
|
+
false
|
56
58
|
end
|
57
59
|
|
58
60
|
def destroyed?
|
@@ -68,6 +70,11 @@ module FactoryBot
|
|
68
70
|
end
|
69
71
|
end
|
70
72
|
|
73
|
+
def has_settable_id?(result_instance)
|
74
|
+
!result_instance.class.respond_to?(:primary_key) ||
|
75
|
+
result_instance.class.primary_key
|
76
|
+
end
|
77
|
+
|
71
78
|
def clear_changes_information(result_instance)
|
72
79
|
if result_instance.respond_to?(:clear_changes_information)
|
73
80
|
result_instance.clear_changes_information
|
@@ -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
|
-
|
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,11 +26,11 @@ module FactoryBot
|
|
26
26
|
end
|
27
27
|
|
28
28
|
def sequence(name, *args, &block)
|
29
|
-
|
29
|
+
Internal.register_sequence(Sequence.new(name, *args, &block))
|
30
30
|
end
|
31
31
|
|
32
32
|
def trait(name, &block)
|
33
|
-
|
33
|
+
Internal.register_trait(Trait.new(name, &block))
|
34
34
|
end
|
35
35
|
|
36
36
|
def to_create(&block)
|
@@ -54,13 +54,13 @@ module FactoryBot
|
|
54
54
|
private
|
55
55
|
|
56
56
|
def configuration
|
57
|
-
|
57
|
+
Internal.configuration
|
58
58
|
end
|
59
59
|
end
|
60
60
|
|
61
61
|
class ModifyDSL
|
62
62
|
def factory(name, _options = {}, &block)
|
63
|
-
factory =
|
63
|
+
factory = Internal.factory_by_name(name)
|
64
64
|
proxy = FactoryBot::DefinitionProxy.new(factory.definition.overridable)
|
65
65
|
proxy.instance_eval(&block)
|
66
66
|
end
|
@@ -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.
|
@@ -111,7 +111,7 @@ module FactoryBot
|
|
111
111
|
# Returns:
|
112
112
|
# The next value in the sequence. (Object)
|
113
113
|
def generate(name)
|
114
|
-
|
114
|
+
Internal.sequence_by_name(name).next
|
115
115
|
end
|
116
116
|
|
117
117
|
# Generates and returns the list of values in a sequence.
|
@@ -126,7 +126,7 @@ module FactoryBot
|
|
126
126
|
# The next value in the sequence. (Object)
|
127
127
|
def generate_list(name, count)
|
128
128
|
(1..count).map do
|
129
|
-
|
129
|
+
Internal.sequence_by_name(name).next
|
130
130
|
end
|
131
131
|
end
|
132
132
|
end
|
data/lib/factory_bot/trait.rb
CHANGED
@@ -7,9 +7,11 @@ module FactoryBot
|
|
7
7
|
@name = name.to_s
|
8
8
|
@block = block
|
9
9
|
@definition = Definition.new(@name)
|
10
|
-
|
11
10
|
proxy = FactoryBot::DefinitionProxy.new(@definition)
|
12
|
-
|
11
|
+
|
12
|
+
if block_given?
|
13
|
+
proxy.instance_eval(&@block)
|
14
|
+
end
|
13
15
|
end
|
14
16
|
|
15
17
|
delegate :add_callback, :declare_attribute, :to_create, :define_trait, :constructor,
|
data/lib/factory_bot/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: factory_bot
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 5.0
|
4
|
+
version: 5.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Josh Clayton
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2019-
|
12
|
+
date: 2019-09-21 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: activesupport
|
@@ -165,20 +165,6 @@ dependencies:
|
|
165
165
|
- - ">="
|
166
166
|
- !ruby/object:Gem::Version
|
167
167
|
version: '0'
|
168
|
-
- !ruby/object:Gem::Dependency
|
169
|
-
name: timecop
|
170
|
-
requirement: !ruby/object:Gem::Requirement
|
171
|
-
requirements:
|
172
|
-
- - ">="
|
173
|
-
- !ruby/object:Gem::Version
|
174
|
-
version: '0'
|
175
|
-
type: :development
|
176
|
-
prerelease: false
|
177
|
-
version_requirements: !ruby/object:Gem::Requirement
|
178
|
-
requirements:
|
179
|
-
- - ">="
|
180
|
-
- !ruby/object:Gem::Version
|
181
|
-
version: '0'
|
182
168
|
- !ruby/object:Gem::Dependency
|
183
169
|
name: yard
|
184
170
|
requirement: !ruby/object:Gem::Requirement
|
@@ -279,7 +265,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
279
265
|
- !ruby/object:Gem::Version
|
280
266
|
version: '0'
|
281
267
|
requirements: []
|
282
|
-
rubygems_version: 3.0.
|
268
|
+
rubygems_version: 3.0.3
|
283
269
|
signing_key:
|
284
270
|
specification_version: 4
|
285
271
|
summary: factory_bot provides a framework and DSL for defining and using model instance
|