google-gax 0.3.0 → 0.4.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
  SHA1:
3
- metadata.gz: df878307196d3628c155d4de6d3b333524b93937
4
- data.tar.gz: bd5b46d05109352ad29de368998e36efe1bfcd8d
3
+ metadata.gz: f00dba40d04710327a4348f2b0919f423b81ab3d
4
+ data.tar.gz: 16ebb311b89300f865849238f840acedd3aec149
5
5
  SHA512:
6
- metadata.gz: 18285c95727f2da714caf8c9ad7d8a99cb7d50bfeb2322045dbc4f4bf4f1b549441d7f0b8e035ab9d708fd820ebc9252260ec17165a90fb36d681f7fecc1e007
7
- data.tar.gz: 50b8a13d7f050e099146eba2f1d11f77e123c5fa64923d731d3707ff2f539e70d71a9f6dea790143990fa47e05b801e8501cd5d3ca0b51f4291e07368e15ab7a
6
+ metadata.gz: 128e33ba96e202d5abf7b941d922737fc56115cd3c4d82b9fe3b331beb7639704f9ac1e86980f64757c2169b0fdee8e9668b985d8a81cb2f9c4aee46c3eb1255
7
+ data.tar.gz: 234a0c126f754c7db3690f53aeda09a689143cc52e141d787b3cd17259c7bc0db371cca13544a85253a450ed11178a45e8b05c0c06c3c342f84ceabacab465f9
@@ -49,9 +49,11 @@ module Google
49
49
  # @return [Object]
50
50
  # @!attribute [r] bundle_descriptor
51
51
  # @return [BundleDescriptor]
52
+ # @!attribute [r] kwargs
53
+ # @return [Hash]
52
54
  class CallSettings
53
55
  attr_reader :timeout, :retry_options, :page_descriptor, :page_token,
54
- :bundler, :bundle_descriptor
56
+ :bundler, :bundle_descriptor, :kwargs, :errors
55
57
 
56
58
  # @param timeout [Numeric] The client-side timeout for API calls. This
57
59
  # parameter is ignored for retrying calls.
@@ -67,14 +69,21 @@ module Google
67
69
  # performed.
68
70
  # @param bundle_descriptor [BundleDescriptor] indicates the structure of
69
71
  # the bundle. If nil, bundling is not performed.
72
+ # @param kwargs [Hash]
73
+ # Additional keyword argments to be passed to the API call.
74
+ # @param errors [Array<Exception>]
75
+ # Configures the exceptions to wrap with GaxError.
70
76
  def initialize(timeout: 30, retry_options: nil, page_descriptor: nil,
71
- page_token: nil, bundler: nil, bundle_descriptor: nil)
77
+ page_token: nil, bundler: nil, bundle_descriptor: nil,
78
+ kwargs: {}, errors: [])
72
79
  @timeout = timeout
73
80
  @retry_options = retry_options
74
81
  @page_descriptor = page_descriptor
75
82
  @page_token = page_token
76
83
  @bundler = bundler
77
84
  @bundle_descriptor = bundle_descriptor
85
+ @kwargs = kwargs
86
+ @errors = errors
78
87
  end
79
88
 
80
89
  # @return true when it has retry codes.
@@ -98,7 +107,9 @@ module Google
98
107
  page_descriptor: @page_descriptor,
99
108
  page_token: @page_token,
100
109
  bundler: @bundler,
101
- bundle_descriptor: @bundle_descriptor)
110
+ bundle_descriptor: @bundle_descriptor,
111
+ kwargs: @kwargs,
112
+ errors: @errors)
102
113
  end
103
114
 
104
115
  timeout = if options.timeout == :OPTION_INHERIT
@@ -117,12 +128,17 @@ module Google
117
128
  options.page_token
118
129
  end
119
130
 
