mongoid 5.1.5 → 5.1.6

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: abf3bc71acef310e6e22c9900a173ef44adcffe9
4
- data.tar.gz: 3178495b48b2377e77929352b9349c02adee7017
3
+ metadata.gz: 30bdab646c31a7e88e39456de765a87455bbe1ff
4
+ data.tar.gz: d8ebddf7e3b5dc3838bbc57277e34c5abce7dfc1
5
5
  SHA512:
6
- metadata.gz: 16106f196625909b1bbefd3bea0ab5e7b3397cd8055108c01c7f5b1ae7dc485810a9fa78ab5975b3794e2db8a2fe2b82d9c8d3e18b69e762f2ff994727397eba
7
- data.tar.gz: e08c0e8efaa17427d5d3e329322dd367b72a44eb5f3a5c9e2d0d1c9bf5d4bebcae313ee155dbb5f78578cd98a767f2a7e78fad5747c87221176da465321384ab
6
+ metadata.gz: 1812af097622c5a03c8819da5e55c0ebba39f1aace28a394a4e72b05a71532f9f710dda776d72c734d5326daa918d890ac8991ca7a34cd94296630fbfd32dda3
7
+ data.tar.gz: 974bebd0d9e74d07c93c9b242328656fb572e21d1ed9de634c5e1268d736fe0e61dac80a6c99e16cfc7a1fbefd28a8d5553dc67360f051508bd83402b84a52df
Binary file
data.tar.gz.sig CHANGED
Binary file
@@ -124,7 +124,6 @@ module Mongoid
124
124
  def pipeline(field)
125
125
  db_field = "$#{database_field_name(field)}"
126
126
  pipeline = []
127
- pipeline << { "$match" => criteria.selector }
128
127
  pipeline << { "$match" => criteria.exists(field => true).selector }
129
128
  pipeline << { "$sort" => criteria.options[:sort] } if criteria.options[:sort]
130
129
  pipeline << { "$skip" => criteria.options[:skip] } if criteria.options[:skip]
@@ -299,7 +299,7 @@ module Mongoid
299
299
  # @since 3.0.0
300
300
  def results
301
301
  raise Errors::NoMapReduceOutput.new(command) unless command[:out]
302
- @results ||= __client__.command(command).first
302
+ @results ||= __client__.command(command,__client__.options).first
303
303
  end
304
304
 
305
305
  # Get the client with the proper consistency.
@@ -653,6 +653,7 @@ module Mongoid
653
653
  # @since 3.0.0
654
654
  def documents_for_iteration
655
655
  return documents if cached? && !documents.empty?
656
+ return view unless eager_loadable?
656
657
  docs = view.map{ |doc| Factory.from_db(klass, doc, criteria.options[:fields]) }
657
658
  eager_load(docs)
658
659
  end
@@ -670,8 +671,10 @@ module Mongoid
670
671
  #
671
672
  # @since 3.0.0
672
673
  def yield_document(document, &block)
673
- yield(document)
674
- documents.push(document) if cacheable?
674
+ doc = document.respond_to?(:_id) ?
675
+ document : Factory.from_db(klass, document, criteria.options[:fields])
676
+ yield(doc)
677
+ documents.push(doc) if cacheable?
675
678
  end
676
679
  end
677
680
  end
@@ -77,9 +77,14 @@ module Mongoid
77
77
  # @since 3.0.0
78
78
  def lookup(object)
79
79
  locale = ::I18n.locale
80
- if value = object[locale.to_s]
81
- value
82
- elsif fallbacks? && ::I18n.respond_to?(:fallbacks)
80
+
81
+ value = if object.key?(locale.to_s)
82
+ object[locale.to_s]
83
+ elsif object.key?(locale)
84
+ object[locale]
85
+ end
86
+ return value unless value.nil?
87
+ if fallbacks? && ::I18n.respond_to?(:fallbacks)
83
88
  object[::I18n.fallbacks[locale].map(&:to_s).find{ |loc| object.has_key?(loc) }]
84
89
  end
85
90
  end
@@ -70,6 +70,20 @@ module Mongoid
70
70
  ensure
