mongoid 5.0.1 → 5.0.2

Sign up to get free protection for your applications and to get access to all the features.
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/CHANGELOG.md +2 -0
  5. data/README.md +0 -1
  6. data/lib/mongoid.rb +0 -7
  7. data/lib/mongoid/attributes.rb +2 -1
  8. data/lib/mongoid/attributes/nested.rb +3 -0
  9. data/lib/mongoid/clients.rb +0 -6
  10. data/lib/mongoid/clients/options.rb +0 -6
  11. data/lib/mongoid/clients/storage_options.rb +0 -3
  12. data/lib/mongoid/clients/thread_options.rb +0 -3
  13. data/lib/mongoid/config.rb +0 -7
  14. data/lib/mongoid/contextual/command.rb +0 -3
  15. data/lib/mongoid/contextual/mongo.rb +2 -2
  16. data/lib/mongoid/criteria.rb +6 -1
  17. data/lib/mongoid/extensions/hash.rb +1 -1
  18. data/lib/mongoid/indexable.rb +7 -5
  19. data/lib/mongoid/indexable/specification.rb +14 -0
  20. data/lib/mongoid/indexable/validators/options.rb +2 -1
  21. data/lib/mongoid/persistable/settable.rb +8 -1
  22. data/lib/mongoid/query_cache.rb +14 -4
  23. data/lib/mongoid/railtie.rb +1 -0
  24. data/lib/mongoid/relations/accessors.rb +3 -1
  25. data/lib/mongoid/relations/embedded/batchable.rb +5 -1
  26. data/lib/mongoid/relations/metadata.rb +3 -0
  27. data/lib/mongoid/tasks/database.rb +1 -1
  28. data/lib/mongoid/threaded.rb +0 -5
  29. data/lib/mongoid/version.rb +1 -1
  30. data/spec/app/models/bomb.rb +4 -0
  31. data/spec/app/models/building.rb +2 -1
  32. data/spec/app/models/building_address.rb +3 -1
  33. data/spec/app/models/courier_job.rb +4 -0
  34. data/spec/app/models/explosion.rb +4 -0
  35. data/spec/app/models/message.rb +3 -0
  36. data/spec/app/models/name.rb +1 -0
  37. data/spec/app/models/post.rb +3 -0
  38. data/spec/app/models/sandwich.rb +5 -0
  39. data/spec/app/models/shipment_address.rb +2 -0
  40. data/spec/mongoid/attributes/nested_spec.rb +77 -18
  41. data/spec/mongoid/attributes_spec.rb +13 -0
  42. data/spec/mongoid/criteria_spec.rb +52 -0
  43. data/spec/mongoid/document_spec.rb +37 -13
  44. data/spec/mongoid/indexable/specification_spec.rb +25 -0
  45. data/spec/mongoid/persistable_spec.rb +17 -0
  46. data/spec/mongoid/query_cache_spec.rb +51 -2
  47. data/spec/mongoid/relations/accessors_spec.rb +69 -0
  48. data/spec/mongoid/relations/embedded/many_spec.rb +63 -0
  49. data/spec/mongoid/relations/embedded/one_spec.rb +45 -0
  50. data/spec/mongoid/relations/metadata_spec.rb +16 -0
  51. data/spec/mongoid/relations/referenced/one_spec.rb +24 -0
  52. data/spec/mongoid/tasks/database_spec.rb +19 -0
  53. data/spec/spec_helper.rb +1 -8
  54. metadata +10 -2
  55. metadata.gz.sig +0 -0
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 8dff7445e398ee462ff1e26c6baaa5684ee9318d
4
- data.tar.gz: beb9a64681e530861fcece3129d5347484342344
3
+ metadata.gz: 1aa194434a7d5ebe53a1f05929202d4976201f90
4
+ data.tar.gz: 31e2605c59062cb947a510d399a25c173c9ff504
5
5
  SHA512:
