mongoid 2.0.0.rc.8 → 2.0.0
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.
- data/lib/mongoid/atomicity.rb +3 -3
- data/lib/mongoid/attributes.rb +2 -3
- data/lib/mongoid/criteria.rb +15 -0
- data/lib/mongoid/criterion/inclusion.rb +1 -1
- data/lib/mongoid/criterion/optional.rb +2 -2
- data/lib/mongoid/default_scope.rb +2 -2
- data/lib/mongoid/dirty.rb +2 -1
- data/lib/mongoid/document.rb +31 -28
- data/lib/mongoid/extensions/object_id/conversions.rb +5 -4
- data/lib/mongoid/paranoia.rb +2 -2
- data/lib/mongoid/persistence/atomic/add_to_set.rb +4 -2
- data/lib/mongoid/persistence/command.rb +12 -0
- data/lib/mongoid/persistence/remove.rb +1 -1
- data/lib/mongoid/persistence/remove_embedded.rb +1 -1
- data/lib/mongoid/relations/bindings/referenced/many_to_many.rb +0 -2
- data/lib/mongoid/relations/embedded/many.rb +1 -1
- data/lib/mongoid/relations/referenced/many_to_many.rb +45 -16
- data/lib/mongoid/version.rb +1 -1
- metadata +4 -6
data/lib/mongoid/atomicity.rb
CHANGED
|
@@ -38,10 +38,10 @@ module Mongoid #:nodoc:
|
|
|
38
38
|
changes = child._sets
|
|
39
39
|
updates["$set"].update(changes)
|
|
40
40
|
unless changes.empty?
|
|
41
|
-
processed[child.
|
|
41
|
+
processed[child._conflicting_modification_key] = true
|
|
42
42
|
end
|
|
43
43
|
|
|
44
|
-
if processed.has_key?(child.
|
|
44
|
+
if processed.has_key?(child._conflicting_modification_key)
|
|
45
45
|
target = :other
|
|
46
46
|
else
|
|
47
47
|
target = "$pushAll"
|
|
@@ -70,7 +70,7 @@ module Mongoid #:nodoc:
|
|
|
70
70
|
# person._conflicting_modification_key
|
|
71
71
|
#
|
|
72
72
|
# @return [ String ] The conflicting key.
|
|
73
|
-
def
|
|
73
|
+
def _conflicting_modification_key
|
|
74
74
|
_path.sub(/\..*/, '')
|
|
75
75
|
end
|
|
76
76
|
|
data/lib/mongoid/attributes.rb
CHANGED
|
@@ -39,8 +39,7 @@ module Mongoid #:nodoc:
|
|
|
39
39
|
def read_attribute(name)
|
|
40
40
|
access = name.to_s
|
|
41
41
|
value = @attributes[access]
|
|
42
|
-
|
|
43
|
-
accessed(access, typed_value)
|
|
42
|
+
accessed(access, value)
|
|
44
43
|
end
|
|
45
44
|
alias :[] :read_attribute
|
|
46
45
|
|
|
@@ -55,7 +54,7 @@ module Mongoid #:nodoc:
|
|
|
55
54
|
# @since 1.0.0
|
|
56
55
|
def remove_attribute(name)
|
|
57
56
|
access = name.to_s
|
|
58
|
-
modify(access, @attributes.delete(
|
|
57
|
+
modify(access, @attributes.delete(access), nil)
|
|
59
58
|
end
|
|
60
59
|
|
|
61
60
|
# Override respond_to? so it responds properly for dynamic attributes.
|
data/lib/mongoid/criteria.rb
CHANGED
|
@@ -214,6 +214,21 @@ module Mongoid #:nodoc:
|
|
|
214
214
|
end
|
|
215
215
|
end
|
|
216
216
|
|
|
217
|
+
# Returns true if criteria responds to the given method.
|
|
218
|
+
#
|
|
219
|
+
# Options:
|
|
220
|
+
#
|
|
221
|
+
# name: The name of the class method on the +Document+.
|
|
222
|
+
# include_private: The arguments passed to the method.
|
|
223
|
+
#
|
|
224
|
+
# Example:
|
|
225
|
+
#
|
|
226
|
+
# <tt>criteria.respond_to?(:batch_update)</tt>
|
|
227
|
+
def respond_to?(name, include_private = false)
|
|
228
|
+
# don't include klass private methods because method_missing won't call them
|
|
229
|
+
super || @klass.respond_to?(name) || entries.respond_to?(name, include_private)
|
|
230
|
+
end
|
|
231
|
+
|
|
217
232
|
# Returns the selector and options as a +Hash+ that would be passed to a
|
|
218
233
|
# scope for use with named scopes.
|
|
219
234
|
def scoped
|
|
@@ -155,7 +155,7 @@ module Mongoid #:nodoc:
|
|
|
155
155
|
selector = case selector
|
|
156
156
|
when String then {"$where" => selector}
|
|
157
157
|
else
|
|
158
|
-
BSON::ObjectId.convert(klass, selector || {}).expand_complex_criteria
|
|
158
|
+
BSON::ObjectId.convert(klass, selector || {}, false).expand_complex_criteria
|
|
159
159
|
end
|
|
160
160
|
|
|
161
161
|
selector.each_pair do |key, value|
|
|
@@ -98,8 +98,8 @@ module Mongoid #:nodoc:
|
|
|
98
98
|
#
|
|
99
99
|
# Example:
|
|
100
100
|
#
|
|
101
|
-
# <tt>criteria.
|
|
102
|
-
# <tt>criteria.
|
|
101
|
+
# <tt>criteria.for_ids("4ab2bc4b8ad548971900005c")</tt>
|
|
102
|
+
# <tt>criteria.for_ids(["4ab2bc4b8ad548971900005c", "4c454e7ebf4b98032d000001"])</tt>
|
|
103
103
|
#
|
|
104
104
|
# Returns: <tt>self</tt>
|
|
105
105
|
def for_ids(*ids)
|
|
@@ -28,8 +28,8 @@ module Mongoid #:nodoc:
|
|
|
28
28
|
# @param [ Hash ] conditions The conditions to create with.
|
|
29
29
|
#
|
|
30
30
|
# @since 2.0.0.rc.1
|
|
31
|
-
def default_scope(conditions = {}
|
|
32
|
-
self.default_scoping = Scope.new(conditions
|
|
31
|
+
def default_scope(conditions = {})
|
|
32
|
+
self.default_scoping = Scope.new(conditions).conditions.scoped
|
|
33
33
|
end
|
|
34
34
|
end
|
|
35
35
|
end
|
data/lib/mongoid/dirty.rb
CHANGED
|
@@ -192,8 +192,9 @@ module Mongoid #:nodoc:
|
|
|
192
192
|
#
|
|
193
193
|
# <tt>person.accessed("aliases", [ "007" ])</tt>
|
|
194
194
|
def accessed(name, value)
|
|
195
|
+
return value unless value.is_a?(Enumerable)
|
|
195
196
|
@accessed ||= {}
|
|
196
|
-
@accessed[name] = value.dup
|
|
197
|
+
@accessed[name] = value.dup unless @accessed.has_key?(name)
|
|
197
198
|
value
|
|
198
199
|
end
|
|
199
200
|
|
data/lib/mongoid/document.rb
CHANGED
|
@@ -21,7 +21,7 @@ module Mongoid #:nodoc:
|
|
|
21
21
|
#
|
|
22
22
|
# @return [ Integer ] -1, 0, 1.
|
|
23
23
|
def <=>(other)
|
|
24
|
-
|
|
24
|
+
raw_attributes["_id"].to_s <=> other.raw_attributes["_id"].to_s
|
|
25
25
|
end
|
|
26
26
|
|
|
27
27
|
# Performs equality checking on the document ids. For more robust
|
|
@@ -34,8 +34,8 @@ module Mongoid #:nodoc:
|
|
|
34
34
|
#
|
|
35
35
|
# @return [ true, false ] True if the ids are equal, false if not.
|
|
36
36
|
def ==(other)
|
|
37
|
-
|
|
38
|
-
|
|
37
|
+
self.class == other.class &&
|
|
38
|
+
raw_attributes["_id"] == other.raw_attributes["_id"]
|
|
39
39
|
end
|
|
40
40
|
|
|
41
41
|
# Performs class equality checking.
|
|
@@ -62,6 +62,31 @@ module Mongoid #:nodoc:
|
|
|
62
62
|
self == (other)
|
|
63
63
|
end
|
|
64
64
|
|
|
65
|
+
# Freezes the internal attributes of the document.
|
|
66
|
+
#
|
|
67
|
+
# @example Freeze the document
|
|
68
|
+
# document.freeze
|
|
69
|
+
#
|
|
70
|
+
# @return [ Document ] The document.
|
|
71
|
+
#
|
|
72
|
+
# @since 2.0.0
|
|
73
|
+
def freeze
|
|
74
|
+
raw_attributes.freeze
|
|
75
|
+
self
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
# Checks if the document is frozen
|
|
79
|
+
#
|
|
80
|
+
# @example Check if frozen
|
|
81
|
+
# document.frozen?
|
|
82
|
+
#
|
|
83
|
+
# @return [ true, false ] True if frozen, else false.
|
|
84
|
+
#
|
|
85
|
+
# @since 2.0.0
|
|
86
|
+
def frozen?
|
|
87
|
+
raw_attributes.frozen?
|
|
88
|
+
end
|
|
89
|
+
|
|
65
90
|
# Delegates to id in order to allow two records of the same type and id to
|
|
66
91
|
# work with something like:
|
|
67
92
|
#
|
|
@@ -73,7 +98,7 @@ module Mongoid #:nodoc:
|
|
|
73
98
|
#
|
|
74
99
|
# @return [ Integer ] The hash of the document's id.
|
|
75
100
|
def hash
|
|
76
|
-
|
|
101
|
+
raw_attributes["_id"].hash
|
|
77
102
|
end
|
|
78
103
|
|
|
79
104
|
# Return the attributes hash with indifferent access. Used mostly for
|
|
@@ -85,7 +110,7 @@ module Mongoid #:nodoc:
|
|
|
85
110
|
#
|
|
86
111
|
# @return [ HashWithIndifferentAccess ] The attributes.
|
|
87
112
|
def attributes
|
|
88
|
-
|
|
113
|
+
raw_attributes.with_indifferent_access
|
|
89
114
|
end
|
|
90
115
|
|
|
91
116
|
# Generate an id for this +Document+.
|
|
@@ -195,7 +220,7 @@ module Mongoid #:nodoc:
|
|
|
195
220
|
#
|
|
196
221
|
# @return [ Hash ] A hash of all attributes in the hierarchy.
|
|
197
222
|
def as_document
|
|
198
|
-
attributes =
|
|
223
|
+
attributes = raw_attributes
|
|
199
224
|
attributes.tap do |attrs|
|
|
200
225
|
relations.select { |name, meta| meta.embedded? }.each do |name, meta|
|
|
201
226
|
relation = send(name, false, :continue => false)
|
|
@@ -258,27 +283,5 @@ module Mongoid #:nodoc:
|
|
|
258
283
|
:mongoid
|
|
259
284
|
end
|
|
260
285
|
end
|
|
261
|
-
|
|
262
|
-
# Freezes the internal attributes of the document.
|
|
263
|
-
#
|
|
264
|
-
# @example Freeze the document
|
|
265
|
-
# document.freeze
|
|
266
|
-
#
|
|
267
|
-
# @return [ Document ] The document.
|
|
268
|
-
def freeze
|
|
269
|
-
raw_attributes.freeze
|
|
270
|
-
self
|
|
271
|
-
end
|
|
272
|
-
|
|
273
|
-
# Checks if the document is frozen
|
|
274
|
-
#
|
|
275
|
-
# @example Check if frozen
|
|
276
|
-
# document.frozen?
|
|
277
|
-
#
|
|
278
|
-
# @return [ true, false ] True if frozen, else false.
|
|
279
|
-
def frozen?
|
|
280
|
-
raw_attributes.frozen?
|
|
281
|
-
end
|
|
282
|
-
|
|
283
286
|
end
|
|
284
287
|
end
|
|
@@ -62,21 +62,22 @@ module Mongoid #:nodoc:
|
|
|
62
62
|
# @return [ BSON::ObjectId, Array, Hash ] The converted object ids.
|
|
63
63
|
#
|
|
64
64
|
# @since 2.0.0.rc.7
|
|
65
|
-
def convert(klass, args)
|
|
65
|
+
def convert(klass, args, reject_blank = true)
|
|
66
66
|
return args if args.is_a?(BSON::ObjectId) || !klass.using_object_ids?
|
|
67
67
|
case args
|
|
68
68
|
when ::String
|
|
69
69
|
args.blank? ? nil : BSON::ObjectId.from_string(args)
|
|
70
70
|
when ::Array
|
|
71
|
-
args.reject(&:blank?)
|
|
72
|
-
|
|
71
|
+
args = args.reject(&:blank?) if reject_blank
|
|
72
|
+
args.map do |arg|
|
|
73
|
+
convert(klass, arg, reject_blank)
|
|
73
74
|
end
|
|
74
75
|
when ::Hash
|
|
75
76
|
args.tap do |hash|
|
|
76
77
|
hash.each_pair do |key, value|
|
|
77
78
|
next unless key.to_s =~ /id/
|
|
78
79
|
begin
|
|
79
|
-
hash[key] = convert(klass, value)
|
|
80
|
+
hash[key] = convert(klass, value, reject_blank)
|
|
80
81
|
rescue BSON::InvalidObjectId; end
|
|
81
82
|
end
|
|
82
83
|
end
|
data/lib/mongoid/paranoia.rb
CHANGED
|
@@ -79,12 +79,12 @@ module Mongoid #:nodoc:
|
|
|
79
79
|
module ClassMethods #:nodoc:
|
|
80
80
|
|
|
81
81
|
# Override the default +Criteria+ accessor to only get existing
|
|
82
|
-
# documents.
|
|
82
|
+
# documents. Passes all arguments up to +NamedScope.criteria+
|
|
83
83
|
#
|
|
84
84
|
# Returns:
|
|
85
85
|
#
|
|
86
86
|
# A +Criteria+ for deleted_at not existing.
|
|
87
|
-
def criteria(
|
|
87
|
+
def criteria(*args)
|
|
88
88
|
super.where(:deleted_at.exists => false)
|
|
89
89
|
end
|
|
90
90
|
|
|
@@ -20,8 +20,10 @@ module Mongoid #:nodoc:
|
|
|
20
20
|
values = document.send(field)
|
|
21
21
|
values.push(value) unless values.include?(value)
|
|
22
22
|
values.tap do
|
|
23
|
-
document.
|
|
24
|
-
|
|
23
|
+
if document.persisted?
|
|
24
|
+
document.collection.update(document._selector, operation("$addToSet"), options)
|
|
25
|
+
document.changes.delete(field.to_s)
|
|
26
|
+
end
|
|
25
27
|
end
|
|
26
28
|
end
|
|
27
29
|
end
|
|
@@ -12,6 +12,7 @@ module Mongoid #:nodoc:
|
|
|
12
12
|
:klass,
|
|
13
13
|
:options,
|
|
14
14
|
:selector,
|
|
15
|
+
:suppress,
|
|
15
16
|
:validate
|
|
16
17
|
|
|
17
18
|
# Initialize the persistence +Command+.
|
|
@@ -28,6 +29,7 @@ module Mongoid #:nodoc:
|
|
|
28
29
|
def initialize(document_or_class, options = {}, selector = {})
|
|
29
30
|
init(document_or_class)
|
|
30
31
|
validate = options[:validate]
|
|
32
|
+
@suppress = options[:suppress]
|
|
31
33
|
@validate = (validate.nil? ? true : validate)
|
|
32
34
|
@selector = selector
|
|
33
35
|
@options = { :safe => safe_mode?(options) }
|
|
@@ -54,6 +56,16 @@ module Mongoid #:nodoc:
|
|
|
54
56
|
@collection = @klass.collection
|
|
55
57
|
end
|
|
56
58
|
end
|
|
59
|
+
|
|
60
|
+
# Should we suppress parent notifications?
|
|
61
|
+
#
|
|
62
|
+
# @example Suppress notifications?
|
|
63
|
+
# command.suppress?
|
|
64
|
+
#
|
|
65
|
+
# @return [ true, false ] Should the parent notifcations be suppressed.
|
|
66
|
+
def suppress?
|
|
67
|
+
!!@suppress
|
|
68
|
+
end
|
|
57
69
|
end
|
|
58
70
|
end
|
|
59
71
|
end
|
|
@@ -33,7 +33,7 @@ module Mongoid #:nodoc:
|
|
|
33
33
|
if document.embedded?
|
|
34
34
|
Persistence::RemoveEmbedded.new(
|
|
35
35
|
document,
|
|
36
|
-
options.merge(:validate => validate)
|
|
36
|
+
options.merge(:validate => validate, :suppress => suppress)
|
|
37
37
|
).persist
|
|
38
38
|
else
|
|
39
39
|
collection.remove({ :_id => document.id }, options)
|
|
@@ -27,7 +27,7 @@ module Mongoid #:nodoc:
|
|
|
27
27
|
# +true+ or +false+, depending on if the removal passed.
|
|
28
28
|
def persist
|
|
29
29
|
parent = document._parent
|
|
30
|
-
parent.remove_child(document)
|
|
30
|
+
parent.remove_child(document) unless suppress?
|
|
31
31
|
unless parent.new_record?
|
|
32
32
|
update = { document._remover => removal_selector }
|
|
33
33
|
collection.update(parent._selector, update, options.merge(:multi => false))
|
|
@@ -41,8 +41,6 @@ module Mongoid # :nodoc:
|
|
|
41
41
|
#
|
|
42
42
|
# @since 2.0.0.rc.1
|
|
43
43
|
def bind_one(doc, options = {})
|
|
44
|
-
keys = base.do_or_do_not(metadata.foreign_key)
|
|
45
|
-
keys.push(doc.id) unless keys.include?(doc.id)
|
|
46
44
|
if options[:continue]
|
|
47
45
|
inverse = metadata.inverse(target)
|
|
48
46
|
if inverse
|
|
@@ -25,15 +25,30 @@ module Mongoid # :nodoc:
|
|
|
25
25
|
args.flatten.each do |doc|
|
|
26
26
|
return doc unless doc
|
|
27
27
|
append(doc, options)
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
base.add_to_set(metadata.foreign_key, doc.id)
|
|
31
|
-
end
|
|
28
|
+
base.add_to_set(metadata.foreign_key, doc.id)
|
|
29
|
+
doc.save if base.persisted? && !options[:binding]
|
|
32
30
|
end
|
|
33
31
|
end
|
|
34
32
|
alias :concat :<<
|
|
35
33
|
alias :push :<<
|
|
36
34
|
|
|
35
|
+
# Builds a new document in the relation and appends it to the target.
|
|
36
|
+
# Takes an optional type if you want to specify a subclass.
|
|
37
|
+
#
|
|
38
|
+
# @example Build a new document on the relation.
|
|
39
|
+
# person.people.build(:name => "Bozo")
|
|
40
|
+
#
|
|
41
|
+
# @param [ Hash ] attributes The attributes to build the document with.
|
|
42
|
+
# @param [ Class ] type Optional class to build the document with.
|
|
43
|
+
#
|
|
44
|
+
# @return [ Document ] The new document.
|
|
45
|
+
def build(attributes = {}, type = nil, &block)
|
|
46
|
+
super.tap do |doc|
|
|
47
|
+
base.send(metadata.foreign_key).push(doc.id)
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
alias :new :build
|
|
51
|
+
|
|
37
52
|
# Creates a new document on the references many relation. This will
|
|
38
53
|
# save the document if the parent has been persisted.
|
|
39
54
|
#
|
|
@@ -44,12 +59,10 @@ module Mongoid # :nodoc:
|
|
|
44
59
|
# @param [ Class ] type The optional type of document to create.
|
|
45
60
|
#
|
|
46
61
|
# @return [ Document ] The newly created document.
|
|
47
|
-
def create(attributes = nil, type = nil)
|
|
48
|
-
build(attributes, type).tap do |doc|
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
base.add_to_set(metadata.foreign_key, doc.id)
|
|
52
|
-
end
|
|
62
|
+
def create(attributes = nil, type = nil, &block)
|
|
63
|
+
build(attributes, type, &block).tap do |doc|
|
|
64
|
+
base.add_to_set(metadata.foreign_key, doc.id)
|
|
65
|
+
doc.save if base.persisted?
|
|
53
66
|
end
|
|
54
67
|
end
|
|
55
68
|
|
|
@@ -66,12 +79,10 @@ module Mongoid # :nodoc:
|
|
|
66
79
|
# @raise [ Errors::Validations ] If validation failed.
|
|
67
80
|
#
|
|
68
81
|
# @return [ Document ] The newly created document.
|
|
69
|
-
def create!(attributes = nil, type = nil)
|
|
70
|
-
build(attributes, type).tap do |doc|
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
base.add_to_set(metadata.foreign_key, doc.id)
|
|
74
|
-
end
|
|
82
|
+
def create!(attributes = nil, type = nil, &block)
|
|
83
|
+
build(attributes, type, &block).tap do |doc|
|
|
84
|
+
base.add_to_set(metadata.foreign_key, doc.id)
|
|
85
|
+
doc.save! if base.persisted?
|
|
75
86
|
end
|
|
76
87
|
end
|
|
77
88
|
|
|
@@ -121,6 +132,23 @@ module Mongoid # :nodoc:
|
|
|
121
132
|
remove_all(conditions, :destroy_all)
|
|
122
133
|
end
|
|
123
134
|
|
|
135
|
+
# Instantiate a new references_many relation. Will set the foreign key
|
|
136
|
+
# and the base on the inverse object.
|
|
137
|
+
#
|
|
138
|
+
# @example Create the new relation.
|
|
139
|
+
# Referenced::ManyToMany.new(base, target, metadata)
|
|
140
|
+
#
|
|
141
|
+
# @param [ Document ] base The document this relation hangs off of.
|
|
142
|
+
# @param [ Array<Document> ] target The target of the relation.
|
|
143
|
+
# @param [ Metadata ] metadata The relation's metadata.
|
|
144
|
+
def initialize(base, target, metadata)
|
|
145
|
+
init(base, target, metadata) do
|
|
146
|
+
unless base.frozen?
|
|
147
|
+
base.send(metadata.foreign_key_setter, target.map(&:id))
|
|
148
|
+
end
|
|
149
|
+
end
|
|
150
|
+
end
|
|
151
|
+
|
|
124
152
|
# Removes all associations between the base document and the target
|
|
125
153
|
# documents by deleting the foreign keys and the references, orphaning
|
|
126
154
|
# the target documents in the process.
|
|
@@ -160,6 +188,7 @@ module Mongoid # :nodoc:
|
|
|
160
188
|
if new_target
|
|
161
189
|
binding.unbind(options)
|
|
162
190
|
relation.target = new_target.to_a
|
|
191
|
+
base.send(metadata.foreign_key_setter, new_target.map(&:id))
|
|
163
192
|
bind(options)
|
|
164
193
|
else
|
|
165
194
|
relation.target = unbind(options)
|
data/lib/mongoid/version.rb
CHANGED
metadata
CHANGED
|
@@ -1,14 +1,12 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: mongoid
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
prerelease:
|
|
4
|
+
prerelease: false
|
|
5
5
|
segments:
|
|
6
6
|
- 2
|
|
7
7
|
- 0
|
|
8
8
|
- 0
|
|
9
|
-
|
|
10
|
-
- 8
|
|
11
|
-
version: 2.0.0.rc.8
|
|
9
|
+
version: 2.0.0
|
|
12
10
|
platform: ruby
|
|
13
11
|
authors:
|
|
14
12
|
- Durran Jordan
|
|
@@ -16,7 +14,7 @@ autorequire:
|
|
|
16
14
|
bindir: bin
|
|
17
15
|
cert_chain: []
|
|
18
16
|
|
|
19
|
-
date: 2011-03-
|
|
17
|
+
date: 2011-03-30 00:00:00 +02:00
|
|
20
18
|
default_executable:
|
|
21
19
|
dependencies:
|
|
22
20
|
- !ruby/object:Gem::Dependency
|
|
@@ -381,7 +379,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
|
381
379
|
requirements:
|
|
382
380
|
- - ">="
|
|
383
381
|
- !ruby/object:Gem::Version
|
|
384
|
-
hash:
|
|
382
|
+
hash: 2548695650621036943
|
|
385
383
|
segments:
|
|
386
384
|
- 0
|
|
387
385
|
version: "0"
|