active_mongoid 0.1.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 (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,10 @@
1
+ class League
2
+ include Mongoid::Document
3
+ include ActiveMongoid::Associations
4
+
5
+ field :name
6
+
7
+ has_one_record :division
8
+ has_one_record :division_setting, class_name: "Settings::DivisionSetting"
9
+ has_one_record :address, as: :target
10
+ end
@@ -0,0 +1,9 @@
1
+ class Person
2
+ include Mongoid::Document
3
+ include ActiveMongoid::Associations
4
+
5
+ field :name
6
+
7
+ belongs_to_record :player
8
+ has_many_records :addresses, as: :target
9
+ end
@@ -0,0 +1,9 @@
1
+ class Post
2
+ include Mongoid::Document
3
+ include ActiveMongoid::Associations
4
+
5
+ field :name
6
+
7
+ belongs_to_record :player, foreign_key: :_player_id
8
+ has_one_record :division
9
+ end
@@ -0,0 +1,8 @@
1
+ class Stat
2
+ include Mongoid::Document
3
+ include ActiveMongoid::Associations
4
+
5
+ field :value
6
+
7
+ belongs_to_record :target, polymorphic: true
8
+ end
@@ -0,0 +1,9 @@
1
+ class Team
2
+ include Mongoid::Document
3
+ include ActiveMongoid::Associations
4
+
5
+ field :name
6
+
7
+ has_many_records :players, order: 'name asc'
8
+ belongs_to_record :division
9
+ end
@@ -0,0 +1,411 @@
1
+ require "spec_helper"
2
+
3
+ shared_examples "a has_many relation" do
4
+
5
+ let(:target) { target_class.new }
6
+ let(:target_1) { target_class.new(name: "1") }
7
+ let(:target_2) { target_class.new(name: "2") }
8
+ let(:targets) { [target_1, target_2] }
9
+ let(:new_base) { base_class.new }
10
+ let(:persisted_base) { base_class.create }
11
+ let(:new_relation) { new_base.send(relation_name) }
12
+ let(:persisted_relation) { persisted_base.send(relation_name) }
13
+ let(:metadata) { base_class.am_relations[relation_name.to_s] }
14
+
15
+ describe ".<<" do
16
+
17
+ context "when base is not persisted" do
18
+
19
+ before do
20
+ new_relation << target
21
+ end
22
+
23
+ after do
24
+ new_relation.clear
25
+ end
26
+
27
+ context "when target is empty" do
28
+
29
+ it "initializes with enumerable target" do
30
+ expect(new_relation.size).to eq(1)
31
+ end
32
+
33
+ it "does not persist" do
34
+ new_relation.each do |target|
35
+ expect(target).to_not be_persisted
36
+ end
37
+ end
38
+
39
+ end
40
+
41
+ context "when target is not empty" do
42
+
43
+ let(:new_target) do
44
+ target_class.new
45
+ end
46
+
47
+ before do
48
+ new_relation << new_target
49
+ end
50
+
51
+
52
+ it "append with enumerable target" do
53
+ expect(new_relation.size).to eq(2)
54
+ end
55
+
56
+ it "does not persist" do
57
+ new_relation.each do |target|
58
+ expect(target).to_not be_persisted
59
+ end
60
+ end
61
+
62
+ end
63
+
64
+ end
65
+
66
+ context "when base is persisted" do
67
+
68
+ before do
69
+ persisted_relation << target
70
+ end
71
+
72
+ after do
73
+ persisted_relation.clear
74
+ end
75
+
76
+ context "when target is empty" do
77
+
78
+ it "initializes with enumerable target" do
79
+ expect(persisted_relation.size).to eq(1)
80
+ end
81
+
82
+ it "does persist" do
83
+ persisted_relation.each do |target|
84
+ expect(target).to be_persisted
85
+ end
86
+ end
87
+
88
+ it "binds foreign_key" do
89
+ persisted_relation.each do |target|
90
+ expect(target.send(metadata.foreign_key)).to eq(persisted_base.id)
91
+ end
92
+ end
93
+
94
+ end
95
+
96
+ context "when target is not empty" do
97
+
98
+ let(:new_target) do
99
+ target_class.new
100
+ end
101
+
102
+ before do
103
+ persisted_relation << new_target
104
+ end
105
+
106
+
107
+ it "append with enumerable target" do
108
+ expect(persisted_relation.size).to eq(2)
109
+ end
110
+
111
+ it "does persist" do
112
+ persisted_relation.each do |target|
113
+ expect(target).to be_persisted
114
+ end
115
+ end
116
+
117
+ it "binds foreign_key" do
118
+ persisted_relation.each do |target|
119
+ expect(target.send(metadata.foreign_key)).to eq(persisted_base.id)
120
+ end
121
+ end
122
+
123
+
124
+ end
125
+
126
+ end
127
+
128
+ end
129
+
130
+ describe ".build" do
131
+
132
+ context "when base is not persisted" do
133
+
134
+ before do
135
+ new_relation.build
136
+ end
137
+
138
+ after do
139
+ new_relation.clear
140
+ end
141
+
142
+ context "when target is empty" do
143
+
144
+ it "initializes with enumerable target" do
145
+ expect(new_relation.size).to eq(1)
146
+ end
147
+
148
+ it "does not persist" do
149
+ new_relation.each do |taret|
150
+ expect(target).to_not be_persisted
151
+ end
152
+ end
153
+
154
+ end
155
+
156
+ context "when target is not empty" do
157
+
158
+ before do
159
+ new_relation.build
160
+ end
161
+
162
+ it "append with enumerable target" do
163
+ expect(new_relation.size).to eq(2)
164
+ end
165
+
166
+ it "does not persist" do
167
+ new_relation.each do |target|
168
+ expect(target).to_not be_persisted
169
+ end
170
+ end
171
+
172
+ end
173
+
174
+ end
175
+
176
+ context "when base is persisted" do
177
+
178
+ before do
179
+ persisted_relation.build
180
+ end
181
+
182
+ after do
183
+ persisted_relation.clear
184
+ end
185
+
186
+ context "when target is empty" do
187
+
188
+ it "initializes with enumerable target" do
189
+ expect(persisted_relation.size).to eq(1)
190
+ end
191
+
192
+ it "does not persist" do
193
+ persisted_relation.each do |target|
194
+ expect(target).to_not be_persisted
195
+ end
196
+ end
197
+
198
+ it "binds foreign_key" do
199
+ persisted_relation.each do |target|
200
+ expect(target.send(metadata.foreign_key)).to eq(persisted_base.id)
201
+ end
202
+ end
203
+
204
+ end
205
+
206
+ context "when target is not empty" do
207
+
208
+ before do
209
+ persisted_relation.build
210
+ end
211
+
212
+ it "append with enumerable target" do
213
+ expect(persisted_relation.size).to eq(2)
214
+ end
215
+
216
+ it "does not persist" do
217
+ persisted_relation.each do |target|
218
+ expect(target).to_not be_persisted
219
+ end
220
+ end
221
+
222
+ it "binds foreign_key" do
223
+ persisted_relation.each do |target|
224
+ expect(target.send(metadata.foreign_key)).to eq(persisted_base.id)
225
+ end
226
+ end
227
+
228
+ end
229
+
230
+ end
231
+
232
+ end
233
+
234
+ [ :create, :create! ].each do |method|
235
+
236
+ describe ".#{method}" do
237
+
238
+ context "when base is persisted" do
239
+
240
+ before do
241
+ persisted_relation.send(method)
242
+ end
243
+
244
+ after do
245
+ persisted_relation.clear
246
+ end
247
+
248
+ context "when target is empty" do
249
+
250
+ it "initializes with enumerable target" do
251
+ expect(persisted_relation.size).to eq(1)
252
+ end
253
+
254
+ it "does not persist" do
255
+ persisted_relation.each do |target|
256
+ expect(target).to be_persisted
257
+ end
258
+ end
259
+
260
+ end
261
+
262
+ context "when target is not empty" do
263
+
264
+ context "when sending single" do
265
+
266
+ before do
267
+ persisted_relation.send(method)
268
+ end
269
+
270
+ it "append with enumerable target" do
271
+ expect(persisted_relation.size).to eq(2)
272
+ end
273
+
274
+ it "does not persist" do
275
+ persisted_relation.each do |target|
276
+ expect(target).to be_persisted
277
+ end
278
+ end
279
+
280
+ end
281
+
282
+ context "when sending multiple" do
283
+
284
+ before do
285
+ persisted_relation.send(method, [{name: 1}, {name: 2}])
286
+ end
287
+
288
+ it "append with enumerable target" do
289
+ expect(persisted_relation.size).to eq(3)
290
+ end
291
+
292
+ it "does not persist" do
293
+ persisted_relation.each do |target|
294
+ expect(target).to be_persisted
295
+ end
296
+ end
297
+ end
298
+
299
+ end
300
+
301
+ end
302
+
303
+ end
304
+
305
+ end
306
+
307
+ context ".delete" do
308
+
309
+ before do
310
+ persisted_relation << targets
311
+ end
312
+
313
+ it "deletes the specified target" do
314
+ expect(target_1.id).to_not be_nil
315
+ expect(persisted_relation.delete(target_1)).to eq(target_1)
316
+ expect(target_1.send(metadata.foreign_key)).to be_nil
317
+ expect(persisted_relation.first.id).to eq(target_2.id)
318
+ end
319
+
320
+ it "deletes all targets" do
321
+ id = persisted_base.id
322
+ id = id.is_a?(::ActiveMongoid::BSON::ObjectId) ? id.to_s : id
323
+ expect(target_class).to receive(:delete_all).once
324
+ persisted_relation.delete_all
325
+ end
326
+
327
+ it "destroys all targets" do
328
+ id = persisted_base.id
329
+ id = id.is_a?(::ActiveMongoid::BSON::ObjectId) ? id.to_s : id
330
+ expect(target_class).to receive(:destroy_all).once.with({metadata.foreign_key.to_s => id})
331
+ persisted_relation.destroy_all
332
+ end
333
+
334
+ end
335
+
336
+ context ".remove_not_in" do
337
+
338
+ before do
339
+ persisted_relation << targets
340
+ end
341
+
342
+ it "removes all except for the specified target" do
343
+ persisted_relation.send(:remove_not_in, [target_1.id])
344
+ expect(persisted_relation).to eq([target_1])
345
+ end
346
+
347
+ end
348
+
349
+ context ".find" do
350
+
351
+ before do
352
+ persisted_relation << targets
353
+ end
354
+
355
+ after do
356
+ persisted_relation.clear
357
+ end
358
+
359
+ it "finds the specified target" do
360
+ target = persisted_relation.find(target_1.id)
361
+ expect(target).to eq(target_1)
362
+ end
363
+
364
+ context "when find_or" do
365
+
366
+ context "when initialize_by" do
367
+
368
+ let(:new_name) do
369
+ "foo"
370
+ end
371
+
372
+ it "returns item when found" do
373
+ target = persisted_relation.find_or_initialize_by({name: "1"})
374
+ expect(target).to eq(target_1)
375
+ expect(target).to be_persisted
376
+ end
377
+
378
+ it "initializes item when not found" do
379
+ target = persisted_relation.find_or_initialize_by({name: new_name})
380
+ expect(target.name).to eq(new_name)
381
+ expect(target).to_not be_persisted
382
+ end
383
+
384
+ end
385
+
386
+ context "when create_by" do
387
+
388
+ let(:new_name) do
389
+ "foo"
390
+ end
391
+
392
+ it "returns item when found" do
393
+ target = persisted_relation.find_or_create_by({name: "1"})
394
+ expect(target).to eq(target_1)
395
+ expect(target).to be_persisted
396
+ end
397
+
398
+ it "initializes item when not found" do
399
+ target = persisted_relation.find_or_create_by({name: new_name})
400
+ expect(target.name).to eq(new_name)
401
+ expect(target).to be_persisted
402
+ end
403
+
404
+ end
405
+
406
+ end
407
+
408
+ end
409
+
410
+
411
+ end