mongo 2.4.0 → 2.4.1

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 18d9f304edd2e651c1dfde03646f780951e4d068
4
- data.tar.gz: d7bc0adaa7a4dc5eb8f319caafb1a98fd1357233
3
+ metadata.gz: 9112b76649bf922ef773b7a9018ad8b46de12760
4
+ data.tar.gz: d152ad097652a5c4ec4351f9c86a58de77c44977
5
5
  SHA512:
6
- metadata.gz: 83e651334a083f7acb5e11c9c7cb650a8ce13ab3f7fb10ee4a839e05d7d2edca3adcdb3aeae3b795771b3c8b370772471565a0812cbdf30754c8a50b7e5c217a
7
- data.tar.gz: 34db7e14619cc5b08235fff572034a19c282c982439f6feb7d3769ed5c402b05c60029309fc877d3505e8df6de31baee0519b4ebd6e36bfdeae926807f9e146b
6
+ metadata.gz: dbdc8eeb2763a4ce969c20323188997bdc37e7f8b1f0b54fe8ef4288141ec3a43bd61f1e3f8d89b46bae2c8ae875068bc583e3b17eff1631319da2342c283c86
7
+ data.tar.gz: 6ca6c80afad5e7882d5c31f5a6c2446a01fb5ed46c1de13f5d8df6dd78d47636ce9253522150dcbf7844f768a07f56670a15bcb264e5c4a9c03475437f302c22
Binary file
data.tar.gz.sig CHANGED
Binary file
@@ -291,7 +291,7 @@ module Mongo
291
291
  #
292
292
  # @since 2.1.0
293
293
  def count(filter = nil, options = {})
294
- View.new(self, filter || {}).count(options)
294
+ View.new(self, filter || {}, options).count(options)
295
295
  end
296
296
 
297
297
  # Get a list of distinct values for a specific field.
@@ -311,7 +311,7 @@ module Mongo
311
311
  #
312
312
  # @since 2.1.0
313
313
  def distinct(field_name, filter = nil, options = {})
314
- View.new(self, filter || {}).distinct(field_name, options)
314
+ View.new(self, filter || {}, options).distinct(field_name, options)
315
315
  end
316
316
 
317
317
  # Get a view of all indexes for this collection. Can be iterated or has
@@ -418,7 +418,7 @@ module Mongo
418
418
  #
419
419
  # @since 2.1.0
420
420
  def delete_one(filter = nil, options = {})
421
- find(filter).delete_one(options)
421
+ find(filter, options).delete_one(options)
422
422
  end
423
423
 
424
424
  # Remove documents from the collection.
@@ -435,7 +435,7 @@ module Mongo
435
435
  #
436
436
  # @since 2.1.0
437
437
  def delete_many(filter = nil, options = {})
438
- find(filter).delete_many(options)
438
+ find(filter, options).delete_many(options)
439
439
  end
440
440
 
441
441
  # Execute a parallel scan on the collection view.
@@ -479,7 +479,7 @@ module Mongo
479
479
  #
480
480
  # @since 2.1.0
481
481
  def replace_one(filter, replacement, options = {})
482
- find(filter).replace_one(replacement, options)
482
+ find(filter, options).replace_one(replacement, options)
483
483
  end
484
484
 
485
485
  # Update documents in the collection.
@@ -501,7 +501,7 @@ module Mongo
501
501
  #
502
502
  # @since 2.1.0
503
503
  def update_many(filter, update, options = {})
504
- find(filter).update_many(update, options)
504
+ find(filter, options).update_many(update, options)
505
505
  end
506
506
 
507
507
  # Update a single document in the collection.
@@ -523,7 +523,7 @@ module Mongo
523
523
  #
524
524
  # @since 2.1.0
525
525
  def update_one(filter, update, options = {})
526
- find(filter).update_one(update, options)
526
+ find(filter, options).update_one(update, options)
527
527
  end
528
528
 
529
529
  # Finds a single document in the database via findAndModify and deletes
@@ -177,8 +177,15 @@ module Mongo
177
177
  View.new(collection, filter, options)
178
178
  end
179
179
 
