mongoid 4.0.2 → 5.0.0.beta

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 (177) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +66 -1
  3. data/README.md +14 -13
  4. data/lib/config/locales/en.yml +28 -28
  5. data/lib/mongoid.rb +28 -21
  6. data/lib/mongoid/atomic.rb +2 -4
  7. data/lib/mongoid/attributes.rb +7 -7
  8. data/lib/mongoid/attributes/processing.rb +4 -1
  9. data/lib/mongoid/attributes/readonly.rb +2 -2
  10. data/lib/mongoid/changeable.rb +4 -6
  11. data/lib/mongoid/clients.rb +142 -0
  12. data/lib/mongoid/clients/factory.rb +78 -0
  13. data/lib/mongoid/{sessions → clients}/options.rb +30 -19
  14. data/lib/mongoid/{sessions → clients}/storage_options.rb +27 -13
  15. data/lib/mongoid/{sessions → clients}/thread_options.rb +6 -3
  16. data/lib/mongoid/clients/validators.rb +2 -0
  17. data/lib/mongoid/{sessions → clients}/validators/storage.rb +5 -2
  18. data/lib/mongoid/composable.rb +3 -3
  19. data/lib/mongoid/config.rb +39 -41
  20. data/lib/mongoid/config/environment.rb +1 -1
  21. data/lib/mongoid/config/validators.rb +1 -1
  22. data/lib/mongoid/config/validators/{session.rb → client.rb} +31 -28
  23. data/lib/mongoid/contextual/aggregable/mongo.rb +1 -1
  24. data/lib/mongoid/contextual/atomic.rb +11 -11
  25. data/lib/mongoid/contextual/command.rb +9 -6
  26. data/lib/mongoid/contextual/geo_near.rb +17 -1
  27. data/lib/mongoid/contextual/map_reduce.rb +12 -11
  28. data/lib/mongoid/contextual/memory.rb +2 -5
  29. data/lib/mongoid/contextual/mongo.rb +92 -82
  30. data/lib/mongoid/contextual/none.rb +13 -0
  31. data/lib/mongoid/copyable.rb +6 -1
  32. data/lib/mongoid/criteria.rb +36 -3
  33. data/lib/mongoid/document.rb +3 -4
  34. data/lib/mongoid/errors.rb +6 -6
  35. data/lib/mongoid/errors/{mixed_session_configuration.rb → mixed_client_configuration.rb} +5 -5
  36. data/lib/mongoid/errors/no_client_config.rb +22 -0
  37. data/lib/mongoid/errors/{no_session_database.rb → no_client_database.rb} +4 -4
  38. data/lib/mongoid/errors/{no_session_hosts.rb → no_client_hosts.rb} +4 -4
  39. data/lib/mongoid/errors/{no_sessions_config.rb → no_clients_config.rb} +4 -4
  40. data/lib/mongoid/errors/no_default_client.rb +23 -0
  41. data/lib/mongoid/extensions/hash.rb +5 -1
  42. data/lib/mongoid/extensions/object.rb +3 -2
  43. data/lib/mongoid/extensions/set.rb +5 -5
  44. data/lib/mongoid/factory.rb +4 -2
  45. data/lib/mongoid/fields.rb +7 -2
  46. data/lib/mongoid/findable.rb +4 -1
  47. data/lib/mongoid/indexable.rb +15 -9
  48. data/lib/mongoid/persistable.rb +1 -2
  49. data/lib/mongoid/persistable/creatable.rb +2 -2
  50. data/lib/mongoid/persistable/deletable.rb +3 -3
  51. data/lib/mongoid/persistable/incrementable.rb +1 -1
  52. data/lib/mongoid/persistable/logical.rb +1 -1
  53. data/lib/mongoid/persistable/poppable.rb +1 -1
  54. data/lib/mongoid/persistable/pullable.rb +2 -2
  55. data/lib/mongoid/persistable/pushable.rb +2 -2
  56. data/lib/mongoid/persistable/renamable.rb +1 -1
  57. data/lib/mongoid/persistable/settable.rb +1 -1
  58. data/lib/mongoid/persistable/unsettable.rb +1 -1
  59. data/lib/mongoid/persistable/updatable.rb +2 -2
  60. data/lib/mongoid/persistable/upsertable.rb +1 -1
  61. data/lib/mongoid/query_cache.rb +98 -104
  62. data/lib/mongoid/railtie.rb +1 -21
  63. data/lib/mongoid/railties/database.rake +1 -1
  64. data/lib/mongoid/relations/builders.rb +3 -1
  65. data/lib/mongoid/relations/counter_cache.rb +1 -1
  66. data/lib/mongoid/relations/embedded/batchable.rb +3 -10
  67. data/lib/mongoid/relations/embedded/many.rb +4 -2
  68. data/lib/mongoid/relations/many.rb +1 -0
  69. data/lib/mongoid/relations/proxy.rb +6 -6
  70. data/lib/mongoid/relations/referenced/many.rb +2 -1
  71. data/lib/mongoid/relations/targets/enumerable.rb +11 -11
  72. data/lib/mongoid/relations/touchable.rb +1 -1
  73. data/lib/mongoid/reloadable.rb +2 -2
  74. data/lib/mongoid/scopable.rb +6 -17
  75. data/lib/mongoid/selectable.rb +1 -36
  76. data/lib/mongoid/serializable.rb +2 -2
  77. data/lib/mongoid/stateful.rb +0 -1
  78. data/lib/mongoid/tasks/database.rake +2 -2
  79. data/lib/mongoid/tasks/database.rb +23 -16
  80. data/lib/mongoid/threaded.rb +54 -33
  81. data/lib/mongoid/threaded/lifecycle.rb +21 -16
  82. data/lib/mongoid/traversable.rb +16 -1
  83. data/lib/mongoid/validatable.rb +1 -1
  84. data/lib/mongoid/validatable/queryable.rb +1 -1
  85. data/lib/mongoid/validatable/uniqueness.rb +3 -20
  86. data/lib/mongoid/version.rb +1 -1
  87. data/lib/rails/generators/mongoid/config/templates/mongoid.yml +91 -57
  88. data/lib/rails/mongoid.rb +2 -2
  89. data/spec/app/models/audio.rb +1 -1
  90. data/spec/app/models/band.rb +1 -0
  91. data/spec/app/models/company.rb +5 -0
  92. data/spec/app/models/label.rb +7 -0
  93. data/spec/app/models/pub.rb +6 -0
  94. data/spec/app/models/staff.rb +7 -0
  95. data/spec/app/models/store_as_dup_test1.rb +5 -0
  96. data/spec/app/models/store_as_dup_test2.rb +5 -0
  97. data/spec/config/mongoid.yml +7 -25
  98. data/spec/mongoid/atomic/paths_spec.rb +3 -11
  99. data/spec/mongoid/attributes/nested_spec.rb +16 -16
  100. data/spec/mongoid/attributes/readonly_spec.rb +80 -18
  101. data/spec/mongoid/attributes_spec.rb +3 -3
  102. data/spec/mongoid/changeable_spec.rb +70 -0
  103. data/spec/mongoid/clients/factory_spec.rb +284 -0
  104. data/spec/mongoid/{sessions → clients}/options_spec.rb +4 -6
  105. data/spec/mongoid/clients_spec.rb +739 -0
  106. data/spec/mongoid/config/environment_spec.rb +14 -11
  107. data/spec/mongoid/config_spec.rb +33 -48
  108. data/spec/mongoid/contextual/atomic_spec.rb +1 -17
  109. data/spec/mongoid/contextual/geo_near_spec.rb +35 -0
  110. data/spec/mongoid/contextual/mongo_spec.rb +26 -83
  111. data/spec/mongoid/contextual/none_spec.rb +15 -0
  112. data/spec/mongoid/copyable_spec.rb +35 -1
  113. data/spec/mongoid/criteria/findable_spec.rb +197 -0
  114. data/spec/mongoid/criteria/modifiable_spec.rb +7 -29
  115. data/spec/mongoid/criteria_spec.rb +74 -91
  116. data/spec/mongoid/document_spec.rb +1 -1
  117. data/spec/mongoid/errors/{mixed_session_configuration_spec.rb → mixed_client_configuration_spec.rb} +1 -1
  118. data/spec/mongoid/errors/{no_session_config_spec.rb → no_client_config_spec.rb} +4 -4
  119. data/spec/mongoid/errors/{no_session_database_spec.rb → no_client_database_spec.rb} +4 -4
  120. data/spec/mongoid/errors/{no_session_hosts_spec.rb → no_client_hosts_spec.rb} +3 -3
  121. data/spec/mongoid/errors/{no_sessions_config_spec.rb → no_clients_config_spec.rb} +2 -2
  122. data/spec/mongoid/fields/localized_spec.rb +1 -0
  123. data/spec/mongoid/fields_spec.rb +1 -0
  124. data/spec/mongoid/findable_spec.rb +2 -23
  125. data/spec/mongoid/indexable_spec.rb +12 -8
  126. data/spec/mongoid/interceptable_spec.rb +15 -0
  127. data/spec/mongoid/persistable/settable_spec.rb +16 -0
  128. data/spec/mongoid/persistable/updatable_spec.rb +3 -2
  129. data/spec/mongoid/persistable_spec.rb +4 -4
  130. data/spec/mongoid/query_cache_spec.rb +13 -8
  131. data/spec/mongoid/relations/auto_save_spec.rb +1 -1
  132. data/spec/mongoid/relations/counter_cache_spec.rb +34 -0
  133. data/spec/mongoid/relations/eager/belongs_to_spec.rb +9 -0
  134. data/spec/mongoid/relations/eager/has_and_belongs_to_many_spec.rb +3 -3
  135. data/spec/mongoid/relations/embedded/many_spec.rb +123 -1
  136. data/spec/mongoid/relations/embedded/one_spec.rb +3 -3
  137. data/spec/mongoid/relations/proxy_spec.rb +28 -0
  138. data/spec/mongoid/relations/referenced/in_spec.rb +1 -1
  139. data/spec/mongoid/relations/referenced/many_spec.rb +47 -23
  140. data/spec/mongoid/relations/referenced/many_to_many_spec.rb +1 -1
  141. data/spec/mongoid/relations/referenced/one_spec.rb +1 -1
  142. data/spec/mongoid/relations/targets/enumerable_spec.rb +9 -2
  143. data/spec/mongoid/reloadable_spec.rb +6 -6
  144. data/spec/mongoid/scopable_spec.rb +41 -28
  145. data/spec/mongoid/selectable_spec.rb +6 -16
  146. data/spec/mongoid/tasks/database_rake_spec.rb +13 -13
  147. data/spec/mongoid/tasks/database_spec.rb +2 -2
  148. data/spec/mongoid/threaded_spec.rb +0 -7
  149. data/spec/mongoid/traversable_spec.rb +2 -2
  150. data/spec/mongoid/validatable/uniqueness_spec.rb +30 -1
  151. data/spec/mongoid_spec.rb +13 -15
  152. data/spec/rails/mongoid_spec.rb +13 -4
  153. data/spec/spec_helper.rb +44 -27
  154. data/spec/support/authorization.rb +12 -0
  155. data/spec/support/expectations.rb +14 -0
  156. metadata +52 -59
  157. data/lib/mongoid/contextual/find_and_modify.rb +0 -69
  158. data/lib/mongoid/contextual/text_search.rb +0 -178
  159. data/lib/mongoid/criteria/#findable.rb# +0 -141
  160. data/lib/mongoid/errors/no_default_session.rb +0 -23
  161. data/lib/mongoid/errors/no_session_config.rb +0 -22
  162. data/lib/mongoid/log_subscriber.rb +0 -55
  163. data/lib/mongoid/positional.rb +0 -71
  164. data/lib/mongoid/sessions.rb +0 -125
  165. data/lib/mongoid/sessions/factory.rb +0 -131
  166. data/lib/mongoid/sessions/mongo_uri.rb +0 -93
  167. data/lib/mongoid/sessions/validators.rb +0 -2
  168. data/lib/mongoid/support/query_counter.rb +0 -23
  169. data/spec/helpers.rb +0 -18
  170. data/spec/mongoid/#atomic_spec.rb# +0 -365
  171. data/spec/mongoid/contextual/find_and_modify_spec.rb +0 -220
  172. data/spec/mongoid/contextual/text_search_spec.rb +0 -209
  173. data/spec/mongoid/log_subscriber_spec.rb +0 -75
  174. data/spec/mongoid/positional_spec.rb +0 -222
  175. data/spec/mongoid/sessions/factory_spec.rb +0 -333
  176. data/spec/mongoid/sessions/mongo_uri_spec.rb +0 -103
  177. data/spec/mongoid/sessions_spec.rb +0 -1252
