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,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