mongoid 3.0.10 → 3.0.11

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.
@@ -3,6 +3,20 @@
3
3
  For instructions on upgrading to newer versions, visit
4
4
  [mongoid.org](http://mongoid.org/docs/upgrading.html).
5
5
 
6
+ ## 3.0.11
7
+
8
+ ### Resolved Issues
9
+
10
+ * \#2522 Fixed `Criteria#with` to return the criteria and not the class.
11
+
12
+ * \#2518 Fix unit of work call for the identity map when using Passenger.
13
+
14
+ * \#2512 Ensure nested attributes destroy works with the delayed destroys
15
+ introduced in 3.0.10 when multiple levels deep.
16
+
17
+ * \#2509 Don't hit identity map an extra time when the returned value is an
18
+ empty hash. (Douwe Maan)
19
+
6
20
  ## 3.0.10
7
21
 
8
22
  ### Resolved Issues
@@ -118,6 +118,7 @@ module Mongoid
118
118
  mods = Modifiers.new
119
119
  generate_atomic_updates(mods, self)
120
120
  _children.each do |child|
121
+ child.process_flagged_destroys
121
122
  generate_atomic_updates(mods, child)
122
123
  end
123
124
  mods
@@ -303,10 +304,26 @@ module Mongoid
303
304
  atomic_path
304
305
  end
305
306
 
307
+ # Get the flagged destroys.
308
+ #
309
+ # @example Get the flagged destroy.
310
+ # document.flagged_destroys
311
+ #
312
+ # @return [ Array<Proc> ] The flagged destroys.
313
+ #
314
+ # @since 3.0.10
306
315
  def flagged_destroys
307
316
  @flagged_destroys ||= []
308
317
  end
309
318
 
319
+ # Process all the pending flagged destroys from nested attributes.
320
+ #
321
+ # @example Process all the pending flagged destroys.
322
+ # document.process_flagged_destroys
323
+ #
324
+ # @return [ Array ] The cleared array.
325
+ #
326
+ # @since 3.0.10
310
327
  def process_flagged_destroys
311
328
  _assigning do
312
329
  flagged_destroys.each do |block|
@@ -145,6 +145,18 @@ module Mongoid
145
145
  end
146
146
  end
147
147
 
148
+ # Is the application running under passenger?
149
+ #
150
+ # @example Is the application using passenger?
151
+ # config.running_with_passenger?
152
+ #
153
+ # @return [ true, false ] If the app is deployed on Passenger.
154
+ #
155
+ # @since 3.0.11
156
+ def running_with_passenger?
157
+ @running_with_passenger ||= defined?(PhusionPassenger)
158
+ end
159
+
148
160
  # Get the session configuration or an empty hash.
149
161
  #
150
162
  # @example Get the sessions configuration.
@@ -291,6 +291,7 @@ module Mongoid
291
291
  id = extract_id
292
292
  id = klass.fields["_id"].mongoize(id) if id
293
293
  doc = IdentityMap.get(klass, id || selector.except("_type"))
294
+ return nil if doc == {}
294
295
  doc && doc.matches?(selector) ? doc : first
295
296
  end
296
297
 
@@ -526,6 +527,26 @@ module Mongoid
526
527
  super
527
528
  end
528
529
 
530
+ # Tell the next persistance operation to query from a specific collection,
531
+ # database or session.
532
+ #
533
+ # @example Send the criteria to another collection.
534
+ # Band.where(name: "Depeche Mode").with(collection: "artists")
535
+ #
536
+ # @param [ Hash ] options The storage options.
537
+ #
538
+ # @option options [ String, Symbol ] :collection The collection name.
539
+ # @option options [ String, Symbol ] :database The database name.
540
+ # @option options [ String, Symbol ] :session The session name.
541
+ #
542
+ # @return [ Criteria ] The criteria.
543
+ #
544
+ # @since 3.0.0
545
+ def with(options)
546
+ Threaded.set_persistence_options(klass, options)
547
+ self
548
+ end
549
+
529
550
  # Get a version of this criteria without the options.
530
551
  #
531
552
  # @example Get the criteria without options.
@@ -118,7 +118,11 @@ module Rails
118
118
 
119
119
  # Need to include the Mongoid identity map middleware.
120
120
  initializer "include the identity map" do |app|
121
- app.config.middleware.use "Rack::Mongoid::Middleware::IdentityMap"
121
+ if ::Mongoid.running_with_passenger?
122
+ app.config.middleware.use "Rack::Mongoid::Middleware::IdentityMap::Passenger"
123
+ else
124
+ app.config.middleware.use "Rack::Mongoid::Middleware::IdentityMap"
125
+ end
122
126
  end
123
127
 
124
128
  # Instantitate any registered observers after Rails initialization and
@@ -132,6 +136,26 @@ module Rails
132
136
  end
133
137
  end
134
138
 
139
+ initializer "reconnect to master if application is preloaded" do
140
+ config.after_initialize do
141
+ # Unicorn clears the START_CTX when a worker is forked, so if we have
142
+ # data in START_CTX then we know we're being preloaded. Unicorn does
143
+ # not provide application-level hooks for executing code after the
144
+ # process has forked, so we reconnect lazily.
145
+ if defined?(Unicorn) && !Unicorn::HttpServer::START_CTX.empty?
146
+ ::Mongoid.default_session.disconnect
147
+ end
148
+
149
+ # Passenger provides the :starting_worker_process event for executing
150
+ # code after it has forked, so we use that and reconnect immediately.
151
+ if ::Mongoid.running_with_passenger?
152
+ PhusionPassenger.on_event(:starting_worker_process) do |forked|
153
+ ::Mongoid.default_session.disconnect if forked
154
+ end
155
+ end
156
+ end
157
+ end
158
+
135
159
  # Rails runs all initializers first before getting into any generator
136
160
  # code, so we have no way in the intitializer to know if we are
137
161
  # generating a mongoid.yml. So instead of failing, we catch all the
@@ -38,7 +38,7 @@ module Mongoid
38
38
  def substitute(replacement)
39
39
  if replacement != self
40
40
  if _assigning?
41
- base.add_atomic_unset(target)
41
+ base.add_atomic_unset(target) unless replacement
42
42
  else
43
43
  target.destroy if persistable?
44
44
  end
@@ -1,4 +1,4 @@
1
1
  # encoding: utf-8
2
2
  module Mongoid
3
- VERSION = "3.0.10"
3
+ VERSION = "3.0.11"
4
4
  end
@@ -37,6 +37,38 @@ module Rack
37
37
  end
38
38
  response
39
39
  end
40
+
41
+ # Passenger 3 does not execute the block provided to a Rack::BodyProxy
42
+ # so the identity map never gets cleared. Since there's no streaming
43
+ # support in it anyways we do not need the proxy functionality.
44
+ class Passenger
45
+
46
+ # Initialize the new middleware.
47
+ #
48
+ # @example Init the middleware.
49
+ # IdentityMap.new(app)
50
+ #
51
+ # @param [ Object ] app The application.
52
+ #
53
+ # @since 3.0.11
54
+ def initialize(app)
55
+ @app = app
56
+ end
57
+
58
+ # Make the request with the provided environment.
59
+ #
60
+ # @example Make the request.
61
+ # identity_map.call(env)
62
+ #
63
+ # @param [ Object ] env The environment.
64
+ #
65
+ # @return [ Array ] The status, headers, and response.
66
+ #
67
+ # @since 3.0.11
68
+ def call(env)
69
+ ::Mongoid.unit_of_work { @app.call(env) }
70
+ end
71
+ end
40
72
  end
41
73
  end
42
74
  end
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: 3.0.10
4
+ version: 3.0.11
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-10-28 00:00:00.000000000 Z
12
+ date: 2012-11-04 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: activemodel
@@ -352,7 +352,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
352
352
  version: '0'
353
353
  segments:
354
354
  - 0
355
- hash: 1575250359418632703
355
+ hash: 1182744462779695789
356
356
  required_rubygems_version: !ruby/object:Gem::Requirement
357
357
  none: false
358
358
  requirements: