mongoid 2.4.3 → 2.4.4

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,7 +3,39 @@
3
3
  For instructions on upgrading to newer versions, visit
4
4
  [mongoid.org](http://mongoid.org/docs/upgrading.html).
5
5
 
6
- ## 2.4.3 \[ In Development \] \[ Branch: 2.4.0-stable \]
6
+ ## 2.4.4 (branch: 2.4.0-stable)
7
+
8
+ ### Resolved Issues
9
+
10
+ * \#1705 Allow changing the order of many to many foreign keys.
11
+
12
+ * \#1703 Updated at is now versioned again. (Lucas Souza)
13
+
14
+ * \#1686 Set the base metadata on unbind as well as bind for belongs to
15
+ relations.
16
+
17
+ * \#1681 Attempt to create indexes for models without namespacing if the
18
+ namespace does not exist for the subdirectory.
19
+
20
+ * \#1676 Allow eager loading to work as a default scope.
21
+
22
+ * \#1665/#1672 Expand complex criteria in nested criteria selectors, like
23
+ #matches. (Hans Hasselberg)
24
+
25
+ * \#1668 Ensure Mongoid logger exists before calling warn. (Rémy Coutable)
26
+
27
+ * \#1661 Ensure uniqueness validation works on cloned documents.
28
+
29
+ * \#1659 Clear delayed atomic sets when resetting the same embedded relation.
30
+
31
+ * \#1656/#1657 Don't hit database for uniqueness validation if BOTH scope
32
+ and attribute hasn't changed. (priyaaank)
33
+
34
+ * \#1205/#1642 When limiting fields returned from the database via
35
+ `Criteria#only` and `Criteria#without` and then subsequently saving
36
+ the document. Default values no longer override excluded fields.
37
+
38
+ ## 2.4.3
7
39
 
8
40
  ### Resolved Issues
9
41
 
@@ -51,7 +51,7 @@ module Mongoid #:nodoc:
51
51
  end
52
52
 
53
53
  def log_retry(retry_number, ex)
54
- Mongoid.logger.warn "A #{ex.class.name} was raised. Retry attempt ##{retry_number}."
54
+ Mongoid.logger.warn "A #{ex.class.name} was raised. Retry attempt ##{retry_number}." if Mongoid.logger
55
55
  end
56
56
  end
57
57
  end
@@ -166,12 +166,14 @@ module Mongoid #:nodoc:
166
166
  # @return [ Cursor ] An enumerable +Cursor+ of results.
167
167
  def execute
168
168
  collection, options = klass.collection, process_options
169
- if criteria.inclusions.any?
170
- collection.find(selector, options).entries.tap do |docs|
171
- eager_load(docs)
169
+ selecting do
170
+ if criteria.inclusions.any?
171
+ collection.find(selector, options).entries.tap do |docs|
172
+ eager_load(docs)
173
+ end
174
+ else
175
+ collection.find(selector, options)
172
176
  end
173
- else
174
- collection.find(selector, options)
175
177
  end
176
178
  end
177
179
 
@@ -202,8 +204,10 @@ module Mongoid #:nodoc:
202
204
  def first
203
205
  attributes = klass.collection.find_one(selector, options_with_default_sorting)
204
206
  return nil unless attributes
205
- Mongoid::Factory.from_db(klass, attributes).tap do |doc|
206
- eager_load([ doc ]) if criteria.inclusions.any?
207
+ selecting do
208
+ Mongoid::Factory.from_db(klass, attributes).tap do |doc|
209
+ eager_load([ doc ]) if criteria.inclusions.any?
210
+ end
207
211
  end
208
212
  end
209
213
  alias :one :first
@@ -271,8 +275,10 @@ module Mongoid #:nodoc:
271
275
  opts[:sort] = opts[:sort].map{ |option| [ option[0], option[1].invert ] }.uniq
272
276
  attributes = klass.collection.find_one(selector, opts)
273
277
  return nil unless attributes
274
- Mongoid::Factory.from_db(klass, attributes).tap do |doc|
275
- eager_load([ doc ]) if criteria.inclusions.any?
278
+ selecting do
279
+ Mongoid::Factory.from_db(klass, attributes).tap do |doc|
280
+ eager_load([ doc ]) if criteria.inclusions.any?
281
+ end
276
282
  end
277
283
  end
278
284
 
@@ -452,6 +458,28 @@ module Mongoid #:nodoc:
452
458
  end
453
459
  options.dup
454
460
  end
461
+
462
+ # If we are limiting results, we need to set the field limitations on a
463
+ # thread local to avoid overriding the default values.
464
+ #
465
+ # @example Execute with selection.
466
+ # context.selecting do
467
+ # collection.find
468
+ # end
469
+ #
470
+ # @return [ Object ] The yielded value.
471
+ #
472
+ # @since 2.4.4
473
+ def selecting
474
+ begin
475
+ unless options[:fields].blank?
476
+ Threaded.selection = options[:fields]
477
+ end
478
+ yield
479
+ ensure
480
+ Threaded.selection = nil
481
+ end
482
+ end
455
483
  end
456
484
  end
457
485
  end
@@ -262,6 +262,7 @@ module Mongoid #:nodoc:
262
262
  scope_options = @options.dup
263
263
  sorting = scope_options.delete(:sort)
264
264
  scope_options[:order_by] = sorting if sorting
265
+ scope_options[:includes] = inclusions.map(&:name) if inclusions.any?
265
266
  { :where => @selector }.merge(scope_options)
266
267
  end
267
268
  alias :to_ary :to_a
@@ -210,7 +210,7 @@ module Mongoid #:nodoc:
210
210
  #
211
211
  # @since 2.2.0
212
212
  def includes(*relations)
213
- relations.each do |name|
213
+ relations.flatten.each do |name|
214
214
  inclusions.push(klass.reflect_on_association(name))
215
215
  end
216
216
  clone
@@ -19,6 +19,7 @@ module Mongoid #:nodoc:
19
19
  each_pair do |k,v|
20
20
  if k.respond_to?(:key) && k.respond_to?(:to_mongo_query)
21
21
  hsh[k.key] ||= {}
22
+ v = v.expand_complex_criteria if v.is_a?(::Hash)
22
23
  hsh[k.key].merge!(k.to_mongo_query(v))
23
24
  else
24
25
  hsh[k] = v
@@ -13,6 +13,8 @@ module Mongoid #:nodoc:
13
13
  # @example Add the atomic changes.
14
14
  # field.add_atomic_changes(doc, "key", {}, [], [])
15
15
  #
16
+ # @todo: Durran: Refactor, big time.
17
+ #
16
18
  # @param [ Document ] document The document to add to.
17
19
  # @param [ String ] name The name of the field.
18
20
  # @param [ String ] key The atomic location of the field.
@@ -32,6 +34,8 @@ module Mongoid #:nodoc:
32
34
  document.atomic_array_add_to_sets[key] = pushes
33
35
  elsif !pulls.empty?
34
36
  document.atomic_array_pulls[key] = pulls
37
+ elsif new != old
38
+ mods[key] = document.attributes[name]
35
39
  end
36
40
  end
37
41
 
@@ -2,13 +2,14 @@
2
2
  module Mongoid #:nodoc
3
3
  module Fields #:nodoc:
4
4
 
5
+ module Internal #:nodoc:
6
+ end
7
+
5
8
  # This module maps classes used in field type definitions to the custom
6
9
  # definable field in Mongoid.
7
10
  module Mappings
8
11
  extend self
9
12
 
10
- MODULE = "Mongoid::Fields::Internal"
11
-
12
13
  # Get the custom field type for the provided class used in the field
13
14
  # definition.
14
15
  #
@@ -21,21 +22,21 @@ module Mongoid #:nodoc
21
22
  #
22
23
  # @since 2.1.0
23
24
  def for(klass, foreign_key = false)
24
- return Internal::Object unless klass
25
- if foreign_key
26
- return "#{MODULE}::ForeignKeys::#{klass.to_s.demodulize}".constantize
27
- end
28
- begin
29
- modules = "#{ MODULE }::|BSON::|ActiveSupport::"
30
- if match = klass.to_s.match(Regexp.new("^(#{ modules })?(\\w+)$"))
31
- "#{MODULE}::#{ match[2] }".constantize
25
+ if klass.nil?
26
+ Internal::Object
27
+ elsif foreign_key
28
+ Internal::ForeignKeys.const_get(klass.to_s)
29
+ else
30
+ modules = "BSON::|ActiveSupport::"
31
+ match = klass.to_s.match(Regexp.new("^(#{ modules })?(\\w+)$"))
32
+ if match and Internal.const_defined?(match[2])
33
+ Internal.const_get(match[2])
32
34
  else
33
- klass.to_s.constantize
35
+ klass
34
36
  end
35
- rescue NameError
36
- klass
37
37
  end
38
38
  end
39
+
39
40
  end
40
41
  end
41
42
  end
@@ -74,10 +74,10 @@ module Mongoid #:nodoc:
74
74
  #
75
75
  # @since 2.1.8
76
76
  def eval_default(doc)
77
- if default_val.respond_to?(:call)
78
- serialize(doc.instance_exec(&default_val))
77
+ if fields = Threaded.selection
78
+ evaluated_default(doc) if included?(fields)
79
79
  else
80
- serialize(default_val.duplicable? ? default_val.dup : default_val)
80
+ evaluated_default(doc)
81
81
  end
82
82
  end
83
83
 
@@ -188,6 +188,44 @@ module Mongoid #:nodoc:
188
188
  @versioned ||= (options[:versioned].nil? ? true : options[:versioned])
189
189
  end
190
190
 
191
+ private
192
+
193
+ # Is the field included in the fields that were returned from the
194
+ # database? We can apply the default if:
195
+ # 1. The field is included in an only limitation (field: 1)
196
+ # 2. The field is not excluded in a without limitation (field: 0)
197
+ #
198
+ # @example Is the field included?
199
+ # field.included?(fields)
200
+ #
201
+ # @param [ Hash ] fields The field limitations.
202
+ #
203
+ # @return [ true, false ] If the field was included.
204
+ #
205
+ # @since 2.4.4
206
+ def included?(fields)
207
+ (fields.values.first == 1 && fields[name.to_sym] == 1) ||
208
+ (fields.values.first == 0 && !fields.has_key?(name.to_sym))
209
+ end
210
+
211
+ # Get the evaluated default.
212
+ #
213
+ # @example Get the evaluated default.
214
+ # field.evaluated_default.
215
+ #
216
+ # @param [ Document ] doc The doc being applied to.
217
+ #
218
+ # @return [ Object ] The default value.
219
+ #
220
+ # @since 2.4.4
221
+ def evaluated_default(doc)
222
+ if default_val.respond_to?(:call)
223
+ serialize(doc.instance_exec(&default_val))
224
+ else
225
+ serialize(default_val.duplicable? ? default_val.dup : default_val)
226
+ end
227
+ end
228
+
191
229
  module ClassMethods #:nodoc:
192
230
 
193
231
  # Create the new field with a name and optional additional options.
@@ -27,9 +27,7 @@ module Mongoid # :nodoc:
27
27
  base.you_must(metadata.inverse_type_setter, target.class.model_name)
28
28
  end
29
29
  if inverse
30
- inverse_metadata = metadata.inverse_metadata(target)
31
- if inverse_metadata != metadata && !inverse_metadata.nil?
32
- base.metadata = inverse_metadata
30
+ if set_base_metadata
33
31
  if base.referenced_many?
34
32
  target.send(inverse).push(base) unless Mongoid.identity_map_enabled?
35
33
  else
@@ -59,6 +57,7 @@ module Mongoid # :nodoc:
59
57
  base.you_must(metadata.inverse_type_setter, nil)
60
58
  end
61
59
  if inverse
60
+ set_base_metadata
62
61
  if base.referenced_many?
63
62
  target.send(inverse).delete(base)
64
63
  else
@@ -69,6 +68,27 @@ module Mongoid # :nodoc:
69
68
  end
70
69
  end
71
70
  alias :unbind_one :unbind
71
+
72
+ private
73
+
74
+ # Ensure that the metadata on the base is correct, for the cases
75
+ # where we have multiple belongs to definitions and were are setting
76
+ # different parents in memory in order.
77
+ #
78
+ # @api private
79
+ #
80
+ # @example Set the base metadata.
81
+ # binding.set_base_metadata
82
+ #
83
+ # @return [ true, false ] If the metadata changed.
84
+ #
85
+ # @since 2.4.4
86
+ def set_base_metadata
87
+ inverse_metadata = metadata.inverse_metadata(target)
88
+ if inverse_metadata != metadata && !inverse_metadata.nil?
89
+ base.metadata = inverse_metadata
90
+ end
91
+ end
72
92
  end
73
93
  end
74
94
  end
@@ -288,6 +288,7 @@ module Mongoid # :nodoc:
288
288
  proxy.clear
289
289
  else
290
290
  atomically(:$set) do
291
+ base.delayed_atomic_sets.clear
291
292
  if replacement.first.is_a?(Hash)
292
293
  replacement = Many.builder(base, metadata, replacement).build
293
294
  end
@@ -175,6 +175,32 @@ module Mongoid #:nodoc:
175
175
  Thread.current[:"[mongoid]:safety-options"] = options
176
176
  end
177
177
 
178
+ # Get the field selection options from the current thread.
179
+ #
180
+ # @example Get the field selection options.
181
+ # Threaded.selection
182
+ #
183
+ # @return [ Hash ] The field selection.
184
+ #
185
+ # @since 2.4.4
186
+ def selection
187
+ Thread.current[:"[mongoid]:selection"]
188
+ end
189
+
190
+ # Set the field selection on the current thread.
191
+ #
192
+ # @example Set the field selection.
193
+ # Threaded.selection = { field: 1 }
194
+ #
195
+ # @param [ Hash ] value The current field selection.
196
+ #
197
+ # @return [ Hash ] The field selection.
198
+ #
199
+ # @since 2.4.4
200
+ def selection=(value)
201
+ Thread.current[:"[mongoid]:selection"] = value
202
+ end
203
+
178
204
  # Get the mongoid scope stack for chained criteria.
179
205
  #
180
206
  # @example Get the scope stack.
@@ -7,7 +7,7 @@ module Mongoid #:nodoc:
7
7
  extend ActiveSupport::Concern
8
8
 
9
9
  included do
10
- field :updated_at, :type => Time, :versioned => false
10
+ field :updated_at, :type => Time
11
11
  set_callback :save, :before, :set_updated_at, :if => :able_to_set_updated_at?
12
12
  end
13
13
 
@@ -41,32 +41,28 @@ module Mongoid #:nodoc:
41
41
  #
42
42
  # @since 1.0.0
43
43
  def validate_each(document, attribute, value)
44
- return unless document.send("attribute_changed?", attribute.to_s)
44
+ attrib, val = to_validate(document, attribute, value)
45
+ return unless validation_required?(document, attrib)
45
46
  if document.embedded?
46
47
  return if skip_validation?(document)
47
48
  relation = document._parent.send(document.metadata.name)
48
- criteria = relation.where(criterion(document, attribute, value))
49
- criteria = scope(criteria, document, attribute)
50
- if document.primary_key == Array.wrap(attribute)
51
- if criteria.count > 1
52
- document.errors.add(
53
- attribute,
54
- :taken, options.except(:case_sensitive, :scope).merge(:value => value)
55
- )
56
- end
57
- else
58
- if criteria.exists?
59
- document.errors.add(
60
- attribute,
61
- :taken,
62
- options.except(:case_sensitive, :scope).merge(:value => value)
63
- )
64
- end
49
+ criteria = relation.where(criterion(document, attrib, val))
50
+ criteria = scope(criteria, document, attrib)
51
+ if criteria.count > 1
52
+ document.errors.add(
53
+ attrib,
54
+ :taken,
55
+ options.except(:case_sensitive, :scope).merge(:val => val)
56
+ )
65
57
  end
66
58
  else
67
- criteria = klass.where(criterion(document, attribute, value))
68
- criteria = scope(criteria, document, attribute)
69
- document.errors.add(attribute, :taken, options.except(:case_sensitive, :scope).merge(:value => value)) if criteria.exists?
59
+ criteria = klass.where(criterion(document, attrib, val))
60
+ criteria = scope(criteria, document, attrib)
61
+ if criteria.exists?
62
+ document.errors.add(
63
+ attrib, :taken, options.except(:case_sensitive, :scope).merge(:val => val)
64
+ )
65
+ end
70
66
  end
71
67
  end
72
68
 
@@ -98,8 +94,7 @@ module Mongoid #:nodoc:
98
94
  # @since 2.3.0
99
95
  def criterion(document, attribute, value)
100
96
  { attribute => filter(value) }.tap do |selector|
101
- if document.persisted? ||
102
- (document.embedded? && (document.primary_key != Array.wrap(attribute)))
97
+ if document.persisted? && !document.embedded?
103
98
  selector.merge!(:_id => { "$ne" => document.id })
104
99
  end
105
100
  end
@@ -131,10 +126,8 @@ module Mongoid #:nodoc:
131
126
  #
132
127
  # @since 2.3.0
133
128
  def scope(criteria, document, attribute)
134
- unless document.primary_key == Array.wrap(attribute)
135
- Array.wrap(options[:scope]).each do |item|
136
- criteria = criteria.where(item => document.attributes[item.to_s])
137
- end
129
+ Array.wrap(options[:scope]).each do |item|
130
+ criteria = criteria.where(item => document.attributes[item.to_s])
138
131
  end
139
132
  criteria
140
133
  end
@@ -152,6 +145,63 @@ module Mongoid #:nodoc:
152
145
  def skip_validation?(document)
153
146
  !document._parent || document.embedded_one?
154
147
  end
148
+
149
+ # Scope reference has changed?
150
+ #
151
+ # @example Has scope reference changed?
152
+ # validator.scope_value_changed?(doc)
153
+ #
154
+ # @param [ Document ] document The embedded document.
155
+ #
156
+ # @return [ true, false ] If the scope reference has changed.
157
+ #
158
+ # @since
159
+ def scope_value_changed?(document)
160
+ Array.wrap(options[:scope]).any? do |item|
161
+ document.send("attribute_changed?", item.to_s)
162
+ end
163
+ end
164
+
165
+ # Get the name of the field and the value to validate. This is for the
166
+ # case when we validate a relation via the relation name and not the key,
167
+ # we need to send the key name and value to the db, not the relation
168
+ # object.
169
+ #
170
+ # @example Get the name and key to validate.
171
+ # validator.to_validate(doc, :parent, Parent.new)
172
+ #
173
+ # @param [ Document ] document The doc getting validated.
174
+ # @param [ Symbol ] attribute The attribute getting validated.
175
+ # @param [ Object ] value The value of the attribute.
176
+ #
177
+ # @return [ Array<Object, Object> ] The field and value.
178
+ #
179
+ # @since 2.4.4
180
+ def to_validate(document, attribute, value)
181
+ metadata = document.relations[attribute.to_s]
182
+ if metadata && metadata.stores_foreign_key?
183
+ [ metadata.foreign_key, value.id ]
184
+ else
185
+ [ attribute, value ]
186
+ end
187
+ end
188
+
189
+ # Are we required to validate the document?
190
+ #
191
+ # @example Is validation needed?
192
+ # validator.validation_required?(doc, :field)
193
+ #
194
+ # @param [ Document ] document The document getting validated.
195
+ # @param [ Symbol ] attribute The attribute to validate.
196
+ #
197
+ # @return [ true, false ] If we need to validate.
198
+ #
199
+ # @since 2.4.4
200
+ def validation_required?(document, attribute)
201
+ document.new_record? ||
202
+ document.send("attribute_changed?", attribute.to_s) ||
203
+ scope_value_changed?(document)
204
+ end
155
205
  end
156
206
  end
157
207
  end
@@ -1,4 +1,4 @@
1
1
  # encoding: utf-8
2
2
  module Mongoid #:nodoc
3
- VERSION = "2.4.3"
3
+ VERSION = "2.4.4"
4
4
  end
@@ -78,7 +78,7 @@ module Mongoid #:nodoc:
78
78
  #
79
79
  # @since 2.1.0
80
80
  def versioned_changes
81
- only_versioned_attributes(changes)
81
+ only_versioned_attributes(changes.except("updated_at"))
82
82
  end
83
83
 
84
84
  # Filters the results of +attributes+ by removing any fields that should
@@ -18,7 +18,7 @@ module Rails #:nodoc:
18
18
  Dir.glob(pattern).each do |file|
19
19
  logger = Logger.new($stdout)
20
20
  begin
21
- model = determine_model(file)
21
+ model = determine_model(file, logger)
22
22
  rescue => e
23
23
  logger.error(%Q{Failed to determine model from #{file}:
24
24
  #{e.class}:#{e.message}
@@ -83,10 +83,17 @@ module Rails #:nodoc:
83
83
  # @return [ Class ] The model.
84
84
  #
85
85
  # @since 2.1.0
86
- def determine_model(file)
86
+ def determine_model(file, logger)
87
87
  if file =~ /app\/models\/(.*).rb$/
88
88
  model_path = $1.split('/')
89
- klass = model_path.map { |path| path.camelize }.join('::').constantize
89
+ begin
90
+ parts = model_path.map { |path| path.camelize }
91
+ name = parts.join("::")
92
+ klass = name.constantize
93
+ rescue NameError => e
94
+ logger.info("Attempted to constantize #{name}, trying without namespacing.")
95
+ klass = parts.last.constantize
96
+ end
90
97
  if klass.ancestors.include?(::Mongoid::Document) && !klass.embedded
91
98
  return klass
92
99
  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: 2.4.3
4
+ version: 2.4.4
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,11 +9,11 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-01-28 00:00:00.000000000 Z
12
+ date: 2012-02-13 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: activemodel
16
- requirement: &70324286112920 !ruby/object:Gem::Requirement
16
+ requirement: &70339260281720 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ~>
@@ -21,10 +21,10 @@ dependencies:
21
21
  version: '3.1'
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *70324286112920
24
+ version_requirements: *70339260281720
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: tzinfo
27
- requirement: &70324286112300 !ruby/object:Gem::Requirement
27
+ requirement: &70339260281240 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ~>
@@ -32,10 +32,10 @@ dependencies:
32
32
  version: 0.3.22
33
33
  type: :runtime
34
34
  prerelease: false
35
- version_requirements: *70324286112300
35
+ version_requirements: *70339260281240
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: mongo
38
- requirement: &70324286111520 !ruby/object:Gem::Requirement
38
+ requirement: &70339260280760 !ruby/object:Gem::Requirement
39
39
  none: false
40
40
  requirements:
41
41
  - - ~>
@@ -43,10 +43,10 @@ dependencies:
43
43
  version: '1.3'
44
44
  type: :runtime
45
45
  prerelease: false
46
- version_requirements: *70324286111520
46
+ version_requirements: *70339260280760
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: rdoc
49
- requirement: &70324286110820 !ruby/object:Gem::Requirement
49
+ requirement: &70339260280280 !ruby/object:Gem::Requirement
50
50
  none: false
51
51
  requirements:
52
52
  - - ~>
@@ -54,10 +54,10 @@ dependencies:
54
54
  version: 3.5.0
55
55
  type: :development
56
56
  prerelease: false
57
- version_requirements: *70324286110820
57
+ version_requirements: *70339260280280
58
58
  - !ruby/object:Gem::Dependency
59
59
  name: bson_ext
60
- requirement: &70324286066060 !ruby/object:Gem::Requirement
60
+ requirement: &70339260279800 !ruby/object:Gem::Requirement
61
61
  none: false
62
62
  requirements:
63
63
  - - ~>
@@ -65,10 +65,10 @@ dependencies:
65
65
  version: '1.3'
66
66
  type: :development
67
67
  prerelease: false
68
- version_requirements: *70324286066060
68
+ version_requirements: *70339260279800
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: mocha
71
- requirement: &70324286064560 !ruby/object:Gem::Requirement
71
+ requirement: &70339260279320 !ruby/object:Gem::Requirement
72
72
  none: false
73
73
  requirements:
74
74
  - - ~>
@@ -76,10 +76,10 @@ dependencies:
76
76
  version: '0.10'
77
77
  type: :development
78
78
  prerelease: false
79
- version_requirements: *70324286064560
79
+ version_requirements: *70339260279320
80
80
  - !ruby/object:Gem::Dependency
81
81
  name: rspec
82
- requirement: &70324286063860 !ruby/object:Gem::Requirement
82
+ requirement: &70339260278840 !ruby/object:Gem::Requirement
83
83
  none: false
84
84
  requirements:
85
85
  - - ~>
@@ -87,10 +87,10 @@ dependencies:
87
87
  version: '2.6'
88
88
  type: :development
89
89
  prerelease: false
90
- version_requirements: *70324286063860
90
+ version_requirements: *70339260278840
91
91
  - !ruby/object:Gem::Dependency
92
92
  name: guard-rspec
93
- requirement: &70324286063360 !ruby/object:Gem::Requirement
93
+ requirement: &70339260278360 !ruby/object:Gem::Requirement
94
94
  none: false
95
95
  requirements:
96
96
  - - ~>
@@ -98,10 +98,10 @@ dependencies:
98
98
  version: '0.6'
99
99
  type: :development
100
100
  prerelease: false
101
- version_requirements: *70324286063360
101
+ version_requirements: *70339260278360
102
102
  - !ruby/object:Gem::Dependency
103
103
  name: ammeter
104
- requirement: &70324286062880 !ruby/object:Gem::Requirement
104
+ requirement: &70339260277880 !ruby/object:Gem::Requirement
105
105
  none: false
106
106
  requirements:
107
107
  - - ~>
@@ -109,7 +109,7 @@ dependencies:
109
109
  version: 0.1.3
110
110
  type: :development
111
111
  prerelease: false
112
- version_requirements: *70324286062880
112
+ version_requirements: *70339260277880
113
113
  description: Mongoid is an ODM (Object Document Mapper) Framework for MongoDB, written
114
114
  in Ruby.
115
115
  email:
@@ -414,7 +414,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
414
414
  version: '0'
415
415
  segments:
416
416
  - 0
417
- hash: 907876578455724233
417
+ hash: -632008619262652936
418
418
  required_rubygems_version: !ruby/object:Gem::Requirement
419
419
  none: false
420
420
  requirements: