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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +45 -0
- data/lib/gapic/generator/version.rb +1 -1
- data/lib/gapic/generators/default_generator.rb +11 -1
- data/lib/gapic/generators/default_generator_parameters.rb +3 -1
- data/lib/gapic/presenters.rb +2 -0
- data/lib/gapic/presenters/gem_presenter.rb +63 -10
- data/lib/gapic/presenters/method/rest_pagination_info.rb +246 -0
- data/lib/gapic/presenters/method_presenter.rb +21 -2
- data/lib/gapic/presenters/method_rest_presenter.rb +70 -4
- data/lib/gapic/presenters/resource_presenter.rb +8 -0
- data/lib/gapic/presenters/service_config_presenter.rb +48 -0
- data/lib/gapic/presenters/service_presenter.rb +69 -0
- data/lib/gapic/presenters/service_rest_presenter.rb +36 -28
- data/lib/gapic/presenters/snippet_presenter.rb +103 -0
- data/lib/gapic/schema/api.rb +32 -8
- data/lib/gapic/schema/request_param_parser.rb +2 -2
- data/lib/gapic/schema/wrappers.rb +26 -0
- data/templates/default/gem/readme.erb +3 -3
- data/templates/default/lib/rest/_rest.erb +0 -2
- data/templates/default/service/client/_client.erb +18 -20
- data/templates/default/service/client/_config.erb +13 -14
- data/templates/default/service/client/_credentials.erb +2 -0
- data/templates/default/service/client/_operations.erb +1 -1
- data/templates/default/service/client/_paths.erb +1 -1
- data/templates/default/service/client/_self_configure_defaults.erb +2 -2
- data/templates/default/service/client/method/_def.erb +2 -0
- data/templates/default/service/client/method/def/_options_defaults.erb +3 -1
- data/templates/default/service/client/method/docs/_deprecated.erb +5 -0
- data/templates/default/service/client/method/docs/_snippets.erb +6 -0
- data/templates/default/service/rest/client/_client.erb +15 -24
- data/templates/default/service/rest/client/_config.erb +48 -0
- data/templates/default/service/rest/client/method/_def.erb +1 -1
- data/templates/default/service/rest/client/method/def/_options_defaults.erb +7 -3
- data/templates/default/service/rest/client/method/def/_response.erb +6 -0
- data/templates/default/service/rest/client/method/def/_response_normal.erb +4 -15
- data/templates/default/service/rest/client/method/def/_response_paged.erb +7 -0
- data/templates/default/service/rest/client/method/docs/_result.erb +3 -3
- data/templates/default/service/rest/service_stub.erb +6 -0
- data/templates/default/service/rest/service_stub/_service_stub.erb +25 -0
- data/templates/default/service/rest/{grpc_transcoding/method → service_stub/grpc_transcoding_method}/_def.erb +4 -1
- data/templates/default/service/rest/{grpc_transcoding/method → service_stub/grpc_transcoding_method}/def/_query_string_param.erb +0 -0
- data/templates/default/service/rest/service_stub/method/_def.erb +20 -0
- data/templates/default/service/rest/service_stub/method/def/_request.erb +2 -0
- data/templates/default/service/rest/service_stub/method/def/_response.erb +17 -0
- data/templates/default/service/rest/test/client.erb +18 -0
- data/templates/default/service/rest/test/method/_assert_response.erb +2 -0
- data/templates/default/service/rest/test/method/_configure.erb +19 -0
- data/templates/default/service/rest/test/method/_normal.erb +71 -0
- data/templates/default/service/rest/test/method/_setup.erb +38 -0
- data/templates/default/service/test/client_paths.erb +1 -1
- data/templates/default/snippets/gemfile.erb +17 -0
- data/templates/default/snippets/snippet/_structure.erb +71 -0
- data/templates/default/snippets/standalone.erb +6 -0
- metadata +29 -12
- data/templates/default/service/client/_self_configure_retry_policy.erb +0 -15
- data/templates/default/service/rest/client/_requires.erb +0 -1
- 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
|
-
|
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
|
-
|
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
|
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
|
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_#{
|
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
|
50
|
-
|
49
|
+
def service_stub_name
|
50
|
+
"ServiceStub"
|
51
51
|
end
|
52
52
|
|
53
53
|
##
|
54
54
|
# @return [String]
|
55
55
|
#
|
56
|
-
def
|
57
|
-
fix_namespace api, "#{service_name_full}::#{
|
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
|
64
|
-
ruby_file_path api,
|
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
|
71
|
-
"#{
|
70
|
+
def service_stub_file_path
|
71
|
+
"#{service_stub_require}.rb"
|
72
72
|
end
|
73
73
|
|
74
|
-
|
75
|
-
|
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
|
82
|
-
"
|
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
|
89
|
-
|
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
|
96
|
-
|
98
|
+
def client_file_path
|
99
|
+
"#{client_require}.rb"
|
97
100
|
end
|
98
101
|
|
99
102
|
##
|
100
103
|
# @return [String]
|
101
104
|
#
|
102
|
-
def
|
103
|
-
"#{
|
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
|
124
|
-
"
|
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
|
131
|
-
|
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
|
138
|
-
|
140
|
+
def configure_client_call
|
141
|
+
"#{client_name_full}.configure"
|
139
142
|
end
|
140
143
|
|
141
144
|
##
|
142
|
-
#
|
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
|
-
|
145
|
-
|
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]
|