@@ -16,7 +16,7 @@ module Mongoid
16
16
  #
17
17
  # @since 2.4.0
18
18
  def changed
19
- changed_attributes.keys
19
+ changed_attributes.keys.select { |attr| attribute_change(attr) }
20
20
  end
21
21
 
22
22
  # Has the document changed?
@@ -40,9 +40,7 @@ module Mongoid
40
40
  #
41
41
  # @since 2.4.1
42
42
  def children_changed?
43
- _children.any? do |child|
44
- child.changed?
45
- end
43
+ _children.any?(&:changed?)
46
44
  end
47
45
 
48
46
  # Get the attribute changes.
@@ -184,7 +182,7 @@ module Mongoid
184
182
  # @since 2.1.6
185
183
  def attribute_changed?(attr)
186
184
  attr = database_field_name(attr)
187
- return false unless changed_attributes.has_key?(attr)
185
+ return false unless changed_attributes.key?(attr)
188
186
  changed_attributes[attr] != attributes[attr]
189
187
  end
190
188
 
@@ -228,7 +226,7 @@ module Mongoid
228
226
  #
229
227
  # @since 2.3.0
230
228
  def attribute_will_change!(attr)
231
- unless changed_attributes.has_key?(attr)
229
+ unless changed_attributes.key?(attr)
232
230
  changed_attributes[attr] = read_attribute(attr).__deep_copy__
