redis 4.0.0 → 4.0.1

Sign up to get free protection for your applications and to get access to all the features.
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