redis 4.0.1 → 4.0.3

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.
Files changed (83) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +3 -0
  3. data/.travis.yml +17 -29
  4. data/.travis/Gemfile +5 -0
  5. data/CHANGELOG.md +29 -0
  6. data/Gemfile +5 -0
  7. data/README.md +1 -1
  8. data/bin/build +71 -0
  9. data/lib/redis.rb +198 -12
  10. data/lib/redis/client.rb +26 -12
  11. data/lib/redis/cluster.rb +285 -0
  12. data/lib/redis/cluster/command.rb +81 -0
  13. data/lib/redis/cluster/command_loader.rb +32 -0
  14. data/lib/redis/cluster/key_slot_converter.rb +72 -0
  15. data/lib/redis/cluster/node.rb +104 -0
  16. data/lib/redis/cluster/node_key.rb +35 -0
  17. data/lib/redis/cluster/node_loader.rb +35 -0
  18. data/lib/redis/cluster/option.rb +76 -0
  19. data/lib/redis/cluster/slot.rb +69 -0
  20. data/lib/redis/cluster/slot_loader.rb +47 -0
  21. data/lib/redis/connection/ruby.rb +5 -2
  22. data/lib/redis/distributed.rb +10 -2
  23. data/lib/redis/errors.rb +46 -0
  24. data/lib/redis/pipeline.rb +9 -1
  25. data/lib/redis/version.rb +1 -1
  26. data/makefile +54 -22
  27. data/redis.gemspec +2 -1
  28. data/test/client_test.rb +17 -0
  29. data/test/cluster_abnormal_state_test.rb +38 -0
  30. data/test/cluster_blocking_commands_test.rb +15 -0
  31. data/test/cluster_client_internals_test.rb +77 -0
  32. data/test/cluster_client_key_hash_tags_test.rb +88 -0
  33. data/test/cluster_client_options_test.rb +147 -0
  34. data/test/cluster_client_pipelining_test.rb +59 -0
  35. data/test/cluster_client_replicas_test.rb +36 -0
  36. data/test/cluster_client_slots_test.rb +94 -0
  37. data/test/cluster_client_transactions_test.rb +71 -0
  38. data/test/cluster_commands_on_cluster_test.rb +165 -0
  39. data/test/cluster_commands_on_connection_test.rb +40 -0
  40. data/test/cluster_commands_on_geo_test.rb +74 -0
  41. data/test/cluster_commands_on_hashes_test.rb +11 -0
  42. data/test/cluster_commands_on_hyper_log_log_test.rb +17 -0
  43. data/test/cluster_commands_on_keys_test.rb +134 -0
  44. data/test/cluster_commands_on_lists_test.rb +15 -0
  45. data/test/cluster_commands_on_pub_sub_test.rb +101 -0
  46. data/test/cluster_commands_on_scripting_test.rb +56 -0
  47. data/test/cluster_commands_on_server_test.rb +221 -0
  48. data/test/cluster_commands_on_sets_test.rb +39 -0
  49. data/test/cluster_commands_on_sorted_sets_test.rb +35 -0
  50. data/test/cluster_commands_on_streams_test.rb +196 -0
  51. data/test/cluster_commands_on_strings_test.rb +15 -0
  52. data/test/cluster_commands_on_transactions_test.rb +41 -0
  53. data/test/cluster_commands_on_value_types_test.rb +14 -0
  54. data/test/commands_on_geo_test.rb +116 -0
  55. data/test/commands_on_hashes_test.rb +2 -14
  56. data/test/commands_on_hyper_log_log_test.rb +2 -14
  57. data/test/commands_on_lists_test.rb +2 -13
  58. data/test/commands_on_sets_test.rb +2 -70
  59. data/test/commands_on_sorted_sets_test.rb +2 -145
  60. data/test/commands_on_strings_test.rb +2 -94
  61. data/test/commands_on_value_types_test.rb +36 -0
  62. data/test/distributed_blocking_commands_test.rb +8 -0
  63. data/test/distributed_commands_on_hashes_test.rb +16 -3
  64. data/test/distributed_commands_on_hyper_log_log_test.rb +8 -13
  65. data/test/distributed_commands_on_lists_test.rb +4 -5
  66. data/test/distributed_commands_on_sets_test.rb +45 -46
  67. data/test/distributed_commands_on_sorted_sets_test.rb +51 -8
  68. data/test/distributed_commands_on_strings_test.rb +10 -0
  69. data/test/distributed_commands_on_value_types_test.rb +36 -0
  70. data/test/helper.rb +176 -32
  71. data/test/internals_test.rb +20 -1
  72. data/test/lint/blocking_commands.rb +40 -16
  73. data/test/lint/hashes.rb +41 -0
  74. data/test/lint/hyper_log_log.rb +15 -1
  75. data/test/lint/lists.rb +16 -0
  76. data/test/lint/sets.rb +142 -0
  77. data/test/lint/sorted_sets.rb +183 -2
  78. data/test/lint/strings.rb +102 -0
  79. data/test/pipelining_commands_test.rb +8 -0
  80. data/test/support/cluster/orchestrator.rb +199 -0
  81. data/test/support/redis_mock.rb +1 -1
  82. data/test/transactions_test.rb +10 -0
  83. metadata +81 -2
