fakeredis 0.4.3 → 0.5.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.travis.yml +4 -4
- data/Gemfile +6 -2
- data/LICENSE +1 -1
- data/README.md +2 -2
- data/fakeredis.gemspec +2 -2
- data/lib/fakeredis/command_executor.rb +25 -0
- data/lib/fakeredis/sort_method.rb +116 -0
- data/lib/fakeredis/transaction_commands.rb +83 -0
- data/lib/fakeredis/version.rb +1 -1
- data/lib/fakeredis/zset.rb +7 -3
- data/lib/redis/connection/memory.rb +132 -69
- data/spec/hashes_spec.rb +21 -8
- data/spec/keys_spec.rb +107 -5
- data/spec/lists_spec.rb +9 -1
- data/spec/memory_spec.rb +28 -0
- data/spec/server_spec.rb +4 -4
- data/spec/sets_spec.rb +87 -3
- data/spec/sort_method_spec.rb +68 -0
- data/spec/sorted_sets_spec.rb +9 -0
- data/spec/spec_helper.rb +19 -0
- data/spec/strings_spec.rb +52 -4
- data/spec/support/shared_examples/sortable.rb +69 -0
- data/spec/transactions_spec.rb +72 -7
- metadata +24 -16
- data/.rspec +0 -1
data/spec/sorted_sets_spec.rb
CHANGED
@@ -164,6 +164,9 @@ module FakeRedis
|
|
164
164
|
|
165
165
|
@client.zrangebyscore("key", 0, 100).should be == ["one", "two", "three"]
|
166
166
|
@client.zrangebyscore("key", 1, 2).should be == ["one", "two"]
|
167
|
+
@client.zrangebyscore("key", 1, '(2').should be == ['one']
|
168
|
+
@client.zrangebyscore("key", '(1', 2).should be == ['two']
|
169
|
+
@client.zrangebyscore("key", '(1', '(2').should be == []
|
167
170
|
@client.zrangebyscore("key", 0, 100, :withscores => true).should be == [["one", 1], ["two", 2], ["three", 3]]
|
168
171
|
@client.zrangebyscore("key", 1, 2, :with_scores => true).should be == [["one", 1], ["two", 2]]
|
169
172
|
@client.zrangebyscore("key", 0, 100, :limit => [0, 1]).should be == ["one"]
|
@@ -172,6 +175,8 @@ module FakeRedis
|
|
172
175
|
@client.zrangebyscore("key", '-inf', '+inf').should be == ["one", "two", "three"]
|
173
176
|
@client.zrangebyscore("key", 2, '+inf').should be == ["two", "three"]
|
174
177
|
@client.zrangebyscore("key", '-inf', 2).should be == ['one', "two"]
|
178
|
+
|
179
|
+
@client.zrangebyscore("badkey", 1, 2).should be == []
|
175
180
|
end
|
176
181
|
|
177
182
|
it "should return a reversed range of members in a sorted set, by score" do
|
@@ -333,6 +338,10 @@ module FakeRedis
|
|
333
338
|
@client.zremrangebyrank("key", 25, -1).should be == 0
|
334
339
|
@client.zcard('key').should be == 3
|
335
340
|
end
|
341
|
+
|
342
|
+
it "should return 0 if the key didn't exist" do
|
343
|
+
@client.zremrangebyrank("key", 0, 1).should be == 0
|
344
|
+
end
|
336
345
|
end
|
337
346
|
|
338
347
|
describe "#zunionstore" do
|
data/spec/spec_helper.rb
CHANGED
@@ -4,6 +4,25 @@ require 'rspec'
|
|
4
4
|
require 'fakeredis'
|
5
5
|
require "fakeredis/rspec"
|
6
6
|
|
7
|
+
require "support/shared_examples/sortable"
|
8
|
+
|
9
|
+
RSpec.configure do |config|
|
10
|
+
# replaces -b -fdoc --color in .rspec
|
11
|
+
config.color = true
|
12
|
+
config.default_formatter = "doc"
|
13
|
+
config.backtrace_exclusion_patterns = []
|
14
|
+
|
15
|
+
config.mock_with :rspec do |c|
|
16
|
+
# TODO: upgrade should syntax to expect syntax
|
17
|
+
c.syntax = [:should, :expect]
|
18
|
+
end
|
19
|
+
|
20
|
+
config.expect_with :rspec do |c|
|
21
|
+
# TODO: upgrade should syntax to expect syntax
|
22
|
+
c.syntax = [:should, :expect]
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
7
26
|
def fakeredis?
|
8
27
|
true
|
9
28
|
end
|
data/spec/strings_spec.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
|
1
3
|
require 'spec_helper'
|
2
4
|
|
3
5
|
module FakeRedis
|
@@ -49,6 +51,30 @@ module FakeRedis
|
|
49
51
|
@client.getbit("key1", 10).should be == 1
|
50
52
|
end
|
51
53
|
|
54
|
+
context 'when a bit is previously set to 0' do
|
55
|
+
before { @client.setbit("key1", 10, 0) }
|
56
|
+
|
57
|
+
it 'setting it to 1 returns 0' do
|
58
|
+
expect(@client.setbit("key1", 10, 1)).to eql 0
|
59
|
+
end
|
60
|
+
|
61
|
+
it 'setting it to 0 returns 0' do
|
62
|
+
expect(@client.setbit("key1", 10, 0)).to eql 0
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
context 'when a bit is previously set to 1' do
|
67
|
+
before { @client.setbit("key1", 10, 1) }
|
68
|
+
|
69
|
+
it 'setting it to 0 returns 1' do
|
70
|
+
expect(@client.setbit("key1", 10, 0)).to eql 1
|
71
|
+
end
|
72
|
+
|
73
|
+
it 'setting it to 1 returns 1' do
|
74
|
+
expect(@client.setbit("key1", 10, 1)).to eql 1
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
52
78
|
it "should get a substring of the string stored at a key" do
|
53
79
|
@client.set("key1", "This a message")
|
54
80
|
|
@@ -77,7 +103,7 @@ module FakeRedis
|
|
77
103
|
|
78
104
|
it "should not change the expire value of the key during incr" do
|
79
105
|
@client.set("counter", "1")
|
80
|
-
@client.expire("counter", 600).should
|
106
|
+
@client.expire("counter", 600).should be true
|
81
107
|
@client.ttl("counter").should be == 600
|
82
108
|
@client.incr("counter").should be == 2
|
83
109
|
@client.ttl("counter").should be == 600
|
@@ -92,7 +118,7 @@ module FakeRedis
|
|
92
118
|
|
93
119
|
it "should not change the expire value of the key during decr" do
|
94
120
|
@client.set("counter", "2")
|
95
|
-
@client.expire("counter", 600).should
|
121
|
+
@client.expire("counter", 600).should be true
|
96
122
|
@client.ttl("counter").should be == 600
|
97
123
|
@client.decr("counter").should be == 1
|
98
124
|
@client.ttl("counter").should be == 600
|
@@ -107,7 +133,7 @@ module FakeRedis
|
|
107
133
|
|
108
134
|
it "should not change the expire value of the key during incrby" do
|
109
135
|
@client.set("counter", "1")
|
110
|
-
@client.expire("counter", 600).should
|
136
|
+
@client.expire("counter", 600).should be true
|
111
137
|
@client.ttl("counter").should be == 600
|
112
138
|
@client.incrby("counter", "5").should be == 6
|
113
139
|
@client.ttl("counter").should be == 600
|
@@ -122,7 +148,7 @@ module FakeRedis
|
|
122
148
|
|
123
149
|
it "should not change the expire value of the key during decrby" do
|
124
150
|
@client.set("counter", "8")
|
125
|
-
@client.expire("counter", 600).should
|
151
|
+
@client.expire("counter", 600).should be true
|
126
152
|
@client.ttl("counter").should be == 600
|
127
153
|
@client.decrby("counter", "3").should be == 5
|
128
154
|
@client.ttl("counter").should be == 600
|
@@ -232,5 +258,27 @@ module FakeRedis
|
|
232
258
|
@client.strlen("key1").should be == 3
|
233
259
|
end
|
234
260
|
|
261
|
+
it "should return 0 bits when there's no key" do
|
262
|
+
@client.bitcount("key1").should be == 0
|
263
|
+
end
|
264
|
+
|
265
|
+
it "should count the number of bits of a string" do
|
266
|
+
@client.set("key1", "foobar")
|
267
|
+
@client.bitcount("key1").should be == 26
|
268
|
+
end
|
269
|
+
|
270
|
+
it "should count correctly with UTF-8 strings" do
|
271
|
+
@client.set("key1", '判')
|
272
|
+
@client.bitcount("key1").should be == 10
|
273
|
+
end
|
274
|
+
|
275
|
+
it "should count the number of bits of a string given a range" do
|
276
|
+
@client.set("key1", "foobar")
|
277
|
+
|
278
|
+
@client.bitcount("key1", 0, 0).should be == 4
|
279
|
+
@client.bitcount("key1", 1, 1).should be == 6
|
280
|
+
@client.bitcount("key1", 0, 1).should be == 10
|
281
|
+
end
|
282
|
+
|
235
283
|
end
|
236
284
|
end
|
@@ -0,0 +1,69 @@
|
|
1
|
+
shared_examples_for "a sortable" do
|
2
|
+
it 'returns empty array on nil' do
|
3
|
+
@client.sort(nil).should == []
|
4
|
+
end
|
5
|
+
|
6
|
+
context 'ordering' do
|
7
|
+
it 'orders ascending by default' do
|
8
|
+
@client.sort(@key).should == ['1', '2']
|
9
|
+
end
|
10
|
+
|
11
|
+
it 'orders by ascending when specified' do
|
12
|
+
@client.sort(@key, :order => "ASC").should == ['1', '2']
|
13
|
+
end
|
14
|
+
|
15
|
+
it 'orders by descending when specified' do
|
16
|
+
@client.sort(@key, :order => "DESC").should == ['2', '1']
|
17
|
+
end
|
18
|
+
|
19
|
+
it "orders by ascending when alpha is specified" do
|
20
|
+
@client.sort(@key, :order => "ALPHA").should == ["1", "2"]
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
context 'projections' do
|
25
|
+
it 'projects element when :get is "#"' do
|
26
|
+
@client.sort(@key, :get => '#').should == ['1', '2']
|
27
|
+
end
|
28
|
+
|
29
|
+
it 'projects through a key pattern' do
|
30
|
+
@client.sort(@key, :get => 'fake-redis-test:values_*').should == ['a', 'b']
|
31
|
+
end
|
32
|
+
|
33
|
+
it 'projects through a key pattern and reflects element' do
|
34
|
+
@client.sort(@key, :get => ['#', 'fake-redis-test:values_*']).should == [['1', 'a'], ['2', 'b']]
|
35
|
+
end
|
36
|
+
|
37
|
+
it 'projects through a hash key pattern' do
|
38
|
+
@client.sort(@key, :get => 'fake-redis-test:hash_*->key').should == ['x', 'y']
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
context 'weights' do
|
43
|
+
it 'weights by projecting through a key pattern' do
|
44
|
+
@client.sort(@key, :by => "fake-redis-test:weight_*").should == ['2', '1']
|
45
|
+
end
|
46
|
+
|
47
|
+
it 'weights by projecting through a key pattern and a specific order' do
|
48
|
+
@client.sort(@key, :order => "DESC", :by => "fake-redis-test:weight_*").should == ['1', '2']
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
context 'limit' do
|
53
|
+
it 'only returns requested window in the enumerable' do
|
54
|
+
@client.sort(@key, :limit => [0, 1]).should == ['1']
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
context 'store' do
|
59
|
+
it 'stores into another key' do
|
60
|
+
@client.sort(@key, :store => "fake-redis-test:some_bucket").should == 2
|
61
|
+
@client.lrange("fake-redis-test:some_bucket", 0, -1).should == ['1', '2']
|
62
|
+
end
|
63
|
+
|
64
|
+
it "stores into another key with other options specified" do
|
65
|
+
@client.sort(@key, :store => "fake-redis-test:some_bucket", :by => "fake-redis-test:weight_*").should == 2
|
66
|
+
@client.lrange("fake-redis-test:some_bucket", 0, -1).should == ['2', '1']
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
data/spec/transactions_spec.rb
CHANGED
@@ -2,18 +2,83 @@ require 'spec_helper'
|
|
2
2
|
|
3
3
|
module FakeRedis
|
4
4
|
describe "TransactionsMethods" do
|
5
|
-
before(:
|
5
|
+
before(:all) do
|
6
6
|
@client = Redis.new
|
7
7
|
end
|
8
8
|
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
9
|
+
before(:each) do
|
10
|
+
@client.discard rescue nil
|
11
|
+
end
|
12
|
+
|
13
|
+
context '#multi' do
|
14
|
+
it "should respond with 'OK'" do
|
15
|
+
@client.multi.should == 'OK'
|
16
|
+
end
|
17
|
+
|
18
|
+
it "should forbid nesting" do
|
19
|
+
@client.multi
|
20
|
+
lambda{@client.multi}.should raise_error(Redis::CommandError)
|
21
|
+
end
|
22
|
+
|
23
|
+
it "should mark the start of a transaction block" do
|
24
|
+
transaction = @client.multi do |multi|
|
25
|
+
multi.set("key1", "1")
|
26
|
+
multi.set("key2", "2")
|
27
|
+
multi.expire("key1", 123)
|
28
|
+
multi.mget("key1", "key2")
|
29
|
+
end
|
30
|
+
|
31
|
+
transaction.should be == ["OK", "OK", true, ["1", "2"]]
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
context '#discard' do
|
36
|
+
it "should responde with 'OK' after #multi" do
|
37
|
+
@client.multi
|
38
|
+
@client.discard.should == 'OK'
|
14
39
|
end
|
15
40
|
|
16
|
-
|
41
|
+
it "can't be run outside of #multi/#exec" do
|
42
|
+
lambda{@client.discard}.should raise_error(Redis::CommandError)
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
context '#exec' do
|
47
|
+
it "can't be run outside of #multi" do
|
48
|
+
lambda{@client.exec}.should raise_error(Redis::CommandError)
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
context 'saving up commands for later' do
|
53
|
+
before(:each) do
|
54
|
+
@client.multi
|
55
|
+
@string = 'fake-redis-test:string'
|
56
|
+
@list = 'fake-redis-test:list'
|
57
|
+
end
|
58
|
+
|
59
|
+
it "makes commands respond with 'QUEUED'" do
|
60
|
+
@client.set(@string, 'string').should == 'QUEUED'
|
61
|
+
@client.lpush(@list, 'list').should == 'QUEUED'
|
62
|
+
end
|
63
|
+
|
64
|
+
it "gives you the commands' responses when you call #exec" do
|
65
|
+
@client.set(@string, 'string')
|
66
|
+
@client.lpush(@list, 'list')
|
67
|
+
@client.lpush(@list, 'list')
|
68
|
+
|
69
|
+
@client.exec.should == ['OK', 1, 2]
|
70
|
+
end
|
71
|
+
|
72
|
+
it "does not raise exceptions, but rather puts them in #exec's response" do
|
73
|
+
@client.set(@string, 'string')
|
74
|
+
@client.lpush(@string, 'oops!')
|
75
|
+
@client.lpush(@list, 'list')
|
76
|
+
|
77
|
+
responses = @client.exec
|
78
|
+
responses[0].should == 'OK'
|
79
|
+
responses[1].should be_a(RuntimeError)
|
80
|
+
responses[2].should == 1
|
81
|
+
end
|
17
82
|
end
|
18
83
|
end
|
19
84
|
end
|
metadata
CHANGED
@@ -1,43 +1,43 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: fakeredis
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.5.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Guillermo Iguaran
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2014-07-01 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: redis
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- - ~>
|
17
|
+
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: 3.0
|
19
|
+
version: '3.0'
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
|
-
- - ~>
|
24
|
+
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: 3.0
|
26
|
+
version: '3.0'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: rspec
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
|
-
- -
|
31
|
+
- - "~>"
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version:
|
33
|
+
version: '3.0'
|
34
34
|
type: :development
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
|
-
- -
|
38
|
+
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version:
|
40
|
+
version: '3.0'
|
41
41
|
description: Fake (In-memory) driver for redis-rb. Useful for testing environment
|
42
42
|
and machines without Redis.
|
43
43
|
email:
|
@@ -46,9 +46,8 @@ executables: []
|
|
46
46
|
extensions: []
|
47
47
|
extra_rdoc_files: []
|
48
48
|
files:
|
49
|
-
- .gitignore
|
50
|
-
- .
|
51
|
-
- .travis.yml
|
49
|
+
- ".gitignore"
|
50
|
+
- ".travis.yml"
|
52
51
|
- Gemfile
|
53
52
|
- LICENSE
|
54
53
|
- README.md
|
@@ -56,10 +55,13 @@ files:
|
|
56
55
|
- fakeredis.gemspec
|
57
56
|
- lib/fake_redis.rb
|
58
57
|
- lib/fakeredis.rb
|
58
|
+
- lib/fakeredis/command_executor.rb
|
59
59
|
- lib/fakeredis/expiring_hash.rb
|
60
60
|
- lib/fakeredis/rspec.rb
|
61
|
+
- lib/fakeredis/sort_method.rb
|
61
62
|
- lib/fakeredis/sorted_set_argument_handler.rb
|
62
63
|
- lib/fakeredis/sorted_set_store.rb
|
64
|
+
- lib/fakeredis/transaction_commands.rb
|
63
65
|
- lib/fakeredis/version.rb
|
64
66
|
- lib/fakeredis/zset.rb
|
65
67
|
- lib/redis/connection/memory.rb
|
@@ -68,12 +70,15 @@ files:
|
|
68
70
|
- spec/hashes_spec.rb
|
69
71
|
- spec/keys_spec.rb
|
70
72
|
- spec/lists_spec.rb
|
73
|
+
- spec/memory_spec.rb
|
71
74
|
- spec/server_spec.rb
|
72
75
|
- spec/sets_spec.rb
|
76
|
+
- spec/sort_method_spec.rb
|
73
77
|
- spec/sorted_sets_spec.rb
|
74
78
|
- spec/spec_helper.rb
|
75
79
|
- spec/spec_helper_live_redis.rb
|
76
80
|
- spec/strings_spec.rb
|
81
|
+
- spec/support/shared_examples/sortable.rb
|
77
82
|
- spec/transactions_spec.rb
|
78
83
|
- spec/upcase_method_name_spec.rb
|
79
84
|
homepage: https://guilleiguaran.github.com/fakeredis
|
@@ -86,17 +91,17 @@ require_paths:
|
|
86
91
|
- lib
|
87
92
|
required_ruby_version: !ruby/object:Gem::Requirement
|
88
93
|
requirements:
|
89
|
-
- -
|
94
|
+
- - ">="
|
90
95
|
- !ruby/object:Gem::Version
|
91
96
|
version: '0'
|
92
97
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
93
98
|
requirements:
|
94
|
-
- -
|
99
|
+
- - ">="
|
95
100
|
- !ruby/object:Gem::Version
|
96
101
|
version: '0'
|
97
102
|
requirements: []
|
98
103
|
rubyforge_project:
|
99
|
-
rubygems_version: 2.0
|
104
|
+
rubygems_version: 2.2.0
|
100
105
|
signing_key:
|
101
106
|
specification_version: 4
|
102
107
|
summary: Fake (In-memory) driver for redis-rb.
|
@@ -106,11 +111,14 @@ test_files:
|
|
106
111
|
- spec/hashes_spec.rb
|
107
112
|
- spec/keys_spec.rb
|
108
113
|
- spec/lists_spec.rb
|
114
|
+
- spec/memory_spec.rb
|
109
115
|
- spec/server_spec.rb
|
110
116
|
- spec/sets_spec.rb
|
117
|
+
- spec/sort_method_spec.rb
|
111
118
|
- spec/sorted_sets_spec.rb
|
112
119
|
- spec/spec_helper.rb
|
113
120
|
- spec/spec_helper_live_redis.rb
|
114
121
|
- spec/strings_spec.rb
|
122
|
+
- spec/support/shared_examples/sortable.rb
|
115
123
|
- spec/transactions_spec.rb
|
116
124
|
- spec/upcase_method_name_spec.rb
|
data/.rspec
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
-b -fn --color
|