redis-client 0.22.1 → 0.23.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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +10 -0
- data/README.md +7 -6
- data/lib/redis_client/circuit_breaker.rb +2 -2
- data/lib/redis_client/config.rb +32 -9
- data/lib/redis_client/connection_mixin.rb +11 -2
- data/lib/redis_client/ruby_connection.rb +8 -3
- data/lib/redis_client/version.rb +1 -1
- data/lib/redis_client.rb +8 -0
- metadata +3 -7
- data/Gemfile +0 -22
- data/Gemfile.lock +0 -72
- data/Rakefile +0 -126
- data/redis-client.gemspec +0 -32
    
        checksums.yaml
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 2 | 
             
            SHA256:
         | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 3 | 
            +
              metadata.gz: 588c7b4963a757c4d297236e15e0fd2b84d1137f42f14ca26dcfdf3349588126
         | 
| 4 | 
            +
              data.tar.gz: cc68ebf122ca5c9044c9c0e08713071e60b151c526f37699d7fa5d28c2e52e5f
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 6 | 
            +
              metadata.gz: 3a23804a8dbf13a35f8dae709586c44b3b81bd4d6d671ed79890b734b9e722f996c6d514bc609da511a0695deeefbfdfafcf8545fd6a0f7d8144d1936f72f417
         | 
| 7 | 
            +
              data.tar.gz: 1be3aff9e63209a7424c0078f1fe26d8f45212034f0a8d18fa8cb778f7bdb12200effa4796082dd7a1096f18f840cdf84ddff8a9ab3ff2ad6a552db9db595484
         | 
    
        data/CHANGELOG.md
    CHANGED
    
    | @@ -1,5 +1,15 @@ | |
| 1 1 | 
             
            # Unreleased
         | 
| 2 2 |  | 
| 3 | 
            +
            # 0.23.0
         | 
| 4 | 
            +
             | 
| 5 | 
            +
            - Allow `password` to be a callable. Makes it easy to implement short lived password authentication strategies.
         | 
| 6 | 
            +
            - Fix a thread safety issue in `hiredis-client` when using the `pubsub` client concurrently.
         | 
| 7 | 
            +
             | 
| 8 | 
            +
            # 0.22.2
         | 
| 9 | 
            +
             | 
| 10 | 
            +
            - Fix the sentinel client to properly extend timeout for blocking commands.
         | 
| 11 | 
            +
            - Fix IPv6 support in `RedisClient::Config#server_url`.
         | 
| 12 | 
            +
             | 
| 3 13 | 
             
            # 0.22.1
         | 
| 4 14 |  | 
| 5 15 | 
             
            - Fix `ProtocolError: Unknown sigil type` errors when using SSL connection. See #190.
         | 
    
        data/README.md
    CHANGED
    
    | @@ -1,9 +1,10 @@ | |
| 1 1 | 
             
            # RedisClient
         | 
| 2 2 |  | 
| 3 | 
            -
            `redis-client` is a simple, low-level, client for Redis 6 | 
