mongoid 5.0.2 → 5.1.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 (55) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data.tar.gz.sig +0 -0
  4. data/LICENSE +1 -1
  5. data/README.md +1 -1
  6. data/lib/mongoid/changeable.rb +1 -1
  7. data/lib/mongoid/clients.rb +1 -0
  8. data/lib/mongoid/clients/options.rb +119 -7
  9. data/lib/mongoid/config.rb +7 -0
  10. data/lib/mongoid/config/options.rb +15 -0
  11. data/lib/mongoid/contextual/geo_near.rb +12 -0
  12. data/lib/mongoid/contextual/mongo.rb +6 -0
  13. data/lib/mongoid/criteria.rb +2 -56
  14. data/lib/mongoid/criteria/findable.rb +4 -1
  15. data/lib/mongoid/criteria/includable.rb +142 -0
  16. data/lib/mongoid/criteria/modifiable.rb +13 -1
  17. data/lib/mongoid/document.rb +21 -0
  18. data/lib/mongoid/fields/foreign_key.rb +5 -1
  19. data/lib/mongoid/fields/localized.rb +16 -1
  20. data/lib/mongoid/fields/validators/macro.rb +1 -0
  21. data/lib/mongoid/findable.rb +1 -0
  22. data/lib/mongoid/loggable.rb +1 -1
  23. data/lib/mongoid/matchable.rb +6 -1
  24. data/lib/mongoid/persistable.rb +2 -2
  25. data/lib/mongoid/relations/eager.rb +12 -5
  26. data/lib/mongoid/relations/eager/base.rb +3 -1
  27. data/lib/mongoid/relations/referenced/many.rb +39 -6
  28. data/lib/mongoid/relations/targets/enumerable.rb +3 -3
  29. data/lib/mongoid/scopable.rb +5 -2
  30. data/lib/mongoid/version.rb +1 -1
  31. data/spec/app/models/address.rb +2 -0
  32. data/spec/app/models/agent.rb +2 -0
  33. data/spec/app/models/alert.rb +2 -0
  34. data/spec/app/models/post.rb +1 -0
  35. data/spec/config/mongoid.yml +1 -0
  36. data/spec/mongoid/changeable_spec.rb +1 -1
  37. data/spec/mongoid/clients/options_spec.rb +57 -0
  38. data/spec/mongoid/config_spec.rb +38 -0
  39. data/spec/mongoid/contextual/geo_near_spec.rb +19 -0
  40. data/spec/mongoid/criteria/findable_spec.rb +11 -0
  41. data/spec/mongoid/criteria/modifiable_spec.rb +126 -0
  42. data/spec/mongoid/criteria_spec.rb +81 -5
  43. data/spec/mongoid/document_spec.rb +56 -0
  44. data/spec/mongoid/fields/foreign_key_spec.rb +23 -0
  45. data/spec/mongoid/fields/localized_spec.rb +32 -14
  46. data/spec/mongoid/matchable_spec.rb +127 -1
  47. data/spec/mongoid/persistable_spec.rb +24 -0
  48. data/spec/mongoid/relations/embedded/many_spec.rb +16 -0
  49. data/spec/mongoid/relations/referenced/many_spec.rb +60 -0
  50. data/spec/mongoid/relations/referenced/many_to_many_spec.rb +40 -0
  51. data/spec/mongoid/scopable_spec.rb +67 -0
  52. data/spec/spec_helper.rb +4 -0
  53. data/spec/support/authorization.rb +2 -1
  54. metadata +6 -5
  55. metadata.gz.sig +0 -0
@@ -168,6 +168,30 @@ describe Mongoid::Persistable do
168
168
 
169
169
  it_behaves_like "an atomically updatable root document"
170
170
  end
