mongoid 2.4.3 → 2.4.4

Sign up to get free protection for your applications and to get access to all the features.
@@ -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: