gapic-generator 0.7.2 → 0.7.4

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 (35) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +14 -0
  3. data/lib/gapic/generator/version.rb +1 -1
  4. data/lib/gapic/generators/default_generator.rb +8 -5
  5. data/lib/gapic/generators/default_generator_parameters.rb +8 -4
  6. data/lib/gapic/presenters.rb +2 -0
  7. data/lib/gapic/presenters/field_presenter.rb +44 -0
  8. data/lib/gapic/presenters/gem_presenter.rb +4 -1
  9. data/lib/gapic/presenters/method_presenter.rb +32 -16
  10. data/lib/gapic/presenters/method_rest_presenter.rb +186 -0
  11. data/lib/gapic/presenters/package_presenter.rb +18 -0
  12. data/lib/gapic/presenters/service_presenter.rb +42 -4
  13. data/lib/gapic/presenters/service_rest_presenter.rb +157 -0
  14. data/lib/gapic/schema/api.rb +44 -16
  15. data/lib/gapic/schema/request_param_parser.rb +44 -10
  16. data/templates/default/lib/_package.erb +11 -1
  17. data/templates/default/lib/_service.erb +31 -1
  18. data/templates/default/lib/rest/_rest.erb +11 -0
  19. data/templates/default/service/rest.erb +6 -0
  20. data/templates/default/service/rest/client.erb +6 -0
  21. data/templates/default/service/rest/client/_client.erb +115 -0
  22. data/templates/default/service/rest/client/_config.erb +74 -0
  23. data/templates/default/service/rest/client/_requires.erb +1 -0
  24. data/templates/default/service/rest/client/method/_def.erb +18 -0
  25. data/templates/default/service/rest/client/method/def/_options_defaults.erb +14 -0
  26. data/templates/default/service/rest/client/method/def/_rescue.erb +3 -0
  27. data/templates/default/service/rest/client/method/def/_response_normal.erb +17 -0
  28. data/templates/default/service/rest/client/method/docs/_error.erb +2 -0
  29. data/templates/default/service/rest/client/method/docs/_request.erb +27 -0
  30. data/templates/default/service/rest/client/method/docs/_result.erb +6 -0
  31. data/templates/default/service/rest/grpc_transcoding.erb +6 -0
  32. data/templates/default/service/rest/grpc_transcoding/_grpc_transcoding.erb +9 -0
  33. data/templates/default/service/rest/grpc_transcoding/method/_def.erb +21 -0
  34. data/templates/default/service/rest/grpc_transcoding/method/def/_query_string_param.erb +8 -0
  35. metadata +22 -3
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: b183bf887e0c6df34d3374b75524ff8b1d4fc55cad3d54951de36fa3a9c58072
4
- data.tar.gz: 1026bc4ec2ec151a363ce30ff75d7b37324d1f438ef44746ceaede0b482a1901
3
+ metadata.gz: 521fdaba6a16a4e80df5aff2ea8c8de3d1edbd8800faae175f0b906f3990b369
4
+ data.tar.gz: 013d293b84fc4bd68ef5ca12ff7bb5e375889b90df6f4ec58f10a7f995329ac3
5
5
  SHA512:
6
- metadata.gz: 8451fc41ccc52620ed922d0e75c734f824f6f7c411402697332083554598e4add7c65dbd1edd6b1d6692b11b04aceb216f23bb3de96ebc0730334be8433dbeac
7
- data.tar.gz: 46cc19f65b3f4c6de7ceda0af826828a94ab635ad673d94cc4df5a13c17f0055b43f4b62ff6e3ac0cc22c6f22edce88e88129e5368bf26c87b6fa189017dac4d
6
+ metadata.gz: f59f4c117eb0fccd24a79cfb34c3995e6bbaa1dfa242b10673551cb5a73cc2feaebc09ff735e1411846a1fb42560a3094d8475d016966eb30c143a47efab9d6e
7
+ data.tar.gz: 6b46bba4dc50049901472aa123b7292f47495607d84b94f2c819703bdd82c0d5e61b3f9d073ac33380314d63e16bf20d135f13e35c05fdbb24d22020efb28c98
data/CHANGELOG.md CHANGED
@@ -1,5 +1,19 @@
1
1
  # Release History for gapic-generator
2
2
 
