mongoid 4.0.2 → 5.0.0.beta

Sign up to get free protection for your applications and to get access to all the features.
Files changed (177) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +66 -1
  3. data/README.md +14 -13
  4. data/lib/config/locales/en.yml +28 -28
  5. data/lib/mongoid.rb +28 -21
  6. data/lib/mongoid/atomic.rb +2 -4
  7. data/lib/mongoid/attributes.rb +7 -7
  8. data/lib/mongoid/attributes/processing.rb +4 -1
  9. data/lib/mongoid/attributes/readonly.rb +2 -2
  10. data/lib/mongoid/changeable.rb +4 -6
  11. data/lib/mongoid/clients.rb +142 -0
  12. data/lib/mongoid/clients/factory.rb +78 -0
  13. data/lib/mongoid/{sessions → clients}/options.rb +30 -19
  14. data/lib/mongoid/{sessions → clients}/storage_options.rb +27 -13
  15. data/lib/mongoid/{sessions → clients}/thread_options.rb +6 -3
  16. data/lib/mongoid/clients/validators.rb +2 -0
  17. data/lib/mongoid/{sessions → clients}/validators/storage.rb +5 -2
  18. data/lib/mongoid/composable.rb +3 -3
  19. data/lib/mongoid/config.rb +39 -41
  20. data/lib/mongoid/config/environment.rb +1 -1
  21. data/lib/mongoid/config/validators.rb +1 -1
  22. data/lib/mongoid/config/validators/{session.rb → client.rb} +31 -28
  23. data/lib/mongoid/contextual/aggregable/mongo.rb +1 -1
  24. data/lib/mongoid/contextual/atomic.rb +11 -11
  25. data/lib/mongoid/contextual/command.rb +9 -6
  26. data/lib/mongoid/contextual/geo_near.rb +17 -1
  27. data/lib/mongoid/contextual/map_reduce.rb +12 -11
  28. data/lib/mongoid/contextual/memory.rb +2 -5
  29. data/lib/mongoid/contextual/mongo.rb +92 -82
  30. data/lib/mongoid/contextual/none.rb +13 -0
  31. data/lib/mongoid/copyable.rb +6 -1
  32. data/lib/mongoid/criteria.rb +36 -3
  33. data/lib/mongoid/document.rb +3 -4
  34. data/lib/mongoid/errors.rb +6 -6
  35. data/lib/mongoid/errors/{mixed_session_configuration.rb → mixed_client_configuration.rb} +5 -5
  36. data/lib/mongoid/errors/no_client_config.rb +22 -0
  37. data/lib/mongoid/errors/{no_session_database.rb → no_client_database.rb} +4 -4
  38. data/lib/mongoid/errors/{no_session_hosts.rb → no_client_hosts.rb} +4 -4
  39. data/lib/mongoid/errors/{no_sessions_config.rb → no_clients_config.rb} +4 -4
  40. data/lib/mongoid/errors/no_default_client.rb +23 -0
  41. data/lib/mongoid/extensions/hash.rb +5 -1
  42. data/lib/mongoid/extensions/object.rb +3 -2
  43. data/lib/mongoid/extensions/set.rb +5 -5
  44. data/lib/mongoid/factory.rb +4 -2
  45. data/lib/mongoid/fields.rb +7 -2
  46. data/lib/mongoid/findable.rb +4 -1
  47. data/lib/mongoid/indexable.rb +15 -9
  48. data/lib/mongoid/persistable.rb +1 -2
  49. data/lib/mongoid/persistable/creatable.rb +2 -2
  50. data/lib/mongoid/persistable/deletable.rb +3 -3
  51. data/lib/mongoid/persistable/incrementable.rb +1 -1
  52. data/lib/mongoid/persistable/logical.rb +1 -1
  53. data/lib/mongoid/persistable/poppable.rb +1 -1
  54. data/lib/mongoid/persistable/pullable.rb +2 -2
  55. data/lib/mongoid/persistable/pushable.rb +2 -2
  56. data/lib/mongoid/persistable/renamable.rb +1 -1
  57. data/lib/mongoid/persistable/settable.rb +1 -1
  58. data/lib/mongoid/persistable/unsettable.rb +1 -1
  59. data/lib/mongoid/persistable/updatable.rb +2 -2
  60. data/lib/mongoid/persistable/upsertable.rb +1 -1
  61. data/lib/mongoid/query_cache.rb +98 -104
  62. data/lib/mongoid/railtie.rb +1 -21
  63. data/lib/mongoid/railties/database.rake +1 -1
  64. data/lib/mongoid/relations/builders.rb +3 -1
  65. data/lib/mongoid/relations/counter_cache.rb +1 -1
  66. data/lib/mongoid/relations/embedded/batchable.rb +3 -10
  67. data/lib/mongoid/relations/embedded/many.rb +4 -2
  68. data/lib/mongoid/relations/many.rb +1 -0
  69. data/lib/mongoid/relations/proxy.rb +6 -6
  70. data/lib/mongoid/relations/referenced/many.rb +2 -1
  71. data/lib/mongoid/relations/targets/enumerable.rb +11 -11
  72. data/lib/mongoid/relations/touchable.rb +1 -1
  73. data/lib/mongoid/reloadable.rb +2 -2
  74. data/lib/mongoid/scopable.rb +6 -17
  75. data/lib/mongoid/selectable.rb +1 -36
  76. data/lib/mongoid/serializable.rb +2 -2
  77. data/lib/mongoid/stateful.rb +0 -1
  78. data/lib/mongoid/tasks/database.rake +2 -2
  79. data/lib/mongoid/tasks/database.rb +23 -16
  80. data/lib/mongoid/threaded.rb +54 -33
  81. data/lib/mongoid/threaded/lifecycle.rb +21 -16
  82. data/lib/mongoid/traversable.rb +16 -1
  83. data/lib/mongoid/validatable.rb +1 -1
  84. data/lib/mongoid/validatable/queryable.rb +1 -1
  85. data/lib/mongoid/validatable/uniqueness.rb +3 -20
  86. data/lib/mongoid/version.rb +1 -1
  87. data/lib/rails/generators/mongoid/config/templates/mongoid.yml +91 -57
  88. data/lib/rails/mongoid.rb +2 -2
  89. data/spec/app/models/audio.rb +1 -1
  90. data/spec/app/models/band.rb +1 -0
  91. data/spec/app/models/company.rb +5 -0
  92. data/spec/app/models/label.rb +7 -0
  93. data/spec/app/models/pub.rb +6 -0
  94. data/spec/app/models/staff.rb +7 -0
  95. data/spec/app/models/store_as_dup_test1.rb +5 -0
  96. data/spec/app/models/store_as_dup_test2.rb +5 -0
  97. data/spec/config/mongoid.yml +7 -25
  98. data/spec/mongoid/atomic/paths_spec.rb +3 -11
  99. data/spec/mongoid/attributes/nested_spec.rb +16 -16
  100. data/spec/mongoid/attributes/readonly_spec.rb +80 -18
  101. data/spec/mongoid/attributes_spec.rb +3 -3
  102. data/spec/mongoid/changeable_spec.rb +70 -0
  103. data/spec/mongoid/clients/factory_spec.rb +284 -0
  104. data/spec/mongoid/{sessions → clients}/options_spec.rb +4 -6
  105. data/spec/mongoid/clients_spec.rb +739 -0
  106. data/spec/mongoid/config/environment_spec.rb +14 -11
  107. data/spec/mongoid/config_spec.rb +33 -48
  108. data/spec/mongoid/contextual/atomic_spec.rb +1 -17
  109. data/spec/mongoid/contextual/geo_near_spec.rb +35 -0
  110. data/spec/mongoid/contextual/mongo_spec.rb +26 -83
  111. data/spec/mongoid/contextual/none_spec.rb +15 -0
  112. data/spec/mongoid/copyable_spec.rb +35 -1
  113. data/spec/mongoid/criteria/findable_spec.rb +197 -0
  114. data/spec/mongoid/criteria/modifiable_spec.rb +7 -29
  115. data/spec/mongoid/criteria_spec.rb +74 -91
  116. data/spec/mongoid/document_spec.rb +1 -1
  117. data/spec/mongoid/errors/{mixed_session_configuration_spec.rb → mixed_client_configuration_spec.rb} +1 -1
  118. data/spec/mongoid/errors/{no_session_config_spec.rb → no_client_config_spec.rb} +4 -4
  119. data/spec/mongoid/errors/{no_session_database_spec.rb → no_client_database_spec.rb} +4 -4
  120. data/spec/mongoid/errors/{no_session_hosts_spec.rb → no_client_hosts_spec.rb} +3 -3
  121. data/spec/mongoid/errors/{no_sessions_config_spec.rb → no_clients_config_spec.rb} +2 -2
  122. data/spec/mongoid/fields/localized_spec.rb +1 -0
  123. data/spec/mongoid/fields_spec.rb +1 -0
  124. data/spec/mongoid/findable_spec.rb +2 -23
  125. data/spec/mongoid/indexable_spec.rb +12 -8
  126. data/spec/mongoid/interceptable_spec.rb +15 -0
  127. data/spec/mongoid/persistable/settable_spec.rb +16 -0
  128. data/spec/mongoid/persistable/updatable_spec.rb +3 -2
  129. data/spec/mongoid/persistable_spec.rb +4 -4
  130. data/spec/mongoid/query_cache_spec.rb +13 -8
  131. data/spec/mongoid/relations/auto_save_spec.rb +1 -1
  132. data/spec/mongoid/relations/counter_cache_spec.rb +34 -0
  133. data/spec/mongoid/relations/eager/belongs_to_spec.rb +9 -0
  134. data/spec/mongoid/relations/eager/has_and_belongs_to_many_spec.rb +3 -3
  135. data/spec/mongoid/relations/embedded/many_spec.rb +123 -1
  136. data/spec/mongoid/relations/embedded/one_spec.rb +3 -3
  137. data/spec/mongoid/relations/proxy_spec.rb +28 -0
  138. data/spec/mongoid/relations/referenced/in_spec.rb +1 -1
  139. data/spec/mongoid/relations/referenced/many_spec.rb +47 -23
  140. data/spec/mongoid/relations/referenced/many_to_many_spec.rb +1 -1
  141. data/spec/mongoid/relations/referenced/one_spec.rb +1 -1
  142. data/spec/mongoid/relations/targets/enumerable_spec.rb +9 -2
  143. data/spec/mongoid/reloadable_spec.rb +6 -6
  144. data/spec/mongoid/scopable_spec.rb +41 -28
  145. data/spec/mongoid/selectable_spec.rb +6 -16
  146. data/spec/mongoid/tasks/database_rake_spec.rb +13 -13
  147. data/spec/mongoid/tasks/database_spec.rb +2 -2
  148. data/spec/mongoid/threaded_spec.rb +0 -7
  149. data/spec/mongoid/traversable_spec.rb +2 -2
  150. data/spec/mongoid/validatable/uniqueness_spec.rb +30 -1
  151. data/spec/mongoid_spec.rb +13 -15
  152. data/spec/rails/mongoid_spec.rb +13 -4
  153. data/spec/spec_helper.rb +44 -27
  154. data/spec/support/authorization.rb +12 -0
  155. data/spec/support/expectations.rb +14 -0
  156. metadata +52 -59
  157. data/lib/mongoid/contextual/find_and_modify.rb +0 -69
  158. data/lib/mongoid/contextual/text_search.rb +0 -178
  159. data/lib/mongoid/criteria/#findable.rb# +0 -141
  160. data/lib/mongoid/errors/no_default_session.rb +0 -23
  161. data/lib/mongoid/errors/no_session_config.rb +0 -22
  162. data/lib/mongoid/log_subscriber.rb +0 -55
  163. data/lib/mongoid/positional.rb +0 -71
  164. data/lib/mongoid/sessions.rb +0 -125
  165. data/lib/mongoid/sessions/factory.rb +0 -131
  166. data/lib/mongoid/sessions/mongo_uri.rb +0 -93
  167. data/lib/mongoid/sessions/validators.rb +0 -2
  168. data/lib/mongoid/support/query_counter.rb +0 -23
  169. data/spec/helpers.rb +0 -18
  170. data/spec/mongoid/#atomic_spec.rb# +0 -365
  171. data/spec/mongoid/contextual/find_and_modify_spec.rb +0 -220
  172. data/spec/mongoid/contextual/text_search_spec.rb +0 -209
  173. data/spec/mongoid/log_subscriber_spec.rb +0 -75
  174. data/spec/mongoid/positional_spec.rb +0 -222
  175. data/spec/mongoid/sessions/factory_spec.rb +0 -333
  176. data/spec/mongoid/sessions/mongo_uri_spec.rb +0 -103
  177. data/spec/mongoid/sessions_spec.rb +0 -1252
