factory_bot 6.2.1 → 6.4.1
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/CONTRIBUTING.md +2 -2
- data/GETTING_STARTED.md +90 -6
- data/NEWS.md +40 -1
- data/README.md +17 -15
- data/lib/factory_bot/attribute/dynamic.rb +2 -2
- data/lib/factory_bot/definition.rb +28 -8
- data/lib/factory_bot/definition_proxy.rb +1 -1
- data/lib/factory_bot/registry.rb +15 -3
- data/lib/factory_bot/strategy/stub.rb +16 -5
- data/lib/factory_bot/trait.rb +1 -1
- data/lib/factory_bot/version.rb +1 -1
- metadata +5 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: cd4158347cdd07c24704cef28823fee2a36da8ff245ca904dcc7a4f2554f1b35
|
4
|
+
data.tar.gz: 3ad522d063147cc2db17aba8a44328cb87a10b6dcf285adcfb4e02bc5ab86f1d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: bba849cae19f841877a2cfa2421e23a75560c9b75f96d1934a3db3128f1345b7349d86925795494c7b6e785bf0a19876d5b6dd6375c09dbed96a3ae2e86187cd
|
7
|
+
data.tar.gz: 2edd6b923df8ddb5e4a07c755bda1c9b279776236f587fc333043ee62bb82172dd0bf578c0f7f2297156b4dd057a775d5ef43b277cf6cb8d85ef8dc337065dba
|
data/CONTRIBUTING.md
CHANGED
@@ -94,12 +94,12 @@ Use [standard] to automatically format your code:
|
|
94
94
|
bundle exec rake standard:fix
|
95
95
|
```
|
96
96
|
|
97
|
-
[repo]: https://github.com/thoughtbot/factory_bot/tree/
|
97
|
+
[repo]: https://github.com/thoughtbot/factory_bot/tree/main
|
98
98
|
[fork]: https://help.github.com/articles/fork-a-repo/
|
99
99
|
[branch]: https://help.github.com/articles/creating-and-deleting-branches-within-your-repository/
|
100
100
|
[pr]: https://help.github.com/articles/using-pull-requests/
|
101
101
|
[standard]: https://github.com/testdouble/standard
|
102
102
|
[appraisal]: https://github.com/thoughtbot/appraisal
|
103
|
-
[reproduction script]: https://github.com/thoughtbot/factory_bot/blob/
|
103
|
+
[reproduction script]: https://github.com/thoughtbot/factory_bot/blob/main/.github/REPRODUCTION_SCRIPT.rb
|
104
104
|
|
105
105
|
Inspired by https://github.com/middleman/middleman-heroku/blob/master/CONTRIBUTING.md
|
data/GETTING_STARTED.md
CHANGED
@@ -1,3 +1,19 @@
|
|
1
|
+
**Deprecated**
|
2
|
+
|
3
|
+
See our extensive reference, guides, and cookbook in [the factory_bot book][].
|
4
|
+
|
5
|
+
For information on integrations with third party libraries, such as RSpec or
|
6
|
+
Rails, see [the factory_bot wiki][].
|
7
|
+
|
8
|
+
We also have [a detailed introductory video][], available for free on Upcase.
|
9
|
+
|
10
|
+
[a detailed introductory video]: https://upcase.com/videos/factory-bot?utm_source=github&utm_medium=open-source&utm_campaign=factory-girl
|
11
|
+
[the factory_bot book]: https://thoughtbot.github.io/factory_bot
|
12
|
+
[the factory_bot wiki]: https://github.com/thoughtbot/factory_bot/wiki
|
13
|
+
|
14
|
+
This document is deprecated and preserved for historical use. It may disappear
|
15
|
+
at any time.
|
16
|
+
|
1
17
|
Getting Started
|
2
18
|
===============
|
3
19
|
|
@@ -269,6 +285,9 @@ user = create(:user)
|
|
269
285
|
# Returns a hash of attributes that can be used to build a User instance
|
270
286
|
attrs = attributes_for(:user)
|
271
287
|
|
288
|
+
# Integrates with Ruby 3.0's support for pattern matching assignment
|
289
|
+
attributes_for(:user) => {email:, name:, **attrs}
|
290
|
+
|
272
291
|
# Returns an object with all defined attributes stubbed out
|
273
292
|
stub = build_stubbed(:user)
|
274
293
|
|
@@ -281,7 +300,7 @@ end
|
|
281
300
|
### Attribute overrides
|
282
301
|
|
283
302
|
No matter which strategy is used, it's possible to override the defined
|
284
|
-
attributes by passing a
|
303
|
+
attributes by passing a Hash:
|
285
304
|
|
286
305
|
```ruby
|
287
306
|
# Build a User instance and override the first_name property
|
@@ -290,6 +309,29 @@ user.first_name
|
|
290
309
|
# => "Joe"
|
291
310
|
```
|
292
311
|
|
312
|
+
Overriding associations is also supported:
|
313
|
+
|
314
|
+
```ruby
|
315
|
+
account = build(:account, :deluxe)
|
316
|
+
friends = build_list(:user, 2)
|
317
|
+
|
318
|
+
user = build(:user, account: account, friends: friends)
|
319
|
+
```
|
320
|
+
|
321
|
+
Ruby 3.1's support for [omitting values][] from `Hash` literals dovetails with
|
322
|
+
attribute overrides and provides an opportunity to limit the repetition of
|
323
|
+
variable names:
|
324
|
+
|
325
|
+
```ruby
|
326
|
+
account = build(:account, :deluxe)
|
327
|
+
friends = build_list(:user, 2)
|
328
|
+
|
329
|
+
# The keyword arguments correspond to local variable names, so omit their values
|
330
|
+
user = build(:user, account:, friends:)
|
331
|
+
```
|
332
|
+
|
333
|
+
[omitting values]: https://docs.ruby-lang.org/en/3.1/syntax/literals_rdoc.html#label-Hash+Literals
|
334
|
+
|
293
335
|
### `build_stubbed` and `Marshal.dump`
|
294
336
|
|
295
337
|
Note that objects created with `build_stubbed` cannot be serialized with
|
@@ -424,7 +466,7 @@ end
|
|
424
466
|
Method Name / Reserved Word Attributes
|
425
467
|
-------------------------------
|
426
468
|
|
427
|
-
If your attributes conflict with existing methods or reserved words (all methods in the [DefinitionProxy](https://github.com/thoughtbot/factory_bot/blob/
|
469
|
+
If your attributes conflict with existing methods or reserved words (all methods in the [DefinitionProxy](https://github.com/thoughtbot/factory_bot/blob/main/lib/factory_bot/definition_proxy.rb) class) you can define them with `add_attribute`.
|
428
470
|
|
429
471
|
```ruby
|
430
472
|
factory :dna do
|
@@ -929,7 +971,7 @@ end
|
|
929
971
|
Note that this approach works with `build`, `build_stubbed`, and `create`, but
|
930
972
|
the associations will return `nil` when using `attributes_for`.
|
931
973
|
|
932
|
-
Also, note that if you assign any attributes inside a custom `initialize_with`
|
974
|
+
Also, note that if you assign any attributes inside a custom `initialize_with`
|
933
975
|
(e.g. `initialize_with { new(**attributes) }`), those attributes should not refer to `instance`,
|
934
976
|
since it will be `nil`.
|
935
977
|
|
@@ -992,6 +1034,17 @@ factory :user do
|
|
992
1034
|
end
|
993
1035
|
```
|
994
1036
|
|
1037
|
+
With Ruby 2.7's support for [numbered parameters][], inline definitions can be
|
1038
|
+
even more abbreviated:
|
1039
|
+
|
1040
|
+
```ruby
|
1041
|
+
factory :user do
|
1042
|
+
sequence(:email) { "person#{_1}@example.com" }
|
1043
|
+
end
|
1044
|
+
```
|
1045
|
+
|
1046
|
+
[numbered parameters]: https://ruby-doc.org/core-2.7.1/Proc.html#class-Proc-label-Numbered+parameters
|
1047
|
+
|
995
1048
|
### Initial value
|
996
1049
|
|
997
1050
|
You can override the initial value. Any value that responds to the `#next`
|
@@ -1206,11 +1259,11 @@ FactoryBot.define do
|
|
1206
1259
|
created_at { 8.days.ago }
|
1207
1260
|
updated_at { 4.days.ago }
|
1208
1261
|
end
|
1209
|
-
|
1262
|
+
|
1210
1263
|
factory :user, traits: [:timestamps] do
|
1211
1264
|
username { "john_doe" }
|
1212
1265
|
end
|
1213
|
-
|
1266
|
+
|
1214
1267
|
factory :post do
|
1215
1268
|
timestamps
|
1216
1269
|
title { "Traits rock" }
|
@@ -1872,6 +1925,10 @@ class JsonStrategy
|
|
1872
1925
|
def result(evaluation)
|
1873
1926
|
@strategy.result(evaluation).to_json
|
1874
1927
|
end
|
1928
|
+
|
1929
|
+
def to_sym
|
1930
|
+
:json
|
1931
|
+
end
|
1875
1932
|
end
|
1876
1933
|
```
|
1877
1934
|
|
@@ -1912,6 +1969,10 @@ class JsonStrategy
|
|
1912
1969
|
evaluation.notify(:make_json_awesome, json)
|
1913
1970
|
end
|
1914
1971
|
end
|
1972
|
+
|
1973
|
+
def to_sym
|
1974
|
+
:json
|
1975
|
+
end
|
1915
1976
|
end
|
1916
1977
|
|
1917
1978
|
FactoryBot.register_strategy(:json, JsonStrategy)
|
@@ -1966,7 +2027,7 @@ ActiveSupport Instrumentation
|
|
1966
2027
|
|
1967
2028
|
In order to track what factories are created (and with what build strategy),
|
1968
2029
|
`ActiveSupport::Notifications` are included to provide a way to subscribe to
|
1969
|
-
factories being run. One example would be to track factories based on a
|
2030
|
+
factories being compiled and run. One example would be to track factories based on a
|
1970
2031
|
threshold of execution time.
|
1971
2032
|
|
1972
2033
|
```ruby
|
@@ -2000,6 +2061,29 @@ config.after(:suite) do
|
|
2000
2061
|
end
|
2001
2062
|
```
|
2002
2063
|
|
2064
|
+
Another example could involve tracking the attributes and traits that factories are compiled with. If you're using RSpec, you could add `before(:suite)` and `after(:suite)` blocks that subscribe to `factory_bot.compile_factory` notifications:
|
2065
|
+
|
2066
|
+
```ruby
|
2067
|
+
factory_bot_results = {}
|
2068
|
+
config.before(:suite) do
|
2069
|
+
ActiveSupport::Notifications.subscribe("factory_bot.compile_factory") do |name, start, finish, id, payload|
|
2070
|
+
factory_name = payload[:name]
|
2071
|
+
factory_class = payload[:class]
|
2072
|
+
attributes = payload[:attributes]
|
2073
|
+
traits = payload[:traits]
|
2074
|
+
factory_bot_results[factory_class] ||= {}
|
2075
|
+
factory_bot_results[factory_class][factory_name] = {
|
2076
|
+
attributes: attributes.map(&:name)
|
2077
|
+
traits: traits.map(&:name)
|
2078
|
+
}
|
2079
|
+
end
|
2080
|
+
end
|
2081
|
+
|
2082
|
+
config.after(:suite) do
|
2083
|
+
puts factory_bot_results
|
2084
|
+
end
|
2085
|
+
```
|
2086
|
+
|
2003
2087
|
Rails Preloaders and RSpec
|
2004
2088
|
--------------------------
|
2005
2089
|
|
data/NEWS.md
CHANGED
@@ -1,9 +1,46 @@
|
|
1
1
|
# News
|
2
2
|
|
3
|
+
## 6.4.1 (November 20, 2023)
|
4
|
+
|
5
|
+
* Fix: factories with traits pass their class to ActiveSupport::Notifications
|
6
|
+
(makicamel).
|
7
|
+
|
8
|
+
## 6.4.0 (November 17, 2023)
|
9
|
+
|
10
|
+
* Added: if `build_stubbed` detects a UUID primary key, generate the correct
|
11
|
+
type (Peter Boling, Alexandre Ruban).
|
12
|
+
* Docs: show examples of Ruby 3 syntactic sugars (Sean Doyle).
|
13
|
+
* Internal: resolve test warning messages (Mike Burns).
|
14
|
+
|
15
|
+
|
16
|
+
## 6.3.0 (September 1, 2023)
|
17
|
+
|
18
|
+
* Fix: link to changelog for RubyGems (Berkan Ünal).
|
19
|
+
* Fix: integrate with Ruby 3.2's `did_you_mean` library (Daniel Colson).
|
20
|
+
* Changed: explicitly define `#destroyed?` within the `Stub` strategy to return `false` to be consistent
|
21
|
+
with ActiveRecord (Benjamin Fleischer).
|
22
|
+
* Added: announce `factory_bot.compile_factory` notification (Sean Doyle).
|
23
|
+
* Docs: clarify that custom strategies need to define `#to_sym` (Edmund Korley, Jonas S).
|
24
|
+
* Docs: fix CI link in README (Mark Huk).
|
25
|
+
* Docs: fix GitHub links (Robert Fletcher).
|
26
|
+
* Docs: install this library with `bundle add` (Glauco Custódio).
|
27
|
+
* Docs: re-write into mdBook (Mike Burns, Sara Jackson, Stefanni Brasil)
|
28
|
+
* Docs: clarify that automatic trait definitions could introduce new linting errors (Lawrence Chou).
|
29
|
+
* Internal: skip TruffleRuby on Rails 5.0, 5.1, 5.2 (Andrii Konchyn).
|
30
|
+
* Internal: fix typoes throughout codebase (Yudai Takada).
|
31
|
+
* Internal: run CI on `actions/checkout` v3 (Yudai Takada).
|
32
|
+
* Internal: follow standardrb code style (Yudai Takada).
|
33
|
+
* Internal: stop using Hound (Daniel Nolan).
|
34
|
+
* Internal: only run simplecov on C Ruby (Daniel Colson).
|
35
|
+
* Internal: quieter Cucumber (Daniel Colson).
|
36
|
+
* Internal: Ruby 3.2 support (Daniel Colson).
|
37
|
+
* Internal: Mike Burns is the CODEOWNER (Stefanni Brasil).
|
38
|
+
|
3
39
|
## 6.2.1 (March 8, 2022)
|
4
40
|
* Added: CI testing against truffleruby
|
5
41
|
* Changed: Documentation improvements for sequences and traits
|
6
42
|
* Fixed: ActiveSupport::Notifications reporting strategy through associations now report as symbols
|
43
|
+
* BREAKING CHANGE: Custom strategies now need to define a `to_sym` method to specify the strategy identifier
|
7
44
|
* Fixed: `add_attribute` with reserved keywords assigns values correctly
|
8
45
|
|
9
46
|
## 6.2.0 (May 7, 2021)
|
@@ -27,7 +64,9 @@
|
|
27
64
|
* Added: automatic definition of traits for Active Record enum attributes, enabled by default
|
28
65
|
(Note that this required changing where factory_bot constantizes the build
|
29
66
|
class, which may affect applications that were using abstract factories for
|
30
|
-
inheritance. See issue #1409.)
|
67
|
+
inheritance. See issue #1409.) (This may break `FactoryBot.lint` because
|
68
|
+
there may be previously non-existing factory+trait combinations being
|
69
|
+
defined and checked)
|
31
70
|
* Added: `traits_for_enum` method to define traits for non-Active Record enums
|
32
71
|
* Added: `build_stubbed_starting_id=` option to define the starting id for `build_stubbed`
|
33
72
|
* Removed: deprecated methods on the top-level `FactoryBot` module meant only for internal use
|
data/README.md
CHANGED
@@ -16,24 +16,26 @@ Check out the [guide](https://github.com/thoughtbot/factory_bot/blob/4-9-0-stabl
|
|
16
16
|
Documentation
|
17
17
|
-------------
|
18
18
|
|
19
|
-
|
19
|
+
See our extensive reference, guides, and cookbook in [the factory_bot book][].
|
20
20
|
|
21
|
-
|
22
|
-
|
21
|
+
For information on integrations with third party libraries, such as RSpec or
|
22
|
+
Rails, see [the factory_bot wiki][].
|
23
|
+
|
24
|
+
We also have [a detailed introductory video][], available for free on Upcase.
|
23
25
|
|
24
26
|
[a detailed introductory video]: https://upcase.com/videos/factory-bot?utm_source=github&utm_medium=open-source&utm_campaign=factory-girl
|
27
|
+
[the factory_bot book]: https://thoughtbot.github.io/factory_bot
|
28
|
+
[the factory_bot wiki]: https://github.com/thoughtbot/factory_bot/wiki
|
25
29
|
|
26
30
|
Install
|
27
31
|
--------
|
28
32
|
|
29
|
-
|
33
|
+
Run:
|
30
34
|
|
31
35
|
```ruby
|
32
|
-
|
36
|
+
bundle add factory_bot
|
33
37
|
```
|
34
38
|
|
35
|
-
and run `bundle install` from your shell.
|
36
|
-
|
37
39
|
To install the gem manually from your shell, run:
|
38
40
|
|
39
41
|
```shell
|
@@ -43,7 +45,7 @@ gem install factory_bot
|
|
43
45
|
Supported Ruby versions
|
44
46
|
-----------------------
|
45
47
|
|
46
|
-
Supported Ruby versions are listed in [`.github/workflows/build.yml`](https://github.com/thoughtbot/factory_bot/blob/
|
48
|
+
Supported Ruby versions are listed in [`.github/workflows/build.yml`](https://github.com/thoughtbot/factory_bot/blob/main/.github/workflows/build.yml)
|
47
49
|
|
48
50
|
More Information
|
49
51
|
----------------
|
@@ -53,8 +55,8 @@ More Information
|
|
53
55
|
* [Issues](https://github.com/thoughtbot/factory_bot/issues)
|
54
56
|
* [GIANT ROBOTS SMASHING INTO OTHER GIANT ROBOTS](https://robots.thoughtbot.com/)
|
55
57
|
|
56
|
-
[GETTING_STARTED]: https://github.com/thoughtbot/factory_bot/blob/
|
57
|
-
[NAME]: https://github.com/thoughtbot/factory_bot/blob/
|
58
|
+
[GETTING_STARTED]: https://github.com/thoughtbot/factory_bot/blob/main/GETTING_STARTED.md
|
59
|
+
[NAME]: https://github.com/thoughtbot/factory_bot/blob/main/NAME.md
|
58
60
|
|
59
61
|
Useful Tools
|
60
62
|
------------
|
@@ -64,7 +66,7 @@ Useful Tools
|
|
64
66
|
Contributing
|
65
67
|
------------
|
66
68
|
|
67
|
-
Please see [CONTRIBUTING.md](https://github.com/thoughtbot/factory_bot/blob/
|
69
|
+
Please see [CONTRIBUTING.md](https://github.com/thoughtbot/factory_bot/blob/main/CONTRIBUTING.md).
|
68
70
|
|
69
71
|
factory_bot was originally written by Joe Ferris and is maintained by thoughtbot.
|
70
72
|
Many improvements and bugfixes were contributed by the [open source
|
@@ -73,11 +75,11 @@ community](https://github.com/thoughtbot/factory_bot/graphs/contributors).
|
|
73
75
|
License
|
74
76
|
-------
|
75
77
|
|
76
|
-
factory_bot is Copyright © 2008-
|
78
|
+
factory_bot is Copyright © 2008-2022 Joe Ferris and thoughtbot. It is free
|
77
79
|
software, and may be redistributed under the terms specified in the
|
78
80
|
[LICENSE] file.
|
79
81
|
|
80
|
-
[LICENSE]: https://github.com/thoughtbot/factory_bot/blob/
|
82
|
+
[LICENSE]: https://github.com/thoughtbot/factory_bot/blob/main/LICENSE
|
81
83
|
|
82
84
|
|
83
85
|
About thoughtbot
|
@@ -94,8 +96,8 @@ See [our other projects][community] or
|
|
94
96
|
|
95
97
|
[community]: https://thoughtbot.com/community?utm_source=github
|
96
98
|
[hire]: https://thoughtbot.com/hire-us?utm_source=github
|
97
|
-
[ci-image]: https://github.com/thoughtbot/factory_bot/actions/workflows/build.yml/badge.svg
|
98
|
-
[ci]: https://github.com/thoughtbot/factory_bot/actions?query=workflow%
|
99
|
+
[ci-image]: https://github.com/thoughtbot/factory_bot/actions/workflows/build.yml/badge.svg?branch=main
|
100
|
+
[ci]: https://github.com/thoughtbot/factory_bot/actions?query=workflow%3ABuild+branch%3Amain
|
99
101
|
[grade-image]: https://codeclimate.com/github/thoughtbot/factory_bot/badges/gpa.svg
|
100
102
|
[grade]: https://codeclimate.com/github/thoughtbot/factory_bot
|
101
103
|
[version-image]: https://badge.fury.io/rb/factory_bot.svg
|
@@ -12,8 +12,8 @@ module FactoryBot
|
|
12
12
|
|
13
13
|
-> {
|
14
14
|
value = case block.arity
|
15
|
-
|
16
|
-
|
15
|
+
when 1, -1, -2 then instance_exec(self, &block)
|
16
|
+
else instance_exec(&block)
|
17
17
|
end
|
18
18
|
raise SequenceAbuseError if FactoryBot::Sequence === value
|
19
19
|
|
@@ -2,6 +2,7 @@ module FactoryBot
|
|
2
2
|
# @api private
|
3
3
|
class Definition
|
4
4
|
attr_reader :defined_traits, :declarations, :name, :registered_enums
|
5
|
+
attr_accessor :klass
|
5
6
|
|
6
7
|
def initialize(name, base_traits = [])
|
7
8
|
@name = name
|
@@ -52,11 +53,19 @@ module FactoryBot
|
|
52
53
|
declarations.attributes
|
53
54
|
|
54
55
|
defined_traits.each do |defined_trait|
|
56
|
+
defined_trait.klass ||= klass
|
55
57
|
base_traits.each { |bt| bt.define_trait defined_trait }
|
56
58
|
additional_traits.each { |at| at.define_trait defined_trait }
|
57
59
|
end
|
58
60
|
|
59
61
|
@compiled = true
|
62
|
+
|
63
|
+
ActiveSupport::Notifications.instrument "factory_bot.compile_factory", {
|
64
|
+
name: name,
|
65
|
+
attributes: declarations.attributes,
|
66
|
+
traits: defined_traits,
|
67
|
+
class: klass || self.klass
|
68
|
+
}
|
60
69
|
end
|
61
70
|
end
|
62
71
|
|
@@ -115,15 +124,26 @@ module FactoryBot
|
|
115
124
|
raise error_with_definition_name(error)
|
116
125
|
end
|
117
126
|
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
" referenced within \"#{name}\" definition"
|
123
|
-
)
|
127
|
+
# detailed_message introduced in Ruby 3.2 for cleaner integration with
|
128
|
+
# did_you_mean. See https://bugs.ruby-lang.org/issues/18564
|
129
|
+
if KeyError.method_defined?(:detailed_message)
|
130
|
+
def error_with_definition_name(error)
|
131
|
+
message = error.message + " referenced within \"#{name}\" definition"
|
124
132
|
|
125
|
-
|
126
|
-
|
133
|
+
error.class.new(message, key: error.key, receiver: error.receiver)
|
134
|
+
.tap { |new_error| new_error.set_backtrace(error.backtrace) }
|
135
|
+
end
|
136
|
+
else
|
137
|
+
def error_with_definition_name(error)
|
138
|
+
message = error.message
|
139
|
+
message.insert(
|
140
|
+
message.index("\nDid you mean?") || message.length,
|
141
|
+
" referenced within \"#{name}\" definition"
|
142
|
+
)
|
143
|
+
|
144
|
+
error.class.new(message).tap do |new_error|
|
145
|
+
new_error.set_backtrace(error.backtrace)
|
146
|
+
end
|
127
147
|
end
|
128
148
|
end
|
129
149
|
|
@@ -151,7 +151,7 @@ module FactoryBot
|
|
151
151
|
def association(name, *options)
|
152
152
|
if block_given?
|
153
153
|
raise AssociationDefinitionError.new(
|
154
|
-
"Unexpected block passed to '#{name}' association "\
|
154
|
+
"Unexpected block passed to '#{name}' association " \
|
155
155
|
"in '#{@definition.name}' factory"
|
156
156
|
)
|
157
157
|
else
|
data/lib/factory_bot/registry.rb
CHANGED
@@ -39,9 +39,21 @@ module FactoryBot
|
|
39
39
|
|
40
40
|
def key_error_with_custom_message(key_error)
|
41
41
|
message = key_error.message.sub("key not found", "#{@name} not registered")
|
42
|
-
|
43
|
-
|
44
|
-
|
42
|
+
new_key_error(message, key_error).tap do |error|
|
43
|
+
error.set_backtrace(key_error.backtrace)
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
# detailed_message introduced in Ruby 3.2 for cleaner integration with
|
48
|
+
# did_you_mean. See https://bugs.ruby-lang.org/issues/18564
|
49
|
+
if KeyError.method_defined?(:detailed_message)
|
50
|
+
def new_key_error(message, key_error)
|
51
|
+
KeyError.new(message, key: key_error.key, receiver: key_error.receiver)
|
52
|
+
end
|
53
|
+
else
|
54
|
+
def new_key_error(message, _)
|
55
|
+
KeyError.new(message)
|
56
|
+
end
|
45
57
|
end
|
46
58
|
end
|
47
59
|
end
|
@@ -47,13 +47,17 @@ module FactoryBot
|
|
47
47
|
|
48
48
|
private
|
49
49
|
|
50
|
-
def next_id
|
51
|
-
|
50
|
+
def next_id(result_instance)
|
51
|
+
if uuid_primary_key?(result_instance)
|
52
|
+
SecureRandom.uuid
|
53
|
+
else
|
54
|
+
@@next_id += 1
|
55
|
+
end
|
52
56
|
end
|
53
57
|
|
54
58
|
def stub_database_interaction_on_result(result_instance)
|
55
59
|
if has_settable_id?(result_instance)
|
56
|
-
result_instance.id ||= next_id
|
60
|
+
result_instance.id ||= next_id(result_instance)
|
57
61
|
end
|
58
62
|
|
59
63
|
result_instance.instance_eval do
|
@@ -66,12 +70,12 @@ module FactoryBot
|
|
66
70
|
end
|
67
71
|
|
68
72
|
def destroyed?
|
69
|
-
|
73
|
+
false
|
70
74
|
end
|
71
75
|
|
72
76
|
DISABLED_PERSISTENCE_METHODS.each do |write_method|
|
73
77
|
define_singleton_method(write_method) do |*args|
|
74
|
-
raise "stubbed models are not allowed to access the database - "\
|
78
|
+
raise "stubbed models are not allowed to access the database - " \
|
75
79
|
"#{self.class}##{write_method}(#{args.join(",")})"
|
76
80
|
end
|
77
81
|
end
|
@@ -83,6 +87,13 @@ module FactoryBot
|
|
83
87
|
result_instance.class.primary_key
|
84
88
|
end
|
85
89
|
|
90
|
+
def uuid_primary_key?(result_instance)
|
91
|
+
result_instance.respond_to?(:column_for_attribute) &&
|
92
|
+
(column = result_instance.column_for_attribute(result_instance.class.primary_key)) &&
|
93
|
+
column.respond_to?(:sql_type) &&
|
94
|
+
column.sql_type == "uuid"
|
95
|
+
end
|
96
|
+
|
86
97
|
def clear_changes_information(result_instance)
|
87
98
|
if result_instance.respond_to?(:clear_changes_information)
|
88
99
|
result_instance.clear_changes_information
|
data/lib/factory_bot/trait.rb
CHANGED
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: 6.
|
4
|
+
version: 6.4.1
|
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:
|
12
|
+
date: 2023-11-20 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: activesupport
|
@@ -236,7 +236,8 @@ files:
|
|
236
236
|
homepage: https://github.com/thoughtbot/factory_bot
|
237
237
|
licenses:
|
238
238
|
- MIT
|
239
|
-
metadata:
|
239
|
+
metadata:
|
240
|
+
changelog_uri: https://github.com/thoughtbot/factory_bot/blob/main/NEWS.md
|
240
241
|
post_install_message:
|
241
242
|
rdoc_options: []
|
242
243
|
require_paths:
|
@@ -252,7 +253,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
252
253
|
- !ruby/object:Gem::Version
|
253
254
|
version: '0'
|
254
255
|
requirements: []
|
255
|
-
rubygems_version: 3.
|
256
|
+
rubygems_version: 3.4.10
|
256
257
|
signing_key:
|
257
258
|
specification_version: 4
|
258
259
|
summary: factory_bot provides a framework and DSL for defining and using model instance
|