redis 3.2.2 → 4.4.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.
Files changed (118) hide show
  1. checksums.yaml +5 -5
  2. data/CHANGELOG.md +175 -13
  3. data/README.md +223 -76
  4. data/lib/redis.rb +1360 -445
  5. data/lib/redis/client.rb +183 -103
  6. data/lib/redis/cluster.rb +291 -0
  7. data/lib/redis/cluster/command.rb +81 -0
  8. data/lib/redis/cluster/command_loader.rb +34 -0
  9. data/lib/redis/cluster/key_slot_converter.rb +72 -0
  10. data/lib/redis/cluster/node.rb +108 -0
  11. data/lib/redis/cluster/node_key.rb +31 -0
  12. data/lib/redis/cluster/node_loader.rb +37 -0
  13. data/lib/redis/cluster/option.rb +93 -0
  14. data/lib/redis/cluster/slot.rb +86 -0
  15. data/lib/redis/cluster/slot_loader.rb +49 -0
  16. data/lib/redis/connection.rb +4 -2
  17. data/lib/redis/connection/command_helper.rb +5 -10
  18. data/lib/redis/connection/hiredis.rb +9 -6
  19. data/lib/redis/connection/registry.rb +2 -1
  20. data/lib/redis/connection/ruby.rb +168 -63
  21. data/lib/redis/connection/synchrony.rb +29 -7
  22. data/lib/redis/distributed.rb +156 -74
  23. data/lib/redis/errors.rb +48 -0
  24. data/lib/redis/hash_ring.rb +30 -73
  25. data/lib/redis/pipeline.rb +55 -15
  26. data/lib/redis/subscribe.rb +20 -13
  27. data/lib/redis/version.rb +3 -1
  28. metadata +41 -170
  29. data/.gitignore +0 -16
  30. data/.travis.yml +0 -59
  31. data/.travis/Gemfile +0 -11
  32. data/.yardopts +0 -3
  33. data/Gemfile +0 -4
  34. data/Rakefile +0 -87
  35. data/benchmarking/logging.rb +0 -71
  36. data/benchmarking/pipeline.rb +0 -51
  37. data/benchmarking/speed.rb +0 -21
  38. data/benchmarking/suite.rb +0 -24
  39. data/benchmarking/worker.rb +0 -71
  40. data/examples/basic.rb +0 -15
  41. data/examples/consistency.rb +0 -114
  42. data/examples/dist_redis.rb +0 -43
  43. data/examples/incr-decr.rb +0 -17
  44. data/examples/list.rb +0 -26
  45. data/examples/pubsub.rb +0 -37
  46. data/examples/sentinel.rb +0 -41
  47. data/examples/sentinel/sentinel.conf +0 -9
  48. data/examples/sentinel/start +0 -49
  49. data/examples/sets.rb +0 -36
  50. data/examples/unicorn/config.ru +0 -3
  51. data/examples/unicorn/unicorn.rb +0 -20
  52. data/redis.gemspec +0 -44
  53. data/test/bitpos_test.rb +0 -69
  54. data/test/blocking_commands_test.rb +0 -42
  55. data/test/command_map_test.rb +0 -30
  56. data/test/commands_on_hashes_test.rb +0 -21
  57. data/test/commands_on_hyper_log_log_test.rb +0 -21
  58. data/test/commands_on_lists_test.rb +0 -20
  59. data/test/commands_on_sets_test.rb +0 -77
  60. data/test/commands_on_sorted_sets_test.rb +0 -137
  61. data/test/commands_on_strings_test.rb +0 -101
  62. data/test/commands_on_value_types_test.rb +0 -133
  63. data/test/connection_handling_test.rb +0 -250
  64. data/test/db/.gitkeep +0 -0
  65. data/test/distributed_blocking_commands_test.rb +0 -46
  66. data/test/distributed_commands_on_hashes_test.rb +0 -10
  67. data/test/distributed_commands_on_hyper_log_log_test.rb +0 -33
  68. data/test/distributed_commands_on_lists_test.rb +0 -22
  69. data/test/distributed_commands_on_sets_test.rb +0 -83
  70. data/test/distributed_commands_on_sorted_sets_test.rb +0 -18
  71. data/test/distributed_commands_on_strings_test.rb +0 -59
  72. data/test/distributed_commands_on_value_types_test.rb +0 -95
  73. data/test/distributed_commands_requiring_clustering_test.rb +0 -164
  74. data/test/distributed_connection_handling_test.rb +0 -23
  75. data/test/distributed_internals_test.rb +0 -79
  76. data/test/distributed_key_tags_test.rb +0 -52
  77. data/test/distributed_persistence_control_commands_test.rb +0 -26
  78. data/test/distributed_publish_subscribe_test.rb +0 -92
  79. data/test/distributed_remote_server_control_commands_test.rb +0 -66
  80. data/test/distributed_scripting_test.rb +0 -102
  81. data/test/distributed_sorting_test.rb +0 -20
  82. data/test/distributed_test.rb +0 -58
  83. data/test/distributed_transactions_test.rb +0 -32
  84. data/test/encoding_test.rb +0 -18
  85. data/test/error_replies_test.rb +0 -59
  86. data/test/fork_safety_test.rb +0 -65
  87. data/test/helper.rb +0 -232
  88. data/test/helper_test.rb +0 -24
  89. data/test/internals_test.rb +0 -437
  90. data/test/lint/blocking_commands.rb +0 -150
  91. data/test/lint/hashes.rb +0 -162
  92. data/test/lint/hyper_log_log.rb +0 -60
  93. data/test/lint/lists.rb +0 -143
  94. data/test/lint/sets.rb +0 -125
  95. data/test/lint/sorted_sets.rb +0 -316
  96. data/test/lint/strings.rb +0 -260
  97. data/test/lint/value_types.rb +0 -122
  98. data/test/persistence_control_commands_test.rb +0 -26
  99. data/test/pipelining_commands_test.rb +0 -242
  100. data/test/publish_subscribe_test.rb +0 -254
  101. data/test/remote_server_control_commands_test.rb +0 -118
  102. data/test/scanning_test.rb +0 -413
  103. data/test/scripting_test.rb +0 -78
  104. data/test/sentinel_command_test.rb +0 -80
  105. data/test/sentinel_test.rb +0 -255
  106. data/test/sorting_test.rb +0 -59
  107. data/test/support/connection/hiredis.rb +0 -1
  108. data/test/support/connection/ruby.rb +0 -1
  109. data/test/support/connection/synchrony.rb +0 -17
  110. data/test/support/redis_mock.rb +0 -119
  111. data/test/support/wire/synchrony.rb +0 -24
  112. data/test/support/wire/thread.rb +0 -5
  113. data/test/synchrony_driver.rb +0 -88
  114. data/test/test.conf.erb +0 -9
  115. data/test/thread_safety_test.rb +0 -32
  116. data/test/transactions_test.rb +0 -264
  117. data/test/unknown_commands_test.rb +0 -14
  118. data/test/url_param_test.rb +0 -138