71
71
  QueryCache.enabled = enabled
72
72
  end
73
+
74
+ # Execute the block with the query cache disabled.
75
+ #
76
+ # @example Execute without the cache.
77
+ # QueryCache.uncached { collection.find }
78
+ #
79
+ # @return [ Object ] The result of the block.
80
+ def uncached
81
+ enabled = QueryCache.enabled?
82
+ QueryCache.enabled = false
83
+ yield
84
+ ensure
85
+ QueryCache.enabled = enabled
86
+ end
73
87
  end
74
88
 
75
89
  # The middleware to be added to a rack application in order to activate the
@@ -222,7 +236,7 @@ module Mongoid
222
236
 
223
237
  def cached_cursor
224
238
  if limit
225
- key = [ collection.namespace, selector, nil, skip, projection ]
239
+ key = [ collection.namespace, selector, nil, skip, sort, projection ]
226
240
  cursor = QueryCache.cache_table[key]
227
241
  if cursor
228
242
  limited_docs = cursor.to_a[0...limit.abs]
@@ -233,7 +247,7 @@ module Mongoid
233
247
  end
234
248
 
235
249
  def cache_key
236
- [ collection.namespace, selector, limit, skip, projection ]
250
+ [ collection.namespace, selector, limit, skip, sort, projection ]
237
251
  end
238
252
 
239
253
  def system_collection?
@@ -252,8 +266,16 @@ module Mongoid
252
266
  alias_query_cache_clear :insert_one, :insert_many
253
267
  end
254
268
  end
269
+
270
+ # Bypass the query cache when reloading a document.
271
+ module Document
272
+ def reload
273
+ QueryCache.uncached { super }
274
+ end
275
+ end
255
276
  end
256
277
  end
257
278
 
258
279
  Mongo::Collection.__send__(:include, Mongoid::QueryCache::Collection)
259
280
  Mongo::Collection::View.__send__(:include, Mongoid::QueryCache::View)
281
+ Mongoid::Document.__send__(:include, Mongoid::QueryCache::Document)
@@ -1,4 +1,4 @@
1
1
  # encoding: utf-8
2
2
  module Mongoid
3
- VERSION = "5.1.5"
3
+ VERSION = "5.1.6"
4
4
  end
@@ -331,6 +331,31 @@ describe Mongoid::Contextual::MapReduce do
331
331
  end
332
332
  end
333
333
 
334
+ describe "#raw" do
335
+ let(:criteria) { Band.all }
336
+ let(:client) { collection.database.client }
337
+ let(:map_reduce) { described_class.new(collection, criteria, map, reduce) }
338
+
339
+ subject { map_reduce.raw }
340
+
341
+ it { expect{subject}.to raise_error(Mongoid::Errors::NoMapReduceOutput) }
342
+
343
+ context "when providing inline" do
344
+ let!(:out) { map_reduce.out(inline: 1) }
345
+
346
+ before { allow(client).to receive(:command).and_return(['result', 'from', 'client.command']) }
347
+
348
+ it "passes the command to the client, using the client options" do
349
+ expect(client).to receive(:command).with(out.command, client.options)
350
+ subject
351
+ end
352
+
353
+ it "returns the first element from the result array of client.command" do
354
+ expect(subject).to eq('result')
355
+ end
356
+ end
357
+ end
358
+
334
359
  describe "#reduced" do
335
360
 
336
361
  let(:criteria) do
@@ -398,9 +398,22 @@ describe Mongoid::Contextual::Mongo do
398
398
 
399
399
  context "when iterating with next" do
400
400
 
401
+ before do
402
+ 10.times { |i| Band.create(name: "Test #{i}") }
403
+ end
404
+
405
+ let(:criteria) do
406
+ Band.batch_size(5)
407
+ end
408
+
401
409
  it "yields mongoid documents" do
402
410
  expect(enum.next).to be_a(Mongoid::Document)
403
411
  end
412
+
413
+ it "does not load all documents" do
414
+ expect(Mongo::Logger.logger).to receive(:debug?).exactly(2).times.and_call_original
415
+ enum.next
416
+ end
404
417
  end
405
418
  end
406
419
  end
