redis-client 0.2.1 → 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (69) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +19 -0
  3. data/Gemfile +1 -2
  4. data/Gemfile.lock +2 -3
  5. data/README.md +71 -8
  6. data/Rakefile +43 -23
  7. data/lib/redis_client/command_builder.rb +91 -0
  8. data/lib/redis_client/config.rb +19 -50
  9. data/lib/redis_client/connection_mixin.rb +40 -0
  10. data/lib/redis_client/decorator.rb +84 -0
  11. data/lib/redis_client/pooled.rb +38 -30
  12. data/lib/redis_client/ruby_connection/buffered_io.rb +153 -0
  13. data/lib/redis_client/{resp3.rb → ruby_connection/resp3.rb} +0 -26
  14. data/lib/redis_client/{connection.rb → ruby_connection.rb} +26 -31
  15. data/lib/redis_client/version.rb +1 -1
  16. data/lib/redis_client.rb +183 -36
  17. data/redis-client.gemspec +2 -4
  18. metadata +12 -59
  19. data/.rubocop.yml +0 -190
  20. data/ext/redis_client/hiredis/export.clang +0 -2
  21. data/ext/redis_client/hiredis/export.gcc +0 -7
  22. data/ext/redis_client/hiredis/extconf.rb +0 -61
  23. data/ext/redis_client/hiredis/hiredis_connection.c +0 -708
  24. data/ext/redis_client/hiredis/vendor/.gitignore +0 -9
  25. data/ext/redis_client/hiredis/vendor/.travis.yml +0 -131
  26. data/ext/redis_client/hiredis/vendor/CHANGELOG.md +0 -364
  27. data/ext/redis_client/hiredis/vendor/CMakeLists.txt +0 -165
  28. data/ext/redis_client/hiredis/vendor/COPYING +0 -29
  29. data/ext/redis_client/hiredis/vendor/Makefile +0 -308
  30. data/ext/redis_client/hiredis/vendor/README.md +0 -664
  31. data/ext/redis_client/hiredis/vendor/adapters/ae.h +0 -130
  32. data/ext/redis_client/hiredis/vendor/adapters/glib.h +0 -156
  33. data/ext/redis_client/hiredis/vendor/adapters/ivykis.h +0 -84
  34. data/ext/redis_client/hiredis/vendor/adapters/libev.h +0 -179
  35. data/ext/redis_client/hiredis/vendor/adapters/libevent.h +0 -175
  36. data/ext/redis_client/hiredis/vendor/adapters/libuv.h +0 -117
  37. data/ext/redis_client/hiredis/vendor/adapters/macosx.h +0 -115
  38. data/ext/redis_client/hiredis/vendor/adapters/qt.h +0 -135
  39. data/ext/redis_client/hiredis/vendor/alloc.c +0 -86
  40. data/ext/redis_client/hiredis/vendor/alloc.h +0 -91
  41. data/ext/redis_client/hiredis/vendor/appveyor.yml +0 -24
  42. data/ext/redis_client/hiredis/vendor/async.c +0 -887
  43. data/ext/redis_client/hiredis/vendor/async.h +0 -147
  44. data/ext/redis_client/hiredis/vendor/async_private.h +0 -75
  45. data/ext/redis_client/hiredis/vendor/dict.c +0 -352
  46. data/ext/redis_client/hiredis/vendor/dict.h +0 -126
  47. data/ext/redis_client/hiredis/vendor/fmacros.h +0 -12
  48. data/ext/redis_client/hiredis/vendor/hiredis-config.cmake.in +0 -13
  49. data/ext/redis_client/hiredis/vendor/hiredis.c +0 -1174
  50. data/ext/redis_client/hiredis/vendor/hiredis.h +0 -336
  51. data/ext/redis_client/hiredis/vendor/hiredis.pc.in +0 -12
  52. data/ext/redis_client/hiredis/vendor/hiredis_ssl-config.cmake.in +0 -13
  53. data/ext/redis_client/hiredis/vendor/hiredis_ssl.h +0 -157
  54. data/ext/redis_client/hiredis/vendor/hiredis_ssl.pc.in +0 -12
  55. data/ext/redis_client/hiredis/vendor/net.c +0 -612
  56. data/ext/redis_client/hiredis/vendor/net.h +0 -56
  57. data/ext/redis_client/hiredis/vendor/read.c +0 -739
  58. data/ext/redis_client/hiredis/vendor/read.h +0 -129
  59. data/ext/redis_client/hiredis/vendor/sds.c +0 -1289
  60. data/ext/redis_client/hiredis/vendor/sds.h +0 -278
  61. data/ext/redis_client/hiredis/vendor/sdsalloc.h +0 -44
  62. data/ext/redis_client/hiredis/vendor/sockcompat.c +0 -248
  63. data/ext/redis_client/hiredis/vendor/sockcompat.h +0 -92
  64. data/ext/redis_client/hiredis/vendor/ssl.c +0 -544
  65. data/ext/redis_client/hiredis/vendor/test.c +0 -1401
  66. data/ext/redis_client/hiredis/vendor/test.sh +0 -78
  67. data/ext/redis_client/hiredis/vendor/win32.h +0 -56
  68. data/lib/redis_client/buffered_io.rb +0 -151
  69. data/lib/redis_client/hiredis_connection.rb +0 -80
