gapic-generator 0.7.5 → 0.10.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.
Files changed (58) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +45 -0
  3. data/lib/gapic/generator/version.rb +1 -1
  4. data/lib/gapic/generators/default_generator.rb +11 -1
  5. data/lib/gapic/generators/default_generator_parameters.rb +3 -1
  6. data/lib/gapic/presenters.rb +2 -0
  7. data/lib/gapic/presenters/gem_presenter.rb +63 -10
  8. data/lib/gapic/presenters/method/rest_pagination_info.rb +246 -0
  9. data/lib/gapic/presenters/method_presenter.rb +21 -2
  10. data/lib/gapic/presenters/method_rest_presenter.rb +70 -4
  11. data/lib/gapic/presenters/resource_presenter.rb +8 -0
  12. data/lib/gapic/presenters/service_config_presenter.rb +48 -0
  13. data/lib/gapic/presenters/service_presenter.rb +69 -0
  14. data/lib/gapic/presenters/service_rest_presenter.rb +36 -28
  15. data/lib/gapic/presenters/snippet_presenter.rb +103 -0
  16. data/lib/gapic/schema/api.rb +32 -8
  17. data/lib/gapic/schema/request_param_parser.rb +2 -2
  18. data/lib/gapic/schema/wrappers.rb +26 -0
  19. data/templates/default/gem/readme.erb +3 -3
  20. data/templates/default/lib/rest/_rest.erb +0 -2
  21. data/templates/default/service/client/_client.erb +18 -20
  22. data/templates/default/service/client/_config.erb +13 -14
  23. data/templates/default/service/client/_credentials.erb +2 -0
  24. data/templates/default/service/client/_operations.erb +1 -1
  25. data/templates/default/service/client/_paths.erb +1 -1
  26. data/templates/default/service/client/_self_configure_defaults.erb +2 -2
  27. data/templates/default/service/client/method/_def.erb +2 -0
  28. data/templates/default/service/client/method/def/_options_defaults.erb +3 -1
  29. data/templates/default/service/client/method/docs/_deprecated.erb +5 -0
  30. data/templates/default/service/client/method/docs/_snippets.erb +6 -0
  31. data/templates/default/service/rest/client/_client.erb +15 -24
  32. data/templates/default/service/rest/client/_config.erb +48 -0
  33. data/templates/default/service/rest/client/method/_def.erb +1 -1
  34. data/templates/default/service/rest/client/method/def/_options_defaults.erb +7 -3
  35. data/templates/default/service/rest/client/method/def/_response.erb +6 -0
  36. data/templates/default/service/rest/client/method/def/_response_normal.erb +4 -15
  37. data/templates/default/service/rest/client/method/def/_response_paged.erb +7 -0
  38. data/templates/default/service/rest/client/method/docs/_result.erb +3 -3
  39. data/templates/default/service/rest/service_stub.erb +6 -0
  40. data/templates/default/service/rest/service_stub/_service_stub.erb +25 -0
  41. data/templates/default/service/rest/{grpc_transcoding/method → service_stub/grpc_transcoding_method}/_def.erb +4 -1
  42. data/templates/default/service/rest/{grpc_transcoding/method → service_stub/grpc_transcoding_method}/def/_query_string_param.erb +0 -0
  43. data/templates/default/service/rest/service_stub/method/_def.erb +20 -0
  44. data/templates/default/service/rest/service_stub/method/def/_request.erb +2 -0
  45. data/templates/default/service/rest/service_stub/method/def/_response.erb +17 -0
  46. data/templates/default/service/rest/test/client.erb +18 -0
  47. data/templates/default/service/rest/test/method/_assert_response.erb +2 -0
  48. data/templates/default/service/rest/test/method/_configure.erb +19 -0
  49. data/templates/default/service/rest/test/method/_normal.erb +71 -0
  50. data/templates/default/service/rest/test/method/_setup.erb +38 -0
  51. data/templates/default/service/test/client_paths.erb +1 -1
  52. data/templates/default/snippets/gemfile.erb +17 -0
  53. data/templates/default/snippets/snippet/_structure.erb +71 -0
  54. data/templates/default/snippets/standalone.erb +6 -0
  55. metadata +29 -12
  56. data/templates/default/service/client/_self_configure_retry_policy.erb +0 -15
  57. data/templates/default/service/rest/client/_requires.erb +0 -1
  58. data/templates/default/service/rest/grpc_transcoding/_grpc_transcoding.erb +0 -9
