redis-client 0.3.0 → 0.5.1

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 (63) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +17 -0
  3. data/Gemfile +1 -2
  4. data/Gemfile.lock +1 -2
  5. data/README.md +13 -17
  6. data/Rakefile +41 -22
  7. data/lib/redis_client/command_builder.rb +8 -0
  8. data/lib/redis_client/config.rb +13 -5
  9. data/lib/redis_client/connection_mixin.rb +2 -0
  10. data/lib/redis_client/version.rb +1 -1
  11. data/lib/redis_client.rb +31 -15
  12. data/redis-client.gemspec +2 -4
  13. metadata +6 -56
  14. data/.rubocop.yml +0 -191
  15. data/ext/redis_client/hiredis/export.clang +0 -2
  16. data/ext/redis_client/hiredis/export.gcc +0 -7
  17. data/ext/redis_client/hiredis/extconf.rb +0 -69
  18. data/ext/redis_client/hiredis/hiredis_connection.c +0 -708
  19. data/ext/redis_client/hiredis/vendor/.gitignore +0 -9
  20. data/ext/redis_client/hiredis/vendor/.travis.yml +0 -131
  21. data/ext/redis_client/hiredis/vendor/CHANGELOG.md +0 -364
  22. data/ext/redis_client/hiredis/vendor/CMakeLists.txt +0 -165
  23. data/ext/redis_client/hiredis/vendor/COPYING +0 -29
  24. data/ext/redis_client/hiredis/vendor/Makefile +0 -308
  25. data/ext/redis_client/hiredis/vendor/README.md +0 -664
  26. data/ext/redis_client/hiredis/vendor/adapters/ae.h +0 -130
  27. data/ext/redis_client/hiredis/vendor/adapters/glib.h +0 -156
  28. data/ext/redis_client/hiredis/vendor/adapters/ivykis.h +0 -84
  29. data/ext/redis_client/hiredis/vendor/adapters/libev.h +0 -179
  30. data/ext/redis_client/hiredis/vendor/adapters/libevent.h +0 -175
  31. data/ext/redis_client/hiredis/vendor/adapters/libuv.h +0 -117
  32. data/ext/redis_client/hiredis/vendor/adapters/macosx.h +0 -115
  33. data/ext/redis_client/hiredis/vendor/adapters/qt.h +0 -135
  34. data/ext/redis_client/hiredis/vendor/alloc.c +0 -86
  35. data/ext/redis_client/hiredis/vendor/alloc.h +0 -91
  36. data/ext/redis_client/hiredis/vendor/appveyor.yml +0 -24
  37. data/ext/redis_client/hiredis/vendor/async.c +0 -887
  38. data/ext/redis_client/hiredis/vendor/async.h +0 -147
  39. data/ext/redis_client/hiredis/vendor/async_private.h +0 -75
  40. data/ext/redis_client/hiredis/vendor/dict.c +0 -352
  41. data/ext/redis_client/hiredis/vendor/dict.h +0 -126
  42. data/ext/redis_client/hiredis/vendor/fmacros.h +0 -12
  43. data/ext/redis_client/hiredis/vendor/hiredis-config.cmake.in +0 -13
  44. data/ext/redis_client/hiredis/vendor/hiredis.c +0 -1174
  45. data/ext/redis_client/hiredis/vendor/hiredis.h +0 -336
  46. data/ext/redis_client/hiredis/vendor/hiredis.pc.in +0 -12
  47. data/ext/redis_client/hiredis/vendor/hiredis_ssl-config.cmake.in +0 -13
  48. data/ext/redis_client/hiredis/vendor/hiredis_ssl.h +0 -157
  49. data/ext/redis_client/hiredis/vendor/hiredis_ssl.pc.in +0 -12
  50. data/ext/redis_client/hiredis/vendor/net.c +0 -612
  51. data/ext/redis_client/hiredis/vendor/net.h +0 -56
  52. data/ext/redis_client/hiredis/vendor/read.c +0 -739
  53. data/ext/redis_client/hiredis/vendor/read.h +0 -129
  54. data/ext/redis_client/hiredis/vendor/sds.c +0 -1289
  55. data/ext/redis_client/hiredis/vendor/sds.h +0 -278
  56. data/ext/redis_client/hiredis/vendor/sdsalloc.h +0 -44
  57. data/ext/redis_client/hiredis/vendor/sockcompat.c +0 -248
  58. data/ext/redis_client/hiredis/vendor/sockcompat.h +0 -92
  59. data/ext/redis_client/hiredis/vendor/ssl.c +0 -544
  60. data/ext/redis_client/hiredis/vendor/test.c +0 -1401
  61. data/ext/redis_client/hiredis/vendor/test.sh +0 -78
  62. data/ext/redis_client/hiredis/vendor/win32.h +0 -56
  63. data/lib/redis_client/hiredis_connection.rb +0 -93
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: '097ad5acec4f5ea01788629c3fe2c606e54c1a2a0749c4e489487cf6bd446eae'
4
- data.tar.gz: 275d778806cb7848d99ddcba33f1e932853efc9f0d149d6409692d1b39452d86
3
+ metadata.gz: b23930fc431afe23313aca3ef90ba49f219a6ed1a50f8153075a09b4c43678c0
4
+ data.tar.gz: 502388c79068a1dfe166543a6eb91cead665f42e404f679a598f5a8e2844ee82
5
5
  SHA512:
