factory_bot 4.8.2 → 5.2.0

Sign up to get free protection for your applications and to get access to all the features.
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
data/LICENSE CHANGED
@@ -1,4 +1,4 @@
1
- Copyright (c) 2008-2017 Joe Ferris and thoughtbot, inc.
1
+ Copyright (c) 2008-2019 Joe Ferris and thoughtbot, inc.
2
2
 
3
3
  Permission is hereby granted, free of charge, to any person obtaining a copy
4
4
  of this software and associated documentation files (the "Software"), to deal
data/NAME.md CHANGED
@@ -1,11 +1,18 @@
1
- # Why is this project called "Factory Girl"?
1
+ # Project Naming History
2
2
 
3
- The name "Factory Girl" might be confusing to some developers who encounter this
4
- library.
3
+ ## Factory Girl
5
4
 
6
- [We chose the name](https://robots.thoughtbot.com/waiting-for-a-factory-girl) as
7
- a nod in the direction of the [Factory method](https://en.wikipedia.org/wiki/Factory_method_pattern)
5
+ This library was [initially released](https://robots.thoughtbot.com/waiting-for-a-factory-girl)
6
+ in 2008 with the name "Factory Girl".
7
+
8
+ We chose the name as a nod in the direction of the [Factory method](https://en.wikipedia.org/wiki/Factory_method_pattern)
8
9
  and [Object Mother](http://martinfowler.com/bliki/ObjectMother.html) software
9
10
  patterns from the _Design Patterns_ book, and as a reference to the
10
11
  [Rolling Stones song](https://www.youtube.com/watch?v=4jKix2DFlnA) of the same
11
12
  name.
13
+
14
+ ## Factory Bot
15
+
16
+ The name "Factory Girl" was confusing to some developers who encountered this
17
+ library, and offensive or problematic to others. In October 2017 we [renamed the library](https://robots.thoughtbot.com/factory_bot)
18
+ to "Factory Bot".
data/NEWS.md ADDED
@@ -0,0 +1,351 @@
1
+ # News
2
+
3
+ ## 5.2.0 (April 24, 2020)
4
+ * Added: Pass index to block for `*_list` methods
5
+ * Deprecated: top-level methods meant only for internal use: `callbacks`, `configuration`, `constructor`, `initialize_with`, `register_sequence`, `resent_configuration`, `skip_create`, `to_create`
6
+
7
+ ## 5.1.2 (March 25, 2020)
8
+ * Fixed: Ruby 2.7 keyword deprecation warning in FactoryBot.lint
9
+
10
+ ## 5.1.1 (October 2, 2019)
11
+ * Improved: performance of traits
12
+ * Fixed: registering strategies on JRuby
13
+
14
+ ## 5.1.0 (September 21, 2019)
15
+ * Added: "Did you mean?" style error message to help with typos in association declarations
16
+ * Changed: `NoMethodError` for static attributes now offers a "Did you mean?" style message
17
+ * Fixed: avoid undefining inherited evaluator methods
18
+ * Fixed: avoid stubbing id for records without a primary key
19
+ * Fixed: raise a helpful error for self-referencing traits to avoid a `SystemStackError`
20
+ * 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`
21
+
22
+ ## 5.0.2 (February 22, 2019)
23
+ * Bugfix: raise "Trait not registered" error when passing invalid trait arguments
24
+
25
+ ## 5.0.1 (February 15, 2019)
26
+ * Bugfix: Do not raise error when two sequences have the same name
27
+ in two traits that have the same name
28
+
29
+ ## 5.0.0 (February 1, 2019)
30
+ * Added: Verbose option to include full backtraces in the linting output
31
+ * Changed: use_parent_strategy now defaults to true, so by default the
32
+ build strategy will build, rather than create associations
33
+ * Changed: Passing a block when defining associations now raises an error
34
+ * Bugfix: use_parent_strategy is no longer reset by FactoryBot.reload
35
+ * Bugfix: rewind_sequences will now rewind local sequences along with the global ones
36
+ * Bugfix: the build_stubbed strategy now sets timestamps without changing the
37
+ the original behavior of the timestamp methods
38
+ * Bugfix: avoid a stack error when referring to an "attributes" attribute in initialize_with
39
+ * Removed: support for EOL versions of Ruby and Rails
40
+ * Removed: static attributes (use dynamic attributes with a block instead)
41
+ * Removed: looking up factories by class
42
+ * Removed: ignore method (use transient instead)
43
+ * Removed: duplicate_attribute_assignment_from_initialize_with configuration option
44
+ * Deprecated: allow_class_lookup configuration option
45
+
46
+ ## 4.11.1 (September 7, 2018)
47
+ * Documentation: Include .yardopts in the gem to fix broken RubyDoc links
48
+
49
+ ## 4.11.0 (August, 15, 2018)
50
+ * Bugfix: Do not raise error for valid build_stubbed methods: decrement, increment, and toggle
51
+ * Bugfix: Do not add timestamps with build_stubbed for objects that shouldn't have timestamps
52
+ * Deprecate static attributes
53
+
54
+ ## 4.10.0 (May 25, 2018)
55
+ * Allow sequences to be rewound
56
+
57
+ ## 4.9.0 (skipped - FactoryGirl only release)
58
+
59
+ ## 4.8.2 (October 20, 2017)
60
+ * Rename factory_girl to factory_bot
61
+
62
+ ## 4.8.1 (September 28, 2017)
63
+ * Explicitly define `#destroyed?` within the `Stub` strategy to return `nil` instead of raising
64
+ * Update various dependencies
65
+ * Update internal test suite to use RSpec's mocking/stubbing instead of mocha
66
+
67
+ ## 4.8.0 (December 16, 2016)
68
+ * Improve documentation
69
+ * Add `FactoryGirl.generate_list` to be consistent with `build_list`/`create_list` and friends
70
+ * Add `FactoryGirl.use_parent_strategy` configuration to allow associations to leverage parent build strategy
71
+
72
+ ## 4.7.0 (April 1, 2016)
73
+ * Improve documentation
74
+ * Improve instrumentation payload to include traits, overrides, and the factory itself
75
+ * Allow linting of traits
76
+ * Deprecate factory lookup by class name in preparation for 5.0
77
+ * Improve internal performance by using flat_map instead of map and compact
78
+ * Improve handling of dirty attributes after building a stubbed object
79
+ * Reduce warnings from redefining methods
80
+
81
+ ## 4.6.0 (skipped)
82
+
83
+ ## 4.5.0 (October 17, 2014)
84
+ * Improve FactoryGirl.lint by including exception and message in output
85
+ * Allow selective linting
86
+ * Use more explicit #public_send when doing attribute assignment
87
+ * Improve documentation around FactoryGirl.lint and initialize_with
88
+ * Deprecate #ignore in favor of #transient
89
+
90
+ ## 4.4.0 (February 10, 2014)
91
+ * Add FactoryGirl.lint
92
+ * Fix memory leak in duplicate traits
93
+ * Update documentation
94
+
95
+ ## 4.3.0 (November 3, 2013)
96
+ * Start testing against Rails 4.0 and Ruby 2.0.0
97
+ * Stop testing against Rails 3.0 and Ruby 1.9.2
98
+ * Add `*_pair` methods to only build two objects
99
+ * Raise if a method is defined with a FactoryGirl block (factory or trait)
100
+ * Allow use of Symbol#to_proc in callbacks
101
+ * Add global callbacks
102
+ * Improve GETTING_STARTED and README
103
+
104
+ ## 4.2.0 (January 18, 2013)
105
+ * Improve documentation
106
+ * Allow `*_list` syntax methods to accept a block
107
+ * Update gem dependencies
108
+ * Allow setting id for objects created with `build_stubbed`
109
+ * Fix Stub strategy to mimic ActiveRecord regarding `created_at`
110
+ * Evaluate sequences within the context of an Evaluator
111
+ * Fix Mocha deprecation warning
112
+ * Fix some warnings when running RUBYOPT=-w rake
113
+ * Convert test suite to RSpec's "expect" syntax
114
+
115
+ ## 4.1.0 (September 11, 2012)
116
+ * Allow multiple callbacks to bind to the same block
117
+ * Fix documentation surrounding the stub strategy
118
+
119
+ ## 4.0.0 (August 3, 2012)
120
+ * Remove deprecated cucumber_steps
121
+ * Remove deprecated alternate syntaxes
122
+ * Deprecate duplicate_attribute_assignment_from_initialize_with, which is now unused
123
+ as attributes assigned within initialize_with are not subsequently assigned
124
+
125
+ ## 3.6.1 (August 2, 2012)
126
+ Update README to include info about running with JRuby
127
+ * Update dependencies on RSpec and tiny versions of Rails in Appraisal
128
+ * Improve flexibility of using traits with associations and add documentation
129
+ * Stub update_column to raise to mirror ActiveRecord's change from update_attribute
130
+
131
+ ## 3.6.0 (July 27, 2012)
132
+ * Code/spec cleanup
133
+ * Allow factories with traits to be used in associations
134
+ * Refactor Factory to use DefinitionHierarchy to handle managing callbacks,
135
+ custom constructor, and custom to_create
136
+ * Add memoization to speed up factories providing attribute overrides
137
+ * Add initial support of JRuby when running in 1.9 mode
138
+ * Improve docs on what happens when including FactoryGirl::Syntax::Methods
139
+
140
+ ## 3.5.0 (June 22, 2012)
141
+ * Allow created_at to be set when using build_stubbed
142
+ * Deprecate FactoryGirl step definitions
143
+
144
+ ## 3.4.2 (June 19, 2012)
145
+ * Fix bug in traits with callbacks called implicitly in factories whose
146
+ callbacks trigger multiple times
147
+
148
+ ## 3.4.1 (June 18, 2012)
149
+ * Fix traits so they can be nested and referred to from other traits
150
+
151
+ ## 3.4.0 (June 11, 2012)
152
+ * Sequences support Enumerators
153
+ * Optionally disable duplicate assignment of attributes in initialize_with
154
+ * Make hash of public attributes available in initialize_with
155
+ * Support referring to a factory based on class name
156
+
157
+ ## 3.3.0 (May 13, 2012)
158
+ * Allow to_create, skip_create, and initialize_with to be defined globally
159
+ * Allow to_create, skip_create, and initialize_with to be defined within traits
160
+ * Fix deprecation messages for alternate syntaxes (make, generate, etc.)
161
+ * Improve library documentation
162
+ * Deprecate after_build, after_create, before_create, after_stub in favor of new callbacks
163
+ * Introduce new callback syntax: after(:build) {}, after(:custom) {}, or callback(:different) {}
164
+ This allows for declaring any callback, usable with custom strategies
165
+ * Add attributes_for_list and build_stubbed_list with the StrategySyntaxMethodRegistrar
166
+ * Allow use of syntax methods (build, create, generate, etc) implicitly in callbacks
167
+ * Internal refactoring of a handful of components
168
+
169
+ ## 3.2.0 (April 24, 2012)
170
+ * Use AS::Notifications for pub/sub to track running factories
171
+ * Call new within initialize_with implicitly on the build class
172
+ * Skip to_create with skip_create
173
+ * Allow registration of custom strategies
174
+ * Deprecate alternate syntaxes
175
+ * Implicitly call factory_bot's syntax methods from dynamic attributes
176
+
177
+ ## 3.1.0 (April 6, 2012)
178
+ * Sequences support aliases, which reference the same block
179
+ * Update documentation
180
+ * Add before_create callback
181
+ * Support use of #attribute_names method to determine available attributes for steps
182
+ * Use ActiveSupport::Deprecation for all deprecations
183
+
184
+ ## 3.0.0 (March 23, 2012)
185
+ * Deprecate the vintage syntax
186
+ * Remove Rails 2.x support
187
+ * Remove Ruby 1.8 support
188
+ * Remove deprecated features, including default_strategy, factory_name,
189
+ :method for defining default strategy, ignore on individual attributes, and
190
+ interacting with Factory the way you would FactoryGirl
191
+
192
+ ## 2.6.4 (March 16, 2012)
193
+ * Do not ignore names of transient attributes
194
+ * Ensure attributes set on instance are calculated uniquely
195
+
196
+ ## 2.6.3 (March 9, 2012)
197
+ * Fix issue with traits not being present the first time a factory is accessed
198
+ * Update available Cucumber step definitions to not require a trailing colon
199
+ when building a table of attributes to instantiate records with
200
+
201
+ ## 2.6.2 (March 9, 2012)
202
+ * Allow factories to use all their ancestors' traits
203
+ * Ignore bin dir generated by bundler
204
+ * Namespace ::Factory as top-level to fix vintage syntax issue with
205
+ Ruby 1.9.2-p3p18
206
+
207
+ ## 2.6.1 (March 2, 2012)
208
+ * Use FactoryGirl.reload in specs
209
+ * Clean up running named factories with a particular strategy with
210
+ FactoryGirl::FactoryRunner
211
+
212
+ ## 2.6.0 (February 17, 2012)
213
+ * Improve documentation of has_many associations in the GETTING_STARTED
214
+ document
215
+ * Deprecate :method in favor of :strategy when overriding an association's
216
+ build strategy
217
+
218
+ ## 2.5.2 (February 10, 2012)
219
+ * Fix step definitions to use associations defined in parent factories
220
+ * Add inline trait support to (build|create)_list
221
+ * Update ActiveSupport dependency to >= 2.3.9, which introduced
222
+ class_attribute
223
+
224
+ ## 2.5.1 (February 3, 2012)
225
+ * Fix attribute evaluation when the attribute isn't defined in the factory but
226
+ is a private method on Object
227
+ * Update rubygems on Travis before running tests
228
+ * Fix spec name
229
+ * Update GETTING_STARTED with correct usage of build_stubbed
230
+ * Update README with more info on initialize_with
231
+ * Honor :parent on factory over block nesting
232
+
233
+ ## 2.5.0 (January 20, 2012)
234
+ * Revert 'Deprecate build_stubbed and attributes_for'
235
+ * Implement initialize_with to allow overriding object instantiation
236
+ * Ensure FG runs against Rails 3.2.0
237
+
238
+ ## 2.4.2 (January 18, 2012)
239
+ * Fix inline traits' interaction with defaults on the factory
240
+
241
+ ## 2.4.1 (January 17, 2012)
242
+ * Deprecate build_stubbed and attributes_for
243
+ * Fix inline traits
244
+
245
+ ## 2.4.0 (January 13, 2012)
246
+ * Refactor internals of FactoryGirl to use anonymous class on which attributes
247
+ get defined
248
+ * Explicitly require Ruby 1.8.7 or higher in gemspec
249
+ * Fix documentation
250
+ * Add Gemnasium status to documentation
251
+ * Supplying a Class to a factory that overrides to_s no longer results in
252
+ getting the wrong Class constructed
253
+ * Be more agnostic about ORMs when using columns in FactoryGirl step
254
+ definitions
255
+ * Test against Active Record 3.2.0.rc2
256
+ * Update GETTING_STARTED to use Ruby syntax highlighting
257
+
258
+ ## 2.3.2 (November 26, 2011)
259
+ * Move logic of where instance.save! is set to Definition
260
+ * Fix method name from aliases_for? to alias_for?
261
+ * Refactor internal attribute handling to use an anonymous class instead of
262
+ faking Ruby's variable resolution. This allows for more sane usage of
263
+ attributes without having to manage sorting priority because attributes
264
+ can turn themselves into procs, which are used with define_method on a
265
+ class so attributes work correctly all the time.
266
+
267
+ ## 2.3.1 (November 23, 2011)
268
+ * Remove internally-used associate method from all the FactoryGirl::Proxy subclasses
269
+ * Move around requiring of files
270
+ * Consolidate errors into factory_bot.rb
271
+ * Refactor AttributeList to deal with priority only when iterating over
272
+ attributes
273
+ * Refactor internals of some of the Proxy subclasses
274
+ * Ensure callbacks on traits are executed in the correct order
275
+
276
+ ## 2.3.0 (November 18, 2011)
277
+ * Registries are named, resulting in better messages when factories, traits,
278
+ or sequences cannot be found
279
+ * Fix incorrect tests
280
+ * Internals refactoring introducing FactoryGirl::NullFactory,
281
+ FactoryGirl::Definition, and FactoryGirl::DeclarationList
282
+ * Use ActiveSupport for Hash#except and its delegation capabilities
283
+ * Fix usage of callbacks when added via implicit traits
284
+ * Use Bundler tasks and clean up dependencies
285
+ * Fix failing spec for big letters in factory name passed as symbol
286
+ * Add ability for traits to be added dynamically when creating an instance via
287
+ build, create, build_stubbed, or attributes_for
288
+
289
+ ## 2.2.0 (October 14, 2011)
290
+ * Clean up RSpec suite to not use 'should'
291
+ * Use create_list in step definitions
292
+ * Syntax methods that deal with ORM interaction (attributes_for, build, build_stubbed,
293
+ and create) now accept a block that yields the result. This results in a
294
+ more convenient way to interact with the result than using Object.tap.
295
+ * Standardize deprecation warnings
296
+ * Update transient attribute syntax to use blocks instead of calling ignore on
297
+ each attribute declaration
298
+ * Parents can be defined after children because factories are evaluated when
299
+ they're used; this means breaking up factories across multiple files will
300
+ behave as expected
301
+ * Large internal refactoring, including changing access modifiers for a
302
+ handful of methods for a more clearly defined API
303
+
304
+ ## 2.1.2 (September 23, 2011)
305
+ * Bugfix: Vintage syntax fixed after bug introduced in 2.1.1
306
+ * Introduce dependency on activesupport to remove code from Factory class
307
+
308
+ ## 2.1.1 (September 23, 2011) (yanked)
309
+ * Bugfix: Parent object callbacks are run before child object callbacks
310
+ * Declarations: allow overriding/modification of individual traits in child factories
311
+ * Callbacks refactored to not be attributes
312
+ * Updating documentation for formatting and clarity (incl. new specificity for cucumber)
313
+
314
+ ## 2.1.0 (September 02, 2011)
315
+ * Bugfix: created_at now defined for stubbed models
316
+ * Gemspec updated for use with Rails 3.1
317
+ * Factories can now be modified post-definition (useful for overriding defaults from gems/plugins)
318
+ * All factories can now be reloaded with Factory.reload
319
+ * Add :method => build to factory associations to prevent saving of associated objects
320
+ * Factories defined in {Rails.root}/factories are now loaded by default
321
+ * Various documentation updates
322
+
323
+ ## 1.1.4 (November 28, 2008)
324
+ * Factory.build now uses Factory.create for associations of the built object
325
+ * Factory definitions are now detected in subdirectories, such as
326
+ factories/person_factory.rb (thanks to Josh Nichols)
327
+ * Factory definitions are now loaded after the environment in a Rails project
328
+ (fixes some issues with dependencies being loaded too early) (thanks to
329
+ Josh Nichols)
330
+ * Factory names ending in 's' no longer cause problems (thanks to Alex Sharp
331
+ and Josh Owens)
332
+
333
+ ## 1.1.3 (September 12, 2008)
334
+ * Automatically pull in definitions from factories.rb, test/factories.rb, or
335
+ spec/factories.rb
336
+ ## 1.1.2 (July 30, 2008)
337
+ * Improved error handling for invalid and undefined factories/attributes
338
+ * Improved handling of strings vs symbols vs classes
339
+ * Added a prettier syntax for handling associations
340
+ * Updated documentation and fixed compatibility with Rails 2.1
341
+
342
+ ## 1.1.1 (June 23, 2008)
343
+ * The attribute "name" no longer requires using #add_attribute
344
+
345
+ ## 1.1.0 (June 03, 2008)
346
+ * Added support for dependent attributes
347
+ * Fixed the attributes_for build strategy to not build associations
348
+ * Added support for sequences
349
+
350
+ ## 1.0.0 (May 31, 2008)
351
+ * First version
data/README.md CHANGED
@@ -1,13 +1,17 @@
1
- # factory_bot [![Build Status](https://travis-ci.org/thoughtbot/factory_bot.svg)](http://travis-ci.org/thoughtbot/factory_bot?branch=master) [![Dependency Status](https://gemnasium.com/thoughtbot/factory_bot.svg)](https://gemnasium.com/thoughtbot/factory_bot) [![Code Climate](https://codeclimate.com/github/thoughtbot/factory_bot/badges/gpa.svg)](https://codeclimate.com/github/thoughtbot/factory_bot)
1
+ # factory_bot [![Build Status][ci-image]][ci] [![Code Climate][grade-image]][grade] [![Gem Version][version-image]][version] [![Reviewed by Hound][hound-badge-image]][hound]
2
2
 
3
3
  factory_bot is a fixtures replacement with a straightforward definition syntax, support for multiple build strategies (saved instances, unsaved instances, attribute hashes, and stubbed objects), and support for multiple factories for the same class (user, admin_user, and so on), including factory inheritance.
4
4
 
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
- **A historical note:** factory_bot used to be named factory_girl. An explanation of the name change can be found in the [old factory_girl repository](https://github.com/thoughtbot/factory_girl).
8
+ _[Interested in the history of the project name?][NAME]_
9
+
10
+
11
+ ### Transitioning from factory\_girl?
12
+
13
+ Check out the [guide](https://github.com/thoughtbot/factory_bot/blob/4-9-0-stable/UPGRADE_FROM_FACTORY_GIRL.md).
9
14
 
10
- _[Interested in the project name?](NAME.md)._
11
15
 
12
16
  Documentation
13
17
  -------------
@@ -17,7 +21,7 @@ You should find the documentation for your version of factory_bot on [Rubygems](
17
21
  See [GETTING_STARTED] for information on defining and using factories. We also
18
22
  have [a detailed introductory video][], available for free on Upcase.
19
23
 
20
- [a detailed introductory video]: https://upcase.com/videos/factory-girl?utm_source=github&utm_medium=open-source&utm_campaign=factory-girl
24
+ [a detailed introductory video]: https://upcase.com/videos/factory-bot?utm_source=github&utm_medium=open-source&utm_campaign=factory-girl
21
25
 
22
26
  Install
23
27
  --------
@@ -36,22 +40,11 @@ To install the gem manually from your shell, run:
36
40
  gem install factory_bot
37
41
  ```
38
42
 
39
- **Caveat:** As of ActiveSupport 5.0 and above, Ruby 2.2.2+ is required. Because
40
- of Rubygems' dependency resolution when installing gems, you may see an error
41
- similar to:
42
-
43
- ```
44
- $ gem install factory_bot
45
- ERROR: Error installing factory_bot:
46
- activesupport requires Ruby version >= 2.2.2.
47
- ```
48
-
49
- To bypass this, install a pre-5.0 version of ActiveSupport before installing
50
- manually.
51
-
52
43
  Supported Ruby versions
53
44
  -----------------------
54
45
 
46
+ The factory_bot 5.x series supports MRI Ruby 2.3+.
47
+
55
48
  The factory_bot 3.x+ series supports MRI Ruby 1.9. Additionally, factory_bot
56
49
  3.6+ supports JRuby 1.6.7.2+ while running in 1.9 mode. See [GETTING_STARTED]
57
50
  for more information on configuring the JRuby environment.
@@ -62,34 +55,41 @@ More Information
62
55
  ----------------
63
56
 
64
57
  * [Rubygems](https://rubygems.org/gems/factory_bot)
65
- * [Stack Overflow](http://stackoverflow.com/questions/tagged/factory-bot)
58
+ * [Stack Overflow](https://stackoverflow.com/questions/tagged/factory-bot)
66
59
  * [Issues](https://github.com/thoughtbot/factory_bot/issues)
67
- * [GIANT ROBOTS SMASHING INTO OTHER GIANT ROBOTS](http://robots.thoughtbot.com/)
60
+ * [GIANT ROBOTS SMASHING INTO OTHER GIANT ROBOTS](https://robots.thoughtbot.com/)
61
+
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
68
64
 
69
- You may also find useful information under the [factory_girl tag on Stack Overflow](http://stackoverflow.com/questions/tagged/factory-girl).
65
+ Useful Tools
66
+ ------------
70
67
 
71
- [GETTING_STARTED]: http://rubydoc.info/gems/factory_bot/file/GETTING_STARTED.md
68
+ * [FactoryTrace](https://github.com/djezzzl/factory_trace) - helps to find unused factories and traits.
72
69
 
73
70
  Contributing
74
71
  ------------
75
72
 
76
73
  Please see [CONTRIBUTING.md](https://github.com/thoughtbot/factory_bot/blob/master/CONTRIBUTING.md).
77
74
 
78
- factory_bot was originally written by Joe Ferris and is now maintained by Josh
79
- Clayton. Many improvements and bugfixes were contributed by the [open source
75
+ factory_bot was originally written by Joe Ferris and is maintained by thoughtbot.
76
+ Many improvements and bugfixes were contributed by the [open source
80
77
  community](https://github.com/thoughtbot/factory_bot/graphs/contributors).
81
78
 
82
79
  License
83
80
  -------
84
81
 
85
- factory_bot is Copyright © 2008-2016 Joe Ferris and thoughtbot. It is free
82
+ factory_bot is Copyright © 2008-2020 Joe Ferris and thoughtbot. It is free
86
83
  software, and may be redistributed under the terms specified in the
87
- [LICENSE](/LICENSE) file.
84
+ [LICENSE] file.
85
+
86
+ [LICENSE]: https://github.com/thoughtbot/factory_bot/blob/master/LICENSE
87
+
88
88
 
89
89
  About thoughtbot
90
90
  ----------------
91
91
 
92
- ![thoughtbot](http://presskit.thoughtbot.com/images/thoughtbot-logo-for-readmes.svg)
92
+ ![thoughtbot](https://thoughtbot.com/brand_assets/93:44.svg)
93
93
 
94
94
  factory_bot is maintained and funded by thoughtbot, inc.
95
95
  The names and logos for thoughtbot are trademarks of thoughtbot, inc.
@@ -99,4 +99,12 @@ See [our other projects][community] or
99
99
  [hire us][hire] to design, develop, and grow your product.
100
100
 
101
101
  [community]: https://thoughtbot.com/community?utm_source=github
102
- [hire]: https://thoughtbot.com?utm_source=github
102
+ [hire]: https://thoughtbot.com/hire-us?utm_source=github
103
+ [ci-image]: https://travis-ci.org/thoughtbot/factory_bot.svg
104
+ [ci]: https://travis-ci.org/thoughtbot/factory_bot?branch=master
105
+ [grade-image]: https://codeclimate.com/github/thoughtbot/factory_bot/badges/gpa.svg
106
+ [grade]: https://codeclimate.com/github/thoughtbot/factory_bot
107
+ [version-image]: https://badge.fury.io/rb/factory_bot.svg
108
+ [version]: https://badge.fury.io/rb/factory_bot
109
+ [hound-badge-image]: https://img.shields.io/badge/Reviewed_by-Hound-8E64B0.svg
110
+ [hound]: https://houndci.com
@@ -5,7 +5,7 @@ module FactoryBot
5
5
 
6
6
  self.aliases = [
7
7
  [/(.+)_id/, '\1'],
8
- [/(.*)/, '\1_id']
8
+ [/(.*)/, '\1_id'],
9
9
  ]
10
10
 
11
11
  def self.aliases_for(attribute)
@@ -16,6 +16,7 @@ module FactoryBot
16
16
  else instance_exec(&block)
17
17
  end
18
18
  raise SequenceAbuseError if FactoryBot::Sequence === value
19
+
19
20
  value
20
21
  }
21
22
  end
@@ -1,7 +1,6 @@
1
- require 'factory_bot/attribute/static'
2
- require 'factory_bot/attribute/dynamic'
3
- require 'factory_bot/attribute/association'
4
- require 'factory_bot/attribute/sequence'
1
+ require "factory_bot/attribute/dynamic"
2
+ require "factory_bot/attribute/association"
3
+ require "factory_bot/attribute/sequence"
5
4
 
6
5
  module FactoryBot
7
6
  # @api private
@@ -11,11 +10,10 @@ module FactoryBot
11
10
  def initialize(name, ignored)
12
11
  @name = name.to_sym
13
12
  @ignored = ignored
14
- ensure_non_attribute_writer!
15
13
  end
16
14
 
17
15
  def to_proc
18
- -> { }
16
+ -> {}
19
17
  end
20
18
 
21
19
  def association?
@@ -25,38 +23,5 @@ module FactoryBot
25
23
  def alias_for?(attr)
26
24
  FactoryBot.aliases_for(attr).include?(name)
27
25
  end
28
-
29
- private
30
-
31
- def ensure_non_attribute_writer!
32
- NonAttributeWriterValidator.new(@name).validate!
33
- end
34
-
35
- class NonAttributeWriterValidator
36
- def initialize(method_name)
37
- @method_name = method_name.to_s
38
- @method_name_setter_match = @method_name.match(/(.*)=$/)
39
- end
40
-
41
- def validate!
42
- if method_is_writer?
43
- raise AttributeDefinitionError, error_message
44
- end
45
- end
46
-
47
- private
48
-
49
- def method_is_writer?
50
- !!@method_name_setter_match
51
- end
52
-
53
- def attribute_name
54
- @method_name_setter_match[1]
55
- end
56
-
57
- def error_message
58
- "factory_bot uses '#{attribute_name} value' syntax rather than '#{attribute_name} = value'"
59
- end
60
- end
61
26
  end
62
27
  end
@@ -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 = 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
@@ -22,7 +22,7 @@ module FactoryBot
22
22
  def hash
23
23
  @evaluator.instance = build_hash
24
24
 
25
- attributes_to_set_on_hash.inject({}) do |result, attribute|
25
+ attributes_to_set_on_hash.reduce({}) do |result, attribute|
26
26
  result[attribute] = get(attribute)
27
27
  result
28
28
  end
@@ -31,12 +31,15 @@ module FactoryBot
31
31
  private
32
32
 
33
33
  def method_tracking_evaluator
34
- @method_tracking_evaluator ||= Decorator::AttributeHash.new(decorated_evaluator, attribute_names_to_assign)
34
+ @method_tracking_evaluator ||= Decorator::AttributeHash.new(
35
+ decorated_evaluator,
36
+ attribute_names_to_assign,
37
+ )
35
38
  end
36
39
 
37
40
  def decorated_evaluator
38
41
  Decorator::InvocationTracker.new(
39
- Decorator::NewConstructor.new(@evaluator, @build_class)
42
+ Decorator::NewConstructor.new(@evaluator, @build_class),
40
43
  )
41
44
  end
42
45
 
@@ -65,7 +68,11 @@ module FactoryBot
65
68
  end
66
69
 
67
70
  def attribute_names_to_assign
68
- @attribute_names_to_assign ||= non_ignored_attribute_names + override_names - ignored_attribute_names - alias_names_to_ignore
71
+ @attribute_names_to_assign ||=
72
+ non_ignored_attribute_names +
73
+ override_names -
74
+ ignored_attribute_names -
75
+ alias_names_to_ignore
69
76
  end
70
77
 
71
78
  def non_ignored_attribute_names
@@ -90,8 +97,16 @@ module FactoryBot
90
97
 
91
98
  def alias_names_to_ignore
92
99
  @attribute_list.non_ignored.flat_map do |attribute|
93
- override_names.map { |override| attribute.name if attribute.alias_for?(override) && attribute.name != override && !ignored_attribute_names.include?(override) }
100
+ override_names.map do |override|
101
+ attribute.name if ignorable_alias?(attribute, override)
102
+ end
94
103
  end.compact
95
104
  end
105
+
106
+ def ignorable_alias?(attribute, override)
107
+ attribute.alias_for?(override) &&
108
+ attribute.name != override &&
109
+ !ignored_attribute_names.include?(override)
110
+ end
96
111
  end
97
112
  end
@@ -54,7 +54,8 @@ module FactoryBot
54
54
 
55
55
  def ensure_attribute_not_self_referencing!(attribute)
56
56
  if attribute.respond_to?(:factory) && attribute.factory == @name
57
- raise AssociationDefinitionError, "Self-referencing association '#{attribute.name}' in '#{attribute.factory}'"
57
+ message = "Self-referencing association '#{attribute.name}' in '#{attribute.factory}'"
58
+ raise AssociationDefinitionError, message
58
59
  end
59
60
  end
60
61
 
@@ -22,14 +22,15 @@ module FactoryBot
22
22
  end
23
23
 
24
24
  protected
25
+
25
26
  attr_reader :block
26
27
 
27
28
  private
28
29
 
29
30
  def ensure_valid_callback_name!
30
- unless FactoryBot.callback_names.include?(name)
31
+ unless FactoryBot::Internal.callback_names.include?(name)
31
32
  raise InvalidCallbackNameError, "#{name} is not a valid callback name. " +
32
- "Valid callback names are #{FactoryBot.callback_names.inspect}"
33
+ "Valid callback names are #{FactoryBot::Internal.callback_names.inspect}"
33
34
  end
34
35
  end
35
36