async-redis 0.10.1 → 0.11.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: da847e343c291506a20337eec6170867a0e0bf295b713ece60fd7f48928d873f
4
- data.tar.gz: 2ea6e2720f556084f57415501a1964c0bb2a93a411a9cb52138dbb8ed141c45b
3
+ metadata.gz: c93d4c6fc6b638cb339e1593a9f459041d886a2a6bebb1d195fb168af3076ecd
4
+ data.tar.gz: 10e62c4f23691e541cb9b3430f5b7333c851f712308926d8249e5062a88eff59
5
5
  SHA512:
6
- metadata.gz: 9ac74325525a0dc00b06aaee1fa505566bce74f4806c07f26a8581ac7b20db79f11cbb052d6d598d02b7eec94aae6a142d88da00eb01e4b0a8d72e134ef5a798
7
- data.tar.gz: 2b873fd8ee1cfffda74d301265ec9477a34dfe571d30d4c36d195cf39b089c22635bc74c07ade143ca46a5e169d0db226470a6149ce912be3b3da0db96e26b49
6
+ metadata.gz: c1f44727870268dc6916e45addea89230d11af79d6d4546e1bd43140c534744b61acf5c6ee9bd301e7c9bb4ef69862b859556cccaac7e00af04ab5ce88552eca
7
+ data.tar.gz: 66d6d26209c7de1d87cd5095685c4f1fed235409d0e41966e1c55fc10c5e1e1a7469b734b144b654b072b18b1933bcf2c2e7b8ee1f7204f4f3a18b9af43ec3e6
checksums.yaml.gz.sig CHANGED
Binary file
@@ -7,16 +7,16 @@
7
7
  # Copyright, 2019, by David Ortiz.
8
8
  # Copyright, 2020, by Salim Semaoune.
9
9
 
10
- require_relative 'context/pipeline'
11
- require_relative 'context/transaction'
12
- require_relative 'context/subscribe'
13
- require_relative 'endpoint'
10
+ require_relative "context/pipeline"
11
+ require_relative "context/transaction"
12
+ require_relative "context/subscribe"
13
+ require_relative "endpoint"
14
14
 
15
- require 'io/endpoint/host_endpoint'
16
- require 'async/pool/controller'
17
- require 'protocol/redis/methods'
15
+ require "io/endpoint/host_endpoint"
16
+ require "async/pool/controller"
17
+ require "protocol/redis/methods"
18
18
 
19
- require 'io/stream'
19
+ require "io/stream"
20
20
 
21
21
  module Async
22
22
  module Redis
@@ -89,7 +89,7 @@ module Async
89
89
  @endpoint = endpoint
90
90
  @protocol = protocol
91
91
 
92
- @pool = connect(**options)
92
+ @pool = make_pool(**options)
93
93
  end
94
94
 
95
95
  attr :endpoint
@@ -113,7 +113,14 @@ module Async
113
113
 
114
114
  protected
115
115
 
116
- def connect(**options)
116
+ def assign_default_tags(tags)
117
+ tags[:endpoint] = @endpoint.to_s
118
+ tags[:protocol] = @protocol.to_s
119
+ end
120
+
121
+ def make_pool(**options)
122
+ self.assign_default_tags(options[:tags] ||= {})
123
+
117
124
  Async::Pool::Controller.wrap(**options) do
118
125
  peer = @endpoint.connect
119
126
 
@@ -1,11 +1,10 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  # Released under the MIT License.
4
- # Copyright, 2020, by David Ortiz.
5
- # Copyright, 2023-2024, by Samuel Williams.
4
+ # Copyright, 2024, by Samuel Williams.
6
5
 
7
- require_relative 'client'
8
- require 'io/stream'
6
+ require_relative "client"
7
+ require "io/stream"
9
8
 
10
9
  module Async
11
10
  module Redis
@@ -107,20 +106,20 @@ module Async
107
106
  shards = RangeMap.new
108
107
  endpoints = []
109
108
 
110
- client.call('CLUSTER', 'SHARDS').each do |shard|
109
+ client.call("CLUSTER", "SHARDS").each do |shard|
111
110
  shard = shard.each_slice(2).to_h
112
111
 
113
- slots = shard['slots']
112
+ slots = shard["slots"]
114
113
  range = Range.new(*slots)
115
114
 
116
- nodes = shard['nodes'].map do |node|
115
+ nodes = shard["nodes"].map do |node|
117
116
  node = node.each_slice(2).to_h