data/lib/redis/errors.rb CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class Redis
2
4
  # Base error for all redis-rb errors.
3
5
  class BaseError < RuntimeError
@@ -37,4 +39,50 @@ class Redis
37
39
  # Raised when the connection was inherited by a child process.
38
40
  class InheritedError < BaseConnectionError
39
41
  end
42
+
43
+ # Raised when client options are invalid.
44
+ class InvalidClientOptionError < BaseError
45
+ end
46
+
47
+ class Cluster
48
+ # Raised when client connected to redis as cluster mode
49
+ # and some cluster subcommands were called.
50
+ class OrchestrationCommandNotSupported < BaseError
51
+ def initialize(command, subcommand = '')
52
+ str = [command, subcommand].map(&:to_s).reject(&:empty?).join(' ').upcase
53
+ msg = "#{str} command should be used with care "\
54
+ 'only by applications orchestrating Redis Cluster, like redis-trib, '\
55
+ 'and the command if used out of the right context can leave the cluster '\
56
+ 'in a wrong state or cause data loss.'
57
+ super(msg)
58
+ end
59
+ end
60
+
61
+ # Raised when error occurs on any node of cluster.
62
+ class CommandErrorCollection < BaseError
63
+ attr_reader :errors
64
+
65
+ # @param errors [Hash{String => Redis::CommandError}]
66
+ # @param error_message [String]
67
+ def initialize(errors, error_message = 'Command errors were replied on any node')
68
+ @errors = errors
69
+ super(error_message)
70
+ end
71
+ end
72
+
73
+ # Raised when cluster client can't select node.
74
+ class AmbiguousNodeError < BaseError
75
+ def initialize(command)
76
+ super("Cluster client doesn't know which node the #{command} command should be sent to.")
77
+ end
78
+ end
79
+
80
+ # Raised when commands in pipelining include cross slot keys.
81
+ class CrossSlotPipeliningError < BaseError
82
+ def initialize(keys)
83
+ super("Cluster client couldn't send pipelining to single node. "\
84
+ "The commands include cross slot keys. #{keys}")
85
+ end
86
+ end
87
+ end
40
88
  end
@@ -1,8 +1,9 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'zlib'
2
4
 
3
5
  class Redis
4
6
  class HashRing
5
-
6
7
  POINTS_PER_SERVER = 160 # this is the default in libmemcached
7
8
 
8
9
  attr_reader :ring, :sorted_keys, :replicas, :nodes
@@ -10,7 +11,7 @@ class Redis
10
11
  # nodes is a list of objects that have a proper to_s representation.
11
12
  # replicas indicates how many virtual points should be used pr. node,
12
13
  # replicas are required to improve the distribution.
13
- def initialize(nodes=[], replicas=POINTS_PER_SERVER)
14
+ def initialize(nodes = [], replicas = POINTS_PER_SERVER)
14
15
  @replicas = replicas
15
16
  @ring = {}
16
17
  @nodes = []
@@ -25,7 +26,6 @@ class Redis
25
26
  @nodes << node
26
27
  @replicas.times do |i|
27
28
  key = Zlib.crc32("#{node.id}:#{i}")
28
- raise "Node ID collision" if @ring.has_key?(key)
29
29
  @ring[key] = node
30
30
  @sorted_keys << key
31
31
  end
@@ -33,11 +33,11 @@ class Redis
33
33
  end
34
34
 
35
35
  def remove_node(node)
36
- @nodes.reject!{|n| n.id == node.id}
36
+ @nodes.reject! { |n| n.id == node.id }
37
37
  @replicas.times do |i|
38
38
  key = Zlib.crc32("#{node.id}:#{i}")
39
39
  @ring.delete(key)
40
- @sorted_keys.reject! {|k| k == key}
40
+ @sorted_keys.reject! { |k| k == key }
41
41
  end
42
42
  end
43
43
 
@@ -47,86 +47,43 @@ class Redis
47
47
  end
48
48
 
49
49
  def get_node_pos(key)
50
- return [nil,nil] if @ring.size == 0
50
+ return [nil, nil] if @ring.empty?
51
+
51
52
  crc = Zlib.crc32(key)
52
53
  idx = HashRing.binary_search(@sorted_keys, crc)
53
- return [@ring[@sorted_keys[idx]], idx]
54
+ [@ring[@sorted_keys[idx]], idx]
54
55
  end
55
56
 
56
57
  def iter_nodes(key)
57
- return [nil,nil] if @ring.size == 0
58
+ return [nil, nil] if @ring.empty?
59
+
58
60
  _, pos = get_node_pos(key)
59
61
  @ring.size.times do |n|
60
- yield @ring[@sorted_keys[(pos+n) % @ring.size]]
62
+ yield @ring[@sorted_keys[(pos + n) % @ring.size]]
61
63
  end
62
64
  end
63
65
 
