snusnu-dm-accepts_nested_attributes 0.0.6 → 0.10.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/Manifest.txt +13 -8
- data/Rakefile +2 -3
- data/TODO +5 -0
- data/lib/dm-accepts_nested_attributes.rb +7 -14
- data/lib/dm-accepts_nested_attributes/error_collecting.rb +35 -0
- data/lib/dm-accepts_nested_attributes/model.rb +132 -0
- data/lib/dm-accepts_nested_attributes/resource.rb +218 -29
- data/lib/dm-accepts_nested_attributes/save.rb +13 -0
- data/lib/dm-accepts_nested_attributes/transactional_save.rb +15 -0
- data/lib/dm-accepts_nested_attributes/version.rb +1 -1
- data/spec/fixtures/person.rb +8 -0
- data/spec/fixtures/profile.rb +9 -0
- data/spec/fixtures/project.rb +8 -0
- data/spec/fixtures/project_membership.rb +8 -0
- data/spec/fixtures/task.rb +9 -0
- data/spec/integration/belongs_to_spec.rb +10 -134
- data/spec/integration/has_1_spec.rb +9 -121
- data/spec/integration/has_n_spec.rb +10 -149
- data/spec/integration/has_n_through_spec.rb +10 -162
- data/spec/{shared → lib}/rspec_tmbundle_support.rb +1 -1
- data/spec/shared/belongs_to_spec.rb +127 -0
- data/spec/shared/has_1_spec.rb +103 -0
- data/spec/shared/has_n_spec.rb +114 -0
- data/spec/shared/has_n_through_spec.rb +139 -0
- data/spec/spec_helper.rb +12 -9
- data/spec/unit/accepts_nested_attributes_for_spec.rb +39 -118
- data/tasks/changelog.rb +18 -0
- data/tasks/spec.rb +0 -1
- metadata +19 -14
- data/lib/dm-accepts_nested_attributes/association_proxies.rb +0 -55
- data/lib/dm-accepts_nested_attributes/association_validation.rb +0 -49
- data/lib/dm-accepts_nested_attributes/nested_attributes.rb +0 -350
- data/spec/unit/resource_spec.rb +0 -174
data/spec/fixtures/person.rb
CHANGED
@@ -1,8 +1,16 @@
|
|
1
1
|
class Person
|
2
|
+
|
2
3
|
include DataMapper::Resource
|
4
|
+
|
5
|
+
# properties
|
6
|
+
|
3
7
|
property :id, Serial
|
4
8
|
property :name, String, :nullable => false
|
9
|
+
|
10
|
+
# associations
|
11
|
+
|
5
12
|
has 1, :profile
|
6
13
|
has n, :project_memberships
|
7
14
|
has n, :projects, :through => :project_memberships
|
15
|
+
|
8
16
|
end
|
data/spec/fixtures/profile.rb
CHANGED
data/spec/fixtures/project.rb
CHANGED
@@ -1,8 +1,16 @@
|
|
1
1
|
class Project
|
2
|
+
|
2
3
|
include DataMapper::Resource
|
4
|
+
|
5
|
+
# properties
|
6
|
+
|
3
7
|
property :id, Serial
|
4
8
|
property :name, String, :nullable => false
|
9
|
+
|
10
|
+
# associations
|
11
|
+
|
5
12
|
has n, :tasks
|
6
13
|
has n, :project_memberships
|
7
14
|
has n, :people, :through => :project_memberships
|
15
|
+
|
8
16
|
end
|
@@ -1,8 +1,16 @@
|
|
1
1
|
class ProjectMembership
|
2
|
+
|
2
3
|
include DataMapper::Resource
|
4
|
+
|
5
|
+
# properties
|
6
|
+
|
3
7
|
property :id, Serial
|
4
8
|
property :person_id, Integer, :nullable => false
|
5
9
|
property :project_id, Integer, :nullable => false
|
10
|
+
|
11
|
+
# associations
|
12
|
+
|
6
13
|
belongs_to :person
|
7
14
|
belongs_to :project
|
15
|
+
|
8
16
|
end
|
data/spec/fixtures/task.rb
CHANGED
@@ -2,121 +2,6 @@ require 'pathname'
|
|
2
2
|
require Pathname(__FILE__).dirname.expand_path.parent + 'spec_helper'
|
3
3
|
|
4
4
|
describe DataMapper::NestedAttributes do
|
5
|
-
|
6
|
-
describe "every accessible belongs_to association with a valid reject_if proc", :shared => true do
|
7
|
-
|
8
|
-
it "should not allow to create a new person via Profile#person_attributes" do
|
9
|
-
@profile.person_attributes = { :name => 'Martin' }
|
10
|
-
@profile.save.should be_false # fails because of validations (not null on belongs_to)
|
11
|
-
Profile.all.size.should == 0
|
12
|
-
Person.all.size.should == 0
|
13
|
-
end
|
14
|
-
|
15
|
-
end
|
16
|
-
|
17
|
-
describe "every accessible belongs_to association with no reject_if proc", :shared => true do
|
18
|
-
|
19
|
-
it "should allow to create a new person via Profile#person_attributes" do
|
20
|
-
@profile.person_attributes = { :name => 'Martin' }
|
21
|
-
@profile.person.should_not be_nil
|
22
|
-
@profile.person.name.should == 'Martin'
|
23
|
-
@profile.save
|
24
|
-
@profile.person.should == Person.first
|
25
|
-
Profile.all.size.should == 1
|
26
|
-
Person.all.size.should == 1
|
27
|
-
Person.first.name.should == 'Martin'
|
28
|
-
end
|
29
|
-
|
30
|
-
it "should allow to update an existing person via Profile#person_attributes" do
|
31
|
-
person = Person.create(:name => 'Martin')
|
32
|
-
@profile.person = person
|
33
|
-
@profile.save
|
34
|
-
|
35
|
-
Person.all.size.should == 1
|
36
|
-
Person.first.name.should == 'Martin'
|
37
|
-
Profile.all.size.should == 1
|
38
|
-
|
39
|
-
@profile.person.should == person
|
40
|
-
@profile.person_attributes = { :id => person.id, :name => 'Martin Gamsjaeger' }
|
41
|
-
@profile.person.name.should == 'Martin Gamsjaeger'
|
42
|
-
@profile.save
|
43
|
-
|
44
|
-
Person.all.size.should == 1
|
45
|
-
Person.first.name.should == 'Martin Gamsjaeger'
|
46
|
-
Profile.all.size.should == 1
|
47
|
-
end
|
48
|
-
|
49
|
-
it "should perform atomic commits" do
|
50
|
-
@profile.person_attributes = { :name => nil } # will fail because of validations
|
51
|
-
@profile.person.should_not be_nil
|
52
|
-
@profile.person.name.should be_nil
|
53
|
-
@profile.save.should be_false
|
54
|
-
|
55
|
-
Profile.all.size.should == 0
|
56
|
-
Person.all.size.should == 0
|
57
|
-
|
58
|
-
@profile.nick = nil # will fail because of validations
|
59
|
-
@profile.should_not be_valid
|
60
|
-
@profile.person_attributes = { :name => 'Martin' }
|
61
|
-
@profile.person.should_not be_nil
|
62
|
-
@profile.person.name.should == 'Martin'
|
63
|
-
@profile.save.should be_false
|
64
|
-
|
65
|
-
Profile.all.size.should == 0
|
66
|
-
Person.all.size.should == 0
|
67
|
-
end
|
68
|
-
|
69
|
-
end
|
70
|
-
|
71
|
-
describe "every accessible belongs_to association with :allow_destroy => false", :shared => true do
|
72
|
-
|
73
|
-
it "should not allow to delete an existing person via Profile#person_attributes" do
|
74
|
-
person = Person.create(:name => 'Martin')
|
75
|
-
@profile.person = person
|
76
|
-
@profile.save
|
77
|
-
|
78
|
-
Profile.all.size.should == 1
|
79
|
-
Person.all.size.should == 1
|
80
|
-
|
81
|
-
@profile.person_attributes = { :id => person.id, :_delete => true }
|
82
|
-
@profile.save
|
83
|
-
|
84
|
-
Profile.all.size.should == 1
|
85
|
-
Person.all.size.should == 1
|
86
|
-
end
|
87
|
-
|
88
|
-
end
|
89
|
-
|
90
|
-
describe "every accessible belongs_to association with :allow_destroy => true", :shared => true do
|
91
|
-
|
92
|
-
it "should allow to delete an existing person via Profile#person_attributes" do
|
93
|
-
person = Person.create(:name => 'Martin')
|
94
|
-
@profile.person = person
|
95
|
-
@profile.save
|
96
|
-
|
97
|
-
Profile.all.size.should == 1
|
98
|
-
Person.all.size.should == 1
|
99
|
-
|
100
|
-
@profile.person_attributes = { :id => person.id, :_delete => true }
|
101
|
-
@profile.save
|
102
|
-
|
103
|
-
Profile.all.size.should == 1
|
104
|
-
Person.all.size.should == 0
|
105
|
-
end
|
106
|
-
|
107
|
-
end
|
108
|
-
|
109
|
-
describe "every accessible belongs_to association with a nested attributes reader", :shared => true do
|
110
|
-
|
111
|
-
it "should return the attributes written to Profile#person_attributes from the Profile#person_attributes reader" do
|
112
|
-
@profile.person_attributes.should be_nil
|
113
|
-
|
114
|
-
@profile.person_attributes = { :name => 'Martin' }
|
115
|
-
|
116
|
-
@profile.person_attributes.should == { :name => 'Martin' }
|
117
|
-
end
|
118
|
-
|
119
|
-
end
|
120
5
|
|
121
6
|
describe "Profile.belongs_to(:person)" do
|
122
7
|
|
@@ -133,10 +18,10 @@ describe DataMapper::NestedAttributes do
|
|
133
18
|
Profile.accepts_nested_attributes_for :person
|
134
19
|
@profile = Profile.new :nick => 'snusnu'
|
135
20
|
end
|
136
|
-
|
21
|
+
|
22
|
+
it_should_behave_like "every accessible belongs_to association"
|
137
23
|
it_should_behave_like "every accessible belongs_to association with no reject_if proc"
|
138
24
|
it_should_behave_like "every accessible belongs_to association with :allow_destroy => false"
|
139
|
-
it_should_behave_like "every accessible belongs_to association with a nested attributes reader"
|
140
25
|
|
141
26
|
end
|
142
27
|
|
@@ -147,7 +32,8 @@ describe DataMapper::NestedAttributes do
|
|
147
32
|
Profile.accepts_nested_attributes_for :person, :allow_destroy => false
|
148
33
|
@profile = Profile.new :nick => 'snusnu'
|
149
34
|
end
|
150
|
-
|
35
|
+
|
36
|
+
it_should_behave_like "every accessible belongs_to association"
|
151
37
|
it_should_behave_like "every accessible belongs_to association with no reject_if proc"
|
152
38
|
it_should_behave_like "every accessible belongs_to association with :allow_destroy => false"
|
153
39
|
|
@@ -160,26 +46,14 @@ describe DataMapper::NestedAttributes do
|
|
160
46
|
Profile.accepts_nested_attributes_for :person, :allow_destroy => true
|
161
47
|
@profile = Profile.new :nick => 'snusnu'
|
162
48
|
end
|
163
|
-
|
49
|
+
|
50
|
+
it_should_behave_like "every accessible belongs_to association"
|
164
51
|
it_should_behave_like "every accessible belongs_to association with no reject_if proc"
|
165
52
|
it_should_behave_like "every accessible belongs_to association with :allow_destroy => true"
|
166
53
|
|
167
54
|
end
|
168
55
|
|
169
56
|
describe "accepts_nested_attributes_for :person, " do
|
170
|
-
|
171
|
-
describe ":reject_if => :foo" do
|
172
|
-
|
173
|
-
before(:each) do
|
174
|
-
clear_data
|
175
|
-
Profile.accepts_nested_attributes_for :person, :reject_if => :foo
|
176
|
-
@profile = Profile.new :nick => 'snusnu'
|
177
|
-
end
|
178
|
-
|
179
|
-
it_should_behave_like "every accessible belongs_to association with no reject_if proc"
|
180
|
-
it_should_behave_like "every accessible belongs_to association with :allow_destroy => false"
|
181
|
-
|
182
|
-
end
|
183
57
|
|
184
58
|
describe ":reject_if => lambda { |attrs| true }" do
|
185
59
|
|
@@ -188,7 +62,8 @@ describe DataMapper::NestedAttributes do
|
|
188
62
|
Profile.accepts_nested_attributes_for :person, :reject_if => lambda { |attrs| true }
|
189
63
|
@profile = Profile.new :nick => 'snusnu'
|
190
64
|
end
|
191
|
-
|
65
|
+
|
66
|
+
it_should_behave_like "every accessible belongs_to association"
|
192
67
|
it_should_behave_like "every accessible belongs_to association with a valid reject_if proc"
|
193
68
|
it_should_behave_like "every accessible belongs_to association with :allow_destroy => false"
|
194
69
|
|
@@ -201,7 +76,8 @@ describe DataMapper::NestedAttributes do
|
|
201
76
|
Profile.accepts_nested_attributes_for :person, :reject_if => lambda { |attrs| false }
|
202
77
|
@profile = Profile.new :nick => 'snusnu'
|
203
78
|
end
|
204
|
-
|
79
|
+
|
80
|
+
it_should_behave_like "every accessible belongs_to association"
|
205
81
|
it_should_behave_like "every accessible belongs_to association with no reject_if proc"
|
206
82
|
it_should_behave_like "every accessible belongs_to association with :allow_destroy => false"
|
207
83
|
|
@@ -2,110 +2,7 @@ require 'pathname'
|
|
2
2
|
require Pathname(__FILE__).dirname.expand_path.parent + 'spec_helper'
|
3
3
|
|
4
4
|
describe DataMapper::NestedAttributes do
|
5
|
-
|
6
|
-
describe "every accessible has(1) association with a valid reject_if proc", :shared => true do
|
7
|
-
|
8
|
-
it "should not allow to create a new profile via Person#profile_attributes" do
|
9
|
-
@person.profile_attributes = { :nick => 'snusnu' }
|
10
|
-
@person.profile.should be_nil
|
11
|
-
@person.save
|
12
|
-
Person.all.size.should == 1
|
13
|
-
Profile.all.size.should == 0
|
14
|
-
end
|
15
|
-
|
16
|
-
end
|
17
|
-
|
18
|
-
describe "every accessible has(1) association with no reject_if proc", :shared => true do
|
19
|
-
|
20
|
-
it "should allow to create a new profile via Person#profile_attributes" do
|
21
|
-
@person.profile_attributes = { :nick => 'snusnu' }
|
22
|
-
@person.profile.should_not be_nil
|
23
|
-
@person.profile.nick.should == 'snusnu'
|
24
|
-
@person.save.should be_true
|
25
|
-
|
26
|
-
Person.all.size.should == 1
|
27
|
-
Profile.all.size.should == 1
|
28
|
-
Profile.first.nick.should == 'snusnu'
|
29
|
-
end
|
30
|
-
|
31
|
-
it "should allow to update an existing profile via Person#profile_attributes" do
|
32
|
-
@person.save.should be_true
|
33
|
-
profile = Profile.create(:person_id => @person.id, :nick => 'snusnu')
|
34
|
-
@person.reload
|
35
|
-
|
36
|
-
@person.profile.should == profile
|
37
|
-
@person.profile_attributes = { :id => profile.id, :nick => 'still snusnu somehow' }
|
38
|
-
@person.profile.nick.should == 'still snusnu somehow'
|
39
|
-
@person.save.should be_true
|
40
|
-
@person.profile.should == Profile.first
|
41
|
-
Person.all.size.should == 1
|
42
|
-
Profile.all.size.should == 1
|
43
|
-
Profile.first.nick.should == 'still snusnu somehow'
|
44
|
-
end
|
45
|
-
|
46
|
-
it "should perform atomic commits" do
|
47
|
-
@person.profile_attributes = { :nick => nil } # will fail because of validations
|
48
|
-
@person.profile.should_not be_nil
|
49
|
-
@person.profile.nick.should be_nil
|
50
|
-
@person.save.should be_false
|
51
|
-
|
52
|
-
Person.all.size.should == 0
|
53
|
-
Profile.all.size.should == 0
|
54
|
-
|
55
|
-
@person.profile_attributes = { :nick => 'snusnu' }
|
56
|
-
@person.profile.should_not be_nil
|
57
|
-
@person.profile.nick.should == 'snusnu'
|
58
|
-
@person.name = nil # will fail because of validations
|
59
|
-
@person.save.should be_false
|
60
|
-
|
61
|
-
Person.all.size.should == 0
|
62
|
-
Profile.all.size.should == 0
|
63
|
-
end
|
64
|
-
|
65
|
-
end
|
66
|
-
|
67
|
-
describe "every accessible has(1) association with :allow_destroy => false", :shared => true do
|
68
|
-
|
69
|
-
it "should not allow to delete an existing profile via Person#profile_attributes" do
|
70
|
-
@person.save
|
71
|
-
profile = Profile.create(:person_id => @person.id, :nick => 'snusnu')
|
72
|
-
@person.reload
|
73
|
-
|
74
|
-
@person.profile_attributes = { :id => profile.id, :_delete => true }
|
75
|
-
@person.save
|
76
|
-
Person.all.size.should == 1
|
77
|
-
Profile.all.size.should == 1
|
78
|
-
end
|
79
|
-
|
80
|
-
end
|
81
|
-
|
82
|
-
describe "every accessible has(1) association with :allow_destroy => true", :shared => true do
|
83
|
-
|
84
|
-
it "should allow to delete an existing profile via Person#profile_attributes" do
|
85
|
-
@person.save
|
86
|
-
profile = Profile.create(:person_id => @person.id, :nick => 'snusnu')
|
87
|
-
@person.reload
|
88
5
|
|
89
|
-
@person.profile_attributes = { :id => profile.id, :_delete => true }
|
90
|
-
@person.save
|
91
|
-
Person.all.size.should == 1
|
92
|
-
Profile.all.size.should == 0
|
93
|
-
end
|
94
|
-
|
95
|
-
end
|
96
|
-
|
97
|
-
describe "every accessible has(1) association with a nested attributes reader", :shared => true do
|
98
|
-
|
99
|
-
it "should return the attributes written to Person#profile_attributes from the Person#profile_attributes reader" do
|
100
|
-
@person.profile_attributes.should be_nil
|
101
|
-
|
102
|
-
@person.profile_attributes = { :nick => 'snusnu' }
|
103
|
-
|
104
|
-
@person.profile_attributes.should == { :nick => 'snusnu' }
|
105
|
-
end
|
106
|
-
|
107
|
-
end
|
108
|
-
|
109
6
|
describe "Person.has(1, :profile)" do
|
110
7
|
|
111
8
|
include XToOneHelpers
|
@@ -121,10 +18,10 @@ describe DataMapper::NestedAttributes do
|
|
121
18
|
Person.accepts_nested_attributes_for :profile
|
122
19
|
@person = Person.new :name => 'Martin'
|
123
20
|
end
|
124
|
-
|
21
|
+
|
22
|
+
it_should_behave_like "every accessible has(1) association"
|
125
23
|
it_should_behave_like "every accessible has(1) association with no reject_if proc"
|
126
24
|
it_should_behave_like "every accessible has(1) association with :allow_destroy => false"
|
127
|
-
it_should_behave_like "every accessible has(1) association with a nested attributes reader"
|
128
25
|
|
129
26
|
end
|
130
27
|
|
@@ -135,7 +32,8 @@ describe DataMapper::NestedAttributes do
|
|
135
32
|
Person.accepts_nested_attributes_for :profile, :allow_destroy => false
|
136
33
|
@person = Person.new :name => 'Martin'
|
137
34
|
end
|
138
|
-
|
35
|
+
|
36
|
+
it_should_behave_like "every accessible has(1) association"
|
139
37
|
it_should_behave_like "every accessible has(1) association with no reject_if proc"
|
140
38
|
it_should_behave_like "every accessible has(1) association with :allow_destroy => false"
|
141
39
|
|
@@ -149,6 +47,7 @@ describe DataMapper::NestedAttributes do
|
|
149
47
|
@person = Person.new :name => 'Martin'
|
150
48
|
end
|
151
49
|
|
50
|
+
it_should_behave_like "every accessible has(1) association"
|
152
51
|
it_should_behave_like "every accessible has(1) association with no reject_if proc"
|
153
52
|
it_should_behave_like "every accessible has(1) association with :allow_destroy => true"
|
154
53
|
|
@@ -156,19 +55,6 @@ describe DataMapper::NestedAttributes do
|
|
156
55
|
|
157
56
|
|
158
57
|
describe "accepts_nested_attributes_for :profile, " do
|
159
|
-
|
160
|
-
describe ":reject_if => :foo" do
|
161
|
-
|
162
|
-
before(:each) do
|
163
|
-
clear_data
|
164
|
-
Person.accepts_nested_attributes_for :profile, :reject_if => :foo
|
165
|
-
@person = Person.new :name => 'Martin'
|
166
|
-
end
|
167
|
-
|
168
|
-
it_should_behave_like "every accessible has(1) association with no reject_if proc"
|
169
|
-
it_should_behave_like "every accessible has(1) association with :allow_destroy => false"
|
170
|
-
|
171
|
-
end
|
172
58
|
|
173
59
|
describe ":reject_if => lambda { |attrs| true }" do
|
174
60
|
|
@@ -177,7 +63,8 @@ describe DataMapper::NestedAttributes do
|
|
177
63
|
Person.accepts_nested_attributes_for :profile, :reject_if => lambda { |attrs| true }
|
178
64
|
@person = Person.new :name => 'Martin'
|
179
65
|
end
|
180
|
-
|
66
|
+
|
67
|
+
it_should_behave_like "every accessible has(1) association"
|
181
68
|
it_should_behave_like "every accessible has(1) association with a valid reject_if proc"
|
182
69
|
it_should_behave_like "every accessible has(1) association with :allow_destroy => false"
|
183
70
|
|
@@ -190,7 +77,8 @@ describe DataMapper::NestedAttributes do
|
|
190
77
|
Person.accepts_nested_attributes_for :profile, :reject_if => lambda { |attrs| false }
|
191
78
|
@person = Person.new :name => 'Martin'
|
192
79
|
end
|
193
|
-
|
80
|
+
|
81
|
+
it_should_behave_like "every accessible has(1) association"
|
194
82
|
it_should_behave_like "every accessible has(1) association with no reject_if proc"
|
195
83
|
it_should_behave_like "every accessible has(1) association with :allow_destroy => false"
|
196
84
|
|