data/lib/redis_client.rb CHANGED
@@ -1,12 +1,57 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require "set"
4
+
3
5
  require "redis_client/version"
6
+ require "redis_client/command_builder"
4
7
  require "redis_client/config"
5
8
  require "redis_client/sentinel_config"
6
- require "redis_client/connection"
7
9
  require "redis_client/middlewares"
8
10
 
9
11
  class RedisClient
12
+ @driver_definitions = {}
13
+ @drivers = {}
14
+
15
+ @default_driver = nil
16
+
17
+ class << self
18
+ def register_driver(name, &block)
19
+ @driver_definitions[name] = block
20
+ end
21
+
22
+ def driver(name)
23
+ return name if name.is_a?(Class)
24
+
25
+ name = name.to_sym
26
+ unless @driver_definitions.key?(name)
27
+ raise ArgumentError, "Unknown driver #{name.inspect}, expected one of: `#{@driver_definitions.keys.inspect}`"
28
+ end
29
+
30
+ @drivers[name] ||= @driver_definitions[name]&.call
31
+ end
32
+
33
+ def default_driver
34
+ unless @default_driver
35
+ @driver_definitions.each_key do |name|
36
+ if @default_driver = driver(name)
37
+ break
38
+ end
39
+ rescue LoadError
40
+ end
41
+ end
42
+ @default_driver
43
+ end
44
+
45
+ def default_driver=(name)
46
+ @default_driver = driver(name)
47
+ end
48
+ end
49
+
50
+ register_driver :ruby do
51
+ require "redis_client/ruby_connection"
52
+ RubyConnection
53
+ end
54
+
10
55
  module Common
11
56
  attr_reader :config, :id
12
57
  attr_accessor :connect_timeout, :read_timeout, :write_timeout
@@ -23,6 +68,7 @@ class RedisClient
23
68
  @connect_timeout = connect_timeout
24
69
  @read_timeout = read_timeout
25
70
  @write_timeout = write_timeout
71
+ @command_builder = config.command_builder
26
72
  end
27
73
 
28
74
  def timeout=(timeout)
@@ -32,6 +78,8 @@ class RedisClient
32
78
 
33
79
  Error = Class.new(StandardError)
34
80
 
81
+ UnsupportedServer = Class.new(Error)
82
+
35
83
  ConnectionError = Class.new(Error)
36
84
 
37
85
  FailoverError = Class.new(ConnectionError)
@@ -43,6 +91,8 @@ class RedisClient
43
91
  CheckoutTimeoutError = Class.new(ConnectTimeoutError)
44
92
 
45
93
  class CommandError < Error
94
+ attr_reader :command
95
+
46
96
  class << self
47
97
  def parse(error_message)
48
98
  code = error_message.split(' ', 2).first
@@ -50,14 +100,22 @@ class RedisClient
50
100
  klass.new(error_message)
51
101
  end
52
102
  end
103
+
104
+ def _set_command(command)
105
+ @command = command
106
+ end
53
107
  end
54
108
 
55
109
  AuthenticationError = Class.new(CommandError)
56
110
  PermissionError = Class.new(CommandError)
111
+ ReadOnlyError = Class.new(CommandError)
112
+ WrongTypeError = Class.new(CommandError)
57
113
 
58
114
  CommandError::ERRORS = {
59
115
  "WRONGPASS" => AuthenticationError,
60
116
  "NOPERM" => PermissionError,
117
+ "READONLY" => ReadOnlyError,
118
+ "WRONGTYPE" => WrongTypeError,
61
119
  }.freeze