6
- metadata.gz: c553d706fe8b955a0c6b65a28e9d6a1ddcdec156a562ec5092396a0bca9fa72a251441b8675484fff2d4db3d8e2f335043d226bb4c9c3359e84acc9b7605543f
7
- data.tar.gz: 68dcc5d81b1632dd60d22651d0ef600903fe607230d3ac396d5e98aab7694d374d5e577777234d7e514fc4df04b332e0fdb31b3c9971fb116c6b0e87c1ddc5f5
6
+ metadata.gz: 9f6d4422b8c3e6608a5a8c53a55335ad0c44c034bc2cf26c7b5aace8dfdbe799409dd9783bd5928da3453d60ed28579594676f95c951a6a4dfff5e04dd09d28d
7
+ data.tar.gz: 3ee257ab6d509606c959079a16886389d76bfe232876aba9de1ae8922031746ad2576224fc5b0fae44a09ef13ba4d14ea862098860f923f432f63454499c1677
data/CHANGELOG.md CHANGED
@@ -1,5 +1,22 @@
1
1
  # Unreleased
2
2
 
3
+ # 0.5.1
4
+
5
+ - Fix a regression in the `scan` familly of methods, they would raise with `ArgumentError: can't issue an empty redis command`. Fix: #24
6
+
7
+ # 0.5.0
8
+
9
+ - Fix handling of connection URLs with empty passwords (`redis://:pass@example.com`).
10
+ - Handle URLs with IPv6 hosts.
11
+ - Add `RedisClient::Config#server_url` as a quick way to identify which server the client is pointing to.
12
+ - Add `CommandError#command` to expose the command that caused the error.
13
+ - Raise a more explicit error when connecting to older redises without RESP3 support (5.0 and older).
14
+ - Properly reject empty commands early.
15
+
16
+ # 0.4.0
17
+
18
+ - The `hiredis` driver have been moved to the `hiredis-client` gem.
19
+
3
20
  # 0.3.0
4
21
 
5
22
  - `hiredis` is now the default driver when available.
data/Gemfile CHANGED
@@ -3,9 +3,8 @@
3
3
  source "https://rubygems.org"
4
4
 
5
5
  # Specify your gem's dependencies in redis-client.gemspec
6
- gemspec
6
+ gemspec name: "redis-client"
7
7
 
8
- gem "connection_pool"
9
8
  gem "minitest"