171
+
172
+ context "when nesting atomically calls" do
173
+
174
+ before do
175
+ class Band
176
+ def my_updates
177
+ atomically do |d|
178
+ d.set(name: "Placebo")
179
+ d.unset(:origin)
180
+ end
181
+ end
182
+ end
183
+ end
184
+
185
+ let!(:update) do
186
+ document.atomically do |doc|
187
+ doc.inc(member_count: 10)
188
+ doc.bit(likes: { and: 13 })
189
+ doc.my_updates
190
+ end
191
+ end
192
+
193
+ it_behaves_like "an atomically updatable root document"
194
+ end
171
195
  end
172
196
 
173
197
  context "when providing no block "do
@@ -3592,6 +3592,22 @@ describe Mongoid::Relations::Embedded::Many do
3592
3592
  it "properly orders the related objects" do
3593
3593
  expect(criteria.to_a).to eq([message_two, message_one, message_three])
3594
3594
  end
3595
+
3596
+ context "when the field to order on is an array of documents" do
3597
+
3598
+ before do
3599
+ person.aliases = [ { name: "A", priority: 3 }, { name: "B", priority: 4 }]
3600
+ person.save
3601
+ end
3602
+
3603
+ let!(:person2) do
3604
+ Person.create( aliases: [ { name: "C", priority: 1 }, { name: "D", priority: 2 }])
3605
+ end
3606
+
3607
+ it "allows ordering on a key of an embedded document" do
3608
+ expect(Person.all.order_by("aliases.0.priority" => 1).first).to eq(person2)
3609
+ end
3610
+ end
3595
3611
  end
3596
3612
 
3597
3613
  context "when using dot notation in a criteria" do
@@ -200,6 +200,24 @@ describe Mongoid::Relations::Referenced::Many do
200
200
  expect(person.changed).to eq([])
201
201
  end
202
202
 
203
+ context "when the related item has embedded relations" do
204
+
205
+ let!(:user) do
206
+ User.create
207
+ end
208
+
209
+ before do
210
+ p = Post.create(roles: [ Role.create ])
211
+ user.posts = [ p ]
212
+ user.save
213
+ end
214
+
215
+ it "add the document to the target" do
216
+ expect(user.posts.size).to eq(1)
217
+ expect(user.posts.first.roles.size).to eq(1)
218
+ end
219
+ end
220
+
203
221
  context "when saving another post" do
204
222
 
205
223
  before do
@@ -3514,6 +3532,24 @@ describe Mongoid::Relations::Referenced::Many do
3514
3532
  expect(artist.albums).to eq([ album ])
3515
3533
  end
3516
3534
  end
3535
+
3536
+ context 'when the relation already exists' do
3537
+
3538
+ before do
3539
+ artist.albums << album
3540
+ album.save
3541
+ artist.save
3542
+ expect(artist).not_to receive(:after_add_album)
3543
+ end
3544
+
3545
+ let(:reloaded_album) do
3546
+ Album.where(artist_id: artist.id).first
3547
+ end
3548
+
3549
+ it 'does not execute the callback when the relation is accessed' do
3550
+ expect(reloaded_album.artist.after_add_referenced_called).to be(nil)
3551
+ end
3552
+ end
3517
3553
  end
3518
3554
 
3519
3555
  context "when #delete or #clear with before_remove callback" do
@@ -3732,4 +3768,28 @@ describe Mongoid::Relations::Referenced::Many do
3732
3768
  expect(reloaded.name).to eq(new_child_name)
3733
3769
  end
3734
3770
  end
3771
+
3772
+ context 'when a document has referenced and embedded relations' do
3773
+
3774
+ let(:agent) do
3775
+ Agent.new
3776
+ end
3777
+
3778
+ let(:basic) do
3779
+ Basic.new
3780
+ end
3781
+
3782
+ let(:address) do
3783
+ Address.new
3784
+ end
3785
+
3786
+ before do
3787
+ agent.basics << basic
3788
+ agent.address = address
3789
+ end
3790
+
3791
+ it 'saves the document correctly' do
3792
+ expect(agent.save).to be(true)
3793
+ end
3794
+ end
3735
3795
  end