@@ -40,7 +40,7 @@ module Gapic
40
40
  @service_presenter = service_presenter
41
41
  @api = api
42
42
  @method = method
43
- @rest = MethodRestPresenter.new self
43
+ @rest = MethodRestPresenter.new self, api
44
44
  end
45
45
 
46
46
  ##
@@ -50,6 +50,14 @@ module Gapic
50
50
  @service_presenter
51
51
  end
52
52
 
53
+ def snippet
54
+ SnippetPresenter.new self, @api
55
+ end
56
+
57
+ def generate_yardoc_snippets?
58
+ @api.generate_yardoc_snippets?
59
+ end
60
+
53
61
  def name
54
62
  @name ||= begin
55
63
  candidate = ActiveSupport::Inflector.underscore @method.name
@@ -89,6 +97,13 @@ module Gapic
89
97
  ret
90
98
  end
91
99
 
100
+ ##
101
+ # @return [Boolean]
102
+ #
103
+ def is_deprecated?
104
+ @method.is_deprecated?
105
+ end
106
+
92
107
  def arguments
93
108
  arguments = @method.input.fields.reject(&:output_only?)
94
109
  arguments.map { |arg| FieldPresenter.new @api, @method.input, arg }
@@ -171,7 +186,7 @@ module Gapic
171
186
  def lro?
172
187
  return paged_response_type == "::Google::Longrunning::Operation" if paged?
173
188
 
174
- message_ruby_type(@method.output) == "::Google::Longrunning::Operation"
189
+ return_type == "::Google::Longrunning::Operation"
175
190
  end
176
191
 
177
192
  def client_streaming?
@@ -228,6 +243,10 @@ module Gapic
228
243
  end
229
244
  end
230
245
 
246
+ def service_config_presenter
247
+ ServiceConfigPresenter.new grpc_service_config
248
+ end
249
+
231
250
  def grpc_method_name
232
251
  @method.name
233
252
  end
@@ -14,6 +14,7 @@
14
14
  # See the License for the specific language governing permissions and
15
15
  # limitations under the License.
16
16
 
17
+ require "gapic/presenters/method/rest_pagination_info"
17
18
  require "gapic/uri_template"
18
19
 
19
20
  module Gapic
@@ -22,9 +23,19 @@ module Gapic
22
23
  # A presenter for rpc methods (REST submethods)
23
24
  #
24
25
  class MethodRestPresenter
25
- def initialize main_method
26
+ # @return [Gapic::Presenters::Method::RestPaginationInfo]
27
+ attr_reader :pagination
28
+
29
+ ##
30
+ # @param main_method [Gapic::Presenters::MethodPresenter] the main presenter for this method.
31
+ # @param api [Gapic::Schema::Api]
32
+ #
33
+ def initialize main_method, api
34
+ @api = api
26
35
  @main_method = main_method
27
36
  @proto_method = main_method.method
37
+
38
+ @pagination = Gapic::Presenters::Method::RestPaginationInfo.new @proto_method, api
28
39
  end
29
40
 
30
41
  ##
@@ -128,6 +139,13 @@ module Gapic
128
139
  @proto_method.http&.body || ""
129
140
  end
130
141
 
142
+ ##
143
+ # @return [Boolean] True if body contains full request object (`*` in the annotation), false otherwise
144
+ #
145
+ def body_is_request_object?
146
+ body == "*"
147
+ end
148
+
131
149
  ##
132
150
  # Performs a limited version of grpc transcoding to create a string that will interpolate
133
151
  # the values from the request object to create a request body at runtime.
@@ -142,7 +160,7 @@ module Gapic
142
160
  def body_interpolated request_obj_name = "request_pb"
143
161
  return "\"\"" unless body?
144
162
 
145
- return "#{request_obj_name}.to_json" if body == "*"
163
+ return "#{request_obj_name}.to_json" if body_is_request_object?
146
164
 
147
165
  "#{request_obj_name}.#{body}.to_json"
148
166
  end
@@ -156,11 +174,12 @@ module Gapic
156
174
 
157
175
  # @return [Array<String>]
158
176
  def query_string_params
159
- return [] if body?
177
+ return [] if body_is_request_object?
160
178
 
161
179
  routing_params_set = routing_params.to_set
162
180
  @main_method.arguments
163
181
  .reject { |arg| routing_params_set.include? arg.name }
182
+ .reject { |arg| body == arg.name }
164
183
  .reject(&:message?)
165
184
  .reject { |arg| arg.default_value_for_type.nil? }
166
185
  end
@@ -179,7 +198,54 @@ module Gapic
179
198
  #
180
199
  # @return [String]
181
200
  def transcoding_helper_name
182
- "transcode_#{@main_method.name}"
201
+ "transcode_#{name}_request"
202
+ end
203
+
204
+ ##
205
+ # Method name
206
+ #
207
+ # @return [String]
208
+ #
209
+ def name
210
+ @main_method.name
211
+ end
212
+
213
+ ##
214
+ # Full class name of the request type
215
+ #
216
+ # @return [String]
217
+ #
218
+ def request_type
219
+ @main_method.request_type
220
+ end
221
+
222
+ ##
223
+ # Full class name of the raw return type of the RPC
224
+ #
225
+ # @return [String]
226
+ #
227
+ def return_type
228
+ @main_method.return_type
229
+ end
230
+
231
+ ##
232
+ # Full class name of the return type of the method
233
+ # (including LRO and Paged cases)
234
+ #
235
+ # @return [String]
236
+ #
237
+ def doc_response_type
238
+ return "::Gapic::Rest::PagedEnumerable<#{pagination.paged_element_doc_type}>" if paged?
239
+ return_type
240
+ end
241
+
242
+ ##
243
+ # Whether the REGAPIC method should be rendered as paged
244
+ #
245
+ # @return [Boolean]
246
+ #
247
+ def paged?
248
+ @pagination.paged?
183
249
  end
184
250
  end
185
251
  end
@@ -33,6 +33,10 @@ module Gapic
33
33
  @patterns.filter!(&:useful_for_helpers?)
34
34
  end
35
35
 
36
+ def dup
37
+ ResourcePresenter.new @resource
38
+ end
39
+
36
40
  def name
37
41
  @resource.type.split("/").delete_if(&:empty?).last
38
42
  end
@@ -62,6 +66,10 @@ module Gapic
62
66
  attr_reader :pattern
63
67
  attr_reader :path_string
64
68
 
69
+ def pattern_template
70
+ @parsed_pattern.template
71
+ end
72
+
65
73
  def useful_for_helpers?
66
74
  !@parsed_pattern.positional_segments? && !@parsed_pattern.nontrivial_pattern_segments?
67
75
  end
@@ -0,0 +1,48 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Copyright 2021 Google LLC
4
+ #
5
+ # Licensed under the Apache License, Version 2.0 (the "License");
6
+ # you may not use this file except in compliance with the License.
7
+ # You may obtain a copy of the License at
8
+ #
9
+ # https://www.apache.org/licenses/LICENSE-2.0
10
+ #
11
+ # Unless required by applicable law or agreed to in writing, software
12
+ # distributed under the License is distributed on an "AS IS" BASIS,
13
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ # See the License for the specific language governing permissions and
15
+ # limitations under the License.
16
+
17
+ module Gapic
18
+ module Presenters
19
+ ##
20
+ # A presenter for grpc service config.
21
+ #
22
+ class ServiceConfigPresenter
23
+ def initialize grpc_service_config
24
+ @grpc_service_config = grpc_service_config
25
+ end
26
+
27
+ attr_reader :grpc_service_config
28
+
29
+ def retry_policy_fields
30
+ elems = []
31
+ retry_policy = grpc_service_config&.retry_policy
32
+ if retry_policy&.initial_delay_seconds
33
+ elems << "initial_delay: #{Gapic::FormattingUtils.format_number retry_policy.initial_delay_seconds}"
34
+ end
35
+ if retry_policy&.max_delay_seconds
36
+ elems << "max_delay: #{Gapic::FormattingUtils.format_number retry_policy.max_delay_seconds}"
37
+ end
38
+ if retry_policy&.multiplier
39
+ elems << "multiplier: #{Gapic::FormattingUtils.format_number retry_policy.multiplier}"
40
+ end
41
+ if retry_policy&.status_codes
42
+ elems << "retry_codes: #{retry_policy.status_codes}"
43
+ end
44
+ elems.empty? ? "{}" : "{\n #{elems.join ', '}\n}"
45
+ end
46
+ end
47
+ end
48
+ end
@@ -50,6 +50,13 @@ module Gapic
50
50
  PackagePresenter.new @gem_presenter, @api, @service.parent.package
51
51
  end
52
52
 
53
+ ##
54
+ # @return [Boolean]
55
+ #
56
+ def is_deprecated?
57
+ @service.is_deprecated?
58
+ end
59
+
53
60
  ##
54
61
  # @return [Enumerable<Gapic::Presenters::MethodPresenter>]
55
62
  #
@@ -252,6 +259,34 @@ module Gapic
252
259
  @references ||= @service.resources.map { |resource| ResourcePresenter.new resource }.sort_by(&:name)
253
260
  end
254
261
 
262
+ ##
263
+ # Deduplicate resource presenters by combining resources with the same
264
+ # name. If multiple resources have the same name (though possibly
265
+ # different namespaces, e.g. `location.googleapis.com/Location` vs
266
+ # `documentai.googleapis.com/Location`), this combines (and dedups) their
267
+ # patterns into a single resource presenter.
268
+ #
269
+ # Used for generating path helpers while avoiding duplicate method names.
270
+ #
271
+ def deduped_references
272
+ @deduped_references ||= begin
273
+ hash = {}
274
+ references.each do |resource|
275
+ if hash.key? resource.name
276
+ existing = hash[resource.name]
277
+ resource.patterns.each do |pat|
278
+ unless existing.patterns.any? { |epat| epat.pattern_template == pat.pattern_template }
279
+ existing.patterns << pat
280
+ end
281
+ end
282
+ else
283
+ hash[resource.name] = resource.dup
284
+ end
285
+ end
286
+ hash.values
287
+ end
288
+ end
289
+
255
290
  def paths?
256
291
  references.any?
257
292
  end
@@ -361,6 +396,10 @@ module Gapic
361
396
  @api.grpc_service_config.service_level_configs[grpc_full_name]
362
397
  end
363
398
 
399
+ def service_config_presenter
400
+ ServiceConfigPresenter.new grpc_service_config
401
+ end
402
+
364
403
  ##
365
404
  # The short proto name for this service
366
405
  #
@@ -405,6 +444,36 @@ module Gapic
405
444
  generate_rest_clients? ? "GRPC client" : "client"
406
445
  end
407
446
 
447
+ ##
448
+ # The method to use for quick start samples. Normally this is simply the
449
+ # first non-client-streaming method defined, but it can be overridden via
450
+ # a gem config.
451
+ #
452
+ # @return [Gapic::Presenters::MethodPresenter]
453
+ #
454
+ def quick_start_method
455
+ gem_config = @api.configuration[:gem]
456
+ preferred_method = gem_config[:quick_start_method] if gem_config
457
+ result = methods.find { |meth| meth.name == preferred_method } if preferred_method
458
+ result || methods.find { |meth| !meth.client_streaming? }
459
+ end
460
+
461
+ ##
462
+ # Returns this service presenter if there is a grpc client. Otherwise,
463
+ # returns the corresponding rest service presenter if there isn't a grpc
464
+ # client but there is a rest client. Otherwise, returns nil if there is
465
+ # neither client.
466
+ #
467
+ # @return [ServicePresenter,ServiceRestPresenter,nil]
468
+ #
469
+ def usable_service_presenter
470
+ if @api.generate_grpc_clients?
471
+ self
472
+ elsif @api.generate_rest_clients? && methods_rest_bindings?
473
+ rest
474
+ end
475
+ end
476
+
408
477
  private