10
9
  gem "rake", "~> 13.0"
11
10
  gem "rake-compiler"
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- redis-client (0.3.0)
4
+ redis-client (0.5.1)
5
5
  connection_pool
6
6
 
7
7
  GEM
@@ -51,7 +51,6 @@ PLATFORMS
51
51
  DEPENDENCIES
52
52
  benchmark-ips
53
53
  byebug
54
- connection_pool
55
54
  hiredis
56
55
  minitest
57
56
  rake (~> 13.0)
data/README.md CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  `redis-client` is a simple, low-level, client for Redis 6+.
4
4
 
5
- Contrary to the `redis` gem, `redis-client` doesn't try to map all redis commands to Ruby constructs,
5
+ Contrary to the `redis` gem, `redis-client` doesn't try to map all Redis commands to Ruby constructs,
6
6
  it merely is a thin wrapper on top of the RESP3 protocol.
7
7
 
8
8
  ## Installation
@@ -63,7 +63,7 @@ redis.call("GET", "mykey")
63
63
  ### Configuration
64
64
 
65
65
  - `url`: A Redis connection URL, e.g. `redis://example.com:6379/5`, a `rediss://` scheme enable SSL, and the path is interpreted as a database number.
66
- Note tht all other configurtions take precedence, e.g. `RedisClient.config(url: "redis://localhost:3000" port: 6380)` will connect on port `6380`.
66
+ Note that all other configurations take precedence, e.g. `RedisClient.config(url: "redis://localhost:3000" port: 6380)` will connect on port `6380`.
67
67
  - `host`: The server hostname or IP address. Defaults to `"localhost"`.
68
68
  - `port`: The server port. Defaults to `6379`.
69
69
  - `path`: The path to a UNIX socket, if set `url`, `host` and `port` are ignored.
@@ -142,7 +142,7 @@ is equivalent to:
142
142
  redis.call("LPUSH", "list", "1", "2", "3", "4")
143
143
  ```
144
144
 
145
- Hashes are flatenned as well:
145
+ Hashes are flattened as well:
146
146
 
147
147
  ```ruby
148
148
  redis.call("HMSET", "hash", { "foo" => "1", "bar" => "2" })
@@ -154,7 +154,7 @@ is equivalent to:
154
154
  redis.call("HMSET", "hash", "foo", "1", "bar", "2")
155
155
  ```
156
156
 
157
- Any other type requires the caller to explictly cast the argument as a string.
157
+ Any other type requires the caller to explicitly cast the argument as a string.
158
158
 
159
159
  Keywords arguments are treated as Redis command flags:
160
160
 
@@ -170,7 +170,7 @@ redis.call("SET", "mykey", "value", "nx", "ex", "60")
170
170
  redis.call("SET", "mykey", "value")
171
171
  ```
172
172
 
173
- If flags are built dynamically, you'll have to explictly pass them as keyword arguments with `**`:
173
+ If flags are built dynamically, you'll have to explicitly pass them as keyword arguments with `**`:
174
174
 
175
175
  ```ruby
176
176
  flags = {}
@@ -185,7 +185,7 @@ unclosed hash literals with string keys may be interpreted differently:
185
185
  redis.call("HMSET", "hash", "foo" => "bar")
186
186
  ```
187
187
 
188
- On Ruby 2 `"foo" => "bar"` will be passed as a postional argument, but on Ruby 3 it will be interpreted as keyword
188
+ On Ruby 2 `"foo" => "bar"` will be passed as a positional argument, but on Ruby 3 it will be interpreted as keyword
189
189
  arguments. To avoid such problem, make sure to enclose hash literals:
190
190
 
191
191
  ```ruby
@@ -196,7 +196,7 @@ redis.call("HMSET", "hash", { "foo" => "bar" })
196
196
 
197
197
  Contrary to the `redis` gem, `redis-client` doesn't do any type casting on the return value of commands.
198
198
 
199
- If you wish to cast the return value, you can pass a block to the `#call` familly of methods:
199
+ If you wish to cast the return value, you can pass a block to the `#call` family of methods:
200
200
 