118
- endpoint = Endpoint.remote(node['ip'], node['port'])
117
+ endpoint = Endpoint.remote(node["ip"], node["port"])
119
118
 
120
119
  # Collect all endpoints:
121
120
  endpoints << endpoint
122
121
 
123
- Node.new(node['id'], endpoint, node['role'].to_sym, node['health'].to_sym)
122
+ Node.new(node["id"], endpoint, node["role"].to_sym, node["health"].to_sym)
124
123
  end
125
124
 
126
125
  shards.add(range, nodes)
@@ -193,8 +192,8 @@ module Async
193
192
  def slot_for(key)
194
193
  key = key.to_s
195
194
 
196
- if s = key.index('{')
197
- if e = key.index('}', s + 1) and e != s + 1
195
+ if s = key.index("{")
196
+ if e = key.index("}", s + 1) and e != s + 1
198
197
  key = key[s + 1..e - 1]
199
198
  end
200
199
  end
@@ -4,7 +4,7 @@
4
4
  # Copyright, 2019, by Mikael Henriksson.
5
5
  # Copyright, 2019-2023, by Samuel Williams.
6
6
 
7
- require 'protocol/redis/methods'
7
+ require "protocol/redis/methods"
8
8
 
9
9
  module Async
10
10
  module Redis
@@ -5,7 +5,7 @@
5
5
  # Copyright, 2019-2024, by Samuel Williams.
6
6
  # Copyright, 2022, by Tim Willard.
7
7
 
8
- require_relative 'generic'
8
+ require_relative "generic"
9
9
 
10
10
  module Async
11
11
  module Redis
@@ -2,15 +2,15 @@
2
2
 
3
3
  # Released under the MIT License.
4
4
  # Copyright, 2018, by Huba Nagy.
5
- # Copyright, 2018-2023, by Samuel Williams.
5
+ # Copyright, 2018-2024, by Samuel Williams.
6
6
 
7
- require_relative 'generic'
7
+ require_relative "generic"
8
8
 
9
9
  module Async
10
10
  module Redis
11
11
  module Context
12
12
  class Subscribe < Generic
13
- MESSAGE = 'message'
13
+ MESSAGE = "message"
14
14
 
15
15
  def initialize(pool, channels)
16
16
  super(pool)
@@ -31,13 +31,21 @@ module Async
31
31
  end
32
32
  end
33
33
 
34
+ def each
35
+ return to_enum unless block_given?
36
+
37
+ while response = self.listen
38
+ yield response
39
+ end
40
+ end
41
+
34
42
  def subscribe(channels)
35
- @connection.write_request ['SUBSCRIBE', *channels]
43
+ @connection.write_request ["SUBSCRIBE", *channels]
36
44
  @connection.flush
37
45
  end
38
46
 
39
47
  def unsubscribe(channels)
40
- @connection.write_request ['UNSUBSCRIBE', *channels]
48
+ @connection.write_request ["UNSUBSCRIBE", *channels]
41
49
  @connection.flush
42
50
  end
43
51
  end
@@ -4,7 +4,7 @@
4
4
  # Copyright, 2018, by Huba Nagy.
5
5
  # Copyright, 2018-2023, by Samuel Williams.
6
6
 
7
- require_relative 'pipeline'
7
+ require_relative "pipeline"
8
8
 
9
9
  module Async
10
10
  module Redis
@@ -15,20 +15,20 @@ module Async
15
15
  end
16
16
 
17
17
  def multi
18
- call('MULTI')
18
+ call("MULTI")
19
19
  end
20
20
 
21
21
  def watch(*keys)
22
- sync.call('WATCH', *keys)
22
+ sync.call("WATCH", *keys)
23
23
  end
24
24
 
25
25
  # Execute all queued commands, provided that no watched keys have been modified. It's important to note that even when a command fails, all the other commands in the queue are processed – Redis will not stop the processing of commands.
26
26
  def execute
27
- sync.call('EXEC')
27
+ sync.call("EXEC")
28
28
  end
29
29
 
30
30
  def discard
31
- sync.call('DISCARD')
31
+ sync.call("DISCARD")
32
32
  end
33
33
  end
34
34
  end
@@ -3,13 +3,13 @@
3
3
  # Released under the MIT License.
4
4
  # Copyright, 2024, by Samuel Williams.
5
5
 
6
- require 'io/endpoint'
7
- require 'io/endpoint/host_endpoint'
8
- require 'io/endpoint/ssl_endpoint'
6
+ require "io/endpoint"
7
+ require "io/endpoint/host_endpoint"
8
+ require "io/endpoint/ssl_endpoint"
9
9
 
