dm-accepts_nested_attributes_for 1.2.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.
Files changed (58) hide show
  1. data/CHANGELOG +970 -0
  2. data/Gemfile +84 -0
  3. data/LICENSE +20 -0
  4. data/README.textile +94 -0
  5. data/Rakefile +25 -0
  6. data/TODO +6 -0
  7. data/VERSION +1 -0
  8. data/dm-accepts_nested_attributes.gemspec +114 -0
  9. data/lib/dm-accepts_nested_attributes.rb +13 -0
  10. data/lib/dm-accepts_nested_attributes/model.rb +144 -0
  11. data/lib/dm-accepts_nested_attributes/relationship.rb +82 -0
  12. data/lib/dm-accepts_nested_attributes/resource.rb +382 -0
  13. data/lib/dm-accepts_nested_attributes/version.rb +7 -0
  14. data/spec/accepts_nested_attributes_for_spec.rb +408 -0
  15. data/spec/assign_nested_attributes_for_spec.rb +101 -0
  16. data/spec/comb/1-1_disjoint_spec.rb +67 -0
  17. data/spec/comb/1-1_overlapping_spec.rb +66 -0
  18. data/spec/comb/1-1_subset_spec.rb +65 -0
  19. data/spec/comb/1-1_superset_spec.rb +67 -0
  20. data/spec/comb/1-m_disjoint_spec.rb +71 -0
  21. data/spec/comb/1-m_overlapping_spec.rb +70 -0
  22. data/spec/comb/1-m_subset_spec.rb +65 -0
  23. data/spec/comb/1-m_superset_spec.rb +71 -0
  24. data/spec/comb/m-1_disjoint_spec.rb +71 -0
  25. data/spec/comb/m-1_overlapping_spec.rb +70 -0
  26. data/spec/comb/m-1_subset_spec.rb +65 -0
  27. data/spec/comb/m-1_superset_spec.rb +71 -0
  28. data/spec/comb/n-m_composite_spec.rb +141 -0
  29. data/spec/comb/n-m_surrogate_spec.rb +154 -0
  30. data/spec/many_to_many_composite_spec.rb +120 -0
  31. data/spec/many_to_many_spec.rb +129 -0
  32. data/spec/many_to_one_composite_spec.rb +120 -0
  33. data/spec/many_to_one_spec.rb +101 -0
  34. data/spec/one_to_many_composite_spec.rb +120 -0
  35. data/spec/one_to_many_spec.rb +100 -0
  36. data/spec/one_to_one_composite_spec.rb +150 -0
  37. data/spec/one_to_one_spec.rb +115 -0
  38. data/spec/rcov.opts +6 -0
  39. data/spec/resource_spec.rb +65 -0
  40. data/spec/shared/many_to_many_composite_spec.rb +149 -0
  41. data/spec/shared/many_to_many_spec.rb +146 -0
  42. data/spec/shared/many_to_one_composite_spec.rb +160 -0
  43. data/spec/shared/many_to_one_spec.rb +130 -0
  44. data/spec/shared/one_to_many_composite_spec.rb +159 -0
  45. data/spec/shared/one_to_many_spec.rb +107 -0
  46. data/spec/shared/one_to_one_composite_spec.rb +114 -0
  47. data/spec/shared/one_to_one_spec.rb +111 -0
  48. data/spec/spec.opts +4 -0
  49. data/spec/spec_helper.rb +50 -0
  50. data/spec/update_dirty_spec.rb +113 -0
  51. data/spec/update_multiple_spec.rb +79 -0
  52. data/tasks/changelog.rake +20 -0
  53. data/tasks/ci.rake +1 -0
  54. data/tasks/local_gemfile.rake +18 -0
  55. data/tasks/spec.rake +22 -0
  56. data/tasks/yard.rake +9 -0
  57. data/tasks/yardstick.rake +19 -0
  58. metadata +216 -0
