fakeredis 0.3.1 → 0.3.2

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/LICENSE CHANGED
@@ -1,4 +1,4 @@
1
- Copyright (c) 2011 Guillermo Iguaran
1
+ Copyright (c) 2011-2012 Guillermo Iguaran
2
2
 
3
3
  Permission is hereby granted, free of charge, to any person obtaining
4
4
  a copy of this software and associated documentation files (the
data/README.md CHANGED
@@ -50,6 +50,8 @@ Or:
50
50
  * [dim](https://github.com/dim)
51
51
  * [czarneckid](https://github.com/czarneckid)
52
52
  * [obrie](https://github.com/obrie)
53
+ * [jredville](https://github.com/jredville)
54
+ * [redsquirrel](https://github.com/redsquirrel)
53
55
  * [Travis-CI](http://travis-ci.org/) (Travis-CI also uses Fakeredis in its tests!!!)
54
56
 
55
57
 
@@ -66,5 +68,5 @@ Or:
66
68
 
67
69
  ## Copyright
68
70
 
69
- Copyright (c) 2011 Guillermo Iguaran. See LICENSE for
71
+ Copyright (c) 2011-2012 Guillermo Iguaran. See LICENSE for
70
72
  further details.
@@ -1,3 +1,3 @@
1
1
  module FakeRedis
2
- VERSION = "0.3.1"
2
+ VERSION = "0.3.2"
3
3
  end
@@ -116,19 +116,11 @@ class Redis
116
116
  # * brpop
117
117
  # * brpoplpush
118
118
  # * discard
119
- # * mapped_hmset
120
- # * mapped_hmget
121
- # * mapped_mset
122
- # * mapped_msetnx
123
119
  # * move
124
120
  # * subscribe
125
121
  # * psubscribe
126
122
  # * publish
127
- # * substr
128
- # * unwatch
129
- # * watch
130
123
  # * zremrangebyrank
131
- # * zremrangebyscore
132
124
  # * zunionstore
133
125
  def flushdb
134
126
  @data = ExpiringHash.new
@@ -173,13 +165,14 @@ class Redis
173
165
 
174
166
  def getbit(key, offset)
175
167
  return unless @data[key]
176
- @data[key].unpack('B8')[0].split("")[offset]
168
+ @data[key].unpack('B*')[0].split("")[offset].to_i
177
169
  end
178
170
 
179
171
  def getrange(key, start, ending)
180
172
  return unless @data[key]
181
173
  @data[key][start..ending]
182
174
  end
175
+ alias :substr :getrange
183
176
 
184
177
  def getset(key, value)
185
178
  old_value = @data[key]
@@ -188,6 +181,7 @@ class Redis
188
181
  end
189
182
 
190
183
  def mget(*keys)
184
+ raise ArgumentError, "wrong number of arguments for 'mget' command" if keys.empty?
191
185
  @data.values_at(*keys)
192
186
  end
193
187
 
@@ -281,7 +275,7 @@ class Redis
281
275
  case where
282
276
  when :before then @data[key].insert(index, value)
283
277
  when :after then @data[key].insert(index + 1, value)
284
- else raise ArgumentError.new
278
+ else raise ArgumentError
285
279
  end
286
280
  end
287
281
 
@@ -355,99 +349,99 @@ class Redis
355
349
  end
356
350
 
357
351
  def smembers(key)
358
- data_type_check(key, Set)
352
+ data_type_check(key, ::Set)
359
353
  return [] unless @data[key]
360
354
  @data[key].to_a.reverse
361
355
  end
362
356
 
363
357
  def sismember(key, value)
364
- data_type_check(key, Set)
358
+ data_type_check(key, ::Set)
365
359
  return false unless @data[key]
366
360
  @data[key].include?(value.to_s)
367
361
  end
368
362
 
369
363
  def sadd(key, value)
370
- data_type_check(key, Set)
364
+ data_type_check(key, ::Set)
371
365
  if @data[key]
372
366
  !!@data[key].add?(value.to_s)
373
367
  else
374
- @data[key] = Set.new([value.to_s])
368
+ @data[key] = ::Set.new([value.to_s])
375
369
  true
376
370
  end
377
371
  end
378
372
 
379
373
  def srem(key, value)
380
- data_type_check(key, Set)
374
+ data_type_check(key, ::Set)
381
375
  deleted = !!(@data[key] && @data[key].delete?(value.to_s))
382
376
  remove_key_for_empty_collection(key)
383
377
  deleted
384
378
  end
385
379
 
386
380
  def smove(source, destination, value)
387
- data_type_check(destination, Set)
381
+ data_type_check(destination, ::Set)
388
382
  result = self.srem(source, value)
389
383
  self.sadd(destination, value) if result
390
384
  result
391
385
  end
392
386
 
393
387
  def spop(key)
394
- data_type_check(key, Set)
388
+ data_type_check(key, ::Set)
395
389
  elem = srandmember(key)
396
390
  srem(key, elem)
397
391
  elem
398
392
  end
399
393
 
400
394
  def scard(key)
401
- data_type_check(key, Set)
395
+ data_type_check(key, ::Set)
402
396
  return 0 unless @data[key]
403
397
  @data[key].size
404
398
  end
405
399
 
406
400
  def sinter(*keys)
407
- keys.each { |k| data_type_check(k, Set) }
408
- return Set.new if keys.any? { |k| @data[k].nil? }
409
- keys = keys.map { |k| @data[k] || Set.new }
401
+ keys.each { |k| data_type_check(k, ::Set) }
402
+ return ::Set.new if keys.any? { |k| @data[k].nil? }
403
+ keys = keys.map { |k| @data[k] || ::Set.new }
410
404
  keys.inject do |set, key|
411
405
  set & key
412
406
  end.to_a
413
407
  end
414
408
 
415
409
  def sinterstore(destination, *keys)
416
- data_type_check(destination, Set)
410
+ data_type_check(destination, ::Set)
417
411
  result = sinter(*keys)
418
- @data[destination] = Set.new(result)
412
+ @data[destination] = ::Set.new(result)
419
413
  end
420
414
 
421
415
  def sunion(*keys)
422
- keys.each { |k| data_type_check(k, Set) }
423
- keys = keys.map { |k| @data[k] || Set.new }
424
- keys.inject(Set.new) do |set, key|
416
+ keys.each { |k| data_type_check(k, ::Set) }
417
+ keys = keys.map { |k| @data[k] || ::Set.new }
418
+ keys.inject(::Set.new) do |set, key|
425
419
  set | key
426
420
  end.to_a
427
421
  end
428
422
 
429
423
  def sunionstore(destination, *keys)
430
- data_type_check(destination, Set)
424
+ data_type_check(destination, ::Set)
431
425
  result = sunion(*keys)
432
- @data[destination] = Set.new(result)
426
+ @data[destination] = ::Set.new(result)
433
427
  end
434
428
 
435
429
  def sdiff(key1, *keys)
436
- [key1, *keys].each { |k| data_type_check(k, Set) }
437
- keys = keys.map { |k| @data[k] || Set.new }
430
+ [key1, *keys].each { |k| data_type_check(k, ::Set) }
431
+ keys = keys.map { |k| @data[k] || ::Set.new }
438
432
  keys.inject(@data[key1]) do |memo, set|
439
433
  memo - set
440
434
  end.to_a
441
435
  end
442
436
 
443
437
  def sdiffstore(destination, key1, *keys)
444
- data_type_check(destination, Set)
438
+ data_type_check(destination, ::Set)
445
439
  result = sdiff(key1, *keys)
446
- @data[destination] = Set.new(result)
440
+ @data[destination] = ::Set.new(result)
447
441
  end
448
442
 
449
443
  def srandmember(key)
450
- data_type_check(key, Set)
444
+ data_type_check(key, ::Set)
451
445
  return nil unless @data[key]
452
446
  @data[key].to_a[rand(@data[key].size)]
453
447
  end
@@ -529,6 +523,7 @@ class Redis
529
523
  end
530
524
 
531
525
  def hmset(key, *fields)
526
+ raise ArgumentError, "wrong number of arguments for 'hmset' command" if fields.empty? || fields.size.odd?
532
527
  data_type_check(key, Hash)
533
528
  @data[key] ||= {}
534
529
  fields.each_slice(2) do |field|
@@ -537,6 +532,7 @@ class Redis
537
532
  end
538
533
 
539
534
  def hmget(key, *fields)
535
+ raise ArgumentError, "wrong number of arguments for 'hmget' command" if fields.empty?
540
536
  data_type_check(key, Hash)
541
537
  values = []
542
538
  fields.map do |field|
@@ -593,12 +589,15 @@ class Redis
593
589
  end
594
590
 
595
591
  def setbit(key, offset, bit)
596
- return unless @data[key]
597
- old_val = @data[key].unpack('B*')[0].split("")
592
+ old_val = @data[key] ? @data[key].unpack('B*')[0].split("") : []
593
+ size_increment = [((offset/8)+1)*8-old_val.length, 0].max
594
+ old_val += Array.new(size_increment).map{"0"}
595
+ original_val = old_val[offset]
598
596
  old_val[offset] = bit.to_s
599
597
  new_val = ""
600
598
  old_val.each_slice(8){|b| new_val = new_val + b.join("").to_i(2).chr }
601
599
  @data[key] = new_val
600
+ original_val
602
601
  end
603
602
 
604
603
  def setex(key, seconds, value)
@@ -627,13 +626,8 @@ class Redis
627
626
  true
628
627
  end
629
628
 
630
- def mapped_mget(*keys)
631
- reply = mget(*keys)
632
- Hash[*keys.zip(reply).flatten]
633
- end
634
-
635
629
  def sort(key)
636
- # TODO: Impleent
630
+ # TODO: Implement
637
631
  end
638
632
 
639
633
  def incr(key)
@@ -666,7 +660,7 @@ class Redis
666
660
  when String then "string"
667
661
  when Hash then "hash"
668
662
  when Array then "list"
669
- when Set then "set"
663
+ when ::Set then "set"
670
664
  end
671
665
  end
672
666
 
@@ -688,11 +682,19 @@ class Redis
688
682
  "OK"
689
683
  end
690
684
 
685
+ def watch(_)
686
+ "OK"
687
+ end
688
+
689
+ def unwatch
690
+ "OK"
691
+ end
692
+
691
693
  def zadd(key, score, value)
692
694
  data_type_check(key, ZSet)
693
695
  @data[key] ||= ZSet.new
694
696
  exists = @data[key].key?(value.to_s)
695
- @data[key][value.to_s] = score.to_i
697
+ @data[key][value.to_s] = score
696
698
  !exists
697
699
  end
698
700
 
@@ -722,6 +724,7 @@ class Redis
722
724
 
723
725
  def zincrby(key, num, value)
724
726
  data_type_check(key, ZSet)
727
+ @data[key] ||= ZSet.new
725
728
  @data[key][value.to_s] ||= 0
726
729
  @data[key][value.to_s] += num
727
730
  @data[key][value.to_s].to_s
@@ -759,28 +762,47 @@ class Redis
759
762
  end[start..stop].flatten.map(&:to_s)
760
763
  end
761
764
 
762
- def zrangebyscore(key, min, max, with_scores = nil)
765
+ def zrangebyscore(key, min, max, *opts)
763
766
  data_type_check(key, ZSet)
764
767
  return [] unless @data[key]
765
768
 
766
769
  range = zrange_select_by_score(key, min, max)
767
- if with_scores
770
+ vals = if opts.include?('WITHSCORES')
768
771
  range.sort_by {|_,v| v }
769
772
  else
770
773
  range.keys.sort_by {|k| range[k] }
771
- end.flatten.map(&:to_s)
774
+ end
775
+
776
+ limit = get_limit(opts, vals)
777
+ vals = vals[*limit] if limit
778
+
779
+ vals.flatten.map(&:to_s)
772
780
  end
773
781
 
774
- def zrevrangebyscore(key, max, min, with_scores = nil)
782
+ def zrevrangebyscore(key, max, min, *opts)
775
783
  data_type_check(key, ZSet)
776
784
  return [] unless @data[key]
777
785
 
778
786
  range = zrange_select_by_score(key, min, max)
779
- if with_scores
787
+ vals = if opts.include?('WITHSCORES')
780
788
  range.sort_by {|_,v| -v }
781
789
  else
782
790
  range.keys.sort_by {|k| -range[k] }
783
- end.flatten.map(&:to_s)
791
+ end
792
+
793
+ limit = get_limit(opts, vals)
794
+ vals = vals[*limit] if limit
795
+
796
+ vals.flatten.map(&:to_s)
797
+ end
798
+
799
+ def zremrangebyscore(key, min, max)
800
+ data_type_check(key, ZSet)
801
+ return 0 unless @data[key]
802
+
803
+ range = zrange_select_by_score(key, min, max)
804
+ range.each {|k,_| @data[key].delete(k) }
805
+ range.size
784
806
  end
785
807
 
786
808
  def zinterstore(out, _, *keys)
@@ -788,7 +810,7 @@ class Redis
788
810
 
789
811
  hashes = keys.map do |src|
790
812
  case @data[src]
791
- when Set
813
+ when ::Set
792
814
  Hash[@data[src].zip([0] * @data[src].size)]
793
815
  when Hash
794
816
  @data[src]
@@ -806,6 +828,13 @@ class Redis
806
828
  @data[out].size
807
829
  end
808
830
 
831
+ def zremrangebyrank(key, start, stop)
832
+ sorted_elements = @data[key].sort { |(v_a, r_a), (v_b, r_b)| r_a <=> r_b }
833
+ elements_to_delete = sorted_elements[start..stop]
834
+ elements_to_delete.each { |elem, rank| @data[key].delete(elem) }
835
+ elements_to_delete.size
836
+ end
837
+
809
838
  private
810
839
 
811
840
  def zrange_select_by_score(key, min, max)
@@ -815,12 +844,25 @@ class Redis
815
844
  def remove_key_for_empty_collection(key)
816
845
  del(key) if @data[key] && @data[key].empty?
817
846
  end
818
-
847
+
819
848
  def data_type_check(key, klass)
820
849
  if @data[key] && !@data[key].is_a?(klass)
821
850
  fail "Operation against a key holding the wrong kind of value: Expected #{klass} at #{key}."
822
851
  end
823
852
  end
853
+
854
+ def get_limit(opts, vals)
855
+ index = opts.index('LIMIT')
856
+
857
+ if index
858
+ offset = opts[index + 1]
859
+
860
+ count = opts[index + 2]
861
+ count = vals.size if count < 0
862
+
863
+ [offset, count]
864
+ end
865
+ end
824
866
  end
825
867
  end
826
868
  end
data/spec/hashes_spec.rb CHANGED
@@ -94,6 +94,21 @@ module FakeRedis
94
94
  @client.hmget("key2", "i1", "i2").should == [nil, nil]
95
95
  end
96
96
 
97
+ it "throws an argument error when you don't ask for any keys" do
98
+ lambda { @client.hmget("key1") }.should raise_error(ArgumentError)
99
+ end
100
+
101
+ it "should reject an empty list of values" do
102
+ lambda { @client.hmset("key") }.should raise_error(ArgumentError)
103
+ @client.exists("key").should be_false
104
+ end
105
+
106
+ it 'rejects an insert with a key but no value' do
107
+ lambda { @client.hmset("key", 'foo') }.should raise_error(ArgumentError)
108
+ lambda { @client.hmset("key", 'foo', 3, 'bar') }.should raise_error(ArgumentError)
109
+ @client.exists("key").should be_false
110
+ end
111
+
97
112
  it "should set multiple hash fields to multiple values" do
98
113
  @client.hmset("key", "k1", "value1", "k2", "value2")
99
114
 
@@ -14,6 +14,14 @@ module FakeRedis
14
14
  @client.zscore("key", "val").should == "2"
15
15
  end
16
16
 
17
+ it "should allow floats as scores when adding or updating" do
18
+ @client.zadd("key", 4.321, "val").should be(true)
19
+ @client.zscore("key", "val").should == "4.321"
20
+
21
+ @client.zadd("key", 54.3210, "val").should be(false)
22
+ @client.zscore("key", "val").should == "54.321"
23
+ end
24
+
17
25
  it "should remove members from sorted sets" do
18
26
  @client.zrem("key", "val").should be(false)
19
27
  @client.zadd("key", 1, "val").should be(true)
@@ -48,6 +56,10 @@ module FakeRedis
48
56
  @client.zscore("key", "val1").should == "3"
49
57
  end
50
58
 
59
+ it "initializes the sorted set if the key wasnt already set" do
60
+ @client.zincrby("key", 1, "val1").should == "1"
61
+ end
62
+
51
63
  it "should convert the key to a string for zscore" do
52
64
  @client.zadd("key", 1, 1)
53
65
  @client.zscore("key", 1).should == "1"
@@ -85,6 +97,9 @@ module FakeRedis
85
97
  @client.zrangebyscore("key", 1, 2).should == ["one", "two"]
86
98
  @client.zrangebyscore("key", 0, 100, :withscores => true).should == ["one", "1", "two", "2", "three", "3"]
87
99
  @client.zrangebyscore("key", 1, 2, :with_scores => true).should == ["one", "1", "two", "2"]
100
+ @client.zrangebyscore("key", 0, 100, :limit => [0, 1]).should == ["one"]
101
+ @client.zrangebyscore("key", 0, 100, :limit => [0, -1]).should == ["one", "two", "three"]
102
+ @client.zrangebyscore("key", 0, 100, :limit => [1, -1], :with_scores => true).should == ["two", "2", "three", "3"]
88
103
  end
89
104
 
90
105
  it "should return a reversed range of members in a sorted set, by score" do
@@ -96,6 +111,9 @@ module FakeRedis
96
111
  @client.zrevrangebyscore("key", 2, 1).should == ["two", "one"]
97
112
  @client.zrevrangebyscore("key", 1, 2).should == []
98
113
  @client.zrevrangebyscore("key", 2, 1, :with_scores => true).should == ["two", "2", "one", "1"]
114
+ @client.zrevrangebyscore("key", 100, 0, :limit => [0, 1]).should == ["three"]
115
+ @client.zrevrangebyscore("key", 100, 0, :limit => [0, -1]).should == ["three", "two", "one"]
116
+ @client.zrevrangebyscore("key", 100, 0, :limit => [1, -1], :with_scores => true).should == ["two", "2", "one", "1"]
99
117
  end
100
118
 
101
119
  it "should determine the index of a member in a sorted set" do
@@ -138,9 +156,33 @@ module FakeRedis
138
156
  @client.zrange("out", 0, 100, :with_scores => true).should == []
139
157
  end
140
158
 
141
- #it "should remove all members in a sorted set within the given indexes"
159
+ context "zremrangebyscore" do
160
+ it "should remove items by score" do
161
+ @client.zadd("key", 1, "one")
162
+ @client.zadd("key", 2, "two")
163
+ @client.zadd("key", 3, "three")
164
+
165
+ @client.zremrangebyscore("key", 0, 2).should == 2
166
+ @client.zcard("key").should == 1
167
+ end
142
168
 
143
- #it "should remove all members in a sorted set within the given scores"
169
+ it "should return 0 if the key didn't exist" do
170
+ @client.zremrangebyscore("key", 0, 2).should == 0
171
+ end
172
+ end
173
+
174
+ context '#zremrangebyrank' do
175
+ it 'removes all elements with in the given range' do
176
+ @client.zadd("key", 1, "one")
177
+ @client.zadd("key", 2, "two")
178
+ @client.zadd("key", 3, "three")
179
+
180
+ @client.zremrangebyrank("key", 0, 1).should == 2
181
+ @client.zcard('key').should == 1
182
+ end
183
+ end
184
+
185
+ #it "should remove all members in a sorted set within the given indexes"
144
186
 
145
187
  #it "should return a range of members in a sorted set, by index, with scores ordered from high to low"
146
188
 
data/spec/strings_spec.rb CHANGED
@@ -35,19 +35,25 @@ module FakeRedis
35
35
  it "should returns the bit value at offset in the string value stored at key" do
36
36
  @client.set("key1", "a")
37
37
 
38
- @client.getbit("key1", 1).should == "1"
39
- @client.getbit("key1", 2).should == "1"
40
- @client.getbit("key1", 3).should == "0"
41
- @client.getbit("key1", 4).should == "0"
42
- @client.getbit("key1", 5).should == "0"
43
- @client.getbit("key1", 6).should == "0"
44
- @client.getbit("key1", 7).should == "1"
38
+ @client.getbit("key1", 1).should == 1
39
+ @client.getbit("key1", 2).should == 1
40
+ @client.getbit("key1", 3).should == 0
41
+ @client.getbit("key1", 4).should == 0
42
+ @client.getbit("key1", 5).should == 0
43
+ @client.getbit("key1", 6).should == 0
44
+ @client.getbit("key1", 7).should == 1
45
+ end
46
+
47
+ it "should allow direct bit manipulation even if the string isn't set" do
48
+ @client.setbit("key1", 10, 1)
49
+ @client.getbit("key1", 10).should == 1
45
50
  end
46
51
 
47
52
  it "should get a substring of the string stored at a key" do
48
53
  @client.set("key1", "This a message")
49
54
 
50
55
  @client.getrange("key1", 0, 3).should == "This"
56
+ @client.substr("key1", 0, 3).should == "This"
51
57
  end
52
58
 
53
59
  it "should set the string value of a key and return its old value" do
@@ -56,7 +62,7 @@ module FakeRedis
56
62
  @client.getset("key1", "value2").should == "value1"
57
63
  @client.get("key1").should == "value2"
58
64
  end
59
-
65
+
60
66
  it "should return nil for #getset if the key does not exist when setting" do
61
67
  @client.getset("key1", "value1").should == nil
62
68
  @client.get("key1").should == "value1"
@@ -68,11 +74,11 @@ module FakeRedis
68
74
 
69
75
  @client.get("counter").should == "2"
70
76
  end
71
-
77
+
72
78
  it "should decrement the integer value of a key by one" do
73
79
  @client.set("counter", "1")
74
80
  @client.decr("counter").should == 0
75
-
81
+
76
82
  @client.get("counter").should == "0"
77
83
  end
78
84
 
@@ -98,15 +104,10 @@ module FakeRedis
98
104
  @client.mget("key1", "key2", "key3").should == ["value1", "value2", "value3"]
99
105
  end
100
106
 
101
- it "should get the values of all the given keys mapped" do
102
- @client.set("key1", "value1")
103
- @client.set("key2", "value2")
107
+ it 'raises an argument error when not passed any fields' do
104
108
  @client.set("key3", "value3")
105
- response = @client.mapped_mget("key1", "key2", "key3")
106
109
 
107
- response["key1"].should == "value1"
108
- response["key2"].should == "value2"
109
- response["key3"].should == "value3"
110
+ lambda { @client.mget }.should raise_error(ArgumentError)
110
111
  end
111
112
 
112
113
  it "should set multiple keys to multiple values" do
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fakeredis
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.1
4
+ version: 0.3.2
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-03-20 00:00:00.000000000 Z
12
+ date: 2012-06-02 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: redis
16
- requirement: &70160189787260 !ruby/object:Gem::Requirement
16
+ requirement: !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ~>
@@ -21,10 +21,15 @@ dependencies:
21
21
  version: 2.2.0
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *70160189787260
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ~>
28
+ - !ruby/object:Gem::Version
29
+ version: 2.2.0
25
30
  - !ruby/object:Gem::Dependency
26
31
  name: rspec
27
- requirement: &70160189786740 !ruby/object:Gem::Requirement
32
+ requirement: !ruby/object:Gem::Requirement
28
33
  none: false
29
34
  requirements:
30
35
  - - ! '>='
@@ -32,7 +37,12 @@ dependencies:
32
37
  version: 2.0.0
33
38
  type: :development
34
39
  prerelease: false
35
- version_requirements: *70160189786740
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ! '>='
44
+ - !ruby/object:Gem::Version
45
+ version: 2.0.0
36
46
  description: Fake (In-memory) driver for redis-rb. Useful for testing environment
37
47
  and machines without Redis.
38
48
  email:
@@ -84,7 +94,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
84
94
  version: '0'
85
95
  requirements: []
86
96
  rubyforge_project: fakeredis
87
- rubygems_version: 1.8.17
97
+ rubygems_version: 1.8.24
88
98
  signing_key:
89
99
  specification_version: 3
90
100
  summary: Fake (In-memory) driver for redis-rb.
@@ -100,3 +110,4 @@ test_files:
100
110
  - spec/spec_helper.rb
101
111
  - spec/strings_spec.rb
102
112
  - spec/transactions_spec.rb
113
+ has_rdoc: