mongoid 4.0.2 → 5.0.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 (185) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +66 -1
  3. data/README.md +11 -19
  4. data/lib/config/locales/en.yml +33 -30
  5. data/lib/mongoid/atomic.rb +2 -4
  6. data/lib/mongoid/attributes/processing.rb +4 -1
  7. data/lib/mongoid/attributes/readonly.rb +2 -2
  8. data/lib/mongoid/attributes.rb +7 -7
  9. data/lib/mongoid/changeable.rb +4 -6
  10. data/lib/mongoid/clients/factory.rb +78 -0
  11. data/lib/mongoid/{sessions → clients}/options.rb +30 -19
  12. data/lib/mongoid/{sessions → clients}/storage_options.rb +27 -13
  13. data/lib/mongoid/{sessions → clients}/thread_options.rb +6 -3
  14. data/lib/mongoid/{sessions → clients}/validators/storage.rb +5 -2
  15. data/lib/mongoid/clients/validators.rb +2 -0
  16. data/lib/mongoid/clients.rb +141 -0
  17. data/lib/mongoid/composable.rb +3 -3
  18. data/lib/mongoid/config/environment.rb +1 -1
  19. data/lib/mongoid/config/options.rb +1 -1
  20. data/lib/mongoid/config/validators/{session.rb → client.rb} +31 -28
  21. data/lib/mongoid/config/validators/option.rb +1 -1
  22. data/lib/mongoid/config/validators.rb +1 -1
  23. data/lib/mongoid/config.rb +39 -41
  24. data/lib/mongoid/contextual/aggregable/mongo.rb +1 -1
  25. data/lib/mongoid/contextual/atomic.rb +11 -11
  26. data/lib/mongoid/contextual/command.rb +9 -6
  27. data/lib/mongoid/contextual/geo_near.rb +17 -1
  28. data/lib/mongoid/contextual/map_reduce.rb +12 -11
  29. data/lib/mongoid/contextual/memory.rb +2 -5
  30. data/lib/mongoid/contextual/mongo.rb +92 -82
  31. data/lib/mongoid/contextual/none.rb +13 -0
  32. data/lib/mongoid/copyable.rb +6 -1
  33. data/lib/mongoid/criteria.rb +37 -4
  34. data/lib/mongoid/document.rb +3 -4
  35. data/lib/mongoid/errors/{mixed_session_configuration.rb → mixed_client_configuration.rb} +5 -5
  36. data/lib/mongoid/errors/mongoid_error.rb +15 -9
  37. data/lib/mongoid/errors/no_client_config.rb +22 -0
  38. data/lib/mongoid/errors/{no_session_database.rb → no_client_database.rb} +4 -4
  39. data/lib/mongoid/errors/{no_session_hosts.rb → no_client_hosts.rb} +4 -4
  40. data/lib/mongoid/errors/{no_sessions_config.rb → no_clients_config.rb} +4 -4
  41. data/lib/mongoid/errors/no_default_client.rb +23 -0
  42. data/lib/mongoid/errors.rb +6 -6
  43. data/lib/mongoid/extensions/hash.rb +5 -1
  44. data/lib/mongoid/extensions/object.rb +3 -2
  45. data/lib/mongoid/extensions/set.rb +5 -5
  46. data/lib/mongoid/factory.rb +4 -2
  47. data/lib/mongoid/fields.rb +7 -2
  48. data/lib/mongoid/findable.rb +4 -1
  49. data/lib/mongoid/indexable.rb +15 -9
  50. data/lib/mongoid/persistable/creatable.rb +2 -2
  51. data/lib/mongoid/persistable/deletable.rb +3 -3
  52. data/lib/mongoid/persistable/incrementable.rb +1 -1
  53. data/lib/mongoid/persistable/logical.rb +1 -1
  54. data/lib/mongoid/persistable/poppable.rb +1 -1
  55. data/lib/mongoid/persistable/pullable.rb +2 -2
  56. data/lib/mongoid/persistable/pushable.rb +2 -2
  57. data/lib/mongoid/persistable/renamable.rb +1 -1
  58. data/lib/mongoid/persistable/settable.rb +1 -1
  59. data/lib/mongoid/persistable/unsettable.rb +1 -1
  60. data/lib/mongoid/persistable/updatable.rb +2 -2
  61. data/lib/mongoid/persistable/upsertable.rb +1 -1
  62. data/lib/mongoid/persistable.rb +1 -2
  63. data/lib/mongoid/query_cache.rb +98 -104
  64. data/lib/mongoid/railtie.rb +4 -25
  65. data/lib/mongoid/railties/database.rake +1 -1
  66. data/lib/mongoid/relations/bindings/referenced/many_to_many.rb +3 -2
  67. data/lib/mongoid/relations/builders.rb +3 -1
  68. data/lib/mongoid/relations/counter_cache.rb +1 -1
  69. data/lib/mongoid/relations/embedded/batchable.rb +3 -10
  70. data/lib/mongoid/relations/embedded/many.rb +4 -2
  71. data/lib/mongoid/relations/embedded/one.rb +1 -0
  72. data/lib/mongoid/relations/many.rb +1 -0
  73. data/lib/mongoid/relations/metadata.rb +14 -0
  74. data/lib/mongoid/relations/proxy.rb +6 -6
  75. data/lib/mongoid/relations/referenced/many.rb +2 -1
  76. data/lib/mongoid/relations/targets/enumerable.rb +11 -11
  77. data/lib/mongoid/relations/touchable.rb +1 -1
  78. data/lib/mongoid/reloadable.rb +2 -2
  79. data/lib/mongoid/scopable.rb +6 -17
  80. data/lib/mongoid/selectable.rb +1 -36
  81. data/lib/mongoid/serializable.rb +2 -2
  82. data/lib/mongoid/stateful.rb +0 -1
  83. data/lib/mongoid/tasks/database.rake +2 -2
  84. data/lib/mongoid/tasks/database.rb +24 -17
  85. data/lib/mongoid/threaded/lifecycle.rb +21 -16
  86. data/lib/mongoid/threaded.rb +54 -33
  87. data/lib/mongoid/traversable.rb +17 -1
  88. data/lib/mongoid/validatable/queryable.rb +1 -1
  89. data/lib/mongoid/validatable/uniqueness.rb +3 -20
  90. data/lib/mongoid/validatable.rb +1 -1
  91. data/lib/mongoid/version.rb +1 -1
  92. data/lib/mongoid.rb +28 -21
  93. data/lib/rails/generators/mongoid/config/templates/mongoid.yml +91 -57
  94. data/lib/rails/mongoid.rb +2 -2
  95. data/spec/app/models/audio.rb +1 -1
  96. data/spec/app/models/band.rb +1 -0
  97. data/spec/app/models/code.rb +6 -0
  98. data/spec/app/models/company.rb +5 -0
  99. data/spec/app/models/label.rb +7 -0
  100. data/spec/app/models/pub.rb +6 -0
  101. data/spec/app/models/staff.rb +7 -0
  102. data/spec/app/models/store_as_dup_test1.rb +5 -0
  103. data/spec/app/models/store_as_dup_test2.rb +5 -0
  104. data/spec/config/mongoid.yml +7 -25
  105. data/spec/mongoid/atomic/paths_spec.rb +3 -11
  106. data/spec/mongoid/attributes/nested_spec.rb +16 -16
  107. data/spec/mongoid/attributes/readonly_spec.rb +80 -18
  108. data/spec/mongoid/attributes_spec.rb +3 -3
  109. data/spec/mongoid/changeable_spec.rb +156 -0
  110. data/spec/mongoid/clients/factory_spec.rb +284 -0
  111. data/spec/mongoid/{sessions → clients}/options_spec.rb +4 -6
  112. data/spec/mongoid/clients_spec.rb +754 -0
  113. data/spec/mongoid/config/environment_spec.rb +14 -11
  114. data/spec/mongoid/config_spec.rb +33 -48
  115. data/spec/mongoid/contextual/atomic_spec.rb +1 -17
  116. data/spec/mongoid/contextual/geo_near_spec.rb +35 -0
  117. data/spec/mongoid/contextual/mongo_spec.rb +26 -83
  118. data/spec/mongoid/contextual/none_spec.rb +15 -0
  119. data/spec/mongoid/copyable_spec.rb +35 -1
  120. data/spec/mongoid/criteria/findable_spec.rb +197 -0
  121. data/spec/mongoid/criteria/modifiable_spec.rb +7 -29
  122. data/spec/mongoid/criteria_spec.rb +74 -91
  123. data/spec/mongoid/document_spec.rb +1 -1
  124. data/spec/mongoid/errors/{mixed_session_configuration_spec.rb → mixed_client_configuration_spec.rb} +1 -1
  125. data/spec/mongoid/errors/mongoid_error_spec.rb +19 -3
  126. data/spec/mongoid/errors/{no_session_config_spec.rb → no_client_config_spec.rb} +4 -4
  127. data/spec/mongoid/errors/{no_session_database_spec.rb → no_client_database_spec.rb} +4 -4
  128. data/spec/mongoid/errors/{no_session_hosts_spec.rb → no_client_hosts_spec.rb} +3 -3
  129. data/spec/mongoid/errors/{no_sessions_config_spec.rb → no_clients_config_spec.rb} +2 -2
  130. data/spec/mongoid/fields/localized_spec.rb +1 -0
  131. data/spec/mongoid/fields_spec.rb +1 -0
  132. data/spec/mongoid/findable_spec.rb +2 -23
  133. data/spec/mongoid/indexable_spec.rb +12 -8
  134. data/spec/mongoid/interceptable_spec.rb +15 -0
  135. data/spec/mongoid/persistable/settable_spec.rb +16 -0
  136. data/spec/mongoid/persistable/updatable_spec.rb +3 -2
  137. data/spec/mongoid/persistable_spec.rb +4 -4
  138. data/spec/mongoid/query_cache_spec.rb +13 -8
  139. data/spec/mongoid/relations/auto_save_spec.rb +1 -1
  140. data/spec/mongoid/relations/counter_cache_spec.rb +34 -0
  141. data/spec/mongoid/relations/eager/belongs_to_spec.rb +9 -0
  142. data/spec/mongoid/relations/eager/has_and_belongs_to_many_spec.rb +3 -3
  143. data/spec/mongoid/relations/embedded/many_spec.rb +123 -1
  144. data/spec/mongoid/relations/embedded/one_spec.rb +3 -3
  145. data/spec/mongoid/relations/proxy_spec.rb +28 -0
  146. data/spec/mongoid/relations/referenced/in_spec.rb +1 -1
  147. data/spec/mongoid/relations/referenced/many_spec.rb +47 -23
  148. data/spec/mongoid/relations/referenced/many_to_many_spec.rb +1 -1
  149. data/spec/mongoid/relations/referenced/one_spec.rb +1 -1
  150. data/spec/mongoid/relations/targets/enumerable_spec.rb +9 -2
  151. data/spec/mongoid/reloadable_spec.rb +6 -6
  152. data/spec/mongoid/scopable_spec.rb +41 -28
  153. data/spec/mongoid/selectable_spec.rb +6 -16
  154. data/spec/mongoid/tasks/database_rake_spec.rb +13 -13
  155. data/spec/mongoid/tasks/database_spec.rb +2 -2
  156. data/spec/mongoid/threaded_spec.rb +0 -7
  157. data/spec/mongoid/traversable_spec.rb +2 -2
  158. data/spec/mongoid/validatable/uniqueness_spec.rb +30 -1
  159. data/spec/mongoid_spec.rb +13 -15
  160. data/spec/rails/mongoid_spec.rb +13 -4
  161. data/spec/spec_helper.rb +44 -27
  162. data/spec/support/authorization.rb +12 -0
  163. data/spec/support/expectations.rb +14 -0
  164. metadata +50 -57
  165. data/lib/mongoid/contextual/find_and_modify.rb +0 -69
  166. data/lib/mongoid/contextual/text_search.rb +0 -178
  167. data/lib/mongoid/criteria/#findable.rb# +0 -141
  168. data/lib/mongoid/errors/no_default_session.rb +0 -23
  169. data/lib/mongoid/errors/no_session_config.rb +0 -22
  170. data/lib/mongoid/log_subscriber.rb +0 -55
  171. data/lib/mongoid/positional.rb +0 -71
  172. data/lib/mongoid/sessions/factory.rb +0 -131
  173. data/lib/mongoid/sessions/mongo_uri.rb +0 -93
  174. data/lib/mongoid/sessions/validators.rb +0 -2
  175. data/lib/mongoid/sessions.rb +0 -125
  176. data/lib/mongoid/support/query_counter.rb +0 -23
  177. data/spec/helpers.rb +0 -18
  178. data/spec/mongoid/#atomic_spec.rb# +0 -365
  179. data/spec/mongoid/contextual/find_and_modify_spec.rb +0 -220
  180. data/spec/mongoid/contextual/text_search_spec.rb +0 -209
  181. data/spec/mongoid/log_subscriber_spec.rb +0 -75
  182. data/spec/mongoid/positional_spec.rb +0 -222
  183. data/spec/mongoid/sessions/factory_spec.rb +0 -333
  184. data/spec/mongoid/sessions/mongo_uri_spec.rb +0 -103
  185. data/spec/mongoid/sessions_spec.rb +0 -1252