409
478
 
410
479
  def default_config key
@@ -46,61 +46,64 @@ module Gapic
46
46
  ##
47
47
  # @return [String]
48
48
  #
49
- def client_name
50
- main_service.client_name
49
+ def service_stub_name
50
+ "ServiceStub"
51
51
  end
52
52
 
53
53
  ##
54
54
  # @return [String]
55
55
  #
56
- def client_name_full
57
- fix_namespace api, "#{service_name_full}::#{client_name}"
56
+ def service_stub_name_full
57
+ fix_namespace api, "#{service_name_full}::#{service_stub_name}"
58
58
  end
59
59
 
60
60
  ##
61
61
  # @return [String]
62
62
  #
63
- def client_require
64
- ruby_file_path api, client_name_full
63
+ def service_stub_require
64
+ ruby_file_path api, service_stub_name_full
65
65
  end
66
66
 
67
67
  ##
68
68
  # @return [String]
69
69
  #
70
- def client_file_path
71
- "#{client_require}.rb"
70
+ def service_stub_file_path
71
+ "#{service_stub_require}.rb"
72
72
  end
73
73
 
74
- def create_client_call
75
- "#{client_name_full}.new"
74
+ ##
75
+ # @return [String]
76
+ #
77
+ def client_name
78
+ main_service.client_name
76
79
  end
77
80
 
78
81
  ##
79
82
  # @return [String]
80
83
  #
81
- def service_stub_name
82
- "ServiceStub"
84
+ def client_name_full
85
+ fix_namespace api, "#{service_name_full}::#{client_name}"
83
86
  end
84
87
 
85
88
  ##
86
89
  # @return [String]
87
90
  #
88
- def service_stub_name_full
89
- fix_namespace api, "#{service_name_full}::#{service_stub_name}"
91
+ def client_require
92
+ ruby_file_path api, client_name_full
90
93
  end
91
94
 
92
95
  ##
93
96
  # @return [String]
94
97
  #
95
- def service_stub_require
96
- ruby_file_path api, service_stub_name_full
98
+ def client_file_path
99
+ "#{client_require}.rb"
97
100
  end
98
101
 
99
102
  ##
100
103
  # @return [String]
101
104
  #
102
- def service_stub_file_path
103
- "#{service_stub_require}.rb"
105
+ def create_client_call
106
+ "#{client_name_full}.new"
104
107
  end
105
108
 
106
109
  ##
@@ -120,32 +123,37 @@ module Gapic
120
123
  ##
121
124
  # @return [String]
122
125
  #
123
- def transcoding_helper_name
124
- "GrpcTranscoding"
126
+ def test_client_file_path
127
+ main_service.service_file_path.sub ".rb", "_test.rb"
125
128
  end
126
129
 
127
130
  ##
128
131
  # @return [String]
129
132
  #
130
- def transcoding_helper_name_full
131
- fix_namespace api, "#{service_name_full}::#{transcoding_helper_name}"
133
+ def credentials_class_xref
134
+ main_service.credentials_class_xref
132
135
  end
133
136
 
134
137
  ##
135
138
  # @return [String]
136
139
  #
137
- def transcoding_helper_require
138
- ruby_file_path api, transcoding_helper_name_full
140
+ def configure_client_call
141
+ "#{client_name_full}.configure"
139
142
  end
140
143
 
141
144
  ##
142
- # @return [String]
145
+ # The method to use for quick start samples. Normally this is simply the
146
+ # first non-client-streaming method defined, but it can be overridden via
147
+ # a gem config.
143
148
  #
144
- def transcoding_helper_file_path
145
- "#{transcoding_helper_require}.rb"
149
+ # @return [Gapic::Presenters::MethodRestPresenter] if there is a method
150
+ # appropriatke for quick start
151
+ # @return [nil] if there is no method appropriate for quick start
152
+ #
153
+ def quick_start_method
154
+ main_service.quick_start_method&.rest
146
155
  end
147
156
 
148
-
149
157
  private
150
158
 
151
159
  # @return [Gapic::Presenters::ServicePresenter]