mock_redis 0.27.3 → 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/CHANGELOG.md +7 -0
- data/lib/mock_redis/hash_methods.rb +5 -1
- data/lib/mock_redis/stream.rb +9 -3
- data/lib/mock_redis/stream/id.rb +8 -3
- data/lib/mock_redis/string_methods.rb +4 -2
- data/lib/mock_redis/version.rb +1 -1
- data/spec/commands/hset_spec.rb +4 -0
- data/spec/commands/mget_spec.rb +6 -0
- data/spec/commands/xadd_spec.rb +6 -6
- data/spec/commands/xlen_spec.rb +2 -2
- data/spec/commands/xrange_spec.rb +13 -3
- metadata +5 -5
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/CHANGELOG.md
CHANGED
@@ -1,5 +1,12 @@
|
|
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
|
+
|
3
10
|
### 0.27.3
|
4
11
|
|
5
12
|
* Ensure `ruby2_keywords` dependency is `require`d at runtime
|
@@ -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
|
data/lib/mock_redis/stream.rb
CHANGED
@@ -49,9 +49,15 @@ class MockRedis
|
|
49
49
|
opts = options opts_in, ['count']
|
50
50
|
start_id = MockRedis::Stream::Id.new(start)
|
51
51
|
finish_id = MockRedis::Stream::Id.new(finish, sequence: Float::INFINITY)
|
52
|
-
|
53
|
-
|
54
|
-
|
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
|
55
61
|
items.reverse! if reversed
|
56
62
|
return items.first(opts['count'].to_i) if opts.key?('count')
|
57
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'
|
@@ -154,14 +154,16 @@ class MockRedis
|
|
154
154
|
new_value
|
155
155
|
end
|
156
156
|
|
157
|
-
def mget(*keys)
|
157
|
+
def mget(*keys, &blk)
|
158
158
|
keys.flatten!
|
159
159
|
|
160
160
|
assert_has_args(keys, 'mget')
|
161
161
|
|
162
|
-
keys.map do |key|
|
162
|
+
data = keys.map do |key|
|
163
163
|
get(key) if stringy?(key)
|
164
164
|
end
|
165
|
+
|
166
|
+
blk ? blk.call(data) : data
|
165
167
|
end
|
166
168
|
|
167
169
|
def mapped_mget(*keys)
|
data/lib/mock_redis/version.rb
CHANGED
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/xadd_spec.rb
CHANGED
@@ -14,20 +14,20 @@ describe '#xadd("mystream", { f1: "v1", f2: "v2" }, id: "0-0", maxlen: 1000, app
|
|
14
14
|
|
15
15
|
it 'returns an id based on the timestamp' do
|
16
16
|
t = Time.now.to_i
|
17
|
-
id = @redises.xadd(@key, key: 'value')
|
18
|
-
expect(@redises.xadd(@key, key: 'value')).to match(/#{t}\d{3}-0/)
|
17
|
+
id = @redises.xadd(@key, { key: 'value' })
|
18
|
+
expect(@redises.xadd(@key, { key: 'value' })).to match(/#{t}\d{3}-0/)
|
19
19
|
end
|
20
20
|
|
21
21
|
it 'adds data with symbols' do
|
22
|
-
@redises.xadd(@key, symbol_key: :symbol_value)
|
22
|
+
@redises.xadd(@key, { symbol_key: :symbol_value })
|
23
23
|
expect(@redises.xrange(@key, '-', '+').last[1])
|
24
24
|
.to eq('symbol_key' => 'symbol_value')
|
25
25
|
end
|
26
26
|
|
27
27
|
it 'increments the sequence number with the same timestamp' do
|
28
28
|
Timecop.freeze do
|
29
|
-
@redises.xadd(@key, key: 'value')
|
30
|
-
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/)
|
31
31
|
end
|
32
32
|
end
|
33
33
|
|
@@ -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
@@ -14,9 +14,9 @@ describe '#xlen(key)' do
|
|
14
14
|
|
15
15
|
it 'returns the number of items in the stream' do
|
16
16
|
expect(@redises.xlen(@key)).to eq 0
|
17
|
-
@redises.xadd(@key, key: 'value')
|
17
|
+
@redises.xadd(@key, { key: 'value' })
|
18
18
|
expect(@redises.xlen(@key)).to eq 1
|
19
|
-
3.times { @redises.xadd(@key, key: 'value') }
|
19
|
+
3.times { @redises.xadd(@key, { key: 'value' }) }
|
20
20
|
expect(@redises.xlen(@key)).to eq 4
|
21
21
|
end
|
22
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
|
metadata
CHANGED
@@ -1,15 +1,15 @@
|
|
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: 2021-01
|
12
|
+
date: 2021-05-01 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: ruby2_keywords
|
@@ -295,7 +295,7 @@ homepage: https://github.com/sds/mock_redis
|
|
295
295
|
licenses:
|
296
296
|
- MIT
|
297
297
|
metadata: {}
|
298
|
-
post_install_message:
|
298
|
+
post_install_message:
|
299
299
|
rdoc_options: []
|
300
300
|
require_paths:
|
301
301
|
- lib
|
@@ -311,7 +311,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
311
311
|
version: '0'
|
312
312
|
requirements: []
|
313
313
|
rubygems_version: 3.1.4
|
314
|
-
signing_key:
|
314
|
+
signing_key:
|
315
315
|
specification_version: 4
|
316
316
|
summary: Redis mock that just lives in memory; useful for testing.
|
317
317
|
test_files:
|