201
201
  ```ruby
202
202
  redis.call("INCR", "counter") # => 1
@@ -297,7 +297,7 @@ end
297
297
 
298
298
  If the transaction wasn't successful, `#multi` will return `nil`.
299
299
 
300
- Note that transactions using optimistic locking aren't automatically retried uppon connection errors.
300
+ Note that transactions using optimistic locking aren't automatically retried upon connection errors.
301
301
 
302
302
  ### Publish / Subscribe
303
303
 
@@ -389,21 +389,17 @@ redis.call_once("INCR", "counter") # Won't be retried.
389
389
 
390
390
  ### Drivers
391
391
 
392
- `redis-client` ships with two connection implementations, a `hiredis` binding and a pure Ruby implementation.
392
+ `redis-client` ships with a pure Ruby socket implementation.
393
393
 
394
- The hiredis binding is only available on Linux, macOS and other POSIX platforms. When available it is the default.
395
-
396
- The default driver can be set through `RedisClient.default_driver=`:
394
+ For increased performance, you can enable the `hiredis` binding by adding `hiredis-client` to your Gemfile:
397
395
 
398
396
  ```ruby
399
- RedisClient.default_driver = :ruby
397
+ gem "hiredis-client"
400
398
  ```
401
399
 
402
- You can also select the driver on a per connection basis:
400
+ The hiredis binding is only available on Linux, macOS and other POSIX platforms. You can install the gem on other platforms, but it won't have any effect.
403
401
 
404
- ```ruby
405
- redis_config = RedisClient.config(driver: :ruby, ...)
406
- ```
402
+ The default driver can be set through `RedisClient.default_driver=`:
407
403
 
408
404
  ## Notable differences with the `redis` gem
409
405
 
data/Rakefile CHANGED
@@ -1,34 +1,53 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "bundler/gem_tasks"
4
3
  require "rake/extensiontask"
5
4
  require "rake/testtask"
6
5
  require 'rubocop/rake_task'
7
6
 
8
7
  RuboCop::RakeTask.new
9
8
 
9
+ require "rake/clean"
10
+ CLOBBER.include "pkg"
11
+ require "bundler/gem_helper"
12
+ Bundler::GemHelper.install_tasks(name: "redis-client")
13
+ Bundler::GemHelper.install_tasks(dir: "hiredis-client", name: "hiredis-client")
14
+
10
15
  gemspec = Gem::Specification.load("redis-client.gemspec")
11
16
  Rake::ExtensionTask.new do |ext|
12
17
  ext.name = "hiredis_connection"
13
- ext.ext_dir = "ext/redis_client/hiredis"
14
- ext.lib_dir = "lib/redis_client"
18
+ ext.ext_dir = "hiredis-client/ext/redis_client/hiredis"
19
+ ext.lib_dir = "hiredis-client/lib/redis_client"
15
20
  ext.gem_spec = gemspec
16
21
  CLEAN.add("#{ext.ext_dir}/vendor/*.{a,o}")
17
22
  end
18
23
 
19
- Rake::TestTask.new(:test) do |t|
20
- t.libs << "test"
21
- t.libs << "lib"
22
- t.test_files = FileList["test/**/*_test.rb"].exclude("test/sentinel/*_test.rb")
23
- end
24
-
25
24
  namespace :test do
25
+ Rake::TestTask.new(:ruby) do |t|
26
+ t.libs << "test"
27
+ t.libs << "lib"
28
+ t.test_files = FileList["test/**/*_test.rb"].exclude("test/sentinel/*_test.rb")
29
+ end
30
+
26
31
  Rake::TestTask.new(:sentinel) do |t|
27
32
  t.libs << "test/sentinel"
28
33
  t.libs << "test"
29
34
  t.libs << "lib"
