mock_redis 0.35.0 → 0.36.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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +6 -0
- data/README.md +2 -2
- data/lib/mock_redis/list_methods.rb +30 -0
- data/lib/mock_redis/set_methods.rb +6 -0
- data/lib/mock_redis/version.rb +1 -1
- data/lib/mock_redis/zset_methods.rb +1 -1
- data/spec/commands/blmove_spec.rb +52 -0
- data/spec/commands/lmove_spec.rb +72 -0
- data/spec/commands/smismember_spec.rb +34 -0
- data/spec/commands/zrem_spec.rb +7 -0
- metadata +8 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: dac18dd7d43fb11953bf9988a89d64d8f82a0d6b909836d215880b5fc6c75e98
|
4
|
+
data.tar.gz: e34af1ec074a43fbdeefa25e27543c57a146e0e22900842875adfca1fed3a698
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a47e3c68ad32983cd4017ba6541dbfe3004d197468179713d5102bbe094a9978256831f9ee3d3c9a7abf8ec0c07b18ee8c04b911e9ca326e8d04da8288b8131e
|
7
|
+
data.tar.gz: 119d337effa67690de4754bfa9bfe37bcceade74089b73d8328fd7818877b14afb708ba432ea7b52c6299186d7dad736b14de95acde7bb51909ad6096eb1a143
|
data/CHANGELOG.md
CHANGED
data/README.md
CHANGED
@@ -55,8 +55,8 @@ since it's an in-memory object confined to a single process. MockRedis
|
|
55
55
|
makes every attempt to be Redis-compatible, but there are some
|
56
56
|
necessary exceptions.
|
57
57
|
|
58
|
-
* Blocking list commands (`#blpop`, `#brpop`, and `#brpoplpush`)
|
59
|
-
as expected if there is data for them to retrieve. If you use one of
|
58
|
+
* Blocking list commands (`#blmove`, `#blpop`, `#brpop`, and `#brpoplpush`)
|
59
|
+
work as expected if there is data for them to retrieve. If you use one of
|
60
60
|
these commands with a nonzero timeout and there is no data for it to
|
61
61
|
retrieve, then the command returns immediately. However, if you ask
|
62
62
|
one of these commands for data with a 0 timeout (means "wait
|
@@ -6,6 +6,20 @@ class MockRedis
|
|
6
6
|
include Assertions
|
7
7
|
include UtilityMethods
|
8
8
|
|
9
|
+
def blmove(source, destination, wherefrom, whereto, options = {})
|
10
|
+
options = { :timeout => options } if options.is_a?(Integer)
|
11
|
+
timeout = options.is_a?(Hash) && options[:timeout] || 0
|
12
|
+
assert_valid_timeout(timeout)
|
13
|
+
|
14
|
+
if llen(source) > 0
|
15
|
+
lmove(source, destination, wherefrom, whereto)
|
16
|
+
elsif timeout > 0
|
17
|
+
nil
|
18
|
+
else
|
19
|
+
raise MockRedis::WouldBlock, "Can't block forever"
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
9
23
|
def blpop(*args)
|
10
24
|
lists, timeout = extract_timeout(args)
|
11
25
|
nonempty_list = first_nonempty_list(lists)
|
@@ -78,6 +92,22 @@ class MockRedis
|
|
78
92
|
with_list_at(key, &:length)
|
79
93
|
end
|
80
94
|
|
95
|
+
def lmove(source, destination, wherefrom, whereto)
|
96
|
+
assert_listy(source)
|
97
|
+
assert_listy(destination)
|
98
|
+
|
99
|
+
wherefrom = wherefrom.to_s.downcase
|
100
|
+
whereto = whereto.to_s.downcase
|
101
|
+
|
102
|
+
unless %w[left right].include?(wherefrom) && %w[left right].include?(whereto)
|
103
|
+
raise Redis::CommandError, 'ERR syntax error'
|
104
|
+
end
|
105
|
+
|
106
|
+
value = wherefrom == 'left' ? lpop(source) : rpop(source)
|
107
|
+
(whereto == 'left' ? lpush(destination, value) : rpush(destination, value)) unless value.nil?
|
108
|
+
value
|
109
|
+
end
|
110
|
+
|
81
111
|
def lpop(key)
|
82
112
|
with_list_at(key, &:shift)
|
83
113
|
end
|
@@ -64,6 +64,12 @@ class MockRedis
|
|
64
64
|
with_set_at(key) { |s| s.include?(member.to_s) }
|
65
65
|
end
|
66
66
|
|
67
|
+
def smismember(key, *members)
|
68
|
+
with_set_at(key) do |set|
|
69
|
+
members.flatten.map { |m| set.include?(m.to_s) }
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
67
73
|
def smembers(key)
|
68
74
|
with_set_at(key, &:to_a).map(&:dup).reverse
|
69
75
|
end
|
data/lib/mock_redis/version.rb
CHANGED
@@ -0,0 +1,52 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe '#blmove(source, destination, wherefrom, whereto, timeout)' do
|
4
|
+
before do
|
5
|
+
@list1 = 'mock-redis-test:blmove-list1'
|
6
|
+
@list2 = 'mock-redis-test:blmove-list2'
|
7
|
+
|
8
|
+
@redises.lpush(@list1, 'b')
|
9
|
+
@redises.lpush(@list1, 'a')
|
10
|
+
|
11
|
+
@redises.lpush(@list2, 'y')
|
12
|
+
@redises.lpush(@list2, 'x')
|
13
|
+
end
|
14
|
+
|
15
|
+
it 'returns the value moved' do
|
16
|
+
@redises.blmove(@list1, @list2, 'left', 'right').should == 'a'
|
17
|
+
end
|
18
|
+
|
19
|
+
it 'takes the first element of source and appends it to destination' do
|
20
|
+
@redises.blmove(@list1, @list2, 'left', 'right')
|
21
|
+
|
22
|
+
@redises.lrange(@list1, 0, -1).should == %w[b]
|
23
|
+
@redises.lrange(@list2, 0, -1).should == %w[x y a]
|
24
|
+
end
|
25
|
+
|
26
|
+
it 'raises an error on negative timeout' do
|
27
|
+
lambda do
|
28
|
+
@redises.blmove(@list1, @list2, 'left', 'right', :timeout => -1)
|
29
|
+
end.should raise_error(Redis::CommandError)
|
30
|
+
end
|
31
|
+
|
32
|
+
let(:default_error) { RedisMultiplexer::MismatchedResponse }
|
33
|
+
it_should_behave_like 'a list-only command'
|
34
|
+
|
35
|
+
context '[mock only]' do
|
36
|
+
it 'ignores positive timeouts and returns nil' do
|
37
|
+
@redises.mock.blmove('mock-redis-test:not-here', @list1, 'left', 'right', :timeout => 1).
|
38
|
+
should be_nil
|
39
|
+
end
|
40
|
+
|
41
|
+
it 'ignores positive legacy timeouts and returns nil' do
|
42
|
+
@redises.mock.blmove('mock-redis-test:not-here', @list1, 'left', 'right', 1).
|
43
|
+
should be_nil
|
44
|
+
end
|
45
|
+
|
46
|
+
it 'raises WouldBlock on zero timeout (no blocking in the mock)' do
|
47
|
+
lambda do
|
48
|
+
@redises.mock.blmove('mock-redis-test:not-here', @list1, 'left', 'right', :timeout => 0)
|
49
|
+
end.should raise_error(MockRedis::WouldBlock)
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
@@ -0,0 +1,72 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe '#lmove(source, destination, wherefrom, whereto)' do
|
4
|
+
before do
|
5
|
+
@list1 = 'mock-redis-test:lmove-list1'
|
6
|
+
@list2 = 'mock-redis-test:lmove-list2'
|
7
|
+
|
8
|
+
@redises.lpush(@list1, 'b')
|
9
|
+
@redises.lpush(@list1, 'a')
|
10
|
+
|
11
|
+
@redises.lpush(@list2, 'y')
|
12
|
+
@redises.lpush(@list2, 'x')
|
13
|
+
end
|
14
|
+
|
15
|
+
it 'returns the value moved' do
|
16
|
+
@redises.lmove(@list1, @list2, 'left', 'right').should == 'a'
|
17
|
+
end
|
18
|
+
|
19
|
+
it "returns nil and doesn't append if source empty" do
|
20
|
+
@redises.lmove('empty', @list1, 'left', 'right').should be_nil
|
21
|
+
@redises.lrange(@list1, 0, -1).should == %w[a b]
|
22
|
+
end
|
23
|
+
|
24
|
+
it 'takes the first element of source and prepends it to destination' do
|
25
|
+
@redises.lmove(@list1, @list2, 'left', 'left')
|
26
|
+
|
27
|
+
@redises.lrange(@list1, 0, -1).should == %w[b]
|
28
|
+
@redises.lrange(@list2, 0, -1).should == %w[a x y]
|
29
|
+
end
|
30
|
+
|
31
|
+
it 'takes the first element of source and appends it to destination' do
|
32
|
+
@redises.lmove(@list1, @list2, 'left', 'right')
|
33
|
+
|
34
|
+
@redises.lrange(@list1, 0, -1).should == %w[b]
|
35
|
+
@redises.lrange(@list2, 0, -1).should == %w[x y a]
|
36
|
+
end
|
37
|
+
|
38
|
+
it 'takes the last element of source and prepends it to destination' do
|
39
|
+
@redises.lmove(@list1, @list2, 'right', 'left')
|
40
|
+
|
41
|
+
@redises.lrange(@list1, 0, -1).should == %w[a]
|
42
|
+
@redises.lrange(@list2, 0, -1).should == %w[b x y]
|
43
|
+
end
|
44
|
+
|
45
|
+
it 'takes the last element of source and appends it to destination' do
|
46
|
+
@redises.lmove(@list1, @list2, 'right', 'right')
|
47
|
+
|
48
|
+
@redises.lrange(@list1, 0, -1).should == %w[a]
|
49
|
+
@redises.lrange(@list2, 0, -1).should == %w[x y b]
|
50
|
+
end
|
51
|
+
|
52
|
+
it 'rotates a list when source and destination are the same' do
|
53
|
+
@redises.lmove(@list1, @list1, 'left', 'right')
|
54
|
+
@redises.lrange(@list1, 0, -1).should == %w[b a]
|
55
|
+
end
|
56
|
+
|
57
|
+
it 'removes empty lists' do
|
58
|
+
@redises.llen(@list1).times { @redises.lmove(@list1, @list2, 'left', 'right') }
|
59
|
+
@redises.get(@list1).should be_nil
|
60
|
+
end
|
61
|
+
|
62
|
+
it 'raises an error for non-list source value' do
|
63
|
+
@redises.set(@list1, 'string value')
|
64
|
+
|
65
|
+
lambda do
|
66
|
+
@redises.lmove(@list1, @list2, 'left', 'right')
|
67
|
+
end.should raise_error(Redis::CommandError)
|
68
|
+
end
|
69
|
+
|
70
|
+
let(:default_error) { RedisMultiplexer::MismatchedResponse }
|
71
|
+
it_should_behave_like 'a list-only command'
|
72
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe '#smismember(key, *members)' do
|
4
|
+
before do
|
5
|
+
@key = 'mock-redis-test:smismember'
|
6
|
+
@redises.sadd(@key, 'whiskey')
|
7
|
+
@redises.sadd(@key, 'beer')
|
8
|
+
end
|
9
|
+
|
10
|
+
it 'returns true if member is in set' do
|
11
|
+
@redises.smismember(@key, 'whiskey').should == [true]
|
12
|
+
@redises.smismember(@key, 'beer').should == [true]
|
13
|
+
@redises.smismember(@key, 'whiskey', 'beer').should == [true, true]
|
14
|
+
@redises.smismember(@key, %w[whiskey beer]).should == [true, true]
|
15
|
+
end
|
16
|
+
|
17
|
+
it 'returns false if member is not in set' do
|
18
|
+
@redises.smismember(@key, 'cola').should == [false]
|
19
|
+
@redises.smismember(@key, 'whiskey', 'cola').should == [true, false]
|
20
|
+
@redises.smismember(@key, %w[whiskey beer cola]).should == [true, true, false]
|
21
|
+
end
|
22
|
+
|
23
|
+
it 'stringifies member' do
|
24
|
+
@redises.sadd(@key, '1')
|
25
|
+
@redises.smismember(@key, 1).should == [true]
|
26
|
+
@redises.smismember(@key, [1]).should == [true]
|
27
|
+
end
|
28
|
+
|
29
|
+
it 'treats a nonexistent value as an empty set' do
|
30
|
+
@redises.smismember('mock-redis-test:nonesuch', 'beer').should == [false]
|
31
|
+
end
|
32
|
+
|
33
|
+
it_should_behave_like 'a set-only command'
|
34
|
+
end
|
data/spec/commands/zrem_spec.rb
CHANGED
@@ -28,6 +28,13 @@ describe '#zrem(key, member)' do
|
|
28
28
|
@redises.zrange(@key, 0, -1).should == %w[one two]
|
29
29
|
end
|
30
30
|
|
31
|
+
it 'removes integer members inside an array from the set' do
|
32
|
+
member = 11
|
33
|
+
@redises.zadd(@key, 3, member)
|
34
|
+
@redises.zrem(@key, [member]).should == 1
|
35
|
+
@redises.zrange(@key, 0, -1).should == %w[one two]
|
36
|
+
end
|
37
|
+
|
31
38
|
it 'supports a variable number of arguments' do
|
32
39
|
@redises.zrem(@key, %w[one two])
|
33
40
|
@redises.zrange(@key, 0, -1).should be_empty
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: mock_redis
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.36.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Shane da Silva
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2023-01-27 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: ruby2_keywords
|
@@ -138,6 +138,7 @@ files:
|
|
138
138
|
- spec/commands/bgsave_spec.rb
|
139
139
|
- spec/commands/bitcount_spec.rb
|
140
140
|
- spec/commands/bitfield_spec.rb
|
141
|
+
- spec/commands/blmove_spec.rb
|
141
142
|
- spec/commands/blpop_spec.rb
|
142
143
|
- spec/commands/brpop_spec.rb
|
143
144
|
- spec/commands/brpoplpush_spec.rb
|
@@ -191,6 +192,7 @@ files:
|
|
191
192
|
- spec/commands/lindex_spec.rb
|
192
193
|
- spec/commands/linsert_spec.rb
|
193
194
|
- spec/commands/llen_spec.rb
|
195
|
+
- spec/commands/lmove_spec.rb
|
194
196
|
- spec/commands/lpop_spec.rb
|
195
197
|
- spec/commands/lpush_spec.rb
|
196
198
|
- spec/commands/lpushx_spec.rb
|
@@ -241,6 +243,7 @@ files:
|
|
241
243
|
- spec/commands/sinterstore_spec.rb
|
242
244
|
- spec/commands/sismember_spec.rb
|
243
245
|
- spec/commands/smembers_spec.rb
|
246
|
+
- spec/commands/smismember_spec.rb
|
244
247
|
- spec/commands/smove_spec.rb
|
245
248
|
- spec/commands/sort_list_spec.rb
|
246
249
|
- spec/commands/sort_set_spec.rb
|
@@ -326,6 +329,7 @@ test_files:
|
|
326
329
|
- spec/commands/bgsave_spec.rb
|
327
330
|
- spec/commands/bitcount_spec.rb
|
328
331
|
- spec/commands/bitfield_spec.rb
|
332
|
+
- spec/commands/blmove_spec.rb
|
329
333
|
- spec/commands/blpop_spec.rb
|
330
334
|
- spec/commands/brpop_spec.rb
|
331
335
|
- spec/commands/brpoplpush_spec.rb
|
@@ -379,6 +383,7 @@ test_files:
|
|
379
383
|
- spec/commands/lindex_spec.rb
|
380
384
|
- spec/commands/linsert_spec.rb
|
381
385
|
- spec/commands/llen_spec.rb
|
386
|
+
- spec/commands/lmove_spec.rb
|
382
387
|
- spec/commands/lpop_spec.rb
|
383
388
|
- spec/commands/lpush_spec.rb
|
384
389
|
- spec/commands/lpushx_spec.rb
|
@@ -429,6 +434,7 @@ test_files:
|
|
429
434
|
- spec/commands/sinterstore_spec.rb
|
430
435
|
- spec/commands/sismember_spec.rb
|
431
436
|
- spec/commands/smembers_spec.rb
|
437
|
+
- spec/commands/smismember_spec.rb
|
432
438
|
- spec/commands/smove_spec.rb
|
433
439
|
- spec/commands/sort_list_spec.rb
|
434
440
|
- spec/commands/sort_set_spec.rb
|