3
+ ### 0.7.4 / 2021-05-07
4
+
5
+ * Fixed the broken link in the generated libraries' README.md
6
+ * Generated libraries with REST transport now use presense testing instead of rejecting defaults to determine which fields to transcode into the query string parameters
7
+
8
+ ### 0.7.3 / 2021-03-24
9
+
10
+ * Fixed gapic metadata (drift manifest) generation
11
+ * Gapic metadata generation is disabled by default in gapic-generator
12
+ (enabled by default in gapic-generator-cloud)
13
+ * Can now generate libraries with REST transport in addition to GRPC
14
+ * gapic-common 0.4 is the default version for the generated libraries now (was 0.3)
15
+ (required for the generated libraries with the REST transport)
16
+
3
17
  ### 0.7.2 / 2021-03-05
4
18
 
5
19
  * No changes.
@@ -16,6 +16,6 @@
16
16
 
17
17
  module Gapic
18
18
  module Generator
19
- VERSION = "0.7.2"
19
+ VERSION = "0.7.4"
20
20
  end
21
21
  end
@@ -54,13 +54,16 @@ module Gapic
54
54
  package.services.each do |service|
55
55
  # Service level files
56
56
  files << g("service.erb", "lib/#{service.service_file_path}", service: service)
57
- files << g("service/client.erb", "lib/#{service.client_file_path}", service: service)
57
+ files << g("service/rest.erb", "lib/#{service.rest.service_rest_file_path}", service: service) if @api.generate_rest_clients? and service.methods_rest_bindings?
58
+ files << g("service/client.erb", "lib/#{service.client_file_path}", service: service) unless @api.generate_rest_clients?
58
59
  files << g("service/credentials.erb", "lib/#{service.credentials_file_path}", service: service) unless gem.generic_endpoint?
59
60
  files << g("service/paths.erb", "lib/#{service.paths_file_path}", service: service) if service.paths?
60
- files << g("service/operations.erb", "lib/#{service.operations_file_path}", service: service) if service.lro?
61
- files << g("service/test/client.erb", "test/#{service.test_client_file_path}", service: service)
61
+ files << g("service/operations.erb", "lib/#{service.operations_file_path}", service: service) if service.lro? && !@api.generate_rest_clients?
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
+ 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/test/client.erb", "test/#{service.test_client_file_path}", service: service) unless @api.generate_rest_clients?
62
65
  files << g("service/test/client_paths.erb", "test/#{service.test_paths_file_path}", service: service) if service.paths?
63
- files << g("service/test/client_operations.erb", "test/#{service.test_client_operations_file_path}", service: service) if service.lro?
66
+ files << g("service/test/client_operations.erb", "test/#{service.test_client_operations_file_path}", service: service) if service.lro? && !@api.generate_rest_clients?
64
67
  end
65
68
  end
66
69
 
@@ -77,7 +80,7 @@ module Gapic
77
80
  files << g("gem/yardopts.erb", ".yardopts", gem: gem)
78
81
  files << g("gem/license.erb", "LICENSE.md", gem: gem)
79
82
  files << g("gem/entrypoint.erb", "lib/#{gem.name}.rb", gem: gem)
80
- files << g("gem/gapic_metadata_json.erb", "gapic_metadata.json", gem: gem)
83
+ files << g("gem/gapic_metadata_json.erb", "gapic_metadata.json", gem: gem) if @api.generate_metadata
81
84
 
82
85
  gem.proto_files.each do |proto_file|
83
86
  files << g("proto_docs/proto_file.erb", "proto_docs/#{proto_file.docs_file_path}", file: proto_file)
@@ -23,7 +23,8 @@ module Gapic
23
23
  BOOL_PARAMETERS = [
24
24
  ":gem.:free_tier",
25
25
  ":gem.:yard_strict",
26
- ":gem.:generic_endpoint"
26
+ ":gem.:generic_endpoint",
27
+ ":generate_metadata"
27
28
  ].freeze
28
29
 
29
30
  STRING_PARAMETERS = [
@@ -42,11 +43,13 @@ module Gapic
42
43
  ":gem.:api_shortname",
43
44
  ":gem.:factory_method_suffix",
44
45
  ":defaults.:service.:default_host",
45
- "grpc_service_config"
46
+ "grpc_service_config",
47
+ ":overrides.:wrapper_gem_name"
46
48
  ].freeze
47
49
 
48
50
  ARRAY_PARAMETERS = [
49
- ":defaults.:service.:oauth_scopes"
51
+ ":defaults.:service.:oauth_scopes",
52
+ ":transports"
50
53
  ].freeze
