factory_girl 3.5.0 → 3.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.travis.yml +3 -0
- data/GETTING_STARTED.md +21 -9
- data/Gemfile.lock +6 -3
- data/NEWS +11 -2
- data/README.md +2 -2
- data/factory_girl.gemspec +8 -2
- data/features/factory_girl_steps.feature +1 -1
- data/features/find_definitions.feature +10 -10
- data/features/step_definitions/factory_girl_steps.rb +3 -3
- data/gemfiles/3.0.gemfile.lock +6 -3
- data/gemfiles/3.1.gemfile.lock +6 -3
- data/gemfiles/3.2.gemfile.lock +6 -3
- data/lib/factory_girl.rb +2 -0
- data/lib/factory_girl/attribute/association.rb +4 -1
- data/lib/factory_girl/attribute_assigner.rb +8 -2
- data/lib/factory_girl/callback.rb +2 -2
- data/lib/factory_girl/decorator/new_constructor.rb +12 -0
- data/lib/factory_girl/definition_hierarchy.rb +39 -0
- data/lib/factory_girl/evaluator.rb +6 -6
- data/lib/factory_girl/factory.rb +22 -4
- data/lib/factory_girl/null_factory.rb +1 -2
- data/lib/factory_girl/null_object.rb +4 -0
- data/lib/factory_girl/version.rb +1 -1
- data/spec/acceptance/build_stubbed_spec.rb +0 -2
- data/spec/acceptance/traits_spec.rb +29 -0
- data/spec/factory_girl/evaluator_class_definer_spec.rb +1 -1
- data/spec/factory_girl/strategy/stub_spec.rb +0 -1
- data/spec/spec_helper.rb +1 -0
- metadata +4 -18
data/.travis.yml
CHANGED
data/GETTING_STARTED.md
CHANGED
@@ -16,6 +16,13 @@ If you're *not* using Rails, you'll just have to change the required version of
|
|
16
16
|
gem "factory_girl", "~> 3.0"
|
17
17
|
```
|
18
18
|
|
19
|
+
JRuby users: FactoryGirl works with JRuby starting with 1.6.7.2 (latest stable, as per July 2012).
|
20
|
+
JRuby has to be used in 1.9 mode, for that, use JRUBY_OPTS environment variable:
|
21
|
+
|
22
|
+
```
|
23
|
+
export JRUBY_OPTS=--1.9
|
24
|
+
```
|
25
|
+
|
19
26
|
Once your Gemfile is updated, you'll want to update your bundle.
|
20
27
|
|
21
28
|
Using Without Bundler
|
@@ -141,7 +148,9 @@ end
|
|
141
148
|
World(FactoryGirl::Syntax::Methods)
|
142
149
|
```
|
143
150
|
|
144
|
-
This
|
151
|
+
This allows you to use the core set of syntax methods (`build`,
|
152
|
+
`build_stubbed`, `create`, `attributes_for`, and their `*_list` counterparts)
|
153
|
+
without having to call them on FactoryGirl directly:
|
145
154
|
|
146
155
|
```ruby
|
147
156
|
describe User, "#full_name" do
|
@@ -258,8 +267,8 @@ Static and dynamic attributes can be ignored. Ignored attributes will be ignored
|
|
258
267
|
within attributes\_for and won't be set on the model, even if the attribute
|
259
268
|
exists or you attempt to override it.
|
260
269
|
|
261
|
-
Within
|
262
|
-
you would expect. If you need to access the evaluator in a
|
270
|
+
Within FactoryGirl's dynamic attributes, you can access ignored attributes as
|
271
|
+
you would expect. If you need to access the evaluator in a FactoryGirl callback,
|
263
272
|
you'll need to declare a second block argument (for the evaluator) and access
|
264
273
|
ignored attributes from there.
|
265
274
|
|
@@ -690,7 +699,7 @@ Instead of creating a child factory that added additional attributes:
|
|
690
699
|
```ruby
|
691
700
|
FactoryGirl.define do
|
692
701
|
factory :application_user, parent: :user do
|
693
|
-
full_name
|
702
|
+
full_name "Jane Doe"
|
694
703
|
date_of_birth { 21.years.ago }
|
695
704
|
gender "Female"
|
696
705
|
health 90
|
@@ -703,7 +712,7 @@ You could modify that factory instead.
|
|
703
712
|
```ruby
|
704
713
|
FactoryGirl.modify do
|
705
714
|
factory :user do
|
706
|
-
full_name
|
715
|
+
full_name "Jane Doe"
|
707
716
|
date_of_birth { 21.years.ago }
|
708
717
|
gender "Female"
|
709
718
|
health 90
|
@@ -758,14 +767,14 @@ sequence(:name) {|n| "person#{n}@example.com" }
|
|
758
767
|
|
759
768
|
factory :user do
|
760
769
|
ignore do
|
761
|
-
name
|
770
|
+
name "Jane Doe"
|
762
771
|
end
|
763
772
|
|
764
773
|
email
|
765
774
|
initialize_with { new(name) }
|
766
775
|
end
|
767
776
|
|
768
|
-
FactoryGirl.build(:user).name #
|
777
|
+
FactoryGirl.build(:user).name # Jane Doe
|
769
778
|
```
|
770
779
|
|
771
780
|
Notice that I ignored the `name` attribute. If you don't want attributes
|
@@ -793,7 +802,7 @@ For example:
|
|
793
802
|
```ruby
|
794
803
|
factory :user do
|
795
804
|
ignore do
|
796
|
-
name
|
805
|
+
name "John Doe"
|
797
806
|
end
|
798
807
|
|
799
808
|
initialize_with { User.build_with_name(name) }
|
@@ -809,7 +818,7 @@ factory :user do
|
|
809
818
|
comments_count 5
|
810
819
|
end
|
811
820
|
|
812
|
-
name
|
821
|
+
name "John Doe"
|
813
822
|
|
814
823
|
initialize_with { new(attributes) }
|
815
824
|
end
|
@@ -1005,6 +1014,9 @@ factory\_girl ships with step definitions that make calling factories from Cucum
|
|
1005
1014
|
require "factory_girl/step_definitions"
|
1006
1015
|
```
|
1007
1016
|
|
1017
|
+
Note: These step definitions are _deprecated_. Read why here:
|
1018
|
+
http://robots.thoughtbot.com/post/25650434584/writing-better-cucumber-scenarios-or-why-were
|
1019
|
+
|
1008
1020
|
Alternate Syntaxes
|
1009
1021
|
------------------
|
1010
1022
|
|
data/Gemfile.lock
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
factory_girl (3.
|
4
|
+
factory_girl (3.6.0)
|
5
5
|
activesupport (>= 3.0.0)
|
6
6
|
|
7
7
|
GEM
|
@@ -27,7 +27,6 @@ GEM
|
|
27
27
|
cucumber (>= 1.1.1)
|
28
28
|
ffi (>= 1.0.11)
|
29
29
|
rspec (>= 2.7.0)
|
30
|
-
bluecloth (2.2.0)
|
31
30
|
bourne (1.1.2)
|
32
31
|
mocha (= 0.10.5)
|
33
32
|
builder (3.0.0)
|
@@ -41,10 +40,14 @@ GEM
|
|
41
40
|
term-ansicolor (>= 1.0.6)
|
42
41
|
diff-lcs (1.1.3)
|
43
42
|
ffi (1.0.11)
|
43
|
+
ffi (1.0.11-java)
|
44
44
|
gherkin (2.9.3)
|
45
45
|
json (>= 1.4.6)
|
46
|
+
gherkin (2.9.3-java)
|
47
|
+
json (>= 1.4.6)
|
46
48
|
i18n (0.6.0)
|
47
49
|
json (1.7.0)
|
50
|
+
json (1.7.0-java)
|
48
51
|
metaclass (0.0.1)
|
49
52
|
mocha (0.10.5)
|
50
53
|
metaclass (~> 0.0.1)
|
@@ -71,13 +74,13 @@ GEM
|
|
71
74
|
yard (0.8.1)
|
72
75
|
|
73
76
|
PLATFORMS
|
77
|
+
java
|
74
78
|
ruby
|
75
79
|
|
76
80
|
DEPENDENCIES
|
77
81
|
activerecord
|
78
82
|
appraisal (~> 0.4)
|
79
83
|
aruba
|
80
|
-
bluecloth
|
81
84
|
bourne
|
82
85
|
cucumber (~> 1.1)
|
83
86
|
factory_girl!
|
data/NEWS
CHANGED
@@ -1,3 +1,12 @@
|
|
1
|
+
3.6.0 (July 27, 2012)
|
2
|
+
Code/spec cleanup
|
3
|
+
Allow factories with traits to be used in associations
|
4
|
+
Refactor Factory to use DefinitionHierarchy to handle managing callbacks,
|
5
|
+
custom constructor, and custom to_create
|
6
|
+
Add memoization to speed up factories providing attribute overrides
|
7
|
+
Add initial support of JRuby when running in 1.9 mode
|
8
|
+
Improve docs on what happens when including FactoryGirl::Syntax::Methods
|
9
|
+
|
1
10
|
3.5.0 (June 22, 2012)
|
2
11
|
Allow created_at to be set when using build_stubbed
|
3
12
|
Deprecate FactoryGirl step definitions
|
@@ -104,14 +113,14 @@
|
|
104
113
|
Fix inline traits
|
105
114
|
|
106
115
|
2.4.0 (January 13, 2012)
|
107
|
-
Refactor internals of
|
116
|
+
Refactor internals of FactoryGirl to use anonymous class on which attributes
|
108
117
|
get defined
|
109
118
|
Explicitly require Ruby 1.8.7 or higher in gemspec
|
110
119
|
Fix documentation
|
111
120
|
Add Gemnasium status to documentation
|
112
121
|
Supplying a Class to a factory that overrides to_s no longer results in
|
113
122
|
getting the wrong Class constructed
|
114
|
-
Be more agnostic about ORMs when using columns in
|
123
|
+
Be more agnostic about ORMs when using columns in FactoryGirl step
|
115
124
|
definitions
|
116
125
|
Test against Active Record 3.2.0.rc2
|
117
126
|
Update GETTING_STARTED to use Ruby syntax highlighting
|
data/README.md
CHANGED
@@ -28,9 +28,9 @@ and run `bundle install` from your shell.
|
|
28
28
|
Supported Ruby versions
|
29
29
|
-----------------------
|
30
30
|
|
31
|
-
The
|
31
|
+
The FactoryGirl 3.x series supports Ruby 1.9.x.
|
32
32
|
|
33
|
-
For older versions of Ruby, please use the
|
33
|
+
For older versions of Ruby, please use the FactoryGirl 2.x series.
|
34
34
|
|
35
35
|
More Information
|
36
36
|
----------------
|
data/factory_girl.gemspec
CHANGED
@@ -31,8 +31,14 @@ Gem::Specification.new do |s|
|
|
31
31
|
s.add_development_dependency("mocha")
|
32
32
|
s.add_development_dependency("bourne")
|
33
33
|
s.add_development_dependency("appraisal", "~> 0.4")
|
34
|
-
|
34
|
+
|
35
|
+
if RUBY_PLATFORM == "java"
|
36
|
+
s.add_development_dependency("activerecord-jdbcsqlite3-adapter")
|
37
|
+
s.add_development_dependency("jdbc-sqlite3")
|
38
|
+
else
|
39
|
+
s.add_development_dependency("sqlite3-ruby")
|
40
|
+
end
|
41
|
+
|
35
42
|
s.add_development_dependency("yard")
|
36
|
-
s.add_development_dependency("bluecloth")
|
37
43
|
end
|
38
44
|
|
@@ -207,7 +207,7 @@ Feature: Use step definitions generated by factories
|
|
207
207
|
| id | name |
|
208
208
|
| 123 | Joe |
|
209
209
|
|
210
|
-
Scenario: pass a
|
210
|
+
Scenario: pass a FactoryGirl table as an argument and modify it
|
211
211
|
Given these super users exist:
|
212
212
|
| id | Name |
|
213
213
|
| 123 | Joe |
|
@@ -1,4 +1,4 @@
|
|
1
|
-
Feature:
|
1
|
+
Feature: FactoryGirl can find factory definitions correctly
|
2
2
|
Scenario: Find definitions with a path
|
3
3
|
Given a file named "awesome_factories.rb" with:
|
4
4
|
"""
|
@@ -8,8 +8,8 @@ Feature: Factory girl can find factory definitions correctly
|
|
8
8
|
end
|
9
9
|
end
|
10
10
|
"""
|
11
|
-
When "awesome_factories.rb" is added to
|
12
|
-
And I create a "awesome_category" instance from
|
11
|
+
When "awesome_factories.rb" is added to FactoryGirl's file definitions path
|
12
|
+
And I create a "awesome_category" instance from FactoryGirl
|
13
13
|
Then I should find the following for the last category:
|
14
14
|
| name |
|
15
15
|
| awesome!!! |
|
@@ -23,8 +23,8 @@ Feature: Factory girl can find factory definitions correctly
|
|
23
23
|
end
|
24
24
|
end
|
25
25
|
"""
|
26
|
-
When "awesome_factories.rb" is added to
|
27
|
-
And I create a "another_awesome_category" instance from
|
26
|
+
When "awesome_factories.rb" is added to FactoryGirl's file definitions path as an absolute path
|
27
|
+
And I create a "another_awesome_category" instance from FactoryGirl
|
28
28
|
Then I should find the following for the last category:
|
29
29
|
| name |
|
30
30
|
| awesome!!! |
|
@@ -38,13 +38,13 @@ Feature: Factory girl can find factory definitions correctly
|
|
38
38
|
end
|
39
39
|
end
|
40
40
|
"""
|
41
|
-
When "nested" is added to
|
42
|
-
And I create a "great_category" instance from
|
41
|
+
When "nested" is added to FactoryGirl's file definitions path
|
42
|
+
And I create a "great_category" instance from FactoryGirl
|
43
43
|
Then I should find the following for the last category:
|
44
44
|
| name |
|
45
45
|
| great!!! |
|
46
46
|
|
47
|
-
Scenario: Reload
|
47
|
+
Scenario: Reload FactoryGirl
|
48
48
|
Given a file named "nested/reload_factories.rb" with:
|
49
49
|
"""
|
50
50
|
FactoryGirl.define do
|
@@ -58,7 +58,7 @@ Feature: Factory girl can find factory definitions correctly
|
|
58
58
|
end
|
59
59
|
end
|
60
60
|
"""
|
61
|
-
When "nested" is added to
|
61
|
+
When "nested" is added to FactoryGirl's file definitions path
|
62
62
|
And I append to "nested/reload_factories.rb" with:
|
63
63
|
"""
|
64
64
|
|
@@ -69,7 +69,7 @@ Feature: Factory girl can find factory definitions correctly
|
|
69
69
|
end
|
70
70
|
"""
|
71
71
|
And I reload factories
|
72
|
-
And I create a "handy_category" instance from
|
72
|
+
And I create a "handy_category" instance from FactoryGirl
|
73
73
|
Then I should find the following for the last category:
|
74
74
|
| name |
|
75
75
|
| HANDY!!! |
|
@@ -7,7 +7,7 @@ end
|
|
7
7
|
|
8
8
|
World(FactoryGirlDefinitionsHelper)
|
9
9
|
|
10
|
-
When /^"([^"]*)" is added to
|
10
|
+
When /^"([^"]*)" is added to FactoryGirl's file definitions path$/ do |file_name|
|
11
11
|
new_factory_file = File.join(current_dir, file_name.gsub(".rb", ""))
|
12
12
|
|
13
13
|
append_file_to_factory_girl_definitions_path(new_factory_file)
|
@@ -15,7 +15,7 @@ When /^"([^"]*)" is added to Factory Girl's file definitions path$/ do |file_nam
|
|
15
15
|
step %{I find definitions}
|
16
16
|
end
|
17
17
|
|
18
|
-
When /^"([^"]*)" is added to
|
18
|
+
When /^"([^"]*)" is added to FactoryGirl's file definitions path as an absolute path$/ do |file_name|
|
19
19
|
new_factory_file = File.expand_path(File.join(current_dir, file_name.gsub(".rb", "")))
|
20
20
|
|
21
21
|
append_file_to_factory_girl_definitions_path(new_factory_file)
|
@@ -23,7 +23,7 @@ When /^"([^"]*)" is added to Factory Girl's file definitions path as an absolute
|
|
23
23
|
step %{I find definitions}
|
24
24
|
end
|
25
25
|
|
26
|
-
When /^I create a "([^"]*)" instance from
|
26
|
+
When /^I create a "([^"]*)" instance from FactoryGirl$/ do |factory_name|
|
27
27
|
FactoryGirl.create(factory_name)
|
28
28
|
end
|
29
29
|
|
data/gemfiles/3.0.gemfile.lock
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
PATH
|
2
2
|
remote: /Users/joshuaclayton/dev/gems/factory_girl
|
3
3
|
specs:
|
4
|
-
factory_girl (3.
|
4
|
+
factory_girl (3.6.0)
|
5
5
|
activesupport (>= 3.0.0)
|
6
6
|
|
7
7
|
GEM
|
@@ -26,7 +26,6 @@ GEM
|
|
26
26
|
cucumber (>= 1.1.1)
|
27
27
|
ffi (>= 1.0.11)
|
28
28
|
rspec (>= 2.7.0)
|
29
|
-
bluecloth (2.2.0)
|
30
29
|
bourne (1.1.2)
|
31
30
|
mocha (= 0.10.5)
|
32
31
|
builder (2.1.2)
|
@@ -40,10 +39,14 @@ GEM
|
|
40
39
|
term-ansicolor (>= 1.0.6)
|
41
40
|
diff-lcs (1.1.3)
|
42
41
|
ffi (1.0.11)
|
42
|
+
ffi (1.0.11-java)
|
43
43
|
gherkin (2.9.3)
|
44
44
|
json (>= 1.4.6)
|
45
|
+
gherkin (2.9.3-java)
|
46
|
+
json (>= 1.4.6)
|
45
47
|
i18n (0.5.0)
|
46
48
|
json (1.7.0)
|
49
|
+
json (1.7.0-java)
|
47
50
|
metaclass (0.0.1)
|
48
51
|
mocha (0.10.5)
|
49
52
|
metaclass (~> 0.0.1)
|
@@ -70,13 +73,13 @@ GEM
|
|
70
73
|
yard (0.8.1)
|
71
74
|
|
72
75
|
PLATFORMS
|
76
|
+
java
|
73
77
|
ruby
|
74
78
|
|
75
79
|
DEPENDENCIES
|
76
80
|
activerecord (~> 3.0.0)
|
77
81
|
appraisal (~> 0.4)
|
78
82
|
aruba
|
79
|
-
bluecloth
|
80
83
|
bourne
|
81
84
|
cucumber (~> 1.1)
|
82
85
|
factory_girl!
|
data/gemfiles/3.1.gemfile.lock
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
PATH
|
2
2
|
remote: /Users/joshuaclayton/dev/gems/factory_girl
|
3
3
|
specs:
|
4
|
-
factory_girl (3.
|
4
|
+
factory_girl (3.6.0)
|
5
5
|
activesupport (>= 3.0.0)
|
6
6
|
|
7
7
|
GEM
|
@@ -27,7 +27,6 @@ GEM
|
|
27
27
|
cucumber (>= 1.1.1)
|
28
28
|
ffi (>= 1.0.11)
|
29
29
|
rspec (>= 2.7.0)
|
30
|
-
bluecloth (2.2.0)
|
31
30
|
bourne (1.1.2)
|
32
31
|
mocha (= 0.10.5)
|
33
32
|
builder (3.0.0)
|
@@ -41,10 +40,14 @@ GEM
|
|
41
40
|
term-ansicolor (>= 1.0.6)
|
42
41
|
diff-lcs (1.1.3)
|
43
42
|
ffi (1.0.11)
|
43
|
+
ffi (1.0.11-java)
|
44
44
|
gherkin (2.9.3)
|
45
45
|
json (>= 1.4.6)
|
46
|
+
gherkin (2.9.3-java)
|
47
|
+
json (>= 1.4.6)
|
46
48
|
i18n (0.6.0)
|
47
49
|
json (1.7.0)
|
50
|
+
json (1.7.0-java)
|
48
51
|
metaclass (0.0.1)
|
49
52
|
mocha (0.10.5)
|
50
53
|
metaclass (~> 0.0.1)
|
@@ -71,13 +74,13 @@ GEM
|
|
71
74
|
yard (0.8.1)
|
72
75
|
|
73
76
|
PLATFORMS
|
77
|
+
java
|
74
78
|
ruby
|
75
79
|
|
76
80
|
DEPENDENCIES
|
77
81
|
activerecord (~> 3.1.0)
|
78
82
|
appraisal (~> 0.4)
|
79
83
|
aruba
|
80
|
-
bluecloth
|
81
84
|
bourne
|
82
85
|
cucumber (~> 1.1)
|
83
86
|
factory_girl!
|
data/gemfiles/3.2.gemfile.lock
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
PATH
|
2
2
|
remote: /Users/joshuaclayton/dev/gems/factory_girl
|
3
3
|
specs:
|
4
|
-
factory_girl (3.
|
4
|
+
factory_girl (3.6.0)
|
5
5
|
activesupport (>= 3.0.0)
|
6
6
|
|
7
7
|
GEM
|
@@ -27,7 +27,6 @@ GEM
|
|
27
27
|
cucumber (>= 1.1.1)
|
28
28
|
ffi (>= 1.0.11)
|
29
29
|
rspec (>= 2.7.0)
|
30
|
-
bluecloth (2.2.0)
|
31
30
|
bourne (1.1.2)
|
32
31
|
mocha (= 0.10.5)
|
33
32
|
builder (3.0.0)
|
@@ -41,10 +40,14 @@ GEM
|
|
41
40
|
term-ansicolor (>= 1.0.6)
|
42
41
|
diff-lcs (1.1.3)
|
43
42
|
ffi (1.0.11)
|
43
|
+
ffi (1.0.11-java)
|
44
44
|
gherkin (2.9.3)
|
45
45
|
json (>= 1.4.6)
|
46
|
+
gherkin (2.9.3-java)
|
47
|
+
json (>= 1.4.6)
|
46
48
|
i18n (0.6.0)
|
47
49
|
json (1.7.0)
|
50
|
+
json (1.7.0-java)
|
48
51
|
metaclass (0.0.1)
|
49
52
|
mocha (0.10.5)
|
50
53
|
metaclass (~> 0.0.1)
|
@@ -71,13 +74,13 @@ GEM
|
|
71
74
|
yard (0.8.1)
|
72
75
|
|
73
76
|
PLATFORMS
|
77
|
+
java
|
74
78
|
ruby
|
75
79
|
|
76
80
|
DEPENDENCIES
|
77
81
|
activerecord (~> 3.2.0)
|
78
82
|
appraisal (~> 0.4)
|
79
83
|
aruba
|
80
|
-
bluecloth
|
81
84
|
bourne
|
82
85
|
cucumber (~> 1.1)
|
83
86
|
factory_girl!
|
data/lib/factory_girl.rb
CHANGED
@@ -2,6 +2,7 @@ require 'set'
|
|
2
2
|
require 'active_support/core_ext/module/delegation'
|
3
3
|
require 'active_support/notifications'
|
4
4
|
|
5
|
+
require 'factory_girl/definition_hierarchy'
|
5
6
|
require 'factory_girl/configuration'
|
6
7
|
require 'factory_girl/errors'
|
7
8
|
require 'factory_girl/factory_runner'
|
@@ -41,6 +42,7 @@ require 'factory_girl/decorator/class_key_hash'
|
|
41
42
|
require 'factory_girl/decorator/disallows_duplicates_registry'
|
42
43
|
require 'factory_girl/decorator/invocation_tracker'
|
43
44
|
require 'factory_girl/decorator/invocation_ignorer'
|
45
|
+
require 'factory_girl/decorator/new_constructor'
|
44
46
|
require 'factory_girl/version'
|
45
47
|
|
46
48
|
module FactoryGirl
|
@@ -13,7 +13,10 @@ module FactoryGirl
|
|
13
13
|
def to_proc
|
14
14
|
factory = @factory
|
15
15
|
overrides = @overrides
|
16
|
-
|
16
|
+
traits_and_overrides = [factory, overrides].flatten
|
17
|
+
factory_name = traits_and_overrides.shift
|
18
|
+
|
19
|
+
-> { association(factory_name, *traits_and_overrides) }
|
17
20
|
end
|
18
21
|
|
19
22
|
def association?
|
@@ -31,7 +31,13 @@ module FactoryGirl
|
|
31
31
|
private
|
32
32
|
|
33
33
|
def method_tracking_evaluator
|
34
|
-
@method_tracking_evaluator ||= Decorator::AttributeHash.new(
|
34
|
+
@method_tracking_evaluator ||= Decorator::AttributeHash.new(decorated_evaluator, attribute_names_to_assign)
|
35
|
+
end
|
36
|
+
|
37
|
+
def decorated_evaluator
|
38
|
+
invocation_decorator.new(
|
39
|
+
Decorator::NewConstructor.new(@evaluator, @build_class)
|
40
|
+
)
|
35
41
|
end
|
36
42
|
|
37
43
|
def invocation_decorator
|
@@ -71,7 +77,7 @@ module FactoryGirl
|
|
71
77
|
end
|
72
78
|
|
73
79
|
def attribute_names_to_assign
|
74
|
-
non_ignored_attribute_names + override_names - ignored_attribute_names - alias_names_to_ignore
|
80
|
+
@attribute_names_to_assign ||= non_ignored_attribute_names + override_names - ignored_attribute_names - alias_names_to_ignore
|
75
81
|
end
|
76
82
|
|
77
83
|
def non_ignored_attribute_names
|
@@ -5,7 +5,7 @@ module FactoryGirl
|
|
5
5
|
def initialize(name, block)
|
6
6
|
@name = name.to_sym
|
7
7
|
@block = block
|
8
|
-
|
8
|
+
ensure_valid_callback_name!
|
9
9
|
end
|
10
10
|
|
11
11
|
def run(instance, evaluator)
|
@@ -26,7 +26,7 @@ module FactoryGirl
|
|
26
26
|
|
27
27
|
private
|
28
28
|
|
29
|
-
def
|
29
|
+
def ensure_valid_callback_name!
|
30
30
|
unless FactoryGirl.callback_names.include?(name)
|
31
31
|
raise InvalidCallbackNameError, "#{name} is not a valid callback name. " +
|
32
32
|
"Valid callback names are #{FactoryGirl.callback_names.inspect}"
|
@@ -0,0 +1,39 @@
|
|
1
|
+
module FactoryGirl
|
2
|
+
class DefinitionHierarchy
|
3
|
+
def callbacks
|
4
|
+
[]
|
5
|
+
end
|
6
|
+
|
7
|
+
def constructor
|
8
|
+
FactoryGirl.constructor
|
9
|
+
end
|
10
|
+
|
11
|
+
def to_create
|
12
|
+
FactoryGirl.to_create
|
13
|
+
end
|
14
|
+
|
15
|
+
def self.add_callbacks(callbacks)
|
16
|
+
if callbacks.any?
|
17
|
+
define_method :callbacks do
|
18
|
+
super() + callbacks
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
def self.build_constructor(&block)
|
24
|
+
if block
|
25
|
+
define_method(:constructor) do
|
26
|
+
block
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
def self.build_to_create(&block)
|
32
|
+
if block
|
33
|
+
define_method(:to_create) do
|
34
|
+
block
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
@@ -10,8 +10,7 @@ module FactoryGirl
|
|
10
10
|
undef_method(method) unless method =~ /^__|initialize/
|
11
11
|
end
|
12
12
|
|
13
|
-
def initialize(
|
14
|
-
@build_class = build_class
|
13
|
+
def initialize(build_strategy, overrides = {})
|
15
14
|
@build_strategy = build_strategy
|
16
15
|
@overrides = overrides
|
17
16
|
@cached_attributes = overrides
|
@@ -21,12 +20,13 @@ module FactoryGirl
|
|
21
20
|
end
|
22
21
|
end
|
23
22
|
|
24
|
-
|
25
|
-
|
26
|
-
def association(factory_name, overrides = {})
|
23
|
+
def association(factory_name, *traits_and_overrides)
|
24
|
+
overrides = traits_and_overrides.extract_options!
|
27
25
|
strategy_override = overrides.fetch(:strategy) { :create }
|
28
26
|
|
29
|
-
|
27
|
+
traits_and_overrides += [overrides.except(:strategy)]
|
28
|
+
|
29
|
+
runner = FactoryRunner.new(factory_name, strategy_override, traits_and_overrides)
|
30
30
|
@build_strategy.association(runner)
|
31
31
|
end
|
32
32
|
|
data/lib/factory_girl/factory.rb
CHANGED
@@ -33,7 +33,7 @@ module FactoryGirl
|
|
33
33
|
|
34
34
|
strategy = StrategyCalculator.new(build_strategy).strategy.new
|
35
35
|
|
36
|
-
evaluator = evaluator_class.new(
|
36
|
+
evaluator = evaluator_class.new(strategy, overrides.symbolize_keys)
|
37
37
|
attribute_assigner = AttributeAssigner.new(evaluator, build_class, &compiled_constructor)
|
38
38
|
|
39
39
|
evaluation = Evaluation.new(attribute_assigner, compiled_to_create)
|
@@ -84,6 +84,7 @@ module FactoryGirl
|
|
84
84
|
parent.compile
|
85
85
|
parent.defined_traits.each {|trait| define_trait(trait) }
|
86
86
|
@definition.compile
|
87
|
+
build_hierarchy
|
87
88
|
@compiled = true
|
88
89
|
end
|
89
90
|
end
|
@@ -111,16 +112,30 @@ module FactoryGirl
|
|
111
112
|
end
|
112
113
|
end
|
113
114
|
|
115
|
+
def hierarchy_class
|
116
|
+
@hierarchy_class ||= Class.new(parent.hierarchy_class)
|
117
|
+
end
|
118
|
+
|
119
|
+
def hierarchy_instance
|
120
|
+
@hierarchy_instance ||= hierarchy_class.new
|
121
|
+
end
|
122
|
+
|
123
|
+
def build_hierarchy
|
124
|
+
hierarchy_class.build_to_create &definition.to_create
|
125
|
+
hierarchy_class.build_constructor &definition.constructor
|
126
|
+
hierarchy_class.add_callbacks definition.callbacks
|
127
|
+
end
|
128
|
+
|
114
129
|
def callbacks
|
115
|
-
|
130
|
+
hierarchy_instance.callbacks
|
116
131
|
end
|
117
132
|
|
118
133
|
def compiled_to_create
|
119
|
-
|
134
|
+
hierarchy_instance.to_create
|
120
135
|
end
|
121
136
|
|
122
137
|
def compiled_constructor
|
123
|
-
|
138
|
+
hierarchy_instance.constructor
|
124
139
|
end
|
125
140
|
|
126
141
|
private
|
@@ -141,6 +156,9 @@ module FactoryGirl
|
|
141
156
|
super
|
142
157
|
@definition = @definition.clone
|
143
158
|
@evaluator_class = nil
|
159
|
+
@hierarchy_class = nil
|
160
|
+
@hierarchy_instance = nil
|
161
|
+
@compiled = false
|
144
162
|
end
|
145
163
|
end
|
146
164
|
end
|
@@ -10,10 +10,9 @@ module FactoryGirl
|
|
10
10
|
delegate :defined_traits, :callbacks, :attributes, :constructor,
|
11
11
|
:to_create, to: :definition
|
12
12
|
|
13
|
-
def compiled_to_create; to_create; end
|
14
|
-
def compiled_constructor; constructor; end
|
15
13
|
def compile; end
|
16
14
|
def class_name; end
|
17
15
|
def evaluator_class; FactoryGirl::Evaluator; end
|
16
|
+
def hierarchy_class; FactoryGirl::DefinitionHierarchy; end
|
18
17
|
end
|
19
18
|
end
|
data/lib/factory_girl/version.rb
CHANGED
@@ -669,3 +669,32 @@ describe "implicit traits containing callbacks" do
|
|
669
669
|
FactoryGirl.build(:user_with_trait_with_callback).value.should == 1
|
670
670
|
end
|
671
671
|
end
|
672
|
+
|
673
|
+
describe "traits used in associations" do
|
674
|
+
before do
|
675
|
+
define_model("User", admin: :boolean, name: :string)
|
676
|
+
define_model("Post", author_id: :integer) do
|
677
|
+
belongs_to :author, class_name: 'User'
|
678
|
+
end
|
679
|
+
|
680
|
+
FactoryGirl.define do
|
681
|
+
factory :user do
|
682
|
+
admin false
|
683
|
+
|
684
|
+
trait :admin do
|
685
|
+
admin true
|
686
|
+
end
|
687
|
+
end
|
688
|
+
|
689
|
+
factory :post do
|
690
|
+
association :author, factory: [:user, :admin], name: 'John Doe'
|
691
|
+
end
|
692
|
+
end
|
693
|
+
end
|
694
|
+
|
695
|
+
it "allows assigning traits for the factory of an association" do
|
696
|
+
author = FactoryGirl.create(:post).author
|
697
|
+
author.should be_admin
|
698
|
+
author.name.should == 'John Doe'
|
699
|
+
end
|
700
|
+
end
|
@@ -7,7 +7,7 @@ describe FactoryGirl::EvaluatorClassDefiner do
|
|
7
7
|
|
8
8
|
let(:attributes) { [simple_attribute, relative_attribute, attribute_that_raises_a_second_time] }
|
9
9
|
let(:class_definer) { FactoryGirl::EvaluatorClassDefiner.new(attributes, FactoryGirl::Evaluator) }
|
10
|
-
let(:evaluator) { class_definer.evaluator_class.new(
|
10
|
+
let(:evaluator) { class_definer.evaluator_class.new(stub("build strategy", add_observer: true)) }
|
11
11
|
|
12
12
|
it "returns an evaluator when accessing the evaluator class" do
|
13
13
|
evaluator.should be_a(FactoryGirl::Evaluator)
|
data/spec/spec_helper.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: factory_girl
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 3.
|
4
|
+
version: 3.6.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -10,7 +10,7 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date: 2012-
|
13
|
+
date: 2012-07-27 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: activesupport
|
@@ -188,22 +188,6 @@ dependencies:
|
|
188
188
|
- - ! '>='
|
189
189
|
- !ruby/object:Gem::Version
|
190
190
|
version: '0'
|
191
|
-
- !ruby/object:Gem::Dependency
|
192
|
-
name: bluecloth
|
193
|
-
requirement: !ruby/object:Gem::Requirement
|
194
|
-
none: false
|
195
|
-
requirements:
|
196
|
-
- - ! '>='
|
197
|
-
- !ruby/object:Gem::Version
|
198
|
-
version: '0'
|
199
|
-
type: :development
|
200
|
-
prerelease: false
|
201
|
-
version_requirements: !ruby/object:Gem::Requirement
|
202
|
-
none: false
|
203
|
-
requirements:
|
204
|
-
- - ! '>='
|
205
|
-
- !ruby/object:Gem::Version
|
206
|
-
version: '0'
|
207
191
|
description: ! "factory_girl provides a framework and DSL for defining and\n using
|
208
192
|
factories - less error-prone, more explicit, and\n all-around
|
209
193
|
easier to work with than fixtures."
|
@@ -267,7 +251,9 @@ files:
|
|
267
251
|
- lib/factory_girl/decorator/disallows_duplicates_registry.rb
|
268
252
|
- lib/factory_girl/decorator/invocation_ignorer.rb
|
269
253
|
- lib/factory_girl/decorator/invocation_tracker.rb
|
254
|
+
- lib/factory_girl/decorator/new_constructor.rb
|
270
255
|
- lib/factory_girl/definition.rb
|
256
|
+
- lib/factory_girl/definition_hierarchy.rb
|
271
257
|
- lib/factory_girl/definition_proxy.rb
|
272
258
|
- lib/factory_girl/errors.rb
|
273
259
|
- lib/factory_girl/evaluation.rb
|