redis 4.0.0 → 4.0.1

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 0f10522316b60319f14cbbf00cf0c82f13092997
4
- data.tar.gz: 1aab75c09b750f2f2f5038cc14366b3c79e0e01c
3
+ metadata.gz: 7e0d0ba2328aca583c0f487729779c2b10b12c7b
4
+ data.tar.gz: 4a411cfa3512bafe7c2c12ac8a02c02bc87065aa
5
5
  SHA512:
6
- metadata.gz: 78b8a72a6bc475aa55543abf515b3758af1a696a3f1adcaa9019898bf99acf0162383964880b1e6d07113205d0129ed84563de44a4680f9f15cc5893c44efae0
7
- data.tar.gz: ad7ed9b0a0afb0a6c85bf5cd9cada2081c64b3b25856e0343bef61a62e2f4c7f376f42c32013092ec4dde55ed4182c6b11d1f0ace54167f49a597181abdbcf29
6
+ metadata.gz: 3af7dc63dc7bdc243da306817583db9b6989c21a0714c6652b4a443bfd9c46b2afba0707b028d708a74148bbeedd09d4ec207a0459b3559cb19b95f2f030bb07
7
+ data.tar.gz: 98d5aed456ebcd3ccdc50980879a3c14be4c8a1874c6febae95579d2fb3828bda2e82b05e62dc6a4966e178993d4a2a20dc3dedd9f8583cd731851eab2f8e164
@@ -1,4 +1,16 @@
1
- # 4.0 (unreleased)
1
+ # 4.0.1
2
+
3
+ * `Redis::Distributed` now supports `mget` and `mapped_mget`. See #687.
4
+
5
+ * `Redis::Distributed` now supports `sscan` and `sscan_each`. See #572.
6
+
7
+ * `Redis#connection` returns a hash with connection information.
8
+ You shouldn't need to call `Redis#_client`, ever.
9
+
10
+ * `Redis#flushdb` and `Redis#flushall` now support the `:async` option. See #706.
11
+
12
+
13
+ # 4.0
2
14
 
3
15
  * Removed `Redis.connect`. Use `Redis.new`.
4
16
 
data/README.md CHANGED
@@ -363,4 +363,4 @@ requests. You can also ask for help at `#redis-rb` on Freenode.
363
363
  [travis-home]: https://travis-ci.org/
364
364
  [travis-image]: https://secure.travis-ci.org/redis/redis-rb.svg?branch=master
365
365
  [travis-link]: https://travis-ci.org/redis/redis-rb
366
- [rubydoc]: https://www.rubydoc.info/gems/redis
366
+ [rubydoc]: http://www.rubydoc.info/gems/redis
@@ -237,19 +237,31 @@ class Redis
237
237
 
238
238
  # Remove all keys from all databases.
239
239
  #
240
+ # @param [Hash] options
241
+ # - `:async => Boolean`: async flush (default: false)
240
242
  # @return [String] `OK`
241
- def flushall
243
+ def flushall(options = nil)
242
244
  synchronize do |client|
243
- client.call([:flushall])
245
+ if options && options[:async]
246
+ client.call([:flushall, :async])
247
+ else
248
+ client.call([:flushall])
249
+ end
244
250
  end
245
251
  end
246
252
 
247
253
  # Remove all keys from the current database.
248
254
  #
255
+ # @param [Hash] options
256
+ # - `:async => Boolean`: async flush (default: false)
249
257
  # @return [String] `OK`
250
- def flushdb
258
+ def flushdb(options = nil)
251
259
  synchronize do |client|
252
- client.call([:flushdb])
260
+ if options && options[:async]
261
+ client.call([:flushdb, :async])
262
+ else
263
+ client.call([:flushdb])
264
+ end
253
265
  end
254
266
  end
255
267
 
@@ -2737,6 +2749,16 @@ class Redis
2737
2749
  self.class.new(@options)
2738
2750
  end
2739
2751
 
2752
+ def connection
2753
+ {
2754
+ host: @original_client.host,
2755
+ port: @original_client.port,
2756
+ db: @original_client.db,
2757
+ id: @original_client.id,
2758
+ location: @original_client.location
2759
+ }
2760
+ end
2761
+
2740
2762
  def method_missing(command, *args)
2741
2763
  synchronize do |client|