131
+ kwargs = @kwargs.dup
132
+ kwargs.update(options.kwargs) if options.kwargs != :OPTION_INHERIT
133
+
120
134
  CallSettings.new(timeout: timeout,
121
135
  retry_options: retry_options,
122
136
  page_descriptor: @page_descriptor,
123
137
  page_token: page_token,
124
138
  bundler: @bundler,
125
- bundle_descriptor: @bundle_descriptor)
139
+ bundle_descriptor: @bundle_descriptor,
140
+ kwargs: kwargs,
141
+ errors: @errors)
126
142
  end
127
143
  end
128
144
 
@@ -133,8 +149,10 @@ module Google
133
149
  # @return [RetryOptions, :OPTION_INHERIT]
134
150
  # @!attribute [r] page_token
135
151
  # @return [Object, :OPTION_INHERIT, :INITIAL_PAGE]
152
+ # @!attribute [r] kwargs
153
+ # @return [Hash, :OPTION_INHERIT]
136
154
  class CallOptions
137
- attr_reader :timeout, :retry_options, :page_token
155
+ attr_reader :timeout, :retry_options, :page_token, :kwargs
138
156
 
139
157
  # @param timeout [Numeric, :OPTION_INHERIT]
140
158
  # The client-side timeout for API calls.
@@ -144,12 +162,16 @@ module Google
144
162
  # @param page_token [Object, :OPTION_INHERIT]
145
163
  # If set and the call is configured for page streaming, page streaming
146
164
  # is starting with this page_token.
165
+ # @param kwargs [Hash, :OPTION_INHERIT]
166
+ # Additional keyword argments to be passed to the API call.
147
167
  def initialize(timeout: :OPTION_INHERIT,
148
168
  retry_options: :OPTION_INHERIT,
149
- page_token: :OPTION_INHERIT)
169
+ page_token: :OPTION_INHERIT,
170
+ kwargs: :OPTION_INHERIT)
150
171
  @timeout = timeout
151
172
  @retry_options = retry_options
152
173
  @page_token = page_token
174
+ @kwargs = kwargs
153
175
  end
154
176
  end
155
177
 
@@ -243,7 +265,7 @@ module Google
243
265
  :element_count_limit,
244
266
  :request_byte_threshold,
245
267
  :request_byte_limit,
246
- :delay_threshold)
268
+ :delay_threshold_millis)
247
269
  # @!attribute element_count_threshold
248
270
  # @return [Numeric] the bundled request will be sent once the
249
271
  # count of outstanding elements in the repeated field
@@ -269,7 +291,7 @@ module Google
269
291
  # pessimistically approximated by summing the bytesizes of
270
292
  # the elements in the repeated field, with a buffer applied
271
293
  # to correspond to the resulting under-approximation.
272
- # @!attribute delay_threshold
294
+ # @!attribute delay_threshold_millis
273
295
  # @return [Numeric] the bundled request will be sent this
274
296
  # amount of time after the first element in the bundle was
275
297
  # added to it.
@@ -277,13 +299,13 @@ module Google
277
299
  element_count_limit: 0,
278
300
  request_byte_threshold: 0,
279
301
  request_byte_limit: 0,
280
- delay_threshold: 0)
302
+ delay_threshold_millis: 0)
281
303
  super(
282
304
  element_count_threshold,
283
305
  element_count_limit,
284
306
  request_byte_threshold,
285
307
  request_byte_limit,
286
- delay_threshold)
308
+ delay_threshold_millis)
287
309
  end
288
310
  end
289
311
  end
@@ -30,7 +30,6 @@
30
30
  require 'time'
31
31
 
32
32
  require 'google/gax/errors'
33
- require 'google/gax/grpc'
34
33
 
35
34
  # rubocop:disable Metrics/ModuleLength
36
35
 
@@ -45,16 +44,16 @@ module Google
45
44
  # PagedEnumerable provides the enumerations over the resource data,
46
45
  # and also provides the enumerations over the pages themselves.
47
46
  #
48
- # Example 1: normal iteration over resources.
47
+ # @example normal iteration over resources.
49
48
  # paged_enumerable.each { |resource| puts resource }
50
49
  #
51
- # Example 2: per-page iteration.
50
+ # @example per-page iteration.
52
51
  # paged_enumerable.each_page { |page| puts page }
53
52
  #
54
- # Example 3: Enumerable over pages.
53
+ # @example Enumerable over pages.
55
54
  # pages = paged_enumerable.enum_for(:each_page).to_a
56
55
  #
57
- # Example 4: more exact operations over pages.
56
+ # @example more exact operations over pages.
58
57
  # while some_condition()
59
58
  # page = paged_enumerable.page
60
59
  # do_something(page)
@@ -120,35 +119,33 @@ module Google
120
119
  include Enumerable
121
120
  attr_reader :page
122
121
 
123
- # @param a_func [Proc]
124
- # A proc to update the response object.
125
122
  # @param request_page_token_field [String]
126
123
  # The name of the field in request which will have the page token.
127
124
  # @param response_page_token_field [String]
128
125
  # The name of the field in the response which holds the next page token.
129
126
  # @param resource_field [String]
130
127
  # The name of the field in the response which holds the resources.
131
- def initialize(a_func, request_page_token_field,
128
+ def initialize(request_page_token_field,
132
129
  response_page_token_field, resource_field)
133
- @func = a_func
134
130
  @request_page_token_field = request_page_token_field
135
131
  @page = Page.new(nil, response_page_token_field, resource_field)
136
132
  end
137
133
 
138
134
  # Initiate the streaming with the requests and keywords.
139
- # @param page_token [Object]
140
- # The page token for the first page to be streamed, or nil.
135
+ # @param api_call [Proc]
136
+ # A proc to update the response object.
141
137
  # @param request [Object]
142
138
  # The initial request object.
143
- # @param kwargs [Hash]
144
- # Other keyword arguments to be passed to a_func.
139
+ # @param settings [CallSettings]
140
+ # The call settings to enumerate pages.
145
141
  # @return [PagedEnumerable]
146
142
  # returning self for further uses.
147
- def start(page_token, request, **kwargs)
143
+ def start(api_call, request, settings)
144
+ @func = api_call
148
145
  @request = request
146
+ page_token = settings.page_token
149
147
  @request[@request_page_token_field] = page_token if page_token
150
- @kwargs = kwargs
151
- @page = @page.dup_with(@func.call(@request, **@kwargs))
148
+ @page = @page.dup_with(@func.call(@request))
152
149
  self
153
150
  end
154
151
 
@@ -190,7 +187,7 @@ module Google
190
187
  def next_page
191
188
  return unless next_page?
192
189
  @request[@request_page_token_field] = @page.next_page_token
193
- @page = @page.dup_with(@func.call(@request, **@kwargs))
190
+ @page = @page.dup_with(@func.call(@request))
194
191
  end
195
192
 
196
193
  def response
@@ -219,47 +216,51 @@ module Google
219
216
  # does the signature change.
220
217
  #
221
218
  # @param func [Proc] used to make a bare rpc call
222
- # @param settings [CallSettings provides the settings for this call
219
+ # @param settings [CallSettings] provides the settings for this call
223
220
  # @return [Proc] a bound method on a request stub used to make an rpc call
224
221
  # @raise [StandardError] if +settings+ has incompatible values,
225
222
  # e.g, if bundling and page_streaming are both configured
226
223
  def create_api_call(func, settings)
227
- api_call = if settings.retry_codes?
228
- retryable(func, settings.retry_options)
229
- else
230
- add_timeout_arg(func, settings.timeout)
231
- end
224
+ api_caller = proc do |api_call, request|
225
+ api_call.call(request)
226
+ end
232
227
 
233
228
  if settings.page_descriptor
234
229
  if settings.bundler?
235
230
  raise 'ApiCallable has incompatible settings: ' \
236
231
  'bundling and page streaming'
237
232
  end
238
- return page_streamable(
239
- api_call,
240
- settings.page_descriptor.request_page_token_field,
241
- settings.page_descriptor.response_page_token_field,
242
- settings.page_descriptor.resource_field,
243
- settings.page_token
244
- )
245
- end
246
- if settings.bundler?
247
- return bundleable(api_call, settings.bundle_descriptor,
248
- settings.bundler)
233
+ page_descriptor = settings.page_descriptor
234
+ api_caller = page_streamable(page_descriptor.request_page_token_field,
235
+ page_descriptor.response_page_token_field,
236
+ page_descriptor.resource_field)
237
+ elsif settings.bundler?
238
+ api_caller = bundleable(settings.bundle_descriptor)
249
239
  end
250
240
 
251
- catch_errors(api_call)
241
+ proc do |request, options = nil|
242
+ this_settings = settings.merge(options)
243
+ api_call = if settings.retry_codes?
244
+ retryable(func, this_settings.retry_options,
245
+ this_settings.kwargs)
246
+ else
247
+ add_timeout_arg(func, this_settings.timeout,
248
+ this_settings.kwargs)
249
+ end
250
+ api_call = catch_errors(api_call, settings.errors)
251
+ api_caller.call(api_call, request, this_settings)
252
+ end
252
253
  end
253
254
 
254
255
  # Updates a_func to wrap exceptions with GaxError
255
256
  #
256
257
  # @param a_func [Proc]
257
258
  # @param errors [Array<Exception>] Configures the exceptions to wrap.
258
- # @return [Proc] A proc that will wrap certain exceptions with GaxError
259
- def catch_errors(a_func, errors: Grpc::API_ERRORS)
260
- proc do |request, **kwargs|
259
+ # @return [Proc] A proc that will wrap certain exceptions with GaxError.
260
+ def catch_errors(a_func, errors)
261
+ proc do |request|
261
262
  begin
262
- a_func.call(request, **kwargs)
263
+ a_func.call(request)
263
264
  rescue *errors
264
265
  raise GaxError, 'RPC failed'
265
266
  end
@@ -281,11 +282,12 @@ module Google
281
282
  # @param bundler orchestrates bundling.
282
283
  # @return [Proc] A proc takes the API call's request and returns
283
284
  # an Event object.
284
- def bundleable(a_func, desc, bundler)
285
- proc do |request|
285
+ def bundleable(desc)
286
+ proc do |api_call, request, settings|
287
+ return api_call(request) unless settings.bundler
286
288
  the_id = bundling.compute_bundle_id(request,
287
289
  desc.request_discriminator_fields)
288
- return bundler.schedule(a_func, the_id, desc, request)
290
+ return bundler.schedule(api_call, the_id, desc, request)
289
291
  end
290
292
  end
291
293
 
@@ -300,18 +302,13 @@ module Google
300
302
  # @param page_token [Object] The page_token for the first page to be
301
303
  # streamed, or nil.
302
304
  # @return [Proc] A proc that returns an iterable over the specified field.
303
- def page_streamable(a_func,
304
- request_page_token_field,
305
+ def page_streamable(request_page_token_field,
305
306
  response_page_token_field,
306
- resource_field,
307
- page_token)
308
- enumerable = PagedEnumerable.new(a_func,
309
- request_page_token_field,
307
+ resource_field)
308
+ enumerable = PagedEnumerable.new(request_page_token_field,
310
309
  response_page_token_field,
311
310
  resource_field)
312
- proc do |request, **kwargs|
313
- enumerable.start(page_token, request, **kwargs)
314
- end
311
+ enumerable.method(:start)
315
312
  end
316
313
 
317
314
  # rubocop:disable Metrics/MethodLength
@@ -324,7 +321,7 @@ module Google
324
321
  # upon which the proc should retry, and the parameters to the
325
322
  # exponential backoff retry algorithm.
326
323
  # @return [Proc] A proc that will retry on exception.
327
- def retryable(a_func, retry_options)
324
+ def retryable(a_func, retry_options, kwargs)
328
325
  delay_mult = retry_options.backoff_settings.retry_delay_multiplier
329
326
  max_delay = (retry_options.backoff_settings.max_retry_delay_millis /
330
327
  MILLIS_PER_SECOND)
@@ -334,7 +331,7 @@ module Google
334
331
  total_timeout = (retry_options.backoff_settings.total_timeout_millis /
335
332
  MILLIS_PER_SECOND)
336
333
 
337
- proc do |request, **kwargs|
334
+ proc do |request|
338
335
  delay = retry_options.backoff_settings.initial_retry_delay_millis
339
336
  timeout = (retry_options.backoff_settings.initial_rpc_timeout_millis /
340
337
  MILLIS_PER_SECOND)
@@ -344,7 +341,7 @@ module Google
344
341
 
345
342
  loop do
346
343
  begin
347
- result = add_timeout_arg(a_func, timeout).call(request, **kwargs)
344
+ result = add_timeout_arg(a_func, timeout, kwargs).call(request)
348
345
  break
349
346
  rescue => exception
350
347
  unless exception.respond_to?(:code) &&
@@ -374,8 +371,8 @@ module Google
374
371
  # @param timeout [Numeric] to be added to the original proc as it
375
372
  # final positional arg.
376
373
  # @return [Proc] the original proc updated to the timeout arg
377
- def add_timeout_arg(a_func, timeout)
378
- proc do |request, **kwargs|
374
+ def add_timeout_arg(a_func, timeout, kwargs)
375
+ proc do |request|
379
376
  kwargs[:timeout] = timeout
380
377
  a_func.call(request, **kwargs)
381
378
  end
@@ -80,13 +80,13 @@ module Google
80
80
  rule 'bound_segments : bound_segment FORWARD_SLASH bound_segments
81
81
  | bound_segment' do |segs, a_seg, _, more_segs|
82
82
  segs.value = a_seg.value
83
- segs.value.push(*more_segs.value) unless more_segs.nil?
83
+ segs.value.concat(more_segs.value) unless more_segs.nil?
84
84
  end
85
85
 
86
86
  rule 'unbound_segments : unbound_terminal FORWARD_SLASH unbound_segments
87
87
  | unbound_terminal' do |segs, a_term, _, more_segs|
88
88
  segs.value = a_term.value
89
- segs.value.push(*more_segs.value) unless more_segs.nil?
89
+ segs.value.concat(more_segs.value) unless more_segs.nil?
90
90
  end
91
91
 
92
92
  rule 'bound_segment : bound_terminal
@@ -118,7 +118,7 @@ module Google
118
118
  | LEFT_BRACE LITERAL RIGHT_BRACE' do |variable, *args|
119
119
  variable.value = [Segment.new(BINDING, args[1].value)]
120
120
  if args.size > 3
121
- variable.value.push(*args[3].value)
121
+ variable.value.concat(args[3].value)
122
122
  else
123
123
  variable.value.push(Segment.new(TERMINAL, '*'))
124
124
  @segment_count += 1
@@ -178,7 +178,7 @@ module Google
178
178
  msg = "Value for key #{segment.literal} is not provided"
179
179
  raise(ArgumentError, msg)
180
180
  end
181
- out.push(*PathTemplate.new(bindings[literal_sym]).segments)
181
+ out.concat(PathTemplate.new(bindings[literal_sym]).segments)
182
182
  binding = true
183
183
  elsif segment.kind == END_BINDING
184
184
  binding = false
@@ -183,11 +183,15 @@ module Google
183
183
  # @param page_descriptors [Hash{String => PageDescriptor}] A
184
184
  # dictionary of method names to PageDescriptor objects for
185
185
  # methods that are page streaming-enabled.
186
+ # @param kwargs [Hash]
187
+ # Additional keyword argments to be passed to the API call.
188
+ # @param errors [Array<Exception>]
189
+ # Configures the exceptions to wrap with GaxError.
186
190
  # @return [CallSettings, nil] A CallSettings, or nil if the
187
191
  # service is not found in the config.
188
192
  def construct_settings(service_name, client_config, config_overrides,
189
193
  retry_names, timeout, bundle_descriptors: {},
190
- page_descriptors: {})
194
+ page_descriptors: {}, kwargs: {}, errors: [])
191
195
  defaults = {}
192
196
 
193
197
  service_config = client_config.fetch('interfaces', {})[service_name]
@@ -220,9 +224,10 @@ module Google
220
224
  retry_names)
