redis 3.3.5 → 4.1.4

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 (130) hide show
  1. checksums.yaml +5 -5
  2. data/CHANGELOG.md +84 -2
  3. data/README.md +131 -76
  4. data/lib/redis.rb +912 -200
  5. data/lib/redis/client.rb +71 -29
  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 +104 -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 +87 -0
  14. data/lib/redis/cluster/slot.rb +72 -0
  15. data/lib/redis/cluster/slot_loader.rb +50 -0
  16. data/lib/redis/connection.rb +3 -2
  17. data/lib/redis/connection/command_helper.rb +3 -8
  18. data/lib/redis/connection/hiredis.rb +3 -2
  19. data/lib/redis/connection/registry.rb +1 -0
  20. data/lib/redis/connection/ruby.rb +48 -32
  21. data/lib/redis/connection/synchrony.rb +13 -4
  22. data/lib/redis/distributed.rb +39 -15
  23. data/lib/redis/errors.rb +47 -0
  24. data/lib/redis/hash_ring.rb +21 -64
  25. data/lib/redis/pipeline.rb +54 -12
  26. data/lib/redis/subscribe.rb +1 -0
  27. data/lib/redis/version.rb +2 -1
  28. metadata +40 -198
  29. data/.gitignore +0 -16
  30. data/.travis.yml +0 -89
  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/client_test.rb +0 -59
  56. data/test/command_map_test.rb +0 -30
  57. data/test/commands_on_hashes_test.rb +0 -21
  58. data/test/commands_on_hyper_log_log_test.rb +0 -21
  59. data/test/commands_on_lists_test.rb +0 -20
  60. data/test/commands_on_sets_test.rb +0 -77
  61. data/test/commands_on_sorted_sets_test.rb +0 -137
  62. data/test/commands_on_strings_test.rb +0 -101
  63. data/test/commands_on_value_types_test.rb +0 -133
  64. data/test/connection_handling_test.rb +0 -277
  65. data/test/connection_test.rb +0 -57
  66. data/test/db/.gitkeep +0 -0
  67. data/test/distributed_blocking_commands_test.rb +0 -46
  68. data/test/distributed_commands_on_hashes_test.rb +0 -10
  69. data/test/distributed_commands_on_hyper_log_log_test.rb +0 -33
  70. data/test/distributed_commands_on_lists_test.rb +0 -22
  71. data/test/distributed_commands_on_sets_test.rb +0 -83
  72. data/test/distributed_commands_on_sorted_sets_test.rb +0 -18
  73. data/test/distributed_commands_on_strings_test.rb +0 -59
  74. data/test/distributed_commands_on_value_types_test.rb +0 -95
  75. data/test/distributed_commands_requiring_clustering_test.rb +0 -164
  76. data/test/distributed_connection_handling_test.rb +0 -23
  77. data/test/distributed_internals_test.rb +0 -79
  78. data/test/distributed_key_tags_test.rb +0 -52
  79. data/test/distributed_persistence_control_commands_test.rb +0 -26
  80. data/test/distributed_publish_subscribe_test.rb +0 -92
  81. data/test/distributed_remote_server_control_commands_test.rb +0 -66
  82. data/test/distributed_scripting_test.rb +0 -102
  83. data/test/distributed_sorting_test.rb +0 -20
  84. data/test/distributed_test.rb +0 -58
  85. data/test/distributed_transactions_test.rb +0 -32
  86. data/test/encoding_test.rb +0 -18
  87. data/test/error_replies_test.rb +0 -59
  88. data/test/fork_safety_test.rb +0 -65
  89. data/test/helper.rb +0 -232
  90. data/test/helper_test.rb +0 -24
  91. data/test/internals_test.rb +0 -417
  92. data/test/lint/blocking_commands.rb +0 -150
  93. data/test/lint/hashes.rb +0 -162
  94. data/test/lint/hyper_log_log.rb +0 -60
  95. data/test/lint/lists.rb +0 -143
  96. data/test/lint/sets.rb +0 -140
  97. data/test/lint/sorted_sets.rb +0 -316
  98. data/test/lint/strings.rb +0 -260
  99. data/test/lint/value_types.rb +0 -122
  100. data/test/persistence_control_commands_test.rb +0 -26
  101. data/test/pipelining_commands_test.rb +0 -242
  102. data/test/publish_subscribe_test.rb +0 -282
  103. data/test/remote_server_control_commands_test.rb +0 -118
  104. data/test/scanning_test.rb +0 -413
  105. data/test/scripting_test.rb +0 -78
  106. data/test/sentinel_command_test.rb +0 -80
  107. data/test/sentinel_test.rb +0 -255
  108. data/test/sorting_test.rb +0 -59
  109. data/test/ssl_test.rb +0 -73
  110. data/test/support/connection/hiredis.rb +0 -1
  111. data/test/support/connection/ruby.rb +0 -1
  112. data/test/support/connection/synchrony.rb +0 -17
  113. data/test/support/redis_mock.rb +0 -130
  114. data/test/support/ssl/gen_certs.sh +0 -31
  115. data/test/support/ssl/trusted-ca.crt +0 -25
  116. data/test/support/ssl/trusted-ca.key +0 -27
  117. data/test/support/ssl/trusted-cert.crt +0 -81
  118. data/test/support/ssl/trusted-cert.key +0 -28
  119. data/test/support/ssl/untrusted-ca.crt +0 -26
  120. data/test/support/ssl/untrusted-ca.key +0 -27
  121. data/test/support/ssl/untrusted-cert.crt +0 -82
  122. data/test/support/ssl/untrusted-cert.key +0 -28
  123. data/test/support/wire/synchrony.rb +0 -24
  124. data/test/support/wire/thread.rb +0 -5
  125. data/test/synchrony_driver.rb +0 -88
  126. data/test/test.conf.erb +0 -9
  127. data/test/thread_safety_test.rb +0 -62
  128. data/test/transactions_test.rb +0 -264
  129. data/test/unknown_commands_test.rb +0 -14
  130. data/test/url_param_test.rb +0 -138
