redis_orm 0.2 → 0.3

Sign up to get free protection for your applications and to get access to all the features.
data/CHANGELOG CHANGED
@@ -1,3 +1,8 @@
1
+ v0.3 [06-06-2011]
2
+ * fixed #find functionality both for model itself and for has_many proxy
3
+ * made sure ORM correctly resets associations when nil/[] provided
4
+ * improved documentation, test for has_many proxy methods :+= and :<< added
5
+
1
6
  v0.2 [04-06-2011]
2
7
  * added polymorphic association
3
8
  * added *timestamps* declaration for the model
data/README.md CHANGED
@@ -87,7 +87,15 @@ For example we associate 2 photos with the album
87
87
  @album.photos << @photo1
88
88
  ```
89
89
 
90
- To extract all or part of the associated records by far you could use 3 options (#find is an alias for #all in has_many proxy):
90
+ To extract all or part of the associated records you could use 3 options for now (#find is an alias for #all in has_many proxy):
91
+
92
+ * :limit
93
+
94
+ * :offset
95
+
96
+ * :order
97
+
98
+ Either :desc or :asc (default), since records are stored with Time.now.to_f scores, be default they could be fetched only in that (or reversed) order. To store them in different order you should *zadd* record's id to some other sorted list manually.
91
99
 
92
100
  ```ruby
93
101
  @album.photos.all(:limit => 0, :offset => 0).should == []
@@ -295,6 +303,32 @@ All associations supports following options:
295
303
 
296
304
  Symbol could be either :destroy or :nullify (default value)
297
305
 
306
+ ### Clearing/reseting associations
307
+
308
+ You could clear/reset associations by assigning appropriately nil/[] to it:
309
+
310
+ ```ruby
311
+ # has_many association
312
+ @article.comments << [@comment1, @comment2]
313
+ @article.comments.count # => 2
314
+ @comment1.article # => @article
315
+
316
+ # clear
317
+ @article.comments = []
318
+ @article.comments.count # => 0
319
+ @comment1.article # => nil
320
+
321
+ # belongs_to (same for has_one)
322
+ @article.comments << [@comment1, @comment2]
323
+ @article.comments.count # => 2
324
+ @comment1.article # => @article
325
+
326
+ # clear
327
+ @comment1.article = nil
328
+ @article.comments.count # => 1
329
+ @comment1.article # => nil
330
+ ```
331
+
298
332
  For more examples please check test/associations_test.rb and test/polymorphic_test.rb
299
333
 
300
334
  ## Validation
data/Rakefile CHANGED
@@ -3,7 +3,7 @@ require 'rake'
3
3
 
4
4
  require 'echoe'
5
5
 
6
- Echoe.new('redis_orm', '0.2') do |p|
6
+ Echoe.new('redis_orm', '0.3') do |p|
7
7
  p.description = "ORM for Redis advanced key-value storage"
8
8
  p.url = "https://github.com/german/redis_orm"
9
9
  p.author = "Dmitrii Samoilov"
@@ -34,34 +34,37 @@ module RedisOrm
34
34
  # look = Look.create :title => 'test'
35
35
  # look.user = User.find(1) => look:23:user => 1
36
36
  define_method "#{foreign_model_name}=" do |assoc_with_record|
37
- old_assoc = nil
37
+ # we need to store this to clear old association later
38
+ old_assoc = self.send(foreign_model_name)
38
39
 
39
40
  if options[:polymorphic]
40
- # we need to store this to clear old association later
41
- old_assoc = self.send(foreign_model_name)
42
41
  $redis.set("#{model_name}:#{id}:#{foreign_model_name}_type", assoc_with_record.model_name)
43
42
  $redis.set("#{model_name}:#{id}:#{foreign_model_name}_id", assoc_with_record.id)
44
43
  else
45
- if assoc_with_record.model_name == foreign_model.to_s
44
+ if assoc_with_record.nil?
45
+ $redis.del("#{model_name}:#{id}:#{foreign_model_name}")
46
+ elsif assoc_with_record.model_name == foreign_model.to_s
46
47
  $redis.set("#{model_name}:#{id}:#{foreign_model_name}", assoc_with_record.id)
47
48
  else
48
49
  raise TypeMismatchError
49
50
  end
50
51
  end
51
52
 
52
- # check whether *assoc_with_record* object has *has_many* declaration and TODO it states *self.model_name* in plural and there is no record yet from the *assoc_with_record*'s side (in order not to provoke recursion)
53
- if class_associations[assoc_with_record.model_name].detect{|h| h[:type] == :has_many && h[:foreign_models] == model_name.pluralize.to_sym} && !$redis.zrank("#{assoc_with_record.model_name}:#{assoc_with_record.id}:#{model_name.pluralize}", self.id)
54
- # remove old assoc
55
- if old_assoc
56
- $redis.zrem "#{old_assoc.model_name}:#{old_assoc.id}:#{model_name.to_s.pluralize}", self.id
57
- end
58
-
59
- assoc_with_record.send(model_name.pluralize.to_sym).send(:"<<", self)
53
+ if assoc_with_record.nil?
54
+ # remove old assoc
55
+ $redis.zrem("#{old_assoc.model_name}:#{old_assoc.id}:#{model_name.to_s.pluralize}", self.id) if old_assoc
56
+ else
57
+ # check whether *assoc_with_record* object has *has_many* declaration and TODO it states *self.model_name* in plural and there is no record yet from the *assoc_with_record*'s side (in order not to provoke recursion)
58
+ if class_associations[assoc_with_record.model_name].detect{|h| h[:type] == :has_many && h[:foreign_models] == model_name.pluralize.to_sym} && !$redis.zrank("#{assoc_with_record.model_name}:#{assoc_with_record.id}:#{model_name.pluralize}", self.id)
59
+ # remove old assoc
60
+ $redis.zrem("#{old_assoc.model_name}:#{old_assoc.id}:#{model_name.to_s.pluralize}", self.id) if old_assoc
61
+ assoc_with_record.send(model_name.pluralize.to_sym).send(:"<<", self)
60
62
 
61
- # check whether *assoc_with_record* object has *has_one* declaration and TODO it states *self.model_name* and there is no record yet from the *assoc_with_record*'s side (in order not to provoke recursion)
62
- elsif class_associations[assoc_with_record.model_name].detect{|h| h[:type] == :has_one && h[:foreign_model] == model_name.to_sym} && assoc_with_record.send(model_name.to_sym).nil?
63
- # old association is being rewritten here automatically so we don't have to worry about it
64
- assoc_with_record.send("#{model_name}=", self)
63
+ # check whether *assoc_with_record* object has *has_one* declaration and TODO it states *self.model_name* and there is no record yet from the *assoc_with_record*'s side (in order not to provoke recursion)
64
+ elsif class_associations[assoc_with_record.model_name].detect{|h| h[:type] == :has_one && h[:foreign_model] == model_name.to_sym} && assoc_with_record.send(model_name.to_sym).nil?
65
+ # old association is being rewritten here automatically so we don't have to worry about it
66
+ assoc_with_record.send("#{model_name}=", self)
67
+ end
65
68
  end
66
69
  end
67
70
  end
@@ -23,10 +23,22 @@ module RedisOrm
23
23
  define_method "#{foreign_models_name}=" do |records|
24
24
  if !options[:as]
25
25
  # clear old assocs from related models side
