active_mongoid 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (94) hide show
  1. checksums.yaml +7 -0
  2. data/.DS_Store +0 -0
  3. data/.coveralls.yml +1 -0
  4. data/.gitignore +22 -0
  5. data/.ruby_gemset +1 -0
  6. data/.ruby_version +1 -0
  7. data/.travis.yml +11 -0
  8. data/Appraisals +7 -0
  9. data/Gemfile +4 -0
  10. data/LICENSE.txt +22 -0
  11. data/README.md +198 -0
  12. data/Rakefile +7 -0
  13. data/active_mongoid.gemspec +36 -0
  14. data/gemfiles/mongoid_2.8.gemfile +7 -0
  15. data/gemfiles/mongoid_2.8.gemfile.lock +105 -0
  16. data/gemfiles/mongoid_3.1.gemfile +7 -0
  17. data/gemfiles/mongoid_3.1.gemfile.lock +108 -0
  18. data/lib/active_mongoid.rb +8 -0
  19. data/lib/active_mongoid/associations.rb +82 -0
  20. data/lib/active_mongoid/associations/binding.rb +77 -0
  21. data/lib/active_mongoid/associations/builder.rb +26 -0
  22. data/lib/active_mongoid/associations/builders/in.rb +17 -0
  23. data/lib/active_mongoid/associations/builders/many.rb +15 -0
  24. data/lib/active_mongoid/associations/builders/one.rb +15 -0
  25. data/lib/active_mongoid/associations/document_relation/accessors.rb +100 -0
  26. data/lib/active_mongoid/associations/document_relation/associations.rb +33 -0
  27. data/lib/active_mongoid/associations/document_relation/auto_save.rb +31 -0
  28. data/lib/active_mongoid/associations/document_relation/bindings/in.rb +48 -0
  29. data/lib/active_mongoid/associations/document_relation/bindings/many.rb +19 -0
  30. data/lib/active_mongoid/associations/document_relation/bindings/one.rb +19 -0
  31. data/lib/active_mongoid/associations/document_relation/builders.rb +31 -0
  32. data/lib/active_mongoid/associations/document_relation/dependent.rb +26 -0
  33. data/lib/active_mongoid/associations/document_relation/macros.rb +51 -0
  34. data/lib/active_mongoid/associations/document_relation/referenced/in.rb +72 -0
  35. data/lib/active_mongoid/associations/document_relation/referenced/many.rb +125 -0
  36. data/lib/active_mongoid/associations/document_relation/referenced/one.rb +75 -0
  37. data/lib/active_mongoid/associations/many.rb +211 -0
  38. data/lib/active_mongoid/associations/metadata.rb +229 -0
  39. data/lib/active_mongoid/associations/one.rb +21 -0
  40. data/lib/active_mongoid/associations/proxy.rb +38 -0
  41. data/lib/active_mongoid/associations/record_relation/accessors.rb +80 -0
  42. data/lib/active_mongoid/associations/record_relation/associations.rb +33 -0
  43. data/lib/active_mongoid/associations/record_relation/auto_save.rb +43 -0
  44. data/lib/active_mongoid/associations/record_relation/bindings/in.rb +48 -0
  45. data/lib/active_mongoid/associations/record_relation/bindings/many.rb +19 -0
  46. data/lib/active_mongoid/associations/record_relation/bindings/one.rb +19 -0
  47. data/lib/active_mongoid/associations/record_relation/builders.rb +31 -0
  48. data/lib/active_mongoid/associations/record_relation/dependent.rb +26 -0
  49. data/lib/active_mongoid/associations/record_relation/macros.rb +65 -0
  50. data/lib/active_mongoid/associations/record_relation/referenced/in.rb +72 -0
  51. data/lib/active_mongoid/associations/record_relation/referenced/many.rb +128 -0
  52. data/lib/active_mongoid/associations/record_relation/referenced/one.rb +75 -0
  53. data/lib/active_mongoid/associations/targets/enumerable.rb +161 -0
  54. data/lib/active_mongoid/bson_id.rb +44 -0
  55. data/lib/active_mongoid/finder_proxy.rb +55 -0
  56. data/lib/active_mongoid/finders.rb +60 -0
  57. data/lib/active_mongoid/version.rb +3 -0
  58. data/spec/lib/associations/document_relation/accessors_spec.rb +330 -0
  59. data/spec/lib/associations/document_relation/auto_save_spec.rb +157 -0
  60. data/spec/lib/associations/document_relation/bindings/in_spec.rb +39 -0
  61. data/spec/lib/associations/document_relation/bindings/many_spec.rb +36 -0
  62. data/spec/lib/associations/document_relation/bindings/one_spec.rb +39 -0
  63. data/spec/lib/associations/document_relation/builders_spec.rb +117 -0
  64. data/spec/lib/associations/document_relation/dependent_spec.rb +87 -0
  65. data/spec/lib/associations/document_relation/macros_spec.rb +68 -0
  66. data/spec/lib/associations/document_relation/referenced/in_spec.rb +27 -0
  67. data/spec/lib/associations/document_relation/referenced/many_spec.rb +32 -0
  68. data/spec/lib/associations/document_relation/referenced/one_spec.rb +28 -0
  69. data/spec/lib/associations/metadata_spec.rb +157 -0
  70. data/spec/lib/associations/record_relation/accessors_spec.rb +328 -0
  71. data/spec/lib/associations/record_relation/auto_save_spec.rb +157 -0
  72. data/spec/lib/associations/record_relation/bindings/in_spec.rb +39 -0
  73. data/spec/lib/associations/record_relation/bindings/many_spec.rb +39 -0
  74. data/spec/lib/associations/record_relation/bindings/one_spec.rb +57 -0
  75. data/spec/lib/associations/record_relation/builders_spec.rb +118 -0
  76. data/spec/lib/associations/record_relation/dependent_spec.rb +87 -0
  77. data/spec/lib/associations/record_relation/macros_spec.rb +73 -0
  78. data/spec/lib/associations/record_relation/referenced/in_spec.rb +27 -0
  79. data/spec/lib/associations/record_relation/referenced/many_spec.rb +32 -0
  80. data/spec/lib/associations/record_relation/referenced/one_spec.rb +27 -0
  81. data/spec/lib/bson_id_spec.rb +48 -0
  82. data/spec/lib/finders_spec.rb +105 -0
  83. data/spec/spec_helper.rb +89 -0
  84. data/spec/support/models/active_record/address.rb +6 -0
  85. data/spec/support/models/active_record/division.rb +16 -0
  86. data/spec/support/models/active_record/division_setting.rb +9 -0
  87. data/spec/support/models/active_record/player.rb +12 -0
  88. data/spec/support/models/mongoid/league.rb +10 -0
  89. data/spec/support/models/mongoid/person.rb +9 -0
  90. data/spec/support/models/mongoid/post.rb +9 -0
  91. data/spec/support/models/mongoid/stat.rb +8 -0
  92. data/spec/support/models/mongoid/team.rb +9 -0
  93. data/spec/support/shared_examples/shared_many_spec.rb +411 -0
  94. metadata +370 -0