@@ -1,209 +0,0 @@
1
- require "spec_helper"
2
-
3
- describe Mongoid::Contextual::TextSearch do
4
-
5
- before do
6
- Word.with(database: "admin").mongo_session.command(setParameter: 1, textSearchEnabled: true)
7
- Word.create_indexes
8
- end
9
-
10
- after(:all) do
11
- Word.remove_indexes
12
- end
13
-
14
- describe "#each" do
15
-
16
- let(:collection) do
17
- Word.collection
18
- end
19
-
20
- let(:criteria) do
21
- Word.all
22
- end
23
-
24
- before do
25
- Word.create!(name: "phase", origin: "latin")
26
- Word.create!(name: "phazed", origin: "latin")
27
- end
28
-
29
- context "when the search is projecting" do
30
-
31
- let(:search) do
32
- described_class.new(collection, criteria, "phase").project(name: 1)
33
- end
34
-
35
- let(:documents) do
36
- search.entries
37
- end
38
-
39
- it "limits the fields to the projection" do
40
- expect {
41
- documents.first.origin
42
- }.to raise_error(ActiveModel::MissingAttributeError)
43
- end
44
- end
45
-
46
- context "when the search is not projecting" do
47
-
48
- let(:search) do
49
- described_class.new(collection, criteria, "phase")
50
- end
51
-
52
- let(:documents) do
53
- search.entries
54
- end
55
-
56
- it "returns all fields" do
57
- expect(documents.first.origin).to eq("latin")
58
- end
59
- end
60
- end
61
-
62
- describe "#execute" do
63
-
64
- let(:collection) do
65
- Word.collection
66
- end
67
-
68
- let(:criteria) do
69
- Word.all
70
- end
71
-
72
- let(:search) do
73
- described_class.new(collection, criteria, "phase")
74
- end
75
-
76
- before do
77
- Word.create!(name: "phase", origin: "latin")
78
- Word.create!(name: "phazed", origin: "latin")
79
- end
80
-
81
- let(:results) do
82
- search.execute
83
- end
84
-
85
- it "returns the raw results" do
86
- expect(results).to_not be_empty
87
- end
88
- end
89
-
90
- describe "#initialize" do
91
-
92
- let(:collection) do
93
- Word.collection
94
- end
95
-
96
- let(:criteria) do
97
- Word.limit(100)
98
- end
99
-
100
- let(:search) do
101
- described_class.new(collection, criteria, "phase")
102
- end
103
-
104
- it "sets the collection" do
105
- expect(search.collection).to eq(collection)
106
- end
107
-
108
- it "sets the criteria" do
109
- expect(search.criteria).to eq(criteria)
110
- end
111
-
112
- it "sets the text command" do
113
- expect(search.command[:text]).to eq(collection.name)
114
- end
115
-
116
- it "sets the text search parameter" do
117
- expect(search.command[:search]).to eq("phase")
118
- end
119
-
120
- it "sets the criteria" do
121
- expect(search.command[:filter]).to be_empty
122
- end
123
-
124
- it "sets the limit" do
125
- expect(search.command[:limit]).to eq(100)
126
- end
127
- end
128
-
129
- describe "#language" do
130
-
131
- let(:collection) do
132
- Word.collection
133
- end
134
-
135
- let(:criteria) do
136
- Word.limit(100)
137
- end
138
-
139
- let(:search) do
140
- described_class.new(collection, criteria, "phase")
141
- end
142
-
143
- let!(:text_search) do
144
- search.language("deutsch")
145
- end
146
-
147
- it "sets the search language" do
148
- expect(search.command[:language]).to eq("deutsch")
149
- end
150
-
151
- it "returns the text search" do
152
- expect(text_search).to equal(search)
153
- end
154
- end
155
-
156
- describe "#project" do
157
-
158
- let(:collection) do
159
- Word.collection
160
- end
161
-
162
- let(:criteria) do
163
- Word.limit(100)
164
- end
165
-
166
- let(:search) do
167
- described_class.new(collection, criteria, "phase")
168
- end
169
-
170
- let!(:text_search) do
171
- search.project(name: 1, title: 1)
172
- end
173
-
174
- it "sets the search field limitations" do
175
- expect(search.command[:project]).to eq(name: 1, title: 1)
176
- end
177
-
178
- it "returns the text search" do
179
- expect(text_search).to equal(search)
180
- end
181
- end
182
-
183
- describe "#stats" do
184
-
185
- let(:collection) do
186
- Word.collection
187
- end
188
-
189
- let(:criteria) do
190
- Word.all
191
- end
192
-
193
- let(:search) do
194
- described_class.new(collection, criteria, "phase")
195
- end
196
-
197
- before do
198
- Word.create!(name: "phase", origin: "latin")
199
- end
200
-
201
- let(:stats) do
202
- search.stats
203
- end
204
-
205
- it "returns the raw stats" do
206
- expect(stats["nscanned"]).to eq(1)
207
- end
208
- end
209
- end
@@ -1,75 +0,0 @@
1
- require "spec_helper"
2
-
3
- describe Mongoid::LogSubscriber do
4
-
5
- describe ".query" do
6
-
7
- let!(:subscribe) do
8
- Mongoid::LogSubscriber.log_subscribers.first
9
- end
10
-
11
- before do
12
- @old_level, Moped.logger.level = Moped.logger.level, 0
13
- end
14
-
15
- after do
16
- Moped.logger.level = @old_level
17
- end
18
-
19
- context "when quering the database" do
20
-
21
- it "logs the operation" do
22
- expect(subscribe).to receive(:debug).once
23
- Band.all.to_a
24
- end
25
- end
26
-
27
- context "when creating a new subscriber" do
28
-
29
- class TestLogSubscriber < ActiveSupport::LogSubscriber
30
- attr_reader :debugs
31
-
32
- def initialize
33
- super
34
- @debugs = []
35
- end
36
-
37
- def query(event)
38
- @debugs << event
39
- end
40
-
41
- def logger
42
- Moped.logger
43
- end
44
- end
45
-
46
- let(:test_subscriber) do
47
- TestLogSubscriber.new
48
- end
49
-
50
- before do
51
- ActiveSupport::LogSubscriber.attach_to :moped, test_subscriber
52
- end
53
-
54
- after do
55
- TestLogSubscriber.log_subscribers.pop
56
- end
57
-
58
- it "pushes the new log subscriber" do
59
- expect(Mongoid::LogSubscriber.subscribers.last).to be_a TestLogSubscriber
60
- end
61
-
62
- context "when quering the database" do
63
-
64
- before do
65
- expect(subscribe).to receive(:debug).once
66
- PetOwner.all.to_a
67
- end
68
-
69
- it "sends operations logs to TestLogSubscriber" do
70
- expect(test_subscriber.debugs.size).to eq(1)
71
- end
72
- end
73
- end
74
- end
75
- end
@@ -1,222 +0,0 @@
1
- require "spec_helper"
2
-
3
- describe Mongoid::Positional do
4
-
5
- describe "#positionally" do
6
-
7
- let(:positionable) do
8
- Class.new do
9
- include Mongoid::Positional
10
- end.new
11
- end
12
-
13
- let(:updates) do
14
- {
15
- "$set" => {
16
- "field" => "value",
17
- "children.0.field" => "value",
18
- "children.0.children.1.children.3.field" => "value"
19
- },
20
- "$pushAll" => {
21
- "children.0.children.1.children.3.fields" => [ "value", "value" ]
22
- }
23
- }
24
- end
25
-
26
- context "when a child has an embeds many under an embeds one" do
27
-
28
- context "when selector does not include the embeds one" do
29
-
30
- let(:selector) do
31
- { "_id" => 1, "child._id" => 2 }
32
- end
33
-
34
- let(:ops) do
35
- {
36
- "$set" => {
37
- "field" => "value",
38
- "child.children.1.children.3.field" => "value",
39
- }
40
- }
41
- end
42
-
43
- let(:processed) do
44
- positionable.positionally(selector, ops)
45
- end
46
-
47
- it "does not do any replacement" do
48
- expect(processed).to eq(ops)
49
- end
50
- end
51
-
52
- context "when selector includes the embeds one" do
53
-
54
- let(:selector) do
55
- { "_id" => 1, "child._id" => 2, "child.children._id" => 3 }
56
- end
57
-
58
- let(:ops) do
59
- {
60
- "$set" => {
61
- "field" => "value",
62
- "child.children.1.children.3.field" => "value",
63
- }
64
- }
65
- end
66
-
67
- let(:expected) do
68
- {
69
- "$set" => {
70
- "field" => "value",
71
- "child.children.$.children.3.field" => "value",
72
- }
73
- }
74
- end
75
-
76
-
77
- let(:processed) do
78
- positionable.positionally(selector, ops)
79
- end
80
-
81
- it "does not do any replacement" do
82
- expect(processed).to eq(expected)
83
- end
84
- end
85
- end
86
-
87
- context "when the selector has only 1 pair" do
88
-
89
- let(:selector) do
90
- { "_id" => 1 }
91
- end
92
-
93
- let(:processed) do
94
- positionable.positionally(selector, updates)
95
- end
96
-
97
- it "does not do any replacement" do
98
- expect(processed).to eq(updates)
99
- end
100
- end
101
-
102
- context "when the selector has 2 pairs" do
103
-
104
- context "when the second pair has an id" do
105
-
106
- let(:selector) do
107
- { "_id" => 1, "children._id" => 2 }
108
- end
109
-
110
- let(:expected) do
111
- {
112
- "$set" => {
113
- "field" => "value",
114
- "children.$.field" => "value",
115
- "children.$.children.1.children.3.field" => "value"
116
- },
117
- "$pushAll" => {
118
- "children.$.children.1.children.3.fields" => [ "value", "value" ]
119
- }
120
- }
121
- end
122
-
123
- let(:processed) do
124
- positionable.positionally(selector, updates)
125
- end
126
-
127
- it "replaces the first index with the positional operator" do
128
- expect(processed).to eq(expected)
129
- end
130
- end
131
-
132
- context "when the second pair has no id" do
133
-
134
- let(:selector) do
135
- { "_id" => 1, "children._id" => nil }
136
- end
137
-
138
- let(:expected) do
139
- {
140
- "$set" => {
141
- "field" => "value",
142
- "children.0.field" => "value",
143
- "children.0.children.1.children.3.field" => "value"
144
- },
145
- "$pushAll" => {
146
- "children.0.children.1.children.3.fields" => [ "value", "value" ]
147
- }
148
- }
149
- end
150
-
151
- let(:processed) do
152
- positionable.positionally(selector, updates)
153
- end
154
-
155
- it "replaces the first index with the positional operator" do
156
- expect(processed).to eq(expected)
157
- end
158
- end
159
- end
160
-
161
- context "when the selector has 3 pairs" do
162
-
163
- let(:selector) do
164
- { "_id" => 1, "children._id" => 2, "children.0.children._id" => 3 }
165
- end
166
-
167
- let(:expected) do
168
- {
169
- "$set" => {
170
- "field" => "value",
171
- "children.$.field" => "value",
172
- "children.0.children.$.children.3.field" => "value"
173
- },
174
- "$pushAll" => {
175
- "children.0.children.$.children.3.fields" => [ "value", "value" ]
176
- }
177
- }
178
- end
179
-
180
- let(:processed) do
181
- positionable.positionally(selector, updates)
182
- end
183
-
184
- it "replaces the first index with the positional operator" do
185
- expect(processed).to eq(expected)
186
- end
187
- end
188
-
189
- context "when the selector has 4 pairs" do
190
-
191
- let(:selector) do
192
- {
193
- "_id" => 1,
194
- "children._id" => 2,
195
- "children.0.children._id" => 3,
196
- "children.0.children.1.children._id" => 4
197
- }
198
- end
199
-
200
- let(:expected) do
201
- {
202
- "$set" => {
203
- "field" => "value",
204
- "children.$.field" => "value",
205
- "children.0.children.1.children.$.field" => "value"
206
- },
207
- "$pushAll" => {
208
- "children.0.children.1.children.$.fields" => [ "value", "value" ]
209
- }
210
- }
211
- end
212
-
213
- let(:processed) do
214
- positionable.positionally(selector, updates)
215
- end
216
-
217
- it "replaces the first index with the positional operator" do
218
- expect(processed).to eq(expected)
219
- end
220
- end
221
- end
222
- end