factory_bot 4.11.1 → 5.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (51) hide show
  1. checksums.yaml +4 -4
  2. data/GETTING_STARTED.md +121 -37
  3. data/LICENSE +1 -1
  4. data/NEWS.md +351 -0
  5. data/README.md +18 -22
  6. data/lib/factory_bot/aliases.rb +1 -1
  7. data/lib/factory_bot/attribute/dynamic.rb +1 -0
  8. data/lib/factory_bot/attribute.rb +4 -39
  9. data/lib/factory_bot/attribute_assigner.rb +21 -6
  10. data/lib/factory_bot/attribute_list.rb +2 -1
  11. data/lib/factory_bot/callback.rb +3 -2
  12. data/lib/factory_bot/configuration.rb +16 -20
  13. data/lib/factory_bot/declaration/association.rb +14 -1
  14. data/lib/factory_bot/declaration/dynamic.rb +3 -1
  15. data/lib/factory_bot/declaration/implicit.rb +7 -2
  16. data/lib/factory_bot/declaration.rb +4 -4
  17. data/lib/factory_bot/declaration_list.rb +1 -1
  18. data/lib/factory_bot/decorator/attribute_hash.rb +1 -1
  19. data/lib/factory_bot/decorator/invocation_tracker.rb +1 -1
  20. data/lib/factory_bot/decorator.rb +5 -1
  21. data/lib/factory_bot/definition.rb +10 -7
  22. data/lib/factory_bot/definition_hierarchy.rb +1 -11
  23. data/lib/factory_bot/definition_proxy.rb +59 -62
  24. data/lib/factory_bot/errors.rb +7 -4
  25. data/lib/factory_bot/evaluation.rb +1 -1
  26. data/lib/factory_bot/evaluator.rb +5 -5
  27. data/lib/factory_bot/factory.rb +8 -8
  28. data/lib/factory_bot/factory_runner.rb +3 -3
  29. data/lib/factory_bot/find_definitions.rb +1 -1
  30. data/lib/factory_bot/internal.rb +104 -0
  31. data/lib/factory_bot/linter.rb +36 -19
  32. data/lib/factory_bot/null_factory.rb +4 -1
  33. data/lib/factory_bot/null_object.rb +2 -2
  34. data/lib/factory_bot/registry.rb +15 -6
  35. data/lib/factory_bot/reload.rb +3 -3
  36. data/lib/factory_bot/sequence.rb +0 -1
  37. data/lib/factory_bot/strategy/null.rb +2 -4
  38. data/lib/factory_bot/strategy/stub.rb +32 -31
  39. data/lib/factory_bot/strategy_calculator.rb +1 -1
  40. data/lib/factory_bot/strategy_syntax_method_registrar.rb +13 -2
  41. data/lib/factory_bot/syntax/default.rb +12 -24
  42. data/lib/factory_bot/syntax/methods.rb +32 -9
  43. data/lib/factory_bot/syntax.rb +2 -2
  44. data/lib/factory_bot/trait.rb +6 -3
  45. data/lib/factory_bot/version.rb +1 -1
  46. data/lib/factory_bot.rb +103 -138
  47. metadata +72 -32
  48. data/NEWS +0 -306
  49. data/lib/factory_bot/attribute/static.rb +0 -16
  50. data/lib/factory_bot/declaration/static.rb +0 -26
  51. data/lib/factory_bot/decorator/class_key_hash.rb +0 -28
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 14d67d2d0498cdfe3d47717279561f299566ecd20084af6958e3c5143188ccae
4
- data.tar.gz: bb6daffb31d969293032bbb2d655c3628095bdd285708fdc93fe2a60e4cd072e
3
+ metadata.gz: 802da48aa95dce3321f20d0173c5dcf041c5393fb0c270fb8ae2029ce12b6ed9
4
+ data.tar.gz: 0aa227896ef66ccf100f88b1aa4e9aa26c5bc657fee76739a73e15072bc80572
5
5
  SHA512:
6
- metadata.gz: 24178c541ce3b726ad7274febd2bbf69ccaff9446a15a79b9bfce5525b0e2f63cc4af50a48950abe5b8b80397151bf86c31263463b0d7309093c870cb925c97d
7
- data.tar.gz: 630e120e664a503de162d11d9dc36f83a7fc5602a8935875cacfb905b28c3cf1c8f0978137281b5aa8d2fed3fa40c236dd567cb7544bca44cb85e1f43fb2ac83
6
+ metadata.gz: 63554d6765398f0c524cb8cd45b1a0da83da1d8aba9f359d0e4c44e42cdbd0d93edb8e38c668e0310ad709905c5cd6a3c35e640ad8c45a06a8b7d4090b4e6161
7
+ data.tar.gz: fe3be69bdd601384da0a7f2ec7e1fcf00ae7d4984c65423e31e94c1b7f3d7bb04345371daaea19d794365972b59f69f9f3403b0ef8b8ef7d7349d89404284ac2
data/GETTING_STARTED.md CHANGED
@@ -4,16 +4,16 @@ Getting Started
4
4
  Update Your Gemfile
5
5
  -------------------
6
6
 
7
- If you're using Rails, you'll need to change the required version of `factory_bot_rails`:
7
+ If you're using Rails:
8
8
 
9
9
  ```ruby
10
- gem "factory_bot_rails", "~> 4.0"
10
+ gem "factory_bot_rails"
11
11
  ```
12
12
 
13
- If you're *not* using Rails, you'll just have to change the required version of `factory_bot`:
13
+ If you're *not* using Rails:
14
14
 
15
15
  ```ruby
16
- gem "factory_bot", "~> 4.0"
16
+ gem "factory_bot"
17
17
  ```
18
18
 
19
19
  JRuby users: factory_bot works with JRuby starting with 1.6.7.2 (latest stable, as per July 2012).
@@ -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|
@@ -102,7 +102,7 @@ If you do not include `FactoryBot::Syntax::Methods` in your test suite, then all
102
102
  Defining factories
103
103
  ------------------
104
104
 
105
- Each factory has a name and a set of attributes. The name is used to guess the class of the object by default, but it's possible to explicitly specify it:
105
+ Each factory has a name and a set of attributes. The name is used to guess the class of the object by default:
106
106
 
107
107
  ```ruby
108
108
  # This will guess the User class
@@ -112,16 +112,26 @@ FactoryBot.define do
112
112
  last_name { "Doe" }
113
113
  admin { false }
114
114
  end
115
-
116
- # This will use the User class (Admin would have been guessed)
117
- factory :admin, class: User do
118
- first_name { "Admin" }
119
- last_name { "User" }
120
- admin { true }
121
- end
122
115
  end
123
116
  ```
124
117
 
118
+ It is also possible to explicitly specify the class:
119
+
120
+ ```ruby
121
+ # This will use the User class (otherwise Admin would have been guessed)
122
+ factory :admin, class: User
123
+ ```
124
+
125
+ If the constant is not available
126
+ (if you are using a Rails engine that waits to load models, for example),
127
+ you can also pass a symbol or string,
128
+ which factory_bot will constantize later, once you start building objects:
129
+
130
+ ```ruby
131
+ # It's OK if Doorkeeper::AccessToken isn't loaded yet
132
+ factory :access_token, class: "Doorkeeper::AccessToken"
133
+ ```
134
+
125
135
  Because of the block syntax in Ruby, defining attributes as `Hash`es (for
126
136
  serialized/JSON columns, for example) requires two sets of curly brackets:
127
137
 
@@ -177,21 +187,15 @@ user.first_name
177
187
  # => "Joe"
178
188
  ```
179
189
 
190
+ Note that objects created with `build_stubbed` cannot be serialized with
191
+ `Marshal.dump`, since factory_bot defines singleton methods on these objects.
192
+
180
193
  Static Attributes
181
194
  ------------------
182
195
 
183
- Static attributes, without a block, are deprecated and will be removed in
184
- factory\_bot 5.
185
-
186
- ```ruby
187
- factory :user do
188
- # Do not use deprecated static attributes
189
- admin true
190
-
191
- # Use dynamic attributes instead
192
- admin { true }
193
- end
194
- ```
196
+ Static attributes (without a block) are no longer available in factory\_bot 5.
197
+ You can read more about the decision to remove them in
198
+ [this blog post](https://robots.thoughtbot.com/deprecating-static-attributes-in-factory_bot-4-11).
195
199
 
196
200
  Aliases
197
201
  -------
@@ -261,8 +265,8 @@ create(:user, upcased: true).name
261
265
  #=> "JOHN DOE - ROCKSTAR"
262
266
  ```
