mock_redis 0.26.0 → 0.28.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/.travis.yml +1 -0
- data/CHANGELOG.md +26 -0
- data/lib/mock_redis.rb +2 -1
- data/lib/mock_redis/connection_method.rb +13 -0
- data/lib/mock_redis/database.rb +2 -0
- data/lib/mock_redis/expire_wrapper.rb +1 -1
- data/lib/mock_redis/geospatial_methods.rb +1 -1
- data/lib/mock_redis/hash_methods.rb +5 -1
- data/lib/mock_redis/multi_db_wrapper.rb +1 -1
- data/lib/mock_redis/pipelined_wrapper.rb +1 -1
- data/lib/mock_redis/stream.rb +10 -7
- data/lib/mock_redis/stream/id.rb +8 -3
- data/lib/mock_redis/string_methods.rb +19 -17
- data/lib/mock_redis/transaction_wrapper.rb +1 -1
- data/lib/mock_redis/version.rb +1 -1
- data/mock_redis.gemspec +2 -0
- data/spec/commands/connection_spec.rb +15 -0
- data/spec/commands/del_spec.rb +3 -1
- data/spec/commands/hset_spec.rb +4 -0
- data/spec/commands/mget_spec.rb +6 -0
- data/spec/commands/set_spec.rb +52 -6
- data/spec/commands/xadd_spec.rb +10 -10
- data/spec/commands/xlen_spec.rb +5 -3
- data/spec/commands/xrange_spec.rb +13 -3
- data/spec/spec_helper.rb +0 -2
- data/spec/support/redis_multiplexer.rb +1 -1
- metadata +23 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 9dc2b4dd866fe426a0ee5b767bc46668c1ccb515f0b927feeac129b47f28a4a6
|
4
|
+
data.tar.gz: cccf8ea1f98f9376afadcc57738eef1578bd07166b08bb5a11eb6c3410412f23
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f8827a5223d959f27d33223904f0cdf705dfa280da700733ea83cb581ddc89ca3e427af39ec247ea05ebb79ecb9fe58ba3e8f2f1b7fd62204aacc65025f010cf
|
7
|
+
data.tar.gz: e1e3115c5577f1e22249f3c6b9fb3b82ac1be4b8a4967824cbea5f56ce35efec15154d1f9871de5ba3abc337cbe6d38c9d93787150c8e3262ba30b395bcb58b4
|
data/.travis.yml
CHANGED
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,31 @@
|
|
1
1
|
# MockRedis Changelog
|
2
2
|
|
3
|
+
### 0.28.0
|
4
|
+
|
5
|
+
* Fix `hmset` exception ([#206](https://github.com/sds/mock_redis/pull/206))
|
6
|
+
* Fix `hmset` to accept hashes in addition to key/value pairs ([#208](https://github.com/sds/mock_redis/pull/208))
|
7
|
+
* Fix stream ID regex to support `(` ([#209](https://github.com/sds/mock_redis/pull/209))
|
8
|
+
* Allow `mget` to accept a block ([#210](https://github.com/sds/mock_redis/pull/210))
|
9
|
+
|
10
|
+
### 0.27.3
|
11
|
+
|
12
|
+
* Ensure `ruby2_keywords` dependency is `require`d at runtime
|
13
|
+
|
14
|
+
### 0.27.2
|
15
|
+
|
16
|
+
* Switch `ruby2_keywords` gem from development dependency to runtime dependency
|
17
|
+
|
18
|
+
### 0.27.1
|
19
|
+
|
20
|
+
* Fix missing `ruby2_keywords` gem
|
21
|
+
* Allow passing string `offset` to `getbit` ([#203](https://github.com/sds/mock_redis/pull/203))
|
22
|
+
|
23
|
+
### 0.27.0
|
24
|
+
|
25
|
+
* Fix handling of keyword arguments on Ruby 3 ([#199](https://github.com/sds/mock_redis/pull/199))
|
26
|
+
* Allow passing string `offset` to `setbit` ([#200](https://github.com/sds/mock_redis/pull/200))
|
27
|
+
* Add `connection` method ([#201](https://github.com/sds/mock_redis/pull/201))
|
28
|
+
|
3
29
|
### 0.26.0
|
4
30
|
|
5
31
|
* Add block and count support to `xread` ([#194](https://github.com/sds/mock_redis/pull/194))
|
data/lib/mock_redis.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
require 'set'
|
2
|
+
require 'ruby2_keywords'
|
2
3
|
|
3
4
|
require 'mock_redis/assertions'
|
4
5
|
require 'mock_redis/database'
|
@@ -84,7 +85,7 @@ class MockRedis
|
|
84
85
|
super || @db.respond_to?(method, include_private)
|
85
86
|
end
|
86
87
|
|
87
|
-
def method_missing(method, *args, &block)
|
88
|
+
ruby2_keywords def method_missing(method, *args, &block)
|
88
89
|
@db.send(method, *args, &block)
|
89
90
|
end
|
90
91
|
|
data/lib/mock_redis/database.rb
CHANGED
@@ -11,6 +11,7 @@ require 'mock_redis/info_method'
|
|
11
11
|
require 'mock_redis/utility_methods'
|
12
12
|
require 'mock_redis/geospatial_methods'
|
13
13
|
require 'mock_redis/stream_methods'
|
14
|
+
require 'mock_redis/connection_method'
|
14
15
|
|
15
16
|
class MockRedis
|
16
17
|
class Database
|
@@ -24,6 +25,7 @@ class MockRedis
|
|
24
25
|
include UtilityMethods
|
25
26
|
include GeospatialMethods
|
26
27
|
include StreamMethods
|
28
|
+
include ConnectionMethod
|
27
29
|
|
28
30
|
attr_reader :data, :expire_times
|
29
31
|
|
@@ -94,7 +94,7 @@ class MockRedis
|
|
94
94
|
assert_has_args(kvpairs, 'hmset')
|
95
95
|
|
96
96
|
if kvpairs.length.odd?
|
97
|
-
raise Redis::CommandError, err_msg || 'ERR wrong number of arguments for
|
97
|
+
raise Redis::CommandError, err_msg || 'ERR wrong number of arguments for \'hmset\' command'
|
98
98
|
end
|
99
99
|
|
100
100
|
kvpairs.each_slice(2) do |(k, v)|
|
@@ -131,6 +131,10 @@ class MockRedis
|
|
131
131
|
def hset(key, *args)
|
132
132
|
added = 0
|
133
133
|
with_hash_at(key) do |hash|
|
134
|
+
if args.length == 1 && args[0].is_a?(Hash)
|
135
|
+
args = args[0].to_a.flatten
|
136
|
+
end
|
137
|
+
|
134
138
|
args.each_slice(2) do |field, value|
|
135
139
|
added += 1 unless hash.key?(field.to_s)
|
136
140
|
hash[field.to_s] = value.to_s
|
@@ -18,7 +18,7 @@ class MockRedis
|
|
18
18
|
@pipelined_futures = @pipelined_futures.clone
|
19
19
|
end
|
20
20
|
|
21
|
-
def method_missing(method, *args, &block)
|
21
|
+
ruby2_keywords def method_missing(method, *args, &block)
|
22
22
|
if in_pipeline?
|
23
23
|
future = MockRedis::Future.new([method, *args], block)
|
24
24
|
@pipelined_futures << future
|
data/lib/mock_redis/stream.rb
CHANGED
@@ -25,10 +25,7 @@ class MockRedis
|
|
25
25
|
@last_id = MockRedis::Stream::Id.new(id, min: @last_id)
|
26
26
|
if @last_id.to_s == '0-0'
|
27
27
|
raise Redis::CommandError,
|
28
|
-
|
29
|
-
'the target stream top item'
|
30
|
-
# TOOD: Redis version 6.0.4, w redis 4.2.1 generates the following error message:
|
31
|
-
# 'ERR The ID specified in XADD must be greater than 0-0'
|
28
|
+
'ERR The ID specified in XADD must be greater than 0-0'
|
32
29
|
end
|
33
30
|
members.add [@last_id, Hash[values.map { |k, v| [k.to_s, v.to_s] }]]
|
34
31
|
@last_id.to_s
|
@@ -52,9 +49,15 @@ class MockRedis
|
|
52
49
|
opts = options opts_in, ['count']
|
53
50
|
start_id = MockRedis::Stream::Id.new(start)
|
54
51
|
finish_id = MockRedis::Stream::Id.new(finish, sequence: Float::INFINITY)
|
55
|
-
|
56
|
-
|
57
|
-
|
52
|
+
if start_id.exclusive
|
53
|
+
items = members
|
54
|
+
.select { |m| (start_id < m[0]) && (finish_id >= m[0]) }
|
55
|
+
.map { |m| [m[0].to_s, m[1]] }
|
56
|
+
else
|
57
|
+
items = members
|
58
|
+
.select { |m| (start_id <= m[0]) && (finish_id >= m[0]) }
|
59
|
+
.map { |m| [m[0].to_s, m[1]] }
|
60
|
+
end
|
58
61
|
items.reverse! if reversed
|
59
62
|
return items.first(opts['count'].to_i) if opts.key?('count')
|
60
63
|
items
|
data/lib/mock_redis/stream/id.rb
CHANGED
@@ -3,9 +3,10 @@ class MockRedis
|
|
3
3
|
class Id
|
4
4
|
include Comparable
|
5
5
|
|
6
|
-
attr_accessor :timestamp, :sequence
|
6
|
+
attr_accessor :timestamp, :sequence, :exclusive
|
7
7
|
|
8
8
|
def initialize(id, min: nil, sequence: 0)
|
9
|
+
@exclusive = false
|
9
10
|
case id
|
10
11
|
when '*'
|
11
12
|
@timestamp = (Time.now.to_f * 1000).to_i
|
@@ -20,8 +21,12 @@ class MockRedis
|
|
20
21
|
@timestamp = @sequence = Float::INFINITY
|
21
22
|
else
|
22
23
|
if id.is_a? String
|
23
|
-
|
24
|
-
|
24
|
+
# See https://redis.io/topics/streams-intro
|
25
|
+
# Ids are a unix timestamp in milliseconds followed by an
|
26
|
+
# optional dash sequence number, e.g. -0. They can also optionally
|
27
|
+
# be prefixed with '(' to change the XRANGE to exclusive.
|
28
|
+
(_, @timestamp, @sequence) = id.match(/^\(?(\d+)-?(\d+)?$/).to_a
|
29
|
+
@exclusive = true if id[0] == '('
|
25
30
|
if @timestamp.nil?
|
26
31
|
raise Redis::CommandError,
|
27
32
|
'ERR Invalid stream ID specified as stream command argument'
|
@@ -93,6 +93,7 @@ class MockRedis
|
|
93
93
|
def getbit(key, offset)
|
94
94
|
assert_stringy(key)
|
95
95
|
|
96
|
+
offset = offset.to_i
|
96
97
|
offset_of_byte = offset / 8
|
97
98
|
offset_within_byte = offset % 8
|
98
99
|
|
@@ -153,14 +154,16 @@ class MockRedis
|
|
153
154
|
new_value
|
154
155
|
end
|
155
156
|
|
156
|
-
def mget(*keys)
|
157
|
+
def mget(*keys, &blk)
|
157
158
|
keys.flatten!
|
158
159
|
|
159
160
|
assert_has_args(keys, 'mget')
|
160
161
|
|
161
|
-
keys.map do |key|
|
162
|
+
data = keys.map do |key|
|
162
163
|
get(key) if stringy?(key)
|
163
164
|
end
|
165
|
+
|
166
|
+
blk ? blk.call(data) : data
|
164
167
|
end
|
165
168
|
|
166
169
|
def mapped_mget(*keys)
|
@@ -201,18 +204,19 @@ class MockRedis
|
|
201
204
|
msetnx(*hash.to_a.flatten)
|
202
205
|
end
|
203
206
|
|
204
|
-
|
207
|
+
# Parameer list required to ensure the ArgumentError is returned correctly
|
208
|
+
# rubocop:disable Metrics/ParameterLists
|
209
|
+
def set(key, value, ex: nil, px: nil, nx: nil, xx: nil, keepttl: nil)
|
205
210
|
key = key.to_s
|
206
211
|
return_true = false
|
207
|
-
|
208
|
-
if options.delete(:nx)
|
212
|
+
if nx
|
209
213
|
if exists?(key)
|
210
214
|
return false
|
211
215
|
else
|
212
216
|
return_true = true
|
213
217
|
end
|
214
218
|
end
|
215
|
-
if
|
219
|
+
if xx
|
216
220
|
if exists?(key)
|
217
221
|
return_true = true
|
218
222
|
else
|
@@ -221,27 +225,24 @@ class MockRedis
|
|
221
225
|
end
|
222
226
|
data[key] = value.to_s
|
223
227
|
|
224
|
-
|
225
|
-
if
|
226
|
-
if
|
228
|
+
remove_expiration(key) unless keepttl
|
229
|
+
if ex
|
230
|
+
if ex == 0
|
227
231
|
raise Redis::CommandError, 'ERR invalid expire time in set'
|
228
232
|
end
|
229
|
-
expire(key,
|
233
|
+
expire(key, ex)
|
230
234
|
end
|
231
235
|
|
232
|
-
|
233
|
-
|
234
|
-
if duration == 0
|
236
|
+
if px
|
237
|
+
if px == 0
|
235
238
|
raise Redis::CommandError, 'ERR invalid expire time in set'
|
236
239
|
end
|
237
|
-
pexpire(key,
|
238
|
-
end
|
239
|
-
unless options.empty?
|
240
|
-
raise ArgumentError, "unknown keyword: #{options.keys[0]}"
|
240
|
+
pexpire(key, px)
|
241
241
|
end
|
242
242
|
|
243
243
|
return_true ? true : 'OK'
|
244
244
|
end
|
245
|
+
# rubocop:enable Metrics/ParameterLists
|
245
246
|
|
246
247
|
def setbit(key, offset, value)
|
247
248
|
assert_stringy(key, 'ERR bit is not an integer or out of range')
|
@@ -249,6 +250,7 @@ class MockRedis
|
|
249
250
|
|
250
251
|
str = data[key] || ''
|
251
252
|
|
253
|
+
offset = offset.to_i
|
252
254
|
offset_of_byte = offset / 8
|
253
255
|
offset_within_byte = offset % 8
|
254
256
|
|
@@ -15,7 +15,7 @@ class MockRedis
|
|
15
15
|
@multi_block_given = false
|
16
16
|
end
|
17
17
|
|
18
|
-
def method_missing(method, *args, &block)
|
18
|
+
ruby2_keywords def method_missing(method, *args, &block)
|
19
19
|
if in_multi?
|
20
20
|
future = MockRedis::Future.new([method, *args], block)
|
21
21
|
@transaction_futures << future
|
data/lib/mock_redis/version.rb
CHANGED
data/mock_redis.gemspec
CHANGED
@@ -23,6 +23,8 @@ Gem::Specification.new do |s|
|
|
23
23
|
|
24
24
|
s.required_ruby_version = '>= 2.4'
|
25
25
|
|
26
|
+
s.add_runtime_dependency 'ruby2_keywords'
|
27
|
+
|
26
28
|
s.add_development_dependency 'redis', '~> 4.2.0'
|
27
29
|
s.add_development_dependency 'rspec', '~> 3.0'
|
28
30
|
s.add_development_dependency 'rspec-its', '~> 1.0'
|
@@ -0,0 +1,15 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe '#connection' do
|
4
|
+
let(:redis) { @redises.mock }
|
5
|
+
|
6
|
+
it 'returns the correct values' do
|
7
|
+
redis.connection.should == {
|
8
|
+
:host => '127.0.0.1',
|
9
|
+
:port => 6379,
|
10
|
+
:db => 0,
|
11
|
+
:id => 'redis://127.0.0.1:6379/0',
|
12
|
+
:location => '127.0.0.1:6379'
|
13
|
+
}
|
14
|
+
end
|
15
|
+
end
|
data/spec/commands/del_spec.rb
CHANGED
@@ -6,7 +6,9 @@ describe '#del(key [, key, ...])' do
|
|
6
6
|
end
|
7
7
|
|
8
8
|
before :each do
|
9
|
-
|
9
|
+
# TODO: Redis appears to be returning a timestamp a few seconds in the future
|
10
|
+
# so we're ignoring the last 5 digits (time in milliseconds)
|
11
|
+
@redises._gsub(/\d{5}-\d/, '...-.')
|
10
12
|
end
|
11
13
|
|
12
14
|
it 'returns the number of keys deleted' do
|
data/spec/commands/hset_spec.rb
CHANGED
data/spec/commands/mget_spec.rb
CHANGED
@@ -56,4 +56,10 @@ describe '#mget(key [, key, ...])' do
|
|
56
56
|
end.should raise_error(Redis::CommandError)
|
57
57
|
end
|
58
58
|
end
|
59
|
+
|
60
|
+
context 'emulate block' do
|
61
|
+
it 'returns an array of values' do
|
62
|
+
@redises.mget(@key1, @key2) { |values| values.map(&:to_i) }.should == [1, 2]
|
63
|
+
end
|
64
|
+
end
|
59
65
|
end
|
data/spec/commands/set_spec.rb
CHANGED
@@ -1,6 +1,8 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
describe '#set(key, value)' do
|
4
|
+
let(:key) { 'mock-redis-test' }
|
5
|
+
|
4
6
|
it "responds with 'OK'" do
|
5
7
|
@redises.set('mock-redis-test', 1).should == 'OK'
|
6
8
|
end
|
@@ -19,26 +21,72 @@ describe '#set(key, value)' do
|
|
19
21
|
end
|
20
22
|
|
21
23
|
it 'accepts NX' do
|
22
|
-
key = 'mock-redis-test'
|
23
24
|
@redises.del(key)
|
24
25
|
@redises.set(key, 1, nx: true).should == true
|
25
26
|
@redises.set(key, 1, nx: true).should == false
|
26
27
|
end
|
27
28
|
|
28
29
|
it 'accepts XX' do
|
29
|
-
key = 'mock-redis-test'
|
30
30
|
@redises.del(key)
|
31
31
|
@redises.set(key, 1, xx: true).should == false
|
32
32
|
@redises.set(key, 1).should == 'OK'
|
33
33
|
@redises.set(key, 1, xx: true).should == true
|
34
34
|
end
|
35
35
|
|
36
|
+
it 'sets the ttl to -1' do
|
37
|
+
@redises.set(key, 1)
|
38
|
+
expect(@redises.ttl(key)).to eq(-1)
|
39
|
+
end
|
40
|
+
|
41
|
+
context 'with an expiry time' do
|
42
|
+
before :each do
|
43
|
+
Timecop.freeze
|
44
|
+
@redises.set(key, 1, ex: 90)
|
45
|
+
end
|
46
|
+
|
47
|
+
after :each do
|
48
|
+
@redises.del(key)
|
49
|
+
Timecop.return
|
50
|
+
end
|
51
|
+
|
52
|
+
it 'has the TTL set' do
|
53
|
+
expect(@redises.ttl(key)).to eq 90
|
54
|
+
end
|
55
|
+
|
56
|
+
it 'resets the TTL without keepttl' do
|
57
|
+
expect do
|
58
|
+
@redises.set(key, 2)
|
59
|
+
end.to change { @redises.ttl(key) }.from(90).to(-1)
|
60
|
+
end
|
61
|
+
|
62
|
+
it 'does not change the TTL with keepttl: true' do
|
63
|
+
expect do
|
64
|
+
@redises.set(key, 2, keepttl: true)
|
65
|
+
end.not_to change { @redises.ttl(key) }.from(90)
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
it 'accepts KEEPTTL' do
|
70
|
+
expect(@redises.set(key, 1, keepttl: true)).to eq 'OK'
|
71
|
+
end
|
72
|
+
|
73
|
+
it 'does not set TTL without ex' do
|
74
|
+
@redises.set(key, 1)
|
75
|
+
expect(@redises.ttl(key)).to eq(-1)
|
76
|
+
end
|
77
|
+
|
78
|
+
it 'sets the TTL' do
|
79
|
+
Timecop.freeze do
|
80
|
+
@redises.set(key, 1, ex: 90)
|
81
|
+
expect(@redises.ttl(key)).to eq 90
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
36
85
|
it 'raises on unknown options' do
|
37
|
-
key = 'mock-redis-test'
|
38
86
|
@redises.del(key)
|
39
87
|
expect do
|
40
88
|
@redises.set(key, 1, logger: :something)
|
41
|
-
end.to raise_error(ArgumentError,
|
89
|
+
end.to raise_error(ArgumentError, /unknown keyword/)
|
42
90
|
end
|
43
91
|
|
44
92
|
context '[mock only]' do
|
@@ -52,7 +100,6 @@ describe '#set(key, value)' do
|
|
52
100
|
end
|
53
101
|
|
54
102
|
it 'accepts EX seconds' do
|
55
|
-
key = 'mock-redis-test'
|
56
103
|
@mock.set(key, 1, ex: 1).should == 'OK'
|
57
104
|
@mock.get(key).should_not be_nil
|
58
105
|
Time.stub(:now).and_return(@now + 2)
|
@@ -60,7 +107,6 @@ describe '#set(key, value)' do
|
|
60
107
|
end
|
61
108
|
|
62
109
|
it 'accepts PX milliseconds' do
|
63
|
-
key = 'mock-redis-test'
|
64
110
|
@mock.set(key, 1, px: 500).should == 'OK'
|
65
111
|
@mock.get(key).should_not be_nil
|
66
112
|
Time.stub(:now).and_return(@now + 300 / 1000.to_f)
|
data/spec/commands/xadd_spec.rb
CHANGED
@@ -7,24 +7,27 @@ describe '#xadd("mystream", { f1: "v1", f2: "v2" }, id: "0-0", maxlen: 1000, app
|
|
7
7
|
end
|
8
8
|
|
9
9
|
before :each do
|
10
|
-
|
10
|
+
# TODO: Redis appears to be returning a timestamp a few seconds in the future
|
11
|
+
# so we're ignoring the last 5 digits (time in milliseconds)
|
12
|
+
@redises._gsub(/\d{5}-\d/, '....-.')
|
11
13
|
end
|
12
14
|
|
13
15
|
it 'returns an id based on the timestamp' do
|
14
16
|
t = Time.now.to_i
|
15
|
-
|
17
|
+
id = @redises.xadd(@key, { key: 'value' })
|
18
|
+
expect(@redises.xadd(@key, { key: 'value' })).to match(/#{t}\d{3}-0/)
|
16
19
|
end
|
17
20
|
|
18
21
|
it 'adds data with symbols' do
|
19
|
-
@redises.xadd(@key, symbol_key: :symbol_value)
|
22
|
+
@redises.xadd(@key, { symbol_key: :symbol_value })
|
20
23
|
expect(@redises.xrange(@key, '-', '+').last[1])
|
21
24
|
.to eq('symbol_key' => 'symbol_value')
|
22
25
|
end
|
23
26
|
|
24
27
|
it 'increments the sequence number with the same timestamp' do
|
25
28
|
Timecop.freeze do
|
26
|
-
@redises.xadd(@key, key: 'value')
|
27
|
-
expect(@redises.xadd(@key, key: 'value')).to match(/\d+-1/)
|
29
|
+
@redises.xadd(@key, { key: 'value' })
|
30
|
+
expect(@redises.xadd(@key, { key: 'value' })).to match(/\d+-1/)
|
28
31
|
end
|
29
32
|
end
|
30
33
|
|
@@ -52,10 +55,7 @@ describe '#xadd("mystream", { f1: "v1", f2: "v2" }, id: "0-0", maxlen: 1000, app
|
|
52
55
|
expect { @redises.xadd('mock-redis-test:unknown-stream', { key: 'value' }, id: '0') }
|
53
56
|
.to raise_error(
|
54
57
|
Redis::CommandError,
|
55
|
-
'ERR The ID specified in XADD
|
56
|
-
'stream top item'
|
57
|
-
# TOOD: Redis version 6.0.4, w redis 4.2.1 generates the following error message:
|
58
|
-
# 'ERR The ID specified in XADD must be greater than 0-0'
|
58
|
+
'ERR The ID specified in XADD must be greater than 0-0'
|
59
59
|
)
|
60
60
|
end
|
61
61
|
|
@@ -67,7 +67,7 @@ describe '#xadd("mystream", { f1: "v1", f2: "v2" }, id: "0-0", maxlen: 1000, app
|
|
67
67
|
it 'caters for the current time being before the last time' do
|
68
68
|
t = (Time.now.to_f * 1000).to_i + 2000
|
69
69
|
@redises.xadd(@key, { key: 'value' }, id: "#{t}-0")
|
70
|
-
expect(@redises.xadd(@key, key: 'value')).to match(/#{t}-1/)
|
70
|
+
expect(@redises.xadd(@key, { key: 'value' })).to match(/#{t}-1/)
|
71
71
|
end
|
72
72
|
|
73
73
|
it 'appends a sequence number if it is missing' do
|
data/spec/commands/xlen_spec.rb
CHANGED
@@ -7,14 +7,16 @@ describe '#xlen(key)' do
|
|
7
7
|
end
|
8
8
|
|
9
9
|
before :each do
|
10
|
-
|
10
|
+
# TODO: Redis appears to be returning a timestamp a few seconds in the future
|
11
|
+
# so we're ignoring the last 5 digits (time in milliseconds)
|
12
|
+
@redises._gsub(/\d{5}-\d/, '...-.')
|
11
13
|
end
|
12
14
|
|
13
15
|
it 'returns the number of items in the stream' do
|
14
16
|
expect(@redises.xlen(@key)).to eq 0
|
15
|
-
@redises.xadd(@key, key: 'value')
|
17
|
+
@redises.xadd(@key, { key: 'value' })
|
16
18
|
expect(@redises.xlen(@key)).to eq 1
|
17
|
-
3.times { @redises.xadd(@key, key: 'value') }
|
19
|
+
3.times { @redises.xadd(@key, { key: 'value' }) }
|
18
20
|
expect(@redises.xlen(@key)).to eq 4
|
19
21
|
end
|
20
22
|
end
|
@@ -79,13 +79,23 @@ describe '#xrange("mystream", first: "0-1", last: "0-3", count: 10)' do
|
|
79
79
|
)
|
80
80
|
end
|
81
81
|
|
82
|
-
it 'returns entries with both a lower and an upper limit' do
|
83
|
-
expect(@redises.xrange(@key, '
|
82
|
+
it 'returns entries with both a lower and an upper limit inclusive' do
|
83
|
+
expect(@redises.xrange(@key, '1234567891245-0', '1234567891278-0')).to eq(
|
84
84
|
[
|
85
85
|
['1234567891245-0', { 'key2' => 'value2' }],
|
86
86
|
['1234567891245-1', { 'key3' => 'value3' }],
|
87
|
+
['1234567891278-0', { 'key4' => 'value4' }]
|
88
|
+
]
|
89
|
+
)
|
90
|
+
end
|
91
|
+
|
92
|
+
it 'returns entries with both a lower and an upper limit exclusive' do
|
93
|
+
expect(@redises.xrange(@key, '(1234567891245-0', '1234567891285-1')).to eq(
|
94
|
+
[
|
95
|
+
# We no longer get '1234567891245-0'
|
96
|
+
['1234567891245-1', { 'key3' => 'value3' }],
|
87
97
|
['1234567891278-0', { 'key4' => 'value4' }],
|
88
|
-
['1234567891278-1', { 'key5' => 'value5' }]
|
98
|
+
['1234567891278-1', { 'key5' => 'value5' }] # Note sequence -1
|
89
99
|
]
|
90
100
|
)
|
91
101
|
end
|
data/spec/spec_helper.rb
CHANGED
@@ -23,7 +23,7 @@ class RedisMultiplexer < BlankSlate
|
|
23
23
|
@gsub_from = @gsub_to = ''
|
24
24
|
end
|
25
25
|
|
26
|
-
def method_missing(method, *args, &blk)
|
26
|
+
ruby2_keywords def method_missing(method, *args, &blk)
|
27
27
|
# If we're in a Redis command that accepts a block, and we execute more
|
28
28
|
# redis commands, ONLY execute them on the Redis implementation that the
|
29
29
|
# block came from.
|
metadata
CHANGED
@@ -1,16 +1,30 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: mock_redis
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.28.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Shane da Silva
|
8
8
|
- Samuel Merritt
|
9
|
-
autorequire:
|
9
|
+
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2021-05-01 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: ruby2_keywords
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
requirements:
|
18
|
+
- - ">="
|
19
|
+
- !ruby/object:Gem::Version
|
20
|
+
version: '0'
|
21
|
+
type: :runtime
|
22
|
+
prerelease: false
|
23
|
+
version_requirements: !ruby/object:Gem::Requirement
|
24
|
+
requirements:
|
25
|
+
- - ">="
|
26
|
+
- !ruby/object:Gem::Version
|
27
|
+
version: '0'
|
14
28
|
- !ruby/object:Gem::Dependency
|
15
29
|
name: redis
|
16
30
|
requirement: !ruby/object:Gem::Requirement
|
@@ -90,6 +104,7 @@ files:
|
|
90
104
|
- Rakefile
|
91
105
|
- lib/mock_redis.rb
|
92
106
|
- lib/mock_redis/assertions.rb
|
107
|
+
- lib/mock_redis/connection_method.rb
|
93
108
|
- lib/mock_redis/database.rb
|
94
109
|
- lib/mock_redis/exceptions.rb
|
95
110
|
- lib/mock_redis/expire_wrapper.rb
|
@@ -126,6 +141,7 @@ files:
|
|
126
141
|
- spec/commands/brpop_spec.rb
|
127
142
|
- spec/commands/brpoplpush_spec.rb
|
128
143
|
- spec/commands/connected_spec.rb
|
144
|
+
- spec/commands/connection_spec.rb
|
129
145
|
- spec/commands/dbsize_spec.rb
|
130
146
|
- spec/commands/decr_spec.rb
|
131
147
|
- spec/commands/decrby_spec.rb
|
@@ -279,7 +295,7 @@ homepage: https://github.com/sds/mock_redis
|
|
279
295
|
licenses:
|
280
296
|
- MIT
|
281
297
|
metadata: {}
|
282
|
-
post_install_message:
|
298
|
+
post_install_message:
|
283
299
|
rdoc_options: []
|
284
300
|
require_paths:
|
285
301
|
- lib
|
@@ -294,8 +310,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
294
310
|
- !ruby/object:Gem::Version
|
295
311
|
version: '0'
|
296
312
|
requirements: []
|
297
|
-
rubygems_version: 3.1.
|
298
|
-
signing_key:
|
313
|
+
rubygems_version: 3.1.4
|
314
|
+
signing_key:
|
299
315
|
specification_version: 4
|
300
316
|
summary: Redis mock that just lives in memory; useful for testing.
|
301
317
|
test_files:
|
@@ -311,6 +327,7 @@ test_files:
|
|
311
327
|
- spec/commands/brpop_spec.rb
|
312
328
|
- spec/commands/brpoplpush_spec.rb
|
313
329
|
- spec/commands/connected_spec.rb
|
330
|
+
- spec/commands/connection_spec.rb
|
314
331
|
- spec/commands/dbsize_spec.rb
|
315
332
|
- spec/commands/decr_spec.rb
|
316
333
|
- spec/commands/decrby_spec.rb
|