@@ -1715,26 +1728,31 @@ describe Mongoid::Contextual::Mongo do
1715
1728
 
1716
1729
  describe '#pipeline' do
1717
1730
 
1718
- context 'when the criteria has a selector' do
1731
+ context 'when the criteria has a selector', if: non_legacy_server? do
1732
+
1733
+ before do
1734
+ Artist.index(name: "text")
1735
+ Artist.create_indexes
1736
+ end
1719
1737
 
1720
1738
  let(:criteria) do
1721
- Band.where(name: "New Order")
1739
+ Artist.text_search("New Order")
1722
1740
  end
1723
1741
 
1724
1742
  let(:context) do
1725
1743
  described_class.new(criteria)
1726
1744
  end
1727
1745
 
1728
- let(:matches_operators) do
1729
- context.send(:pipeline, 'name').select { |o| o['$match'] }
1746
+ let(:pipeline_match) do
1747
+ context.send(:pipeline, :some_field).first['$match']
1730
1748
  end
1731
1749
 
1732
1750
  it 'creates a pipeline with the selector as one of the $match criteria' do
1733
- expect(matches_operators).to include('$match' => criteria.selector)
1751
+ expect(pipeline_match).to include({ :'$text' => { :'$search' => "New Order" } })
1734
1752
  end
1735
1753
 
1736
1754
  it 'creates a pipeline with the $exists operator as one of the $match criteria' do
1737
- expect(matches_operators).to include('$match' => { 'name' => { '$exists' => true } })
1755
+ expect(pipeline_match).to include({ 'some_field' => { '$exists' => true } })
1738
1756
  end
1739
1757
  end
1740
1758
  end
@@ -3078,14 +3078,14 @@ describe Mongoid::Criteria do
3078
3078
  context "when not including private methods" do
3079
3079
 
3080
3080
  it "returns false" do
3081
- expect(criteria).to_not respond_to(:fork)
3081
+ expect(criteria).to_not respond_to(:initialize_copy)
3082
3082
  end
3083
3083
  end
3084
3084
 
3085
3085
  context "when including private methods" do
3086
3086
 
3087
3087
  it "returns true" do
3088
- expect(criteria.respond_to?(:fork, true)).to be true
3088
+ expect(criteria.respond_to?(:initialize_copy, true)).to be true
3089
3089
  end
3090
3090
  end
3091
3091
  end
@@ -281,7 +281,7 @@ describe Mongoid::Extensions::Time do
281
281
  end
282
282
 
283
283
  it "does not alter seconds with fractions" do
284
- expect(DateTime.mongoize(11.11).to_f).to eq(11.11)
284
+ expect(DateTime.mongoize(1.11).to_f).to eq(1.11)
285
285
  end
286
286
 
287
287
  context "when using the ActiveSupport time zone" do
@@ -344,7 +344,7 @@ describe Mongoid::Extensions::Time do
344
344
  end
345
345
 
346
346
  it "does not alter seconds with fractions" do
347
- expect(Time.mongoize(102.63).to_f).to eq(102.63)
347
+ expect(Time.mongoize(102.25).to_f).to eq(102.25)
348
348
  end
349
349
  end
350
350
 
@@ -430,6 +430,97 @@ describe Mongoid::Fields::Localized do
430
430
  expect(value).to eq({ "de" => 100 })
431
431
  end
432
432
  end