180
- def validate_collation!(server, opts)
181
- if (opts[:collation] || opts[Operation::COLLATION]) && !server.features.collation_enabled?
180
+ def apply_collation!(doc, server, opts = {})
181
+ if coll = opts[:collation] || opts['collation'] || collation
182
+ validate_collation!(server, coll)
183
+ doc[:collation] = coll
184
+ end
185
+ end
186
+
187
+ def validate_collation!(server, coll)
188
+ if coll &&!server.features.collation_enabled?
182
189
  raise Error::UnsupportedCollation.new
183
190
  end
184
191
  end
@@ -73,7 +73,7 @@ module Mongo
73
73
  def initialize(view, pipeline, options = {})
74
74
  @view = view
75
75
  @pipeline = pipeline.dup
76
- @options = options.dup
76
+ @options = BSON::Document.new(options).freeze
77
77
  end
78
78
 
79
79
  # Get the explain plan for the aggregation.
@@ -120,7 +120,7 @@ module Mongo
120
120
  end
121
121
 
122
122
  def validate_collation!(server)
123
- if (@options[:collation] || @options[Operation::COLLATION]) && !server.features.collation_enabled?
123
+ if options[:collation] && !server.features.collation_enabled?
124
124
  raise Error::UnsupportedCollation.new
125
125
  end
126
126
  end
@@ -80,7 +80,7 @@ module Mongo
80
80
  def command_specification
81
81
  {
82
82
  selector: find_command,
83
- db_name: database.name,
83
+ db_name: query_database,
84
84
  read: read
85
85
  }
86
86
  end
@@ -94,7 +94,7 @@ module Mongo
94
94
  #
95
95
  # @since 2.2.0
96
96
  def query_specification
97
- { selector: {}, options: {}, db_name: database.name, coll_name: query_collection }
97
+ { selector: {}, options: {}, db_name: query_database, coll_name: query_collection }
98
98
  end
99
99
 
100
100
  # Get the specification to pass to the map/reduce operation.
@@ -116,6 +116,8 @@ module Mongo
116
116
 
117
117
  private
118
118
 
119
+ OUT_ACTIONS = [ :replace, :merge, :reduce ].freeze
120
+
119
121
  def write?(spec)
120
122
  if out = spec[:selector][:out]
121
123
  out.is_a?(String) ||
@@ -141,8 +143,14 @@ module Mongo
141
143
  command
142
144
  end
143
145
 
146
+ def query_database
147
+ options[:out].respond_to?(:keys) && options[:out][:db] ? options[:out][:db] : database.name
148
+ end
149
+
144
150
  def query_collection
145
- options[:out].respond_to?(:keys) ? options[:out].values.first : options[:out]
151
+ if options[:out].respond_to?(:keys)
152
+ options[:out][OUT_ACTIONS.find { |action| options[:out][action] }]
153
+ end || options[:out]
146
154
  end
147
155
  end
148
156
  end
@@ -77,7 +77,7 @@ module Mongo
77
77
  end
78
78
 
79
79
  def send_initial_query(server)
80
- validate_collation!(server, options)
80
+ validate_collation!(server, collation)
81
81
  initial_query_op(server).execute(server)
82
82
  end
83
83
  end
@@ -107,7 +107,7 @@ module Mongo
107
107
  @view = view
108
108
  @map = map.freeze
109
109
  @reduce = reduce.freeze
110
- @options = options.freeze
110
+ @options = BSON::Document.new(options).freeze
111
111
  end
112
112
 
113
113
  # Set or get the jsMode flag for the operation.
@@ -237,7 +237,7 @@ module Mongo
237
237
  end
238
238
 
239
239
  def validate_collation!(server)
240
- if (options[:collation] || options[Operation::COLLATION]) && !server.features.collation_enabled?
240
+ if (view.options[:collation] || options[:collation]) && !server.features.collation_enabled?
241
241
  raise Error::UnsupportedCollation.new
242
242
  end
243
243
  end
@@ -112,31 +112,30 @@ module Mongo
112
112
  # @example Get the number of documents in the collection.
113
113
  # collection_view.count
114
114
  #
115
- # @param [ Hash ] options Options for the count command.
115
+ # @param [ Hash ] opts Options for the count command.
116
116
  #