26
- self.send(foreign_models).to_a.each do |record|
27
- $redis.zrem "#{record.model_name}:#{record.id}:#{model_name.pluralize}", id
26
+ old_records = self.send(foreign_models).to_a
27
+ if !old_records.empty?
28
+ # cache here which association with current model have old record's model
29
+ has_many_assoc = old_records[0].get_associations.detect{|h| h[:type] == :has_many && h[:foreign_models] == model_name.pluralize.to_sym}
30
+
31
+ has_one_or_belongs_to_assoc = old_records[0].get_associations.detect{|h| [:has_one, :belongs_to].include?(h[:type]) && h[:foreign_model] == model_name.to_sym}
32
+
33
+ old_records.each do |record|
34
+ if has_many_assoc
35
+ $redis.zrem "#{record.model_name}:#{record.id}:#{model_name.pluralize}", id
36
+ elsif has_one_or_belongs_to_assoc
37
+ $redis.del "#{record.model_name}:#{record.id}:#{model_name}"
38
+ end
39
+ end
28
40
  end
29
-
41
+
30
42
  # clear old assocs from this model side
31
43
  $redis.zremrangebyscore "#{model_name}:#{id}:#{foreign_models}", 0, Time.now.to_f
32
44
  end
@@ -42,7 +54,8 @@ module RedisOrm
42
54
  if class_associations[record.model_name].detect{|h| h[:type] == :has_many && h[:foreign_models] == model_name.pluralize.to_sym} #&& !$redis.zrank("#{record.model_name}:#{record.id}:#{model_name.pluralize}", id)#record.model_name.to_s.camelize.constantize.find(id).nil?
43
55
  $redis.zadd("#{record.model_name}:#{record.id}:#{model_name.pluralize}", Time.now.to_f, id)
44
56
  # check whether *record* object has *has_one* declaration and TODO it states *self.model_name*
45
- elsif record.get_associations.detect{|h| [:has_one, :belongs_to].include?(h[:type]) && h[:foreign_model] == model_name.to_sym} # overwrite assoc anyway so we don't need to check record.send(model_name.to_sym).nil? here
57
+ elsif record.get_associations.detect{|h| [:has_one, :belongs_to].include?(h[:type]) && h[:foreign_model] == model_name.to_sym}
58
+ # overwrite assoc anyway so we don't need to check record.send(model_name.to_sym).nil? here
46
59
  $redis.set("#{record.model_name}:#{record.id}:#{model_name}", id)
47
60
  end
48
61
  end
@@ -19,6 +19,11 @@ module RedisOrm
19
19
  fetch if !@fetched
20
20
  @records[index]
21
21
  end
22
+
23
+ def to_a
24
+ fetch if !@fetched
25
+ @records
26
+ end
22
27
 
23
28
  # user = User.find(1)
24
29
  # user.avatars << Avatar.find(23) => user:1:avatars => [23]
@@ -55,10 +60,13 @@ module RedisOrm
55
60
  end
56
61
  end
57
62
  end
63
+
64
+ # return *self* here so calls could be chained
65
+ self
58
66
  end
59
67
 
60
68
  def all(options = {})
61
- if options[:limit] || options[:offset] || options[:order]
69
+ if options.is_a?(Hash) && (options[:limit] || options[:offset] || options[:order])
62
70
  limit = if options[:limit] && options[:offset]
63
71
  [options[:offset].to_i, options[:limit].to_i]
64
72
  elsif options[:limit]
@@ -90,7 +98,10 @@ module RedisOrm
90
98
  elsif token == :all
91
99
  all(options)
92
100
  elsif token == :first
93
- all(options.merge({:limit => 1}))
101
+ all(options.merge({:limit => 1}))[0]
102
+ elsif token == :last
103
+ reversed = options[:order] == 'asc' ? 'desc' : 'asc'
104
+ all(options.merge({:limit => 1, :order => reversed}))[0]
94
105
  end
95
106
  end
96
107
 
@@ -25,23 +25,28 @@ module RedisOrm
25
25
  # we need to store this to clear old associations later
26
26
  old_assoc = self.send(foreign_model_name)
27
27
 