10
- require_relative 'protocol/resp2'
11
- require_relative 'protocol/authenticated'
12
- require_relative 'protocol/selected'
10
+ require_relative "protocol/resp2"
11
+ require_relative "protocol/authenticated"
12
+ require_relative "protocol/selected"
13
13
 
14
14
  module Async
15
15
  module Redis
@@ -30,8 +30,8 @@ module Async
30
30
  end
31
31
 
32
32
  SCHEMES = {
33
- 'redis' => URI::Generic,
34
- 'rediss' => URI::Generic,
33
+ "redis" => URI::Generic,
34
+ "rediss" => URI::Generic,
35
35
  }
36
36
 
37
37
  def self.parse(string, endpoint = nil, **options)
@@ -117,7 +117,7 @@ module Async
117
117
  end
118
118
 
119
119
  def secure?
120
- ['rediss'].include?(self.scheme)
120
+ ["rediss"].include?(self.scheme)
121
121
  end
122
122
 
123
123
  def protocol
@@ -3,7 +3,7 @@
3
3
  # Released under the MIT License.
4
4
  # Copyright, 2024, by Samuel Williams.
5
5
 
6
- require 'protocol/redis'
6
+ require "protocol/redis"
7
7
 
8
8
  module Async
9
9
  module Redis
@@ -3,7 +3,7 @@
3
3
  # Released under the MIT License.
4
4
  # Copyright, 2018-2024, by Samuel Williams.
5
5
 
6
- require 'protocol/redis'
6
+ require "protocol/redis"
7
7
 
8
8
  module Async
9
9
  module Redis
@@ -3,7 +3,7 @@
3
3
  # Released under the MIT License.
4
4
  # Copyright, 2024, by Samuel Williams.
5
5
 
6
- require 'protocol/redis'
6
+ require "protocol/redis"
7
7
 
8
8
  module Async
9
9
  module Redis
@@ -3,14 +3,15 @@
3
3
  # Released under the MIT License.
4
4
  # Copyright, 2020, by David Ortiz.
5
5
  # Copyright, 2023-2024, by Samuel Williams.
6
+ # Copyright, 2024, by Joan Lledó.
6
7
 
7
- require_relative 'client'
8
- require 'io/stream'
8
+ require_relative "client"
9
+ require "io/stream"
9
10
 
10
11
  module Async
11
12
  module Redis
12
13
  class SentinelClient
13
- DEFAULT_MASTER_NAME = 'mymaster'
14
+ DEFAULT_MASTER_NAME = "mymaster"
14
15
 
15
16
  include ::Protocol::Redis::Methods
16
17
  include Client::Methods
@@ -30,7 +31,7 @@ module Async
30
31
  # A cache of sentinel connections.
31
32
  @sentinels = {}
32
33
 
33
- @pool = connect(**options)
34
+ @pool = make_pool(**options)
34
35
  end
35
36
 
36
37
  # @attribute [String] The name of the master instance.
@@ -64,26 +65,26 @@ module Async
64
65
 
65
66
  def failover(name = @master_name)
66
67
  sentinels do |client|
67
- return client.call('SENTINEL', 'FAILOVER', name)
68
+ return client.call("SENTINEL", "FAILOVER", name)
68
69
  end
69
70
  end
70
71
 
71
72
  def masters
72
73
  sentinels do |client|
73
- return client.call('SENTINEL', 'MASTERS').map{|fields| fields.each_slice(2).to_h}
74
+ return client.call("SENTINEL", "MASTERS").map{|fields| fields.each_slice(2).to_h}
74
75
  end
75
76
  end
76
77
 
77
78
  def master(name = @master_name)
78
79
  sentinels do |client|
79
- return client.call('SENTINEL', 'MASTER', name).each_slice(2).to_h
80
+ return client.call("SENTINEL", "MASTER", name).each_slice(2).to_h
80
81
  end
81
82
  end
82
83
 
83
84
  def resolve_master
84
85
  sentinels do |client|
85
86
  begin
86
- address = client.call('SENTINEL', 'GET-MASTER-ADDR-BY-NAME', @master_name)
87
+ address = client.call("SENTINEL", "GET-MASTER-ADDR-BY-NAME", @master_name)
87
88
  rescue Errno::ECONNREFUSED
88
89
  next
89
90
  end
@@ -97,7 +98,7 @@ module Async
97
98
  def resolve_slave
98
99
  sentinels do |client|