@@ -1,99 +1,7 @@
1
- require_relative "helper"
2
- require_relative "lint/strings"
1
+ require_relative 'helper'
2
+ require_relative 'lint/strings'
3
3
 
4
4
  class TestCommandsOnStrings < Test::Unit::TestCase
5
-
6
5
  include Helper::Client
7
6
  include Lint::Strings
8
-
9
- def test_mget
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")
15
- end
16
-
17
- def test_mget_mapped
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"]
31
- end
32
-
33
- def test_mapped_mget_in_a_pipeline_returns_hash
34
- r.set("foo", "s1")
35
- r.set("bar", "s2")
36
-
37
- result = r.pipelined do
38
- r.mapped_mget("foo", "bar")
39
- end
40
-
41
- assert_equal result[0], { "foo" => "s1", "bar" => "s2" }
42
- end
43
-
44
- def test_mset
45
- r.mset(:foo, "s1", :bar, "s2")
46
-
47
- assert_equal "s1", r.get("foo")
48
- assert_equal "s2", r.get("bar")
49
- end
50
-
51
- def test_mset_mapped
52
- r.mapped_mset(:foo => "s1", :bar => "s2")
53
-
54
- assert_equal "s1", r.get("foo")
55
- assert_equal "s2", r.get("bar")
56
- end
57
-
58
- def test_msetnx
59
- r.set("foo", "s1")
60
- assert_equal false, r.msetnx(:foo, "s2", :bar, "s3")
61
- assert_equal "s1", r.get("foo")
62
- assert_equal nil, r.get("bar")
63
-
64
- r.del("foo")
65
- assert_equal true, r.msetnx(:foo, "s2", :bar, "s3")
66
- assert_equal "s2", r.get("foo")
67
- assert_equal "s3", r.get("bar")
68
- end
69
-
70
- def test_msetnx_mapped
71
- r.set("foo", "s1")
72
- assert_equal false, r.mapped_msetnx(:foo => "s2", :bar => "s3")
73
- assert_equal "s1", r.get("foo")
74
- assert_equal nil, r.get("bar")
75
-
76
- r.del("foo")
77
- assert_equal true, r.mapped_msetnx(:foo => "s2", :bar => "s3")
78
- assert_equal "s2", r.get("foo")
79
- assert_equal "s3", r.get("bar")
80
- end
81
-
82
- def test_bitop
83
- with_external_encoding("UTF-8") do
84
- target_version "2.5.10" do
85
- r.set("foo", "a")
86
- r.set("bar", "b")
87
-
88
- r.bitop(:and, "foo&bar", "foo", "bar")
89
- assert_equal "\x60", r.get("foo&bar")
90
- r.bitop(:or, "foo|bar", "foo", "bar")
91
- assert_equal "\x63", r.get("foo|bar")
92
- r.bitop(:xor, "foo^bar", "foo", "bar")
93
- assert_equal "\x03", r.get("foo^bar")
94
- r.bitop(:not, "~foo", "foo")
95
- assert_equal "\x9E", r.get("~foo")
96
- end
97
- end
98
- end
99
7
  end
@@ -38,6 +38,42 @@ class TestCommandsOnValueTypes < Test::Unit::TestCase
38
38
  assert_equal [], r.keys("*").sort
39
39
  end
40
40
 
41
+ def test_unlink
42
+ target_version "4.0.0" do
43
+ r.set "foo", "s1"
44
+ r.set "bar", "s2"
45
+ r.set "baz", "s3"
46
+
47
+ assert_equal ["bar", "baz", "foo"], r.keys("*").sort
48
+
49
+ assert_equal 1, r.unlink("foo")
50
+
51
+ assert_equal ["bar", "baz"], r.keys("*").sort
52
+
53
+ assert_equal 2, r.unlink("bar", "baz")
54
+
55
+ assert_equal [], r.keys("*").sort
56
+ end
57
+ end
58
+
59
+ def test_unlink_with_array_argument
60
+ target_version "4.0.0" do
61
+ r.set "foo", "s1"
62
+ r.set "bar", "s2"
63
+ r.set "baz", "s3"
64
+
65
+ assert_equal ["bar", "baz", "foo"], r.keys("*").sort
66
+
67
+ assert_equal 1, r.unlink(["foo"])
68
+
69
+ assert_equal ["bar", "baz"], r.keys("*").sort
70
+
71
+ assert_equal 2, r.unlink(["bar", "baz"])
72
+
73
+ assert_equal [], r.keys("*").sort
74
+ end
75
+ end
76
+
41
77
  def test_randomkey
42
78
  assert r.randomkey.to_s.empty?
43
79
 
@@ -41,4 +41,12 @@ class TestDistributedBlockingCommands < Test::Unit::TestCase
41
41
  r.brpoplpush("foo", "bar", 0)
42
42
  end
43
43
  end
44
+
45
+ def test_bzpopmin
46
+ # Not implemented yet
47
+ end
48
+
49
+ def test_bzpopmax
50
+ # Not implemented yet
51
+ end
44
52
  end
@@ -1,8 +1,21 @@
1
- require_relative "helper"
2
- require_relative "lint/hashes"
1
+ require_relative 'helper'
2
+ require_relative 'lint/hashes'
3
3
 
4
4
  class TestDistributedCommandsOnHashes < Test::Unit::TestCase
5
-
6
5
  include Helper::Distributed
7
6
  include Lint::Hashes
7
+
8
+ def test_hscan
9
+ # Not implemented yet
10
+ end
11
+
12
+ def test_hstrlen
13
+ # Not implemented yet
14
+ end
15
+
16
+ def test_mapped_hmget_in_a_pipeline_returns_hash
17
+ assert_raise(Redis::Distributed::CannotDistribute) do
18
+ super
19
+ end
20
+ end
8
21
  end
@@ -1,31 +1,26 @@
1
- require_relative "helper"
2
- require_relative "lint/hyper_log_log"
1
+ require_relative 'helper'
2
+ require_relative 'lint/hyper_log_log'
3
3
 
4
4
  class TestDistributedCommandsOnHyperLogLog < Test::Unit::TestCase
5
-
6
5
  include Helper::Distributed
7
6
  include Lint::HyperLogLog
8
7
 
9
8
  def test_pfmerge
10
- target_version "2.8.9" do
9
+ target_version '2.8.9' do
11
10
  assert_raise Redis::Distributed::CannotDistribute do
12
- r.pfadd "foo", "s1"
13
- r.pfadd "bar", "s2"
14
-
15
- assert r.pfmerge("res", "foo", "bar")
11
+ super
16
12
  end
17
13
  end
18
14
  end
19
15
 
20
16
  def test_pfcount_multiple_keys_diff_nodes
21
- target_version "2.8.9" do
17
+ target_version '2.8.9' do
22
18
  assert_raise Redis::Distributed::CannotDistribute do
23
- r.pfadd "foo", "s1"
24
- r.pfadd "bar", "s2"
19
+ r.pfadd 'foo', 's1'
20
+ r.pfadd 'bar', 's2'
25
21
 
26
- assert r.pfcount("res", "foo", "bar")
22
+ assert r.pfcount('res', 'foo', 'bar')
27
23
  end
28
24
  end
29
25
  end
30
-
31
26
  end
@@ -1,20 +1,19 @@
1
- require_relative "helper"
2
- require_relative "lint/lists"
1
+ require_relative 'helper'
2
+ require_relative 'lint/lists'
3
3
 
4
4
  class TestDistributedCommandsOnLists < Test::Unit::TestCase
5
-
6
5
  include Helper::Distributed
7
6
  include Lint::Lists
8
7
 
9
8
  def test_rpoplpush
10
9
  assert_raise Redis::Distributed::CannotDistribute do