| 3 | 
            +
            `redis-client` is a simple, low-level, client for [Redis](https://redis.io/) 6+, [Valkey](https://valkey.io/) 7+, [KeyDB](https://docs.keydb.dev/),
         | 
| 4 | 
            +
            and several other databases that implement the same `RESP3` protocol.
         | 
| 4 5 |  | 
| 5 6 | 
             
            Contrary to the `redis` gem, `redis-client` doesn't try to map all Redis commands to Ruby constructs,
         | 
| 6 | 
            -
            it merely is a thin wrapper on top of the RESP3 protocol.
         | 
| 7 | 
            +
            it merely is a thin wrapper on top of the `RESP3` protocol.
         | 
| 7 8 |  | 
| 8 9 | 
             
            ## Installation
         | 
| 9 10 |  | 
| @@ -77,7 +78,7 @@ redis.call("GET", "mykey") | |
| 77 78 | 
             
            - `db`: The database to select after connecting, defaults to `0`.
         | 
| 78 79 | 
             
            - `id` ID for the client connection, assigns name to current connection by sending `CLIENT SETNAME`.
         | 
| 79 80 | 
             
            - `username` Username to authenticate against server, defaults to `"default"`.
         | 
| 80 | 
            -
            - `password` Password to authenticate against server.
         | 
| 81 | 
            +
            - `password` Password to authenticate against server. Can either be a String or a callable that recieve `username` as argument and return a passowrd as a String.
         | 
| 81 82 | 
             
            - `timeout`: The general timeout in seconds, default to `1.0`.
         | 
| 82 83 | 
             
            - `connect_timeout`: The connection timeout, takes precedence over the general timeout when connecting to the server.
         | 
| 83 84 | 
             
            - `read_timeout`: The read timeout, takes precedence over the general timeout when reading responses from the server.
         | 
| @@ -89,7 +90,7 @@ redis.call("GET", "mykey") | |
| 89 90 |  | 
| 90 91 | 
             
            ### Sentinel support
         | 
| 91 92 |  | 
| 92 | 
            -
            The client is able to perform automatic failover by using [Redis Sentinel](https://redis.io/docs/ | 
| 93 | 
            +
            The client is able to perform automatic failover by using [Redis Sentinel](https://redis.io/docs/latest/operate/oss_and_stack/management/sentinel/).
         | 
| 93 94 |  | 
| 94 95 | 
             
            To connect using Sentinel, use:
         | 
| 95 96 |  | 
| @@ -149,7 +150,7 @@ SENTINELS = [{ host: '127.0.0.1', port: 26380 }, | |
| 149 150 | 
             
            redis_config = RedisClient.sentinel(name: 'mymaster', sentinels: SENTINELS, role: :master, password: 'mysecret')
         | 
| 150 151 | 
             
            ```
         | 
| 151 152 |  | 
| 152 | 
            -
            So you have to provide Sentinel credential and Redis  | 
| 153 | 
            +
            So you have to provide Sentinel credential and Redis explicitly even they are the same
         | 
| 153 154 |  | 
| 154 155 | 
             
            ```ruby
         | 
| 155 156 | 
             
            # Use 'mysecret' to authenticate against the mymaster instance and sentinel
         | 
| @@ -524,7 +525,7 @@ recover for a while. | |
| 524 525 |  | 
| 525 526 | 
             
            [Circuit breakers are a pattern that does exactly that](https://en.wikipedia.org/wiki/Circuit_breaker_design_pattern).
         | 
| 526 527 |  | 
| 527 | 
            -
             | 
| 528 | 
            +
            Configuration options:
         | 
| 528 529 |  | 
| 529 530 | 
             
              - `error_threshold`. The amount of errors to encounter within `error_threshold_timeout` amount of time before opening the circuit, that is to start rejecting requests instantly.
         | 
| 530 531 | 
             
              - `error_threshold_timeout`. The amount of time in seconds that `error_threshold` errors must occur to open the circuit. Defaults to `error_timeout` seconds if not set.
         | 
| @@ -63,7 +63,7 @@ class RedisClient | |
| 63 63 | 
             
                private
         | 
| 64 64 |  | 
| 65 65 | 
             
                def refresh_state
         | 
| 66 | 
            -
                  now =  | 
| 66 | 
            +
                  now = RedisClient.now
         | 
| 67 67 | 
             
                  @lock.synchronize do
         | 
| 68 68 | 
             
                    if @errors.last < (now - @error_timeout)
         | 
| 69 69 | 
             
                      if @success_threshold > 0
         | 
| @@ -78,7 +78,7 @@ class RedisClient | |
| 78 78 | 
             
                end
         | 
| 79 79 |  | 
| 80 80 | 
             
                def record_error
         | 
| 81 | 
            -
                  now =  | 
| 81 | 
            +
                  now = RedisClient.now
         | 
| 82 82 | 
             
                  expiry = now - @error_timeout
         | 
| 83 83 | 
             
                  @lock.synchronize do
         | 
| 84 84 | 
             
                    if @state == :closed
         | 
    
        data/lib/redis_client/config.rb
    CHANGED
    
    | @@ -12,8 +12,8 @@ class RedisClient | |
| 12 12 | 
             
                DEFAULT_DB = 0
         | 
| 13 13 |  | 
| 14 14 | 
             
                module Common
         | 
| 15 | 
            -
                  attr_reader :db, : | 
| 16 | 
            -
                    :connect_timeout, :read_timeout, :write_timeout, :driver, : | 
| 15 | 
            +
                  attr_reader :db, :id, :ssl, :ssl_params, :command_builder, :inherit_socket,
         | 
| 16 | 
            +
                    :connect_timeout, :read_timeout, :write_timeout, :driver, :protocol,
         | 
| 17 17 | 
             
                    :middlewares_stack, :custom, :circuit_breaker
         | 
| 18 18 |  | 
| 19 19 | 
             
                  alias_method :ssl?, :ssl
         | 
| @@ -70,7 +70,7 @@ class RedisClient | |
| 70 70 |  | 
| 71 71 | 
             
                    reconnect_attempts = Array.new(reconnect_attempts, 0).freeze if reconnect_attempts.is_a?(Integer)
         | 
| 72 72 | 
             
                    @reconnect_attempts = reconnect_attempts
         | 
| 73 | 
            -
                    @connection_prelude = build_connection_prelude
         | 
| 73 | 
            +
                    @connection_prelude = (build_connection_prelude unless @password.respond_to?(:call))
         | 
| 74 74 |  | 
| 75 75 | 
             
                    circuit_breaker = CircuitBreaker.new(**circuit_breaker) if circuit_breaker.is_a?(Hash)
         | 
| 76 76 | 
             
                    if @circuit_breaker = circuit_breaker
         | 
| @@ -87,6 +87,22 @@ class RedisClient | |
| 87 87 | 
             
                    @middlewares_stack = middlewares_stack
         | 
| 88 88 | 
             
                  end
         | 
| 89 89 |  | 
| 90 | 
            +
                  def connection_prelude
         | 
| 91 | 
            +
                    if @password.respond_to?(:call)
         | 
| 92 | 
            +
                      build_connection_prelude
         | 
| 93 | 
            +
                    else
         | 
| 94 | 
            +
                      @connection_prelude
         | 
| 95 | 
            +
                    end
         | 
| 96 | 
            +
                  end
         | 
| 97 | 
            +
             | 
| 98 | 
            +
                  def password
         | 
| 99 | 
            +
                    if @password.respond_to?(:call)
         | 
| 100 | 
            +
                      @password.call(username)
         | 
| 101 | 
            +
                    else
         | 
| 102 | 
            +
                      @password
         | 
| 103 | 
            +
                    end
         | 
| 104 | 
            +
                  end
         | 
| 105 | 
            +
             | 
| 90 106 | 
             
                  def username
         | 
| 91 107 | 
             
                    @username || DEFAULT_USERNAME
         | 
| 92 108 | 
             
                  end
         | 
| @@ -133,7 +149,13 @@ class RedisClient | |
| 133 149 | 
             
                        url = "#{url}?db=#{db}"
         | 
| 134 150 | 
             
                      end
         | 
| 135 151 | 
             
                    else
         | 
| 136 | 
            -
                       | 
| 152 | 
            +
                      # add brackets to IPv6 address
         | 
| 153 | 
            +
                      redis_host = if host.count(":") >= 2
         | 
| 154 | 
            +
                        "[#{host}]"
         | 
| 155 | 
            +
                      else
         | 
| 156 | 
            +
                        host
         | 
| 157 | 
            +
                      end
         | 
| 158 | 
            +
                      url = "redis#{'s' if ssl?}://#{redis_host}:#{port}"
         | 
| 137 159 | 
             
                      if db != 0
         | 
| 138 160 | 
             
                        url = "#{url}/#{db}"
         | 
| 139 161 | 
             
                      end
         | 
| @@ -145,17 +167,18 @@ class RedisClient | |
| 145 167 |  | 
| 146 168 | 
             
                  def build_connection_prelude
         | 
| 147 169 | 
             
                    prelude = []
         | 
| 170 | 
            +
                    pass = password
         | 
| 148 171 | 
             
                    if protocol == 3
         | 
| 149 | 
            -
                      prelude << if  | 
| 150 | 
            -
                        ["HELLO", "3", "AUTH",  | 
| 172 | 
            +
                      prelude << if pass
         | 
| 173 | 
            +
                        ["HELLO", "3", "AUTH", username, pass]
         | 
| 151 174 | 
             
                      else
         | 
| 152 175 | 
             
                        ["HELLO", "3"]
         | 
| 153 176 | 
             
                      end
         | 
| 154 | 
            -
                    elsif  | 
| 177 | 
            +
                    elsif pass
         | 
| 155 178 | 
             
                      prelude << if @username && !@username.empty?
         | 
| 156 | 
            -
                        ["AUTH", @username,  | 
| 179 | 
            +
                        ["AUTH", @username, pass]
         | 
| 157 180 | 
             
                      else
         | 
| 158 | 
            -
                        ["AUTH",  | 
| 181 | 
            +
                        ["AUTH", pass]
         | 
| 159 182 | 
             
                      end
         | 
| 160 183 | 
             
                    end
         | 
| 161 184 |  | 
| @@ -28,7 +28,7 @@ class RedisClient | |
| 28 28 | 
             
                def call(command, timeout)
         | 
| 29 29 | 
             
                  @pending_reads += 1
         | 
| 30 30 | 
             
                  write(command)
         | 
| 31 | 
            -
                  result = read(timeout)
         | 
| 31 | 
            +
                  result = read(connection_timeout(timeout))
         | 
| 32 32 | 
             
                  @pending_reads -= 1
         | 
| 33 33 | 
             
                  if result.is_a?(Error)
         | 
| 34 34 | 
             
                    result._set_command(command)
         | 
| @@ -49,7 +49,7 @@ class RedisClient | |
| 49 49 |  | 
| 50 50 | 
             
                  size.times do |index|
         | 
| 51 51 | 
             
                    timeout = timeouts && timeouts[index]
         | 
| 52 | 
            -
                    result = read(timeout)
         | 
| 52 | 
            +
                    result = read(connection_timeout(timeout))
         | 
| 53 53 | 
             
                    @pending_reads -= 1
         | 
| 54 54 |  | 
| 55 55 | 
             
                    # A multi/exec command can return an array of results.
         | 
| @@ -73,5 +73,14 @@ class RedisClient | |
| 73 73 | 
             
                    results
         | 
| 74 74 | 
             
                  end
         | 
| 75 75 | 
             
                end
         | 
| 76 | 
            +
             | 
| 77 | 
            +
                def connection_timeout(timeout)
         | 
| 78 | 
            +
                  return timeout unless timeout && timeout > 0
         | 
| 79 | 
            +
             | 
| 80 | 
            +
                  # Can't use the command timeout argument as the connection timeout
         | 
| 81 | 
            +
                  # otherwise it would be very racy. So we add the regular read_timeout on top
         | 
| 82 | 
            +
                  # to account for the network delay.
         | 
| 83 | 
            +
                  timeout + config.read_timeout
         | 
| 84 | 
            +
                end
         | 
| 76 85 | 
             
              end
         | 
| 77 86 | 
             
            end
         | 
| @@ -104,9 +104,9 @@ class RedisClient | |
| 104 104 | 
             
                end
         | 
| 105 105 |  | 
| 106 106 | 
             
                def measure_round_trip_delay
         | 
| 107 | 
            -
                  start =  | 
| 107 | 
            +
                  start = RedisClient.now_ms
         | 
| 108 108 | 
             
                  call(["PING"], @read_timeout)
         | 
| 109 | 
            -
                   | 
| 109 | 
            +
                  RedisClient.now_ms - start
         | 
| 110 110 | 
             
                end
         | 
| 111 111 |  | 
| 112 112 | 
             
                private
         | 
| @@ -116,7 +116,12 @@ class RedisClient | |
| 116 116 | 
             
                    UNIXSocket.new(@config.path)
         | 
| 117 117 | 
             
                  else
         | 
| 118 118 | 
             
                    sock = if SUPPORTS_RESOLV_TIMEOUT
         | 
| 119 | 
            -
                       | 
| 119 | 
            +
                      begin
         | 
| 120 | 
            +
                        Socket.tcp(@config.host, @config.port, connect_timeout: @connect_timeout, resolv_timeout: @connect_timeout)
         | 
| 121 | 
            +
                      rescue Errno::ETIMEDOUT => timeout_error
         | 
| 122 | 
            +
                        timeout_error.message << ": #{@connect_timeout}s"
         | 
| 123 | 
            +
                        raise
         | 
| 124 | 
            +
                      end
         | 
| 120 125 | 
             
                    else
         | 
| 121 126 | 
             
                      Socket.tcp(@config.host, @config.port, connect_timeout: @connect_timeout)
         | 
| 122 127 | 
             
                    end
         | 
    
        data/lib/redis_client/version.rb
    CHANGED
    
    
    
        data/lib/redis_client.rb
    CHANGED
    
    | @@ -45,6 +45,14 @@ class RedisClient | |
| 45 45 | 
             
                def default_driver=(name)
         | 
| 46 46 | 
             
                  @default_driver = driver(name)
         | 
| 47 47 | 
             
                end
         | 
| 48 | 
            +
             | 
| 49 | 
            +
                def now
         | 
| 50 | 
            +
                  Process.clock_gettime(Process::CLOCK_MONOTONIC)
         | 
| 51 | 
            +
                end
         | 
| 52 | 
            +
             | 
| 53 | 
            +
                def now_ms
         | 
| 54 | 
            +
                  Process.clock_gettime(Process::CLOCK_MONOTONIC, :float_millisecond)
         | 
| 55 | 
            +
                end
         | 
| 48 56 | 
             
              end
         | 
| 49 57 |  | 
| 50 58 | 
             
              register_driver :ruby do
         | 
    
        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. | 
| 4 | 
            +
              version: 0.23.0
         | 
| 5 5 | 
             
            platform: ruby
         | 
| 6 6 | 
             
            authors:
         | 
| 7 7 | 
             
            - Jean Boussier
         | 
| 8 8 | 
             
            autorequire:
         | 
| 9 9 | 
             
            bindir: bin
         | 
| 10 10 | 
             
            cert_chain: []
         | 
| 11 | 
            -
            date: 2024- | 
| 11 | 
            +
            date: 2024-12-10 00:00:00.000000000 Z
         | 
| 12 12 | 
             
            dependencies:
         | 
| 13 13 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 14 14 | 
             
              name: connection_pool
         | 
| @@ -32,11 +32,8 @@ extensions: [] | |
| 32 32 | 
             
            extra_rdoc_files: []
         | 
| 33 33 | 
             
            files:
         | 
| 34 34 | 
             
            - CHANGELOG.md
         | 
| 35 | 
            -
            - Gemfile
         | 
| 36 | 
            -
            - Gemfile.lock
         | 
| 37 35 | 
             
            - LICENSE.md
         | 
| 38 36 | 
             
            - README.md
         | 
| 39 | 
            -
            - Rakefile
         | 
| 40 37 | 
             
            - lib/redis-client.rb
         | 
| 41 38 | 
             
            - lib/redis_client.rb
         | 
| 42 39 | 
             
            - lib/redis_client/circuit_breaker.rb
         | 
| @@ -53,7 +50,6 @@ files: | |
| 53 50 | 
             
            - lib/redis_client/sentinel_config.rb
         | 
| 54 51 | 
             
            - lib/redis_client/url_config.rb
         | 
| 55 52 | 
             
            - lib/redis_client/version.rb
         | 
| 56 | 
            -
            - redis-client.gemspec
         | 
| 57 53 | 
             
            homepage: https://github.com/redis-rb/redis-client
         | 
| 58 54 | 
             
            licenses:
         | 
| 59 55 | 
             
            - MIT
         | 
| @@ -77,7 +73,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement | |
| 77 73 | 
             
                - !ruby/object:Gem::Version
         | 
| 78 74 | 
             
                  version: '0'
         | 
| 79 75 | 
             
            requirements: []
         | 
| 80 | 
            -
            rubygems_version: 3. | 
| 76 | 
            +
            rubygems_version: 3.0.3.1
         | 
| 81 77 | 
             
            signing_key:
         | 
| 82 78 | 
             
            specification_version: 4
         | 
| 83 79 | 
             
            summary: Simple low-level client for Redis 6+
         | 
    
        data/Gemfile
    DELETED
    
    | @@ -1,22 +0,0 @@ | |
| 1 | 
            -
            # frozen_string_literal: true
         | 
| 2 | 
            -
             | 
| 3 | 
            -
            source "https://rubygems.org"
         | 
| 4 | 
            -
             | 
| 5 | 
            -
            # Specify your gem's dependencies in redis-client.gemspec
         | 
| 6 | 
            -
            gemspec name: "redis-client"
         | 
| 7 | 
            -
             | 
| 8 | 
            -
            gem "minitest"
         | 
| 9 | 
            -
            gem "rake", "~> 13.2"
         | 
| 10 | 
            -
            gem "rake-compiler"
         | 
| 11 | 
            -
            gem "rubocop"
         | 
| 12 | 
            -
            gem "rubocop-minitest"
         | 
| 13 | 
            -
            gem "toxiproxy"
         | 
| 14 | 
            -
             | 
| 15 | 
            -
            group :benchmark do
         | 
| 16 | 
            -
              gem "benchmark-ips"
         | 
| 17 | 
            -
              gem "hiredis"
         | 
| 18 | 
            -
              gem "redis", "~> 4.6"
         | 
| 19 | 
            -
              gem "stackprof", platform: :mri
         | 
| 20 | 
            -
            end
         | 
| 21 | 
            -
             | 
| 22 | 
            -
            gem "byebug", platform: :mri
         | 
    
        data/Gemfile.lock
    DELETED
    
    | @@ -1,72 +0,0 @@ | |
| 1 | 
            -
            PATH
         | 
| 2 | 
            -
              remote: .
         | 
| 3 | 
            -
              specs:
         | 
| 4 | 
            -
                redis-client (0.22.1)
         | 
| 5 | 
            -
                  connection_pool
         | 
| 6 | 
            -
             | 
| 7 | 
            -
            GEM
         | 
| 8 | 
            -
              remote: https://rubygems.org/
         | 
| 9 | 
            -
              specs:
         | 
| 10 | 
            -
                ast (2.4.2)
         | 
| 11 | 
            -
                benchmark-ips (2.13.0)
         | 
| 12 | 
            -
                byebug (11.1.3)
         | 
| 13 | 
            -
                connection_pool (2.4.1)
         | 
| 14 | 
            -
                hiredis (0.6.3)
         | 
| 15 | 
            -
                hiredis (0.6.3-java)
         | 
| 16 | 
            -
                json (2.7.1)
         | 
| 17 | 
            -
                json (2.7.1-java)
         | 
| 18 | 
            -
                minitest (5.22.3)
         | 
| 19 | 
            -
                parallel (1.24.0)
         | 
| 20 | 
            -
                parser (3.3.0.5)
         | 
| 21 | 
            -
                  ast (~> 2.4.1)
         | 
| 22 | 
            -
                  racc
         | 
| 23 | 
            -
                racc (1.7.3)
         | 
| 24 | 
            -
                racc (1.7.3-java)
         | 
| 25 | 
            -
                rainbow (3.1.1)
         | 
| 26 | 
            -
                rake (13.2.1)
         | 
| 27 | 
            -
                rake-compiler (1.2.7)
         | 
| 28 | 
            -
                  rake
         | 
| 29 | 
            -
                redis (4.6.0)
         | 
| 30 | 
            -
                regexp_parser (2.9.0)
         | 
| 31 | 
            -
                rexml (3.2.6)
         | 
| 32 | 
            -
                rubocop (1.50.2)
         | 
| 33 | 
            -
                  json (~> 2.3)
         | 
| 34 | 
            -
                  parallel (~> 1.10)
         | 
| 35 | 
            -
                  parser (>= 3.2.0.0)
         | 
| 36 | 
            -
                  rainbow (>= 2.2.2, < 4.0)
         | 
| 37 | 
            -
                  regexp_parser (>= 1.8, < 3.0)
         | 
| 38 | 
            -
                  rexml (>= 3.2.5, < 4.0)
         | 
| 39 | 
            -
                  rubocop-ast (>= 1.28.0, < 2.0)
         | 
| 40 | 
            -
                  ruby-progressbar (~> 1.7)
         | 
| 41 | 
            -
                  unicode-display_width (>= 2.4.0, < 3.0)
         | 
| 42 | 
            -
                rubocop-ast (1.30.0)
         | 
| 43 | 
            -
                  parser (>= 3.2.1.0)
         | 
| 44 | 
            -
                rubocop-minitest (0.30.0)
         | 
| 45 | 
            -
                  rubocop (>= 1.39, < 2.0)
         | 
| 46 | 
            -
                ruby-progressbar (1.13.0)
         | 
| 47 | 
            -
                stackprof (0.2.26)
         | 
| 48 | 
            -
                toxiproxy (2.0.2)
         | 
| 49 | 
            -
                unicode-display_width (2.5.0)
         | 
| 50 | 
            -
             | 
| 51 | 
            -
            PLATFORMS
         | 
| 52 | 
            -
              ruby
         | 
| 53 | 
            -
              universal-java-18
         | 
| 54 | 
            -
              x86_64-darwin-20
         | 
| 55 | 
            -
              x86_64-linux
         | 
| 56 | 
            -
             | 
| 57 | 
            -
            DEPENDENCIES
         | 
| 58 | 
            -
              benchmark-ips
         | 
| 59 | 
            -
              byebug
         | 
| 60 | 
            -
              hiredis
         | 
| 61 | 
            -
              minitest
         | 
| 62 | 
            -
              rake (~> 13.2)
         | 
| 63 | 
            -
              rake-compiler
         | 
| 64 | 
            -
              redis (~> 4.6)
         | 
| 65 | 
            -
              redis-client!
         | 
| 66 | 
            -
              rubocop
         | 
| 67 | 
            -
              rubocop-minitest
         | 
| 68 | 
            -
              stackprof
         | 
| 69 | 
            -
              toxiproxy
         | 
| 70 | 
            -
             | 
| 71 | 
            -
            BUNDLED WITH
         | 
| 72 | 
            -
               2.3.13
         | 
    
        data/Rakefile
    DELETED
    
    | @@ -1,126 +0,0 @@ | |
| 1 | 
            -
            # frozen_string_literal: true
         | 
| 2 | 
            -
             | 
| 3 | 
            -
            require "rake/extensiontask"
         | 
| 4 | 
            -
            require "rake/testtask"
         | 
| 5 | 
            -
            require 'rubocop/rake_task'
         | 
| 6 | 
            -
             | 
| 7 | 
            -
            RuboCop::RakeTask.new
         | 
| 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 | 
            -
             | 
| 15 | 
            -
            gemspec = Gem::Specification.load("redis-client.gemspec")
         | 
| 16 | 
            -
            Rake::ExtensionTask.new do |ext|
         | 
| 17 | 
            -
              ext.name = "hiredis_connection"
         | 
| 18 | 
            -
              ext.ext_dir = "hiredis-client/ext/redis_client/hiredis"
         | 
| 19 | 
            -
              ext.lib_dir = "hiredis-client/lib/redis_client"
         | 
| 20 | 
            -
              ext.gem_spec = gemspec
         | 
| 21 | 
            -
              CLEAN.add("#{ext.ext_dir}/vendor/*.{a,o}")
         | 
| 22 | 
            -
            end
         | 
| 23 | 
            -
             | 
| 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 | 
            -
                t.options = '-v' if ENV['CI'] || ENV['VERBOSE']
         | 
| 30 | 
            -
              end
         | 
| 31 | 
            -
             | 
| 32 | 
            -
              Rake::TestTask.new(:sentinel) do |t|
         | 
| 33 | 
            -
                t.libs << "test/sentinel"
         | 
| 34 | 
            -
                t.libs << "test"
         | 
| 35 | 
            -
                t.libs << "lib"
         | 
| 36 | 
            -
                t.test_files = FileList["test/sentinel/*_test.rb"]
         | 
| 37 | 
            -
                t.options = '-v' if ENV['CI'] || ENV['VERBOSE']
         | 
| 38 | 
            -
              end
         | 
| 39 | 
            -
             | 
| 40 | 
            -
              Rake::TestTask.new(:hiredis) do |t|
         | 
| 41 | 
            -
                t.libs << "test/hiredis"
         | 
| 42 | 
            -
                t.libs << "test"
         | 
| 43 | 
            -
                t.libs << "hiredis-client/lib"
         | 
| 44 | 
            -
                t.libs << "lib"
         | 
| 45 | 
            -
                t.test_files = FileList["test/**/*_test.rb"].exclude("test/sentinel/*_test.rb")
         | 
| 46 | 
            -
                t.options = '-v' if ENV['CI'] || ENV['VERBOSE']
         | 
| 47 | 
            -
              end
         | 
| 48 | 
            -
            end
         | 
| 49 | 
            -
             | 
| 50 | 
            -
            hiredis_supported = RUBY_ENGINE == "ruby" && !RUBY_PLATFORM.match?(/mswin/)
         | 
| 51 | 
            -
            if hiredis_supported
         | 
| 52 | 
            -
              task test: %i[test:ruby test:hiredis test:sentinel]
         | 
| 53 | 
            -
            else
         | 
| 54 | 
            -
              task test: %i[test:ruby test:sentinel]
         | 
| 55 | 
            -
            end
         | 
| 56 | 
            -
             | 
| 57 | 
            -
            namespace :hiredis do
         | 
| 58 | 
            -
              task :download do
         | 
| 59 | 
            -
                version = "1.0.2"
         | 
| 60 | 
            -
                archive_path = "tmp/hiredis-#{version}.tar.gz"
         | 
| 61 | 
            -
                url = "https://github.com/redis/hiredis/archive/refs/tags/v#{version}.tar.gz"
         | 
| 62 | 
            -
                system("curl", "-L", url, out: archive_path) or raise "Downloading of #{url} failed"
         | 
| 63 | 
            -
                system("rm", "-rf", "hiredis-client/ext/redis_client/hiredis/vendor/")
         | 
| 64 | 
            -
                system("mkdir", "-p", "hiredis-client/ext/redis_client/hiredis/vendor/")
         | 
| 65 | 
            -
                system(
         | 
| 66 | 
            -
                  "tar", "xvzf", archive_path,
         | 
| 67 | 
            -
                  "-C", "hiredis-client/ext/redis_client/hiredis/vendor",
         | 
| 68 | 
            -
                  "--strip-components", "1",
         | 
| 69 | 
            -
                )
         | 
| 70 | 
            -
                system("rm", "-rf", "hiredis-client/ext/redis_client/hiredis/vendor/examples")
         | 
| 71 | 
            -
              end
         | 
| 72 | 
            -
            end
         | 
| 73 | 
            -
             | 
| 74 | 
            -
            benchmark_suites = %w(single pipelined drivers)
         | 
| 75 | 
            -
            benchmark_modes = %i[ruby yjit hiredis]
         | 
| 76 | 
            -
            namespace :benchmark do
         | 
| 77 | 
            -
              benchmark_suites.each do |suite|
         | 
| 78 | 
            -
                benchmark_modes.each do |mode|
         | 
| 79 | 
            -
                  next if suite == "drivers" && mode == :hiredis
         | 
| 80 | 
            -
             | 
| 81 | 
            -
                  name = "#{suite}_#{mode}"
         | 
| 82 | 
            -
                  desc name
         | 
| 83 | 
            -
                  task name do
         | 
| 84 | 
            -
                    output_path = "benchmark/#{name}.md"
         | 
| 85 | 
            -
                    sh "rm", "-f", output_path
         | 
| 86 | 
            -
                    File.open(output_path, "w+") do |output|
         | 
| 87 | 
            -
                      output.puts("ruby: `#{RUBY_DESCRIPTION}`\n\n")
         | 
| 88 | 
            -
                      output.puts("redis-server: `#{`redis-server -v`.strip}`\n\n")
         | 
| 89 | 
            -
                      output.puts
         | 
| 90 | 
            -
                      output.flush
         | 
| 91 | 
            -
                      env = {}
         | 
| 92 | 
            -
                      args = []
         | 
| 93 | 
            -
                      args << "--yjit" if mode == :yjit
         | 
| 94 | 
            -
                      env["DRIVER"] = mode == :hiredis ? "hiredis" : "ruby"
         | 
| 95 | 
            -
                      system(env, RbConfig.ruby, *args, "benchmark/#{suite}.rb", out: output)
         | 
| 96 | 
            -
                    end
         | 
| 97 | 
            -
             | 
| 98 | 
            -
                    skipping = false
         | 
| 99 | 
            -
                    output = File.readlines(output_path).reject do |line|
         | 
| 100 | 
            -
                      if skipping
         | 
| 101 | 
            -
                        if line == "Comparison:\n"
         | 
| 102 | 
            -
                          skipping = false
         | 
| 103 | 
            -
                          true
         | 
| 104 | 
            -
                        else
         | 
| 105 | 
            -
                          skipping
         | 
| 106 | 
            -
                        end
         | 
| 107 | 
            -
                      else
         | 
| 108 | 
            -
                        skipping = true if line.start_with?("Warming up ---")
         | 
| 109 | 
            -
                        skipping
         | 
| 110 | 
            -
                      end
         | 
| 111 | 
            -
                    end
         | 
| 112 | 
            -
                    File.write(output_path, output.join)
         | 
| 113 | 
            -
                  end
         | 
| 114 | 
            -
                end
         | 
| 115 | 
            -
              end
         | 
| 116 | 
            -
             | 
| 117 | 
            -
              task all: benchmark_suites.flat_map { |s| benchmark_modes.flat_map { |m| "#{s}_#{m}" } }
         | 
| 118 | 
            -
            end
         | 
| 119 | 
            -
             | 
| 120 | 
            -
            if hiredis_supported
         | 
| 121 | 
            -
              task default: %i[compile test rubocop]
         | 
| 122 | 
            -
              task ci: %i[compile test:ruby test:hiredis]
         | 
| 123 | 
            -
            else
         | 
| 124 | 
            -
              task default: %i[test rubocop]
         | 
| 125 | 
            -
              task ci: %i[test:ruby]
         | 
| 126 | 
            -
            end
         | 
    
        data/redis-client.gemspec
    DELETED
    
    | @@ -1,32 +0,0 @@ | |
| 1 | 
            -
            # frozen_string_literal: true
         | 
| 2 | 
            -
             | 
| 3 | 
            -
            require_relative "lib/redis_client/version"
         | 
| 4 | 
            -
             | 
| 5 | 
            -
            Gem::Specification.new do |spec|
         | 
| 6 | 
            -
              spec.name = "redis-client"
         | 
| 7 | 
            -
              spec.version = RedisClient::VERSION
         | 
| 8 | 
            -
              spec.authors = ["Jean Boussier"]
         | 
| 9 | 
            -
              spec.email = ["jean.boussier@gmail.com"]
         | 
| 10 | 
            -
             | 
| 11 | 
            -
              spec.summary = "Simple low-level client for Redis 6+"
         | 
| 12 | 
            -
              spec.homepage = "https://github.com/redis-rb/redis-client"
         | 
| 13 | 
            -
              spec.license = "MIT"
         | 
| 14 | 
            -
              spec.required_ruby_version = ">= 2.6.0"
         | 
| 15 | 
            -
             | 
| 16 | 
            -
              spec.metadata["allowed_push_host"] = "https://rubygems.org"
         | 
| 17 | 
            -
             | 
| 18 | 
            -
              spec.metadata["homepage_uri"] = spec.homepage
         | 
| 19 | 
            -
              spec.metadata["source_code_uri"] = spec.homepage
         | 
| 20 | 
            -
              spec.metadata["changelog_uri"] = File.join(spec.homepage, "blob/master/CHANGELOG.md")
         | 
| 21 | 
            -
             | 
| 22 | 
            -
              # Specify which files should be added to the gem when it is released.
         | 
| 23 | 
            -
              # The `git ls-files -z` loads the files in the RubyGem that have been added into git.
         | 
| 24 | 
            -
              spec.files = Dir.chdir(File.expand_path(__dir__)) do
         | 
| 25 | 
            -
                `git ls-files -z`.split("\x0").reject do |f|
         | 
| 26 | 
            -
                  (f == __FILE__) || f.match(%r{\A(?:(?:bin|hiredis-client|test|spec|features|benchmark)/|\.(?:git|rubocop))})
         | 
| 27 | 
            -
                end
         | 
| 28 | 
            -
              end
         | 
| 29 | 
            -
              spec.require_paths = ["lib"]
         | 
| 30 | 
            -
             | 
| 31 | 
            -
              spec.add_runtime_dependency "connection_pool"
         | 
| 32 | 
            -
            end
         |