@@ -3535,4 +3535,44 @@ describe Mongoid::Relations::Referenced::ManyToMany do
3535
3535
  end
3536
3536
  end
3537
3537
  end
3538
+
3539
+ context "HABTM" do
3540
+ before do
3541
+ class Project
3542
+ include Mongoid::Document
3543
+
3544
+ field :n, type: String, as: :name
3545
+
3546
+ has_and_belongs_to_many :distributors,
3547
+ foreign_key: :d_ids,
3548
+ inverse_of: 'p',
3549
+ inverse_class_name: 'Distributor'
3550
+ end
3551
+
3552
+ class Distributor
3553
+ include Mongoid::Document
3554
+
3555
+ field :n, type: String, as: :name
3556
+
3557
+ has_and_belongs_to_many :projects,
3558
+ foreign_key: :p_ids,
3559
+ inverse_of: 'd',
3560
+ inverse_class_name: 'Project'
3561
+ end
3562
+ end
3563
+
3564
+ it "should assign relation from both sides" do
3565
+ p1 = Project.create name: 'Foo'
3566
+ p2 = Project.create name: 'Bar'
3567
+ d1 = Distributor.create name: 'Rock'
3568
+ d2 = Distributor.create name: 'Soul'
3569
+
3570
+ p1.distributors << d1
3571
+ expect(p1.d_ids).to match_array([d1.id])
3572
+ expect(d1.p_ids).to match_array([p1.id])
3573
+ d2.projects << p2
3574
+ expect(d2.p_ids).to match_array([p2.id])
3575
+ expect(p2.d_ids).to match_array([d2.id])
3576
+ end
3577
+ end
3538
3578
  end
@@ -27,6 +27,29 @@ describe Mongoid::Scopable do
27
27
  end
28
28
  end
29
29
 
30
+ context "when provided a block" do
31
+
32
+ let(:criteria) do
33
+ Band.where(name: "Depeche Mode")
34
+ end
35
+
36
+ before do
37
+ Band.default_scope { criteria }
38
+ end
39
+
40
+ after do
41
+ Band.default_scoping = nil
42
+ end
43
+
44
+ it "adds the default scope to the class" do
45
+ expect(Band.default_scoping.call).to eq(criteria)
46
+ end
47
+
48
+ it "flags as being default scoped" do
49
+ expect(Band).to be_default_scoping
50
+ end
51
+ end
52
+
30
53
  context "when provided a non proc" do
31
54
 
32
55
  it "raises an error" do
@@ -135,6 +158,31 @@ describe Mongoid::Scopable do
135
158
  it "returns an empty criteria" do
136
159
  expect(Band.queryable.selector).to be_empty
137
160
  end
161
+
162
+ context "when the class is not embedded" do
163
+
164
+ it "returns a criteria with embedded set to nil" do
165
+ expect(Band.queryable.embedded).to be(nil)
166
+ end
167
+ end
168
+
169
+ context "when the class is embedded" do
170
+
171
+ it "returns a criteria with embedded set to true" do
172
+ expect(Address.queryable.embedded).to be(true)
173
+ end
174
+
175
+ context "when scopes are chained" do
176
+
177
+ let(:person) do
178
+ Person.create
179
+ end
180
+
181
+ it "constructs a criteria for an embedded relation" do
182
+ expect(person.addresses.without_postcode_ordered.embedded).to be(true)
183
+ end
184
+ end
185
+ end
138
186
  end
139
187
 
140
188
  context "when a criteria exists on the stack" do
@@ -179,6 +227,25 @@ describe Mongoid::Scopable do
179
227
 
180
228
  context "when provided a criteria" do
181
229
 