64
- class << self
65
-
66
- # gem install RubyInline to use this code
67
- # Native extension to perform the binary search within the hashring.
68
- # There's a pure ruby version below so this is purely optional
69
- # for performance. In testing 20k gets and sets, the native
70
- # binary search shaved about 12% off the runtime (9sec -> 8sec).
71
- begin
72
- require 'inline'
73
- inline do |builder|
74
- builder.c <<-EOM
75
- int binary_search(VALUE ary, unsigned int r) {
76
- int upper = RARRAY_LEN(ary) - 1;
77
- int lower = 0;
78
- int idx = 0;
79
-
80
- while (lower <= upper) {
81
- idx = (lower + upper) / 2;
82
-
83
- VALUE continuumValue = RARRAY_PTR(ary)[idx];
84
- unsigned int l = NUM2UINT(continuumValue);
85
- if (l == r) {
86
- return idx;
87
- }
88
- else if (l > r) {
89
- upper = idx - 1;
90
- }
91
- else {
92
- lower = idx + 1;
93
- }
94
- }
95
- if (upper < 0) {
96
- upper = RARRAY_LEN(ary) - 1;
97
- }
98
- return upper;
99
- }
100
- EOM
66
+ # Find the closest index in HashRing with value <= the given value
67
+ def self.binary_search(ary, value)
68
+ upper = ary.size - 1
69
+ lower = 0
70
+ idx = 0
71
+
72
+ while lower <= upper
73
+ idx = (lower + upper) / 2
74
+ comp = ary[idx] <=> value
75
+
76
+ if comp == 0
77
+ return idx
78
+ elsif comp > 0
79
+ upper = idx - 1
80
+ else
81
+ lower = idx + 1
101
82
  end
102
- rescue Exception
103
- # Find the closest index in HashRing with value <= the given value
104
- def binary_search(ary, value, &block)
105
- upper = ary.size - 1
106
- lower = 0
107
- idx = 0
108
-
109
- while(lower <= upper) do
110
- idx = (lower + upper) / 2
111
- comp = ary[idx] <=> value
112
-
113
- if comp == 0
114
- return idx
115
- elsif comp > 0
116
- upper = idx - 1
117
- else
118
- lower = idx + 1
119
- end
120
- end
121
-
122
- if upper < 0
123
- upper = ary.size - 1
124
- end
125
- return upper
126
- end
127
-
128
83
  end
129
- end
130
84
 
85
+ upper = ary.size - 1 if upper < 0
86
+ upper
87
+ end
131
88
  end
132
89
  end
@@ -1,21 +1,23 @@
1
- class Redis
2
- unless defined?(::BasicObject)
3
- class BasicObject
4
- instance_methods.each { |meth| undef_method(meth) unless meth =~ /\A(__|instance_eval)/ }
5
- end
6
- end
1
+ # frozen_string_literal: true
7
2
 
3
+ class Redis
8
4
  class Pipeline
9
5
  attr_accessor :db
6
+ attr_reader :client
10
7
 
11
8
  attr :futures
12
9
 
13
- def initialize
10
+ def initialize(client)
11
+ @client = client.is_a?(Pipeline) ? client.client : client
14
12
  @with_reconnect = true
15
13
  @shutdown = false
16
14
  @futures = []
17
15
  end
18
16
 
17
+ def timeout
18
+ client.timeout
19
+ end
20
+
19
21
  def with_reconnect?
20
22
  @with_reconnect
21
23
  end
@@ -28,15 +30,23 @@ class Redis
28
30
  @shutdown
29
31
  end
30
32
 
31
- def call(command, &block)
33
+ def empty?
34
+ @futures.empty?
35
+ end
36
+
37
+ def call(command, timeout: nil, &block)
32
38
  # A pipeline that contains a shutdown should not raise ECONNRESET when
33
39
  # the connection is gone.
34
40
  @shutdown = true if command.first == :shutdown
35
- future = Future.new(command, block)
41
+ future = Future.new(command, block, timeout)
36
42
  @futures << future
37
43
  future
38
44
  end
39
45
 
46
+ def call_with_timeout(command, timeout, &block)
47
+ call(command, timeout: timeout, &block)
48
+ end
49
+
40
50
  def call_pipeline(pipeline)
41
51
  @shutdown = true if pipeline.shutdown?
42
52
  @futures.concat(pipeline.futures)
@@ -45,10 +55,14 @@ class Redis
45
55
  end
46
56
 
47
57
  def commands
48
- @futures.map { |f| f._command }
58
+ @futures.map(&:_command)
49
59
  end
50
60
 