233
231
  end
234
232
  end
@@ -0,0 +1,142 @@
1
+ # encoding: utf-8
2
+ require "mongoid/clients/factory"
3
+ require "mongoid/clients/validators"
4
+ require "mongoid/clients/storage_options"
5
+ require "mongoid/clients/thread_options"
6
+ require "mongoid/clients/options"
7
+
8
+ module Mongoid
9
+ module Clients
10
+ extend ActiveSupport::Concern
11
+ extend Gem::Deprecate
12
+ include StorageOptions
13
+ include ThreadOptions
14
+ include Options
15
+
16
+ class << self
17
+
18
+ # Clear all clients from the current thread.
19
+ #
20
+ # @example Clear all clients.
21
+ # Mongoid::Clients.clear
22
+ #
23
+ # @return [ Array ] The empty clients.
24
+ #
25
+ # @since 3.0.0
26
+ def clear
27
+ clients.clear
28
+ end
29
+
30
+ # Get the default client.
31
+ #
32
+ # @example Get the default client.
33
+ # Mongoid::Clients.default
34
+ #
35
+ # @return [ Mongo::Client ] The default client.
36
+ #
37
+ # @since 3.0.0
38
+ def default
39
+ clients[:default] ||= Clients::Factory.default
40
+ end
41
+
42
+ # Disconnect all active clients.
43
+ #
44
+ # @example Disconnect all active clients.
45
+ # Mongoid::Clients.disconnect
46
+ #
47
+ # @return [ true ] True.
48
+ #
49
+ # @since 3.1.0
50
+ def disconnect
51
+ clients.values.each do |client|
52
+ client.close
53
+ end
54
+ end
55
+
56
+ # Get a client with the provided name.
57
+ #
58
+ # @example Get a client with the name.
59
+ # Mongoid::Clients.with_name(:replica)
60
+ #
61
+ # @param [ Symbol ] name The name of the client.
62
+ #
63
+ # @return [ Mongo::Client ] The named client.
64
+ #
65
+ # @since 3.0.0
66
+ def with_name(name)
67
+ clients[name.to_sym] ||= Clients::Factory.create(name)
68
+ end
69
+
70
+ def set(name, client)
71
+ clients[name.to_sym] = client
72
+ end
73
+
74
+ def clients
75
+ @clients ||= {}
76
+ end
77
+ end
78
+
79
+ # Get the collection for this model from the client. Will check for an
80
+ # overridden collection name from the store_in macro or the collection
81
+ # with a pluralized model name.
82
+ #
83
+ # @example Get the model's collection.
84
+ # Model.collection
85
+ #
86
+ # @return [ Mongo::Collection ] The collection.
87
+ #
88
+ # @since 3.0.0
89
+ def collection
90
+ mongo_client[collection_name]
91
+ end
92
+
93
+ def mongo_client
94
+ super || self.class.mongo_client
95
+ end
96
+ alias :mongo_session :mongo_client
97
+ deprecate :mongo_session, :mongo_client, 2015, 12
98
+
99
+ def collection_name
100
+ super || self.class.collection_name
101
+ end
102
+
103
+ module ClassMethods
104
+ extend Gem::Deprecate
105
+
106
+ # Get the client for this model. This is determined in the following order:
107
+ #
108
+ # 1. Any custom configuration provided by the 'store_in' macro.
109
+ # 2. The 'default' client as provided in the mongoid.yml
110
+ #
111
+ # @example Get the client.
112
+ # Model.mongo_client
113
+ #
114
+ # @return [ Mongo::Client ] The default mongo client.
115
+ #
116
+ # @since 3.0.0
117
+ def mongo_client
118
+ name = client_name
119
+ client = Clients.with_name(name)
120
+ client = client.use(database_name)
121
+ client = client.with(self.persistence_options)
122
+ Clients.set(name, client)
123
+ end
124
+ alias :mongo_session :mongo_client
125
+ deprecate :mongo_session, :mongo_client, 2015, 12
126
+
127
+ # Get the collection for this model from the client. Will check for an
128
+ # overridden collection name from the store_in macro or the collection
129
+ # with a pluralized model name.
130
+ #
131
+ # @example Get the model's collection.
132
+ # Model.collection
133
+ #
134
+ # @return [ Mongo::Collection ] The collection.
135
+ #
136
+ # @since 3.0.0
137
+ def collection
138
+ mongo_client[collection_name]
139
+ end
140
+ end
141
+ end
142
+ end
@@ -0,0 +1,78 @@
1
+ # encoding: utf-8
2
+
3
+ module Mongoid
4
+ module Clients
5
+ module Factory
6
+ extend self
7
+
8
+ # Create a new client given the named configuration. If no name is
9
+ # provided, return a new client with the default configuration. If a
10
+ # name is provided for which no configuration exists, an error will be
11
+ # raised.
12
+ #
13
+ # @example Create the client.
14
+ # Factory.create(:secondary)
15
+ #
16
+ # @param [ String, Symbol ] name The named client configuration.
17
+ #
18
+ # @raise [ Errors::NoClientConfig ] If no config could be found.
19
+ #
20
+ # @return [ Mongo::Client ] The new client.
21
+ #
22
+ # @since 3.0.0
23
+ def create(name = nil)
24
+ return default unless name
25
+ config = Mongoid.clients[name]
26
+ raise Errors::NoClientConfig.new(name) unless config
27
+ create_client(config)
28
+ end
29
+
30
+ # Get the default client.
31
+ #
32
+ # @example Get the default client.
33
+ # Factory.default
34
+ #
35
+ # @raise [ Errors::NoClientConfig ] If no default configuration is
36
+ # found.
37
+ #
38
+ # @return [ Mongo::Client ] The default client.
39
+ #
40
+ # @since 3.0.0
41
+ def default
42
+ create_client(Mongoid.clients[:default])
43
+ end
44
+
45
+ private
46
+
47
+ # Create the client for the provided config.
48
+ #
49
+ # @api private
50
+ #
51
+ # @example Create the client.
52
+ # Factory.create_client(config)
53
+ #
54
+ # @param [ Hash ] configuration The client config.
55
+ #
56
+ # @return [ Mongo::Client ] The client.
57
+ #
58
+ # @since 3.0.0
59
+ def create_client(configuration)
60
+ raise Errors::NoClientsConfig.new unless configuration
61
+ if configuration[:uri]
62
+ Mongo::Client.new(configuration[:uri], options(configuration))
63
+ else
64
+ Mongo::Client.new(
65
+ configuration[:hosts],
66
+ options(configuration).merge(database: configuration[:database])
67
+ )
68
+ end
69
+ end
70
+
71
+ def options(configuration)
72
+ config = configuration.dup
73
+ options = config.delete(:options) || {}
74
+ options.reject{ |k, v| k == :hosts }.to_hash.symbolize_keys!
75
+ end
76
+ end
77
+ end
78
+ end
@@ -1,11 +1,12 @@
1
1
  # encoding: utf-8
2
2
  module Mongoid
3
- module Sessions
3
+ module Clients
4
4
  module Options
5
5
  extend ActiveSupport::Concern
6
+ extend Gem::Deprecate
6
7
 
7
8
  # Tell the next persistance operation to store in a specific collection,
8
- # database or session.
9
+ # database or client.
9
10
  #
10
11
  # @example Save the current document to a different collection.
11
12
  # model.with(collection: "secondary").save
@@ -13,17 +14,22 @@ module Mongoid
13
14
  # @example Save the current document to a different database.
14
15
  # model.with(database: "secondary").save
15
16
  #
16
- # @example Save the current document to a different session.
17
- # model.with(session: "replica_set").save
17
+ # @example Save the current document to a different client.
18
+ # model.with(client: "replica_set").save
18
19
  #
19
20
  # @example Save with a combination of options.
20
- # model.with(session: "sharded", database: "secondary").save
21
+ # model.with(client: "sharded", database: "secondary").save
22
+ #
23
+ # @note This method will instantiate a new client under the covers and
24
+ # can be expensive. It is also recommended that the user manually
25
+ # closes the extra client after using it, otherwise an excessive amount
26
+ # of connections to the server will be eventually opened.
21
27
  #
22
28
  # @param [ Hash ] options The storage options.
