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,39 @@
1
+ require "spec_helper"
2
+
3
+ describe ActiveMongoid::Associations::DocumentRelation::Bindings::In do
4
+
5
+ let(:division) do
6
+ Division.new
7
+ end
8
+
9
+ let(:league) do
10
+ League.new
11
+ end
12
+
13
+ let(:division_metadata) do
14
+ Division.am_relations["league"]
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(division, league, division_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(league.division).to eq(division)
33
+ end
34
+
35
+ end
36
+
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,36 @@
1
+ require "spec_helper"
2
+
3
+
4
+ describe ActiveMongoid::Associations::DocumentRelation::Bindings::Many do
5
+
6
+ let(:division){ Division.new }
7
+
8
+ let(:team){ Team.new }
9
+
10
+ let(:division_metadata) do
11
+ Division.am_relations["teams"]
12
+ end
13
+
14
+ describe "#bind_one" do
15
+
16
+ context "when the child of a references many" do
17
+
18
+ let(:binder) do
19
+ described_class.new(division, team, division_metadata)
20
+ end
21
+
22
+ context "when the document is bindable with default" do
23
+
24
+ before do
25
+ binder.bind_one(team)
26
+ end
27
+
28
+ it "sets the inverse relation" do
29
+ expect(team.division).to eq(division)
30
+ end
31
+
32
+ end
33
+
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,39 @@
1
+ require "spec_helper"
2
+
3
+ describe ActiveMongoid::Associations::DocumentRelation::Bindings::One do
4
+
5
+ let(:player) do
6
+ Player.new
7
+ end
8
+
9
+ let(:person) do
10
+ Person.new
11
+ end
12
+
13
+ let(:player_metadata) do
14
+ Player.am_relations["person"]
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(player, person, player_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(person.player).to eq(player)
33
+ end
34
+
35
+ end
36
+
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,117 @@
1
+ require 'spec_helper'
2
+
3
+ describe ActiveMongoid::Associations::DocumentRelation::Builders do
4
+
5
+ describe "#build_#\{name}" do
6
+
7
+ context "when the relation is a has_one" do
8
+
9
+ let(:player) do
10
+ Player.new
11
+ end
12
+
13
+ let!(:person) do
14
+ player.build_person
15
+ end
16
+
17
+ it "builds the document" do
18
+ expect(player.person).to eq(person)
19
+ end
20
+
21
+ it "sets the inverse" do
22
+ expect(person.player).to eq(player)
23
+ end
24
+
25
+ it "does not save the document" do
26
+ expect(person).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(:division) do
36
+ Division.new
37
+ end
38
+
39
+ let!(:league) do
40
+ division.build_league
41
+ end
42
+
43
+ it "builds the document" do
44
+ expect(division.league).to eq(league)
45
+ end
46
+
47
+ it "sets the inverse" do
48
+ expect(league.division).to eq(division)
49
+ end
50
+
51
+ it "does not save the document" do
52
+ expect(league).to_not be_persisted
53
+ end
54
+ end
55
+ end
56
+
57
+
58
+ end
59
+
60
+ describe "#create_#\{name}" do
61
+
62
+ context "when the relation is a has_one" do
63
+
64
+ let(:player) do
65
+ Player.create
66
+ end
67
+
68
+ let!(:person) do
69
+ player.create_person
70
+ end
71
+
72
+ it "builds the document" do
73
+ expect(player.person).to eq(person)
74
+ end
75
+
76
+ it "sets the inverse" do
77
+ expect(person.player).to eq(player)
78
+ end
79
+
80
+ it "does save the document" do
81
+ expect(person).to be_persisted
82
+ end
83
+
84
+ end
85
+
86
+ context "when the relation is a belongs to" do
87
+
88
+ context "when the inverse is a has one" do
89
+
90
+ let(:division) do
91
+ Division.create
92
+ end
93
+
94
+ let!(:league) do
95
+ division.create_league
96
+ end
97
+
98
+ it "builds the document" do
99
+ expect(division.league).to eq(league)
100
+ end
101
+
102
+ it "sets the inverse" do
103
+ expect(league.division).to eq(division)
104
+ end
105
+
106
+ it "does save the document" do
107
+ expect(league).to be_persisted
108
+ end
109
+
110
+ end
111
+
112
+ end
113
+
114
+
115
+ end
116
+
117
+ end
@@ -0,0 +1,87 @@
1
+ require "spec_helper"
2
+
3
+ describe ActiveMongoid::Associations::DocumentRelation::Dependent do
4
+
5
+ describe ".dependent_documents" do
6
+
7
+ context "relation is a has_one" do
8
+
9
+ let(:base_class) { Player }
10
+ let(:target_class) { Person }
11
+ let(:relation_name) { :person }
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_documents(metadata.merge!(dependent: :destroy))
18
+ persisted_base.person = 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(Mongoid::Errors::DocumentNotFound)
29
+ end
30
+
31
+ end
32
+
33
+ context "relation is a belongs_to" do
34
+
35
+ let(:base_class) { Division }
36
+ let(:target_class) { League }
37
+ let(:relation_name) { :league }
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_documents(metadata.merge!(dependent: :destroy))
44
+ new_base.league = 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(Mongoid::Errors::DocumentNotFound)
55
+ end
56
+
57
+ end
58
+
59
+ context "relation is a has_many" do
60
+
61
+ let(:base_class) { Division }
62
+ let(:target_class) { Team }
63
+ let(:relation_name) { :teams }
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_documents(metadata.merge!(dependent: :destroy))
70
+ persisted_base.teams << 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(Mongoid::Errors::DocumentNotFound)
81
+ end
82
+
83
+ end
84
+
85
+ end
86
+
87
+ end
@@ -0,0 +1,68 @@
1
+ require "spec_helper"
2
+
3
+ describe ActiveMongoid::Associations::DocumentRelation::Macros do
4
+
5
+ ActiveRecord::Schema.define do
6
+ create_table :active_record_test_classes, :force => true do |t|
7
+ t.string :_id
8
+ end
9
+ end
10
+
11
+ class ActiveRecordTestClass < ActiveRecord::Base
12
+ include ActiveMongoid::Associations
13
+ end
14
+
15
+ let(:klass) do
16
+ ActiveRecordTestClass
17
+ end
18
+
19
+ before do
20
+ klass.am_relations.clear
21
+ end
22
+
23
+ describe "has_one_document" do
24
+
25
+ it "defines the macro" do
26
+ expect(klass).to respond_to(:has_one_document)
27
+ end
28
+
29
+ context "when defining the relation" do
30
+
31
+ before do
32
+ klass.has_one_document :person
33
+ end
34
+
35
+ let(:object) do
36
+ klass.new
37
+ end
38
+
39
+ it "adds the metadata to the klass" do
40
+ expect(klass.am_relations['person']).to_not be_nil
41
+ end
42
+
43
+ it "defines the getter" do
44
+ expect(object).to respond_to(:person)
45
+ end
46
+
47
+ it "defines the setter" do
48
+ expect(object).to respond_to(:person=)
49
+ end
50
+
51
+ it "defines the builder" do
52
+ expect(object).to respond_to(:build_person)
53
+ end
54
+
55
+ it "defines the creator" do
56
+ expect(object).to respond_to(:create_person)
57
+ end
58
+
59
+ it "creates the correct relation" do
60
+ expect(klass.am_relations["person"].relation).to eq(
61
+ ActiveMongoid::Associations::DocumentRelation::Referenced::One
62
+ )
63
+ end
64
+
65
+ end
66
+ end
67
+
68
+ end
@@ -0,0 +1,27 @@
1
+ require "spec_helper"
2
+
3
+ describe ActiveMongoid::Associations::DocumentRelation::Referenced::In do
4
+ describe ".criteria" do
5
+ context "" do
6
+
7
+ let(:id) do
8
+ 1
9
+ end
10
+
11
+ let(:metadata) do
12
+ Division.am_relations["league"]
13
+ end
14
+
15
+ let(:criteria) do
16
+ described_class.criteria(metadata, id, League)
17
+ end
18
+
19
+ it "does not include the type in the criteria" do
20
+ expect(criteria.selector).to eq({"_id" => id})
21
+ expect(criteria.klass).to eq(League)
22
+ end
23
+ end
24
+ end
25
+
26
+
27
+ end
@@ -0,0 +1,32 @@
1
+ require "spec_helper"
2
+
3
+ describe ActiveMongoid::Associations::DocumentRelation::Referenced::Many do
4
+
5
+ describe ".criteria" do
6
+
7
+ let(:id) do
8
+ 1
9
+ end
10
+
11
+ let(:metadata) do
12
+ Division.am_relations["teams"]
13
+ end
14
+
15
+ let(:criteria) do
16
+ described_class.criteria(metadata, id, Team)
17
+ end
18
+
19
+ it "does not include the type in the criteria" do
20
+ expect(criteria.selector).to eq({"division_id" => id})
21
+ expect(criteria.klass).to eq(Team)
22
+ end
23
+
24
+ end
25
+
26
+ it_behaves_like "a has_many relation" do
27
+ let(:base_class) { Division }
28
+ let(:target_class) { Team }
29
+ let(:relation_name) { :teams }
30
+ end
31
+
32
+ end