@@ -0,0 +1,157 @@
1
+ require "spec_helper"
2
+
3
+ describe ActiveMongoid::Associations::RecordRelation::AutoSave do
4
+
5
+ describe ".autosave_documents" do
6
+
7
+ describe "when relation is has_one" do
8
+
9
+ before(:all) do
10
+ League.autosave_records(League.am_relations["division"].merge!(autosave: true))
11
+ end
12
+
13
+ after(:all) do
14
+ League.reset_callbacks(:save)
15
+ end
16
+
17
+ let(:league) do
18
+ League.new
19
+ end
20
+
21
+ context "when the option is provided" do
22
+
23
+ let(:division) do
24
+ Division.new(name: "Foo")
25
+ end
26
+
27
+ before do
28
+ league.division = division
29
+ end
30
+
31
+ context "when saving the parent document" do
32
+
33
+ before do
34
+ league.save
35
+ end
36
+
37
+ it "does save self" do
38
+ expect(league).to be_persisted
39
+ end
40
+
41
+ it "does save the relation" do
42
+ expect(division).to be_persisted
43
+ end
44
+
45
+ it "does save the relation id" do
46
+ expect(league.id).to_not be_nil
47
+ expect(division.league_id).to eq(league.id)
48
+ end
49
+
50
+ end
51
+
52
+ end
53
+
54
+ end
55
+
56
+ describe "when relation is a belongs_to" do
57
+
58
+ before(:all) do
59
+ Person.autosave_records(Person.am_relations["player"].merge!(autosave: true))
60
+ end
61
+
62
+ after(:all) do
63
+ Person.reset_callbacks(:save)
64
+ end
65
+
66
+ let(:person) do
67
+ Person.new
68
+ end
69
+
70
+ context "when the option is provided" do
71
+
72
+ let(:player) do
73
+ Player.new(name: "Foo")
74
+ end
75
+
76
+ before do
77
+ person.player = player
78
+ end
79
+
80
+ context "when saving the parent document" do
81
+
82
+ before do
83
+ person.save
84
+ end
85
+
86
+ it "does save self" do
87
+ expect(person).to be_persisted
88
+ end
89
+
90
+ it "does save the relation" do
91
+ expect(player).to be_persisted
92
+ end
93
+
94
+ xit "does save the relation id" do
95
+ expect(player.id).to_not be_nil
96
+ expect(person.player_id).to eq(player.id)
97
+ end
98
+
99
+ end
100
+
101
+ end
102
+
103
+ end
104
+
105
+ describe "when relation is a has_many" do
106
+
107
+ before(:all) do
108
+ Team.autosave_records(Team.am_relations["players"].merge!(autosave: true))
109
+ end
110
+
111
+ after(:all) do
112
+ Team.reset_callbacks(:save)
113
+ end
114
+
115
+ let(:team) do
116
+ Team.new(name: "Foo")
117
+ end
118
+
119
+ let(:player) do
120
+ Player.new(name: "Foo")
121
+ end
122
+
123
+ context "when the option is provided" do
124
+
125
+ before do
126
+ team.players << player
127
+ end
128
+
129
+ context "when saving the parent document" do
130
+
131
+ before do
132
+ team.save
133
+ end
134
+
135
+ it "does save self" do
136
+ expect(team).to be_persisted
137
+ end
138
+
139
+ it "does save the relation" do
140
+ expect(player).to be_persisted
141
+ end
142
+
143
+ it "does save the relation id" do
144
+ expect(team.id).to_not be_nil
145
+ expect(player.team_id).to eq(team.id)
146
+ end
147
+
148
+ end
149
+
150
+ end
151
+
152
+ end
153
+
154
+ end
155
+
156
+ end
157
+
@@ -0,0 +1,39 @@
1
+ require "spec_helper"
2
+
3
+ describe ActiveMongoid::Associations::RecordRelation::Bindings::In do
4
+
5
+ let(:person) do
6
+ Person.new
7
+ end
8
+
9
+ let(:player) do
10
+ Player.new
11
+ end
12
+
13
+ let(:person_metadata) do
14
+ Person.am_relations["player"]
15
+ end
16
+
17
+ describe "#bind_one" do
18
+
19
+ context "when the child of a references one" do
20
+
21
+ let(:binder) do
22
+ described_class.new(person, player, person_metadata)
23
+ end
24
+
25
+ context "when the document is bindable with default" do
26
+
27
+ before do
28
+ binder.bind_one
29
+ end
30
+
31
+ it "sets the inverse relation" do
32
+ expect(player.person).to eq(person)
33
+ end
34
+
35
+ end
36
+
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,39 @@
1
+ require "spec_helper"
2
+
3
+ describe ActiveMongoid::Associations::DocumentRelation::Bindings::Many do
4
+
5
+ let(:team) do
6
+ Team.new
7
+ end
8
+
9
+ let(:player) do
10
+ Player.new
11
+ end
12
+
13
+ let(:team_metadata) do
14
+ Team.am_relations["players"]
15
+ end
16
+
17
+ describe "#bind_one" do
18
+
19
+ context "when the child of a references many" do
20
+
21
+ let(:binder) do
22
+ described_class.new(team, player, team_metadata)
23
+ end
24
+
25
+ context "when the document is bindable with default" do
26
+
27
+ before do
28
+ binder.bind_one(player)
29
+ end
30
+
31
+ it "sets the inverse relation" do
32
+ expect(player.team).to eq(team)
33
+ end
34
+
35
+ end
36
+
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,57 @@
1
+ require "spec_helper"
2
+
3
+ describe ActiveMongoid::Associations::RecordRelation::Bindings::One do
4
+
5
+ let(:league){ League.new }
6
+
7
+ let(:division){ Division.new }
8
+
9
+ let(:division_setting){ Settings::DivisionSetting.new }
10
+
11
+ let(:league_metadata){ League.am_relations["division"] }
12
+
13
+ describe "#bind_one" do
14
+
15
+ context "when the child of a references belongs_to" do
16
+
17
+ let(:binder) do
18
+ described_class.new(league, division, league_metadata)
19
+ end
20
+
21
+ context "when the document is bindable with default" do
22
+
23
+ before do
24
+ binder.bind_one
25
+ end
26
+
27
+ it "sets the inverse relation" do
28
+ expect(division.league).to eq(league)
29
+ end
30
+
31
+ end
32
+
33
+ end
34
+
35
+ context "when the child of a references belongs_to with class_name" do
36
+
37
+ let(:binder) do
38
+ described_class.new(league, division_setting, league_metadata)
39
+ end
40
+
41
+ context "when the document is bindable with default" do
42
+
43
+ before do
44
+ binder.bind_one
45
+ end
46
+
47
+ it "sets the inverse relation" do
48
+ expect(division_setting.league).to eq(league)
49
+ end
50
+
51
+ end
52
+
53
+ end
54
+
55
+ end
56
+
57
+ end
@@ -0,0 +1,118 @@
1
+ require 'spec_helper'
2
+
3
+ describe ActiveMongoid::Associations::RecordRelation::Builders do
4
+
5
+ describe "#build_#\{name}" do
6
+
7
+ context "when the relation is a has_one" do
8
+
9
+ let(:league) do
10
+ League.new
11
+ end
12
+
13
+ let!(:division) do
14
+ league.build_division
15
+ end
16
+
17
+ it "builds the document" do
18
+ expect(league.division).to eq(division)
19
+ end
20
+
21
+ it "sets the inverse" do
22
+ expect(division.league).to eq(league)
23
+ end
24
+
25
+ it "does not save the document" do
26
+ expect(division).to_not be_persisted
27
+ end
28
+
29
+ end
30
+
31
+ context "when the relation is a belongs to" do
32
+
33
+ context "when the inverse is a has one" do
34
+
35
+ let(:person) do
36
+ Person.new
37
+ end
38
+
39
+ let!(:player) do
40
+ person.build_player
41
+ end
42
+
43
+ it "builds the record" do
44
+ expect(person.player).to eq(player)
45
+ end
46
+
47
+ it "sets the inverse" do
48
+ expect(player.person).to eq(person)
49
+ end
50
+
51
+ it "does not save the document" do
52
+ expect(person).to_not be_persisted
53
+ end
54
+ end
55
+ end
56
+
57
+
58
+ end
59
+
60
+
61
+ describe "#create_#\{name}" do
62
+
63
+ context "when the relation is a has_one" do
64
+
65
+ let(:league) do
66
+ League.create
67
+ end
68
+
69
+ let!(:division) do
70
+ league.create_division
71
+ end
72
+
73
+ it "create the record" do
74
+ expect(league.division).to eq(division)
75
+ end
76
+
77
+ it "sets the inverse" do
78
+ expect(division.league).to eq(league)
79
+ end
80
+
81
+ it "does save the record" do
82
+ expect(division).to be_persisted
83
+ end
84
+
85
+ end
86
+
87
+ context "when the relation is a belongs to" do
88
+
89
+ context "when the inverse is a has one" do
90
+
91
+ let(:person) do
92
+ Person.create
93
+ end
94
+
95
+ let!(:player) do
96
+ person.create_player
97
+ end
98
+
99
+ it "creates the record" do
100
+ expect(person.player).to eq(player)
101
+ end
102
+
103
+ it "sets the inverse" do
104
+ expect(player.person).to eq(person)
105
+ end
106
+
107
+ it "does save the record" do
108
+ expect(player).to be_persisted
109
+ end
110
+
111
+ end
112
+
113
+ end
114
+
115
+ end
116
+
117
+
118
+ end
@@ -0,0 +1,87 @@
1
+ require "spec_helper"
2
+
3
+ describe ActiveMongoid::Associations::RecordRelation::Dependent do
4
+
5
+ describe ".dependent_records" do
6
+
7
+ context "relation is a has_one" do
8
+
9
+ let(:base_class) { League }
10
+ let(:target_class) { Division }
11
+ let(:relation_name) { :division }
12
+ let(:persisted_base) { base_class.create }
13
+ let(:new_target) { target_class.new }
14
+ let(:metadata) { base_class.am_relations[relation_name.to_s] }
15
+
16
+ before do
17
+ base_class.dependent_records(metadata.merge!(dependent: :destroy))
18
+ persisted_base.division = new_target
19
+ new_target.save!
20
+ end
21
+
22
+ after do
23
+ base_class.reset_callbacks(:destroy)
24
+ end
25
+
26
+ it "destroys dependent" do
27
+ persisted_base.destroy
28
+ expect { new_target.reload }.to raise_error(ActiveRecord::RecordNotFound)
29
+ end
30
+
31
+ end
32
+
33
+ context "relation is a belongs_to" do
34
+
35
+ let(:base_class) { Person }
36
+ let(:target_class) { Player }
37
+ let(:relation_name) { :player }
38
+ let(:new_base) { base_class.new }
39
+ let(:persisted_target) { target_class.create }
40
+ let(:metadata) { base_class.am_relations[relation_name.to_s] }
41
+
42
+ before do
43
+ base_class.dependent_records(metadata.merge!(dependent: :destroy))
44
+ new_base.player = persisted_target
45
+ new_base.save!
46
+ end
47
+
48
+ after do
49
+ base_class.reset_callbacks(:destroy)
50
+ end
51
+
52
+ it "destroys dependent" do
53
+ new_base.destroy
54
+ expect { persisted_target.reload }.to raise_error(ActiveRecord::RecordNotFound)
55
+ end
56
+
57
+ end
58
+
59
+ context "relation is a has_many" do
60
+
61
+ let(:base_class) { Team }
62
+ let(:target_class) { Player }
63
+ let(:relation_name) { :players }
64
+ let(:persisted_base) { base_class.create }
65
+ let(:new_target) { target_class.new }
66
+ let(:metadata) { base_class.am_relations[relation_name.to_s] }
67
+
68
+ before do
69
+ base_class.dependent_records(metadata.merge!(dependent: :destroy))
70
+ persisted_base.players << new_target
71
+ new_target.save!
72
+ end
73
+
74
+ after do
75
+ base_class.reset_callbacks(:destroy)
76
+ end
77
+
78
+ it "destroys dependents" do
79
+ persisted_base.destroy
80
+ expect { new_target.reload }.to raise_error(ActiveRecord::RecordNotFound)
81
+ end
82
+
83
+ end
84
+
85
+ end
86
+
87
+ end