23
29
  #
24
30
  # @option options [ String, Symbol ] :collection The collection name.
25
31
  # @option options [ String, Symbol ] :database The database name.
26
- # @option options [ String, Symbol ] :session The session name.
32
+ # @option options [ String, Symbol ] :client The client name.
27
33
  #
28
34
  # @return [ Document ] The current document.
29
35
  #
@@ -37,17 +43,19 @@ module Mongoid
37
43
  @persistence_options
38
44
  end
39
45
 
40
- def mongo_session
46
+ def mongo_client
41
47
  if persistence_options
42
- if persistence_options[:session]
43
- session = Sessions.with_name(persistence_options[:session])
48
+ if persistence_options[:client]
49
+ client = Clients.with_name(persistence_options[:client])
44
50
  else
45
- session = Sessions.with_name(self.class.session_name)
46
- session.use(self.class.database_name)
51
+ client = Clients.with_name(self.class.client_name)
52
+ client.use(self.class.database_name)
47
53
  end
48
- session.with(persistence_options)
54
+ client.with(persistence_options.reject{ |k, v| k == :collection || k == :client })
49
55
  end
50
56
  end
57
+ alias :mongo_session :mongo_client
58
+ deprecate :mongo_session, :mongo_client, 2015, 12
51
59
 
52
60
  def collection_name