data/lib/redis/errors.rb CHANGED
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  class Redis
2
3
  # Base error for all redis-rb errors.
3
4
  class BaseError < RuntimeError
@@ -37,4 +38,50 @@ class Redis
37
38
  # Raised when the connection was inherited by a child process.
38
39
  class InheritedError < BaseConnectionError
39
40
  end
41
+
42
+ # Raised when client options are invalid.
43
+ class InvalidClientOptionError < BaseError
44
+ end
45
+
46
+ class Cluster
47
+ # Raised when client connected to redis as cluster mode
48
+ # and some cluster subcommands were called.
49
+ class OrchestrationCommandNotSupported < BaseError
50
+ def initialize(command, subcommand = '')
51
+ str = [command, subcommand].map(&:to_s).reject(&:empty?).join(' ').upcase
52
+ msg = "#{str} command should be used with care "\
53
+ 'only by applications orchestrating Redis Cluster, like redis-trib, '\
54
+ 'and the command if used out of the right context can leave the cluster '\
55
+ 'in a wrong state or cause data loss.'
56
+ super(msg)
57
+ end
58
+ end
59
+
60
+ # Raised when error occurs on any node of cluster.
61
+ class CommandErrorCollection < BaseError
62
+ attr_reader :errors
63
+
64
+ # @param errors [Hash{String => Redis::CommandError}]
65
+ # @param error_message [String]
66
+ def initialize(errors, error_message = 'Command errors were replied on any node')
67
+ @errors = errors
68
+ super(error_message)
69
+ end
70
+ end
71
+
72
+ # Raised when cluster client can't select node.
73
+ class AmbiguousNodeError < BaseError
74
+ def initialize(command)
75
+ super("Cluster client doesn't know which node the #{command} command should be sent to.")
76
+ end
77
+ end
78
+
79
+ # Raised when commands in pipelining include cross slot keys.
80
+ class CrossSlotPipeliningError < BaseError
81
+ def initialize(keys)
82
+ super("Cluster client couldn't send pipelining to single node. "\
83
+ "The commands include cross slot keys. #{keys}")
84
+ end
85
+ end
86
+ end
40
87
  end
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require 'zlib'
2
3
 
3
4
  class Redis
@@ -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
@@ -61,72 +61,29 @@ class Redis
61
61
  end
62
62
  end
63
63
 
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
101
- 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
64
+ # Find the closest index in HashRing with value <= the given value
65
+ def self.binary_search(ary, value, &block)
66
+ upper = ary.size - 1
67
+ lower = 0
68
+ idx = 0
69
+
70
+ while(lower <= upper) do
71
+ idx = (lower + upper) / 2
72
+ comp = ary[idx] <=> value
73
+
74
+ if comp == 0
75
+ return idx
76
+ elsif comp > 0
77
+ upper = idx - 1
78
+ else
79
+ lower = idx + 1
126
80
  end
81
+ end
127
82
 
83
+ if upper < 0
84
+ upper = ary.size - 1
128
85
  end
86
+ return upper
129
87
  end
130
-
131
88
  end
132
89
  end
@@ -1,21 +1,22 @@
1
+ # frozen_string_literal: true
1
2
  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