28
- if assoc_with_record.model_name == foreign_model.to_s
28
+ if assoc_with_record.nil?
29
+ $redis.del("#{model_name}:#{id}:#{foreign_model_name}")
30
+ elsif assoc_with_record.model_name == foreign_model.to_s
29
31
  $redis.set("#{model_name}:#{id}:#{foreign_model_name}", assoc_with_record.id)
30
32
  else
31
33
  raise TypeMismatchError
32
34
  end
33
35
 
34
- # check whether *assoc_with_record* object has *belongs_to* declaration and TODO it states *self.model_name* and there is no record yet from the *assoc_with_record*'s side (in order not to provoke recursion)
35
- if class_associations[assoc_with_record.model_name].detect{|h| [:belongs_to, :has_one].include?(h[:type]) && h[:foreign_model] == model_name.to_sym} && assoc_with_record.send(model_name.to_sym).nil?
36
- # old association is being rewritten here automatically so we don't have to worry about it
37
- assoc_with_record.send("#{model_name}=", self)
38
- elsif class_associations[assoc_with_record.model_name].detect{|h| :has_many == h[:type] && h[:foreign_models] == model_name.to_s.pluralize.to_sym} && !$redis.zrank("#{assoc_with_record.model_name}:#{assoc_with_record.id}:#{model_name.pluralize}", self.id)
36
+ if assoc_with_record.nil?
39
37
  # remove old assoc
40
- if old_assoc
41
- $redis.zrem "#{assoc_with_record.model_name}:#{old_assoc.id}:#{model_name.to_s.pluralize}", self.id
38
+ $redis.zrem("#{old_assoc.model_name}:#{old_assoc.id}:#{model_name.to_s.pluralize}", id) if old_assoc
39
+ else
40
+ # check whether *assoc_with_record* object has *belongs_to* declaration and TODO it states *self.model_name* and there is no record yet from the *assoc_with_record*'s side (in order not to provoke recursion)
41
+ if class_associations[assoc_with_record.model_name].detect{|h| [:belongs_to, :has_one].include?(h[:type]) && h[:foreign_model] == model_name.to_sym} && assoc_with_record.send(model_name.to_sym).nil?
42
+ # old association is being rewritten here automatically so we don't have to worry about it
43
+ assoc_with_record.send("#{model_name}=", self)
44
+ elsif class_associations[assoc_with_record.model_name].detect{|h| :has_many == h[:type] && h[:foreign_models] == model_name.to_s.pluralize.to_sym} && !$redis.zrank("#{assoc_with_record.model_name}:#{assoc_with_record.id}:#{model_name.pluralize}", self.id)
45
+ # remove old assoc
46
+ $redis.zrem("#{old_assoc.model_name}:#{old_assoc.id}:#{model_name.to_s.pluralize}", id) if old_assoc
47
+ # create/add new ones
48
+ assoc_with_record.send(model_name.pluralize.to_sym).send(:"<<", self)
42
49
  end
43
- # create/add new ones
44
- assoc_with_record.send(model_name.pluralize.to_sym).send(:"<<", self)
45
50
  end
46
51
  end
47
52
  end
@@ -138,25 +138,35 @@ module RedisOrm
138
138
  end
139
139
  end
140
140
 
141
- def find(ids)
142
- if ids.is_a?(Hash)
143
- all(ids)
144
- elsif ids.is_a?(Array)
145
- return [] if ids.empty?
146
- ids.inject([]) do |array, id|
141
+ def find(*args)
142
+ if args.first.is_a?(Array)
143
+ return [] if args.first.empty?
144
+ args.first.inject([]) do |array, id|
147
145
  record = $redis.hgetall "#{model_name}:#{id}"
148
146
  if record && !record.empty?
149
147
  array << new(record, id, true)
150
148
  end
151
149
  end
152
150
  else
