fakeredis 0.3.3 → 0.4.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/README.md +1 -3
- data/fakeredis.gemspec +4 -3
- data/lib/fakeredis/version.rb +1 -1
- data/lib/redis/connection/memory.rb +119 -87
- data/spec/compatibility_spec.rb +2 -2
- data/spec/connection_spec.rb +3 -13
- data/spec/hashes_spec.rb +33 -44
- data/spec/keys_spec.rb +27 -40
- data/spec/lists_spec.rb +27 -42
- data/spec/server_spec.rb +2 -39
- data/spec/sets_spec.rb +16 -22
- data/spec/sorted_sets_spec.rb +58 -229
- data/spec/spec_helper.rb +0 -4
- data/spec/strings_spec.rb +45 -92
- metadata +9 -16
- data/lib/fake_redis.rb +0 -1
- data/lib/fakeredis/expiring_hash.rb +0 -56
- data/lib/fakeredis/sorted_set_argument_handler.rb +0 -74
- data/lib/fakeredis/sorted_set_store.rb +0 -80
- data/lib/fakeredis/zset.rb +0 -4
- data/spec/spec_helper_live_redis.rb +0 -14
data/spec/spec_helper.rb
CHANGED
data/spec/strings_spec.rb
CHANGED
@@ -11,121 +11,89 @@ module FakeRedis
|
|
11
11
|
@client.set("key1", "Hello")
|
12
12
|
@client.append("key1", " World")
|
13
13
|
|
14
|
-
@client.get("key1").should
|
14
|
+
@client.get("key1").should == "Hello World"
|
15
15
|
end
|
16
16
|
|
17
17
|
it "should decrement the integer value of a key by one" do
|
18
18
|
@client.set("counter", "1")
|
19
19
|
@client.decr("counter")
|
20
20
|
|
21
|
-
@client.get("counter").should
|
21
|
+
@client.get("counter").should == "0"
|
22
22
|
end
|
23
23
|
|
24
24
|
it "should decrement the integer value of a key by the given number" do
|
25
25
|
@client.set("counter", "10")
|
26
26
|
@client.decrby("counter", "5")
|
27
27
|
|
28
|
-
@client.get("counter").should
|
28
|
+
@client.get("counter").should == "5"
|
29
29
|
end
|
30
30
|
|
31
31
|
it "should get the value of a key" do
|
32
|
-
@client.get("key2").should
|
32
|
+
@client.get("key2").should == nil
|
33
33
|
end
|
34
34
|
|
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
|
39
|
-
@client.getbit("key1", 2).should
|
40
|
-
@client.getbit("key1", 3).should
|
41
|
-
@client.getbit("key1", 4).should
|
42
|
-
@client.getbit("key1", 5).should
|
43
|
-
@client.getbit("key1", 6).should
|
44
|
-
@client.getbit("key1", 7).should
|
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
45
|
end
|
46
46
|
|
47
47
|
it "should allow direct bit manipulation even if the string isn't set" do
|
48
48
|
@client.setbit("key1", 10, 1)
|
49
|
-
@client.getbit("key1", 10).should
|
49
|
+
@client.getbit("key1", 10).should == 1
|
50
50
|
end
|
51
51
|
|
52
52
|
it "should get a substring of the string stored at a key" do
|
53
53
|
@client.set("key1", "This a message")
|
54
54
|
|
55
|
-
@client.getrange("key1", 0, 3).should
|
56
|
-
@client.substr("key1", 0, 3).should
|
55
|
+
@client.getrange("key1", 0, 3).should == "This"
|
56
|
+
@client.substr("key1", 0, 3).should == "This"
|
57
57
|
end
|
58
58
|
|
59
59
|
it "should set the string value of a key and return its old value" do
|
60
60
|
@client.set("key1","value1")
|
61
61
|
|
62
|
-
@client.getset("key1", "value2").should
|
63
|
-
@client.get("key1").should
|
62
|
+
@client.getset("key1", "value2").should == "value1"
|
63
|
+
@client.get("key1").should == "value2"
|
64
64
|
end
|
65
65
|
|
66
66
|
it "should return nil for #getset if the key does not exist when setting" do
|
67
|
-
@client.getset("key1", "value1").should
|
68
|
-
@client.get("key1").should
|
67
|
+
@client.getset("key1", "value1").should == nil
|
68
|
+
@client.get("key1").should == "value1"
|
69
69
|
end
|
70
70
|
|
71
71
|
it "should increment the integer value of a key by one" do
|
72
72
|
@client.set("counter", "1")
|
73
|
-
@client.incr("counter").should
|
73
|
+
@client.incr("counter").should == 2
|
74
74
|
|
75
|
-
@client.get("counter").should
|
76
|
-
end
|
77
|
-
|
78
|
-
it "should not change the expire value of the key during incr" do
|
79
|
-
@client.set("counter", "1")
|
80
|
-
@client.expire("counter", 600).should be_true
|
81
|
-
@client.ttl("counter").should be == 600
|
82
|
-
@client.incr("counter").should be == 2
|
83
|
-
@client.ttl("counter").should be == 600
|
75
|
+
@client.get("counter").should == "2"
|
84
76
|
end
|
85
77
|
|
86
78
|
it "should decrement the integer value of a key by one" do
|
87
79
|
@client.set("counter", "1")
|
88
|
-
@client.decr("counter").should
|
89
|
-
|
90
|
-
@client.get("counter").should be == "0"
|
91
|
-
end
|
80
|
+
@client.decr("counter").should == 0
|
92
81
|
|
93
|
-
|
94
|
-
@client.set("counter", "2")
|
95
|
-
@client.expire("counter", 600).should be_true
|
96
|
-
@client.ttl("counter").should be == 600
|
97
|
-
@client.decr("counter").should be == 1
|
98
|
-
@client.ttl("counter").should be == 600
|
82
|
+
@client.get("counter").should == "0"
|
99
83
|
end
|
100
84
|
|
101
85
|
it "should increment the integer value of a key by the given number" do
|
102
86
|
@client.set("counter", "10")
|
103
|
-
@client.incrby("counter", "5").should
|
104
|
-
@client.incrby("counter", 2).should
|
105
|
-
@client.get("counter").should
|
106
|
-
end
|
107
|
-
|
108
|
-
it "should not change the expire value of the key during incrby" do
|
109
|
-
@client.set("counter", "1")
|
110
|
-
@client.expire("counter", 600).should be_true
|
111
|
-
@client.ttl("counter").should be == 600
|
112
|
-
@client.incrby("counter", "5").should be == 6
|
113
|
-
@client.ttl("counter").should be == 600
|
87
|
+
@client.incrby("counter", "5").should == 15
|
88
|
+
@client.incrby("counter", 2).should == 17
|
89
|
+
@client.get("counter").should == "17"
|
114
90
|
end
|
115
91
|
|
116
92
|
it "should decrement the integer value of a key by the given number" do
|
117
93
|
@client.set("counter", "10")
|
118
|
-
@client.decrby("counter", "5").should
|
119
|
-
@client.decrby("counter", 2).should
|
120
|
-
@client.get("counter").should
|
121
|
-
end
|
122
|
-
|
123
|
-
it "should not change the expire value of the key during decrby" do
|
124
|
-
@client.set("counter", "8")
|
125
|
-
@client.expire("counter", 600).should be_true
|
126
|
-
@client.ttl("counter").should be == 600
|
127
|
-
@client.decrby("counter", "3").should be == 5
|
128
|
-
@client.ttl("counter").should be == 600
|
94
|
+
@client.decrby("counter", "5").should == 5
|
95
|
+
@client.decrby("counter", 2).should == 3
|
96
|
+
@client.get("counter").should == "3"
|
129
97
|
end
|
130
98
|
|
131
99
|
it "should get the values of all the given keys" do
|
@@ -133,63 +101,48 @@ module FakeRedis
|
|
133
101
|
@client.set("key2", "value2")
|
134
102
|
@client.set("key3", "value3")
|
135
103
|
|
136
|
-
@client.mget("key1", "key2", "key3").should
|
104
|
+
@client.mget("key1", "key2", "key3").should == ["value1", "value2", "value3"]
|
137
105
|
end
|
138
106
|
|
139
|
-
it
|
107
|
+
it 'raises an argument error when not passed any fields' do
|
140
108
|
@client.set("key3", "value3")
|
141
109
|
|
142
|
-
lambda { @client.mget }.should raise_error(
|
110
|
+
lambda { @client.mget }.should raise_error(ArgumentError)
|
143
111
|
end
|
144
112
|
|
145
113
|
it "should set multiple keys to multiple values" do
|
146
114
|
@client.mset(:key1, "value1", :key2, "value2")
|
147
115
|
|
148
|
-
@client.get("key1").should
|
149
|
-
@client.get("key2").should
|
116
|
+
@client.get("key1").should == "value1"
|
117
|
+
@client.get("key2").should == "value2"
|
150
118
|
end
|
151
119
|
|
152
120
|
it "should set multiple keys to multiple values, only if none of the keys exist" do
|
153
|
-
@client.msetnx(:key1, "value1", :key2, "value2")
|
154
|
-
@client.msetnx(:key1, "value3", :key2, "value4")
|
155
|
-
|
156
|
-
@client.get("key1").should be == "value1"
|
157
|
-
@client.get("key2").should be == "value2"
|
158
|
-
end
|
159
|
-
|
160
|
-
it "should set multiple keys to multiple values with a hash" do
|
161
|
-
@client.mapped_mset(:key1 => "value1", :key2 => "value2")
|
162
|
-
|
163
|
-
@client.get("key1").should be == "value1"
|
164
|
-
@client.get("key2").should be == "value2"
|
165
|
-
end
|
166
|
-
|
167
|
-
it "should set multiple keys to multiple values with a hash, only if none of the keys exist" do
|
168
|
-
@client.mapped_msetnx(:key1 => "value1", :key2 => "value2").should be == 1
|
169
|
-
@client.mapped_msetnx(:key1 => "value3", :key2 => "value4").should be == 0
|
121
|
+
@client.msetnx(:key1, "value1", :key2, "value2")
|
122
|
+
@client.msetnx(:key1, "value3", :key2, "value4")
|
170
123
|
|
171
|
-
@client.get("key1").should
|
172
|
-
@client.get("key2").should
|
124
|
+
@client.get("key1").should == "value1"
|
125
|
+
@client.get("key2").should == "value2"
|
173
126
|
end
|
174
127
|
|
175
128
|
it "should set the string value of a key" do
|
176
129
|
@client.set("key1", "1")
|
177
130
|
|
178
|
-
@client.get("key1").should
|
131
|
+
@client.get("key1").should == "1"
|
179
132
|
end
|
180
133
|
|
181
134
|
it "should sets or clears the bit at offset in the string value stored at key" do
|
182
135
|
@client.set("key1", "abc")
|
183
136
|
@client.setbit("key1", 11, 1)
|
184
137
|
|
185
|
-
@client.get("key1").should
|
138
|
+
@client.get("key1").should == "arc"
|
186
139
|
end
|
187
140
|
|
188
141
|
it "should set the value and expiration of a key" do
|
189
142
|
@client.setex("key1", 30, "value1")
|
190
143
|
|
191
|
-
@client.get("key1").should
|
192
|
-
@client.ttl("key1").should
|
144
|
+
@client.get("key1").should == "value1"
|
145
|
+
@client.ttl("key1").should == 30
|
193
146
|
end
|
194
147
|
|
195
148
|
it "should set the value of a key, only if the key does not exist" do
|
@@ -197,21 +150,21 @@ module FakeRedis
|
|
197
150
|
@client.setnx("key1", "new value")
|
198
151
|
@client.setnx("key2", "another value")
|
199
152
|
|
200
|
-
@client.get("key1").should
|
201
|
-
@client.get("key2").should
|
153
|
+
@client.get("key1").should == "test value"
|
154
|
+
@client.get("key2").should == "another value"
|
202
155
|
end
|
203
156
|
|
204
157
|
it "should overwrite part of a string at key starting at the specified offset" do
|
205
158
|
@client.set("key1", "Hello World")
|
206
159
|
@client.setrange("key1", 6, "Redis")
|
207
160
|
|
208
|
-
@client.get("key1").should
|
161
|
+
@client.get("key1").should == "Hello Redis"
|
209
162
|
end
|
210
163
|
|
211
164
|
it "should get the length of the value stored in a key" do
|
212
165
|
@client.set("key1", "abc")
|
213
166
|
|
214
|
-
@client.strlen("key1").should
|
167
|
+
@client.strlen("key1").should == 3
|
215
168
|
end
|
216
169
|
|
217
170
|
end
|
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.
|
4
|
+
version: 0.4.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2012-06-02 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: redis
|
@@ -18,7 +18,7 @@ dependencies:
|
|
18
18
|
requirements:
|
19
19
|
- - ~>
|
20
20
|
- !ruby/object:Gem::Version
|
21
|
-
version:
|
21
|
+
version: 3.0.0
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
24
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -26,7 +26,7 @@ dependencies:
|
|
26
26
|
requirements:
|
27
27
|
- - ~>
|
28
28
|
- !ruby/object:Gem::Version
|
29
|
-
version:
|
29
|
+
version: 3.0.0
|
30
30
|
- !ruby/object:Gem::Dependency
|
31
31
|
name: rspec
|
32
32
|
requirement: !ruby/object:Gem::Requirement
|
@@ -59,14 +59,9 @@ files:
|
|
59
59
|
- README.md
|
60
60
|
- Rakefile
|
61
61
|
- fakeredis.gemspec
|
62
|
-
- lib/fake_redis.rb
|
63
62
|
- lib/fakeredis.rb
|
64
|
-
- lib/fakeredis/expiring_hash.rb
|
65
63
|
- lib/fakeredis/rspec.rb
|
66
|
-
- lib/fakeredis/sorted_set_argument_handler.rb
|
67
|
-
- lib/fakeredis/sorted_set_store.rb
|
68
64
|
- lib/fakeredis/version.rb
|
69
|
-
- lib/fakeredis/zset.rb
|
70
65
|
- lib/redis/connection/memory.rb
|
71
66
|
- spec/compatibility_spec.rb
|
72
67
|
- spec/connection_spec.rb
|
@@ -77,12 +72,10 @@ files:
|
|
77
72
|
- spec/sets_spec.rb
|
78
73
|
- spec/sorted_sets_spec.rb
|
79
74
|
- spec/spec_helper.rb
|
80
|
-
- spec/spec_helper_live_redis.rb
|
81
75
|
- spec/strings_spec.rb
|
82
76
|
- spec/transactions_spec.rb
|
83
|
-
homepage: https://
|
84
|
-
licenses:
|
85
|
-
- MIT
|
77
|
+
homepage: https://github.com/guilleiguaran/fakeredis
|
78
|
+
licenses: []
|
86
79
|
post_install_message:
|
87
80
|
rdoc_options: []
|
88
81
|
require_paths:
|
@@ -100,8 +93,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
100
93
|
- !ruby/object:Gem::Version
|
101
94
|
version: '0'
|
102
95
|
requirements: []
|
103
|
-
rubyforge_project:
|
104
|
-
rubygems_version: 1.8.
|
96
|
+
rubyforge_project: fakeredis
|
97
|
+
rubygems_version: 1.8.24
|
105
98
|
signing_key:
|
106
99
|
specification_version: 3
|
107
100
|
summary: Fake (In-memory) driver for redis-rb.
|
@@ -115,6 +108,6 @@ test_files:
|
|
115
108
|
- spec/sets_spec.rb
|
116
109
|
- spec/sorted_sets_spec.rb
|
117
110
|
- spec/spec_helper.rb
|
118
|
-
- spec/spec_helper_live_redis.rb
|
119
111
|
- spec/strings_spec.rb
|
120
112
|
- spec/transactions_spec.rb
|
113
|
+
has_rdoc:
|
data/lib/fake_redis.rb
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
require "fakeredis"
|
@@ -1,56 +0,0 @@
|
|
1
|
-
module FakeRedis
|
2
|
-
# Represents a normal hash with some additional expiration information
|
3
|
-
# associated with each key
|
4
|
-
class ExpiringHash < Hash
|
5
|
-
attr_reader :expires
|
6
|
-
|
7
|
-
def initialize(*)
|
8
|
-
super
|
9
|
-
@expires = {}
|
10
|
-
end
|
11
|
-
|
12
|
-
def [](key)
|
13
|
-
delete(key) if expired?(key)
|
14
|
-
super
|
15
|
-
end
|
16
|
-
|
17
|
-
def []=(key, val)
|
18
|
-
expire(key)
|
19
|
-
super
|
20
|
-
end
|
21
|
-
|
22
|
-
def delete(key)
|
23
|
-
expire(key)
|
24
|
-
super
|
25
|
-
end
|
26
|
-
|
27
|
-
def expire(key)
|
28
|
-
expires.delete(key)
|
29
|
-
end
|
30
|
-
|
31
|
-
def expired?(key)
|
32
|
-
expires.include?(key) && expires[key] < Time.now
|
33
|
-
end
|
34
|
-
|
35
|
-
def key?(key)
|
36
|
-
delete(key) if expired?(key)
|
37
|
-
super
|
38
|
-
end
|
39
|
-
|
40
|
-
def values_at(*keys)
|
41
|
-
keys.each {|key| delete(key) if expired?(key)}
|
42
|
-
super
|
43
|
-
end
|
44
|
-
|
45
|
-
def keys
|
46
|
-
super.select do |key|
|
47
|
-
if expired?(key)
|
48
|
-
delete(key)
|
49
|
-
false
|
50
|
-
else
|
51
|
-
true
|
52
|
-
end
|
53
|
-
end
|
54
|
-
end
|
55
|
-
end
|
56
|
-
end
|
@@ -1,74 +0,0 @@
|
|
1
|
-
module FakeRedis
|
2
|
-
# Takes in the variable length array of arguments for a zinterstore/zunionstore method
|
3
|
-
# and parses them into a few attributes for the method to access.
|
4
|
-
#
|
5
|
-
# Handles throwing errors for various scenarios (matches redis):
|
6
|
-
# * Custom weights specified, but not enough or too many given
|
7
|
-
# * Invalid aggregate value given
|
8
|
-
# * Multiple aggregate values given
|
9
|
-
class SortedSetArgumentHandler
|
10
|
-
# [Symbol] The aggregate method to use for the output values. One of %w(sum min max) expected
|
11
|
-
attr_reader :aggregate
|
12
|
-
# [Integer] Number of keys in the argument list
|
13
|
-
attr_accessor :number_of_keys
|
14
|
-
# [Array] The actual keys in the argument list
|
15
|
-
attr_accessor :keys
|
16
|
-
# [Array] integers for weighting the values of each key - one number per key expected
|
17
|
-
attr_accessor :weights
|
18
|
-
|
19
|
-
# Used internally
|
20
|
-
attr_accessor :type
|
21
|
-
|
22
|
-
# Expects all the argments for the method to be passed as an array
|
23
|
-
def initialize args
|
24
|
-
# Pull out known lengths of data
|
25
|
-
self.number_of_keys = args.shift
|
26
|
-
self.keys = args.shift(number_of_keys)
|
27
|
-
# Handle the variable lengths of data (WEIGHTS/AGGREGATE)
|
28
|
-
args.inject(self) {|handler, item| handler.handle(item) }
|
29
|
-
|
30
|
-
# Defaults for unspecified things
|
31
|
-
self.weights ||= Array.new(number_of_keys) { 1 }
|
32
|
-
self.aggregate ||= :sum
|
33
|
-
|
34
|
-
# Validate values
|
35
|
-
raise(RuntimeError, "ERR syntax error") unless weights.size == number_of_keys
|
36
|
-
raise(RuntimeError, "ERR syntax error") unless [:min, :max, :sum].include?(aggregate)
|
37
|
-
end
|
38
|
-
|
39
|
-
# Only allows assigning a value *once* - raises Redis::CommandError if a second is given
|
40
|
-
def aggregate=(str)
|
41
|
-
raise(RuntimeError, "ERR syntax error") if (defined?(@aggregate) && @aggregate)
|
42
|
-
@aggregate = str.to_s.downcase.to_sym
|
43
|
-
end
|
44
|
-
|
45
|
-
# Decides how to handle an item, depending on where we are in the arguments
|
46
|
-
def handle(item)
|
47
|
-
case item
|
48
|
-
when "WEIGHTS"
|
49
|
-
self.type = :weights
|
50
|
-
self.weights = []
|
51
|
-
when "AGGREGATE"
|
52
|
-
self.type = :aggregate
|
53
|
-
when nil
|
54
|
-
# This should never be called, raise a syntax error if we manage to hit it
|
55
|
-
raise(RuntimeError, "ERR syntax error")
|
56
|
-
else
|
57
|
-
send "handle_#{type}", item
|
58
|
-
end
|
59
|
-
self
|
60
|
-
end
|
61
|
-
|
62
|
-
def handle_weights(item)
|
63
|
-
self.weights << item
|
64
|
-
end
|
65
|
-
|
66
|
-
def handle_aggregate(item)
|
67
|
-
self.aggregate = item
|
68
|
-
end
|
69
|
-
|
70
|
-
def inject_block
|
71
|
-
lambda { |handler, item| handler.handle(item) }
|
72
|
-
end
|
73
|
-
end
|
74
|
-
end
|