221
225
  ),
222
226
  page_descriptor: page_descriptors[snake_name],
223
- bundler: construct_bundling(bundling_config,
224
- bundle_descriptor),
225
- bundle_descriptor: bundle_descriptor
227
+ bundler: construct_bundling(bundling_config, bundle_descriptor),
228
+ bundle_descriptor: bundle_descriptor,
229
+ kwargs: kwargs,
230
+ errors: errors
226
231
  )
227
232
  end
228
233
 
@@ -29,6 +29,6 @@
29
29
 
30
30
  module Google
31
31
  module Gax
32
- VERSION = '0.3.0'.freeze
32
+ VERSION = '0.4.0'.freeze
33
33
  end
34
34
  end
@@ -56,6 +56,11 @@ describe Google::Gax do
56
56
  my_callable = Google::Gax.create_api_call(func, settings)
57
57
  expect(my_callable.call(nil)).to eq(42)
58
58
  expect(timeout_arg).to_not be_nil
59
+
60
+ new_timeout = timeout_arg + 20
61
+ options = Google::Gax::CallOptions.new(timeout: new_timeout)
62
+ expect(my_callable.call(nil, options)).to eq(42)
63
+ expect(timeout_arg).to eq(new_timeout)
59
64
  end
60
65
  end
61
66
 