153
- return nil if ids.nil?
154
- id = ids
155
- record = $redis.hgetall "#{model_name}:#{id}"
156
- if record && record.empty?
157
- nil
158
- else
159
- new(record, id, true)
151
+ return nil if args.empty? || args.first.nil?
152
+ case first = args.shift
153
+ when :all
154
+ options = args.last
155
+ return nil if !options.is_a?(Hash)
156
+ all(options)
157
+ when :first
158
+ options = args.last
159
+ return nil if !options.is_a?(Hash)
160
+ all(options.merge({:limit => 1}))[0]
161
+ when :last
162
+ options = args.last
163
+ return nil if !options.is_a?(Hash)
164
+ reversed = options[:order] == 'asc' ? 'desc' : 'asc'
165
+ all(options.merge({:limit => 1, :order => reversed}))[0]
166
+ else
167
+ id = first
168
+ record = $redis.hgetall "#{model_name}:#{id}"
169
+ record && record.empty? ? nil : new(record, id, true)
160
170
  end
161
171
  end
162
172
  end
data/redis_orm.gemspec CHANGED
@@ -2,11 +2,11 @@
2
2
 
3
3
  Gem::Specification.new do |s|
4
4
  s.name = %q{redis_orm}
5
- s.version = "0.2"
5
+ s.version = "0.3"
6
6
 
7
7
  s.required_rubygems_version = Gem::Requirement.new(">= 1.2") if s.respond_to? :required_rubygems_version=
8
8
  s.authors = ["Dmitrii Samoilov"]
9
- s.date = %q{2011-06-04}
9
+ s.date = %q{2011-06-06}
10
10
  s.description = %q{ORM for Redis advanced key-value storage}
11
11
  s.email = %q{germaninthetown@gmail.com}
12
12
  s.extra_rdoc_files = ["CHANGELOG", "LICENSE", "README.md", "lib/redis_orm.rb", "lib/redis_orm/active_model_behavior.rb", "lib/redis_orm/associations/belongs_to.rb", "lib/redis_orm/associations/has_many.rb", "lib/redis_orm/associations/has_many_proxy.rb", "lib/redis_orm/associations/has_one.rb", "lib/redis_orm/redis_orm.rb"]
@@ -41,7 +41,7 @@ describe "check associations" do
41
41
  path_to_socket = File.dirname(File.expand_path(__FILE__)) + "/../redis.sock"
42
42
  $redis = Redis.new(:host => 'localhost', :path => path_to_socket)
43
43
  end
44
-
44
+
45
45
  before(:each) do
46
46
  $redis.flushall if $redis
47
47
  @article = Article.new
@@ -84,10 +84,44 @@ describe "check associations" do
84
84
  @comment2.article.id.should == @article.id
85
85
  @article.comments.count.should == 2
86
86
  @article.comments[0].id.should == @comment2.id
87
+ end
88
+
89
+ it "should correctly resets associations when nil/[] provided" do
90
+ # from has_many proxy side
91
+ @article.comments << [@comment1, @comment2]
92
+ @article.comments.count.should == 2
93
+ @comment1.article.id.should == @article.id
94
+ @comment2.article.id.should == @article.id
87
95
 
88
- #@comment1.article = nil
89
- #@article.comments.count.should == 1
90
- #@comment1.article.should == nil
96
+ # clear
97
+ @article.comments = []
98
+ @article.comments.count.should == 0
99
+ @comment1.article.should == nil
100
+ @comment2.article.should == nil
101
+
102
+ # from belongs_to side
103
+ @article.comments << [@comment1, @comment2]
104
+ @article.comments.count.should == 2
105
+ @comment1.article.id.should == @article.id
106
+
107
+ # clear
108
+ @comment1.article = nil
109
+ @article.comments.count.should == 1
110
+ @comment1.article.should == nil
111
+
112
+ # from has_one side
113
+ profile = Profile.create :title => "test"
114
+ chicago = City.create :name => "Chicago"
115
+
116
+ profile.city = chicago
117
+ profile.city.name.should == "Chicago"
118
+ chicago.profiles.count.should == 1
119
+ chicago.profiles[0].id.should == profile.id
120
+
121
+ # clear
122
+ profile.city = nil
123
+ profile.city.should == nil
124
+ chicago.profiles.count.should == 0
91
125
  end
