gapic-generator 0.7.5 → 0.8.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 +13 -0
- data/lib/gapic/generator/version.rb +1 -1
- data/lib/gapic/generators/default_generator.rb +10 -0
- data/lib/gapic/presenters.rb +1 -0
- data/lib/gapic/presenters/gem_presenter.rb +44 -10
- data/lib/gapic/presenters/method_presenter.rb +4 -0
- data/lib/gapic/presenters/method_rest_presenter.rb +10 -2
- data/lib/gapic/presenters/service_rest_presenter.rb +9 -27
- data/lib/gapic/presenters/snippet_presenter.rb +103 -0
- data/lib/gapic/schema/api.rb +15 -1
- data/lib/gapic/schema/request_param_parser.rb +2 -2
- data/templates/default/service/rest/client/method/def/_options_defaults.erb +2 -1
- 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/snippets/gemfile.erb +17 -0
- data/templates/default/snippets/snippet/_structure.erb +71 -0
- data/templates/default/snippets/standalone.erb +6 -0
- metadata +11 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 5c8a401f416529802324b86833c5c3a9fcef01afd699439053ce868a7862c5c8
|
4
|
+
data.tar.gz: 6f794cc05eb33a4c201bdcc62dc62524406ae2fb003f0b2d9c536482517a4109
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 536731d9a866b0c58540b6eb6f62469eef75f10f82a9fba3c45e0e5a2c5d08b7f5b97b0b385b3e6063e418e0faba687faf45c44cc700ab69da554c9d28a46049
|
7
|
+
data.tar.gz: c1b99ad4ebfae8c4085522924ba4fd11f1a2628b67d64dfc549f22df40aadf5d79ae127bcac73ca5fe2795937f29556b6f656d5b86c66aaef43c78ec644b6772
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,18 @@
|
|
1
1
|
# Release History for gapic-generator
|
2
2
|
|
3
|
+
### 0.8.0 / 2021-06-16
|
4
|
+
|
5
|
+
* Initial implementation of standalone snippet generation.
|
6
|
+
* Updated gapic-common dependencies to require at least 0.5 and to support future 1.x versions.
|
7
|
+
* Generated unit tests for REST clients.
|
8
|
+
* Generated proper x-goog-api-client headers for REST clients.
|
9
|
+
* Added generation arguments to generated repo metadata.
|
10
|
+
* Allow multiple versions in the extra-dependency command line argument.
|
11
|
+
* Fixed treatment of boolean-valued command line arguments to the generator.
|
12
|
+
* Fixed behavior of wrapper-gem-override if given an empty value.
|
13
|
+
* Fixed default env_prefix computation to avoid the version part of the proto namespace.
|
14
|
+
* Fixed Bazel front-end to preserve file permissions.
|
15
|
+
|
3
16
|
### 0.7.5 / 2021-05-18
|
4
17
|
|
5
18
|
* Bazel jobs now provide a prebuilt ruby binary.
|
@@ -61,9 +61,17 @@ module Gapic
|
|
61
61
|
files << g("service/operations.erb", "lib/#{service.operations_file_path}", service: service) if service.lro? && !@api.generate_rest_clients?
|
62
62
|
files << g("service/rest/client.erb", "lib/#{service.rest.client_file_path}", service: service) if @api.generate_rest_clients? and service.methods_rest_bindings?
|
63
63
|
files << g("service/rest/grpc_transcoding.erb", "lib/#{service.rest.transcoding_helper_file_path}", service: service) if @api.generate_rest_clients? and service.methods_rest_bindings?
|
64
|
+
files << g("service/rest/test/client.erb", "test/#{service.rest.test_client_file_path}", service: service) if @api.generate_rest_clients? and service.methods_rest_bindings?
|
64
65
|
files << g("service/test/client.erb", "test/#{service.test_client_file_path}", service: service) unless @api.generate_rest_clients?
|
65
66
|
files << g("service/test/client_paths.erb", "test/#{service.test_paths_file_path}", service: service) if service.paths?
|
66
67
|
files << g("service/test/client_operations.erb", "test/#{service.test_client_operations_file_path}", service: service) if service.lro? && !@api.generate_rest_clients?
|
68
|
+
|
69
|
+
if @api.generate_standalone_snippets?
|
70
|
+
service.methods.each do |method|
|
71
|
+
snippet = method.snippet
|
72
|
+
files << g("snippets/standalone.erb", "snippets/#{snippet.snippet_file_path}", snippet: snippet)
|
73
|
+
end
|
74
|
+
end
|
67
75
|
end
|
68
76
|
end
|
69
77
|
|
@@ -82,6 +90,8 @@ module Gapic
|
|
82
90
|
files << g("gem/entrypoint.erb", "lib/#{gem.name}.rb", gem: gem)
|
83
91
|
files << g("gem/gapic_metadata_json.erb", "gapic_metadata.json", gem: gem) if @api.generate_metadata
|
84
92
|
|
93
|
+
files << g("snippets/gemfile.erb", "snippets/Gemfile", gem: gem) if @api.generate_standalone_snippets?
|
94
|
+
|
85
95
|
gem.proto_files.each do |proto_file|
|
86
96
|
files << g("proto_docs/proto_file.erb", "proto_docs/#{proto_file.docs_file_path}", file: proto_file)
|
87
97
|
end
|
data/lib/gapic/presenters.rb
CHANGED
@@ -27,6 +27,7 @@ require "gapic/presenters/resource_presenter"
|
|
27
27
|
require "gapic/presenters/sample_presenter"
|
28
28
|
require "gapic/presenters/service_presenter"
|
29
29
|
require "gapic/presenters/service_rest_presenter"
|
30
|
+
require "gapic/presenters/snippet_presenter"
|
30
31
|
|
31
32
|
module Gapic
|
32
33
|
##
|
@@ -127,7 +127,11 @@ module Gapic
|
|
127
127
|
end
|
128
128
|
|
129
129
|
def env_prefix
|
130
|
-
|
130
|
+
prefix = gem_config(:env_prefix) || begin
|
131
|
+
segs = name.split("-").reverse
|
132
|
+
segs.find { |seg| seg !~ /^v\d/ } || segs.first || "UNKNOWN"
|
133
|
+
end
|
134
|
+
prefix.upcase
|
131
135
|
end
|
132
136
|
|
133
137
|
def iam_dependency?
|
@@ -156,18 +160,26 @@ module Gapic
|
|
156
160
|
gem_config :issue_tracker_url
|
157
161
|
end
|
158
162
|
|
163
|
+
##
|
164
|
+
# @return [Boolean]
|
165
|
+
#
|
159
166
|
def free_tier?
|
160
|
-
|
161
|
-
gem_config(:free_tier) == "true"
|
167
|
+
gem_config(:free_tier) || false
|
162
168
|
end
|
163
169
|
|
170
|
+
##
|
171
|
+
# @return [Boolean]
|
172
|
+
#
|
164
173
|
def yard_strict?
|
165
174
|
# Default to true unless the config is explicitly set to "false"
|
166
|
-
gem_config(:yard_strict)
|
175
|
+
gem_config(:yard_strict).nil? || gem_config(:yard_strict)
|
167
176
|
end
|
168
177
|
|
178
|
+
##
|
179
|
+
# @return [Boolean]
|
180
|
+
#
|
169
181
|
def generic_endpoint?
|
170
|
-
gem_config(:generic_endpoint)
|
182
|
+
gem_config(:generic_endpoint) || false
|
171
183
|
end
|
172
184
|
|
173
185
|
def entrypoint_require
|
@@ -183,11 +195,13 @@ module Gapic
|
|
183
195
|
end
|
184
196
|
|
185
197
|
def dependencies
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
|
198
|
+
@dependencies ||= begin
|
199
|
+
deps = { "gapic-common" => [">= 0.5", "< 2.a"] }
|
200
|
+
deps["grpc-google-iam-v1"] = [">= 0.6.10", "< 2.a"] if iam_dependency?
|
201
|
+
extra_deps = gem_config_dependencies
|
202
|
+
deps.merge! extra_deps if extra_deps
|
203
|
+
deps
|
204
|
+
end
|
191
205
|
end
|
192
206
|
|
193
207
|
def dependency_list
|
@@ -225,6 +239,26 @@ module Gapic
|
|
225
239
|
@api.configuration[:gem][key]
|
226
240
|
end
|
227
241
|
|
242
|
+
##
|
243
|
+
# There is a special case (from PoV of generator parameters)
|
244
|
+
# in gem dependencies where a dependency needs to be an array of strings
|
245
|
+
# e.g. ">= 1.6", "< 2.a"
|
246
|
+
# Rather than creating a special generator param case for this I will special-case it here.
|
247
|
+
# '|' is the separator.
|
248
|
+
# The above would be represented as ">= 1.6|< 2.a"
|
249
|
+
#
|
250
|
+
# @return [Hash<String, String>, Hash{String=>Array<String>}, nil]
|
251
|
+
def gem_config_dependencies
|
252
|
+
return unless gem_config :extra_dependencies
|
253
|
+
gem_config(:extra_dependencies).map do |dep_name, dep_versions|
|
254
|
+
if dep_versions.include? "|"
|
255
|
+
[dep_name, dep_versions.split("|")]
|
256
|
+
else
|
257
|
+
[dep_name, dep_versions]
|
258
|
+
end
|
259
|
+
end.to_h
|
260
|
+
end
|
261
|
+
|
228
262
|
def blacklist_protos
|
229
263
|
blacklist = gem_config :blacklist
|
230
264
|
|
@@ -128,6 +128,13 @@ module Gapic
|
|
128
128
|
@proto_method.http&.body || ""
|
129
129
|
end
|
130
130
|
|
131
|
+
##
|
132
|
+
# @return [Boolean] True if body contains full request object (`*` in the annotation), false otherwise
|
133
|
+
#
|
134
|
+
def body_is_request_object?
|
135
|
+
body == "*"
|
136
|
+
end
|
137
|
+
|
131
138
|
##
|
132
139
|
# Performs a limited version of grpc transcoding to create a string that will interpolate
|
133
140
|
# the values from the request object to create a request body at runtime.
|
@@ -142,7 +149,7 @@ module Gapic
|
|
142
149
|
def body_interpolated request_obj_name = "request_pb"
|
143
150
|
return "\"\"" unless body?
|
144
151
|
|
145
|
-
return "#{request_obj_name}.to_json" if
|
152
|
+
return "#{request_obj_name}.to_json" if body_is_request_object?
|
146
153
|
|
147
154
|
"#{request_obj_name}.#{body}.to_json"
|
148
155
|
end
|
@@ -156,11 +163,12 @@ module Gapic
|
|
156
163
|
|
157
164
|
# @return [Array<String>]
|
158
165
|
def query_string_params
|
159
|
-
return [] if
|
166
|
+
return [] if body_is_request_object?
|
160
167
|
|
161
168
|
routing_params_set = routing_params.to_set
|
162
169
|
@main_method.arguments
|
163
170
|
.reject { |arg| routing_params_set.include? arg.name }
|
171
|
+
.reject { |arg| body == arg.name }
|
164
172
|
.reject(&:message?)
|
165
173
|
.reject { |arg| arg.default_value_for_type.nil? }
|
166
174
|
end
|
@@ -71,36 +71,11 @@ module Gapic
|
|
71
71
|
"#{client_require}.rb"
|
72
72
|
end
|
73
73
|
|
74
|
-
def create_client_call
|
75
|
-
"#{client_name_full}.new"
|
76
|
-
end
|
77
|
-
|
78
|
-
##
|
79
|
-
# @return [String]
|
80
|
-
#
|
81
|
-
def service_stub_name
|
82
|
-
"ServiceStub"
|
83
|
-
end
|
84
|
-
|
85
|
-
##
|
86
|
-
# @return [String]
|
87
|
-
#
|
88
|
-
def service_stub_name_full
|
89
|
-
fix_namespace api, "#{service_name_full}::#{service_stub_name}"
|
90
|
-
end
|
91
|
-
|
92
74
|
##
|
93
75
|
# @return [String]
|
94
76
|
#
|
95
|
-
def
|
96
|
-
|
97
|
-
end
|
98
|
-
|
99
|
-
##
|
100
|
-
# @return [String]
|
101
|
-
#
|
102
|
-
def service_stub_file_path
|
103
|
-
"#{service_stub_require}.rb"
|
77
|
+
def create_client_call
|
78
|
+
"#{client_name_full}.new"
|
104
79
|
end
|
105
80
|
|
106
81
|
##
|
@@ -145,6 +120,13 @@ module Gapic
|
|
145
120
|
"#{transcoding_helper_require}.rb"
|
146
121
|
end
|
147
122
|
|
123
|
+
##
|
124
|
+
# @return [String]
|
125
|
+
#
|
126
|
+
def test_client_file_path
|
127
|
+
main_service.service_file_path.sub ".rb", "_test.rb"
|
128
|
+
end
|
129
|
+
|
148
130
|
|
149
131
|
private
|
150
132
|
|
@@ -0,0 +1,103 @@
|
|
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
|
+
require "active_support/inflector"
|
18
|
+
|
19
|
+
module Gapic
|
20
|
+
module Presenters
|
21
|
+
##
|
22
|
+
# A presenter for snippets.
|
23
|
+
#
|
24
|
+
class SnippetPresenter
|
25
|
+
def initialize method_presenter, api
|
26
|
+
@method_presenter = method_presenter
|
27
|
+
@api = api
|
28
|
+
end
|
29
|
+
|
30
|
+
def client_streaming?
|
31
|
+
@method_presenter.client_streaming?
|
32
|
+
end
|
33
|
+
|
34
|
+
def bidi_streaming?
|
35
|
+
@method_presenter.client_streaming? && @method_presenter.server_streaming?
|
36
|
+
end
|
37
|
+
|
38
|
+
def response_kind
|
39
|
+
if @method_presenter.server_streaming?
|
40
|
+
:streaming
|
41
|
+
elsif @method_presenter.paged?
|
42
|
+
:paged
|
43
|
+
elsif @method_presenter.lro?
|
44
|
+
:lro
|
45
|
+
else
|
46
|
+
:simple
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
def snippet_file_path
|
51
|
+
"#{@method_presenter.service.service_require.split('/').last}/#{@method_presenter.name}.rb"
|
52
|
+
end
|
53
|
+
|
54
|
+
def require_path
|
55
|
+
@method_presenter.service.service_require
|
56
|
+
end
|
57
|
+
|
58
|
+
def client_type
|
59
|
+
@method_presenter.service.client_name_full.sub(/^::/, "")
|
60
|
+
end
|
61
|
+
|
62
|
+
def request_type
|
63
|
+
@method_presenter.request_type.sub(/^::/, "")
|
64
|
+
end
|
65
|
+
|
66
|
+
def return_type
|
67
|
+
base_type = @method_presenter.return_type.sub(/^::/, "")
|
68
|
+
@method_presenter.server_streaming? ? "Enumerable<#{base_type}>" : base_type
|
69
|
+
end
|
70
|
+
|
71
|
+
def paged_response_type
|
72
|
+
@method_presenter.paged_response_type
|
73
|
+
end
|
74
|
+
|
75
|
+
def base_response_type
|
76
|
+
@method_presenter.return_type
|
77
|
+
end
|
78
|
+
|
79
|
+
# TODO: Determine type of LRO response
|
80
|
+
|
81
|
+
def method_name
|
82
|
+
@method_presenter.name
|
83
|
+
end
|
84
|
+
|
85
|
+
def region_tag
|
86
|
+
gem_presenter = @method_presenter.service.gem
|
87
|
+
api_id = gem_presenter.api_shortname || gem_presenter.api_id&.split(".")&.first
|
88
|
+
names = gem_presenter.name.split "-"
|
89
|
+
final_name = names.pop
|
90
|
+
if final_name =~ /^v\d/
|
91
|
+
api_version = final_name
|
92
|
+
api_id ||= names.last
|
93
|
+
else
|
94
|
+
api_id ||= final_name
|
95
|
+
api_version = "v0"
|
96
|
+
end
|
97
|
+
service_name = @method_presenter.service.module_name
|
98
|
+
method_name = @method_presenter.method.name
|
99
|
+
"#{api_id}_#{api_version}_generated_#{service_name}_#{method_name}_sync"
|
100
|
+
end
|
101
|
+
end
|
102
|
+
end
|
103
|
+
end
|
data/lib/gapic/schema/api.rb
CHANGED
@@ -89,6 +89,10 @@ module Gapic
|
|
89
89
|
matching_files.first
|
90
90
|
end
|
91
91
|
|
92
|
+
def overrides_of key
|
93
|
+
configuration&.fetch(:overrides, nil)&.fetch(key, nil) || {}
|
94
|
+
end
|
95
|
+
|
92
96
|
def fix_file_path str
|
93
97
|
str = String str
|
94
98
|
return str if configuration[:overrides].nil?
|
@@ -241,6 +245,11 @@ module Gapic
|
|
241
245
|
configuration[:transports].include? "grpc"
|
242
246
|
end
|
243
247
|
|
248
|
+
# Whether to generate standalone snippets
|
249
|
+
def generate_standalone_snippets?
|
250
|
+
configuration[:generate_standalone_snippets] ||= false
|
251
|
+
end
|
252
|
+
|
244
253
|
# Whether to generate gapic metadata (drift manifest) file
|
245
254
|
# @return [Boolean]
|
246
255
|
def generate_metadata
|
@@ -317,7 +326,12 @@ module Gapic
|
|
317
326
|
# @return [String, Nil]
|
318
327
|
def wrapper_gem_name_override
|
319
328
|
return nil unless wrapper_gem_name_override?
|
320
|
-
configuration[:overrides][:wrapper_gem_name]
|
329
|
+
return nil if configuration[:overrides][:wrapper_gem_name].nil?
|
330
|
+
|
331
|
+
wrapper_name_config = configuration[:overrides][:wrapper_gem_name].strip
|
332
|
+
return nil if wrapper_name_config.empty?
|
333
|
+
|
334
|
+
wrapper_name_config
|
321
335
|
end
|
322
336
|
|
323
337
|
private
|
@@ -75,7 +75,7 @@ module Gapic
|
|
75
75
|
error_output
|
76
76
|
)
|
77
77
|
|
78
|
-
|
78
|
+
unless param_value.nil?
|
79
79
|
RequestParameter.new param_val_input_str, param_name_input_esc, value_str, param_config_name, param_value
|
80
80
|
end
|
81
81
|
end.compact # known bool parameters with invalid values will not be added so we have to compact
|
@@ -148,7 +148,7 @@ module Gapic
|
|
148
148
|
when :bool
|
149
149
|
# bools should be either `true` or `false`
|
150
150
|
unesc_val = unescape value_str
|
151
|
-
unesc_val if ["true", "false"].include? unesc_val
|
151
|
+
(unesc_val == "true") if ["true", "false"].include? unesc_val
|
152
152
|
else
|
153
153
|
# if it's an unknown type, just escape it without attempting to parse anything
|
154
154
|
unescape value_str
|
@@ -8,7 +8,8 @@ call_metadata = {}
|
|
8
8
|
# Set x-goog-api-client header
|
9
9
|
call_metadata[:"x-goog-api-client"] ||= ::Gapic::Headers.x_goog_api_client \
|
10
10
|
lib_name: @config.lib_name, lib_version: @config.lib_version,
|
11
|
-
gapic_version: ::<%= method.service.gem.version_name_full
|
11
|
+
gapic_version: ::<%= method.service.gem.version_name_full %>,
|
12
|
+
transports_version_send: [:rest]
|
12
13
|
|
13
14
|
options.apply_defaults timeout: @config.timeout,
|
14
15
|
metadata: call_metadata
|
@@ -0,0 +1,18 @@
|
|
1
|
+
<%- assert_locals service -%>
|
2
|
+
<%= render partial: "shared/header" %>
|
3
|
+
require "helper"
|
4
|
+
|
5
|
+
require "<%= service.proto_service_require %>"
|
6
|
+
require "<%= service.service_require %>"
|
7
|
+
|
8
|
+
|
9
|
+
class <%= service.client_name_full %>Test < Minitest::Test
|
10
|
+
<%= indent render(partial: "service/rest/test/method/setup"), 2 %>
|
11
|
+
|
12
|
+
<% service.methods.each do |method| %>
|
13
|
+
<%= indent render(partial: "service/rest/test/method/#{method.kind}",
|
14
|
+
locals: { method: method }), 2 %>
|
15
|
+
|
16
|
+
<% end %>
|
17
|
+
<%= indent render(partial: "service/rest/test/method/configure", locals: { service: service }), 2 %>
|
18
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
<%- assert_locals service -%>
|
2
|
+
<%- full_client_name = defined?(client_name_full) ? client_name_full : service.rest.client_name_full -%>
|
3
|
+
def test_configure
|
4
|
+
credentials_token = :dummy_value
|
5
|
+
|
6
|
+
client = block_config = config = nil
|
7
|
+
Gapic::Rest::ClientStub.stub :new, nil do
|
8
|
+
client = <%= full_client_name =%>.new do |config|
|
9
|
+
config.credentials = credentials_token
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
config = client.configure do |c|
|
14
|
+
block_config = c
|
15
|
+
end
|
16
|
+
|
17
|
+
assert_same block_config, config
|
18
|
+
assert_kind_of <%= full_client_name %>::Configuration, config
|
19
|
+
end
|
@@ -0,0 +1,71 @@
|
|
1
|
+
<%- assert_locals method -%>
|
2
|
+
<%- full_client_name = defined?(client_name_full) ? client_name_full : method.service.rest.client_name_full -%>
|
3
|
+
<%- fields = method.fields_with_first_oneof -%>
|
4
|
+
def test_<%= method.name %>
|
5
|
+
# Create test objects.
|
6
|
+
client_result = <%= method.return_type %>.new
|
7
|
+
http_response = OpenStruct.new body: client_result.to_json
|
8
|
+
|
9
|
+
call_options = {}
|
10
|
+
|
11
|
+
# Create request parameters for a unary method.
|
12
|
+
<%- fields.each do |field| -%>
|
13
|
+
<%= field.name %> = <%= field.default_value %>
|
14
|
+
<%- end -%>
|
15
|
+
|
16
|
+
<%= method.name %>_client_stub = ClientStub.new http_response do |verb, uri:, body:, params:, options:|
|
17
|
+
assert_equal :<%= method.rest.verb %>, verb
|
18
|
+
|
19
|
+
assert options.metadata.key? :"x-goog-api-client"
|
20
|
+
assert options.metadata[:"x-goog-api-client"].include? "rest"
|
21
|
+
refute options.metadata[:"x-goog-api-client"].include? "grpc"
|
22
|
+
|
23
|
+
<%- if method.rest.query_string_params? -%>
|
24
|
+
<%- method.rest.query_string_params.each do |field| -%>
|
25
|
+
assert params.key? "<%= field.camel_name %>"
|
26
|
+
<%- end -%>
|
27
|
+
<%- end -%>
|
28
|
+
<%- if method.rest.body? %>
|
29
|
+
refute_nil body
|
30
|
+
<%- else -%>
|
31
|
+
assert_nil body
|
32
|
+
<%- end -%>
|
33
|
+
end
|
34
|
+
|
35
|
+
Gapic::Rest::ClientStub.stub :new, <%= method.name %>_client_stub do
|
36
|
+
# Create client
|
37
|
+
client = <%= full_client_name %>.new do |config|
|
38
|
+
config.credentials = :dummy_value
|
39
|
+
end
|
40
|
+
|
41
|
+
# Use hash object
|
42
|
+
client.<%= method.name %>({ <%= fields.map(&:as_kwarg).join ", " %> }) do |result, response|
|
43
|
+
<%= indent_tail render(partial: "service/rest/test/method/assert_response", locals: { method: method }), 6 %>
|
44
|
+
end
|
45
|
+
|
46
|
+
<%- if fields.any? -%>
|
47
|
+
# Use named arguments
|
48
|
+
client.<%= method.name %> <%= fields.map(&:as_kwarg).join ", " %> do |result, response|
|
49
|
+
<%= indent_tail render(partial: "service/rest/test/method/assert_response", locals: { method: method }), 6 %>
|
50
|
+
end
|
51
|
+
|
52
|
+
<%- end -%>
|
53
|
+
# Use protobuf object
|
54
|
+
client.<%= method.name %> <%= method.request_type %>.new(<%= fields.map(&:as_kwarg).join ", " %>) do |result, response|
|
55
|
+
<%= indent_tail render(partial: "service/rest/test/method/assert_response", locals: { method: method }), 6 %>
|
56
|
+
end
|
57
|
+
|
58
|
+
# Use hash object with options
|
59
|
+
client.<%= method.name %>({ <%= fields.map(&:as_kwarg).join ", " %> }, call_options) do |result, response|
|
60
|
+
<%= indent_tail render(partial: "service/rest/test/method/assert_response", locals: { method: method }), 6 %>
|
61
|
+
end
|
62
|
+
|
63
|
+
# Use protobuf object with options
|
64
|
+
client.<%= method.name %>(<%= method.request_type %>.new(<%= fields.map(&:as_kwarg).join ", " %>), call_options) do |result, response|
|
65
|
+
<%= indent_tail render(partial: "service/rest/test/method/assert_response", locals: { method: method }), 6 %>
|
66
|
+
end
|
67
|
+
|
68
|
+
# Verify method calls
|
69
|
+
assert_equal <%= fields.any? ? 5 : 4 %>, <%= method.name %>_client_stub.call_count
|
70
|
+
end
|
71
|
+
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
class ClientStub
|
2
|
+
attr_accessor :call_count, :requests
|
3
|
+
|
4
|
+
def initialize response, &block
|
5
|
+
@response = response
|
6
|
+
@block = block
|
7
|
+
@call_count = 0
|
8
|
+
@requests = []
|
9
|
+
end
|
10
|
+
|
11
|
+
def make_get_request uri:, params: {}, options: {}
|
12
|
+
make_http_request :get, uri: uri, body: nil, params: params, options: options
|
13
|
+
end
|
14
|
+
|
15
|
+
def make_delete_request uri:, params: {}, options: {}
|
16
|
+
make_http_request :delete, uri: uri, body: nil, params: params, options: options
|
17
|
+
end
|
18
|
+
|
19
|
+
def make_post_request uri:, body: nil, params: {}, options: {}
|
20
|
+
make_http_request :post, uri: uri, body: body, params: params, options: options
|
21
|
+
end
|
22
|
+
|
23
|
+
def make_patch_request uri:, body:, params: {}, options: {}
|
24
|
+
make_http_request :patch, uri: uri, body: body, params: params, options: options
|
25
|
+
end
|
26
|
+
|
27
|
+
def make_put_request uri:, body:, params: {}, options: {}
|
28
|
+
make_http_request :put, uri: uri, body: body, params: params, options: options
|
29
|
+
end
|
30
|
+
|
31
|
+
def make_http_request *args, **kwargs
|
32
|
+
@call_count += 1
|
33
|
+
|
34
|
+
@requests << @block&.call(*args, **kwargs)
|
35
|
+
|
36
|
+
@response
|
37
|
+
end
|
38
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
<%- assert_locals gem -%>
|
2
|
+
<%= render partial: "shared/header" -%>
|
3
|
+
|
4
|
+
source "https://rubygems.org"
|
5
|
+
|
6
|
+
if ENV["GOOGLE_CLOUD_SAMPLES_TEST"] == "master"
|
7
|
+
gem "<%= gem.name %>", path: "../"
|
8
|
+
else
|
9
|
+
gem "<%= gem.name %>"
|
10
|
+
end
|
11
|
+
|
12
|
+
group :test do
|
13
|
+
gem "google-style", "~> 1.25.1"
|
14
|
+
gem "minitest", "~> 5.14"
|
15
|
+
gem "minitest-focus", "~> 1.1"
|
16
|
+
gem "minitest-hooks", "~> 1.5"
|
17
|
+
end
|
@@ -0,0 +1,71 @@
|
|
1
|
+
<%- assert_locals snippet -%>
|
2
|
+
require "<%= snippet.require_path %>"
|
3
|
+
|
4
|
+
# Create a client object. The client can be reused for multiple calls.
|
5
|
+
client = <%= snippet.client_type %>.new
|
6
|
+
|
7
|
+
<%- if snippet.bidi_streaming? -%>
|
8
|
+
# Create an input stream
|
9
|
+
input = Gapic::StreamInput.new
|
10
|
+
|
11
|
+
# Call the <%= snippet.method_name %> method to start streaming.
|
12
|
+
output = client.<%= snippet.method_name %> input
|
13
|
+
|
14
|
+
# Send requests on the stream. For each request, pass in keyword
|
15
|
+
# arguments to set fields. Be sure to close the stream when done.
|
16
|
+
input << <%= snippet.request_type %>.new
|
17
|
+
input << <%= snippet.request_type %>.new
|
18
|
+
input.close
|
19
|
+
|
20
|
+
# Handle streamed responses. These may be interleaved with inputs.
|
21
|
+
# Each response is of type <%= snippet.base_response_type %>.
|
22
|
+
output.each do |response|
|
23
|
+
p response
|
24
|
+
end
|
25
|
+
<%- else -%>
|
26
|
+
<%- if snippet.client_streaming? -%>
|
27
|
+
# Create a stream of requests, as an Enumerator.
|
28
|
+
# For each request, pass in keyword arguments to set fields.
|
29
|
+
request = [
|
30
|
+
<%= snippet.request_type %>.new,
|
31
|
+
<%= snippet.request_type %>.new
|
32
|
+
].to_enum
|
33
|
+
<%- else -%>
|
34
|
+
# Create a request. To set request fields, pass in keyword arguments.
|
35
|
+
request = <%= snippet.request_type %>.new
|
36
|
+
<%- end -%>
|
37
|
+
|
38
|
+
# Call the <%= snippet.method_name %> method.
|
39
|
+
result = client.<%= snippet.method_name %> request
|
40
|
+
|
41
|
+
<%- case snippet.response_kind -%>
|
42
|
+
<%- when :lro -%>
|
43
|
+
# The returned object is of type Gapic::Operation. You can use this
|
44
|
+
# object to check the status of an operation, cancel it, or wait
|
45
|
+
# for results. Here is how to block until completion:
|
46
|
+
result.wait_until_done! timeout: 60
|
47
|
+
if result.response?
|
48
|
+
p result.response
|
49
|
+
else
|
50
|
+
puts "Error!"
|
51
|
+
end
|
52
|
+
<%- when :paged -%>
|
53
|
+
# The returned object is of type Gapic::PagedEnumerable. You can
|
54
|
+
# iterate over all elements by calling #each, and the enumerable
|
55
|
+
# will lazily make API calls to fetch subsequent pages. Other
|
56
|
+
# methods are also available for managing paging directly.
|
57
|
+
result.each do |response|
|
58
|
+
# Each element is of type <%= snippet.paged_response_type %>.
|
59
|
+
p response
|
60
|
+
end
|
61
|
+
<%- when :streaming -%>
|
62
|
+
# The returned object is a streamed enumerable yielding elements of
|
63
|
+
# type <%= snippet.base_response_type %>.
|
64
|
+
result.each do |response|
|
65
|
+
p response
|
66
|
+
end
|
67
|
+
<%- else -%>
|
68
|
+
# The returned object is of type <%= snippet.return_type %>.
|
69
|
+
p result
|
70
|
+
<%- end -%>
|
71
|
+
<%- end -%>
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: gapic-generator
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.8.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ernest Landrito
|
@@ -10,7 +10,7 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date: 2021-
|
13
|
+
date: 2021-06-16 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: actionpack
|
@@ -222,6 +222,7 @@ files:
|
|
222
222
|
- lib/gapic/presenters/sample_presenter.rb
|
223
223
|
- lib/gapic/presenters/service_presenter.rb
|
224
224
|
- lib/gapic/presenters/service_rest_presenter.rb
|
225
|
+
- lib/gapic/presenters/snippet_presenter.rb
|
225
226
|
- lib/gapic/resource_lookup.rb
|
226
227
|
- lib/gapic/ruby_info.rb
|
227
228
|
- lib/gapic/runner.rb
|
@@ -333,6 +334,11 @@ files:
|
|
333
334
|
- templates/default/service/rest/grpc_transcoding/_grpc_transcoding.erb
|
334
335
|
- templates/default/service/rest/grpc_transcoding/method/_def.erb
|
335
336
|
- templates/default/service/rest/grpc_transcoding/method/def/_query_string_param.erb
|
337
|
+
- templates/default/service/rest/test/client.erb
|
338
|
+
- templates/default/service/rest/test/method/_assert_response.erb
|
339
|
+
- templates/default/service/rest/test/method/_configure.erb
|
340
|
+
- templates/default/service/rest/test/method/_normal.erb
|
341
|
+
- templates/default/service/rest/test/method/_setup.erb
|
336
342
|
- templates/default/service/test/_resource.erb
|
337
343
|
- templates/default/service/test/client.erb
|
338
344
|
- templates/default/service/test/client_operations.erb
|
@@ -348,6 +354,9 @@ files:
|
|
348
354
|
- templates/default/shared/_header.erb
|
349
355
|
- templates/default/shared/_license.erb
|
350
356
|
- templates/default/shared/_warning.erb
|
357
|
+
- templates/default/snippets/gemfile.erb
|
358
|
+
- templates/default/snippets/snippet/_structure.erb
|
359
|
+
- templates/default/snippets/standalone.erb
|
351
360
|
homepage: https://github.com/googleapis/gapic-generator-ruby
|
352
361
|
licenses:
|
353
362
|
- Apache-2.0
|