factory_bot 5.0.2 → 5.1.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|