2742
2764
  client.call([command] + args)
@@ -277,13 +277,16 @@ class Redis
277
277
  node_for(key).get(key)
278
278
  end
279
279
 
280
- # Get the values of all the given keys.
280
+ # Get the values of all the given keys as an Array.
281
281
  def mget(*keys)
282
- raise CannotDistribute, :mget
282
+ mapped_mget(*keys).values_at(*keys)
283
283
  end
284
284
 
285
+ # Get the values of all the given keys as a Hash.
285
286
  def mapped_mget(*keys)
286
- raise CannotDistribute, :mapped_mget
287
+ keys.group_by { |k| node_for k }.inject({}) do |results, (node, subkeys)|
288
+ results.merge! node.mapped_mget(*subkeys)
289
+ end
287
290
  end
288
291
 
289
292
  # Overwrite part of a string at key starting at the specified offset.
@@ -509,6 +512,16 @@ class Redis
509
512
  node_for(key).smembers(key)
510
513
  end
511
514
 
515
+ # Scan a set
516
+ def sscan(key, cursor, options={})
517
+ node_for(key).sscan(key, cursor, options)
518
+ end
519
+
520
+ # Scan a set and return an enumerator
521
+ def sscan_each(key, options={}, &block)
522
+ node_for(key).sscan_each(key, options, &block)
523
+ end
524
+
512
525
  # Subtract multiple sets.
513
526
  def sdiff(*keys)
514
527
  ensure_same_node(:sdiff, keys) do |node|
@@ -1,3 +1,3 @@
1
1
  class Redis
2
- VERSION = "4.0.0"
2
+ VERSION = "4.0.1"
3
3
  end
@@ -79,6 +79,7 @@ class TestCommandsOnValueTypes < Test::Unit::TestCase
79
79
  end
80
80
 
81
81
  def test_flushdb
82
+ # Test defaults
82
83
  r.set("foo", "s1")
83
84
  r.set("bar", "s2")
84
85
 
@@ -87,12 +88,51 @@ class TestCommandsOnValueTypes < Test::Unit::TestCase
87
88
  r.flushdb
88
89
 
89
90
  assert_equal 0, r.dbsize
91
+
92
+ # Test sync
93
+ r.set("foo", "s1")
94
+ r.set("bar", "s2")
95
+
96
+ assert_equal 2, r.dbsize
97
+
98
+ r.flushdb(:async => false)
99
+
100
+ assert_equal 0, r.dbsize
101
+
102
+ # Test async
103
+ target_version "3.9.101" do
104
+ r.set("foo", "s1")
105
+ r.set("bar", "s2")
106
+
107
+ assert_equal 2, r.dbsize
108
+
109
+ r.flushdb(:async => true)
110
+
111
+ assert_equal 0, r.dbsize
112
+
113
+ redis_mock(:flushdb => lambda { |args| "+FLUSHDB #{args.upcase}" }) do |redis|
114
+ assert_equal "FLUSHDB ASYNC", redis.flushdb(:async => true)
115
+ end
116
+ end
90
117
  end
91
118
 
92
119
  def test_flushall
120
+ # Test defaults
93
121
  redis_mock(:flushall => lambda { "+FLUSHALL" }) do |redis|
94
122
  assert_equal "FLUSHALL", redis.flushall
95
123
  end
124
+
125
+ # Test sync
126
+ redis_mock(:flushall => lambda { "+FLUSHALL" }) do |redis|
127
+ assert_equal "FLUSHALL", redis.flushall(:async => false)
128
+ end
129
+
130
+ # Test async
131
+ target_version "3.9.101" do
132
+ redis_mock(:flushall => lambda { |args| "+FLUSHALL #{args.upcase}" }) do |redis|
133
+ assert_equal "FLUSHALL ASYNC", redis.flushall(:async => true)
134
+ end
135
+ end
96
136
  end
97
137
 
98
138
  def test_migrate