7
-
8
3
  class Pipeline
9
4
  attr_accessor :db
5
+ attr_reader :client
10
6
 
11
7
  attr :futures
12
8
 
13
- def initialize
9
+ def initialize(client)
10
+ @client = client.is_a?(Pipeline) ? client.client : client
14
11
  @with_reconnect = true
15
12
  @shutdown = false
16
13
  @futures = []
17
14
  end
18
15
 
16
+ def timeout
17
+ client.timeout
18
+ end
19
+
19
20
  def with_reconnect?
20
21
  @with_reconnect
21
22
  end
@@ -28,15 +29,23 @@ class Redis
28
29
  @shutdown
29
30
  end
30
31
 
31
- def call(command, &block)
32
+ def empty?
33
+ @futures.empty?
34
+ end
35
+
36
+ def call(command, timeout: nil, &block)
32
37
  # A pipeline that contains a shutdown should not raise ECONNRESET when
33
38
  # the connection is gone.
34
39
  @shutdown = true if command.first == :shutdown
35
- future = Future.new(command, block)
40
+ future = Future.new(command, block, timeout)
36
41
  @futures << future
37
42
  future
38
43
  end
39
44
 
45
+ def call_with_timeout(command, timeout, &block)
46
+ call(command, timeout: timeout, &block)
47
+ end
48
+
40
49
  def call_pipeline(pipeline)
41
50
  @shutdown = true if pipeline.shutdown?
42
51
  @futures.concat(pipeline.futures)
@@ -45,7 +54,11 @@ class Redis
45
54
  end
46
55
 
47
56
  def commands
48
- @futures.map { |f| f._command }
57
+ @futures.map(&:_command)
58
+ end
59
+
60
+ def timeouts
61
+ @futures.map(&:timeout)
49
62
  end
50
63
 
51
64
  def with_reconnect(val=true)
@@ -91,8 +104,20 @@ class Redis
91
104
  end
92
105
  end
93
106
 
107
+ def timeouts
108
+ if empty?
109
+ []
110
+ else
111
+ [nil, *super, nil]
112
+ end
113
+ end
114
+
94
115
  def commands
95
- [[:multi]] + super + [[:exec]]
116
+ if empty?
117
+ []
118
+ else
119
+ [[:multi]] + super + [[:exec]]
120
+ end
96
121
  end
97
122
  end
98
123
  end
@@ -106,12 +131,29 @@ class Redis
106
131
  class Future < BasicObject
107
132
  FutureNotReady = ::Redis::FutureNotReady.new
108
133
 
109
- def initialize(command, transformation)
134
+ attr_reader :timeout
135
+
136
+ def initialize(command, transformation, timeout)
110
137
  @command = command
111
138
  @transformation = transformation
139
+ @timeout = timeout
112
140
  @object = FutureNotReady
113
141
  end
114
142
 
143
+ def ==(_other)
144
+ message = +"The methods == and != are deprecated for Redis::Future and will be removed in 4.2.0"
145
+ message << " - You probably meant to call .value == or .value !="
146
+ message << " (#{::Kernel.caller(1, 1).first})\n"
147
+
148
+ if defined?(::Warning)
149
+ ::Warning.warn(message)
150
+ else
151
+ $stderr.puts(message)
152
+ end
153
+
154
+ super
155
+ end
156
+
115
157
  def inspect
116
158
  "<Redis::Future #{@command.inspect}>"
117
159
  end
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  class Redis
2
3
  class SubscribedClient
3
4
  def initialize(client)
data/lib/redis/version.rb CHANGED
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  class Redis
2
- VERSION = "3.3.5"
3
+ VERSION = '4.1.4'
3
4
  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.3.5
4
+ version: 4.1.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ezra Zygmuntowicz
@@ -16,74 +16,74 @@ authors:
16
16
  autorequire:
17
17
  bindir: bin
18
18
  cert_chain: []
19
- date: 2017-09-28 00:00:00.000000000 Z
19
+ date: 2020-05-01 00:00:00.000000000 Z
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency
22
- name: rake
22
+ name: mocha
23
23
  requirement: !ruby/object:Gem::Requirement
24
24
  requirements:
25
- - - "<"
25
+ - - ">="
26
26
  - !ruby/object:Gem::Version
27
- version: 11.0.0
27
+ version: '0'
28
28
  type: :development
29
29
  prerelease: false
30
30
  version_requirements: !ruby/object:Gem::Requirement
31
31
  requirements:
32
- - - "<"
32
+ - - ">="
33
33
  - !ruby/object:Gem::Version
34
- version: 11.0.0
34
+ version: '0'
35
35
  - !ruby/object:Gem::Dependency