62
120
 
63
121
  class << self
@@ -90,6 +148,11 @@ class RedisClient
90
148
  @disable_reconnection = false
91
149
  end
92
150
 
151
+ def inspect
152
+ id_string = " id=#{id}" if id
153
+ "#<#{self.class.name} #{config.server_url}#{id_string}>"
154
+ end
155
+
93
156
  def size
94
157
  1
95
158
  end
@@ -115,67 +178,89 @@ class RedisClient
115
178
  end
116
179
 
117
180
  def pubsub
118
- sub = PubSub.new(ensure_connected)
181
+ sub = PubSub.new(ensure_connected, @command_builder)
119
182
  @raw_connection = nil
120
183
  sub
121
184
  end
122
185
 
123
- def call(*command)
124
- command = RESP3.coerce_command!(command)
125
- ensure_connected do |connection|
186
+ def call(*command, **kwargs)
187
+ command = @command_builder.generate!(command, kwargs)
188
+ result = ensure_connected do |connection|
126
189
  Middlewares.call(command, config) do
127
190
  connection.call(command, nil)
128
191
  end
129
192
  end
193
+
194
+ if block_given?
195
+ yield result
196
+ else
197
+ result
198
+ end
130
199
  end
131
200
 
132
- def call_once(*command)
133
- command = RESP3.coerce_command!(command)
134
- ensure_connected(retryable: false) do |connection|
201
+ def call_once(*command, **kwargs)
202
+ command = @command_builder.generate!(command, kwargs)
203
+ result = ensure_connected(retryable: false) do |connection|
135
204
  Middlewares.call(command, config) do
136
205
  connection.call(command, nil)
137
206
  end
138
207
  end
208
+
209
+ if block_given?
210
+ yield result
211
+ else
212
+ result
213
+ end
139
214
  end
140
215
 
141
- def blocking_call(timeout, *command)
142
- command = RESP3.coerce_command!(command)
143
- ensure_connected do |connection|
216
+ def blocking_call(timeout, *command, **kwargs)
217
+ command = @command_builder.generate!(command, kwargs)
218
+ result = ensure_connected do |connection|
144
219
  Middlewares.call(command, config) do
145
220
  connection.call(command, timeout)
146
221
  end
147
222
  end
223
+
224
+ if block_given?
225
+ yield result
226
+ else
227
+ result
228
+ end
148
229
  end
149
230
 
150
- def scan(*args, &block)
231
+ def scan(*args, **kwargs, &block)
151
232
  unless block_given?
152
- return to_enum(__callee__, *args)
233
+ return to_enum(__callee__, *args, **kwargs)
153
234
  end
154
235
 
236
+ args = @command_builder.generate!(args, kwargs)
155
237
  scan_list(1, ["SCAN", 0, *args], &block)
156
238
  end
157
239
 
158
- def sscan(key, *args, &block)
240
+ def sscan(key, *args, **kwargs, &block)
159
241
  unless block_given?
160
- return to_enum(__callee__, key, *args)
242
+ return to_enum(__callee__, key, *args, **kwargs)
161
243
  end
162
244
 
245
+ args = @command_builder.generate!(args, kwargs)
163
246
  scan_list(2, ["SSCAN", key, 0, *args], &block)
164
247
  end
165
248
 
166
- def hscan(key, *args, &block)
249
+ def hscan(key, *args, **kwargs, &block)
167
250
  unless block_given?
168
- return to_enum(__callee__, key, *args)
251
+ return to_enum(__callee__, key, *args, **kwargs)
169
252
  end
170
253
 
254
+ args = @command_builder.generate!(args, kwargs)
171
255
  scan_pairs(2, ["HSCAN", key, 0, *args], &block)
172
256
  end
173
257
 
174
- def zscan(key, *args, &block)
258
+ def zscan(key, *args, **kwargs, &block)
175
259
  unless block_given?
176
- return to_enum(__callee__, key, *args)
260
+ return to_enum(__callee__, key, *args, **kwargs)
177
261
  end
178
262
 
263
+ args = @command_builder.generate!(args, kwargs)
179
264
  scan_pairs(2, ["ZSCAN", key, 0, *args], &block)
180
265
  end
181
266
 
@@ -190,23 +275,27 @@ class RedisClient
190
275
  end