99
100
  begin
100
- reply = client.call('SENTINEL', 'SLAVES', @master_name)
101
+ reply = client.call("SENTINEL", "SLAVES", @master_name)
101
102
  rescue Errno::ECONNREFUSED
102
103
  next
103
104
  end
@@ -106,7 +107,7 @@ module Async
106
107
  next if slaves.empty?
107
108
 
108
109
  slave = select_slave(slaves)
109
- return Endpoint.remote(slave['ip'], slave['port'])
110
+ return Endpoint.remote(slave["ip"], slave["port"])
110
111
  end
111
112
 
112
113
  return nil
@@ -114,8 +115,14 @@ module Async
114
115
 
115
116
  protected
116
117
 
118
+ def assign_default_tags(tags)
119
+ tags[:protocol] = @protocol.to_s
120
+ end
121
+
117
122
  # Override the parent method. The only difference is that this one needs to resolve the master/slave address.
118
- def connect(**options)
123
+ def make_pool(**options)
124
+ self.assign_default_tags(options[:tags] ||= {})
125
+
119
126
  Async::Pool::Controller.wrap(**options) do
120
127
  endpoint = resolve_address
121
128
  peer = endpoint.connect
@@ -141,7 +148,7 @@ module Async
141
148
  slaves = reply.map{|fields| fields.each_slice(2).to_h}
142
149
 
143
150
  slaves.reject do |slave|
144
- slave['flags'].split(',').include?('s_down')
151
+ slave["flags"].split(",").include?("s_down")
145
152
  end
146
153
  end
147
154
 
@@ -5,6 +5,6 @@
5
5
 
6
6
  module Async
7
7
  module Redis
8
- VERSION = "0.10.1"
8
+ VERSION = "0.11.0"
9
9
  end
10
10
  end
data/lib/async/redis.rb CHANGED
@@ -1,11 +1,11 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  # Released under the MIT License.
4
- # Copyright, 2018-2023, by Samuel Williams.
4
+ # Copyright, 2018-2024, by Samuel Williams.
5
5
  # Copyright, 2020, by David Ortiz.
6
6
 
7
- require_relative 'redis/version'
8
- require_relative 'redis/client'
7
+ require_relative "redis/version"
8
+ require_relative "redis/client"
9
9
 
10
- require_relative 'redis/cluster_client'
11
- require_relative 'redis/sentinel_client'
10
+ require_relative "redis/cluster_client"
11
+ require_relative "redis/sentinel_client"
data/license.md CHANGED
@@ -12,6 +12,7 @@ Copyright, 2021, by Olle Jonsson.
12
12
  Copyright, 2021, by Troex Nevelin.
13
13
  Copyright, 2022, by Tim Willard.
14
14
  Copyright, 2022, by Gleb Sinyavskiy.
15
+ Copyright, 2024, by Joan Lledó.
15
16
 
16
17
  Permission is hereby granted, free of charge, to any person obtaining a copy
17
18
  of this software and associated documentation files (the "Software"), to deal
data.tar.gz.sig CHANGED
Binary file
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: async-redis
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.10.1
4
+ version: 0.11.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Samuel Williams
@@ -12,6 +12,7 @@ authors:
12
12
  - Troex Nevelin
13
13
  - Alex Matchneer
14
14
  - Jeremy Jung
15
+ - Joan Lledó
15
16
  - Olle Jonsson
16
17
  - Pierre Montelle
17
18
  - Salim Semaoune
@@ -48,7 +49,7 @@ cert_chain:
48
49
  Q2K9NVun/S785AP05vKkXZEFYxqG6EW012U4oLcFl5MySFajYXRYbuUpH6AY+HP8
49
50
  voD0MPg1DssDLKwXyt1eKD/+Fq0bFWhwVM/1XiAXL7lyYUyOq24KHgQ2Csg=
50
51
  -----END CERTIFICATE-----
51
- date: 2024-08-22 00:00:00.000000000 Z
52
+ date: 2024-11-12 00:00:00.000000000 Z
52
53
  dependencies:
53
54
  - !ruby/object:Gem::Dependency
54
55
  name: async
@@ -164,7 +165,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
164
165
  - !ruby/object:Gem::Version
165
166
  version: '0'
166
167
  requirements: []
167
- rubygems_version: 3.5.11
168
+ rubygems_version: 3.5.22
168
169
  signing_key:
169
170
  specification_version: 4
170
171
  summary: A Redis client library.
metadata.gz.sig CHANGED
Binary file