263
267
 
264
- Static and dynamic attributes can be created as transient attributes. Transient
265
- attributes will be ignored within attributes\_for and won't be set on the model,
268
+ Transient attributes will be ignored within attributes\_for and won't be
269
+ set on the model,
266
270
  even if the attribute exists or you attempt to override it.
267
271
 
268
272
  Within factory_bot's dynamic attributes, you can access transient attributes as
@@ -273,7 +277,7 @@ transient attributes from there.
273
277
  Method Name / Reserved Word Attributes
274
278
  -------------------------------
275
279
 
276
- If your attributes conflict with existing methods or reserved words you can define them with `add_attribute`.
280
+ If your attributes conflict with existing methods or reserved words (all methods in the [DefinitionProxy](https://github.com/thoughtbot/factory_bot/blob/master/lib/factory_bot/definition_proxy.rb) class) you can define them with `add_attribute`.
277
281
 
278
282
  ```ruby
279
283
  factory :dna do
@@ -343,9 +347,35 @@ factory :post do
343
347
  end
344
348
  ```
345
349
 
346
- The behavior of the association method varies depending on the build strategy used for the parent object.
350
+ In factory\_bot 5, associations default to using the same build strategy as
351
+ their parent object:
347
352
 
348
353
  ```ruby
354
+ FactoryBot.define do
355
+ factory :author
356
+
357
+ factory :post do
358
+ author
359
+ end
360
+ end
361
+
362
+ post = build(:post)
363
+ post.new_record? # => true
364
+ post.author.new_record? # => true
365
+
366
+ post = create(:post)
367
+ post.new_record? # => false
368
+ post.author.new_record? # => false
369
+ ```
370
+
371
+ This is different than the default behavior for previous versions of
372
+ factory\_bot, where the association strategy would not always match the strategy
373
+ of the parent object. If you want to continue using the old behavior, you can
374
+ set the `use_parent_strategy` configuration option to `false`.
375
+
376
+ ```ruby
377
+ FactoryBot.use_parent_strategy = false
378
+
349
379
  # Builds and saves a User and a Post
350
380
  post = create(:post)
351
381
  post.new_record? # => false
@@ -357,9 +387,11 @@ post.new_record? # => true
357
387
  post.author.new_record? # => false
358
388
  ```
359
389
 
360
- 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:
361
391
 
362
392
  ```ruby
393
+ FactoryBot.use_parent_strategy = false
394
+
363
395
  factory :post do
364
396
  # ...
365
397
  association :author, factory: :user, strategy: :build
@@ -476,6 +508,36 @@ create(:profile_with_languages).languages.length # 5
476
508
  create(:profile_with_languages, languages_count: 15).languages.length # 15
477
509
  ```
478
510
 
511
+ Polymorphic associations can be handled with traits:
512
+
513
+ ```ruby
514
+ FactoryBot.define do
515
+ factory :video
516
+ factory :photo
517
+
518
+ factory :comment do
519
+ for_photo # default to the :for_photo trait if none is specified
520
+
521
+ trait :for_video do
522
+ association :commentable, factory: :video
523
+ end
524
+
525
+ trait :for_photo do
526
+ association :commentable, factory: :photo
527
+ end
528
+ end
529
+ end
530
+ ```
531
+
532
+ This allows us to do:
533
+
534
+ ```ruby
535
+ create(:comment)
536
+ create(:comment, :for_video)
537
+ create(:comment, :for_photo)
538
+ ```
539
+
540
+
479
541
  Sequences
480
542
  ---------
481
543
 
@@ -515,6 +577,9 @@ factory :user do
515
577
  end
516
578
  ```
517
579
 
580
+ Note that defining sequences as implicit attributes will not work if you have a
581
+ factory with the same name as the sequence.
582
+
518
583
  And it's also possible to define an in-line sequence that is only used in
519
584
  a particular factory:
520
585
 
@@ -623,7 +688,7 @@ factory :story do
623
688
  end
624
689
  ```
625
690
 
626
- Traits can be used as attributes:
691
+ Traits can be used as implicit attributes:
627
692
 
628
693
  ```ruby
629
694
  factory :week_long_published_story_with_title, parent: :story do
@@ -633,6 +698,9 @@ factory :week_long_published_story_with_title, parent: :story do
633
698
  end
634
699
  ```
635
700
 
701
+ Note that defining traits as implicit attributes will not work if you have a
702
+ factory or sequence with the same name as the trait.
703
+
636
704
  Traits that define the same attributes won't raise AttributeDefinitionErrors;
637
705
  the trait that defines the attribute latest gets precedence.
638
706
 
@@ -893,7 +961,7 @@ If a gem were to give you a User factory:
893
961
  ```ruby
894
962
  FactoryBot.define do
895
963
  factory :user do
896
- full_name "John Doe"
964
+ full_name { "John Doe" }
897
965
  sequence(:username) { |n| "user#{n}" }
898
966
  password { "password" }
899
967
  end
@@ -950,6 +1018,14 @@ To set the attributes for each of the factories, you can pass in a hash as you n
950
1018
  twenty_year_olds = build_list(:user, 25, date_of_birth: 20.years.ago)
951
1019
  ```
952
1020
 
1021
+ In order to set different attributes for each factory, these methods may be passed a block, with the factory and the index as parameters:
1022
+
1023
+ ```ruby
1024
+ twenty_somethings = build_list(:user, 10) do |user, i|
1025
+ user.date_of_birth = (20 + i).years.ago
1026
+ end
1027
+ ```
1028
+
953
1029
  `build_stubbed_list` will give you fully stubbed out instances:
954
1030
 
955
1031
  ```ruby
@@ -999,8 +1075,10 @@ namespace :factory_bot do
999
1075
  desc "Verify that all FactoryBot factories are valid"
1000
1076
  task lint: :environment do
1001
1077
  if Rails.env.test?
1002
- DatabaseCleaner.cleaning do
1078
+ conn = ActiveRecord::Base.connection
1079
+ conn.transaction do
1003
1080
  FactoryBot.lint
1081
+ raise ActiveRecord::Rollback
1004
1082
  end
1005
1083
  else
1006
1084
  system("bundle exec rake factory_bot:lint RAILS_ENV='test'")
@@ -1012,8 +1090,7 @@ end
1012
1090
 
1013
1091
  After calling `FactoryBot.lint`, you'll likely want to clear out the
1014
1092
  database, as records will most likely be created. The provided example above
1015
- uses the database_cleaner gem to clear out the database; be sure to add the
1016
- gem to your Gemfile under the appropriate groups.
1093
+ uses an sql transaction and rollback to leave the database clean.
1017
1094
 
1018
1095
  You can lint factories selectively by passing only factories you want linted:
1019
1096
 
@@ -1047,6 +1124,13 @@ You can also specify the strategy used for linting:
1047
1124
  FactoryBot.lint strategy: :build
1048
1125
  ```
1049
1126
 
1127
+ Verbose linting will include full backtraces for each error, which can be
1128
+ helpful for debugging:
1129
+
1130
+ ```ruby
1131
+ FactoryBot.lint verbose: true
1132
+ ```
1133
+
1050
1134
  Custom Construction
1051
1135
  -------------------
1052
1136
 
@@ -1337,12 +1421,12 @@ with associations, as below:
1337
1421
 
1338
1422
  ```ruby
1339
1423
  FactoryBot.define do
1340
- factory :united_states, class: Location do
1424
+ factory :united_states, class: "Location" do
1341
1425
  name { 'United States' }
1342
1426
  association :location_group, factory: :north_america
1343
1427
  end
1344
1428
 
1345
- factory :north_america, class: LocationGroup do
1429
+ factory :north_america, class: "LocationGroup" do
1346
1430
  name { 'North America' }
1347
1431
  end
1348
1432
  end
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/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