51
- def with_reconnect(val=true)
61
+ def timeouts
62
+ @futures.map(&:timeout)
63
+ end
64
+
65
+ def with_reconnect(val = true)
52
66
  @with_reconnect = false unless val
53
67
  yield
54
68
  end
@@ -80,7 +94,8 @@ class Redis
80
94
 
81
95
  if exec.size < futures.size
82
96
  # Some command wasn't recognized by Redis.
83
- raise replies.detect { |r| r.is_a?(CommandError) }
97
+ command_error = replies.detect { |r| r.is_a?(CommandError) }
98
+ raise command_error
84
99
  end
85
100
 
86
101
  super(exec) do |reply|
@@ -91,8 +106,20 @@ class Redis
91
106
  end
92
107
  end
93
108
 
109
+ def timeouts
110
+ if empty?
111
+ []
112
+ else
113
+ [nil, *super, nil]
114
+ end
115
+ end
116
+
94
117
  def commands
95
- [[:multi]] + super + [[:exec]]
118
+ if empty?
119
+ []
120
+ else
121
+ [[:multi]] + super + [[:exec]]
122
+ end
96
123
  end
97
124
  end
98
125
  end
@@ -106,12 +133,25 @@ class Redis
106
133
  class Future < BasicObject
107
134
  FutureNotReady = ::Redis::FutureNotReady.new
108
135
 
109
- def initialize(command, transformation)
136
+ attr_reader :timeout
137
+
138
+ def initialize(command, transformation, timeout)
110
139
  @command = command
111
140
  @transformation = transformation
141
+ @timeout = timeout
112
142
  @object = FutureNotReady
113
143
  end
114
144
 
145
+ def ==(_other)
146
+ message = +"The methods == and != are deprecated for Redis::Future and will be removed in 4.2.0"
147
+ message << " - You probably meant to call .value == or .value !="
148
+ message << " (#{::Kernel.caller(1, 1).first})\n"
149
+
150
+ ::Kernel.warn(message)
151
+
152
+ super
153
+ end
154
+
115
155
  def inspect
116
156
  "<Redis::Future #{@command.inspect}>"
117
157
  end
@@ -126,7 +166,7 @@ class Redis
126
166
  end
127
167
 
128
168
  def value
129
- ::Kernel.raise(@object) if @object.kind_of?(::RuntimeError)
169
+ ::Kernel.raise(@object) if @object.is_a?(::RuntimeError)
130
170
  @object
131
171
  end
132
172
 
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class Redis
2
4
  class SubscribedClient
3
5
  def initialize(client)
@@ -12,10 +14,18 @@ class Redis
12
14
  subscription("subscribe", "unsubscribe", channels, block)
13
15
  end
14
16
 
17
+ def subscribe_with_timeout(timeout, *channels, &block)
18
+ subscription("subscribe", "unsubscribe", channels, block, timeout)
19
+ end
20
+
15
21
  def psubscribe(*channels, &block)
16
22
  subscription("psubscribe", "punsubscribe", channels, block)
17
23
  end
18
24
 
25
+ def psubscribe_with_timeout(timeout, *channels, &block)
26
+ subscription("psubscribe", "punsubscribe", channels, block, timeout)
27
+ end
28
+
19
29
  def unsubscribe(*channels)
20
30
  call([:unsubscribe, *channels])
21
31
  end
@@ -24,24 +34,21 @@ class Redis
24
34
  call([:punsubscribe, *channels])
25
35
  end
26
36
 
27
- protected
37
+ protected
28
38
 
29
- def subscription(start, stop, channels, block)
39
+ def subscription(start, stop, channels, block, timeout = 0)
30
40
  sub = Subscription.new(&block)
31
41
 
32
42
  unsubscribed = false
33
43
 
34
- begin
35
- @client.call_loop([start, *channels]) do |line|
36
- type, *rest = line
37
- sub.callbacks[type].call(*rest)
38
- unsubscribed = type == stop && rest.last == 0
39
- break if unsubscribed
40
- end
41
- ensure
42
- # No need to unsubscribe here. The real client closes the connection
43
- # whenever an exception is raised (see #ensure_connected).
44
+ @client.call_loop([start, *channels], timeout) do |line|
45
+ type, *rest = line
46
+ sub.callbacks[type].call(*rest)
47
+ unsubscribed = type == stop && rest.last == 0
48
+ break if unsubscribed
44
49
  end