36
- name: test-unit
36
+ name: hiredis
37
37
  requirement: !ruby/object:Gem::Requirement
38
38
  requirements:
39
- - - '='
39
+ - - ">="
40
40
  - !ruby/object:Gem::Version
41
- version: 3.1.5
41
+ version: '0'
42
42
  type: :development
43
43
  prerelease: false
44
44
  version_requirements: !ruby/object:Gem::Requirement
45
45
  requirements:
46
- - - '='
46
+ - - ">="
47
47
  - !ruby/object:Gem::Version
48
- version: 3.1.5
48
+ version: '0'
49
+ - !ruby/object:Gem::Dependency
50
+ name: em-synchrony
51
+ requirement: !ruby/object:Gem::Requirement
52
+ requirements:
53
+ - - ">="
54
+ - !ruby/object:Gem::Version
55
+ version: '0'
56
+ type: :development
57
+ prerelease: false
58
+ version_requirements: !ruby/object:Gem::Requirement
59
+ requirements:
60
+ - - ">="
61
+ - !ruby/object:Gem::Version
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,85 +96,6 @@ 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/client_test.rb
103
- - test/command_map_test.rb
104
- - test/commands_on_hashes_test.rb
105
- - test/commands_on_hyper_log_log_test.rb
106
- - test/commands_on_lists_test.rb
107
- - test/commands_on_sets_test.rb
108
- - test/commands_on_sorted_sets_test.rb
109
- - test/commands_on_strings_test.rb
110
- - test/commands_on_value_types_test.rb
111
- - test/connection_handling_test.rb
112
- - test/connection_test.rb
113
- - test/db/.gitkeep
114
- - test/distributed_blocking_commands_test.rb
115
- - test/distributed_commands_on_hashes_test.rb
116
- - test/distributed_commands_on_hyper_log_log_test.rb
117
- - test/distributed_commands_on_lists_test.rb
118
- - test/distributed_commands_on_sets_test.rb
119
- - test/distributed_commands_on_sorted_sets_test.rb
120
- - test/distributed_commands_on_strings_test.rb
121
- - test/distributed_commands_on_value_types_test.rb
122
- - test/distributed_commands_requiring_clustering_test.rb
123
- - test/distributed_connection_handling_test.rb
124
- - test/distributed_internals_test.rb
125
- - test/distributed_key_tags_test.rb
126
- - test/distributed_persistence_control_commands_test.rb
127
- - test/distributed_publish_subscribe_test.rb
128
- - test/distributed_remote_server_control_commands_test.rb
129
- - test/distributed_scripting_test.rb
130
- - test/distributed_sorting_test.rb
131
- - test/distributed_test.rb
132
- - test/distributed_transactions_test.rb
133
- - test/encoding_test.rb
134
- - test/error_replies_test.rb
135
- - test/fork_safety_test.rb
136
- - test/helper.rb
137
- - test/helper_test.rb
138
- - test/internals_test.rb
139
- - test/lint/blocking_commands.rb
140
- - test/lint/hashes.rb
141
- - test/lint/hyper_log_log.rb
142
- - test/lint/lists.rb
143
- - test/lint/sets.rb
144
- - test/lint/sorted_sets.rb
145
- - test/lint/strings.rb
146
- - test/lint/value_types.rb
147
- - test/persistence_control_commands_test.rb
148
- - test/pipelining_commands_test.rb
149
- - test/publish_subscribe_test.rb
150
- - test/remote_server_control_commands_test.rb
151
- - test/scanning_test.rb
152
- - test/scripting_test.rb
153
- - test/sentinel_command_test.rb
154
- - test/sentinel_test.rb
155
- - test/sorting_test.rb
156
- - test/ssl_test.rb
157
- - test/support/connection/hiredis.rb
158
- - test/support/connection/ruby.rb
159
- - test/support/connection/synchrony.rb
160
- - test/support/redis_mock.rb
161
- - test/support/ssl/gen_certs.sh
162
- - test/support/ssl/trusted-ca.crt
163
- - test/support/ssl/trusted-ca.key
164
- - test/support/ssl/trusted-cert.crt
165
- - test/support/ssl/trusted-cert.key
166
- - test/support/ssl/untrusted-ca.crt
167
- - test/support/ssl/untrusted-ca.key
168
- - test/support/ssl/untrusted-cert.crt
169
- - test/support/ssl/untrusted-cert.key
170
- - test/support/wire/synchrony.rb
171
- - test/support/wire/thread.rb
172
- - test/synchrony_driver.rb
173
- - test/test.conf.erb
174
- - test/thread_safety_test.rb
175
- - test/transactions_test.rb
176
- - test/unknown_commands_test.rb
177
- - test/url_param_test.rb
178
99
  homepage: https://github.com/redis/redis-rb