@@ -0,0 +1,57 @@
1
+ require_relative "helper"
2
+
3
+ class TestConnection < Test::Unit::TestCase
4
+
5
+ include Helper::Client
6
+
7
+ def test_provides_a_meaningful_inspect
8
+ assert_equal "#<Redis client v#{Redis::VERSION} for redis://127.0.0.1:#{PORT}/15>", r.inspect
9
+ end
10
+
11
+ def test_connection_information
12
+ assert_equal "127.0.0.1", r.connection.fetch(:host)
13
+ assert_equal 6381, r.connection.fetch(:port)
14
+ assert_equal 15, r.connection.fetch(:db)
15
+ assert_equal "127.0.0.1:6381", r.connection.fetch(:location)
16
+ assert_equal "redis://127.0.0.1:6381/15", r.connection.fetch(:id)
17
+ end
18
+
19
+ def test_default_id_with_host_and_port
20
+ redis = Redis.new(OPTIONS.merge(:host => "host", :port => "1234", :db => 0))
21
+ assert_equal "redis://host:1234/0", redis.connection.fetch(:id)
22
+ end
23
+
24
+ def test_default_id_with_host_and_port_and_explicit_scheme
25
+ redis = Redis.new(OPTIONS.merge(:host => "host", :port => "1234", :db => 0, :scheme => "foo"))
26
+ assert_equal "redis://host:1234/0", redis.connection.fetch(:id)
27
+ end
28
+
29
+ def test_default_id_with_path
30
+ redis = Redis.new(OPTIONS.merge(:path => "/tmp/redis.sock", :db => 0))
31
+ assert_equal "redis:///tmp/redis.sock/0", redis.connection.fetch(:id)
32
+ end
33
+
34
+ def test_default_id_with_path_and_explicit_scheme
35
+ redis = Redis.new(OPTIONS.merge(:path => "/tmp/redis.sock", :db => 0, :scheme => "foo"))
36
+ assert_equal "redis:///tmp/redis.sock/0", redis.connection.fetch(:id)
37
+ end
38
+
39
+ def test_override_id
40
+ redis = Redis.new(OPTIONS.merge(:id => "test"))
41
+ assert_equal "test", redis.connection.fetch(:id)
42
+ end
43
+
44
+ def test_id_inside_multi
45
+ redis = Redis.new(OPTIONS)
46
+ id = nil
47
+ connection_id = nil
48
+
49
+ redis.multi do
50
+ id = redis.id
51
+ connection_id = redis.connection.fetch(:id)
52
+ end
53
+
54
+ assert_equal "redis://127.0.0.1:6381/15", id
55
+ assert_equal "redis://127.0.0.1:6381/15", connection_id
56
+ end
57
+ end
@@ -78,4 +78,29 @@ class TestDistributedCommandsOnSets < Test::Unit::TestCase
78
78
  r.sdiffstore("baz", "foo", "bar")
79
79
  end
80
80
  end
81
+
82
+ def test_sscan
83
+ assert_nothing_raised do
84
+ r.sadd "foo", "s1"
85
+ r.sadd "foo", "s2"
86
+ r.sadd "bar", "s2"
87
+ r.sadd "bar", "s3"
88
+
89
+ cursor, vals = r.sscan "foo", 0
90
+ assert_equal '0', cursor
91
+ assert_equal %w(s1 s2), vals.sort
92
+ end
93
+ end
94
+
95
+ def test_sscan_each
96
+ assert_nothing_raised do
97
+ r.sadd "foo", "s1"
98
+ r.sadd "foo", "s2"
99
+ r.sadd "bar", "s2"
100
+ r.sadd "bar", "s3"
101
+
102
+ vals = r.sscan_each("foo").to_a
103
+ assert_equal %w(s1 s2), vals.sort
104
+ end
105
+ end
81
106
  end
@@ -7,15 +7,27 @@ class TestDistributedCommandsOnStrings < Test::Unit::TestCase
7
7
  include Lint::Strings
8
8
 
9
9
  def test_mget
10
- assert_raise Redis::Distributed::CannotDistribute do
11
- r.mget("foo", "bar")
12
- end
10
+ r.set("foo", "s1")
11
+ r.set("bar", "s2")
12
+
13
+ assert_equal ["s1", "s2"] , r.mget("foo", "bar")
14
+ assert_equal ["s1", "s2", nil], r.mget("foo", "bar", "baz")
13
15
  end
14
16
 
15
17
  def test_mget_mapped
