redislike 0.2.0 → 0.2.4
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/README.md +8 -6
- data/lib/redislike/helpers/lists.rb +4 -0
- data/lib/redislike/lists.rb +15 -0
- data/redislike.gemspec +1 -1
- data/tests/redislike/lists/blpop.rb +37 -0
- data/tests/redislike/lists/brpop.rb +37 -0
- data/tests/redislike/lists/brpoplpush.rb +17 -0
- data/tests/redislike/lists/lrem.rb +73 -0
- data/tests/redislike/lists/ltrim.rb +51 -0
- data/tests/redislike/lists.rb +5 -0
- metadata +7 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: eb04d4b6e5e86b980b69f5798f5f615104c117c9
|
4
|
+
data.tar.gz: 8e59980011755be17d0a2d87913ba59dfc6736f9
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 948a85049408f51cea11c1e428ca0c00aa242bb2f54dc5348e83cc375b6cb9597c9a448c2dec9a8ccd0a6ef0254fb9552a602a34fe3891e6a23eb48bda0a63e5
|
7
|
+
data.tar.gz: 668fee9ae35e5273bf5d907dfdf2c28deda1e15ef97740b9bd88400b5a6a32c32f5a439218c5faea533e3299ea8b003839ef38e74644b57080c54c570d558c4e
|
data/README.md
CHANGED
@@ -7,6 +7,9 @@ redislike adds backend-independent support for redis-like list operations to any
|
|
7
7
|
|
8
8
|
Supported Operations
|
9
9
|
--------------------
|
10
|
+
* BLPOP
|
11
|
+
* BRPOP
|
12
|
+
* BRPOPLPUSH
|
10
13
|
* LINDEX
|
11
14
|
* LINSERT
|
12
15
|
* LLEN
|
@@ -22,16 +25,15 @@ Supported Operations
|
|
22
25
|
* RPUSH
|
23
26
|
* RPUSHX
|
24
27
|
|
25
|
-
Missing
|
26
|
-
-------
|
27
|
-
* BLPOP
|
28
|
-
* BRPOP
|
29
|
-
* BRPOPLPUSH
|
30
|
-
|
31
28
|
Other Supported Operations
|
32
29
|
--------------------------
|
33
30
|
* EXISTS
|
34
31
|
|
32
|
+
Differences from Redis
|
33
|
+
----------------------
|
34
|
+
* LSET with a non-existent list raises a ```KeyError``` rather than a ```Redis::CommandError```.
|
35
|
+
* LSET with an out of range index raises an ```IndexError``` rather than a ```Redis::CommandError```.
|
36
|
+
|
35
37
|
Installation
|
36
38
|
------------
|
37
39
|
|
data/lib/redislike/lists.rb
CHANGED
@@ -24,6 +24,11 @@ module RedisLike
|
|
24
24
|
enqueue list, item, to: :tail, allow_create: false
|
25
25
|
end
|
26
26
|
|
27
|
+
def blpop(list)
|
28
|
+
block_while_empty list
|
29
|
+
lpop list
|
30
|
+
end
|
31
|
+
|
27
32
|
def lpop(list)
|
28
33
|
dequeue list, from: :head
|
29
34
|
end
|
@@ -32,12 +37,22 @@ module RedisLike
|
|
32
37
|
dequeue list, from: :tail
|
33
38
|
end
|
34
39
|
|
40
|
+
def brpop(list)
|
41
|
+
block_while_empty list
|
42
|
+
rpop list
|
43
|
+
end
|
44
|
+
|
35
45
|
def rpoplpush(source, destination)
|
36
46
|
item = rpop source
|
37
47
|
lpush destination, item
|
38
48
|
item
|
39
49
|
end
|
40
50
|
|
51
|
+
def brpoplpush(source, destination)
|
52
|
+
block_while_empty source
|
53
|
+
brpoplpush source, destination
|
54
|
+
end
|
55
|
+
|
41
56
|
def lindex(list, item)
|
42
57
|
fetch(list, []).at item
|
43
58
|
end
|
data/redislike.gemspec
CHANGED
@@ -0,0 +1,37 @@
|
|
1
|
+
require 'timeout'
|
2
|
+
|
3
|
+
context 'BLPOP' do
|
4
|
+
setup do
|
5
|
+
@db = Moneta.new :Memory
|
6
|
+
end
|
7
|
+
|
8
|
+
given 'an empty list' do
|
9
|
+
should 'block' do
|
10
|
+
assert_raises Timeout::Error do
|
11
|
+
Timeout.timeout(0.1) { @db.blpop 'test:nx' }
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
given 'a list with two items in it' do
|
17
|
+
setup do
|
18
|
+
@db.lpush 'test:blpop', 'foo'
|
19
|
+
@db.lpush 'test:blpop', 'bar'
|
20
|
+
end
|
21
|
+
|
22
|
+
should 'return items from the head of the list' do
|
23
|
+
values = 2.times.map { @db.blpop 'test:blpop' }
|
24
|
+
assert_equal ['bar', 'foo'], values
|
25
|
+
end
|
26
|
+
|
27
|
+
should 'block when there are no items in the list' do
|
28
|
+
2.times { @db.blpop 'test:blpop' }
|
29
|
+
|
30
|
+
assert_raises Timeout::Error do
|
31
|
+
Timeout.timeout(0.1) { @db.blpop 'test:blpop' }
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
teardown { @db.close }
|
37
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
require 'timeout'
|
2
|
+
|
3
|
+
context 'BRPOP' do
|
4
|
+
setup do
|
5
|
+
@db = Moneta.new :Memory
|
6
|
+
end
|
7
|
+
|
8
|
+
given 'an empty list' do
|
9
|
+
should 'block' do
|
10
|
+
assert_raises Timeout::Error do
|
11
|
+
Timeout.timeout(0.1) { @db.brpop 'test:nx' }
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
given 'a list with two items in it' do
|
17
|
+
setup do
|
18
|
+
@db.lpush 'test:brpop', 'foo'
|
19
|
+
@db.lpush 'test:brpop', 'bar'
|
20
|
+
end
|
21
|
+
|
22
|
+
should 'return items from the head of the list' do
|
23
|
+
values = 2.times.map { @db.brpop 'test:brpop' }
|
24
|
+
assert_equal ['foo', 'bar'], values
|
25
|
+
end
|
26
|
+
|
27
|
+
should 'block when there are no items in the list' do
|
28
|
+
2.times { @db.brpop 'test:brpop' }
|
29
|
+
|
30
|
+
assert_raises Timeout::Error do
|
31
|
+
Timeout.timeout(0.1) { @db.brpop 'test:brpop' }
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
teardown { @db.close }
|
37
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
require 'timeout'
|
2
|
+
|
3
|
+
context 'BRPOPLPUSH' do
|
4
|
+
setup do
|
5
|
+
@db = Moneta.new :Memory
|
6
|
+
end
|
7
|
+
|
8
|
+
given 'an empty list' do
|
9
|
+
should 'block' do
|
10
|
+
assert_raises Timeout::Error do
|
11
|
+
Timeout.timeout(0.1) { @db.brpoplpush 'test:nx', 'test:rpoplpush:b' }
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
teardown { @db.close }
|
17
|
+
end
|
@@ -0,0 +1,73 @@
|
|
1
|
+
context 'LREM' do
|
2
|
+
setup do
|
3
|
+
@db = Moneta.new :Memory
|
4
|
+
end
|
5
|
+
|
6
|
+
given 'an empty list' do
|
7
|
+
should 'return no items removed' do
|
8
|
+
assert_equal 0, @db.lrem('test:nx', 0, 'foo')
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
given 'a list with 6 items' do
|
13
|
+
setup do
|
14
|
+
3.times { @db.lpush 'test:lrem', 'foo' }
|
15
|
+
3.times { @db.lpush 'test:lrem', 'bar' }
|
16
|
+
end
|
17
|
+
|
18
|
+
context 'when the target is present 3 times' do
|
19
|
+
[1, -1].each do |multiplier|
|
20
|
+
direction = multiplier > 0 ? 'head' : 'tail'
|
21
|
+
context "when removing 9 times from #{direction}" do
|
22
|
+
should 'remove 3 items from' do
|
23
|
+
assert_equal 3, @db.lrem('test:lrem', 9 * multiplier, 'foo')
|
24
|
+
end
|
25
|
+
|
26
|
+
should 'not remove other elements' do
|
27
|
+
@db.lrem('test:lrem', 9 * multiplier, 'foo')
|
28
|
+
assert_equal 3, @db.lrange('test:lrem', 0, -1).count('bar')
|
29
|
+
end
|
30
|
+
|
31
|
+
should 'not contain the target anymore' do
|
32
|
+
@db.lrem('test:lrem', 9 * multiplier, 'foo')
|
33
|
+
assert !@db.lrange('test:lrem', 0, -1).include?('foo')
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
context "when removing 2 times from #{direction}" do
|
38
|
+
should 'remove 2 items' do
|
39
|
+
assert_equal 2, @db.lrem('test:lrem', 2 * multiplier, 'foo')
|
40
|
+
end
|
41
|
+
|
42
|
+
should 'not remove other elements' do
|
43
|
+
@db.lrem('test:lrem', 2 * multiplier, 'foo')
|
44
|
+
assert_equal 3, @db.lrange('test:lrem', 0, -1).count('bar')
|
45
|
+
end
|
46
|
+
|
47
|
+
should 'have one of the target remaining' do
|
48
|
+
@db.lrem('test:lrem', 2 * multiplier, 'foo')
|
49
|
+
assert_equal 1, @db.lrange('test:lrem', 0, -1).count('foo')
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
context "when removing all from #{direction}" do
|
54
|
+
should 'remove 3 items' do
|
55
|
+
assert_equal 3, @db.lrem('test:lrem', 0 * multiplier, 'foo')
|
56
|
+
end
|
57
|
+
|
58
|
+
should 'not remove other elements' do
|
59
|
+
@db.lrem('test:lrem', 0 * multiplier, 'foo')
|
60
|
+
assert_equal 3, @db.lrange('test:lrem', 0, -1).count('bar')
|
61
|
+
end
|
62
|
+
|
63
|
+
should 'not contain the target anymore' do
|
64
|
+
@db.lrem('test:lrem', 0 * multiplier, 'foo')
|
65
|
+
assert !@db.lrange('test:lrem', 0, -1).include?('foo')
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
teardown { @db.close }
|
73
|
+
end
|
@@ -0,0 +1,51 @@
|
|
1
|
+
context 'LTRIM' do
|
2
|
+
setup do
|
3
|
+
@db = Moneta.new :Memory
|
4
|
+
end
|
5
|
+
|
6
|
+
given 'an empty list' do
|
7
|
+
should 'return success' do
|
8
|
+
assert_equal 'OK', @db.ltrim('test:nx', 0, 99)
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
given 'a list with 100 items' do
|
13
|
+
setup do
|
14
|
+
50.times { @db.lpush 'test:ltrim', 'foo' }
|
15
|
+
50.times { @db.lpush 'test:ltrim', 'bar' }
|
16
|
+
end
|
17
|
+
|
18
|
+
context 'stop beyond list length' do
|
19
|
+
should 'not truncate the list' do
|
20
|
+
assert_equal 'OK', @db.ltrim('test:ltrim', 0, 200)
|
21
|
+
assert_equal 100, @db.lrange('test:ltrim', 0, -1).length
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
context 'when stop is positive' do
|
26
|
+
setup { @db.ltrim('test:ltrim', 0, 49) }
|
27
|
+
|
28
|
+
should 'contain items within the range' do
|
29
|
+
assert @db.lrange('test:ltrim', 0, -1).include?('bar')
|
30
|
+
end
|
31
|
+
|
32
|
+
should 'not contain items outside the range' do
|
33
|
+
assert !@db.lrange('test:ltrim', 0, -1).include?('foo')
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
context 'when stop is negative' do
|
38
|
+
setup { @db.ltrim('test:ltrim', -50, -1) }
|
39
|
+
|
40
|
+
should 'contain items within the range' do
|
41
|
+
assert !@db.lrange('test:ltrim', 0, -1).include?('bar')
|
42
|
+
end
|
43
|
+
|
44
|
+
should 'not contain items outside the range' do
|
45
|
+
assert @db.lrange('test:ltrim', 0, -1).include?('foo')
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
teardown { @db.close }
|
51
|
+
end
|
data/tests/redislike/lists.rb
CHANGED
@@ -1,3 +1,6 @@
|
|
1
|
+
require_relative 'lists/blpop'
|
2
|
+
require_relative 'lists/brpop'
|
3
|
+
require_relative 'lists/brpoplpush'
|
1
4
|
require_relative 'lists/lindex'
|
2
5
|
require_relative 'lists/linsert'
|
3
6
|
require_relative 'lists/llen'
|
@@ -5,7 +8,9 @@ require_relative 'lists/lpop'
|
|
5
8
|
require_relative 'lists/lpush'
|
6
9
|
require_relative 'lists/lpushx'
|
7
10
|
require_relative 'lists/lrange'
|
11
|
+
require_relative 'lists/lrem'
|
8
12
|
require_relative 'lists/lset'
|
13
|
+
require_relative 'lists/ltrim'
|
9
14
|
require_relative 'lists/rpop'
|
10
15
|
require_relative 'lists/rpoplpush'
|
11
16
|
require_relative 'lists/rpush'
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: redislike
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Chris Olstrom
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-04-
|
11
|
+
date: 2015-04-08 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: moneta
|
@@ -102,6 +102,9 @@ files:
|
|
102
102
|
- tests/compatibility/redislike/lists/rpushx.rb
|
103
103
|
- tests/redislike.rb
|
104
104
|
- tests/redislike/lists.rb
|
105
|
+
- tests/redislike/lists/blpop.rb
|
106
|
+
- tests/redislike/lists/brpop.rb
|
107
|
+
- tests/redislike/lists/brpoplpush.rb
|
105
108
|
- tests/redislike/lists/lindex.rb
|
106
109
|
- tests/redislike/lists/linsert.rb
|
107
110
|
- tests/redislike/lists/llen.rb
|
@@ -109,7 +112,9 @@ files:
|
|
109
112
|
- tests/redislike/lists/lpush.rb
|
110
113
|
- tests/redislike/lists/lpushx.rb
|
111
114
|
- tests/redislike/lists/lrange.rb
|
115
|
+
- tests/redislike/lists/lrem.rb
|
112
116
|
- tests/redislike/lists/lset.rb
|
117
|
+
- tests/redislike/lists/ltrim.rb
|
113
118
|
- tests/redislike/lists/rpop.rb
|
114
119
|
- tests/redislike/lists/rpoplpush.rb
|
115
120
|
- tests/redislike/lists/rpush.rb
|