11
- r.rpoplpush("foo", "bar")
10
+ r.rpoplpush('foo', 'bar')
12
11
  end
13
12
  end
14
13
 
15
14
  def test_brpoplpush
16
15
  assert_raise Redis::Distributed::CannotDistribute do
17
- r.brpoplpush("foo", "bar", :timeout => 1)
16
+ r.brpoplpush('foo', 'bar', timeout: 1)
18
17
  end
19
18
  end
20
19
  end
@@ -1,106 +1,105 @@
1
- require_relative "helper"
2
- require_relative "lint/sets"
1
+ require_relative 'helper'
2
+ require_relative 'lint/sets'
3
3
 
4
4
  class TestDistributedCommandsOnSets < Test::Unit::TestCase
5
-
6
5
  include Helper::Distributed
7
6
  include Lint::Sets
8
7
 
9
8
  def test_smove
10
9
  assert_raise Redis::Distributed::CannotDistribute do
11
- r.sadd "foo", "s1"
12
- r.sadd "bar", "s2"
10
+ r.sadd 'foo', 's1'
11
+ r.sadd 'bar', 's2'
13
12
 
14
- r.smove("foo", "bar", "s1")
13
+ r.smove('foo', 'bar', 's1')
15
14
  end
16
15
  end
17
16
 
18
17
  def test_sinter
19
18
  assert_raise Redis::Distributed::CannotDistribute do
20
- r.sadd "foo", "s1"
21
- r.sadd "foo", "s2"
22
- r.sadd "bar", "s2"
19
+ r.sadd 'foo', 's1'
20
+ r.sadd 'foo', 's2'
21
+ r.sadd 'bar', 's2'
23
22
 
24
- r.sinter("foo", "bar")
23
+ r.sinter('foo', 'bar')
25
24
  end
26
25
  end
27
26
 
28
27
  def test_sinterstore
29
28
  assert_raise Redis::Distributed::CannotDistribute do
30
- r.sadd "foo", "s1"
31
- r.sadd "foo", "s2"
32
- r.sadd "bar", "s2"
29
+ r.sadd 'foo', 's1'
30
+ r.sadd 'foo', 's2'
31
+ r.sadd 'bar', 's2'
33
32
 
34
- r.sinterstore("baz", "foo", "bar")
33
+ r.sinterstore('baz', 'foo', 'bar')
35
34
  end
36
35
  end
37
36
 
38
37
  def test_sunion
39
38
  assert_raise Redis::Distributed::CannotDistribute do
40
- r.sadd "foo", "s1"
41
- r.sadd "foo", "s2"
42
- r.sadd "bar", "s2"
43
- r.sadd "bar", "s3"
39
+ r.sadd 'foo', 's1'
40
+ r.sadd 'foo', 's2'
41
+ r.sadd 'bar', 's2'
42
+ r.sadd 'bar', 's3'
44
43
 
45
- r.sunion("foo", "bar")
44
+ r.sunion('foo', 'bar')
46
45
  end
47
46
  end
48
47
 
49
48
  def test_sunionstore
50
49
  assert_raise Redis::Distributed::CannotDistribute do
51
- r.sadd "foo", "s1"
52
- r.sadd "foo", "s2"
53
- r.sadd "bar", "s2"
54
- r.sadd "bar", "s3"
50
+ r.sadd 'foo', 's1'
51
+ r.sadd 'foo', 's2'
52
+ r.sadd 'bar', 's2'
53
+ r.sadd 'bar', 's3'
55
54
 
56
- r.sunionstore("baz", "foo", "bar")
55
+ r.sunionstore('baz', 'foo', 'bar')
57
56
  end
58
57
  end
59
58
 
60
59
  def test_sdiff
61
60
  assert_raise Redis::Distributed::CannotDistribute do
62
- r.sadd "foo", "s1"
63
- r.sadd "foo", "s2"
64
- r.sadd "bar", "s2"
65
- r.sadd "bar", "s3"
61
+ r.sadd 'foo', 's1'
62
+ r.sadd 'foo', 's2'
63
+ r.sadd 'bar', 's2'
64
+ r.sadd 'bar', 's3'
66
65
 
67
- r.sdiff("foo", "bar")
66
+ r.sdiff('foo', 'bar')
68
67
  end
69
68
  end
70
69
 
71
70
  def test_sdiffstore