191
276
 
192
277
  def pipelined
193
- pipeline = Pipeline.new
278
+ pipeline = Pipeline.new(@command_builder)
194
279
  yield pipeline
195
280
 
196
281
  if pipeline._size == 0
197
282
  []
198
283
  else
199
- ensure_connected(retryable: pipeline._retryable?) do |connection|
284
+ results = ensure_connected(retryable: pipeline._retryable?) do |connection|
200
285
  commands = pipeline._commands
201
286
  Middlewares.call_pipelined(commands, config) do
202
287
  connection.call_pipelined(commands, pipeline._timeouts)
203
288
  end
204
289
  end
290
+
291
+ pipeline._coerce!(results)
205
292
  end
206
293
  end
207
294
 
208
295
  def multi(watch: nil, &block)
209
- if watch
296
+ transaction = nil
297
+
298
+ results = if watch
210
299
  # WATCH is stateful, so we can't reconnect if it's used, the whole transaction
211
300
  # has to be redone.
212
301
  ensure_connected(retryable: false) do |connection|
@@ -214,7 +303,7 @@ class RedisClient
214
303
  begin
215
304
  if transaction = build_transaction(&block)
216
305
  commands = transaction._commands
217
- Middlewares.call_pipelined(commands, config) do
306
+ results = Middlewares.call_pipelined(commands, config) do
218
307
  connection.call_pipelined(commands, nil)
219
308
  end.last
220
309
  else
@@ -239,15 +328,22 @@ class RedisClient
239
328
  end
240
329
  end
241
330
  end
331
+
332
+ if transaction
333
+ transaction._coerce!(results)
334
+ else
335
+ results
336
+ end
242
337
  end
243
338
 
244
339
  class PubSub
245
- def initialize(raw_connection)
340
+ def initialize(raw_connection, command_builder)
246
341
  @raw_connection = raw_connection
342
+ @command_builder = command_builder
247
343
  end
248
344
 
249
- def call(*command)
250
- raw_connection.write(RESP3.coerce_command!(command))
345
+ def call(*command, **kwargs)
346
+ raw_connection.write(@command_builder.generate!(command, kwargs))
251
347
  nil
252
348
  end
253
349
 
@@ -273,20 +369,26 @@ class RedisClient
273
369
  end
274
370
 
275
371
  class Multi
276
- def initialize
372
+ def initialize(command_builder)
373
+ @command_builder = command_builder
277
374
  @size = 0
278
375
  @commands = []
376
+ @blocks = nil
279
377
  @retryable = true
280
378
  end
281
379
 
282
- def call(*command)
283
- @commands << RESP3.coerce_command!(command)
380
+ def call(*command, **kwargs, &block)
381
+ command = @command_builder.generate!(command, kwargs)
382
+ (@blocks ||= [])[@commands.size] = block if block_given?
383
+ @commands << command
284
384
  nil
285
385
  end
286
386
 
287
- def call_once(*command)
387
+ def call_once(*command, **kwargs)
388
+ command = @command_builder.generate!(command, kwargs)
288
389
  @retryable = false
289
- @commands << RESP3.coerce_command!(command)
390
+ (@blocks ||= [])[@commands.size] = block if block_given?
391
+ @commands << command
290
392
  nil
291
393
  end
292
394
 
@@ -294,6 +396,10 @@ class RedisClient
294
396
  @commands
295
397
  end
296
398
 
399
+ def _blocks
400
+ @blocks
401
+ end
402
+
297
403
  def _size
298
404
  @commands.size
299
405
  end
@@ -309,18 +415,39 @@ class RedisClient
309
415
  def _retryable?
310
416
  @retryable
311
417
  end
418
+
419
+ def _coerce!(results)
420
+ if results
421
+ results.each_with_index do |result, index|
422
+ if result.is_a?(CommandError)
423
+ result._set_command(@commands[index + 1])
424
+ raise result
425
+ end
426
+ end
427
+
428
+ @blocks&.each_with_index do |block, index|
429
+ if block
430
+ results[index - 1] = block.call(results[index - 1])
431
+ end
432
+ end
433
+ end
434
+
435
+ results
436
+ end
312
437
  end
313
438
 
314
439
  class Pipeline < Multi
315
- def initialize
440
+ def initialize(_command_builder)
316
441
  super
317
442
  @timeouts = nil
318
443
  end
319
444
 