117
- # @option options :skip [ Integer ] The number of documents to skip.
118
- # @option options :hint [ Hash ] Override default index selection and force
117
+ # @option opts :skip [ Integer ] The number of documents to skip.
118
+ # @option opts :hint [ Hash ] Override default index selection and force
119
119
  # MongoDB to use a specific index for the query.
120
- # @option options :limit [ Integer ] Max number of docs to return.
121
- # @option options :max_time_ms [ Integer ] The maximum amount of time to allow the
120
+ # @option opts :limit [ Integer ] Max number of docs to return.
121
+ # @option opts :max_time_ms [ Integer ] The maximum amount of time to allow the
122
122
  # command to run.
123
- # @option options [ Hash ] :read The read preference options.
124
- # @option options [ Hash ] :collation The collation to use.
123
+ # @option opts [ Hash ] :read The read preference options.
124
+ # @option opts [ Hash ] :collation The collation to use.
125
125
  #
126
126
  # @return [ Integer ] The document count.
127
127
  #
128
128
  # @since 2.0.0
129
- def count(options = {})
129
+ def count(opts = {})
130
130
  cmd = { :count => collection.name, :query => filter }
131
- cmd[:skip] = options[:skip] if options[:skip]
132
- cmd[:hint] = options[:hint] if options[:hint]
133
- cmd[:limit] = options[:limit] if options[:limit]
134
- cmd[:maxTimeMS] = options[:max_time_ms] if options[:max_time_ms]
131
+ cmd[:skip] = opts[:skip] if opts[:skip]
132
+ cmd[:hint] = opts[:hint] if opts[:hint]
133
+ cmd[:limit] = opts[:limit] if opts[:limit]
134
+ cmd[:maxTimeMS] = opts[:max_time_ms] if opts[:max_time_ms]
135
135
  cmd[:readConcern] = collection.read_concern if collection.read_concern
136
- preference = ServerSelector.get(options[:read] || read_preference)
136
+ preference = ServerSelector.get(opts[:read] || read)
137
137
  server = preference.select_server(cluster)
138
- validate_collation!(server, options)
139
- cmd[:collation] = options[:collation] if options[:collation]
138
+ apply_collation!(cmd, server, opts)
140
139
  read_with_retry do