53
61
  if persistence_options && v = persistence_options[:collection]
@@ -91,14 +99,17 @@ module Mongoid
91
99
  end
92
100
 
93
101
  module ClassMethods
102
+ extend Gem::Deprecate
94
103
  include Threaded
95
104
 
96
- def session_name
97
- if persistence_options && v = persistence_options[:session]
105
+ def client_name
106
+ if persistence_options && v = persistence_options[:client]
98
107
  return v.to_sym
99
108
  end
100
109
  super
101
110
  end
111
+ alias :session_name :client_name
112
+ deprecate :session_name, :client_name, 2015, 12
102
113
 
103
114
  def collection_name
104
115
  if persistence_options && v = persistence_options[:collection]
@@ -115,7 +126,7 @@ module Mongoid
115
126
  end
116
127
 
117
128
  # Tell the next persistance operation to store in a specific collection,
118
- # database or session.
129
+ # database or client.
119
130
  #
120
131
  # @example Create a document in a different collection.
121
132
  # Model.with(collection: "secondary").create(name: "test")
@@ -123,17 +134,17 @@ module Mongoid
123
134
  # @example Create a document in a different database.
124
135
  # Model.with(database: "secondary").create(name: "test")
125
136
  #
126
- # @example Create a document in a different session.
127
- # Model.with(session: "secondary").create(name: "test")
137
+ # @example Create a document in a different client.
138
+ # Model.with(client: "secondary").create(name: "test")
128
139
  #