320
- def blocking_call(timeout, *command)
445
+ def blocking_call(timeout, *command, **kwargs)
446
+ command = @command_builder.generate!(command, kwargs)
321
447
  @timeouts ||= []
322
448
  @timeouts[@commands.size] = timeout
323
- @commands << RESP3.coerce_command!(command)
449
+ (@blocks ||= [])[@commands.size] = block if block_given?
450
+ @commands << command
324
451
  nil
325
452
  end
326
453
 
@@ -331,12 +458,24 @@ class RedisClient
331
458
  def _empty?
332
459
  @commands.empty?
333
460
  end
461
+
462
+ def _coerce!(results)
463
+ return results unless results
464
+
465
+ @blocks&.each_with_index do |block, index|
466
+ if block
467
+ results[index] = block.call(results[index])
468
+ end
469
+ end
470
+
471
+ results
472
+ end
334
473
  end
335
474
 
336
475
  private
337
476
 
338
477
  def build_transaction
339
- transaction = Multi.new
478
+ transaction = Multi.new(@command_builder)
340
479
  transaction.call("MULTI")
341
480
  yield transaction
342
481
  transaction.call("EXEC")
@@ -433,8 +572,16 @@ class RedisClient
433
572
  end
434
573
 
435
574
  connection
575
+ rescue CommandError => error
576
+ if error.message.include?("ERR unknown command `HELLO`")
577
+ raise UnsupportedServer,
578
+ "Your Redis server version is too old. redis-client requires Redis 6+. (#{config.server_url})"
579
+ else
580
+ raise
581
+ end
436
582
  end
437
583
  end
438
584
 
439
- require "redis_client/resp3"
440
585
  require "redis_client/pooled"
586
+
587
+ RedisClient.default_driver
data/redis-client.gemspec CHANGED
@@ -10,6 +10,7 @@ Gem::Specification.new do |spec|
10
10
 
11
11
  spec.summary = "Simple low-level client for Redis 6+"
12
12
  spec.homepage = "https://github.com/redis-rb/redis-client"
13
+ spec.license = "MIT"
13
14
  spec.required_ruby_version = ">= 2.5.0"
14
15
 
15
16
  spec.metadata["allowed_push_host"] = "https://rubygems.org"
@@ -22,13 +23,10 @@ Gem::Specification.new do |spec|
22
23
  # The `git ls-files -z` loads the files in the RubyGem that have been added into git.
23
24
  spec.files = Dir.chdir(File.expand_path(__dir__)) do
24
25
  `git ls-files -z`.split("\x0").reject do |f|
25
- (f == __FILE__) || f.match(%r{\A(?:(?:bin|test|spec|features|benchmark)/|\.(?:git|travis|circleci)|appveyor)})
26
+ (f == __FILE__) || f.match(%r{\A(?:(?:bin|hiredis-client|test|spec|features|benchmark)/|\.(?:git|rubocop))})
26
27
  end
27
28
  end
28
- spec.bindir = "exe"
29
- spec.executables = spec.files.grep(%r{\Aexe/}) { |f| File.basename(f) }
30
29
  spec.require_paths = ["lib"]
31
- spec.extensions = ["ext/redis_client/hiredis/extconf.rb"]
32
30
 
33
31
  spec.add_runtime_dependency "connection_pool"
34
32
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: redis-client
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.1
4
+ version: 0.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jean Boussier
8
8
  autorequire:
9
- bindir: exe
9
+ bindir: bin
10
10
  cert_chain: []
11
- date: 2022-04-29 00:00:00.000000000 Z
11
+ date: 2022-06-02 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: connection_pool
@@ -28,79 +28,32 @@ description:
28
28
  email:
29
29
  - jean.boussier@gmail.com
30
30
  executables: []
31
- extensions:
32
- - ext/redis_client/hiredis/extconf.rb
31
+ extensions: []
33
32
  extra_rdoc_files: []
34
33
  files:
35
- - ".rubocop.yml"
36
34
  - CHANGELOG.md
37
35
  - Gemfile
38
36
  - Gemfile.lock
39
37
  - LICENSE.md
40
38
  - README.md
41
39
  - Rakefile