16
- assert_raise Redis::Distributed::CannotDistribute do
17
- r.mapped_mget("foo", "bar")
18
- end
18
+ r.set("foo", "s1")
19
+ r.set("bar", "s2")
20
+
21
+ response = r.mapped_mget("foo", "bar")
22
+
23
+ assert_equal "s1", response["foo"]
24
+ assert_equal "s2", response["bar"]
25
+
26
+ response = r.mapped_mget("foo", "bar", "baz")
27
+
28
+ assert_equal "s1", response["foo"]
29
+ assert_equal "s2", response["bar"]
30
+ assert_equal nil , response["baz"]
19
31
  end
20
32
 
21
33
  def test_mset
@@ -41,10 +41,6 @@ class TestInternals < Test::Unit::TestCase
41
41
  end
42
42
  end
43
43
 
44
- def test_provides_a_meaningful_inspect
45
- assert_equal "#<Redis client v#{Redis::VERSION} for redis://127.0.0.1:#{PORT}/15>", r.inspect
46
- end
47
-
48
44
  def test_redis_current
49
45
  assert_equal "127.0.0.1", Redis.current._client.host
50
46
  assert_equal 6379, Redis.current._client.port
@@ -76,48 +72,12 @@ class TestInternals < Test::Unit::TestCase
76
72
  assert !fresh_client.connected?
77
73
  end
78
74
 
79
- def test_default_id_with_host_and_port
80
- redis = Redis.new(OPTIONS.merge(:host => "host", :port => "1234", :db => 0))
81
- assert_equal "redis://host:1234/0", redis._client.id
82
- end
83
-
84
- def test_default_id_with_host_and_port_and_explicit_scheme
85
- redis = Redis.new(OPTIONS.merge(:host => "host", :port => "1234", :db => 0, :scheme => "foo"))
86
- assert_equal "redis://host:1234/0", redis._client.id
87
- end
88
-
89
- def test_default_id_with_path
90
- redis = Redis.new(OPTIONS.merge(:path => "/tmp/redis.sock", :db => 0))
91
- assert_equal "redis:///tmp/redis.sock/0", redis._client.id
92
- end
93
-
94
- def test_default_id_with_path_and_explicit_scheme
95
- redis = Redis.new(OPTIONS.merge(:path => "/tmp/redis.sock", :db => 0, :scheme => "foo"))
96
- assert_equal "redis:///tmp/redis.sock/0", redis._client.id
97
- end
98
-
99
- def test_override_id
100
- redis = Redis.new(OPTIONS.merge(:id => "test"))
101
- assert_equal redis._client.id, "test"
102
- end
103
-
104
75
  def test_timeout
105
76
  assert_nothing_raised do
106
77
  Redis.new(OPTIONS.merge(:timeout => 0))
107
78
  end
108
79
  end
109
80
 
110
- def test_id_inside_multi
111
- redis = Redis.new(OPTIONS)
112
- id = nil
113
-
114
- redis.multi do
115
- id = redis.id
116
- end
117
-
118
- assert_equal id, "redis://127.0.0.1:6381/15"
119
- end
120
-
121
81
  driver(:ruby) do
122
82
  def test_tcp_keepalive
123
83
  keepalive = {:time => 20, :intvl => 10, :probes => 5}
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: redis
3
3
  version: !ruby/object:Gem::Version
4
- version: 4.0.0
4
+ version: 4.0.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ezra Zygmuntowicz
@@ -16,7 +16,7 @@ authors:
16
16
  autorequire:
17
17
  bindir: bin
18
18
  cert_chain: []
19
- date: 2017-08-25 00:00:00.000000000 Z
19
+ date: 2017-09-28 00:00:00.000000000 Z
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency
22
22
  name: test-unit
@@ -123,6 +123,7 @@ files:
123
123
  - test/commands_on_strings_test.rb
124
124
  - test/commands_on_value_types_test.rb
125
125
  - test/connection_handling_test.rb
126
+ - test/connection_test.rb
126
127
  - test/db/.gitkeep
127
128
  - test/distributed_blocking_commands_test.rb
128
129
  - test/distributed_commands_on_hashes_test.rb
@@ -225,6 +226,7 @@ test_files:
225
226
  - test/commands_on_strings_test.rb
226
227
  - test/commands_on_value_types_test.rb
227
228
  - test/connection_handling_test.rb
229
+ - test/connection_test.rb
228
230
  - test/db/.gitkeep
229
231
  - test/distributed_blocking_commands_test.rb
230
232
  - test/distributed_commands_on_hashes_test.rb