179
100
  licenses:
180
101
  - MIT
@@ -187,94 +108,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
187
108
  requirements:
188
109
  - - ">="
189
110
  - !ruby/object:Gem::Version
190
- version: '0'
111
+ version: 2.3.0
191
112
  required_rubygems_version: !ruby/object:Gem::Requirement
192
113
  requirements:
193
114
  - - ">="
194
115
  - !ruby/object:Gem::Version
195
116
  version: '0'
196
117
  requirements: []
197
- rubyforge_project:
198
- rubygems_version: 2.5.1
118
+ rubygems_version: 3.0.4
199
119
  signing_key:
200
120
  specification_version: 4
201
121
  summary: A Ruby client library for Redis
202
- test_files:
203
- - test/bitpos_test.rb
204
- - test/blocking_commands_test.rb
205
- - test/client_test.rb
206
- - test/command_map_test.rb
207
- - test/commands_on_hashes_test.rb
208
- - test/commands_on_hyper_log_log_test.rb
209
- - test/commands_on_lists_test.rb
210
- - test/commands_on_sets_test.rb
211
- - test/commands_on_sorted_sets_test.rb
212
- - test/commands_on_strings_test.rb
213
- - test/commands_on_value_types_test.rb
214
- - test/connection_handling_test.rb
215
- - test/connection_test.rb
216
- - test/db/.gitkeep
217
- - test/distributed_blocking_commands_test.rb
218
- - test/distributed_commands_on_hashes_test.rb
219
- - test/distributed_commands_on_hyper_log_log_test.rb
220
- - test/distributed_commands_on_lists_test.rb
221
- - test/distributed_commands_on_sets_test.rb
222
- - test/distributed_commands_on_sorted_sets_test.rb
223
- - test/distributed_commands_on_strings_test.rb
224
- - test/distributed_commands_on_value_types_test.rb
225
- - test/distributed_commands_requiring_clustering_test.rb
226
- - test/distributed_connection_handling_test.rb
227
- - test/distributed_internals_test.rb
228
- - test/distributed_key_tags_test.rb
229
- - test/distributed_persistence_control_commands_test.rb
230
- - test/distributed_publish_subscribe_test.rb
231
- - test/distributed_remote_server_control_commands_test.rb
232
- - test/distributed_scripting_test.rb
233
- - test/distributed_sorting_test.rb
234
- - test/distributed_test.rb
235
- - test/distributed_transactions_test.rb
236
- - test/encoding_test.rb
237
- - test/error_replies_test.rb
238
- - test/fork_safety_test.rb
239
- - test/helper.rb
240
- - test/helper_test.rb
241
- - test/internals_test.rb
242
- - test/lint/blocking_commands.rb
243
- - test/lint/hashes.rb
244
- - test/lint/hyper_log_log.rb
245
- - test/lint/lists.rb
246
- - test/lint/sets.rb
247
- - test/lint/sorted_sets.rb
248
- - test/lint/strings.rb
249
- - test/lint/value_types.rb
250
- - test/persistence_control_commands_test.rb
251
- - test/pipelining_commands_test.rb
252
- - test/publish_subscribe_test.rb
253
- - test/remote_server_control_commands_test.rb
254
- - test/scanning_test.rb
255
- - test/scripting_test.rb
256
- - test/sentinel_command_test.rb
257
- - test/sentinel_test.rb
258
- - test/sorting_test.rb
259
- - test/ssl_test.rb
260
- - test/support/connection/hiredis.rb
261
- - test/support/connection/ruby.rb
262
- - test/support/connection/synchrony.rb
263
- - test/support/redis_mock.rb
264
- - test/support/ssl/gen_certs.sh
265
- - test/support/ssl/trusted-ca.crt
266
- - test/support/ssl/trusted-ca.key
267
- - test/support/ssl/trusted-cert.crt
268
- - test/support/ssl/trusted-cert.key
269
- - test/support/ssl/untrusted-ca.crt
270
- - test/support/ssl/untrusted-ca.key
271
- - test/support/ssl/untrusted-cert.crt
272
- - test/support/ssl/untrusted-cert.key
273
- - test/support/wire/synchrony.rb
274
- - test/support/wire/thread.rb
275
- - test/synchrony_driver.rb
276
- - test/test.conf.erb
277
- - test/thread_safety_test.rb
278
- - test/transactions_test.rb
279
- - test/unknown_commands_test.rb
280
- - test/url_param_test.rb
122
+ test_files: []