42
- - ext/redis_client/hiredis/export.clang
43
- - ext/redis_client/hiredis/export.gcc
44
- - ext/redis_client/hiredis/extconf.rb
45
- - ext/redis_client/hiredis/hiredis_connection.c
46
- - ext/redis_client/hiredis/vendor/.gitignore
47
- - ext/redis_client/hiredis/vendor/.travis.yml
48
- - ext/redis_client/hiredis/vendor/CHANGELOG.md
49
- - ext/redis_client/hiredis/vendor/CMakeLists.txt
50
- - ext/redis_client/hiredis/vendor/COPYING
51
- - ext/redis_client/hiredis/vendor/Makefile
52
- - ext/redis_client/hiredis/vendor/README.md
53
- - ext/redis_client/hiredis/vendor/adapters/ae.h
54
- - ext/redis_client/hiredis/vendor/adapters/glib.h
55
- - ext/redis_client/hiredis/vendor/adapters/ivykis.h
56
- - ext/redis_client/hiredis/vendor/adapters/libev.h
57
- - ext/redis_client/hiredis/vendor/adapters/libevent.h
58
- - ext/redis_client/hiredis/vendor/adapters/libuv.h
59
- - ext/redis_client/hiredis/vendor/adapters/macosx.h
60
- - ext/redis_client/hiredis/vendor/adapters/qt.h
61
- - ext/redis_client/hiredis/vendor/alloc.c
62
- - ext/redis_client/hiredis/vendor/alloc.h
63
- - ext/redis_client/hiredis/vendor/appveyor.yml
64
- - ext/redis_client/hiredis/vendor/async.c
65
- - ext/redis_client/hiredis/vendor/async.h
66
- - ext/redis_client/hiredis/vendor/async_private.h
67
- - ext/redis_client/hiredis/vendor/dict.c
68
- - ext/redis_client/hiredis/vendor/dict.h
69
- - ext/redis_client/hiredis/vendor/fmacros.h
70
- - ext/redis_client/hiredis/vendor/hiredis-config.cmake.in
71
- - ext/redis_client/hiredis/vendor/hiredis.c
72
- - ext/redis_client/hiredis/vendor/hiredis.h
73
- - ext/redis_client/hiredis/vendor/hiredis.pc.in
74
- - ext/redis_client/hiredis/vendor/hiredis_ssl-config.cmake.in
75
- - ext/redis_client/hiredis/vendor/hiredis_ssl.h
76
- - ext/redis_client/hiredis/vendor/hiredis_ssl.pc.in
77
- - ext/redis_client/hiredis/vendor/net.c
78
- - ext/redis_client/hiredis/vendor/net.h
79
- - ext/redis_client/hiredis/vendor/read.c
80
- - ext/redis_client/hiredis/vendor/read.h
81
- - ext/redis_client/hiredis/vendor/sds.c
82
- - ext/redis_client/hiredis/vendor/sds.h
83
- - ext/redis_client/hiredis/vendor/sdsalloc.h
84
- - ext/redis_client/hiredis/vendor/sockcompat.c
85
- - ext/redis_client/hiredis/vendor/sockcompat.h
86
- - ext/redis_client/hiredis/vendor/ssl.c
87
- - ext/redis_client/hiredis/vendor/test.c
88
- - ext/redis_client/hiredis/vendor/test.sh
89
- - ext/redis_client/hiredis/vendor/win32.h
90
40
  - lib/redis-client.rb
91
41
  - lib/redis_client.rb
92
- - lib/redis_client/buffered_io.rb
42
+ - lib/redis_client/command_builder.rb
93
43
  - lib/redis_client/config.rb
94
- - lib/redis_client/connection.rb
95
- - lib/redis_client/hiredis_connection.rb
44
+ - lib/redis_client/connection_mixin.rb
45
+ - lib/redis_client/decorator.rb
96
46
  - lib/redis_client/middlewares.rb
97
47
  - lib/redis_client/pooled.rb
98
- - lib/redis_client/resp3.rb
48
+ - lib/redis_client/ruby_connection.rb
49
+ - lib/redis_client/ruby_connection/buffered_io.rb
50
+ - lib/redis_client/ruby_connection/resp3.rb
99
51
  - lib/redis_client/sentinel_config.rb
100
52
  - lib/redis_client/version.rb
101
53
  - redis-client.gemspec
102
54
  homepage: https://github.com/redis-rb/redis-client
103
- licenses: []
55
+ licenses:
56
+ - MIT
104
57
  metadata:
105
58
  allowed_push_host: https://rubygems.org
106
59
  homepage_uri: https://github.com/redis-rb/redis-client