230
+ context "when the lambda includes a geo_near query" do
231
+
232
+ before do
233
+ Bar.scope(:near_by, lambda{ |location| geo_near(location) })
234
+ end
235
+
236
+ after do
237
+ class << Bar
238
+ undef_method :near_by
239
+ end
240
+ Bar._declared_scopes.clear
241
+ end
242
+
243
+ it "allows the scope to be defined" do
244
+ expect(Bar.near_by([ 51.545099, -0.0106 ])).to be_a(Mongoid::Contextual::GeoNear)
245
+ end
246
+
247
+ end
248
+
182
249
  context "when a block is provided" do
183
250
 
184
251
  before do
@@ -71,6 +71,10 @@ def non_legacy_server?
71
71
  Mongoid::Clients.default.cluster.servers.first.features.write_command_enabled?
72
72
  end
73
73
 
74
+ def testing_locally?
75
+ !(ENV['CI'] == 'travis')
76
+ end
77
+
74
78
  # Set the database that the spec suite connects to.
75
79
  Mongoid.configure do |config|
76
80
  config.load_configuration(CONFIG)
@@ -7,6 +7,7 @@ MONGOID_ROOT_USER = Mongo::Auth::User.new(
7
7
  Mongo::Auth::Roles::USER_ADMIN_ANY_DATABASE,
8
8
  Mongo::Auth::Roles::DATABASE_ADMIN_ANY_DATABASE,
9
9
  Mongo::Auth::Roles::READ_WRITE_ANY_DATABASE,
10
- Mongo::Auth::Roles::HOST_MANAGER
10
+ Mongo::Auth::Roles::HOST_MANAGER,
11
+ Mongo::Auth::Roles::CLUSTER_MONITOR
11
12
  ]
12
13
  )
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.0.2
4
+ version: 5.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Durran Jordan
@@ -30,7 +30,7 @@ cert_chain:
30
30
  ZIvvwAhgCjVW5QCi2I1noxXLmtZ3XDawWu8kaGtu8giHXcwL3941m8hvFZ/Wr9Yi
31
31
  JvcXJt2a4/JvwnIs2hmKuyfhZmB9HEE5wQQaCMnnC14=
32
32
  -----END CERTIFICATE-----
33
- date: 2015-12-22 00:00:00.000000000 Z
33
+ date: 2016-01-26 00:00:00.000000000 Z
34
34
  dependencies:
35
35
  - !ruby/object:Gem::Dependency
36
36
  name: activemodel
@@ -80,14 +80,14 @@ dependencies:
80
80
  requirements:
81
81
  - - "~>"
82
82
  - !ruby/object:Gem::Version
83
- version: '2.1'
83
+ version: '2.2'
84
84
  type: :runtime
85
85
  prerelease: false
86
86
  version_requirements: !ruby/object:Gem::Requirement
87
87
  requirements:
88
88
  - - "~>"
89
89
  - !ruby/object:Gem::Version
90
- version: '2.1'
90
+ version: '2.2'
91
91
  description: Mongoid is an ODM (Object Document Mapper) Framework for MongoDB, written
92
92
  in Ruby.
93
93
  email:
@@ -143,6 +143,7 @@ files:
143
143
  - lib/mongoid/copyable.rb
144
144
  - lib/mongoid/criteria.rb
145
145
  - lib/mongoid/criteria/findable.rb
146
+ - lib/mongoid/criteria/includable.rb
146
147
  - lib/mongoid/criteria/inspectable.rb
147
148
  - lib/mongoid/criteria/marshalable.rb
148
149
  - lib/mongoid/criteria/modifiable.rb
@@ -810,7 +811,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
810
811
  version: 1.3.6
811
812
  requirements: []
812
813
  rubyforge_project: mongoid
813
- rubygems_version: 2.4.6
814
+ rubygems_version: 2.5.1
814
815
  signing_key:
815
816
  specification_version: 4
816
817
  summary: Elegant Persistence in Ruby for MongoDB.
metadata.gz.sig CHANGED
Binary file