@@ -0,0 +1,67 @@
1
+ require 'spec_helper'
2
+
3
+ describe "1:1 (PK disjoint FK)" do
4
+ before(:all) do
5
+ class ::Person
6
+ include DataMapper::Resource
7
+ extend ConstraintSupport
8
+
9
+ property :id, Serial, :key => true
10
+ property :audit_id, Integer, :key => true, :min => 0
11
+ property :name, String, :required => true
12
+
13
+ has 1, :membership, constraint(:destroy)
14
+ end
15
+
16
+ class ::Membership
17
+ include DataMapper::Resource
18
+
19
+ # keep properties unordered
20
+ property :person_audit_id, Integer, :min => 0, :unique => :person
21
+ property :audit_id, Integer, :key => true, :min => 0
22
+ property :id, Integer, :key => true, :min => 0
23
+ property :person_id, Integer, :min => 0, :unique => :person
24
+ property :role, String, :required => true
25
+
26
+ belongs_to :person
27
+ end
28
+
29
+ DataMapper.auto_migrate!
30
+ end
31
+
32
+ before(:each) do
33
+ Membership.all.destroy!
34
+ Person.all.destroy!
35
+ end
36
+
37
+ describe "Person.accepts_nested_attributes_for(:membership)" do
38
+ before(:all) do
39
+ Person.accepts_nested_attributes_for :membership
40
+ end
41
+
42
+ it "should allow to update an existing membership via Person#membership_attributes" do
43
+ person1 = Person.create(:id => 1, :audit_id => 10, :name => 'Martin')
44
+ Membership.create(:id => 100, :audit_id => 1000, :person => person1, :role => 'maintainer')
45
+ person1.reload
46
+
47
+ person2 = Person.create(:id => 2, :audit_id => 20, :name => 'John')
48
+ Membership.create(:id => 200, :audit_id => 2000, :person => person2, :role => 'contributor')
49
+ person2.reload
50
+
51
+ Person.all.size.should == 2
52
+ Membership.all.size.should == 2
53
+
54
+ person1.membership_attributes = { :id => 100, :audit_id => 1000, :role => 'tester' }
55
+ person1.save.should be_true
56
+
57
+ Person.all.map { |p| [p.id, p.audit_id, p.name] }.should == [
58
+ [1, 10, 'Martin'],
59
+ [2, 20, 'John'],
60
+ ]
61
+ Membership.all.map { |m| [m.person_id, m.person_audit_id, m.id, m.audit_id, m.role] }.should == [
62
+ [1, 10, 100, 1000, 'tester'],
63
+ [2, 20, 200, 2000, 'contributor'],
64
+ ]
65
+ end
66
+ end
67
+ end
@@ -0,0 +1,66 @@
1
+ require 'spec_helper'
2
+
3
+ describe "1:1 (PK overlapping FK)" do
4
+ before(:all) do
5
+ class ::Person
6
+ include DataMapper::Resource
7
+ extend ConstraintSupport
8
+
9
+ property :id, Serial, :key => true
10
+ property :audit_id, Integer, :key => true, :min => 0
11
+ property :name, String, :required => true
12
+
13
+ has 1, :membership, constraint(:destroy)
14
+ end
15
+
16
+ class ::Membership
17
+ include DataMapper::Resource
18
+
19
+ # keep properties unordered
20
+ property :rank, Integer, :key => true
21
+ property :person_audit_id, Integer, :min => 0, :unique => :person
22
+ property :person_id, Integer, :key => true, :min => 0, :unique => :person
23
+ property :role, String, :required => true
24
+
25
+ belongs_to :person
26
+ end
27
+
28
+ DataMapper.auto_migrate!
29
+ end
30
+
31
+ before(:each) do
32
+ Membership.all.destroy!
33
+ Person.all.destroy!
34
+ end
35
+
36
+ describe "Person.accepts_nested_attributes_for(:membership)" do
37
+ before(:all) do
38
+ Person.accepts_nested_attributes_for :membership
39
+ end
40
+
41
+ it "should allow to update an existing profile via Person#membership_attributes" do
42
+ person1 = Person.create(:id => 1, :audit_id => 10, :name => 'Martin')
43
+ Membership.create(:person => person1, :rank => 100, :role => 'maintainer')
44
+ person1.reload
45
+
46
+ person2 = Person.create(:id => 2, :audit_id => 20, :name => 'John')
47
+ Membership.create(:person => person2, :rank => 200, :role => 'contributor')
48
+ person2.reload
49
+
50
+ Person.all.size.should == 2
51
+ Membership.all.size.should == 2
52
+
53
+ person1.membership_attributes = { :rank => 100, :role => 'tester' }
54
+ person1.save.should be_true
55
+
56
+ Person.all.map { |p| [p.id, p.audit_id, p.name] }.should == [
57
+ [1, 10, 'Martin'],
58
+ [2, 20, 'John'],
59
+ ]
60
+ Membership.all.map { |m| [m.person_id, m.person_audit_id, m.rank, m.role] }.should == [
61
+ [1, 10, 100, 'tester'],
62
+ [2, 20, 200, 'contributor'],
63
+ ]
64
+ end
65
+ end
66
+ end
@@ -0,0 +1,65 @@
1
+ require 'spec_helper'
2
+
3
+ describe "1:1 (PK subset FK)" do
4
+ before(:all) do
5
+ class ::Person
6
+ include DataMapper::Resource
7
+ extend ConstraintSupport
8
+
9
+ property :id, Serial, :key => true
10
+ property :audit_id, Integer, :key => true, :min => 0
11
+ property :name, String, :required => true
12
+
13
+ has 1, :membership, constraint(:destroy)
14
+ end
15
+
16
+ class ::Membership
17
+ include DataMapper::Resource
18
+
19
+ # keep properties unordered
20
+ property :person_audit_id, Integer, :key => false, :min => 0, :unique => :person
21
+ property :person_id, Integer, :key => true, :min => 0, :unique => :person
22
+ property :role, String, :required => true
23
+
24
+ belongs_to :person
25
+ end
26
+
27
+ DataMapper.auto_migrate!
28
+ end
29
+
30
+ before(:each) do
31
+ Membership.all.destroy!
32
+ Person.all.destroy!
33
+ end
34
+
35
+ describe "Person.accepts_nested_attributes_for(:membership)" do
36
+ before(:all) do
37
+ Person.accepts_nested_attributes_for :membership
38
+ end
39
+
40
+ it "should allow to update an existing membership via Person#membership_attributes" do
41
+ person1 = Person.create(:id => 1, :audit_id => 10, :name => 'Martin')
42
+ Membership.create(:person => person1, :role => 'maintainer')
43
+ person1.reload
44
+
45
+ person2 = Person.create(:id => 2, :audit_id => 20, :name => 'John')
46
+ Membership.create(:person => person2, :role => 'contributor')
47
+ person2.reload
48
+
49
+ Person.all.size.should == 2
50
+ Membership.all.size.should == 2
51
+
52
+ person1.membership_attributes = { :role => 'tester' }
53
+ person1.save.should be_true
54
+
55
+ Person.all.map { |p| [p.id, p.audit_id, p.name] }.should == [
56
+ [1, 10, 'Martin'],
57
+ [2, 20, 'John'],
58
+ ]
59
+ Membership.all.map { |m| [m.person_id, m.person_audit_id, m.role] }.should == [
60
+ [1, 10, 'tester'],
61
+ [2, 20, 'contributor'],
62
+ ]
63
+ end
64
+ end
65
+ end
@@ -0,0 +1,67 @@
1
+ require 'spec_helper'
2
+
3
+ describe "1:M (PK superset FK)" do
4
+ before(:all) do
5
+ class ::Person
6
+ include DataMapper::Resource
7
+ extend ConstraintSupport
8
+
9
+ property :id, Serial, :key => true
10
+ property :audit_id, Integer, :key => true, :min => 0
11
+ property :name, String, :required => true
12
+
13
+ has 1, :membership, constraint(:destroy)
14
+ end
15
+
16
+ class ::Membership
17
+ include DataMapper::Resource
18
+
19
+ # keep properties unordered
20
+ property :project_audit_id, Integer, :key => true, :min => 0
21
+ property :person_audit_id, Integer, :key => true, :min => 0, :unique => :person
22
+ property :person_id, Integer, :key => true, :min => 0, :unique => :person
23
+ property :project_id, Integer, :key => true, :min => 0
24
+ property :role, String, :required => true
25
+
26
+ belongs_to :person
27
+ end
28
+
29
+ DataMapper.auto_migrate!
30
+ end
31
+
32
+ before(:each) do
33
+ Membership.all.destroy!
34
+ Person.all.destroy!
35
+ end
36
+
37
+ describe "Person.accepts_nested_attributes_for(:membership)" do
38
+ before(:all) do
39
+ Person.accepts_nested_attributes_for :membership
40
+ end
41
+
42
+ it "should allow to update an existing membership via Person#membership_attributes" do
43
+ person1 = Person.create(:id => 1, :audit_id => 10, :name => 'Martin')
44
+ Membership.create(:project_id => 100, :project_audit_id => 1000, :person => person1, :role => 'maintainer')
45
+ person1.reload
46
+
47
+ person2 = Person.create(:id => 2, :audit_id => 20, :name => 'John')
48
+ Membership.create(:project_id => 200, :project_audit_id => 2000, :person => person2, :role => 'contributor')
49
+ person2.reload
50
+
51
+ Person.all.size.should == 2
52
+ Membership.all.size.should == 2
53
+
54
+ person1.membership_attributes = { :project_id => 100, :project_audit_id => 1000, :role => 'tester' }
55
+ person1.save.should be_true
56
+
57
+ Person.all.map { |p| [p.id, p.audit_id, p.name] }.should == [
58
+ [1, 10, 'Martin'],
59
+ [2, 20, 'John'],
60
+ ]
61
+ Membership.all.map { |m| [m.person_id, m.person_audit_id, m.project_id, m.project_audit_id, m.role] }.should == [
62
+ [1, 10, 100, 1000, 'tester'],
63
+ [2, 20, 200, 2000, 'contributor'],
64
+ ]
65
+ end
66
+ end
67
+ end
@@ -0,0 +1,71 @@
1
+ require 'spec_helper'
2
+
3
+ describe "1:M (PK disjoint FK)" do
4
+ before(:all) do
5
+ class ::Person
6
+ include DataMapper::Resource
7
+ extend ConstraintSupport
8
+
9
+ property :id, Serial, :key => true
10
+ property :audit_id, Integer, :key => true, :min => 0
11
+ property :name, String, :required => true
12
+
13
+ has n, :memberships, constraint(:destroy)
14
+ end
15
+
16
+ class ::Membership
17
+ include DataMapper::Resource
18
+
19
+ # keep properties unordered
20
+ property :person_audit_id, Integer, :min => 0
21
+ property :audit_id, Integer, :key => true, :min => 0
22
+ property :id, Integer, :key => true, :min => 0
23
+ property :person_id, Integer, :min => 0
24
+ property :role, String, :required => true
25
+
26
+ belongs_to :person
27
+ end
28
+
29
+ DataMapper.auto_migrate!
30
+ end
31
+
32
+ before(:each) do
33
+ Membership.all.destroy!
34
+ Person.all.destroy!
35
+ end
36
+
37
+ describe "Person.accepts_nested_attributes_for(:memberships)" do
38
+ before(:all) do
39
+ Person.accepts_nested_attributes_for :memberships
40
+ end
41
+
42
+ it "should allow to update an existing membership via Person#memberships_attributes" do
43
+ person1 = Person.create(:id => 1, :audit_id => 10, :name => 'Martin')
44
+ Membership.create(:id => 100, :audit_id => 1000, :person => person1, :role => 'maintainer')
45
+ Membership.create(:id => 101, :audit_id => 1001, :person => person1, :role => 'user')
46
+ person1.reload
47
+
48
+ person2 = Person.create(:id => 2, :audit_id => 20, :name => 'John')
49
+ Membership.create(:id => 200, :audit_id => 2000, :person => person2, :role => 'contributor')
50
+ Membership.create(:id => 201, :audit_id => 2001, :person => person2, :role => 'release-manager')
51
+ person2.reload
52
+
53
+ Person.all.size.should == 2
54
+ Membership.all.size.should == 4
55
+
56
+ person1.memberships_attributes = [{ :id => 100, :audit_id => 1000, :role => 'tester' }]
57
+ person1.save.should be_true
58
+
59
+ Person.all.map { |p| [p.id, p.audit_id, p.name] }.should == [
60
+ [1, 10, 'Martin'],
61
+ [2, 20, 'John'],
62
+ ]
63
+ Membership.all.map { |m| [m.person_id, m.person_audit_id, m.id, m.audit_id, m.role] }.should == [
64
+ [1, 10, 100, 1000, 'tester'],
65
+ [1, 10, 101, 1001, 'user'],
66
+ [2, 20, 200, 2000, 'contributor'],
67
+ [2, 20, 201, 2001, 'release-manager'],
68
+ ]
69
+ end
70
+ end
71
+ end
@@ -0,0 +1,70 @@
1
+ require 'spec_helper'
2
+
3
+ describe "1:M (PK overlapping FK)" do
4
+ before(:all) do
5
+ class ::Person
6
+ include DataMapper::Resource
7
+ extend ConstraintSupport
8
+
9
+ property :id, Serial, :key => true
10
+ property :audit_id, Integer, :key => true, :min => 0
11
+ property :name, String, :required => true
12
+
13
+ has n, :memberships, constraint(:destroy)
14
+ end
15
+
16
+ class ::Membership
17
+ include DataMapper::Resource
18
+
19
+ # keep properties unordered
20
+ property :rank, Integer, :key => true
21
+ property :person_audit_id, Integer, :min => 0
22
+ property :person_id, Integer, :key => true, :min => 0
23
+ property :role, String, :required => true
24
+
25
+ belongs_to :person
26
+ end
27
+
28
+ DataMapper.auto_migrate!
29
+ end
30
+
31
+ before(:each) do
32
+ Membership.all.destroy!
33
+ Person.all.destroy!
34
+ end
35
+
36
+ describe "Person.accepts_nested_attributes_for(:memberships)" do
37
+ before(:all) do
38
+ Person.accepts_nested_attributes_for :memberships
39
+ end
40
+
41
+ it "should allow to update an existing profile via Person#memberships_attributes" do
42
+ person1 = Person.create(:id => 1, :audit_id => 10, :name => 'Martin')
43
+ Membership.create(:person => person1, :rank => 100, :role => 'maintainer')
44
+ Membership.create(:person => person1, :rank => 101, :role => 'user')
45
+ person1.reload
46
+
47
+ person2 = Person.create(:id => 2, :audit_id => 20, :name => 'John')
48
+ Membership.create(:person => person2, :rank => 200, :role => 'contributor')
49
+ Membership.create(:person => person2, :rank => 201, :role => 'release-manager')
50
+ person2.reload
51
+
52
+ Person.all.size.should == 2
53
+ Membership.all.size.should == 4
54
+
55
+ person1.memberships_attributes = [{ :rank => 100, :role => 'tester' }]
56
+ person1.save.should be_true
57
+
58
+ Person.all.map { |p| [p.id, p.audit_id, p.name] }.should == [
59
+ [1, 10, 'Martin'],
60
+ [2, 20, 'John'],
61
+ ]
62
+ Membership.all.map { |m| [m.person_id, m.person_audit_id, m.rank, m.role] }.should == [
63
+ [1, 10, 100, 'tester'],
64
+ [1, 10, 101, 'user'],
65
+ [2, 20, 200, 'contributor'],
66
+ [2, 20, 201, 'release-manager'],
67
+ ]
68
+ end
69
+ end
70
+ end
@@ -0,0 +1,65 @@
1
+ require 'spec_helper'
2
+
3
+ describe "1:M (PK subset FK)" do
4
+ before(:all) do
5
+ class ::Person
6
+ include DataMapper::Resource
7
+ extend ConstraintSupport
8
+
9
+ property :id, Serial, :key => true
10
+ property :audit_id, Integer, :key => true, :min => 0
11
+ property :name, String, :required => true
12
+
13
+ has n, :memberships, constraint(:destroy)
14
+ end
15
+
16
+ class ::Membership
17
+ include DataMapper::Resource
18
+
19
+ # keep properties unordered
20
+ property :person_audit_id, Integer, :key => false, :min => 0
21
+ property :person_id, Integer, :key => true, :min => 0
22
+ property :role, String, :required => true
23
+
24
+ belongs_to :person
25
+ end
26
+
27
+ DataMapper.auto_migrate!
28
+ end
29
+
30
+ before(:each) do
31
+ Membership.all.destroy!
32
+ Person.all.destroy!
33
+ end
34
+
35
+ describe "Person.accepts_nested_attributes_for(:memberships)" do
36
+ before(:all) do
37
+ Person.accepts_nested_attributes_for :memberships
38
+ end
39
+
40
+ it "should allow to update an existing membership via Person#memberships_attributes" do
41
+ person1 = Person.create(:id => 1, :audit_id => 10, :name => 'Martin')
42
+ Membership.create(:person => person1, :role => 'maintainer')
43
+ person1.reload
44
+
45
+ person2 = Person.create(:id => 2, :audit_id => 20, :name => 'John')
46
+ Membership.create(:person => person2, :role => 'contributor')
47
+ person2.reload
48
+
49
+ Person.all.size.should == 2
50
+ Membership.all.size.should == 2
51
+
52
+ person1.memberships_attributes = [{ :role => 'tester' }]
53
+ person1.save.should be_true
54
+
55
+ Person.all.map { |p| [p.id, p.audit_id, p.name] }.should == [
56
+ [1, 10, 'Martin'],
57
+ [2, 20, 'John'],
58
+ ]
59
+ Membership.all.map { |m| [m.person_id, m.person_audit_id, m.role] }.should == [
60
+ [1, 10, 'tester'],
61
+ [2, 20, 'contributor'],
62
+ ]
63
+ end
64
+ end
65
+ end