72
71
  assert_raise Redis::Distributed::CannotDistribute do
73
- r.sadd "foo", "s1"
74
- r.sadd "foo", "s2"
75
- r.sadd "bar", "s2"
76
- r.sadd "bar", "s3"
72
+ r.sadd 'foo', 's1'
73
+ r.sadd 'foo', 's2'
74
+ r.sadd 'bar', 's2'
75
+ r.sadd 'bar', 's3'
77
76
 
78
- r.sdiffstore("baz", "foo", "bar")
77
+ r.sdiffstore('baz', 'foo', 'bar')
79
78
  end
80
79
  end
81
80
 
82
81
  def test_sscan
83
82
  assert_nothing_raised do
84
- r.sadd "foo", "s1"
85
- r.sadd "foo", "s2"
86
- r.sadd "bar", "s2"
87
- r.sadd "bar", "s3"
83
+ r.sadd 'foo', 's1'
84
+ r.sadd 'foo', 's2'
85
+ r.sadd 'bar', 's2'
86
+ r.sadd 'bar', 's3'
88
87
 
89
- cursor, vals = r.sscan "foo", 0
88
+ cursor, vals = r.sscan 'foo', 0
90
89
  assert_equal '0', cursor
91
- assert_equal %w(s1 s2), vals.sort
90
+ assert_equal %w[s1 s2], vals.sort
92
91
  end
93
92
  end
94
93
 
95
94
  def test_sscan_each
96
95
  assert_nothing_raised do
97
- r.sadd "foo", "s1"
98
- r.sadd "foo", "s2"
99
- r.sadd "bar", "s2"
100
- r.sadd "bar", "s3"
96
+ r.sadd 'foo', 's1'
97
+ r.sadd 'foo', 's2'
98
+ r.sadd 'bar', 's2'
99
+ r.sadd 'bar', 's3'
101
100
 
102
- vals = r.sscan_each("foo").to_a
103
- assert_equal %w(s1 s2), vals.sort
101
+ vals = r.sscan_each('foo').to_a
102
+ assert_equal %w[s1 s2], vals.sort
104
103
  end
105
104
  end
106
105
  end
@@ -1,16 +1,59 @@
1
- require_relative "helper"
2
- require_relative "lint/sorted_sets"
1
+ require_relative 'helper'
2
+ require_relative 'lint/sorted_sets'
3
3
 
4
4
  class TestDistributedCommandsOnSortedSets < Test::Unit::TestCase
5
-
6
5
  include Helper::Distributed
7
6
  include Lint::SortedSets
8
7
 
9
- def test_zcount
10
- r.zadd "foo", 1, "s1"
11
- r.zadd "foo", 2, "s2"
12
- r.zadd "foo", 3, "s3"
8
+ def test_zinterstore
9
+ assert_raise(Redis::Distributed::CannotDistribute) { super }
10
+ end
11
+
12
+ def test_zinterstore_with_aggregate
13
+ assert_raise(Redis::Distributed::CannotDistribute) { super }
14
+ end
15
+
16
+ def test_zinterstore_with_weights
17
+ assert_raise(Redis::Distributed::CannotDistribute) { super }
18
+ end
19
+
20
+ def test_zlexcount
21
+ # Not implemented yet
22
+ end
23
+
24
+ def test_zpopmax
25
+ # Not implemented yet
26
+ end
27
+
28
+ def test_zpopmin
29
+ # Not implemented yet
30
+ end
31
+
32
+ def test_zrangebylex
33
+ # Not implemented yet
34
+ end
35
+
36
+ def test_zremrangebylex
37
+ # Not implemented yet
38
+ end
39
+
40
+ def test_zrevrangebylex
41
+ # Not implemented yet
42
+ end
43
+
44
+ def test_zscan
45
+ # Not implemented yet
46
+ end
47
+
48
+ def test_zunionstore
49
+ assert_raise(Redis::Distributed::CannotDistribute) { super }
50
+ end
51
+
52
+ def test_zunionstore_with_aggregate
53
+ assert_raise(Redis::Distributed::CannotDistribute) { super }
54
+ end
13
55
 
14
- assert_equal 2, r.zcount("foo", 2, 3)
56
+ def test_zunionstore_with_weights
57
+ assert_raise(Redis::Distributed::CannotDistribute) { super }
15
58
  end
16
59
  end