gapic-common 0.19.0 → 0.20.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 8f4c41c2fffb829cfadc7792a8e1e2a15162ae960ae810f216dd4cb677dc9098
4
- data.tar.gz: 3214f4236eb38446cf46b89d1957c659abbbb8265eecafe6275d8448dfdfabb8
3
+ metadata.gz: dd54dc9471821e191b81b38efd0e03c24cfaaad13093b7b20d174a7235db9408
4
+ data.tar.gz: dda7b540eedb2fb8f665548a6844b6c98c6b5e0b601d4627be16d229cdc1b65f
5
5
  SHA512:
6
- metadata.gz: d18733e8a412ed7c366e14a253a62f460b1685503ee71bc435b35bd152263a48ace22f7d3be1da50c39da7b67bdcd720e70054154cee029c68cb670a0b79e25c
7
- data.tar.gz: f409bbbe7036ab93a7952b5085b1bd11af4ee902afe36625fe2872bc142ced1c27f22b88d967ad4fb64d35d141af7cba678ab57bcae8f5709132db1e3e3b9c84
6
+ metadata.gz: cedbf49ae436a114a347723bda04637fee02481d7a56624f80f79ab1e2903ccc290a7667e1584d11c66bc0b60295333315f99ac15d01806c1713171ed3179dde
7
+ data.tar.gz: a4f733db0e1bb0e158d982fe189dc510195e24299fa8880255917ae7a68b2a2d47ff740bf304fd187678c2ace7c9a75cdabf341347e0f0066fe16e40e7e8d0be
data/CHANGELOG.md CHANGED
@@ -1,5 +1,21 @@
1
1
  # Release History
2
2
 
3
+ ### 0.20.0 (2023-08-31)
4
+
5
+ #### Features
6
+
7
+ * Add channel pooling for gapic clients ([#969](https://github.com/googleapis/gapic-generator-ruby/issues/969))
8
+ * Add LRU hash ([#970](https://github.com/googleapis/gapic-generator-ruby/issues/970))
9
+ #### Documentation
10
+
11
+ * Minor fixes to YARD documentation links and parameters ([#959](https://github.com/googleapis/gapic-generator-ruby/issues/959))
12
+
13
+ ### 0.19.1 (2023-05-30)
14
+
15
+ #### Bug Fixes
16
+
17
+ * Fixed handling of optional fields in coerce ([#954](https://github.com/googleapis/gapic-generator-ruby/issues/954))
18
+
3
19
  ### 0.19.0 (2023-05-26)
4
20
 
5
21
  #### Features
@@ -37,7 +37,7 @@ module Gapic
37
37
  # @param timeout [Numeric] The client-side timeout for RPC calls.
38
38
  # @param metadata [Hash] The request header params.
39
39
  # @param retry_policy [Hash, RetryPolicy, Proc] The policy for error retry. A Hash can be provided to
40
- # customize the policy object, using keys that match the arguments for {RetryPolicy.new}.
40
+ # customize the policy object, using keys that match the arguments for {RetryPolicy.initialize}.
41
41
  #
42
42
  # A Proc object can also be provided. The Proc should accept an error as an argument, and return `true` if the
43
43
  # error should be retried or `false` if not. If the error is to be retried, the Proc object must also block
@@ -59,9 +59,8 @@ module Gapic
59
59
  #
60
60
  # @param timeout [Numeric] The client-side timeout for RPC calls.
61
61
  # @param metadata [Hash] the request header params.
62
- # @param retry_policy [Hash] the policy for error retry.
63
62
  # @param retry_policy [Hash] The policy for error retry. keys must match the arguments for
64
- # {RetryPolicy.new}.
63
+ # {RetryPolicy.initialize}.
65
64
  #
66
65
  def apply_defaults timeout: nil, metadata: nil, retry_policy: nil
67
66
  @timeout ||= timeout
@@ -14,6 +14,6 @@
14
14
 
15
15
  module Gapic
16
16
  module Common
17
- VERSION = "0.19.0".freeze
17
+ VERSION = "0.20.0".freeze
18
18
  end
19
19
  end
data/lib/gapic/config.rb CHANGED
@@ -44,9 +44,9 @@ module Gapic
44
44
  ##
45
45
  # Add configuration attribute methods to the configuratin class.
46
46
  #
47
- # @param [String, Symbol] key The name of the option
48
- # @param [Object, nil] initial Initial value (nil is allowed)
49
- # @param [Hash] opts Validation options
47
+ # @param [String, Symbol] name The name of the option
48
+ # @param [Object, nil] default Initial value (nil is allowed)
49
+ # @param [Array] valid_values A list of valid types
50
50
  #
51
51
  def config_attr name, default, *valid_values, &validator
52
52
  name = String(name).to_sym
@@ -90,7 +90,7 @@ module Gapic
90
90
  #
91
91
  def results
92
92
  return error if error?
93
- return response if response?
93
+ response if response?
94
94
  end
95
95
 
96
96
  ##
@@ -196,7 +196,7 @@ module Gapic
196
196
  # @param retry_policy [RetryPolicy, Hash, Proc] The policy for retry. A custom proc that takes the error as an
197
197
  # argument and blocks can also be provided.
198
198
  #
199
- # @yield operation [Gapic::GenericLRO::Operation] Yields the finished Operation.
199
+ # @yieldparam operation [Gapic::GenericLRO::Operation] Yields the finished Operation.
200
200
  #
201
201
  def wait_until_done! retry_policy: nil
202
202
  retry_policy = ::Gapic::Operation::RetryPolicy.new(**retry_policy) if retry_policy.is_a? Hash
@@ -216,7 +216,7 @@ module Gapic
216
216
  # Registers a callback to be run when an operation is being reloaded. If the operation has completed
217
217
  # prior to a call to this function the callback will NOT be called or registered.
218
218
  #
219
- # @yield operation [Gapic::Operation] Yields the finished Operation.
219
+ # @yieldparam operation [Gapic::Operation] Yields the finished Operation.
220
220
  #
221
221
  def on_reload &block
222
222
  return if done?
@@ -227,7 +227,7 @@ module Gapic
227
227
  # Registers a callback to be run when a refreshed operation is marked as done. If the operation has completed
228
228
  # prior to a call to this function the callback will be called instead of registered.
229
229
  #
230
- # @yield operation [Gapic::Operation] Yields the finished Operation.
230
+ # @yieldparam operation [Gapic::Operation] Yields the finished Operation.
231
231
  #
232
232
  def on_done &block
233
233
  if done?
@@ -0,0 +1,102 @@
1
+ # Copyright 2023 Google LLC
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # https://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ require "grpc"
16
+ require "googleauth"
17
+ require "gapic/grpc/service_stub/rpc_call"
18
+
19
+ module Gapic
20
+ class ServiceStub
21
+ ##
22
+ # @private
23
+ #
24
+ # Gapic gRPC ServiceStub Channel.
25
+ #
26
+ # This class wraps the gRPC stub object and its RPC methods.
27
+ #
28
+ class Channel
29
+ attr_reader :concurrent_streams
30
+
31
+ ##
32
+ # Creates a new Channel instance
33
+ #
34
+ def initialize grpc_stub_class, endpoint:, credentials:, channel_args: nil, interceptors: nil,
35
+ on_channel_create: nil
36
+ @grpc_stub_class = grpc_stub_class
37
+ @endpoint = endpoint
38
+ @credentials = credentials
39
+ @channel_args = Hash channel_args
40
+ @interceptors = Array interceptors
41
+ @concurrent_streams = 0
42
+ @mutex = Mutex.new
43
+ setup_grpc_stub
44
+ on_channel_create&.call self
45
+ end
46
+
47
+ ##
48
+ # Creates a gRPC stub object
49
+ #
50
+ def setup_grpc_stub
51
+ raise ArgumentError, "grpc_stub_class is required" if @grpc_stub_class.nil?
52
+ raise ArgumentError, "endpoint is required" if @endpoint.nil?
53
+ raise ArgumentError, "credentials is required" if @credentials.nil?
54
+
55
+ @grpc_stub = case @credentials
56
+ when ::GRPC::Core::Channel
57
+ @grpc_stub_class.new @endpoint, nil, channel_override: @credentials, interceptors: @interceptors
58
+ when ::GRPC::Core::ChannelCredentials, Symbol
59
+ @grpc_stub_class.new @endpoint, @credentials, channel_args: @channel_args,
60
+ interceptors: @interceptors
61
+ else
62
+ updater_proc = @credentials.updater_proc if @credentials.respond_to? :updater_proc
63
+ updater_proc ||= @credentials if @credentials.is_a? Proc
64
+ raise ArgumentError, "invalid credentials (#{credentials.class})" if updater_proc.nil?
65
+
66
+ call_creds = ::GRPC::Core::CallCredentials.new updater_proc
67
+ chan_creds = ::GRPC::Core::ChannelCredentials.new.compose call_creds
68
+ @grpc_stub_class.new @endpoint, chan_creds, channel_args: @channel_args,
69
+ interceptors: @interceptors
70
+ end
71
+ end
72
+
73
+ ##
74
+ # Invoke the specified RPC call.
75
+ #
76
+ # @param method_name [Symbol] The RPC method name.
77
+ # @param request [Object] The request object.
78
+ # @param options [Gapic::CallOptions, Hash] The options for making the RPC call. A Hash can be provided to
79
+ # customize the options object, using keys that match the arguments for {Gapic::CallOptions.new}. This object
80
+ # should only be used once.
81
+ #
82
+ # @yield [response, operation] Access the response along with the RPC operation.
83
+ # @yieldparam response [Object] The response object.
84
+ # @yieldparam operation [::GRPC::ActiveCall::Operation] The RPC operation for the response.
85
+ #
86
+ # @return [Object] The response object.
87
+ #
88
+ def call_rpc method_name, request, options: nil, &block
89
+ @mutex.synchronize { @concurrent_streams += 1 }
90
+ begin
91
+ rpc_call = RpcCall.new @grpc_stub.method method_name
92
+ response = rpc_call.call request, options: options, &block
93
+ response
94
+ rescue StandardError => e
95
+ raise e
96
+ ensure
97
+ @mutex.synchronize { @concurrent_streams -= 1 }
98
+ end
99
+ end
100
+ end
101
+ end
102
+ end
@@ -0,0 +1,113 @@
1
+ # Copyright 2023 Google LLC
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # https://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ require "grpc"
16
+ require "googleauth"
17
+ require "gapic/config"
18
+
19
+
20
+ module Gapic
21
+ class ServiceStub
22
+ ##
23
+ # @private
24
+ #
25
+ # Gapic gRPC ServiceStub ChannelPool
26
+ #
27
+ # This class wraps multiple channels for sending RPCs.
28
+ #
29
+ class ChannelPool
30
+ ##
31
+ # Initialize an instance of ServiceStub::ChannelPool
32
+ #
33
+ def initialize grpc_stub_class, endpoint:, credentials:, channel_args: nil, interceptors: nil, config: nil
34
+ if credentials.is_a? ::GRPC::Core::Channel
35
+ raise ArgumentError, "Can't create a channel pool with GRPC::Core::Channel as credentials"
36
+ end
37
+
38
+ @grpc_stub_class = grpc_stub_class
39
+ @endpoint = endpoint
40
+ @credentials = credentials
41
+ @channel_args = channel_args
42
+ @interceptors = interceptors
43
+ @config = config || Configuration.new
44
+
45
+ @channels = (1..@config.channel_count).map { create_channel }
46
+ end
47
+
48
+ ##
49
+ # Creates a new channel.
50
+ def create_channel
51
+ Channel.new @grpc_stub_class, endpoint: @endpoint, credentials: @credentials, channel_args: @channel_args,
52
+ interceptors: @interceptors, on_channel_create: @config.on_channel_create
53
+ end
54
+
55
+ ##
56
+ # Invoke the specified RPC call.
57
+ #
58
+ # @param method_name [Symbol] The RPC method name.
59
+ # @param request [Object] The request object.
60
+ # @param options [Gapic::CallOptions, Hash] The options for making the RPC call. A Hash can be provided to
61
+ # customize the options object, using keys that match the arguments for {Gapic::CallOptions.new}. This object
62
+ # should only be used once.
63
+ #
64
+ # @yield [response, operation] Access the response along with the RPC operation.
65
+ # @yieldparam response [Object] The response object.
66
+ # @yieldparam operation [::GRPC::ActiveCall::Operation] The RPC operation for the response.
67
+ #
68
+ # @return [Object] The response object.
69
+ #
70
+ def call_rpc method_name, request, options: nil, &block
71
+ unless @config.channel_selection == :least_loaded
72
+ warn "Invalid channel selection configuration, resorting to least loaded channel"
73
+ end
74
+ channel = least_loaded_channel
75
+ channel.call_rpc method_name, request, options: options, &block
76
+ end
77
+
78
+
79
+ private
80
+
81
+ ##
82
+ # Return the least loaded channel in the pool
83
+ #
84
+ # @return [::Grpc::ServiceStub::Channel]
85
+ #
86
+ def least_loaded_channel
87
+ @channels.min_by(&:concurrent_streams)
88
+ end
89
+
90
+ ##
91
+ # Configuration class for ChannelPool
92
+ #
93
+ # @!attribute [rw] channel_count
94
+ # The number of channels in the channel pool.
95
+ # return [Integer]
96
+ # @!attribute [rw] on_channel_create
97
+ # Proc to run at the end of each channel initialization.
98
+ # Proc is provided ::Gapic::ServiceStub::Channel object as input.
99
+ # return [Proc]
100
+ # @!attribute [rw] channel_selection
101
+ # The algorithm for selecting a channel for an RPC.
102
+ # return [Symbol]
103
+ #
104
+ class Configuration
105
+ extend ::Gapic::Config
106
+
107
+ config_attr :channel_count, 1, ::Integer
108
+ config_attr :on_channel_create, nil, ::Proc
109
+ config_attr :channel_selection, :least_loaded, :least_loaded
110
+ end
111
+ end
112
+ end
113
+ end
@@ -15,18 +15,24 @@
15
15
  require "grpc"
16
16
  require "googleauth"
17
17
  require "gapic/grpc/service_stub/rpc_call"
18
+ require "gapic/grpc/service_stub/channel"
19
+ require "gapic/grpc/service_stub/channel_pool"
20
+
18
21
 
19
22
  module Gapic
20
23
  ##
21
24
  # Gapic gRPC Stub
22
25
  #
23
- # This class wraps the actual gRPC Stub object and it's RPC methods.
26
+ # This class wraps the actual gRPC Stub and ChannelPool objects.
24
27
  #
25
28
  # @!attribute [r] grpc_stub
26
29
  # @return [Object] The instance of the gRPC stub class (`grpc_stub_class`) constructor argument.
30
+ # @!attribute [r] channel_pool
31
+ # @return [Gapic::ServiceStub::ChannelPool] The instance of the ChannelPool class.
27
32
  #
28
33
  class ServiceStub
29
34
  attr_reader :grpc_stub
35
+ attr_reader :channel_pool
30
36
 
31
37
  ##
32
38
  # Creates a Gapic gRPC stub object.
@@ -49,22 +55,49 @@ module Gapic
49
55
  # provided as a `::GRPC::Core::Channel`.)
50
56
  # @param interceptors [Array<::GRPC::ClientInterceptor>] An array of {::GRPC::ClientInterceptor} objects that will
51
57
  # be used for intercepting calls before they are executed Interceptors are an EXPERIMENTAL API.
58
+ # @param channel_pool_config [::Gapic::ServiceStub:ChannelPool::Configuration] The configuration for channel
59
+ # pool. This argument will raise error when `credentials` is provided as a `::GRPC::Core::Channel`.
52
60
  #
53
- def initialize grpc_stub_class, endpoint:, credentials:, channel_args: nil, interceptors: nil
61
+ def initialize grpc_stub_class, endpoint:, credentials:, channel_args: nil,
62
+ interceptors: nil, channel_pool_config: nil
54
63
  raise ArgumentError, "grpc_stub_class is required" if grpc_stub_class.nil?
55
64
  raise ArgumentError, "endpoint is required" if endpoint.nil?
56
65
  raise ArgumentError, "credentials is required" if credentials.nil?
57
66
 
67
+ @channel_pool = nil
68
+ @grpc_stub = nil
58
69
  channel_args = Hash channel_args
59
70
  interceptors = Array interceptors
60
71
 
72
+
73
+ if channel_pool_config && channel_pool_config.channel_count > 1
74
+ create_channel_pool grpc_stub_class, endpoint: endpoint, credentials: credentials,
75
+ channel_args: channel_args, interceptors: interceptors,
76
+ channel_pool_config: channel_pool_config
77
+ else
78
+ create_grpc_stub grpc_stub_class, endpoint: endpoint, credentials: credentials,
79
+ channel_args: channel_args, interceptors: interceptors
80
+ end
81
+ end
82
+
83
+ def create_channel_pool grpc_stub_class, endpoint:, credentials:, channel_args: nil,
84
+ interceptors: nil, channel_pool_config: nil
85
+ if credentials.is_a? ::GRPC::Core::Channel
86
+ raise ArgumentError, "Cannot create a channel pool with GRPC::Core::Channel as credentials"
87
+ end
88
+ @channel_pool = ChannelPool.new grpc_stub_class, endpoint: endpoint, credentials: credentials,
89
+ channel_args: channel_args, interceptors: interceptors,
90
+ config: channel_pool_config
91
+ end
92
+
93
+ def create_grpc_stub grpc_stub_class, endpoint:, credentials:, channel_args: nil, interceptors: nil
61
94
  @grpc_stub = case credentials
62
95
  when ::GRPC::Core::Channel
63
96
  grpc_stub_class.new endpoint, nil, channel_override: credentials,
64
- interceptors: interceptors
97
+ interceptors: interceptors
65
98
  when ::GRPC::Core::ChannelCredentials, Symbol
66
99
  grpc_stub_class.new endpoint, credentials, channel_args: channel_args,
67
- interceptors: interceptors
100
+ interceptors: interceptors
68
101
  else
69
102
  updater_proc = credentials.updater_proc if credentials.respond_to? :updater_proc
70
103
  updater_proc ||= credentials if credentials.is_a? Proc
@@ -73,7 +106,7 @@ module Gapic
73
106
  call_creds = ::GRPC::Core::CallCredentials.new updater_proc
74
107
  chan_creds = ::GRPC::Core::ChannelCredentials.new.compose call_creds
75
108
  grpc_stub_class.new endpoint, chan_creds, channel_args: channel_args,
76
- interceptors: interceptors
109
+ interceptors: interceptors
77
110
  end
78
111
  end
79
112
 
@@ -152,8 +185,12 @@ module Gapic
152
185
  # end
153
186
  #
154
187
  def call_rpc method_name, request, options: nil, &block
155
- rpc_call = RpcCall.new @grpc_stub.method method_name
156
- rpc_call.call request, options: options, &block
188
+ if @channel_pool.nil?
189
+ rpc_call = RpcCall.new @grpc_stub.method method_name
190
+ rpc_call.call request, options: options, &block
191
+ else
192
+ @channel_pool.call_rpc method_name, request, options: options, &block
193
+ end
157
194
  end
158
195
  end
159
196
  end
@@ -0,0 +1,106 @@
1
+ # Copyright 2023 Google LLC
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # https://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ module Gapic
16
+ ##
17
+ # @private
18
+ #
19
+ # Linked list based hash maintaining the order of
20
+ # access/creation of the keys.
21
+ #
22
+ class LruHash
23
+ def initialize size = 1
24
+ raise ArgumentError, "The size of LRU hash can't be < 1" unless size > 1
25
+ @start = nil
26
+ @end = nil
27
+ @size = size
28
+ @cache = {}
29
+ end
30
+
31
+ def get key
32
+ return nil unless @cache.key? key
33
+ node = @cache[key]
34
+ move_to_top node
35
+ node.value
36
+ end
37
+
38
+ def put key, value
39
+ if @cache.key? key
40
+ node = @cache[key]
41
+ node.value = value
42
+ move_to_top node
43
+ else
44
+ remove_tail if @cache.size >= @size
45
+ new_node = Node.new key, value
46
+ insert_at_top new_node
47
+ @cache[key] = new_node
48
+ end
49
+ end
50
+
51
+ private
52
+
53
+ def move_to_top node
54
+ return if node.equal? @start
55
+
56
+ if node.equal? @end
57
+ @end = node.prev
58
+ @end.next = nil
59
+ else
60
+ node.prev.next = node.next
61
+ node.next.prev = node.prev
62
+ end
63
+
64
+ node.prev = nil
65
+ node.next = @start
66
+ @start.prev = node
67
+ @start = node
68
+ end
69
+
70
+ def remove_tail
71
+ @cache.delete @end.key
72
+ @end = @end.prev
73
+ @end.next = nil if @end
74
+ end
75
+
76
+ def insert_at_top node
77
+ if @start.nil?
78
+ @start = node
79
+ @end = node
80
+ else
81
+ node.next = @start
82
+ @start.prev = node
83
+ @start = node
84
+ end
85
+ end
86
+
87
+ ##
88
+ # @private
89
+ #
90
+ # Node class for linked list.
91
+ #
92
+ class Node
93
+ attr_accessor :key
94
+ attr_accessor :value
95
+ attr_accessor :prev
96
+ attr_accessor :next
97
+
98
+ def initialize key, value
99
+ @key = key
100
+ @value = value
101
+ @prev = nil
102
+ @next = nil
103
+ end
104
+ end
105
+ end
106
+ end
@@ -99,10 +99,10 @@ module Gapic
99
99
  # returned. Otherwise returns nil.
100
100
  #
101
101
  # @return [Object, Google::Rpc::Status, nil] The result of the operation. If it is an error a
102
- # {Google::Rpc::Status} will be returned.
102
+ # `Google::Rpc::Status` will be returned.
103
103
  def results
104
104
  return error if error?
105
- return response if response?
105
+ response if response?
106
106
  end
107
107
 
108
108
  ##
@@ -119,7 +119,7 @@ module Gapic
119
119
  # Returns the metadata of an operation. If a type is provided, the metadata will be unpacked using the type
120
120
  # provided; returning nil if the metadata is not of the type provided. If the type is not of provided, the
121
121
  # metadata will be unpacked using the metadata's type_url if the type_url is found in the
122
- # {Google::Protobuf::DescriptorPool.generated_pool}. If the type cannot be found the raw metadata is retuned.
122
+ # `Google::Protobuf::DescriptorPool.generated_pool`. If the type cannot be found the raw metadata is retuned.
123
123
  #
124
124
  # @return [Object, nil] The metadata of the operation. Can be nil.
125
125
  #
@@ -250,7 +250,7 @@ module Gapic
250
250
  # @param retry_policy [RetryPolicy, Hash, Proc] The policy for retry. A custom proc that takes the error as an
251
251
  # argument and blocks can also be provided.
252
252
  #
253
- # @yield operation [Gapic::Operation] Yields the finished Operation.
253
+ # @yieldparam operation [Gapic::Operation] Yields the finished Operation.
254
254
  #
255
255
  def wait_until_done! retry_policy: nil
256
256
  retry_policy = RetryPolicy.new(**retry_policy) if retry_policy.is_a? Hash
@@ -270,7 +270,7 @@ module Gapic
270
270
  # Registers a callback to be run when a refreshed operation is marked as done. If the operation has completed
271
271
  # prior to a call to this function the callback will be called instead of registered.
272
272
  #
273
- # @yield operation [Gapic::Operation] Yields the finished Operation.
273
+ # @yieldparam operation [Gapic::Operation] Yields the finished Operation.
274
274
  #
275
275
  def on_done &block
276
276
  if done?
@@ -31,6 +31,7 @@ module Gapic
31
31
  # @return [Object] An instance of the given message class.
32
32
  def self.coerce hash, to:
33
33
  return hash if hash.is_a? to
34
+ return nil if hash.nil?
34
35
 
35
36
  # Special case handling of certain types
36
37
  return time_to_timestamp hash if to == Google::Protobuf::Timestamp && hash.is_a?(Time)
@@ -117,7 +117,7 @@ module Gapic
117
117
  field_value = extract_scalar_value! request_hash, field_path_camel, field_binding.regex
118
118
 
119
119
  if field_value
120
- field_value = field_value.split("/").map { |segment| percent_escape(segment) }.join("/")
120
+ field_value = field_value.split("/").map { |segment| percent_escape segment }.join("/")
121
121
  end
122
122
 
123
123
  [field_binding.field_path, field_value]
@@ -126,7 +126,7 @@ module Gapic
126
126
 
127
127
  # Percent-escapes a string.
128
128
  # @param str [String] String to escape.
129
- # @return str [String] Escaped string.
129
+ # @return [String] Escaped string.
130
130
  def percent_escape str
131
131
  # `+` to represent spaces is not currently supported in Showcase server.
132
132
  CGI.escape(str).gsub("+", "%20")
@@ -218,7 +218,7 @@ module Gapic
218
218
 
219
219
  # Covers the case where in `foo.bar.baz`, `baz` is still a submessage or an array.
220
220
  return nil if value.is_a?(::Hash) || value.is_a?(::Array)
221
- return value.to_s if value.to_s =~ regex
221
+ value.to_s if value.to_s =~ regex
222
222
  end
223
223
 
224
224
  # Finds a value in the hash by path.
@@ -28,7 +28,7 @@ module Gapic
28
28
 
29
29
  ##
30
30
  # @private
31
- # @param request [::Object, nil, ::Faraday::Response]
31
+ # @param underlying_op [::Object, nil, ::Faraday::Response]
32
32
  # The underlying transport's library object that describes the active call, if any.
33
33
  def initialize underlying_op
34
34
  @underlying_op = underlying_op
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: gapic-common
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.19.0
4
+ version: 0.20.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Google API Authors
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-05-26 00:00:00.000000000 Z
11
+ date: 2023-09-05 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: faraday
@@ -132,6 +132,20 @@ dependencies:
132
132
  - - "~>"
133
133
  - !ruby/object:Gem::Version
134
134
  version: '1.36'
135
+ - !ruby/object:Gem::Dependency
136
+ name: concurrent-ruby
137
+ requirement: !ruby/object:Gem::Requirement
138
+ requirements:
139
+ - - "~>"
140
+ - !ruby/object:Gem::Version
141
+ version: 1.2.2
142
+ type: :development
143
+ prerelease: false
144
+ version_requirements: !ruby/object:Gem::Requirement
145
+ requirements:
146
+ - - "~>"
147
+ - !ruby/object:Gem::Version
148
+ version: 1.2.2
135
149
  - !ruby/object:Gem::Dependency
136
150
  name: google-cloud-core
137
151
  requirement: !ruby/object:Gem::Requirement
@@ -300,9 +314,12 @@ files:
300
314
  - lib/gapic/grpc.rb
301
315
  - lib/gapic/grpc/errors.rb
302
316
  - lib/gapic/grpc/service_stub.rb
317
+ - lib/gapic/grpc/service_stub/channel.rb
318
+ - lib/gapic/grpc/service_stub/channel_pool.rb
303
319
  - lib/gapic/grpc/service_stub/rpc_call.rb
304
320
  - lib/gapic/grpc/status_details.rb
305
321
  - lib/gapic/headers.rb
322
+ - lib/gapic/lru_hash.rb
306
323
  - lib/gapic/operation.rb
307
324
  - lib/gapic/operation/retry_policy.rb
308
325
  - lib/gapic/paged_enumerable.rb
@@ -338,7 +355,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
338
355
  - !ruby/object:Gem::Version
339
356
  version: '0'
340
357
  requirements: []
341
- rubygems_version: 3.4.2
358
+ rubygems_version: 3.4.19
342
359
  signing_key:
343
360
  specification_version: 4
344
361
  summary: Common code for GAPIC-generated API clients