gapic-common 0.14.0 → 0.17.1

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: ea69666c3f5162e9949825974c29af5ca636527a25e67d0ce034c2bb6c39b201
4
- data.tar.gz: 68df57288727233549f5ababcd296b545bd4a1e10bdc29caae1891019c3995ba
3
+ metadata.gz: 508b67fe556c18e32cab88da23a0097e425df549e288b72fec7d4a891b6c06f5
4
+ data.tar.gz: 29bbc436a310b93f2f043502344783835ba25ed91d5ac8523c190da0ecd019b4
5
5
  SHA512:
6
- metadata.gz: 8c83345123a2739aa89f31aefb00288c8ae7e831af653a654872601a2e646ddd9b7d7356aa82e403b5c2571cae2bd437fbf4ff8c38e70822cfc18c89ea89f883
7
- data.tar.gz: a95b2ec76934bec8140e6c65b627644833143f313117cd86d867dcda0e3bfdf00407f86c8b33d0f52165de5549c3207119a8b5b506cba5b9da8c41a58846cf78
6
+ metadata.gz: 34e4be1fc16714c9afc6bd0d9ca832ae7409521d0ec9f10c41860e817c8ee28599d6853a0c84a780dc3e3fc19d33882068d613f2691d6ee99392b68f2c5dbe04
7
+ data.tar.gz: 6f130dd5c05535efc27e67f51a6b593082519a04601d69111db010d097e7c150501e9cee2845d4937c175fce79451f413b5e125e9f74d01f66634d74d6b9604a
data/CHANGELOG.md CHANGED
@@ -1,5 +1,35 @@
1
1
  # Release History
2
2
 
3
+ ### 0.17.1 (2023-02-09)
4
+
5
+ #### Bug Fixes
6
+
7
+ * add new class to the rest imports ([#913](https://github.com/googleapis/gapic-generator-ruby/issues/913))
8
+
9
+ ### 0.17.0 (2023-02-09)
10
+
11
+ #### Features
12
+
13
+ * add a transport operation class in Rest ([#911](https://github.com/googleapis/gapic-generator-ruby/issues/911))
14
+
15
+ ### 0.16.0 (2022-12-12)
16
+
17
+ #### Features
18
+
19
+ * custom regapic exception wrapping ([#866](https://github.com/googleapis/gapic-generator-ruby/issues/866))
20
+
21
+ ### 0.15.1 (2022-11-18)
22
+
23
+ #### Bug Fixes
24
+
25
+ * Fixed uninitialized constant when checking retry policy for a REST call ([#857](https://github.com/googleapis/gapic-generator-ruby/issues/857))
26
+
27
+ ### 0.15.0 (2022-11-17)
28
+
29
+ #### Features
30
+
31
+ * retry policy now works for REST calls
32
+
3
33
  ### 0.14.0 (2022-11-08)
4
34
 
5
35
  #### Features
@@ -0,0 +1,74 @@
1
+ # Copyright 2019 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
+ class CallOptions
17
+ ##
18
+ # @private
19
+ # The gRPC error codes and their HTTP mapping
20
+ #
21
+ module ErrorCodes
22
+ # @private
23
+ # See https://grpc.github.io/grpc/core/md_doc_statuscodes.html for a
24
+ # list of error codes.
25
+ error_code_mapping = [
26
+ "OK",
27
+ "CANCELLED",
28
+ "UNKNOWN",
29
+ "INVALID_ARGUMENT",
30
+ "DEADLINE_EXCEEDED",
31
+ "NOT_FOUND",
32
+ "ALREADY_EXISTS",
33
+ "PERMISSION_DENIED",
34
+ "RESOURCE_EXHAUSTED",
35
+ "FAILED_PRECONDITION",
36
+ "ABORTED",
37
+ "OUT_OF_RANGE",
38
+ "UNIMPLEMENTED",
39
+ "INTERNAL",
40
+ "UNAVAILABLE",
41
+ "DATA_LOSS",
42
+ "UNAUTHENTICATED"
43
+ ].freeze
44
+
45
+ # @private
46
+ ERROR_STRING_MAPPING = error_code_mapping.each_with_index.to_h.freeze
47
+
48
+ # @private
49
+ HTTP_GRPC_CODE_MAP = {
50
+ 400 => 3, # InvalidArgumentError
51
+ 401 => 16, # UnauthenticatedError
52
+ 403 => 7, # PermissionDeniedError
53
+ 404 => 5, # NotFoundError
54
+ 409 => 6, # AlreadyExistsError
55
+ 412 => 9, # FailedPreconditionError
56
+ 429 => 8, # ResourceExhaustedError
57
+ 499 => 1, # CanceledError
58
+ 500 => 13, # InternalError
59
+ 501 => 12, # UnimplementedError
60
+ 503 => 14, # UnavailableError
61
+ 504 => 4 # DeadlineExceededError
62
+ }.freeze
63
+
64
+ # @private
65
+ # Converts http error codes into corresponding gRPC ones
66
+ def self.grpc_error_for http_error_code
67
+ return 2 unless http_error_code
68
+
69
+ # The http status codes mapped to their error classes.
70
+ HTTP_GRPC_CODE_MAP[http_error_code] || 2 # UnknownError
71
+ end
72
+ end
73
+ end
74
+ end
@@ -12,6 +12,8 @@
12
12
  # See the License for the specific language governing permissions and
13
13
  # limitations under the License.
14
14
 
15
+ require "gapic/call_options/error_codes"
16
+
15
17
  module Gapic
16
18
  class CallOptions
17
19
  ##
@@ -101,38 +103,12 @@ module Gapic
101
103
  [retry_codes, initial_delay, multiplier, max_delay].hash
102
104
  end
103
105
 
104
- # @private
105
- # See https://grpc.github.io/grpc/core/md_doc_statuscodes.html for a
106
- # list of error codes.
107
- ERROR_CODE_MAPPING = [
108
- "OK",
109
- "CANCELLED",
110
- "UNKNOWN",
111
- "INVALID_ARGUMENT",
112
- "DEADLINE_EXCEEDED",
113
- "NOT_FOUND",
114
- "ALREADY_EXISTS",
115
- "PERMISSION_DENIED",
116
- "RESOURCE_EXHAUSTED",
117
- "FAILED_PRECONDITION",
118
- "ABORTED",
119
- "OUT_OF_RANGE",
120
- "UNIMPLEMENTED",
121
- "INTERNAL",
122
- "UNAVAILABLE",
123
- "DATA_LOSS",
124
- "UNAUTHENTICATED"
125
- ].freeze
126
-
127
- # @private
128
- ERROR_STRING_MAPPING = ERROR_CODE_MAPPING.each_with_index.each_with_object({}) do |(str, num), hash|
129
- hash[str] = num
130
- end.freeze
131
-
132
106
  private
133
107
 
134
108
  def retry? error
135
- error.is_a?(::GRPC::BadStatus) && retry_codes.include?(error.code)
109
+ (defined?(::GRPC) && error.is_a?(::GRPC::BadStatus) && retry_codes.include?(error.code)) ||
110
+ (error.respond_to?(:response_status) &&
111
+ retry_codes.include?(ErrorCodes.grpc_error_for(error.response_status)))
136
112
  end
137
113
 
138
114
  def delay!
@@ -145,7 +121,7 @@ module Gapic
145
121
  Array(input_codes).map do |obj|
146
122
  case obj
147
123
  when String
148
- ERROR_STRING_MAPPING[obj]
124
+ ErrorCodes::ERROR_STRING_MAPPING[obj]
149
125
  when Integer
150
126
  obj
151
127
  end
@@ -12,6 +12,7 @@
12
12
  # See the License for the specific language governing permissions and
13
13
  # limitations under the License.
14
14
 
15
+ require "gapic/call_options/error_codes"
15
16
  require "gapic/call_options/retry_policy"
16
17
 
17
18
  module Gapic
@@ -14,6 +14,6 @@
14
14
 
15
15
  module Gapic
16
16
  module Common
17
- VERSION = "0.14.0".freeze
17
+ VERSION = "0.17.1".freeze
18
18
  end
19
19
  end
@@ -34,9 +34,15 @@ module Gapic
34
34
  # (see the [googleauth docs](https://googleapis.dev/ruby/googleauth/latest/index.html))
35
35
  # @param numeric_enums [Boolean] Whether to signal the server to JSON-encode enums as ints
36
36
  #
37
+ # @param raise_faraday_errors [Boolean]
38
+ # Whether to raise Faraday errors instead of wrapping them in `Gapic::Rest::Error`
39
+ # Added for backwards compatibility.
40
+ # Default is `true`. All REST clients (except for old versions of `google-cloud-compute-v1`)
41
+ # should explicitly set this parameter to `false`.
42
+ #
37
43
  # @yield [Faraday::Connection]
38
44
  #
39
- def initialize endpoint:, credentials:, numeric_enums: false
45
+ def initialize endpoint:, credentials:, numeric_enums: false, raise_faraday_errors: true
40
46
  @endpoint = endpoint
41
47
  @endpoint = "https://#{endpoint}" unless /^https?:/.match? endpoint
42
48
  @endpoint = @endpoint.sub %r{/$}, ""
@@ -44,6 +50,8 @@ module Gapic
44
50
  @credentials = credentials
45
51
  @numeric_enums = numeric_enums
46
52
 
53
+ @raise_faraday_errors = raise_faraday_errors
54
+
47
55
  @connection = Faraday.new url: @endpoint do |conn|
48
56
  conn.headers = { "Content-Type" => "application/json" }
49
57
  conn.request :google_authorization, @credentials unless @credentials.is_a? ::Symbol
@@ -125,21 +133,62 @@ module Gapic
125
133
  # @param uri [String] uri to send this request to
126
134
  # @param body [String, nil] a body to send with the request, nil for requests without a body
127
135
  # @param params [Hash] query string parameters for the request
128
- # @param options [::Gapic::CallOptions,Hash] gapic options to be applied
129
- # to the REST call. Currently only timeout and headers are supported.
136
+ # @param options [::Gapic::CallOptions,Hash] gapic options to be applied to the REST call.
130
137
  # @param is_server_streaming [Boolean] flag if method is streaming
131
138
  # @yieldparam chunk [String] The chunk of data received during server streaming.
132
139
  # @return [Faraday::Response]
133
- def make_http_request verb, uri:, body:, params:, options:, is_server_streaming: false
140
+ def make_http_request verb, uri:, body:, params:, options:, is_server_streaming: false, &block
141
+ # Converts hash and nil to an options object
142
+ options = ::Gapic::CallOptions.new(**options.to_h) unless options.is_a? ::Gapic::CallOptions
143
+ deadline = calculate_deadline options
144
+ retried_exception = nil
145
+ next_timeout = get_timeout deadline
146
+
147
+ begin
148
+ base_make_http_request(verb: verb, uri: uri, body: body,
149
+ params: params, metadata: options.metadata,
150
+ timeout: next_timeout,
151
+ is_server_streaming: is_server_streaming,
152
+ &block)
153
+ rescue ::Faraday::TimeoutError => e
154
+ raise if @raise_faraday_errors
155
+ raise Gapic::Rest::DeadlineExceededError.wrap_faraday_error e, root_cause: retried_exception
156
+ rescue ::Faraday::Error => e
157
+ next_timeout = get_timeout deadline
158
+
159
+ if check_retry?(next_timeout) && options.retry_policy.call(e)
160
+ retried_exception = e
161
+ retry
162
+ end
163
+
164
+ raise if @raise_faraday_errors
165
+ raise ::Gapic::Rest::Error.wrap_faraday_error e
166
+ end
167
+ end
168
+
169
+ ##
170
+ # @private
171
+ # Sends a http request via Faraday
172
+ #
173
+ # @param verb [Symbol] http verb
174
+ # @param uri [String] uri to send this request to
175
+ # @param body [String, nil] a body to send with the request, nil for requests without a body
176
+ # @param params [Hash] query string parameters for the request
177
+ # @param metadata [Hash] additional headers for the request
178
+ # @param is_server_streaming [Boolean] flag if method is streaming
179
+ # @yieldparam chunk [String] The chunk of data received during server streaming.
180
+ # @return [Faraday::Response]
181
+ def base_make_http_request verb:, uri:, body:, params:, metadata:,
182
+ timeout:, is_server_streaming: false
134
183
  if @numeric_enums && (!params.key?("$alt") || params["$alt"] == "json")
135
184
  params = params.merge({ "$alt" => "json;enum-encoding=int" })
136
185
  end
137
- options = ::Gapic::CallOptions.new(**options.to_h) unless options.is_a? ::Gapic::CallOptions
186
+
138
187
  @connection.send verb, uri do |req|
139
188
  req.params = params if params.any?
140
189
  req.body = body unless body.nil?
141
- req.headers = req.headers.merge options.metadata
142
- req.options.timeout = options.timeout if options.timeout&.positive?
190
+ req.headers = req.headers.merge metadata
191
+ req.options.timeout = timeout if timeout&.positive?
143
192
  if is_server_streaming
144
193
  req.options.on_data = proc do |chunk, _overall_received_bytes|
145
194
  yield chunk
@@ -147,6 +196,44 @@ module Gapic
147
196
  end
148
197
  end
149
198
  end
199
+
200
+ private
201
+
202
+ ##
203
+ # Calculates deadline
204
+ #
205
+ # @param options [Gapic::CallOptions] call options for this call
206
+ #
207
+ # @return [Numeric, nil] Deadline against a POSIX clock_gettime()
208
+ def calculate_deadline options
209
+ return if options.timeout.nil?
210
+ return if options.timeout.negative?
211
+
212
+ Process.clock_gettime(Process::CLOCK_MONOTONIC) + options.timeout
213
+ end
214
+
215
+ ##
216
+ # Calculates timeout (seconds) to use as a Faraday timeout
217
+ #
218
+ # @param deadline [Numeric, nil] deadline
219
+ #
220
+ # @return [Numeric, nil] Timeout (seconds)
221
+ def get_timeout deadline
222
+ return if deadline.nil?
223
+ deadline - Process.clock_gettime(Process::CLOCK_MONOTONIC)
224
+ end
225
+
226
+ ##
227
+ # Whether the timeout should be retried
228
+ #
229
+ # @param timeout [Numeric, nil]
230
+ #
231
+ # @return [Boolean] whether the timeout should be retried
232
+ def check_retry? timeout
233
+ return true if timeout.nil?
234
+
235
+ timeout.positive?
236
+ end
150
237
  end
151
238
  end
152
239
  end
@@ -55,6 +55,17 @@ module Gapic
55
55
  #
56
56
  # @return [ Gapic::Rest::Error]
57
57
  def wrap_faraday_error err
58
+ message, status_code, status, details, headers = parse_faraday_error err
59
+ Gapic::Rest::Error.new message, status_code, status: status, details: details, headers: headers
60
+ end
61
+
62
+ ##
63
+ # @private
64
+ # Tries to get the error information from Faraday error
65
+ #
66
+ # @param err [Faraday::Error] the Faraday error to extract information from
67
+ # @return [Array(String, String, String, String, String)]
68
+ def parse_faraday_error err
58
69
  message = err.message
59
70
  status_code = err.response_status
60
71
  status = nil
@@ -67,7 +78,7 @@ module Gapic
67
78
  status_code = code unless code.nil?
68
79
  end
69
80
 
70
- Gapic::Rest::Error.new message, status_code, status: status, details: details, headers: headers
81
+ [message, status_code, status, details, headers]
71
82
  end
72
83
 
73
84
  private
@@ -133,5 +144,62 @@ module Gapic
133
144
  end
134
145
  end
135
146
  end
147
+
148
+ ##
149
+ # An error class that represents DeadlineExceeded error for Rest
150
+ # with an optional retry root cause.
151
+ #
152
+ # If the deadline for making a call was exceeded during the rest calls,
153
+ # this exception is thrown wrapping Faraday::TimeoutError.
154
+ #
155
+ # If there were other exceptions retried before that, the last one will be
156
+ # saved as a "root_cause".
157
+ #
158
+ # @!attribute [r] root_cause
159
+ # @return [Object, nil] The exception that was being retried
160
+ # when the Faraday::TimeoutError error occured.
161
+ #
162
+ class DeadlineExceededError < Error
163
+ attr_reader :root_cause
164
+
165
+ ##
166
+ # @private
167
+ # @param message [String, nil] error message
168
+ # @param status_code [Integer, nil] HTTP status code of this error
169
+ # @param status [String, nil] The text representation of status as parsed from the response body
170
+ # @param details [Object, nil] Details data of this error
171
+ # @param headers [Object, nil] Http headers data of this error
172
+ # @param root_cause [Object, nil] The exception that was being retried
173
+ # when the Faraday::TimeoutError occured.
174
+ #
175
+ def initialize message, status_code, status: nil, details: nil, headers: nil, root_cause: nil
176
+ super message, status_code, status: status, details: details, headers: headers
177
+ @root_cause = root_cause
178
+ end
179
+
180
+ class << self
181
+ ##
182
+ # @private
183
+ # This creates a new error message wrapping the Faraday's one. Additionally
184
+ # it tries to parse and set a detailed message and an error code from
185
+ # from the Google Cloud's response body
186
+ #
187
+ # @param err [Faraday::TimeoutError] the Faraday error to wrap
188
+ #
189
+ # @param root_cause [Object, nil] The exception that was being retried
190
+ # when the Faraday::TimeoutError occured.
191
+ #
192
+ # @return [ Gapic::Rest::DeadlineExceededError]
193
+ def wrap_faraday_error err, root_cause: nil
194
+ message, status_code, status, details, headers = parse_faraday_error err
195
+ Gapic::Rest::DeadlineExceededError.new message,
196
+ status_code,
197
+ status: status,
198
+ details: details,
199
+ headers: headers,
200
+ root_cause: root_cause
201
+ end
202
+ end
203
+ end
136
204
  end
137
205
  end
@@ -15,6 +15,7 @@
15
15
  module Gapic
16
16
  module Rest
17
17
  class GrpcTranscoder
18
+ ##
18
19
  # @private
19
20
  # A single binding for GRPC-REST transcoding of a request
20
21
  # It includes a uri template with bound field parameters, a HTTP method type,
@@ -25,7 +26,8 @@ module Gapic
25
26
  # @attribute [r] template
26
27
  # @return [String] The URI template for the request.
27
28
  # @attribute [r] field_bindings
28
- # @return [Array<FieldBinding>] The field bindings for the URI template variables.
29
+ # @return [Array<Gapic::Rest::GrpcTranscoder::HttpBinding::FieldBinding>]
30
+ # The field bindings for the URI template variables.
29
31
  # @attribute [r] body
30
32
  # @return [String] The body template for the request.
31
33
  class HttpBinding
@@ -41,6 +43,57 @@ module Gapic
41
43
  @body = body
42
44
  end
43
45
 
46
+ ##
47
+ # @private
48
+ # Creates a new HttpBinding.
49
+ #
50
+ # @param uri_method [Symbol] The rest verb for the binding.
51
+ # @param uri_template [String] The string with uri template for the binding.
52
+ # This string will be expanded with the parameters from variable bindings.
53
+ # @param matches [Array<Array>] Variable bindings in an array. Every element
54
+ # of the array is an [Array] triplet, where:
55
+ # - the first element is a [String] field path (e.g. `foo.bar`) in the request
56
+ # to bind to
57
+ # - the second element is a [Regexp] to match the field value
58
+ # - the third element is a [Boolean] whether the slashes in the field value
59
+ # should be preserved (as opposed to escaped) when expanding the uri template.
60
+ # @param body [String, Nil] The body template, e.g. `*` or a field path.
61
+ #
62
+ # @return [Gapic::Rest::GrpcTranscoder::HttpBinding] The new binding.
63
+ def self.create_with_validation uri_method:, uri_template:, matches: [], body: nil
64
+ template = uri_template
65
+
66
+ matches.each do |name, _regex, _preserve_slashes|
67
+ unless uri_template =~ /({#{Regexp.quote name}})/
68
+ err_msg = "Binding configuration is incorrect: missing parameter in the URI template.\n" \
69
+ "Parameter `#{name}` is specified for matching but there is no corresponding parameter " \
70
+ "`{#{name}}` in the URI template."
71
+ raise ::Gapic::Common::Error, err_msg
72
+ end
73
+
74
+ template = template.gsub "{#{name}}", ""
75
+ end
76
+
77
+ if template =~ /{([a-zA-Z_.]+)}/
78
+ err_name = Regexp.last_match[1]
79
+ err_msg = "Binding configuration is incorrect: missing match configuration.\n" \
80
+ "Parameter `{#{err_name}}` is specified in the URI template but there is no " \
81
+ "corresponding match configuration for `#{err_name}`."
82
+ raise ::Gapic::Common::Error, err_msg
83
+ end
84
+
85
+ if body&.include? "."
86
+ raise ::Gapic::Common::Error,
87
+ "Provided body template `#{body}` points to a field in a sub-message. This is not supported."
88
+ end
89
+
90
+ field_bindings = matches.map do |name, regex, preserve_slashes|
91
+ HttpBinding::FieldBinding.new name, regex, preserve_slashes
92
+ end
93
+
94
+ HttpBinding.new uri_method, uri_template, field_bindings, body
95
+ end
96
+
44
97
  # A single binding for a field of a request message.
45
98
  # @attribute [r] field_path
46
99
  # @return [String] The path of the bound field, e.g. `foo.bar`.
@@ -44,36 +44,11 @@ module Gapic
44
44
  #
45
45
  # @return [Gapic::Rest::GrpcTranscoder] The updated transcoder.
46
46
  def with_bindings uri_method:, uri_template:, matches: [], body: nil
47
- template = uri_template
48
-
49
- matches.each do |name, _regex, _preserve_slashes|
50
- unless uri_template =~ /({#{Regexp.quote name}})/
51
- err_msg = "Binding configuration is incorrect: missing parameter in the URI template.\n" \
52
- "Parameter `#{name}` is specified for matching but there is no corresponding parameter " \
53
- "`{#{name}}` in the URI template."
54
- raise ::Gapic::Common::Error, err_msg
55
- end
56
-
57
- template = template.gsub "{#{name}}", ""
58
- end
59
-
60
- if template =~ /{([a-zA-Z_.]+)}/
61
- err_name = Regexp.last_match[1]
62
- err_msg = "Binding configuration is incorrect: missing match configuration.\n" \
63
- "Parameter `{#{err_name}}` is specified in the URI template but there is no " \
64
- "corresponding match configuration for `#{err_name}`."
65
- raise ::Gapic::Common::Error, err_msg
66
- end
67
-
68
- if body&.include? "."
69
- raise ::Gapic::Common::Error,
70
- "Provided body template `#{body}` points to a field in a sub-message. This is not supported."
71
- end
72
-
73
- field_bindings = matches.map do |name, regex, preserve_slashes|
74
- HttpBinding::FieldBinding.new name, regex, preserve_slashes
75
- end
76
- GrpcTranscoder.new @bindings + [HttpBinding.new(uri_method, uri_template, field_bindings, body)]
47
+ binding = HttpBinding.create_with_validation(uri_method: uri_method,
48
+ uri_template: uri_template,
49
+ matches: matches,
50
+ body: body)
51
+ GrpcTranscoder.new @bindings + [binding]
77
52
  end
78
53
 
79
54
  ##
@@ -50,7 +50,7 @@ module Gapic
50
50
  return enum_for :each unless block_given?
51
51
 
52
52
  loop do
53
- while @ready_objs.length.zero?
53
+ while @ready_objs.empty?
54
54
  begin
55
55
  chunk = @json_enumerator.next
56
56
  next unless chunk
@@ -0,0 +1,38 @@
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
+ module Rest
17
+ ##
18
+ # Surfaces information about the active call
19
+ # from the underlying transport library.
20
+ #
21
+ class TransportOperation
22
+ ##
23
+ # @private
24
+ # The underlying transport's library object that describes the active call, if any.
25
+ # It is not guaranteed to be any specific type, and its value is not guarateed to be stable.
26
+ # @return [::Object, nil, ::Faraday::Response]
27
+ attr_reader :underlying_op
28
+
29
+ ##
30
+ # @private
31
+ # @param request [::Object, nil, ::Faraday::Response]
32
+ # The underlying transport's library object that describes the active call, if any.
33
+ def initialize underlying_op
34
+ @underlying_op = underlying_op
35
+ end
36
+ end
37
+ end
38
+ end
data/lib/gapic/rest.rb CHANGED
@@ -29,4 +29,5 @@ require "gapic/rest/operation"
29
29
  require "gapic/rest/paged_enumerable"
30
30
  require "gapic/rest/server_stream"
31
31
  require "gapic/rest/threaded_enumerator"
32
+ require "gapic/rest/transport_operation"
32
33
  require "json"
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.14.0
4
+ version: 0.17.1
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: 2022-11-08 00:00:00.000000000 Z
11
+ date: 2023-02-09 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: faraday
@@ -288,6 +288,7 @@ files:
288
288
  - RELEASING.md
289
289
  - lib/gapic-common.rb
290
290
  - lib/gapic/call_options.rb
291
+ - lib/gapic/call_options/error_codes.rb
291
292
  - lib/gapic/call_options/retry_policy.rb
292
293
  - lib/gapic/common.rb
293
294
  - lib/gapic/common/error.rb
@@ -316,6 +317,7 @@ files:
316
317
  - lib/gapic/rest/paged_enumerable.rb
317
318
  - lib/gapic/rest/server_stream.rb
318
319
  - lib/gapic/rest/threaded_enumerator.rb
320
+ - lib/gapic/rest/transport_operation.rb
319
321
  - lib/gapic/stream_input.rb
320
322
  homepage: https://github.com/googleapis/gapic-generator-ruby
321
323
  licenses:
@@ -336,7 +338,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
336
338
  - !ruby/object:Gem::Version
337
339
  version: '0'
338
340
  requirements: []
339
- rubygems_version: 3.3.14
341
+ rubygems_version: 3.4.2
340
342
  signing_key:
341
343
  specification_version: 4
342
344
  summary: Common code for GAPIC-generated API clients