50
+ # No need to unsubscribe here. The real client closes the connection
51
+ # whenever an exception is raised (see #ensure_connected).
45
52
  end
46
53
  end
47
54
 
@@ -50,7 +57,7 @@ class Redis
50
57
 
51
58
  def initialize
52
59
  @callbacks = Hash.new do |hash, key|
53
- hash[key] = lambda { |*_| }
60
+ hash[key] = ->(*_) {}
54
61
  end
55
62
 
56
63
  yield(self)
data/lib/redis/version.rb CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class Redis
2
- VERSION = "3.2.2"
4
+ VERSION = '4.4.0'
3
5
  end
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: 3.2.2
4
+ version: 4.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ezra Zygmuntowicz
@@ -13,13 +13,13 @@ authors:
13
13
  - Michel Martens
14
14
  - Damian Janowski
15
15
  - Pieter Noordhuis
16
- autorequire:
16
+ autorequire:
17
17
  bindir: bin
18
18
  cert_chain: []
19
- date: 2015-11-16 00:00:00.000000000 Z
19
+ date: 2021-07-28 00:00:00.000000000 Z
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency
22
- name: rake
22
+ name: em-synchrony
23
23
  requirement: !ruby/object:Gem::Requirement
24
24
  requirements:
25
25
  - - ">="
@@ -33,7 +33,21 @@ dependencies:
33
33
  - !ruby/object:Gem::Version
34
34
  version: '0'
35
35
  - !ruby/object:Gem::Dependency
36
- name: test-unit
36
+ name: hiredis
37
+ requirement: !ruby/object:Gem::Requirement
38
+ requirements:
39
+ - - ">="
40
+ - !ruby/object:Gem::Version
41
+ version: '0'
42
+ type: :development
43
+ prerelease: false
44
+ version_requirements: !ruby/object:Gem::Requirement
45
+ requirements:
46
+ - - ">="
47
+ - !ruby/object:Gem::Version
48
+ version: '0'
49
+ - !ruby/object:Gem::Dependency
50
+ name: mocha
37
51
  requirement: !ruby/object:Gem::Requirement
38
52
  requirements:
39
53
  - - ">="
@@ -48,42 +62,28 @@ dependencies:
48
62
  version: '0'
49
63
  description: |2
50
64
  A Ruby client that tries to match Redis' API one-to-one, while still
51
- providing an idiomatic interface. It features thread-safety,
52
- client-side sharding, pipelining, and an obsession for performance.
65
+ providing an idiomatic interface.
53
66
  email:
54
67
  - redis-db@googlegroups.com
55
68
  executables: []
56
69
  extensions: []
57
70
  extra_rdoc_files: []
58
71
  files:
59
- - ".gitignore"
60
- - ".travis.yml"
61
- - ".travis/Gemfile"
62
- - ".yardopts"
63
72
  - CHANGELOG.md
64
- - Gemfile
65
73
  - LICENSE
66
74
  - README.md
67
- - Rakefile
68
- - benchmarking/logging.rb
69
- - benchmarking/pipeline.rb
70
- - benchmarking/speed.rb
71
- - benchmarking/suite.rb
72
- - benchmarking/worker.rb
73
- - examples/basic.rb
74
- - examples/consistency.rb
75
- - examples/dist_redis.rb
76
- - examples/incr-decr.rb
77
- - examples/list.rb
78
- - examples/pubsub.rb
79
- - examples/sentinel.rb
80
- - examples/sentinel/sentinel.conf
81
- - examples/sentinel/start
82
- - examples/sets.rb
83
- - examples/unicorn/config.ru
84
- - examples/unicorn/unicorn.rb
85
75
  - lib/redis.rb
86
76
  - lib/redis/client.rb