129
140
  # @example Create with a combination of options.
130
- # Model.with(session: "sharded", database: "secondary").create
141
+ # Model.with(client: "sharded", database: "secondary").create
131
142
  #
132
143
  # @param [ Hash ] options The storage options.
133
144
  #
134
145
  # @option options [ String, Symbol ] :collection The collection name.
135
146
  # @option options [ String, Symbol ] :database The database name.
136
- # @option options [ String, Symbol ] :session The session name.
147
+ # @option options [ String, Symbol ] :client The client name.
137
148
  #
138
149
  # @return [ Class ] The model class.
139
150
  #
@@ -1,6 +1,6 @@
1
1
  # encoding: utf-8
2
2
  module Mongoid
3
- module Sessions
3
+ module Clients
4
4
  module StorageOptions
5
5
  extend ActiveSupport::Concern
6
6
 
@@ -12,6 +12,7 @@ module Mongoid
12
12
  end
13
13
 
14
14
  module ClassMethods
15
+ extend Gem::Deprecate
15
16
 
16
17
  # Give this model specific custom default storage options.
17
18
  #
@@ -27,10 +28,10 @@ module Mongoid
27
28
  # store_in database: "echo_shard"
28
29
  # end
29
30
  #
30
- # @example Store this model by default in a different session.
31
+ # @example Store this model by default in a different client.
31
32
  # class Band
32
33
  # include Mongoid::Document
33
- # store_in session: "secondary"
34
+ # store_in client: "secondary"
34
35
  # end
35
36
  #
36
37
  # @example Store this model with a combination of options.
@@ -43,7 +44,7 @@ module Mongoid
43
44
  #
44
45
  # @option options [ String, Symbol ] :collection The collection name.
45
46
  # @option options [ String, Symbol ] :database The database name.
46
- # @option options [ String, Symbol ] :session The session name.
47
+ # @option options [ String, Symbol ] :client The client name.
47
48
  #
48
49
  # @return [ Class ] The model class.
49
50
  #
@@ -74,8 +75,8 @@ module Mongoid
74
75
  def storage_options_defaults
75
76
  {
76
77
  collection: name.collectionize.to_sym,
77
- session: :default,
78
- database: -> { Mongoid.sessions[session_name][:database] }
78
+ client: :default,
79
+ database: -> { configured_database }
79
80
  }
80
81
  end
81
82
 
@@ -91,24 +92,26 @@ module Mongoid
91
92
  __evaluate__(storage_options[:collection])
92
93
  end
93
94
 
94
- # Get the session name for the model.
95
+ # Get the client name for the model.
95
96
  #
96
- # @example Get the session name.
97
- # Model.session_name
97
+ # @example Get the client name.
98
+ # Model.client_name
98
99
  #
99
- # @return [ Symbol ] The name of the session.
100
+ # @return [ Symbol ] The name of the client.
100
101
  #
101
102
  # @since 3.0.0
102
- def session_name
103
- __evaluate__(storage_options[:session])
103
+ def client_name
104
+ __evaluate__(storage_options[:client])
104
105
  end
106
+ alias :session_name :client_name
107
+ deprecate :session_name, :client_name, 2015, 12
105
108
 
106
109
  # Get the database name for the model.
107
110
  #
108
111
  # @example Get the database name.
109
112
  # Model.database_name
110
113
  #
111
- # @return [ Symbol ] The name of the session.
114
+ # @return [ Symbol ] The name of the client.
112
115
  #
113
116
  # @since 4.0.0
114
117
  def database_name
@@ -134,6 +137,17 @@ module Mongoid
134
137
  return nil unless name
135
138
  name.respond_to?(:call) ? name.call.to_sym : name.to_sym
136
139
  end
140
+
141
+ def configured_database
142
+ client = Mongoid.clients[client_name]
143
+ if db = client[:database]
144
+ db
145
+ elsif uri = client[:uri]
146
+ client[:database] = Mongo::URI.new(uri).database
147
+ else
148
+ nil
149
+ end
150
+ end
137
151
  end
138
152
  end
139
153
  end