6
- metadata.gz: d86170a4c56e57d6d5e11d89003307e9a7c8f2e45d2c75d7cb98ef81781b66a05b69ba8a71701161c0ef800a2284a322beaff08c6a3a70d03014d7313f7f8205
7
- data.tar.gz: d8615708189aee7700312ac743c8ae63d69d092f45788f4137c9ec3e931985a876d38ec08819359b960e3a64a333c981535b1da8f6405ab55d2dc6d591d15d37
6
+ metadata.gz: a4d133d4ce0e944995f0a0718ba506ca8ede6cc6f232a14cbe34d371f3db80d5736610ffdc6726bb5de3b658355c4ce818b10c82c172669da82aeafabbb13172
7
+ data.tar.gz: bf1274305b4c8165ac084e06246adf841fd17aeefdf017eb442e81d92c2aa75c6ab8183e591ba7e5b8a757d8ea39899c4a6ce41cb966d835f020edf3a45e6e6e
Binary file
data.tar.gz.sig CHANGED
Binary file
@@ -3,6 +3,8 @@
3
3
  For instructions on upgrading to newer versions, visit
4
4
  [mongoid.org](http://mongoid.org/en/mongoid/docs/upgrading.html).
5
5
 
6
+ ### As of version 5.0.2, please refer to the github releases for change logs.
7
+
6
8
  ## 5.0.1
7
9
 
8
10
  ### Resolved Issues
data/README.md CHANGED
@@ -1,7 +1,6 @@
1
1
  # Mongoid
2
2
  [![Build Status](https://travis-ci.org/mongodb/mongoid.svg?branch=master)](https://travis-ci.org/mongodb/mongoid)
3
3
  [![Code Climate](https://codeclimate.com/github/mongodb/mongoid.svg)](https://codeclimate.com/github/mongodb/mongoid)
4
- [![Coverage Status](https://img.shields.io/coveralls/mongodb/mongoid/master.svg)](https://coveralls.io/r/mongodb/mongoid?branch=master)
5
4
  [![Dependency Status](https://www.versioneye.com/ruby/mongoid/4.0.0/badge.svg)](https://www.versioneye.com/ruby/mongoid/4.0.0)
6
5
 
7
6
  Mongoid is an ODM (Object-Document-Mapper) framework for MongoDB in Ruby.
@@ -34,7 +34,6 @@ I18n.load_path << File.join(File.dirname(__FILE__), "config", "locales", "en.yml
34
34
 
35
35
  module Mongoid
36
36
  extend Loggable
37
- extend Gem::Deprecate
38
37
  extend self
39
38
 
40
39
  # The minimum MongoDB version supported.
@@ -65,8 +64,6 @@ module Mongoid
65
64
  def default_client
66
65
  Clients.default
67
66
  end
68
- alias :default_session :default_client
69
- deprecate :default_session, :default_client, 2015, 12
70
67
 
71
68
  # Disconnect all active clients.
72
69
  #
@@ -79,8 +76,6 @@ module Mongoid
79
76
  def disconnect_clients
80
77
  Clients.disconnect
81
78
  end
82
- alias :disconnect_sessions :disconnect_clients
83
- deprecate :disconnect_sessions, :disconnect_clients, 2015, 12
84
79
 
85
80
  # Convenience method for getting a named client.
86
81
  #
@@ -93,8 +88,6 @@ module Mongoid
93
88
  def client(name)
94
89
  Clients.with_name(name)
95
90
  end
96
- alias :session :client
97
- deprecate :session, :client, 2015, 12
98
91
 
99
92
  # Take all the public instance methods from the Config singleton and allow
100
93
  # them to be accessed through the Mongoid module directly.
@@ -176,7 +176,8 @@ module Mongoid
176
176
  attribute_will_change!(access)
177
177
  end
178
178
  if localized
179
- (attributes[access] ||= {}).merge!(typed_value)
179
+ attributes[access] ||= {}
180
+ attributes[access].merge!(typed_value)
180
181
  else
181
182
  attributes[access] = typed_value
182
183
  end
@@ -53,6 +53,9 @@ module Mongoid
53
53
  autosave_nested_attributes(metadata)
54
54
  re_define_method(meth) do |attrs|
55
55
  _assigning do
56
+ if metadata.polymorphic? and metadata.inverse_type
57
+ options = options.merge!(:class_name => self.send(metadata.inverse_type))
58
+ end
56
59
  metadata.nested_builder(attrs, options).build(self)
57
60
  end
58
61
  end
@@ -8,7 +8,6 @@ require "mongoid/clients/options"
8
8
  module Mongoid
9
9
  module Clients
10
10
  extend ActiveSupport::Concern
11
- extend Gem::Deprecate
12
11
  include StorageOptions
13
12
  include ThreadOptions
14
13
  include Options
@@ -93,15 +92,12 @@ module Mongoid
93
92
  def mongo_client
94
93
  super || self.class.mongo_client
95
94
  end
96
- alias :mongo_session :mongo_client
97
- deprecate :mongo_session, :mongo_client, 2015, 12
98
95
 
99
96
  def collection_name
100
97
  super || self.class.collection_name
101
98
  end
102
99
 
103
100
  module ClassMethods
104
- extend Gem::Deprecate
105
101
 
106
102
  # Get the client for this model. This is determined in the following order:
107
103
  #
@@ -123,8 +119,6 @@ module Mongoid
123
119
  opts.merge!(database: database_name) unless client.database.name.to_sym == database_name.to_sym
124
120
  client.with(opts)
125
121
  end
126
- alias :mongo_session :mongo_client
127
- deprecate :mongo_session, :mongo_client, 2015, 12
128
122
 
129
123
  # Get the collection for this model from the client. Will check for an
130
124
  # overridden collection name from the store_in macro or the collection
@@ -3,7 +3,6 @@ module Mongoid
3
3
  module Clients
4
4
  module Options
5
5
  extend ActiveSupport::Concern
6
- extend Gem::Deprecate
7
6
 
8
7
  # Tell the next persistence operation to store in a specific collection,
9
8
  # database or client.
@@ -54,8 +53,6 @@ module Mongoid
54
53
  client.with(persistence_options.reject{ |k, v| k == :collection || k == :client })
55
54
  end
56
55
  end
57
- alias :mongo_session :mongo_client
58
- deprecate :mongo_session, :mongo_client, 2015, 12
59
56
 
60
57
  def collection_name
61
58
  if persistence_options && v = persistence_options[:collection]
@@ -99,7 +96,6 @@ module Mongoid
99
96
  end
100
97
 
101
98
  module ClassMethods
102
- extend Gem::Deprecate
103
99
  include Threaded
104
100
 
105
101
  def client_name
@@ -108,8 +104,6 @@ module Mongoid
108
104
  end
109
105
  super
110
106
  end
111
- alias :session_name :client_name
112
- deprecate :session_name, :client_name, 2015, 12
113
107
 
114
108
  def collection_name
115
109
  if persistence_options && v = persistence_options[:collection]
@@ -12,7 +12,6 @@ module Mongoid
12
12
  end
13
13
 
14
14
  module ClassMethods
15
- extend Gem::Deprecate
16
15
 
17
16
  # Give this model specific custom default storage options.
18
17
  #
@@ -103,8 +102,6 @@ module Mongoid
103
102
  def client_name
104
103
  __evaluate__(storage_options[:client])
105
104
  end
106
- alias :session_name :client_name
107
- deprecate :session_name, :client_name, 2015, 12
108
105
 
109
106
  # Get the database name for the model.
110
107
  #
@@ -5,13 +5,10 @@ module Mongoid
5
5
  extend ActiveSupport::Concern
6
6
 
7
7
  module ClassMethods
8
- extend Gem::Deprecate
9
8
 
10
9
  def client_name
11
10
  Threaded.client_override || super
12
11
  end
13
- alias :session_name :client_name
14
- deprecate :session_name, :client_name, 2015, 12
15
12
 
16
13
  def database_name
17
14
  Threaded.database_override || super
@@ -8,7 +8,6 @@ module Mongoid
8
8
  # This module defines all the configuration options for Mongoid, including the
9
9
  # database connections.
10
10
  module Config
11
- extend Gem::Deprecate
12
11
  extend self
13
12
  extend Options
14
13
 
@@ -158,8 +157,6 @@ module Mongoid
158
157
  def override_client(name)
159
158
  Threaded.client_override = name ? name.to_s : nil
160
159
  end
161
- alias :override_session :override_client
162
- deprecate :override_session, :override_client, 2015, 12
163
160
 
164
161
  # Purge all data in all collections, including indexes.
165
162
  #
@@ -219,8 +216,6 @@ module Mongoid
219
216
  def clients
220
217
  @clients ||= {}
221
218
  end
222
- alias :sessions :clients
223
- deprecate :sessions, :clients, 2015, 12
224
219
 
225
220
  # Get the time zone to use.
226
221
  #
@@ -254,7 +249,5 @@ module Mongoid
254
249
  Validators::Client.validate(c)
255
250
  @clients = c
256
251
  end
257
- alias :sessions= :clients=
258
- deprecate :sessions=, :clients=, 2015, 12
259
252
  end
260
253
  end
@@ -2,7 +2,6 @@
2
2
  module Mongoid
3
3
  module Contextual
4
4
  module Command
5
- extend Gem::Deprecate
6
5
 
7
6
  # @attribute [r] collection The collection to query against.
8
7
  # @attribute [r] criteria The criteria for the context.
@@ -31,8 +30,6 @@ module Mongoid
31
30
  def client
32
31
  collection.database.client
33
32
  end
34
- alias :session :client
35
- deprecate :session, :client, 2015, 12
36
33
  end
37
34
  end
38
35
  end
@@ -237,7 +237,7 @@ module Mongoid
237
237
  def first
238
238
  return documents.first if cached? && cache_loaded?
239
239
  try_cache(:first) do
240
- with_eager_loading(view.first)
240
+ with_eager_loading(view.limit(-1).first)
241
241
  end
242
242
  end
243
243
  alias :one :first
@@ -335,7 +335,7 @@ module Mongoid
335
335
  def last
336
336
  try_cache(:last) do
337
337
  with_inverse_sorting do
338
- with_eager_loading(view.first)
338
+ with_eager_loading(view.limit(-1).first)
339
339
  end
340
340
  end
341
341
  end
@@ -597,7 +597,12 @@ module Mongoid
597
597
  #
598
598
  # @since 3.0.3
599
599
  def type_selection
600
- { _type: { "$in" => klass._types }}
600
+ klasses = klass._types
601
+ if klasses.size > 1
602
+ { _type: { "$in" => klass._types }}
603
+ else
604
+ { _type: klass._types[0] }
605
+ end
601
606
  end
602
607
 
603
608
  # Get a new selector with type selection in it.
@@ -198,7 +198,7 @@ module Mongoid
198
198
  # @since 3.0.0
199
199
  def mongoize(object)
200
200
  return if object.nil?
201
- evolve(object).update_values { |value| value.mongoize }
201
+ evolve(object.dup).update_values { |value| value.mongoize }
202
202
  end
203
203
 
204
204
  # Can the size of this object change?
@@ -31,10 +31,10 @@ module Mongoid
31
31
  index_specifications.each do |spec|
32
32
  key, options = spec.key, spec.options
33
33
  if database = options[:database]
34
- with(read: { mode: :primary }, database: database).
34
+ with(database: database).
35
35
  collection.indexes.create_one(key, options.except(:database))
36
36
  else
37
- with(read: { mode: :primary }).collection.indexes.create_one(key, options)
37
+ collection.indexes.create_one(key, options)
38
38
  end
39
39
  end and true
40
40
  end
@@ -50,7 +50,7 @@ module Mongoid
50
50
  # @since 3.0.0
51
51
  def remove_indexes
52
52
  indexed_database_names.each do |database|
53
- collection = with(read: { mode: :primary }, database: database).collection
53
+ collection = with(database: database).collection
54
54
  begin
55
55
  collection.indexes.each do |spec|
56
56
  unless spec["name"] == "_id_"
@@ -113,9 +113,11 @@ module Mongoid
113
113
  # @return [ Specification ] The found specification.
114
114
  #
115
115
  # @since 4.0.0
116
- def index_specification(index_hash)
116
+ def index_specification(index_hash, index_name = nil)
117
117
  index = OpenStruct.new(fields: index_hash.keys, key: index_hash)
118
- index_specifications.detect { |spec| spec == index }
118
+ index_specifications.detect do |spec|
119
+ spec == index || (index_name && index_name == spec.name)
120
+ end
119
121
  end
120
122
 
121
123
  private
@@ -56,6 +56,20 @@ module Mongoid
56
56
  @options = normalize_options(options.dup)
57
57
  end
58
58
 
59
+ # Get the index name, generated using the index key.
60
+ #
61
+ # @example Get the index name.
62
+ # specification.name
63
+ #
64
+ # @return [ String ] name The index name.
65
+ #
66
+ # @since 5.0.2
67
+ def name
68
+ @name ||= key.reduce([]) do |n, (k,v)|
69
+ n << "#{k}_#{v}"
70
+ end.join('_')
71
+ end
72
+
59
73
  private
60
74
 
61
75
  # Normalize the spec, in case aliased fields are provided.
@@ -26,7 +26,8 @@ module Mongoid
26
26
  :key,
27
27
  :sphere_version,
28
28
  :text_version,
29
- :version
29
+ :version,
30
+ :partial_filter_expression
30
31
  ]
31
32
 
32
33
  VALID_TYPES = [
@@ -22,12 +22,19 @@ module Mongoid
22
22
  def set(setters)
23
23
  prepare_atomic_operation do |ops|
24
24
  process_atomic_operations(setters) do |field, value|
25
- process_attribute(field.to_s, value)
25
+ field_and_value_hash = hasherizer(field.split('.'), value)
26
+ field = field_and_value_hash.keys.first
27
+ process_attribute(field, field_and_value_hash[field])
26
28
  ops[atomic_attribute_name(field)] = attributes[field]
27
29
  end
28
30
  { "$set" => ops }
29
31
  end
30
32
  end
31
33
  end
34
+
35
+ def hasherizer(keys, value)
36
+ return value if keys.empty?
37
+ {}.tap { |hash| hash[keys.shift] = hasherizer(keys, value) }
38
+ end
32
39
  end
33
40
  end
@@ -206,12 +206,10 @@ module Mongoid
206
206
  if system_collection? || !QueryCache.enabled?
207
207
  super
208
208
  else
209
- key = cache_key
210
- cursor = QueryCache.cache_table[key]
211
- unless cursor
209
+ unless cursor = cached_cursor
212
210
  server = read.select_server(cluster)
213
211
  cursor = CachedCursor.new(view, send_initial_query(server), server)
214
- QueryCache.cache_table[key] = cursor
212
+ QueryCache.cache_table[cache_key] = cursor
215
213
  end
216
214
  cursor.each do |doc|
217
215
  yield doc
@@ -222,6 +220,18 @@ module Mongoid
222
220
 
223
221
  private
224
222
 
223
+ def cached_cursor
224
+ if limit
225
+ key = [ collection.namespace, selector, nil, skip, projection ]
226
+ cursor = QueryCache.cache_table[key]
227
+ if cursor
228
+ limited_docs = cursor.to_a[0...limit.abs]
229
+ cursor.instance_variable_set(:@cached_documents, limited_docs)
230
+ end
231
+ end
232
+ cursor || QueryCache.cache_table[cache_key]
233
+ end
234
+
225
235
  def cache_key
226
236
  [ collection.namespace, selector, limit, skip, projection ]
227
237
  end
@@ -77,6 +77,7 @@ module Rails
77
77
  unless config.action_dispatch.rescue_responses
78
78
  ActionDispatch::ShowExceptions.rescue_responses.update(Railtie.rescue_responses)
79
79
  end
80
+ Mongo::Logger.logger = ::Mongoid.logger
80
81
  end
81
82
 
82
83
  # Due to all models not getting loaded and messing up inheritance queries
@@ -228,7 +228,9 @@ module Mongoid
228
228
  re_define_method("#{name}=") do |object|
229
229
  without_autobuild do
230
230
  if value = get_relation(name, metadata, object)
231
- set_relation(name, value.substitute(object.substitutable))
231
+ if value.respond_to?(:substitute)
232
+ set_relation(name, value.substitute(object.substitutable))
233
+ end
232
234
  else
233
235
  __build__(name, object.substitutable, metadata)
234
236
  end
@@ -79,8 +79,12 @@ module Mongoid
79
79
  if docs.blank?
80
80
  if _assigning? && !empty?
81
81
  base.add_atomic_unset(first)
82
+ target_duplicate = target.dup
83
+ pre_process_batch_remove(target_duplicate, :delete)
84
+ post_process_batch_remove(target_duplicate, :delete)
85
+ else
86
+ batch_remove(target.dup)
82
87
  end
83
- batch_remove(target.dup)
84
88
  else
85
89
  base.delayed_atomic_sets.clear unless _assigning?
86
90
  docs = normalize_docs(docs).compact
@@ -663,6 +663,9 @@ module Mongoid
663
663
  #
664
664
  # @since 2.0.0.rc.1
665
665
  def nested_builder(attributes, options)
666
+ if polymorphic? && options[:class_name]
667
+ self[:class_name] = options[:class_name]
668
+ end
666
669
  relation.nested_builder(self, attributes, options)
667
670
  end
668
671