92
126
 
93
127
  it "should return array" do
@@ -109,6 +143,28 @@ describe "check associations" do
109
143
  @comment1.article.id.should == @comment2.article.id
110
144
  end
111
145
 
146
+ it "should behave as active_record (proxy couldn't return records w/o #all call) += and << behave differently" do
147
+ @article.comments << @comment1 << @comment2
148
+ @article.comments.count.should == 2
149
+
150
+ comments = @article.comments
151
+ comments.count.should == 2
152
+
153
+ comments = []
154
+ comments += @article.comments
155
+ comments.count.should == 2
156
+ comments.collect{|c| c.id}.should include(@comment1.id)
157
+ comments.collect{|c| c.id}.should include(@comment2.id)
158
+
159
+ comments = []
160
+ comments << @article.comments.all
161
+ comments.flatten.count.should == 2
162
+
163
+ comments = []
164
+ comments << @article.comments
165
+ comments.count.should == 1
166
+ end
167
+
112
168
  it "should return 1 comment when second was deleted" do
113
169
  Comment.count.should == 2
114
170
  @article.comments << [@comment1, @comment2]
@@ -150,7 +206,7 @@ describe "check associations" do
150
206
  @article.comments.count.should == 1
151
207
  @article.comments.first.id.should == @comment1.id
152
208
 
153
- @comment1.article.id.should == @article.id
209
+ @comment1.article.id.should == @article.id
154
210
  end
155
211
 
156
212
  it "should correctly use many-to-many associations both with '=' and '<<' " do
data/test/options_test.rb CHANGED
@@ -96,15 +96,18 @@ describe "test options" do
96
96
  Photo.all(:order => "desc", :limit => 1, :offset => 1).map{|p| p.id}.should == [@photo1.id]
97
97
 
98
98
  # testing #find method
99
- Photo.find(:order => "asc").map{|p| p.id}.should == [@photo1.id, @photo2.id]
100
- Photo.find(:order => "desc").map{|p| p.id}.should == [@photo2.id, @photo1.id]
99
+ Photo.find(:all, :order => "asc").map{|p| p.id}.should == [@photo1.id, @photo2.id]
100
+ Photo.find(:all, :order => "desc").map{|p| p.id}.should == [@photo2.id, @photo1.id]
101
101
 
102
- Photo.find(:order => "asc", :limit => 1).map{|p| p.id}.should == [@photo1.id]
103
- Photo.find(:order => "desc", :limit => 1).map{|p| p.id}.should == [@photo2.id]
102
+ Photo.find(:all, :order => "asc", :limit => 1).map{|p| p.id}.should == [@photo1.id]
103
+ Photo.find(:all, :order => "desc", :limit => 1).map{|p| p.id}.should == [@photo2.id]
104
104
 
105
- Photo.find(:order => "asc", :limit => 1, :offset => 1).map{|p| p.id}.should == [@photo2.id]
106
- Photo.find(:order => "desc", :limit => 1, :offset => 1).map{|p| p.id}.should == [@photo1.id]
105
+ Photo.find(:first, :order => "asc", :limit => 1, :offset => 1).id.should == @photo2.id
106
+ Photo.find(:first, :order => "desc", :limit => 1, :offset => 1).id.should == @photo1.id
107
107
 
108
+ Photo.find(:last, :order => "asc").id.should == @photo2.id
109
+ Photo.find(:last, :order => "desc").id.should == @photo1.id
110
+
108
111
  @album.photos.count.should == 0
109
112
  @album.photos.all(:limit => 2, :offset => 0).should == []
110
113
  @album.photos << @photo2