51
54
 
52
55
  MAP_PARAMETERS = [
@@ -83,7 +86,8 @@ module Gapic
83
86
  }.freeze
84
87
 
85
88
  ARRAY_PARAMETERS_ALIASES = {
86
- "default-oauth-scopes" => ":defaults.:service.:oauth_scopes"
89
+ "default-oauth-scopes" => ":defaults.:service.:oauth_scopes",
90
+ "transports" => ":transports"
87
91
  }.freeze
88
92
 
89
93
  MAP_PARAMETERS_ALIASES = {
@@ -21,10 +21,12 @@ require "gapic/presenters/file_presenter"
21
21
  require "gapic/presenters/gem_presenter"
22
22
  require "gapic/presenters/message_presenter"
23
23
  require "gapic/presenters/method_presenter"
24
+ require "gapic/presenters/method_rest_presenter"
24
25
  require "gapic/presenters/package_presenter"
25
26
  require "gapic/presenters/resource_presenter"
26
27
  require "gapic/presenters/sample_presenter"
27
28
  require "gapic/presenters/service_presenter"
29
+ require "gapic/presenters/service_rest_presenter"
28
30
 
29
31
  module Gapic
30
32
  ##
@@ -88,6 +88,10 @@ module Gapic
88
88
  @field.repeated?
89
89
  end
90
90
 
91
+ def required?
92
+ @field.required?
93
+ end
94
+
91
95
  def map?
92
96
  @field.map?
93
97
  end
@@ -100,6 +104,34 @@ module Gapic
100
104
  @message.oneof_decl[@field.oneof_index].name
101
105
  end
102
106
 
107
+ ##
108
+ # Returns a stringified default value for the protobuf types
109
+ # that are possible to fit into the query string parameter
110
+ # and nil for the other types (e.g. Messages)
111
+ #
112
+ # @return [String, nil]
113
+ #
114
+ def default_value_for_type
115
+ if @field.message?
116
+ nil
117
+ elsif @field.enum?
118
+ ":#{@field.enum.values.first.name}"
119
+ else
120
+ case @field.type
121
+ when 1, 2, 3, 4, 5, 6, 7, 13, 15, 16, 17, 18 then "0" # floating point or integer
122
+ when 9, 12 then "\"\""
123
+ when 8 then "false"
124
+ end
125
+ end
126
+ end
127
+
128
+ ##
129
+ # Name of this field, camel-cased
130
+ # @return [String]
131
+ def camel_name
132
+ camel_name_for name
133
+ end
134
+
103
135
  protected
104
136
 
105
137
  def field_doc_types field, output
@@ -161,6 +193,18 @@ module Gapic
161
193
  def message_ruby_type message
162
194
  ruby_namespace @api, message.address.join(".")
163
195
  end
196
+
197
+ ##
198
+ # Converts a snake_case parameter name into camelCase for query string parameters
199
+ # @param attr_name [String]
200
+ # @return [String] camel-cased parameter name
201
+ def camel_name_for attr_name
202
+ parts = attr_name.split "_"
203
+ first_part = parts[0]
204
+ other_parts = parts[1..-1]
205
+ other_parts_pascal = other_parts.map(&:capitalize).join
206
+ "#{first_part}#{other_parts_pascal}"
207
+ end
164
208
  end
165
209
  end
166
210
  end
@@ -32,6 +32,9 @@ module Gapic
32
32
  @api = api
33
33
  end
34
34
 
35
+ ##
36
+ # @return [Enumerable<Gapic::Presenters::PackagePresenter>]
37
+ #
35
38
  def packages
36
39
  @packages ||= begin
37
40
  packages = @api.generate_files.map(&:package).uniq.sort
@@ -180,7 +183,7 @@ module Gapic
180
183
  end
181
184
 
182
185
  def dependencies
183
- deps = { "gapic-common" => "~> 0.3" }
186
+ deps = { "gapic-common" => "~> 0.4" }
184
187
  deps["grpc-google-iam-v1"] = [">= 0.6.10", "< 2.0"] if iam_dependency?
185
188
  extra_deps = gem_config :extra_dependencies
186
189
  deps.merge! extra_deps if extra_deps
@@ -15,7 +15,6 @@
15
15
  # limitations under the License.
16
16
 
17
17
  require "active_support/inflector"
18
- require "gapic/uri_template"
19
18
  require "gapic/ruby_info"
20
19
  require "gapic/helpers/namespace_helper"
21
20
 
@@ -27,12 +26,26 @@ module Gapic
27
26
  class MethodPresenter
28
27
  include Gapic::Helpers::NamespaceHelper
29
28
 
29
+ # @return [Gapic::Schema::Method]
30
+ attr_accessor :method
31
+
32
+ # @return [Gapic::Presenters::MethodRestPresenter]
33
+ attr_accessor :rest
34
+
35
+ ##
36
+ # @param service_presenter [Gapic::Presenters::ServicePresenter]
37
+ # @param api [Gapic::Schema::Api]
38
+ # @param method [Gapic::Schema::Method]
30
39
  def initialize service_presenter, api, method
31
40
  @service_presenter = service_presenter
32
41
  @api = api
33
42
  @method = method
43
+ @rest = MethodRestPresenter.new self
34
44
  end
35
45
 
46
+ ##
47
+ # @return [Gapic::Presenters::ServicePresenter]
48
+ #
36
49
  def service
37
50
  @service_presenter
38
51
  end
@@ -195,15 +208,17 @@ module Gapic
195
208
  end
196
209
 
197
210
  ##
198
- #
199
211
  # @return [Array<String>] The segment key names.
200
212
  #
201
213
  def routing_params
202
- Gapic::UriTemplate.parse_arguments method_path
214
+ rest.routing_params
203
215
  end
204
216
 
217
+ ##
218
+ # @return [Boolean] Whether any routing params are present
219
+ #
205
220
  def routing_params?
206
- routing_params.any?
221
+ rest.routing_params?
207
222
  end
208
223
 
209
224
  def grpc_service_config
@@ -217,6 +232,19 @@ module Gapic
217
232
  @method.name
218
233
  end
219
234
 
235
+ ##
236
+ # Returns a hash with a drift_manifest of this rpc method
237
+ # describing correspondence between the proto description
238
+ # of the rpc with the generated code for the method.
239
+ # For ruby currently [03/2021] only one method is generated per RPC,
240
+ # so the correspondence is very basic.
241
+ # See https://github.com/googleapis/googleapis/blob/master/gapic/metadata/gapic_metadata.proto
242
+ #
243
+ # @return [Hash]
244
+ def drift_manifest
245
+ { methods: [name] }
246
+ end
247
+
220
248
  protected
221
249
 
222
250
  def message_ruby_type message
@@ -266,18 +294,6 @@ module Gapic
266
294
  end
267
295
  end
268
296
 
269
- def method_path
270
- return "" if @method.http.nil?
271
-
272
- method = [
273
- @method.http.get, @method.http.post, @method.http.put,
274
- @method.http.patch, @method.http.delete
275
- ].find { |x| !x.empty? }
276
- return method unless method.nil?
277
-
278
- return @method.http.custom.path unless @method.http.custom.nil?
279
- end
280
-
281
297
  def paged_request? request
282
298
  page_token = request.fields.find do |f|
283
299
  f.name == "page_token" && f.type == Google::Protobuf::FieldDescriptorProto::Type::TYPE_STRING
@@ -0,0 +1,186 @@
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 "gapic/uri_template"
18
+
19
+ module Gapic
20
+ module Presenters
21
+ ##
22
+ # A presenter for rpc methods (REST submethods)
23
+ #
24
+ class MethodRestPresenter
25
+ def initialize main_method
26
+ @main_method = main_method
27
+ @proto_method = main_method.method
28
+ end
29
+
30
+ ##
31
+ # @return [Boolean] Whether a http verb is present for this method
32
+ #
33
+ def verb?
34
+ !verb.nil?
35
+ end
36
+
37
+ ##
38
+ # @return [Symbol] a http verb for this method
39
+ #
40
+ def verb
41
+ return nil if @proto_method.http.nil?
42
+
43
+ method = {
44
+ get: @proto_method.http.get,
45
+ post: @proto_method.http.post,
46
+ put: @proto_method.http.put,
47
+ patch: @proto_method.http.patch,
48
+ delete: @proto_method.http.delete
49
+ }.find { |_, value| !value.empty? }
50
+
51
+ method[0] unless method.nil?
52
+ end
53
+
54
+ ##
55
+ # @return [Boolean] Whether a method path is present and non-empty
56
+ #
57
+ def path?
58
+ !path.empty?
59
+ end
60
+
61
+ ##
62
+ # @return [String] A method path or an empty string if not present
63
+ #
64
+ def path
65
+ return "" if @proto_method.http.nil?
66
+
67
+ verb_path = [
68
+ @proto_method.http.get, @proto_method.http.post, @proto_method.http.put,
69
+ @proto_method.http.patch, @proto_method.http.delete
70
+ ].find { |x| !x.empty? }
71
+
72
+ verb_path || @proto_method.http.custom&.path || ""
73
+ end
74
+
75
+ ##
76
+ # @return [Boolean] Whether any routing params are present
77
+ #
78
+ def routing_params?
79
+ routing_params.any?
80
+ end
81
+
82
+ ##
83
+ # @return [Array<String>] The segment key names.
84
+ #
85
+ def routing_params
86
+ Gapic::UriTemplate.parse_arguments path
87
+ end
88
+
89
+ ##
90
+ # Performs a limited version of grpc transcoding to create a string that will interpolate
91
+ # the values from the request object to create a request URI at runtime.
92
+ # Currently only supports "value" into "request_object.value"
93
+ # @param [String] request_obj_name the name of the request object for the interpolation
94
+ # defaults to "request_pb"
95
+ # @return [String] A string to interpolate values from the request object into URI
96
+ #
97
+ def uri_interpolated request_obj_name = "request_pb"
98
+ return path unless routing_params?
99
+
100
+ routing_params.reduce path do |uri, param|
101
+ param_esc = Regexp.escape param
102
+ uri.gsub(/{#{param_esc}[^}]*}/, "\#{#{request_obj_name}.#{param}}")
103
+ end
104
+ end
105
+
106
+ ##
107
+ # @return [Boolean] Whether method has body specified in proto
108
+ #
109
+ def body?
110
+ return false if @proto_method.http.nil?
111
+
112
+ !@proto_method.http.body.empty?
113
+ end
114
+
115
+ ##
116
+ # Name of the variable to use for storing the body result of the transcoding call
117
+ # Normally "body" but use "_body" for discarding the result for
118
+ # the calls that do not send body
119
+ # @return [String]
120
+ def body_var_name
121
+ body? ? "body" : "_body"
122
+ end
123
+
124
+ ##
125
+ # @return [String] A body specified for the given method in proto or an empty string if not specified
126
+ #
127
+ def body
128
+ @proto_method.http&.body || ""
129
+ end
130
+
131
+ ##
132
+ # Performs a limited version of grpc transcoding to create a string that will interpolate
133
+ # the values from the request object to create a request body at runtime.
134
+ # Currently only supports either "*" for "the whole request object" or
135
+ # "value" for "request_object.value"
136
+ #
137
+ # @param [String] request_obj_name the name of the request object for the interpolation
138
+ # defaults to "request_pb"
139
+ #
140
+ # @return [String] A string to interpolate values from the request object into body
141
+ #
142
+ def body_interpolated request_obj_name = "request_pb"
143
+ return "\"\"" unless body?
144
+
145
+ return "#{request_obj_name}.to_json" if body == "*"
146
+
147
+ "#{request_obj_name}.#{body}.to_json"
148
+ end
149
+
150
+ ##
151
+ # @return [Boolean] whether any query string parameters are present
152
+ #
153
+ def query_string_params?
154
+ query_string_params.any?
155
+ end
156
+
157
+ # @return [Array<String>]
158
+ def query_string_params
159
+ return [] if body?
160
+
161
+ routing_params_set = routing_params.to_set
162
+ @main_method.arguments
163
+ .reject { |arg| routing_params_set.include? arg.name }
164
+ .reject(&:message?)
165
+ .reject { |arg| arg.default_value_for_type.nil? }
166
+ end
167
+
168
+ ##
169
+ # Name of the variable to use for storing the query_string_params result of the transcoding call
170
+ # Normally "query_string_params" but use "_query_string_params" for discarding the result for
171
+ # the calls that do not sent query_string_params
172
+ # @return [String]
173
+ def query_string_params_var_name
174
+ query_string_params? ? "query_string_params" : "_query_string_params"
175
+ end
176
+
177
+ ##
178
+ # Name for the GRPC transcoding helper method
179
+ #
180
+ # @return [String]
181
+ def transcoding_helper_name
182
+ "transcode_#{@main_method.name}"
183
+ end
184
+ end
185
+ end
186
+ end