@@ -112,7 +117,7 @@ describe Google::Gax do
112
117
 
113
118
  describe 'failures without retry' do
114
119
  it 'simply fails' do
115
- settings = CallSettings.new
120
+ settings = CallSettings.new(errors: [GRPC::Cancelled])
116
121
  timeout_arg = nil
117
122
  call_count = 0
118
123
  func = proc do |timeout: nil|
@@ -90,7 +90,9 @@ describe Google::Gax do
90
90
  defaults = Google::Gax.construct_settings(
91
91
  SERVICE_NAME, A_CONFIG, {}, RETRY_DICT, 30,
92
92
  bundle_descriptors: BUNDLE_DESCRIPTORS,
93
- page_descriptors: PAGE_DESCRIPTORS
93
+ page_descriptors: PAGE_DESCRIPTORS,
94
+ kwargs: { 'key' => 'value' },
95
+ errors: [StandardError]
94
96
  )
95
97
  settings = defaults['bundling_method']
96
98
  expect(settings.timeout).to be(30)
@@ -103,6 +105,8 @@ describe Google::Gax do
103
105
  expect(settings.retry_options.backoff_settings).to be_a(
104
106
  Google::Gax::BackoffSettings
105
107
  )
108
+ expect(settings.kwargs).to match('key' => 'value')
109
+ expect(settings.errors).to match_array([StandardError])
106
110
 
107
111
  settings = defaults['page_streaming_method']
108
112
  expect(settings.timeout).to be(30)
@@ -114,6 +118,8 @@ describe Google::Gax do
114
118
  expect(settings.retry_options.backoff_settings).to be_a(
115
119
  Google::Gax::BackoffSettings
116
120
  )
121
+ expect(settings.kwargs).to match('key' => 'value')
122
+ expect(settings.errors).to match_array([StandardError])
117
123
  end
118
124
 
119
125
  it 'overrides settings' do
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: google-gax
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0
4
+ version: 0.4.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: 2016-05-31 00:00:00.000000000 Z
11
+ date: 2016-07-13 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: googleauth
@@ -30,14 +30,14 @@ dependencies:
30
30
  requirements:
31
31
  - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: 0.13.1
33
+ version: 0.14.1
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
- version: 0.13.1
40
+ version: 0.14.1
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: rly
43
43
  requirement: !ruby/object:Gem::Requirement