30
35
  t.test_files = FileList["test/sentinel/*_test.rb"]
31
36
  end
37
+
38
+ Rake::TestTask.new(:hiredis) do |t|
39
+ t.libs << "test/hiredis"
40
+ t.libs << "test"
41
+ t.libs << "lib"
42
+ t.test_files = FileList["test/**/*_test.rb"].exclude("test/sentinel/*_test.rb")
43
+ end
44
+ end
45
+
46
+ hiredis_supported = RUBY_ENGINE == "ruby" && !RUBY_PLATFORM.match?(/mswin/)
47
+ if hiredis_supported
48
+ task test: %i[test:ruby test:hiredis test:sentinel]
49
+ else
50
+ task test: %i[test:ruby test:sentinel]
32
51
  end
33
52
 
34
53
  namespace :hiredis do
@@ -37,10 +56,14 @@ namespace :hiredis do
37
56
  archive_path = "tmp/hiredis-#{version}.tar.gz"
38
57
  url = "https://github.com/redis/hiredis/archive/refs/tags/v#{version}.tar.gz"
39
58
  system("curl", "-L", url, out: archive_path) or raise "Downloading of #{url} failed"
40
- system("rm", "-rf", "ext/redis_client/hiredis/vendor/")
41
- system("mkdir", "-p", "ext/redis_client/hiredis/vendor/")
42
- system("tar", "xvzf", archive_path, "-C", "ext/redis_client/hiredis/vendor", "--strip-components", "1")
43
- system("rm", "-rf", "ext/redis_client/hiredis/vendor/examples")
59
+ system("rm", "-rf", "hiredis-client/ext/redis_client/hiredis/vendor/")
60
+ system("mkdir", "-p", "hiredis-client/ext/redis_client/hiredis/vendor/")
61
+ system(
62
+ "tar", "xvzf", archive_path,
63
+ "-C", "hiredis-client/ext/redis_client/hiredis/vendor",
64
+ "--strip-components", "1",
65
+ )
66
+ system("rm", "-rf", "hiredis-client/ext/redis_client/hiredis/vendor/examples")
44
67
  end
45
68
  end
46
69
 
@@ -82,14 +105,10 @@ namespace :benchmark do
82
105
  end
83
106
  end
84
107
 
85
- if RUBY_PLATFORM == "java"
86
- task default: %i[test test:sentinel rubocop]
87
- else
88
- task default: %i[compile test test:sentinel rubocop]
89
- end
90
-
91
- if ENV["DRIVER"] == "hiredis"
92
- task ci: %i[compile test test:sentinel]
108
+ if hiredis_supported
109
+ task default: %i[compile test rubocop]
110
+ task ci: %i[compile test]
93
111
  else
94
- task ci: %i[test test:sentinel]
112
+ task default: %i[test rubocop]
113
+ task ci: %i[test]
95
114
  end
@@ -40,6 +40,10 @@ class RedisClient
40
40
  end
41
41
  end
42
42
 
43
+ if command.empty?
44
+ raise ArgumentError, "can't issue an empty redis command"
45
+ end
46
+
43
47
  command
44
48
  end
45
49
  else
@@ -76,6 +80,10 @@ class RedisClient
76
80
  end
77
81
  end
78
82
 
83
+ if command.empty?
84
+ raise ArgumentError, "can't issue an empty redis command"
85
+ end
86
+
79
87
  command
80
88
  end
81
89
  end
@@ -82,6 +82,14 @@ class RedisClient
82
82
  @ssl_context ||= @driver.ssl_context(@ssl_params)
83
83
  end
84
84
 
85
+ def server_url
86
+ if path
87
+ "#{path}/#{db}"
88
+ else
89
+ "redis#{'s' if ssl?}://#{host}:#{port}/#{db}"
90
+ end
91
+ end
92
+
85
93
  private
86
94
 
87
95
  def build_connection_prelude