77
+ - lib/redis/cluster.rb
78
+ - lib/redis/cluster/command.rb
79
+ - lib/redis/cluster/command_loader.rb
80
+ - lib/redis/cluster/key_slot_converter.rb
81
+ - lib/redis/cluster/node.rb
82
+ - lib/redis/cluster/node_key.rb
83
+ - lib/redis/cluster/node_loader.rb
84
+ - lib/redis/cluster/option.rb
85
+ - lib/redis/cluster/slot.rb
86
+ - lib/redis/cluster/slot_loader.rb
87
87
  - lib/redis/connection.rb
88
88
  - lib/redis/connection/command_helper.rb
89
89
  - lib/redis/connection/hiredis.rb
@@ -96,78 +96,16 @@ files:
96
96
  - lib/redis/pipeline.rb
97
97
  - lib/redis/subscribe.rb
98
98
  - lib/redis/version.rb
99
- - redis.gemspec
100
- - test/bitpos_test.rb
101
- - test/blocking_commands_test.rb
102
- - test/command_map_test.rb
103
- - test/commands_on_hashes_test.rb
104
- - test/commands_on_hyper_log_log_test.rb
105
- - test/commands_on_lists_test.rb
106
- - test/commands_on_sets_test.rb
107
- - test/commands_on_sorted_sets_test.rb
108
- - test/commands_on_strings_test.rb
109
- - test/commands_on_value_types_test.rb
110
- - test/connection_handling_test.rb
111
- - test/db/.gitkeep
112
- - test/distributed_blocking_commands_test.rb
113
- - test/distributed_commands_on_hashes_test.rb
114
- - test/distributed_commands_on_hyper_log_log_test.rb
115
- - test/distributed_commands_on_lists_test.rb
116
- - test/distributed_commands_on_sets_test.rb
117
- - test/distributed_commands_on_sorted_sets_test.rb
118
- - test/distributed_commands_on_strings_test.rb
119
- - test/distributed_commands_on_value_types_test.rb
120
- - test/distributed_commands_requiring_clustering_test.rb
121
- - test/distributed_connection_handling_test.rb
122
- - test/distributed_internals_test.rb
123
- - test/distributed_key_tags_test.rb
124
- - test/distributed_persistence_control_commands_test.rb
125
- - test/distributed_publish_subscribe_test.rb
126
- - test/distributed_remote_server_control_commands_test.rb
127
- - test/distributed_scripting_test.rb
128
- - test/distributed_sorting_test.rb
129
- - test/distributed_test.rb
130
- - test/distributed_transactions_test.rb
131
- - test/encoding_test.rb
132
- - test/error_replies_test.rb
133
- - test/fork_safety_test.rb
134
- - test/helper.rb
135
- - test/helper_test.rb
136
- - test/internals_test.rb
137
- - test/lint/blocking_commands.rb
138
- - test/lint/hashes.rb
139
- - test/lint/hyper_log_log.rb
140
- - test/lint/lists.rb
141
- - test/lint/sets.rb
142
- - test/lint/sorted_sets.rb
143
- - test/lint/strings.rb
144
- - test/lint/value_types.rb
145
- - test/persistence_control_commands_test.rb
146
- - test/pipelining_commands_test.rb
147
- - test/publish_subscribe_test.rb
148
- - test/remote_server_control_commands_test.rb
149
- - test/scanning_test.rb
150
- - test/scripting_test.rb
151
- - test/sentinel_command_test.rb
152
- - test/sentinel_test.rb
153
- - test/sorting_test.rb
154
- - test/support/connection/hiredis.rb
155
- - test/support/connection/ruby.rb
156
- - test/support/connection/synchrony.rb
157
- - test/support/redis_mock.rb
158
- - test/support/wire/synchrony.rb
159
- - test/support/wire/thread.rb
160
- - test/synchrony_driver.rb
161
- - test/test.conf.erb
162
- - test/thread_safety_test.rb
163
- - test/transactions_test.rb
164
- - test/unknown_commands_test.rb
165
- - test/url_param_test.rb
166
99
  homepage: https://github.com/redis/redis-rb
167
100
  licenses:
168
101
  - MIT
169
- metadata: {}
170
- post_install_message:
102
+ metadata:
103
+ bug_tracker_uri: https://github.com/redis/redis-rb/issues
104
+ changelog_uri: https://github.com/redis/redis-rb/blob/master/CHANGELOG.md
105
+ documentation_uri: https://www.rubydoc.info/gems/redis/4.4.0
106
+ homepage_uri: https://github.com/redis/redis-rb
107
+ source_code_uri: https://github.com/redis/redis-rb/tree/v4.4.0
108
+ post_install_message:
171
109
  rdoc_options: []
