mongoid 5.0.1 → 5.0.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +0 -0
- data.tar.gz.sig +0 -0
- data/CHANGELOG.md +2 -0
- data/README.md +0 -1
- data/lib/mongoid.rb +0 -7
- data/lib/mongoid/attributes.rb +2 -1
- data/lib/mongoid/attributes/nested.rb +3 -0
- data/lib/mongoid/clients.rb +0 -6
- data/lib/mongoid/clients/options.rb +0 -6
- data/lib/mongoid/clients/storage_options.rb +0 -3
- data/lib/mongoid/clients/thread_options.rb +0 -3
- data/lib/mongoid/config.rb +0 -7
- data/lib/mongoid/contextual/command.rb +0 -3
- data/lib/mongoid/contextual/mongo.rb +2 -2
- data/lib/mongoid/criteria.rb +6 -1
- data/lib/mongoid/extensions/hash.rb +1 -1
- data/lib/mongoid/indexable.rb +7 -5
- data/lib/mongoid/indexable/specification.rb +14 -0
- data/lib/mongoid/indexable/validators/options.rb +2 -1
- data/lib/mongoid/persistable/settable.rb +8 -1
- data/lib/mongoid/query_cache.rb +14 -4
- data/lib/mongoid/railtie.rb +1 -0
- data/lib/mongoid/relations/accessors.rb +3 -1
- data/lib/mongoid/relations/embedded/batchable.rb +5 -1
- data/lib/mongoid/relations/metadata.rb +3 -0
- data/lib/mongoid/tasks/database.rb +1 -1
- data/lib/mongoid/threaded.rb +0 -5
- data/lib/mongoid/version.rb +1 -1
- data/spec/app/models/bomb.rb +4 -0
- data/spec/app/models/building.rb +2 -1
- data/spec/app/models/building_address.rb +3 -1
- data/spec/app/models/courier_job.rb +4 -0
- data/spec/app/models/explosion.rb +4 -0
- data/spec/app/models/message.rb +3 -0
- data/spec/app/models/name.rb +1 -0
- data/spec/app/models/post.rb +3 -0
- data/spec/app/models/sandwich.rb +5 -0
- data/spec/app/models/shipment_address.rb +2 -0
- data/spec/mongoid/attributes/nested_spec.rb +77 -18
- data/spec/mongoid/attributes_spec.rb +13 -0
- data/spec/mongoid/criteria_spec.rb +52 -0
- data/spec/mongoid/document_spec.rb +37 -13
- data/spec/mongoid/indexable/specification_spec.rb +25 -0
- data/spec/mongoid/persistable_spec.rb +17 -0
- data/spec/mongoid/query_cache_spec.rb +51 -2
- data/spec/mongoid/relations/accessors_spec.rb +69 -0
- data/spec/mongoid/relations/embedded/many_spec.rb +63 -0
- data/spec/mongoid/relations/embedded/one_spec.rb +45 -0
- data/spec/mongoid/relations/metadata_spec.rb +16 -0
- data/spec/mongoid/relations/referenced/one_spec.rb +24 -0
- data/spec/mongoid/tasks/database_spec.rb +19 -0
- data/spec/spec_helper.rb +1 -8
- metadata +10 -2
- metadata.gz.sig +0 -0
@@ -47,7 +47,7 @@ module Mongoid
|
|
47
47
|
# ignore default index
|
48
48
|
unless index['name'] == '_id_'
|
49
49
|
key = index['key'].symbolize_keys
|
50
|
-
spec = model.index_specification(key)
|
50
|
+
spec = model.index_specification(key, index['name'])
|
51
51
|
unless spec
|
52
52
|
# index not specified
|
53
53
|
undefined_by_model[model] ||= []
|
data/lib/mongoid/threaded.rb
CHANGED
@@ -31,7 +31,6 @@ module Mongoid
|
|
31
31
|
hash[key] = "[mongoid]:#{key}-stack"
|
32
32
|
end
|
33
33
|
|
34
|
-
extend Gem::Deprecate
|
35
34
|
extend self
|
36
35
|
|
37
36
|
# Begin entry into a named thread local stack.
|
@@ -175,8 +174,6 @@ module Mongoid
|
|
175
174
|
def client_override
|
176
175
|
Thread.current[CLIENT_OVERRIDE_KEY]
|
177
176
|
end
|
178
|
-
alias :session_override :client_override
|
179
|
-
deprecate :session_override, :client_override, 2015, 12
|
180
177
|
|
181
178
|
# Set the global client override.
|
182
179
|
#
|
@@ -191,8 +188,6 @@ module Mongoid
|
|
191
188
|
def client_override=(name)
|
192
189
|
Thread.current[CLIENT_OVERRIDE_KEY] = name
|
193
190
|
end
|
194
|
-
alias :session_override= :client_override=
|
195
|
-
deprecate :session_override=, :client_override=, 2015, 12
|
196
191
|
|
197
192
|
# Get the current Mongoid scope.
|
198
193
|
#
|
data/lib/mongoid/version.rb
CHANGED
data/spec/app/models/building.rb
CHANGED
data/spec/app/models/message.rb
CHANGED
data/spec/app/models/name.rb
CHANGED
data/spec/app/models/post.rb
CHANGED
@@ -15,6 +15,9 @@ class Post
|
|
15
15
|
has_many :videos, validate: false
|
16
16
|
has_many :roles, validate: false
|
17
17
|
|
18
|
+
belongs_to :posteable, polymorphic: true
|
19
|
+
accepts_nested_attributes_for :posteable, autosave: true
|
20
|
+
|
18
21
|
scope :recent, ->{ where(created_at: { "$lt" => Time.now, "$gt" => 30.days.ago }) }
|
19
22
|
scope :posting, ->{ where(:content.in => [ "Posting" ]) }
|
20
23
|
scope :open, ->{ where(title: "open") }
|
data/spec/app/models/sandwich.rb
CHANGED
@@ -102,6 +102,19 @@ describe Mongoid::Attributes::Nested do
|
|
102
102
|
end
|
103
103
|
end
|
104
104
|
|
105
|
+
context "when the association is referenced in and polymorphic" do
|
106
|
+
|
107
|
+
it "infers the class name of the polymorphic with the inverse type" do
|
108
|
+
expect {
|
109
|
+
Post.create!(
|
110
|
+
title: "Some title",
|
111
|
+
posteable_type: "Sandwich",
|
112
|
+
posteable_attributes: { name: 'Grilled Cheese' }
|
113
|
+
)
|
114
|
+
}.not_to raise_error
|
115
|
+
end
|
116
|
+
end
|
117
|
+
|
105
118
|
context "when the relation is an embedded in" do
|
106
119
|
|
107
120
|
before do
|
@@ -4788,38 +4801,84 @@ describe Mongoid::Attributes::Nested do
|
|
4788
4801
|
league.divisions.create(name: "Old Name")
|
4789
4802
|
end
|
4790
4803
|
|
4791
|
-
|
4792
|
-
{ divisions_attributes:
|
4793
|
-
{ "0" => { id: division.id.to_s, name: "New Name" }}
|
4794
|
-
}
|
4795
|
-
end
|
4804
|
+
context "when additional validation is set" do
|
4796
4805
|
|
4797
|
-
|
4798
|
-
|
4799
|
-
|
4806
|
+
before do
|
4807
|
+
League.validates_presence_of(:divisions)
|
4808
|
+
end
|
4800
4809
|
|
4801
|
-
|
4802
|
-
|
4803
|
-
|
4810
|
+
after do
|
4811
|
+
League.reset_callbacks(:validate)
|
4812
|
+
end
|
4804
4813
|
|
4805
|
-
|
4814
|
+
context "when validation fails" do
|
4806
4815
|
|
4807
|
-
|
4808
|
-
|
4816
|
+
let(:division) do
|
4817
|
+
Division.new
|
4818
|
+
end
|
4819
|
+
|
4820
|
+
let(:league) do
|
4821
|
+
League.create!(divisions: [division])
|
4822
|
+
end
|
4823
|
+
|
4824
|
+
let(:error_raising_update) do
|
4825
|
+
league.update!(:divisions => nil)
|
4826
|
+
end
|
4827
|
+
|
4828
|
+
before do
|
4829
|
+
league.update(:divisions => nil)
|
4830
|
+
league.reload
|
4831
|
+
end
|
4832
|
+
|
4833
|
+
it "the update raises an error" do
|
4834
|
+
expect{ error_raising_update }.to raise_error
|
4835
|
+
end
|
4836
|
+
|
4837
|
+
it "the update does not occur" do
|
4838
|
+
expect(league.divisions.first).to eq(division)
|
4839
|
+
end
|
4840
|
+
|
4841
|
+
it "the document is inaccurately marked destroyed (you fixed the bug if you broke this!)" do
|
4842
|
+
expect(division).to be_destroyed
|
4843
|
+
end
|
4809
4844
|
end
|
4845
|
+
end
|
4810
4846
|
|
4811
|
-
|
4847
|
+
context "when no additional validation is set" do
|
4848
|
+
|
4849
|
+
let(:params) do
|
4812
4850
|
{ divisions_attributes:
|
4813
|
-
{ "0" => { id: division.id.to_s, name: "Name" }}
|
4851
|
+
{ "0" => { id: division.id.to_s, name: "New Name" }}
|
4814
4852
|
}
|
4815
4853
|
end
|
4816
4854
|
|
4817
4855
|
before do
|
4818
|
-
league.update_attributes(
|
4856
|
+
league.update_attributes(params)
|
4819
4857
|
end
|
4820
4858
|
|
4821
4859
|
it "sets the nested attributes" do
|
4822
|
-
expect(league.reload.divisions.first.name).to eq("Name")
|
4860
|
+
expect(league.reload.divisions.first.name).to eq("New Name")
|
4861
|
+
end
|
4862
|
+
|
4863
|
+
context "with corrupted data" do
|
4864
|
+
|
4865
|
+
before do
|
4866
|
+
league[:league] = params
|
4867
|
+
end
|
4868
|
+
|
4869
|
+
let(:new_params) do
|
4870
|
+
{ divisions_attributes:
|
4871
|
+
{ "0" => { id: division.id.to_s, name: "Name" }}
|
4872
|
+
}
|
4873
|
+
end
|
4874
|
+
|
4875
|
+
before do
|
4876
|
+
league.update_attributes(new_params)
|
4877
|
+
end
|
4878
|
+
|
4879
|
+
it "sets the nested attributes" do
|
4880
|
+
expect(league.reload.divisions.first.name).to eq("Name")
|
4881
|
+
end
|
4823
4882
|
end
|
4824
4883
|
end
|
4825
4884
|
end
|
@@ -1207,6 +1207,19 @@ describe Mongoid::Attributes do
|
|
1207
1207
|
}.to raise_error(Mongoid::Errors::InvalidValue)
|
1208
1208
|
end
|
1209
1209
|
end
|
1210
|
+
|
1211
|
+
context "when attribute is localized and #attributes is a BSON::Document" do
|
1212
|
+
let(:dictionary) { Dictionary.new }
|
1213
|
+
|
1214
|
+
before do
|
1215
|
+
allow(dictionary).to receive(:attributes).and_return(BSON::Document.new)
|
1216
|
+
end
|
1217
|
+
|
1218
|
+
it "sets the value for the current locale" do
|
1219
|
+
dictionary.write_attribute(:description, 'foo')
|
1220
|
+
expect(dictionary.description).to eq('foo')
|
1221
|
+
end
|
1222
|
+
end
|
1210
1223
|
end
|
1211
1224
|
|
1212
1225
|
describe "#typed_value_for" do
|
@@ -3254,6 +3254,25 @@ describe Mongoid::Criteria do
|
|
3254
3254
|
expect(criteria.selector).to eq({ "agent_ids" => [ id_one, id_two ]})
|
3255
3255
|
end
|
3256
3256
|
end
|
3257
|
+
|
3258
|
+
context "when querying on a big decimal" do
|
3259
|
+
|
3260
|
+
let(:sales) do
|
3261
|
+
BigDecimal.new('0.1')
|
3262
|
+
end
|
3263
|
+
|
3264
|
+
let!(:band) do
|
3265
|
+
Band.create(name: "Boards of Canada", sales: sales)
|
3266
|
+
end
|
3267
|
+
|
3268
|
+
let(:from_db) do
|
3269
|
+
Band.where(sales: sales).first
|
3270
|
+
end
|
3271
|
+
|
3272
|
+
it "finds the document by the big decimal value" do
|
3273
|
+
expect(from_db).to eq(band)
|
3274
|
+
end
|
3275
|
+
end
|
3257
3276
|
end
|
3258
3277
|
end
|
3259
3278
|
|
@@ -3468,4 +3487,37 @@ describe Mongoid::Criteria do
|
|
3468
3487
|
end
|
3469
3488
|
end
|
3470
3489
|
end
|
3490
|
+
|
3491
|
+
describe "#type_selection" do
|
3492
|
+
|
3493
|
+
context "when only one subclass exists" do
|
3494
|
+
|
3495
|
+
let(:criteria) do
|
3496
|
+
described_class.new(Firefox)
|
3497
|
+
end
|
3498
|
+
|
3499
|
+
let(:selection) do
|
3500
|
+
criteria.send(:type_selection)
|
3501
|
+
end
|
3502
|
+
|
3503
|
+
it "does not use an $in query" do
|
3504
|
+
expect(selection).to eq({ _type: "Firefox" })
|
3505
|
+
end
|
3506
|
+
end
|
3507
|
+
|
3508
|
+
context "when more than one subclass exists" do
|
3509
|
+
|
3510
|
+
let(:criteria) do
|
3511
|
+
described_class.new(Browser)
|
3512
|
+
end
|
3513
|
+
|
3514
|
+
let(:selection) do
|
3515
|
+
criteria.send(:type_selection)
|
3516
|
+
end
|
3517
|
+
|
3518
|
+
it "does not use an $in query" do
|
3519
|
+
expect(selection).to eq({ _type: { "$in" => [ "Firefox", "Browser" ]}})
|
3520
|
+
end
|
3521
|
+
end
|
3522
|
+
end
|
3471
3523
|
end
|
@@ -613,25 +613,49 @@ describe Mongoid::Document do
|
|
613
613
|
Person.new
|
614
614
|
end
|
615
615
|
|
616
|
-
context "when
|
616
|
+
context "when freezing the model" do
|
617
617
|
|
618
|
-
|
619
|
-
|
620
|
-
|
618
|
+
context "when not frozen" do
|
619
|
+
|
620
|
+
it "freezes attributes" do
|
621
|
+
expect(person.freeze).to eq(person)
|
622
|
+
expect { person.title = "something" }.to raise_error
|
623
|
+
end
|
621
624
|
end
|
622
|
-
end
|
623
625
|
|
624
|
-
|
626
|
+
context "when frozen" do
|
625
627
|
|
626
|
-
|
627
|
-
|
628
|
+
before do
|
629
|
+
person.raw_attributes.freeze
|
630
|
+
end
|
631
|
+
|
632
|
+
it "keeps things frozen" do
|
633
|
+
person.freeze
|
634
|
+
expect {
|
635
|
+
person.title = "something"
|
636
|
+
}.to raise_error
|
637
|
+
end
|
628
638
|
end
|
639
|
+
end
|
629
640
|
|
630
|
-
|
631
|
-
|
632
|
-
|
633
|
-
|
634
|
-
|
641
|
+
context "when freezing attributes of the model" do
|
642
|
+
|
643
|
+
context "when assigning a frozen value" do
|
644
|
+
|
645
|
+
context "when the frozen value is a hash" do
|
646
|
+
|
647
|
+
let(:hash) do
|
648
|
+
{"foo" => {"bar" => {"baz" => [1,2,3]}}}
|
649
|
+
end
|
650
|
+
|
651
|
+
let(:assign_hash) do
|
652
|
+
person.map = hash.freeze
|
653
|
+
end
|
654
|
+
|
655
|
+
it "no mutation occurs during assignment" do
|
656
|
+
expect{ assign_hash }.not_to raise_error
|
657
|
+
end
|
658
|
+
end
|
635
659
|
end
|
636
660
|
end
|
637
661
|
end
|
@@ -99,4 +99,29 @@ describe Mongoid::Indexable::Specification do
|
|
99
99
|
expect(spec.options).to eq(background: true, drop_dups: true)
|
100
100
|
end
|
101
101
|
end
|
102
|
+
|
103
|
+
describe '#name' do
|
104
|
+
|
105
|
+
context 'when there is only one field' do
|
106
|
+
|
107
|
+
let(:spec) do
|
108
|
+
described_class.new(Band, { name: 1 })
|
109
|
+
end
|
110
|
+
|
111
|
+
it 'returns the key and direction separated by an underscore' do
|
112
|
+
expect(spec.name).to eq('name_1')
|
113
|
+
end
|
114
|
+
end
|
115
|
+
|
116
|
+
context 'when there are two fields' do
|
117
|
+
|
118
|
+
let(:spec) do
|
119
|
+
described_class.new(Band, { name: 1, title: -1 })
|
120
|
+
end
|
121
|
+
|
122
|
+
it 'returns the keys and directions separated by underscores' do
|
123
|
+
expect(spec.name).to eq('name_1_title_-1')
|
124
|
+
end
|
125
|
+
end
|
126
|
+
end
|
102
127
|
end
|
@@ -203,4 +203,21 @@ describe Mongoid::Persistable do
|
|
203
203
|
}.to raise_error(Mongoid::Errors::Callback)
|
204
204
|
end
|
205
205
|
end
|
206
|
+
|
207
|
+
example "able use set value using dot notation" do
|
208
|
+
class Customer
|
209
|
+
include Mongoid::Document
|
210
|
+
|
211
|
+
field :address, type: Hash, default: -> {{}}
|
212
|
+
end
|
213
|
+
|
214
|
+
customer = Customer.new
|
215
|
+
customer.save
|
216
|
+
customer.set 'address.country' => 'India'
|
217
|
+
expect(customer.address).to eql({ 'country' => 'India' })
|
218
|
+
customer.set 'address.country.state' => 'MH'
|
219
|
+
expect(customer.address).to eql({'country' => { 'state' => 'MH' }})
|
220
|
+
customer.set 'address' => { 'country' => 'India'}
|
221
|
+
expect(customer.address).to eql({ 'country' => 'India' })
|
222
|
+
end
|
206
223
|
end
|