433
+
434
+ context 'when the type is Boolean' do
435
+
436
+ before do
437
+ I18n.enforce_available_locales = false
438
+ ::I18n.locale = :de
439
+ end
440
+
441
+ after do
442
+ ::I18n.locale = :en
443
+ end
444
+
445
+ context "when the value is false" do
446
+
447
+ let(:field) do
448
+ described_class.new(:boolean_value, localize: true, type: Boolean)
449
+ end
450
+
451
+ let(:value) do
452
+ field.demongoize({ "de" => false })
453
+ end
454
+
455
+ it "returns the boolean value from the set locale" do
456
+ expect(value).to eq(false)
457
+ end
458
+ end
459
+
460
+ context "when the value is true" do
461
+
462
+ let(:field) do
463
+ described_class.new(:boolean_value, localize: true, type: Boolean)
464
+ end
465
+
466
+ let(:value) do
467
+ field.demongoize({"de" => true})
468
+ end
469
+
470
+ it "returns the boolean value from the set locale" do
471
+ expect(value).to eq(true)
472
+ end
473
+ end
474
+
475
+ context "when fallbacks are defined" do
476
+
477
+ before(:all) do
478
+ require "i18n/backend/fallbacks"
479
+ I18n::Backend::Simple.send(:include, I18n::Backend::Fallbacks)
480
+ end
481
+
482
+ context "when the lookup does not need to use fallbacks" do
483
+
484
+ context "when the value is false" do
485
+
486
+ before do
487
+ ::I18n.fallbacks[:de] = [:en, :es]
488
+ end
489
+
490
+ let(:field) do
491
+ described_class.new(:boolean_value, localize: true, type: Boolean)
492
+ end
493
+
494
+ let(:value) do
495
+ field.demongoize({"de" => false})
496
+ end
497
+
498
+ it "returns the boolean value from the set locale" do
499
+ expect(value).to eq(false)
500
+ end
501
+ end
502
+
503
+ context "when the value is true" do
504
+
505
+ before do
506
+ ::I18n.fallbacks[:de] = [:en, :es]
507
+ end
508
+
509
+ let(:field) do
510
+ described_class.new(:boolean_value, localize: true, type: Boolean)
511
+ end
512
+
513
+ let(:value) do
514
+ field.demongoize({"de" => true})
515
+ end
516
+
517
+ it "returns the boolean value from the set locale" do
518
+ expect(value).to eq(true)
519
+ end
520
+ end
521
+ end
522
+ end
523
+ end
433
524
  end
434
525
  end
435
526
  end
@@ -149,6 +149,7 @@ describe Mongoid::Indexable do
149
149
  Class.new do
150
150
  include Mongoid::Document
151
151
  field :a, as: :authentication_token
152
+ store_in collection: :specs
152
153
  end
153
154
  end
154
155
 
@@ -173,6 +173,27 @@ describe Mongoid::QueryCache do
173
173
  end
174
174
  end
175
175
 
176
+ context "when sorting documents" do
177
+ before do
178
+ Band.asc(:id).to_a
179
+ end
180
+
181
+ context "with different selector" do
182
+
183
+ it "queries again" do
184
+ expect_query(1) do
185
+ Band.desc(:id).to_a
186
+ end
187
+ end
188
+ end
189
+
190
+ it "does not query again" do
191
+ expect_query(0) do
192
+ Band.asc(:id).to_a
193
+ end
194
+ end
195
+ end
196
+
176
197
  context "when query caching is enabled and the batch_size is set" do
177
198
 
178
199
  around(:each) do |example|
@@ -250,6 +271,37 @@ describe Mongoid::QueryCache do
250
271
  end
251
272
  end
252
273
 
274
+ context "when reloading a document" do
275
+
276
+ let!(:band_id) do
277
+ Band.create.id
278
+ end
279
+
280
+ context 'when query cache is disabled' do
281
+
282
+ before do
283
+ Mongoid::QueryCache.enabled = false
284
+ end
285
+
286
+ it "queries again" do
287
+ band = Band.find(band_id)
288
+ expect_query(1) do
289
+ band.reload
290
+ end
291
+ end
292
+ end
293
+
294
+ context 'when query cache is enabled' do
295
+
296
+ it "queries again" do
297
+ band = Band.find(band_id)
298
+ expect_query(1) do
299
+ band.reload
300
+ end
301
+ end
302
+ end
303
+ end
304
+
253
305
  context "when querying a very large collection" do
254
306
 
255
307
  before do
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mongoid
3
3
  version: !ruby/object:Gem::Version
4
- version: 5.1.5
4
+ version: 5.1.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - Durran Jordan
@@ -12,7 +12,7 @@ cert_chain:
12
12
  -----BEGIN CERTIFICATE-----
13
13
  MIIDfDCCAmSgAwIBAgIBATANBgkqhkiG9w0BAQUFADBCMRQwEgYDVQQDDAtkcml2