@@ -110,15 +118,15 @@ class RedisClient
110
118
  path: nil,
111
119
  **kwargs
112
120
  )
113
- uri = url && URI.parse(url)
114
- if uri
121
+ if url
122
+ uri = URI.parse(url)
115
123
  kwargs[:ssl] = uri.scheme == "rediss" unless kwargs.key?(:ssl)
116
124
 
117
- kwargs[:username] ||= uri.user && uri.password
125
+ kwargs[:username] ||= uri.user if uri.password && !uri.user.empty?
118
126
 
119
127
  kwargs[:password] ||= if uri.user && !uri.password
120
128
  URI.decode_www_form_component(uri.user)
121
- elsif uri&.user && uri&.password
129
+ elsif uri.user && uri.password
122
130
  URI.decode_www_form_component(uri.password)
123
131
  end
124
132
 
@@ -127,7 +135,7 @@ class RedisClient
127
135
 
128
136
  super(**kwargs)
129
137
 
130
- @host = host || uri&.host || DEFAULT_HOST
138
+ @host = host || uri&.host&.sub(/\A\[(.*)\]\z/, '\1') || DEFAULT_HOST
131
139
  @port = port || uri&.port || DEFAULT_PORT
132
140
  @path = path
133
141
  end
@@ -6,6 +6,7 @@ class RedisClient
6
6
  write(command)
7
7
  result = read(timeout)
8
8
  if result.is_a?(CommandError)
9
+ result._set_command(command)
9
10
  raise result
10
11
  else
11
12
  result
@@ -23,6 +24,7 @@ class RedisClient
23
24
  timeout = timeouts && timeouts[index]
24
25
  result = read(timeout)
25
26
  if result.is_a?(CommandError)
27
+ result._set_command(commands[index])
26
28
  exception ||= result
27
29
  end
28
30
  results[index] = result
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  class RedisClient
4
- VERSION = "0.3.0"
4
+ VERSION = "0.5.1"
5
5
  end
data/lib/redis_client.rb CHANGED
@@ -24,7 +24,7 @@ class RedisClient
24
24
 
25
25
  name = name.to_sym
26
26
  unless @driver_definitions.key?(name)
27
- raise ArgumentError, "Unknown driver #{name.inspect}, expected one of: `#{DRIVER_DEFINITIONS.keys.inspect}`"
27
+ raise ArgumentError, "Unknown driver #{name.inspect}, expected one of: `#{@driver_definitions.keys.inspect}`"
28
28
  end
29
29
 
30
30
  @drivers[name] ||= @driver_definitions[name]&.call
@@ -47,11 +47,6 @@ class RedisClient
47
47
  end
48
48
  end
49
49
 
50
- register_driver :hiredis do
51
- require "redis_client/hiredis_connection"
52
- HiredisConnection
53
- end
54
-
55
50
  register_driver :ruby do
56
51
  require "redis_client/ruby_connection"
57
52
  RubyConnection
@@ -83,6 +78,8 @@ class RedisClient
83
78
 
84
79
  Error = Class.new(StandardError)
85
80
 
81
+ UnsupportedServer = Class.new(Error)
82
+
86
83
  ConnectionError = Class.new(Error)
87
84
 
88
85
  FailoverError = Class.new(ConnectionError)
@@ -94,6 +91,8 @@ class RedisClient
94
91
  CheckoutTimeoutError = Class.new(ConnectTimeoutError)
95
92
 
96
93
  class CommandError < Error
94
+ attr_reader :command
95
+
97
96
  class << self
98
97
  def parse(error_message)
99
98
  code = error_message.split(' ', 2).first
@@ -101,6 +100,10 @@ class RedisClient
101
100
  klass.new(error_message)
102
101
  end
103
102
  end
103
+
104
+ def _set_command(command)
105
+ @command = command
106
+ end
104
107
  end
105
108
 
106
109
  AuthenticationError = Class.new(CommandError)