172
110
  require_paths:
173
111
  - lib
@@ -175,82 +113,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
175
113
  requirements:
176
114
  - - ">="
177
115
  - !ruby/object:Gem::Version
178
- version: '0'
116
+ version: 2.3.0
179
117
  required_rubygems_version: !ruby/object:Gem::Requirement
180
118
  requirements:
181
119
  - - ">="
182
120
  - !ruby/object:Gem::Version
183
121
  version: '0'
184
122
  requirements: []
185
- rubyforge_project:
186
- rubygems_version: 2.4.5.1
187
- signing_key:
123
+ rubygems_version: 3.1.2
124
+ signing_key:
188
125
  specification_version: 4
189
126
  summary: A Ruby client library for Redis
190
- test_files:
191
- - test/bitpos_test.rb
192
- - test/blocking_commands_test.rb
193
- - test/command_map_test.rb
194
- - test/commands_on_hashes_test.rb
195
- - test/commands_on_hyper_log_log_test.rb
196
- - test/commands_on_lists_test.rb
197
- - test/commands_on_sets_test.rb
198
- - test/commands_on_sorted_sets_test.rb
199
- - test/commands_on_strings_test.rb
200
- - test/commands_on_value_types_test.rb
201
- - test/connection_handling_test.rb
202
- - test/db/.gitkeep
203
- - test/distributed_blocking_commands_test.rb
204
- - test/distributed_commands_on_hashes_test.rb
205
- - test/distributed_commands_on_hyper_log_log_test.rb
206
- - test/distributed_commands_on_lists_test.rb
207
- - test/distributed_commands_on_sets_test.rb
208
- - test/distributed_commands_on_sorted_sets_test.rb
209
- - test/distributed_commands_on_strings_test.rb
210
- - test/distributed_commands_on_value_types_test.rb
211
- - test/distributed_commands_requiring_clustering_test.rb
212
- - test/distributed_connection_handling_test.rb
213
- - test/distributed_internals_test.rb
214
- - test/distributed_key_tags_test.rb
215
- - test/distributed_persistence_control_commands_test.rb
216
- - test/distributed_publish_subscribe_test.rb
217
- - test/distributed_remote_server_control_commands_test.rb
218
- - test/distributed_scripting_test.rb
219
- - test/distributed_sorting_test.rb
220
- - test/distributed_test.rb
221
- - test/distributed_transactions_test.rb
222
- - test/encoding_test.rb
223
- - test/error_replies_test.rb
224
- - test/fork_safety_test.rb
225
- - test/helper.rb
226
- - test/helper_test.rb
227
- - test/internals_test.rb
228
- - test/lint/blocking_commands.rb
229
- - test/lint/hashes.rb
230
- - test/lint/hyper_log_log.rb
231
- - test/lint/lists.rb
232
- - test/lint/sets.rb
233
- - test/lint/sorted_sets.rb
234
- - test/lint/strings.rb
235
- - test/lint/value_types.rb
236
- - test/persistence_control_commands_test.rb
237
- - test/pipelining_commands_test.rb
238
- - test/publish_subscribe_test.rb
239
- - test/remote_server_control_commands_test.rb
240
- - test/scanning_test.rb
241
- - test/scripting_test.rb
242
- - test/sentinel_command_test.rb
243
- - test/sentinel_test.rb
244
- - test/sorting_test.rb
245
- - test/support/connection/hiredis.rb
246
- - test/support/connection/ruby.rb
247
- - test/support/connection/synchrony.rb
248
- - test/support/redis_mock.rb
249
- - test/support/wire/synchrony.rb
250
- - test/support/wire/thread.rb
251
- - test/synchrony_driver.rb
252
- - test/test.conf.erb
253
- - test/thread_safety_test.rb
254
- - test/transactions_test.rb
255
- - test/unknown_commands_test.rb
256
- - test/url_param_test.rb
127
+ test_files: []