141
140
  Operation::Commands::Command.new({
142
141
  :selector => cmd,
@@ -154,26 +153,25 @@ module Mongo
154
153
  # collection_view.distinct('name')
155
154
  #
156
155
  # @param [ String, Symbol ] field_name The name of the field.
157
- # @param [ Hash ] options Options for the distinct command.
156
+ # @param [ Hash ] opts Options for the distinct command.
158
157
  #
159
- # @option options :max_time_ms [ Integer ] The maximum amount of time to allow the
158
+ # @option opts :max_time_ms [ Integer ] The maximum amount of time to allow the
160
159
  # command to run.
161
- # @option options [ Hash ] :read The read preference options.
162
- # @option options [ Hash ] :collation The collation to use.
160
+ # @option opts [ Hash ] :read The read preference options.
161
+ # @option opts [ Hash ] :collation The collation to use.
163
162
  #
164
163
  # @return [ Array<Object> ] The list of distinct values.
165
164
  #
166
165
  # @since 2.0.0
167
- def distinct(field_name, options={})
166
+ def distinct(field_name, opts = {})
168
167
  cmd = { :distinct => collection.name,
169
168
  :key => field_name.to_s,
170
169
  :query => filter }
171
- cmd[:maxTimeMS] = options[:max_time_ms] if options[:max_time_ms]
170
+ cmd[:maxTimeMS] = opts[:max_time_ms] if opts[:max_time_ms]
172
171
  cmd[:readConcern] = collection.read_concern if collection.read_concern
173
- preference = ServerSelector.get(options[:read] || read_preference)
172
+ preference = ServerSelector.get(opts[:read] || read)
174
173
  server = preference.select_server(cluster)
175
- validate_collation!(server, options)
176
- cmd[:collation] = options[:collation] if options[:collation]
174
+ apply_collation!(cmd, server, opts)
177
175
  read_with_retry do
178
176
  Operation::Commands::Command.new({
179
177
  :selector => cmd,
@@ -455,8 +453,12 @@ module Mongo
455
453
 
456
454
  private
457
455
 
456
+ def collation(doc = nil)
457
+ configure(:collation, doc)
458
+ end
459
+
458
460
  def default_read
459
- options[:read] || read_preference
461
+ options[:read] || collection.read_preference
460
462
  end
461
463
 
462
464
  def parallel_scan(cursor_count, options = {})
@@ -27,10 +27,14 @@ module Mongo
27
27
  # @example Find one document and delete it.
28
28
  # view.find_one_and_delete
29
29
  #
30
+ # @param [ Hash ] opts The options.
31
+ #
32
+ # @option opts [ Hash ] :collation The collation to use.
33
+ #
30
34
  # @return [ BSON::Document, nil ] The document, if found.
31
35
  #
32
36
  # @since 2.0.0
33
- def find_one_and_delete
37
+ def find_one_and_delete(opts = {})
34
38
  cmd = { :findandmodify => collection.name, :query => filter, :remove => true }
35
39
  cmd[:fields] = projection if projection
36
40
  cmd[:sort] = sort if sort
@@ -38,8 +42,7 @@ module Mongo
38
42
  cmd[:writeConcern] = write_concern.options if write_concern
39
43
 
40
44
  server = next_primary
41
- validate_collation!(server, options)
42
- cmd[:collation] = options[:collation] if options[:collation]
45
+ apply_collation!(cmd, server, opts)
43
46
 
44
47
  write_with_retry do
45
48
  Operation::Commands::Command.new({
@@ -66,6 +69,7 @@ module Mongo
66
69
  # not to skip document level validation.
67
70
  # @option options [ Hash ] :write_concern The write concern options.
68
71
  # Defaults to the collection's write concern.
72
+ # @option opts [ Hash ] :collation The collation to use.
69
73
  #
70
74
  # @return [ BSON::Document ] The document.
71
75
  #
@@ -88,6 +92,7 @@ module Mongo
88
92
  # not to skip document level validation.
89
93
  # @option opts [ Hash ] :write_concern The write concern options.
90
94
  # Defaults to the collection's write concern.
95
+ # @option opts [ Hash ] :collation The collation to use.
91
96
  #
92
97
  # @return [ BSON::Document ] The document.
93
98
  #
@@ -104,9 +109,8 @@ module Mongo
104
109
  cmd[:writeConcern] = write_concern.options if write_concern
105
110
 
106
111
  server = next_primary
107
- validate_collation!(server, options)
108
- cmd[:collation] = options[:collation] if options[:collation]
109
-
112
+ apply_collation!(cmd, server, opts)
113
+
110
114
  value = write_with_retry do
111
115
  Operation::Commands::Command.new({
112
116
  :selector => cmd,
@@ -207,16 +211,10 @@ module Mongo
207
211
 
208
212
  private
209
213
 
210
- def remove(value, opts)
211
- server = next_primary
212
- validate_collation!(server, opts)
214
+ def remove(value, opts = {})
213
215
  delete_doc = { Operation::Q => filter, Operation::LIMIT => value }
214
- # We must extract the collation at the String key as well so that if w == 0,
215
- # an error can be raised later when an OpCode is used.
216
- # Otherwise, the collation will silently not be sent.
217
- if collation = opts[:collation] || opts[Operation::COLLATION]
218
- delete_doc[:collation] = collation
219
- end
216
+ server = next_primary
217
+ apply_collation!(delete_doc, server, opts)
220
218
  write_with_retry do
221
219
  Operation::Write::Delete.new(
222
220
  :delete => delete_doc,
@@ -228,18 +226,12 @@ module Mongo
228
226
  end
229
227
 
230
228
  def update(spec, multi, opts)
231
- server = next_primary
232
- validate_collation!(server, opts)
233
229
  update_doc = { Operation::Q => filter,
234
230
  Operation::U => spec,
235
231
  Operation::MULTI => multi,
236
232
  Operation::UPSERT => !!opts[:upsert] }
237
- # We must extract the collation at the String key as well so that if w == 0,
238
- # an error can be raised later when an OpCode is used.
239
- # Otherwise, the collation will silently not be sent.
240
- if collation = opts[:collation] || opts[Operation::COLLATION]
241
- update_doc[:collation] = collation
242
- end
233
+ server = next_primary
234
+ apply_collation!(update_doc, server, opts)
243
235
  write_with_retry do
244
236
  Operation::Write::Update.new(
245
237
  :update => update_doc,
@@ -271,7 +271,8 @@ module Mongo
271
271
  end
272
272
 
273
273
  def validate_collation!(model, server)
274
- if (model[:collation] || model[Operation::COLLATION]) && !server.features.collation_enabled?
274
+ if (model[:collation] || model[Operation::COLLATION]) &&
275
+ !server.features.collation_enabled?
275
276
  raise Error::UnsupportedCollation.new
276
277
  end
277
278
  end
@@ -168,10 +168,11 @@ module Mongo
168
168
  #
169
169
  # @since 2.0.0
170
170
  AUTH_MECH_MAP = {
171
- 'PLAIN' => :plain,
172
- 'MONGODB-CR' => :mongodb_cr,
173
- 'GSSAPI' => :gssapi,
174
- 'SCRAM-SHA-1' => :scram
171
+ 'PLAIN' => :plain,
172
+ 'MONGODB-CR' => :mongodb_cr,
173
+ 'GSSAPI' => :gssapi,
174
+ 'MONGODB-X509' => :mongodb_x509,
175
+ 'SCRAM-SHA-1' => :scram
175
176
  }.freeze
176
177
 
177
178
  # Options that are allowed to appear more than once in the uri.
@@ -17,5 +17,5 @@ module Mongo
17
17
  # The current version of the driver.
18
18
  #
19
19
  # @since 2.0.0
20
- VERSION = '2.4.0'.freeze
20
+ VERSION = '2.4.1'.freeze
21
21
  end
@@ -30,5 +30,5 @@ Gem::Specification.new do |s|
30
30
  s.has_rdoc = 'yard'
31
31
  s.bindir = 'bin'
32
32
 
33
- s.add_dependency 'bson', '~> 4.2.0'
33
+ s.add_dependency 'bson', '>=4.2.1', '<5.0.0'
34
34
  end
@@ -189,7 +189,7 @@ describe Mongo::Collection::View::Aggregation do
189
189
  end
190
190
 
191
191
  it 'sets the options' do
192
- expect(aggregation.options).to eq(options)
192
+ expect(aggregation.options).to eq(BSON::Document.new(options))
193
193
  end
194
194
 
195
195
  it 'dups the options' do
@@ -213,23 +213,41 @@ describe Mongo::Collection::View::Aggregation do
213
213
  [{ "$match" => { "name" => "BANG" } }]
214
214
  end
215
215
 
216
- let(:options) do
217
- { collation: { locale: 'en_US', strength: 2 } }
218
- end
219
-
220
216
  let(:result) do
221
217
  aggregation.explain['$cursor']['queryPlanner']['collation']['locale']
222
218
  end
223
219
 
224
220
  context 'when the server selected supports collations', if: collation_enabled? do
225
221
 
226
- it 'applies the collation' do
227
- expect(result).to eq('en_US')
222
+ context 'when the collation key is a String' do
223
+
224
+ let(:options) do
225
+ { 'collation' => { locale: 'en_US', strength: 2 } }
226
+ end
227
+
228
+ it 'applies the collation' do
229
+ expect(result).to eq('en_US')
230
+ end
231
+ end
232
+
233
+ context 'when the collation key is a Symbol' do
234
+
235
+ let(:options) do
236
+ { collation: { locale: 'en_US', strength: 2 } }
237
+ end
238
+
239
+ it 'applies the collation' do
240
+ expect(result).to eq('en_US')
241
+ end
228
242
  end
229
243
  end
230
244
 
231
245
  context 'when the server selected does not support collations', unless: collation_enabled? do
232
246
 
247
+ let(:options) do
248
+ { collation: { locale: 'en_US', strength: 2 } }
249
+ end
250
+
233
251
  it 'raises an exception' do
234
252
  expect {
235
253
  result