@@ -145,6 +148,11 @@ class RedisClient
145
148
  @disable_reconnection = false
146
149
  end
147
150
 
151
+ def inspect
152
+ id_string = " id=#{id}" if id
153
+ "#<#{self.class.name} #{config.server_url}#{id_string}>"
154
+ end
155
+
148
156
  def size
149
157
  1
150
158
  end
@@ -225,8 +233,8 @@ class RedisClient
225
233
  return to_enum(__callee__, *args, **kwargs)
226
234
  end
227
235
 
228
- args = @command_builder.generate!(args, kwargs)
229
- scan_list(1, ["SCAN", 0, *args], &block)
236
+ args = @command_builder.generate!(["SCAN", 0] + args, kwargs)
237
+ scan_list(1, args, &block)
230
238
  end
231
239
 
232
240
  def sscan(key, *args, **kwargs, &block)
@@ -234,8 +242,8 @@ class RedisClient
234
242
  return to_enum(__callee__, key, *args, **kwargs)
235
243
  end
236
244
 
237
- args = @command_builder.generate!(args, kwargs)
238
- scan_list(2, ["SSCAN", key, 0, *args], &block)
245
+ args = @command_builder.generate!(["SSCAN", key, 0] + args, kwargs)
246
+ scan_list(2, args, &block)
239
247
  end
240
248
 
241
249
  def hscan(key, *args, **kwargs, &block)
@@ -243,8 +251,8 @@ class RedisClient
243
251
  return to_enum(__callee__, key, *args, **kwargs)
244
252
  end
245
253
 
246
- args = @command_builder.generate!(args, kwargs)
247
- scan_pairs(2, ["HSCAN", key, 0, *args], &block)
254
+ args = @command_builder.generate!(["HSCAN", key, 0] + args, kwargs)
255
+ scan_pairs(2, args, &block)
248
256
  end
249
257
 
250
258
  def zscan(key, *args, **kwargs, &block)
@@ -252,8 +260,8 @@ class RedisClient
252
260
  return to_enum(__callee__, key, *args, **kwargs)
253
261
  end
254
262
 
255
- args = @command_builder.generate!(args, kwargs)
256
- scan_pairs(2, ["ZSCAN", key, 0, *args], &block)
263
+ args = @command_builder.generate!(["ZSCAN", key, 0] + args, kwargs)
264
+ scan_pairs(2, args, &block)
257
265
  end
258
266
 
259
267
  def connected?
@@ -410,8 +418,9 @@ class RedisClient
410
418
 
411
419
  def _coerce!(results)
412
420
  if results
413
- results.each do |result|
421
+ results.each_with_index do |result, index|
414
422
  if result.is_a?(CommandError)
423
+ result._set_command(@commands[index + 1])
415
424
  raise result
416
425
  end
417
426
  end
@@ -563,6 +572,13 @@ class RedisClient
563
572
  end
564
573
 
565
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
566
582
  end
567
583
  end
568
584
 
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.3.0
4
+ version: 0.5.1
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-05-05 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,72 +28,21 @@ 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
42
  - lib/redis_client/command_builder.rb
93
43
  - lib/redis_client/config.rb
94
44
  - lib/redis_client/connection_mixin.rb
95
45
  - lib/redis_client/decorator.rb
96
- - lib/redis_client/hiredis_connection.rb
97
46
  - lib/redis_client/middlewares.rb
98
47
  - lib/redis_client/pooled.rb
99
48
  - lib/redis_client/ruby_connection.rb
@@ -103,7 +52,8 @@ files:
103
52
  - lib/redis_client/version.rb
104
53
  - redis-client.gemspec
105
54
  homepage: https://github.com/redis-rb/redis-client
106
- licenses: []
55
+ licenses:
56
+ - MIT
107
57
  metadata:
108
58
  allowed_push_host: https://rubygems.org
109
59
  homepage_uri: https://github.com/redis-rb/redis-client