@@ -1,333 +0,0 @@
1
- require "spec_helper"
2
-
3
- describe Mongoid::Sessions::Factory do
4
-
5
- describe ".create" do
6
-
7
- context "when provided a name" do
8
-
9
- context "when the configuration exists" do
10
-
11
- context "when the configuration is standard" do
12
-
13
- let(:config) do
14
- {
15
- default: { hosts: [ "localhost:27017" ], database: database_id },
16
- secondary: { hosts: [ "localhost:27017" ], database: database_id }
17
- }
18
- end
19
-
20
- before do
21
- Mongoid::Config.sessions = config
22
- end
23
-
24
- let(:session) do
25
- described_class.create(:secondary)
26
- end
27
-
28
- let(:cluster) do
29
- session.cluster
30
- end
31
-
32
- it "returns a session" do
33
- expect(session).to be_a(Moped::Session)
34
- end
35
-
36
- it "sets the cluster's seeds" do
37
- expect(cluster.seeds.first.address.resolved).to eq("127.0.0.1:27017")
38
- end
39
- end
40
-
41
- context "when the configuration has no ports" do
42
-
43
- let(:config) do
44
- {
45
- default: { hosts: [ "127.0.0.1" ], database: database_id },
46
- secondary: { hosts: [ "localhost" ], database: database_id }
47
- }
48
- end
49
-
50
- before do
51
- Mongoid::Config.sessions = config
52
- end
53
-
54
- let(:session) do
55
- described_class.create(:secondary)
56
- end
57
-
58
- let(:default) do
59
- described_class.create(:default)
60
- end
61
-
62
- let(:cluster) do
63
- session.cluster
64
- end
65
-
66
- it "returns a session" do
67
- expect(session).to be_a(Moped::Session)
68
- end
69
-
70
- it "sets the cluster's seed ports to 27017" do
71
- expect(cluster.seeds.first.address.original).to eq("localhost:27017")
72
- end
73
-
74
- it "sets ips with no ports to 27017" do
75
- expect(default.cluster.seeds.first.address.original).to eq("127.0.0.1:27017")
76
- end
77
- end
78
-
79
- context "when configured via a uri" do
80
-
81
- context "when the uri has a single host:port" do
82
-
83
- let(:config) do
84
- {
85
- default: { hosts: [ "localhost:27017" ], database: database_id },
86
- secondary: { uri: "mongodb://localhost:27017/mongoid_test" }
87
- }
88
- end
89
-
90
- before do
91
- Mongoid::Config.sessions = config
92
- end
93
-
94
- let(:session) do
95
- described_class.create(:secondary)
96
- end
97
-
98
- let(:cluster) do
99
- session.cluster
100
- end
101
-
102
- it "returns a session" do
103
- expect(session).to be_a(Moped::Session)
104
- end
105
-
106
- it "sets the cluster's seeds" do
107
- expect(cluster.seeds.first.address.original).to eq("localhost:27017")
108
- end
109
-
110
- it "sets the database" do
111
- expect(session.options[:database]).to eq("mongoid_test")
112
- end
113
-
114
- it "sets the database in the configuration" do
115
- session
116
- expect(Mongoid.sessions[:secondary]).to include(:database)
117
- end
118
-
119
- it "sets the hosts in the configuration" do
120
- session
121
- expect(Mongoid.sessions[:secondary]).to include(:hosts)
122
- end
123
-
124
- it "removes the uri from the configuration" do
125
- session
126
- expect(Mongoid.sessions[:secondary]).to_not include(:uri)
127
- end
128
- end
129
-
130
- context "when the uri has multiple host:port pairs" do
131
-
132
- let(:config) do
133
- {
134
- default: { hosts: [ "localhost:27017" ], database: database_id },
135
- secondary: { uri: "mongodb://localhost:27017,localhost:27017/mongoid_test" }
136
- }
137
- end
138
-
139
- before do
140
- Mongoid::Config.sessions = config
141
- end
142
-
143
- let(:session) do
144
- described_class.create(:secondary)
145
- end
146
-
147
- let(:cluster) do
148
- session.cluster
149
- end
150
-
151
- let(:seeds) do
152
- cluster.seeds.map{ |node| node.address.original }
153
- end
154
-
155
- it "returns a session" do
156
- expect(session).to be_a(Moped::Session)
157
- end
158
-
159
- it "sets the cluster's seeds" do
160
- expect(seeds).to eq([ "localhost:27017", "localhost:27017" ])
161
- end
162
-
163
- it "sets the database" do
164
- expect(session.options[:database]).to eq("mongoid_test")
165
- end
166
-
167
- it "sets the database in the configuration" do
168
- session
169
- expect(Mongoid.sessions[:secondary]).to include(:database)
170
- end
171
-
172
- it "sets the hosts in the configuration" do
173
- session
174
- expect(Mongoid.sessions[:secondary]).to include(:hosts)
175
- end
176
-
177
- it "removes the uri from the configuration" do
178
- session
179
- expect(Mongoid.sessions[:secondary]).to_not include(:uri)
180
- end
181
- end
182
- end
183
- end
184
-
185
- context "when the configuration does not exist" do
186
-
187
- it "raises an error" do
188
- expect {
189
- described_class.create(:unknown)
190
- }.to raise_error(Mongoid::Errors::NoSessionConfig)
191
- end
192
- end
193
- end
194
-
195
- context "when no name is provided" do
196
-
197
- let(:config) do
198
- { default: { hosts: ["localhost:27017"], database: database_id }}
199
- end
200
-
201
- before do
202
- Mongoid::Config.sessions = config
203
- end
204
-
205
- let(:session) do
206
- described_class.create
207
- end
208
-
209
- let(:cluster) do
210
- session.cluster
211
- end
212
-
213
- let(:seeds) do
214
- cluster.seeds.map{ |node| node.address.original }
215
- end
216
-
217
- it "returns the default session" do
218
- expect(session).to be_a(Moped::Session)
219
- end
220
-
221
- it "sets the cluster's seeds" do
222
- expect(seeds).to eq([ "localhost:27017" ])
223
- end
224
- end
225
-
226
- context "when nil is provided and no default config" do
227
-
228
- let(:config) { nil }
229
-
230
- before do
231
- Mongoid.sessions[:default] = nil
232
- end
233
-
234
- it "raises NoSessionsConfig error" do
235
- expect{ Mongoid::Sessions::Factory.create(config) }.to raise_error(Mongoid::Errors::NoSessionsConfig)
236
- end
237
- end
238
- end
239
-
240
- describe ".default" do
241
-
242
- let(:config) do
243
- { default: { hosts: ["localhost:27017"], database: database_id }}
244
- end
245
-
246
- before do
247
- Mongoid::Config.sessions = config
248
- end
249
-
250
- let(:session) do
251
- described_class.default
252
- end
253
-
254
- let(:cluster) do
255
- session.cluster
256
- end
257
-
258
- let(:seeds) do
259
- cluster.seeds.map{ |node| node.address.original }
260
- end
261
-
262
- it "returns the default session" do
263
- expect(session).to be_a(Moped::Session)
264
- end
265
-
266
- it "sets the cluster's seeds" do
267
- expect(seeds).to eq([ "localhost:27017" ])
268
- end
269
- end
270
-
271
- context "when options are provided with string keys" do
272
-
273
- let(:config) do
274
- {
275
- default: {
276
- hosts: [ "localhost:27017" ],
277
- database: database_id,
278
- options: {
279
- "down_interval" => 10,
280
- "max_retries" => 5,
281
- "refresh_interval" => 30,
282
- "retry_interval" => 0.1,
283
- "write" => { "w" => 1 }
284
- }
285
- }
286
- }
287
- end
288
-
289
- before do
290
- Mongoid::Config.sessions = config
291
- end
292
-
293
- let(:session) do
294
- described_class.default
295
- end
296
-
297
- let(:cluster) do
298
- session.cluster
299
- end
300
-
301
- let(:seeds) do
302
- cluster.seeds.map{ |node| node.address.original }
303
- end
304
-
305
- it "returns the default session" do
306
- expect(session).to be_a(Moped::Session)
307
- end
308
-
309
- it "sets the cluster's seeds" do
310
- expect(seeds).to eq([ "localhost:27017" ])
311
- end
312
-
313
- it "sets the cluster down interval" do
314
- expect(cluster.down_interval).to eq(10)
315
- end
316
-
317
- it "sets the cluster max retries" do
318
- expect(cluster.max_retries).to eq(5)
319
- end
320
-
321
- it "sets the cluster refresh interval" do
322
- expect(cluster.refresh_interval).to eq(30)
323
- end
324
-
325
- it "sets the cluster retry interval" do
326
- expect(cluster.retry_interval).to eq(0.1)
327
- end
328
-
329
- it "sets the write concern" do
330
- expect(session.write_concern).to be_a(Moped::WriteConcern::Propagate)
331
- end
332
- end
333
- end
@@ -1,103 +0,0 @@
1
- require "spec_helper"
2
-
3
- describe Mongoid::Sessions::MongoUri do
4
-
5
- let(:single) do
6
- "mongodb://user:pass@localhost:27017/mongoid_test"
7
- end
8
-
9
- let(:multiple) do
10
- "mongodb://localhost:27017,localhost:27017/mongoid_test"
11
- end
12
-
13
- describe "#database" do
14
-
15
- let(:uri) do
16
- described_class.new(single)
17
- end
18
-
19
- it "returns the database name" do
20
- expect(uri.database).to eq("mongoid_test")
21
- end
22
- end
23
-
24
- describe "#hosts" do
25
-
26
- context "when a single node is provided" do
27
-
28
- let(:uri) do
29
- described_class.new(single)
30
- end
31
-
32
- it "returns an array with 1 node" do
33
- expect(uri.hosts).to eq([ "localhost:27017" ])
34
- end
35
- end
36
-
37
- context "when multiple nodes are provided" do
38
-
39
- let(:uri) do
40
- described_class.new(multiple)
41
- end
42
-
43
- it "returns an array with 2 nodes" do
44
- expect(uri.hosts).to eq([ "localhost:27017", "localhost:27017" ])
45
- end
46
- end
47
- end
48
-
49
- describe "#password" do
50
-
51
- let(:uri) do
52
- described_class.new(single)
53
- end
54
-
55
- it "returns the password" do
56
- expect(uri.password).to eq("pass")
57
- end
58
- end
59
-
60
- describe "#to_hash" do
61
-
62
- context "when a user and password are not provided" do
63
-
64
- let(:uri) do
65
- described_class.new(multiple)
66
- end
67
-
68
- it "does not include the username and password" do
69
- expect(uri.to_hash).to eq({
70
- hosts: [ "localhost:27017", "localhost:27017" ],
71
- database: "mongoid_test"
72
- })
73
- end
74
- end
75
-
76
- context "when a user and password are provided" do
77
-
78
- let(:uri) do
79
- described_class.new(single)
80
- end
81
-
82
- it "includes the username and password" do
83
- expect(uri.to_hash).to eq({
84
- hosts: [ "localhost:27017" ],
85
- database: "mongoid_test",
86
- username: "user",
87
- password: "pass"
88
- })
89
- end
90
- end
91
- end
92
-
93
- describe "#username" do
94
-
95
- let(:uri) do
96
- described_class.new(single)
97
- end
98
-
99
- it "returns the userame" do
100
- expect(uri.username).to eq("user")
101
- end
102
- end
103
- end