@@ -119,8 +122,16 @@ describe "test options" do
119
122
 
120
123
  @album.photos.find(:all, :order => "asc").map{|p| p.id}.should == [@photo2.id, @photo1.id]
121
124
  @album.photos.find(:all, :order => "desc").map{|p| p.id}.should == [@photo1.id, @photo2.id]
122
- @album.photos.find(:first, :order => "asc").map{|p| p.id}.should == [@photo2.id]
123
- @album.photos.find(:first, :order => "desc").map{|p| p.id}.should == [@photo1.id]
125
+
126
+ @album.photos.find(:first, :order => "asc").id.should == @photo2.id
127
+ @album.photos.find(:first, :order => "desc").id.should == @photo1.id
128
+
129
+ @album.photos.find(:last, :order => "asc").id.should == @photo1.id
130
+ @album.photos.find(:last, :order => "desc").id.should == @photo2.id
131
+
132
+ @album.photos.find(:last, :order => "desc", :offset => 2).should == nil
133
+ @album.photos.find(:first, :order => "desc", :offset => 2).should == nil
134
+
124
135
  @album.photos.find(:all, :order => "asc", :limit => 1, :offset => 1).map{|p| p.id}.should == [@photo1.id]
125
136
  @album.photos.find(:all, :order => "desc", :limit => 1, :offset => 1).map{|p| p.id}.should == [@photo2.id]
126
137
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: redis_orm
3
3
  version: !ruby/object:Gem::Version
4
- version: '0.2'
4
+ version: '0.3'
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,12 +9,12 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2011-06-04 00:00:00.000000000 +03:00
12
+ date: 2011-06-06 00:00:00.000000000 +03:00
13
13
  default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: activesupport
17
- requirement: &85876430 !ruby/object:Gem::Requirement
17
+ requirement: &85879940 !ruby/object:Gem::Requirement
18
18
  none: false
19
19
  requirements:
20
20
  - - ! '>='
@@ -22,10 +22,10 @@ dependencies:
22
22
  version: 3.0.0
23
23
  type: :runtime
24
24
  prerelease: false
25
- version_requirements: *85876430
25
+ version_requirements: *85879940
26
26
  - !ruby/object:Gem::Dependency
27
27
  name: activemodel
28
- requirement: &85876070 !ruby/object:Gem::Requirement
28
+ requirement: &85879580 !ruby/object:Gem::Requirement
29
29
  none: false
30
30
  requirements:
31
31
  - - ! '>='
@@ -33,10 +33,10 @@ dependencies:
33
33
  version: 3.0.0
34
34
  type: :runtime
35
35
  prerelease: false
36
- version_requirements: *85876070
36
+ version_requirements: *85879580
37
37
  - !ruby/object:Gem::Dependency
38
38
  name: redis
39
- requirement: &85875730 !ruby/object:Gem::Requirement
39
+ requirement: &85879180 !ruby/object:Gem::Requirement
40
40
  none: false
41
41
  requirements:
42
42
  - - ! '>='
@@ -44,10 +44,10 @@ dependencies:
44
44
  version: 2.2.0
45
45
  type: :runtime
46
46
  prerelease: false
47
- version_requirements: *85875730
47
+ version_requirements: *85879180
48
48
  - !ruby/object:Gem::Dependency
49
49
  name: rspec
50
- requirement: &85875400 !ruby/object:Gem::Requirement
50
+ requirement: &85878840 !ruby/object:Gem::Requirement
51
51
  none: false
52
52
  requirements:
53
53
  - - ! '>='
@@ -55,7 +55,7 @@ dependencies:
55
55
  version: 2.5.0
56
56
  type: :development
57
57
  prerelease: false
58
- version_requirements: *85875400
58
+ version_requirements: *85878840
59
59
  description: ORM for Redis advanced key-value storage
60
60
  email: germaninthetown@gmail.com
61
61
  executables: []