14
14
  ZXItcnVieTEVMBMGCgmSJomT8ixkARkWBTEwZ2VuMRMwEQYKCZImiZPyLGQBGRYD
15
- Y29tMB4XDTE1MTEwMzE0NTUwNFoXDTE2MTEwMjE0NTUwNFowQjEUMBIGA1UEAwwL
15
+ Y29tMB4XDTE2MTIwMTE0MDcxMloXDTE3MTIwMTE0MDcxMlowQjEUMBIGA1UEAwwL
16
16
  ZHJpdmVyLXJ1YnkxFTATBgoJkiaJk/IsZAEZFgUxMGdlbjETMBEGCgmSJomT8ixk
17
17
  ARkWA2NvbTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANFdSAa8fRm1
18
18
  bAM9za6Z0fAH4g02bqM1NGnw8zJQrE/PFrFfY6IFCT2AsLfOwr1maVm7iU1+kdVI
@@ -23,14 +23,14 @@ cert_chain:
23
23
  u8KAcPHm5KkCAwEAAaN9MHswCQYDVR0TBAIwADALBgNVHQ8EBAMCBLAwHQYDVR0O
24
24
  BBYEFFt3WbF+9JpUjAoj62cQBgNb8HzXMCAGA1UdEQQZMBeBFWRyaXZlci1ydWJ5
25
25
  QDEwZ2VuLmNvbTAgBgNVHRIEGTAXgRVkcml2ZXItcnVieUAxMGdlbi5jb20wDQYJ
26
- KoZIhvcNAQEFBQADggEBAMwy++EdX3KKnivddRt3S9et0WVYusH2PwDRX9o4REcF
27
- mNcAtKnhN8OQ+irEGVNrqJFiHhUmuMo+v9FWJ5OA0/gKRUfFJAWj4WfBi3sRCPxv
28
- 7Hmy3V7Cz+nLCdUl4uoe0bn6wY/zpX8tHCtcLBLCy2aQ0ijbDwA5TdlkV8q5vPId
29
- ZS0pBTqHap4VMl2F63o6+qWdqhvikKM1NVYkTxUmvRlDjKM5sQAph7JOAaWjA6Fh
30
- ZIvvwAhgCjVW5QCi2I1noxXLmtZ3XDawWu8kaGtu8giHXcwL3941m8hvFZ/Wr9Yi
31
- JvcXJt2a4/JvwnIs2hmKuyfhZmB9HEE5wQQaCMnnC14=
26
+ KoZIhvcNAQEFBQADggEBAKBDaVkycCUC1zMfpAkXIgWtji2Nr2ZygYQR53AgxOaE
27
+ 7nqxdh5Lh8pnfwa71/ucrZFJt+g/mEhen9lFNmcizvpP43Hh4rYf8j6T8Y+mQ6tr
28
+ sp5xWiv93DlLXGmas0hv9VRYDvV1vLFaG05FHOAZKdo6pD2t6jNyMSAn4fMHKctw
29
+ UoYN5FLt84jacRQF5nhy9gBhfgvA19LcjeMLQC11x3fykDLzCXF2wEe5Q5iYaWvb
30
+ cGiNQIiHBj/9/xHfOyOthBPUevTiVnuffarDr434z/LGLwYzgaG5EcJFvZqpvUpP
31
+ fGcAPtAZUMGLXwcOB1BJEFkDxUQIJiEpSmf4YzzZhEM=
32
32
  -----END CERTIFICATE-----
33
- date: 2016-10-19 00:00:00.000000000 Z
33
+ date: 2016-12-01 00:00:00.000000000 Z
34
34
  dependencies:
35
35
  - !ruby/object:Gem::Dependency
36
36
  name: activemodel
@@ -812,7 +812,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
812
812
  version: 1.3.6
813
813
  requirements: []
814
814
  rubyforge_project: mongoid
815
- rubygems_version: 2.5.1
815
+ rubygems_version: 2.4.5.1
816
816
  signing_key:
817
817
  specification_version: 4
818
818
  summary: Elegant Persistence in Ruby for MongoDB.
metadata.gz.sig CHANGED
Binary file