gapic-generator 0.10.1 → 0.45.1

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 (257) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +333 -0
  3. data/CONTRIBUTING.md +1 -1
  4. data/README.md +71 -37
  5. data/bin/protoc-gen-ruby_gapic +2 -2
  6. data/lib/gapic/file_formatter.rb +23 -19
  7. data/lib/gapic/formatting_utils.rb +22 -9
  8. data/lib/gapic/gem_builder.rb +15 -17
  9. data/lib/gapic/generator/version.rb +1 -1
  10. data/lib/gapic/generators/base_generator.rb +6 -4
  11. data/lib/gapic/generators/default_generator.rb +70 -32
  12. data/lib/gapic/generators/default_generator_parameters.rb +11 -3
  13. data/lib/gapic/grpc_service_config/{service_config.rb → config.rb} +2 -2
  14. data/lib/gapic/grpc_service_config/parser.rb +10 -10
  15. data/lib/gapic/model/api_metadata.rb +173 -0
  16. data/lib/gapic/model/method/http_annotation.rb +221 -0
  17. data/lib/gapic/model/method/lro.rb +163 -0
  18. data/lib/gapic/model/method/routing.rb +248 -0
  19. data/lib/gapic/model/mixins.rb +247 -0
  20. data/lib/gapic/model/model_error.rb +26 -0
  21. data/lib/gapic/model/service/nonstandard_lro_provider.rb +292 -0
  22. data/lib/gapic/model.rb +22 -0
  23. data/lib/gapic/package_snippets.rb +159 -0
  24. data/lib/gapic/path_pattern/parser.rb +11 -2
  25. data/lib/gapic/path_pattern/pattern.rb +64 -1
  26. data/lib/gapic/path_pattern/segment.rb +108 -13
  27. data/lib/gapic/presenters/enum_presenter.rb +14 -0
  28. data/lib/gapic/presenters/enum_value_presenter.rb +4 -1
  29. data/lib/gapic/presenters/field_presenter.rb +78 -21
  30. data/lib/gapic/presenters/gem_presenter.rb +140 -34
  31. data/lib/gapic/presenters/{service_config_presenter.rb → grpc_service_config_presenter.rb} +1 -1
  32. data/lib/gapic/presenters/message_presenter.rb +15 -0
  33. data/lib/gapic/presenters/method/http_binding_presenter.rb +128 -0
  34. data/lib/gapic/presenters/method/rest_pagination_info.rb +25 -16
  35. data/lib/gapic/presenters/method_presenter.rb +149 -35
  36. data/lib/gapic/presenters/method_rest_presenter.rb +79 -168
  37. data/lib/gapic/presenters/package_presenter.rb +63 -18
  38. data/lib/gapic/presenters/resource_presenter.rb +9 -3
  39. data/lib/gapic/presenters/service/lro_client_presenter.rb +90 -0
  40. data/lib/gapic/presenters/service/mixin_client_presenter.rb +89 -0
  41. data/lib/gapic/presenters/service/sub_client_presenter.rb +84 -0
  42. data/lib/gapic/presenters/service_presenter.rb +361 -27
  43. data/lib/gapic/presenters/service_rest_presenter.rb +247 -13
  44. data/lib/gapic/presenters/snippet/client_call_presenter.rb +82 -0
  45. data/lib/gapic/presenters/snippet/client_initialization_presenter.rb +87 -0
  46. data/lib/gapic/presenters/snippet/declaration_presenter.rb +91 -0
  47. data/lib/gapic/presenters/snippet/expression_presenter.rb +135 -0
  48. data/lib/gapic/presenters/snippet/iteration_presenter.rb +118 -0
  49. data/lib/gapic/presenters/snippet/parameter_presenter.rb +67 -0
  50. data/lib/gapic/presenters/snippet/request_initialization_presenters.rb +202 -0
  51. data/lib/gapic/presenters/snippet/response_handling_presenters.rb +329 -0
  52. data/lib/gapic/presenters/snippet/statement_presenter.rb +134 -0
  53. data/lib/gapic/presenters/snippet/type_presenter.rb +98 -0
  54. data/lib/gapic/presenters/snippet_presenter.rb +199 -9
  55. data/lib/gapic/presenters.rb +5 -1
  56. data/lib/gapic/runner.rb +1 -1
  57. data/lib/gapic/schema/api.rb +105 -5
  58. data/lib/gapic/schema/loader.rb +69 -21
  59. data/lib/gapic/schema/parameter_schema.rb +8 -8
  60. data/lib/gapic/schema/proto_tools.rb +193 -0
  61. data/lib/gapic/schema/request_param_parser.rb +5 -7
  62. data/lib/gapic/schema/service_config_parser.rb +152 -0
  63. data/lib/gapic/schema/wrappers.rb +309 -25
  64. data/lib/gapic/uri_template/parser.rb +15 -7
  65. data/lib/google/cloud/tools/snippetgen/configlanguage/v1/snippet_config_language_pb.rb +104 -0
  66. data/lib/google/cloud/tools/snippetgen/snippetindex/v1/snippet_index_pb.rb +58 -0
  67. data/lib/google/protobuf/compiler/plugin_pb.rb +47 -0
  68. data/templates/default/binding_override.text.erb +6 -0
  69. data/templates/default/gem/gemfile.text.erb +12 -0
  70. data/templates/default/gem/{gemspec.erb → gemspec.text.erb} +3 -11
  71. data/templates/default/gem/{readme.erb → readme.text.erb} +10 -6
  72. data/templates/default/gem/{rubocop.erb → rubocop.text.erb} +3 -0
  73. data/templates/default/gem/{test_helper.erb → test_helper.text.erb} +4 -2
  74. data/templates/default/gem/toys.text.erb +12 -0
  75. data/templates/default/gem/{yardopts.erb → yardopts.text.erb} +1 -1
  76. data/templates/default/helpers/default_helper.rb +33 -1
  77. data/templates/default/lib/_binding_override.text.erb +49 -0
  78. data/templates/default/lib/{_package.erb → _package.text.erb} +7 -6
  79. data/templates/default/lib/_package_rest.text.erb +24 -0
  80. data/templates/default/lib/{_service.erb → _service.text.erb} +14 -20
  81. data/templates/default/lib/package/_self_configure.text.erb +16 -0
  82. data/templates/default/lib/package/_self_configure_defaults.text.erb +13 -0
  83. data/templates/default/lib/package/self_configure/_binding_default.text.erb +15 -0
  84. data/templates/default/lib/rest/_rest.text.erb +46 -0
  85. data/templates/default/package_rest.text.erb +6 -0
  86. data/templates/default/proto_docs/_deprecated.text.erb +9 -0
  87. data/templates/default/proto_docs/{_enum.erb → _enum.text.erb} +1 -0
  88. data/templates/default/proto_docs/{_message.erb → _message.text.erb} +2 -0
  89. data/templates/default/service/client/{_client.erb → _client.text.erb} +77 -17
  90. data/templates/default/service/client/{_config.erb → _config.text.erb} +39 -8
  91. data/templates/default/service/client/_nonstandard_lro.text.erb +57 -0
  92. data/templates/default/service/client/{_operations.erb → _operations.text.erb} +24 -3
  93. data/templates/default/service/client/{_self_configure_defaults.erb → _self_configure_defaults.text.erb} +2 -2
  94. data/templates/default/service/client/method/{_def.erb → _def.text.erb} +2 -2
  95. data/templates/default/service/client/method/def/{_options_defaults.erb → _options_defaults.text.erb} +3 -9
  96. data/templates/default/service/client/method/def/_request_normal.text.erb +18 -0
  97. data/templates/default/service/client/method/def/_request_streaming.text.erb +23 -0
  98. data/templates/default/service/client/method/def/_response.text.erb +10 -0
  99. data/templates/default/service/client/method/def/_response_nonstandard_lro.text.erb +23 -0
  100. data/templates/default/service/client/method/def/_response_normal.text.erb +4 -0
  101. data/templates/default/service/client/method/def/{_response_normal.erb → _response_normal_lro.text.erb} +1 -3
  102. data/templates/default/service/client/method/def/{_response_paged.erb → _response_paged.text.erb} +1 -1
  103. data/templates/default/service/client/method/def/_routing_params.text.erb +36 -0
  104. data/templates/default/service/client/method/docs/{_request_normal.erb → _request_normal.text.erb} +1 -1
  105. data/templates/default/service/client/method/docs/_snippets.text.erb +6 -0
  106. data/templates/default/service/client/resource/_def.text.erb +7 -0
  107. data/templates/default/service/nonstandard_lro.text.erb +6 -0
  108. data/templates/default/service/rest/client/_client.text.erb +202 -0
  109. data/templates/default/service/rest/client/_config.text.erb +178 -0
  110. data/templates/default/service/rest/client/_operations.text.erb +124 -0
  111. data/templates/default/service/rest/client/method/{_def.erb → _def.text.erb} +7 -1
  112. data/templates/default/service/rest/client/method/def/{_options_defaults.erb → _options_defaults.text.erb} +8 -3
  113. data/templates/default/service/rest/client/method/def/_response.text.erb +12 -0
  114. data/templates/default/service/rest/client/method/def/_response_nonstandard_lro.text.erb +24 -0
  115. data/templates/default/service/rest/client/method/def/_response_normal.text.erb +5 -0
  116. data/templates/default/service/rest/client/method/def/_response_normal_lro.text.erb +7 -0
  117. data/templates/default/service/rest/client/method/def/_response_paged.text.erb +7 -0
  118. data/templates/default/service/rest/client/method/def/_response_server_streaming.text.erb +11 -0
  119. data/templates/default/service/rest/client/method/docs/{_request.erb → _request.text.erb} +1 -3
  120. data/templates/default/service/rest/client/method/docs/_result.text.erb +10 -0
  121. data/templates/default/service/rest/client/method/docs/_snippets.text.erb +6 -0
  122. data/templates/default/service/rest/nonstandard_lro.text.erb +6 -0
  123. data/templates/default/service/rest/operations.text.erb +6 -0
  124. data/templates/default/service/rest/service_stub/_service_stub.text.erb +63 -0
  125. data/templates/default/service/rest/service_stub/grpc_transcoding_method/_def.text.erb +37 -0
  126. data/templates/default/service/rest/service_stub/method/_def.text.erb +35 -0
  127. data/templates/default/service/rest/service_stub/method/def/_response.text.erb +37 -0
  128. data/templates/default/service/rest/test/{client.erb → client.text.erb} +3 -3
  129. data/templates/default/service/rest/test/method/_assert_response.text.erb +2 -0
  130. data/templates/default/service/rest/test/method/{_configure.erb → _configure.text.erb} +3 -2
  131. data/templates/default/service/rest/test/method/_normal.text.erb +60 -0
  132. data/templates/default/service/rest/test/method/_server.text.erb +60 -0
  133. data/templates/default/service/rest/test/method/{_setup.erb → _setup.text.erb} +26 -10
  134. data/templates/default/service/test/{_resource.erb → _resource.text.erb} +1 -1
  135. data/templates/default/service/test/{client.erb → client.text.erb} +3 -2
  136. data/templates/default/service/test/client_paths.text.erb +33 -0
  137. data/templates/default/service/test/method/{_assert_response.erb → _assert_response.text.erb} +3 -0
  138. data/templates/default/service/test/method/{_bidi.erb → _bidi.text.erb} +1 -1
  139. data/templates/default/service/test/method/{_client.erb → _client.text.erb} +1 -1
  140. data/templates/default/service/test/method/{_configure.erb → _configure.text.erb} +2 -1
  141. data/templates/default/service/test/method/{_normal.erb → _normal.text.erb} +1 -1
  142. data/templates/default/service/test/method/{_server.erb → _server.text.erb} +1 -1
  143. data/templates/default/service/test/method/{_setup.erb → _setup.text.erb} +19 -2
  144. data/templates/default/snippets/{gemfile.erb → gemfile.text.erb} +2 -2
  145. data/templates/default/snippets/snippet/_body.text.erb +24 -0
  146. data/templates/default/snippets/snippet/_inline.text.erb +11 -0
  147. data/templates/default/snippets/snippet/_standalone.text.erb +25 -0
  148. data/templates/default/snippets/{standalone.erb → standalone.text.erb} +1 -1
  149. metadata +209 -230
  150. data/lib/google/api/annotations.pb.rb +0 -39
  151. data/lib/google/api/client.pb.rb +0 -43
  152. data/lib/google/api/field_behavior.pb.rb +0 -51
  153. data/lib/google/api/http.pb.rb +0 -60
  154. data/lib/google/api/resource.pb.rb +0 -80
  155. data/lib/google/longrunning/operations.pb.rb +0 -115
  156. data/lib/google/protobuf/any.pb.rb +0 -40
  157. data/lib/google/protobuf/compiler/plugin.pb.rb +0 -79
  158. data/lib/google/protobuf/descriptor.pb.rb +0 -360
  159. data/lib/google/protobuf/empty.pb.rb +0 -36
  160. data/lib/google/rpc/status.pb.rb +0 -46
  161. data/templates/default/gem/gemfile.erb +0 -4
  162. data/templates/default/lib/rest/_rest.erb +0 -9
  163. data/templates/default/service/client/method/def/_request_normal.erb +0 -4
  164. data/templates/default/service/client/method/def/_request_streaming.erb +0 -9
  165. data/templates/default/service/client/method/def/_response.erb +0 -6
  166. data/templates/default/service/client/method/docs/_deprecated.erb +0 -5
  167. data/templates/default/service/client/method/docs/_snippets.erb +0 -6
  168. data/templates/default/service/client/resource/_def.erb +0 -6
  169. data/templates/default/service/rest/client/_client.erb +0 -106
  170. data/templates/default/service/rest/client/_config.erb +0 -122
  171. data/templates/default/service/rest/client/method/def/_response.erb +0 -8
  172. data/templates/default/service/rest/client/method/def/_response_lro.erb +0 -7
  173. data/templates/default/service/rest/client/method/def/_response_normal.erb +0 -6
  174. data/templates/default/service/rest/client/method/def/_response_paged.erb +0 -7
  175. data/templates/default/service/rest/client/method/docs/_result.erb +0 -6
  176. data/templates/default/service/rest/service_stub/_service_stub.erb +0 -25
  177. data/templates/default/service/rest/service_stub/grpc_transcoding_method/_def.erb +0 -24
  178. data/templates/default/service/rest/service_stub/method/_def.erb +0 -20
  179. data/templates/default/service/rest/service_stub/method/def/_response.erb +0 -17
  180. data/templates/default/service/rest/test/method/_assert_response.erb +0 -2
  181. data/templates/default/service/rest/test/method/_normal.erb +0 -71
  182. data/templates/default/service/test/client_paths.erb +0 -15
  183. data/templates/default/snippets/snippet/_structure.erb +0 -71
  184. /data/gem_templates/{binary.erb → binary.text.erb} +0 -0
  185. /data/gem_templates/{dockerfile.erb → dockerfile.text.erb} +0 -0
  186. /data/gem_templates/{entrypoint.erb → entrypoint.text.erb} +0 -0
  187. /data/gem_templates/{gapic_sh.erb → gapic_sh.text.erb} +0 -0
  188. /data/gem_templates/{gemfile.erb → gemfile.text.erb} +0 -0
  189. /data/gem_templates/{gemspec.erb → gemspec.text.erb} +0 -0
  190. /data/gem_templates/{generator.erb → generator.text.erb} +0 -0
  191. /data/gem_templates/{gitignore.erb → gitignore.text.erb} +0 -0
  192. /data/gem_templates/{rakefile.erb → rakefile.text.erb} +0 -0
  193. /data/gem_templates/{readme.erb → readme.text.erb} +0 -0
  194. /data/gem_templates/{rubocop.erb → rubocop.text.erb} +0 -0
  195. /data/gem_templates/shared/{_header.erb → _header.text.erb} +0 -0
  196. /data/gem_templates/shared/{_license.erb → _license.text.erb} +0 -0
  197. /data/gem_templates/shared/{_warning.erb → _warning.text.erb} +0 -0
  198. /data/gem_templates/{test_generator.erb → test_generator.text.erb} +0 -0
  199. /data/gem_templates/{test_helper.erb → test_helper.text.erb} +0 -0
  200. /data/gem_templates/{version.erb → version.text.erb} +0 -0
  201. /data/templates/default/gem/{_version.erb → _version.text.erb} +0 -0
  202. /data/templates/default/gem/{changelog.erb → changelog.text.erb} +0 -0
  203. /data/templates/default/gem/{entrypoint.erb → entrypoint.text.erb} +0 -0
  204. /data/templates/default/gem/{gapic_metadata_json.erb → gapic_metadata_json.text.erb} +0 -0
  205. /data/templates/default/gem/{gitignore.erb → gitignore.text.erb} +0 -0
  206. /data/templates/default/gem/{license.erb → license.text.erb} +0 -0
  207. /data/templates/default/gem/{rakefile.erb → rakefile.text.erb} +0 -0
  208. /data/templates/default/gem/{version.erb → version.text.erb} +0 -0
  209. /data/templates/default/layouts/{_ruby.erb → _ruby.text.erb} +0 -0
  210. /data/templates/default/{package.erb → package.text.erb} +0 -0
  211. /data/templates/default/proto_docs/{_proto_file.erb → _proto_file.text.erb} +0 -0
  212. /data/templates/default/proto_docs/{proto_file.erb → proto_file.text.erb} +0 -0
  213. /data/templates/default/proto_docs/{readme.erb → readme.text.erb} +0 -0
  214. /data/templates/default/service/{_helpers.erb → _helpers.text.erb} +0 -0
  215. /data/templates/default/service/client/{_credentials.erb → _credentials.text.erb} +0 -0
  216. /data/templates/default/service/client/{_paths.erb → _paths.text.erb} +0 -0
  217. /data/templates/default/service/client/{_requires.erb → _requires.text.erb} +0 -0
  218. /data/templates/default/service/client/{_resource.erb → _resource.text.erb} +0 -0
  219. /data/templates/default/service/client/{_self_configure.erb → _self_configure.text.erb} +0 -0
  220. /data/templates/default/service/client/method/def/{_request.erb → _request.text.erb} +0 -0
  221. /data/templates/default/service/client/method/def/{_rescue.erb → _rescue.text.erb} +0 -0
  222. /data/templates/default/service/client/method/docs/{_error.erb → _error.text.erb} +0 -0
  223. /data/templates/default/service/client/method/docs/{_request.erb → _request.text.erb} +0 -0
  224. /data/templates/default/service/client/method/docs/{_request_field.erb → _request_field.text.erb} +0 -0
  225. /data/templates/default/service/client/method/docs/{_request_streaming.erb → _request_streaming.text.erb} +0 -0
  226. /data/templates/default/service/client/method/docs/{_response.erb → _response.text.erb} +0 -0
  227. /data/templates/default/service/client/method/docs/{_sample.erb → _sample.text.erb} +0 -0
  228. /data/templates/default/service/client/method/docs/{_sample_response.erb → _sample_response.text.erb} +0 -0
  229. /data/templates/default/service/client/method/docs/{_samples.erb → _samples.text.erb} +0 -0
  230. /data/templates/default/service/client/method/docs/request_field/{_arg.erb → _arg.text.erb} +0 -0
  231. /data/templates/default/service/client/method/docs/request_field/{_hash.erb → _hash.text.erb} +0 -0
  232. /data/templates/default/service/client/method/docs/sample_response/{_comment.erb → _comment.text.erb} +0 -0
  233. /data/templates/default/service/client/method/docs/sample_response/{_define.erb → _define.text.erb} +0 -0
  234. /data/templates/default/service/client/method/docs/sample_response/{_loop.erb → _loop.text.erb} +0 -0
  235. /data/templates/default/service/client/method/docs/sample_response/{_print.erb → _print.text.erb} +0 -0
  236. /data/templates/default/service/client/method/docs/sample_response/{_write_file.erb → _write_file.text.erb} +0 -0
  237. /data/templates/default/service/client/resource/{_doc.erb → _doc.text.erb} +0 -0
  238. /data/templates/default/service/client/resource/{_multi.erb → _multi.text.erb} +0 -0
  239. /data/templates/default/service/client/resource/{_single.erb → _single.text.erb} +0 -0
  240. /data/templates/default/service/{client.erb → client.text.erb} +0 -0
  241. /data/templates/default/service/{credentials.erb → credentials.text.erb} +0 -0
  242. /data/templates/default/service/{operations.erb → operations.text.erb} +0 -0
  243. /data/templates/default/service/{paths.erb → paths.text.erb} +0 -0
  244. /data/templates/default/service/rest/client/method/def/{_rescue.erb → _rescue.text.erb} +0 -0
  245. /data/templates/default/service/rest/client/method/docs/{_error.erb → _error.text.erb} +0 -0
  246. /data/templates/default/service/rest/{client.erb → client.text.erb} +0 -0
  247. /data/templates/default/service/rest/{grpc_transcoding.erb → grpc_transcoding.text.erb} +0 -0
  248. /data/templates/default/service/rest/service_stub/grpc_transcoding_method/def/{_query_string_param.erb → _query_string_param.text.erb} +0 -0
  249. /data/templates/default/service/rest/service_stub/method/def/{_request.erb → _request.text.erb} +0 -0
  250. /data/templates/default/service/rest/{service_stub.erb → service_stub.text.erb} +0 -0
  251. /data/templates/default/service/{rest.erb → rest.text.erb} +0 -0
  252. /data/templates/default/service/test/{client_operations.erb → client_operations.text.erb} +0 -0
  253. /data/templates/default/service/test/{smoke.erb → smoke.text.erb} +0 -0
  254. /data/templates/default/{service.erb → service.text.erb} +0 -0
  255. /data/templates/default/shared/{_header.erb → _header.text.erb} +0 -0
  256. /data/templates/default/shared/{_license.erb → _license.text.erb} +0 -0
  257. /data/templates/default/shared/{_warning.erb → _warning.text.erb} +0 -0
@@ -30,12 +30,23 @@ module Gapic
30
30
  # @return [Gapic::Presenters::ServiceRestPresenter]
31
31
  attr_reader :rest
32
32
 
33
+ # @return [String] String representation of this presenter type.
34
+ attr_reader :type
35
+
36
+ ##
37
+ # @param gem_presenter [Gapic::Presenters::GemPresenter]
38
+ # @param api [Gapic::Schema::Api]
39
+ # @param service [Gapic::Presenters::ServicePresenter]
40
+ # @param parent_service [Gapic::Presenters::ServicePresenter]
41
+ #
33
42
  def initialize gem_presenter, api, service, parent_service: nil
34
43
  @gem_presenter = gem_presenter
35
44
  @api = api
36
45
  @service = service
37
46
  @parent_service = parent_service
38
47
  @rest = ServiceRestPresenter.new self, api
48
+ @nonstandard_lro = api.nonstandard_lro_model_for service.full_name
49
+ @type = "service"
39
50
  end
40
51
 
41
52
  def gem
@@ -50,8 +61,12 @@ module Gapic
50
61
  PackagePresenter.new @gem_presenter, @api, @service.parent.package
51
62
  end
52
63
 
64
+ def special_compute_behavior?
65
+ address[0] == "google" && address[1] == "cloud" && address[2] == "compute" && !address[3].to_s.empty?
66
+ end
67
+
53
68
  ##
54
- # @return [Boolean]
69
+ # @return [Boolean] Whether the service is marked as deprecated.
55
70
  #
56
71
  def is_deprecated?
57
72
  @service.is_deprecated?
@@ -64,6 +79,17 @@ module Gapic
64
79
  @methods ||= @service.methods.map { |m| MethodPresenter.new self, @api, m }
65
80
  end
66
81
 
82
+ ##
83
+ # @return [Boolean] Whether this service autogenerates UUID fields.
84
+ #
85
+ def autogenerates_uuid?
86
+ @methods.any? { |method| method.auto_populated_fields.length.positive? }
87
+ end
88
+
89
+ ##
90
+ # The address of this service split into an array
91
+ #
92
+ # @return [Array<String>]
67
93
  def address
68
94
  @service.address
69
95
  end
@@ -97,8 +123,15 @@ module Gapic
97
123
  ActiveSupport::Inflector.camelize @service.address[-2]
98
124
  end
99
125
 
100
- def doc_description disable_xrefs: false
101
- @service.docs_leading_comments disable_xrefs: disable_xrefs
126
+ ##
127
+ # The description as it should appear in YARD docs.
128
+ #
129
+ # @param transport [:grpc,:rest] Whether xref links should go to REST or
130
+ # gRPC client classes. Uses the default transport if not provided.
131
+ # @return [String]
132
+ #
133
+ def doc_description disable_xrefs: false, transport: nil
134
+ @service.docs_leading_comments disable_xrefs: disable_xrefs, transport: transport
102
135
  end
103
136
 
104
137
  def name
@@ -208,15 +241,36 @@ module Gapic
208
241
  "localhost"
209
242
  end
210
243
 
244
+ ##
245
+ # Returns a template for the endpoint, with the universe domain component
246
+ # of the url replaced with the string `$UNIVERSE_DOMAIN$`.
247
+ #
248
+ # @return [String]
249
+ #
250
+ def client_endpoint_template
251
+ client_endpoint&.sub(/.googleapis.com$/, ".$UNIVERSE_DOMAIN$")
252
+ end
253
+
211
254
  def generic_endpoint?
212
255
  gem.generic_endpoint?
213
256
  end
214
257
 
258
+ # @return [String] The api_version for this service, or empty if not defined.
259
+ def api_version
260
+ @service.api_version.to_s
261
+ end
262
+
215
263
  def client_scopes
216
- common_service_delegate&.client_scopes ||
217
- @service.scopes ||
218
- default_config(:oauth_scopes) ||
219
- []
264
+ scopes = Array(common_service_delegate&.client_scopes)
265
+ return scopes unless scopes.empty?
266
+
267
+ scopes = Array(@service.scopes)
268
+ return scopes unless scopes.empty?
269
+
270
+ scopes = Array(default_config(:oauth_scopes))
271
+ return scopes unless scopes.empty?
272
+
273
+ []
220
274
  end
221
275
 
222
276
  def credentials_name
@@ -311,14 +365,36 @@ module Gapic
311
365
  ruby_file_path @api, "#{service_name_full}::#{paths_name}"
312
366
  end
313
367
 
368
+ ##
369
+ # @return [Boolean] Whether the generation of REST clients is requested
370
+ # and can be done because at least one method has rest bindings.
371
+ #
314
372
  def generate_rest_clients?
315
- @api.generate_rest_clients?
373
+ @api.generate_rest_clients? && methods_rest_bindings?
316
374
  end
317
375
 
376
+ ##
377
+ # @return [Boolean] Whether the generation of gRPC clients is requested
378
+ #
318
379
  def generate_grpc_clients?
319
380
  @api.generate_grpc_clients?
320
381
  end
321
382
 
383
+ ##
384
+ # @return [Boolean]
385
+ #
386
+ def supports_multiple_transports?
387
+ generate_rest_clients? && generate_grpc_clients?
388
+ end
389
+
390
+ def client_suffix_for_default_transport
391
+ if @api.default_transport == :grpc
392
+ "#{module_name}::#{client_name}"
393
+ else
394
+ "#{module_name}::Rest::#{client_name}"
395
+ end
396
+ end
397
+
322
398
  ##
323
399
  # @return [Boolean] whether this service contains any methods with REST bindings
324
400
  #
@@ -328,10 +404,10 @@ module Gapic
328
404
 
329
405
  ##
330
406
  # @return [Enumerable<Gapic::Presenters::MethodPresenter>]
331
- # List of mods for which REST bindings are present and REST methods can be generated
407
+ # List of methods for which REST bindings are present and REST methods can be generated
332
408
  #
333
409
  def methods_rest_bindings
334
- methods.select { |method| method.rest.path? && method.rest.verb? }
410
+ methods.select(&:can_generate_rest?)
335
411
  end
336
412
 
337
413
  def test_client_file_path
@@ -350,18 +426,44 @@ module Gapic
350
426
  "#{ActiveSupport::Inflector.underscore name}_stub"
351
427
  end
352
428
 
429
+ ##
430
+ # Whether an AIP-151 LRO subclient needs to be generated for this service
431
+ #
432
+ # @return [Boolean]
353
433
  def lro?
354
434
  methods.find(&:lro?)
355
435
  end
356
436
 
437
+ ##
438
+ # A variable name used for the AIP-151 LRO subclients
439
+ #
440
+ # @return [String]
357
441
  def lro_client_var
358
442
  "operations_client"
359
443
  end
360
444
 
445
+ ##
446
+ # An instance variable name used for the AIP-151 LRO subclients
447
+ #
448
+ # @return [String]
361
449
  def lro_client_ivar
362
450
  "@#{lro_client_var}"
363
451
  end
364
452
 
453
+ ##
454
+ # A presenter for the LRO subclient if needed
455
+ #
456
+ # @return [Gapic::Presenters::Service::LroClientPresenter, nil]
457
+ def lro_client_presenter
458
+ return nil unless lro?
459
+ Gapic::Presenters::Service::LroClientPresenter.new service: "google.longrunning.operations",
460
+ client_class_name: "Operations",
461
+ client_class_docname: operations_name_full,
462
+ client_var_name: lro_client_var,
463
+ require_str: operations_file_path,
464
+ service_description: "long-running operations"
465
+ end
466
+
365
467
  def operations_name
366
468
  "Operations"
367
469
  end
@@ -384,7 +486,7 @@ module Gapic
384
486
 
385
487
  def lro_service
386
488
  lro = @service.parent.parent.files.find { |file| file.name == "google/longrunning/operations.proto" }
387
- return ServicePresenter.new @gem_presenter, @api, lro.services.first, parent_service: self unless lro.nil?
489
+ ServicePresenter.new @gem_presenter, @api, lro.services.first, parent_service: self unless lro.nil?
388
490
  end
389
491
 
390
492
  def config_channel_args
@@ -396,8 +498,8 @@ module Gapic
396
498
  @api.grpc_service_config.service_level_configs[grpc_full_name]
397
499
  end
398
500
 
399
- def service_config_presenter
400
- ServiceConfigPresenter.new grpc_service_config
501
+ def grpc_service_config_presenter
502
+ GrpcServiceConfigPresenter.new grpc_service_config
401
503
  end
402
504
 
403
505
  ##
@@ -408,8 +510,12 @@ module Gapic
408
510
  @service.name
409
511
  end
410
512
 
513
+ ##
514
+ # The full proto name for this service
515
+ #
516
+ # @return [String]
411
517
  def grpc_full_name
412
- @service.address.join "."
518
+ @service.full_name
413
519
  end
414
520
 
415
521
  ##
@@ -428,22 +534,12 @@ module Gapic
428
534
  # their names are returned together in an array.
429
535
  # For Ruby currently we have 1:1 proto to code
430
536
  # correspondence for methods, so our generation is easier
431
- rpcs: methods.map { |m| [m.grpc_method_name, m.drift_manifest] }.to_h
537
+ rpcs: methods.to_h { |m| [m.grpc_method_name, m.drift_manifest] }
432
538
  }
433
539
  }
434
540
  }
435
541
  end
436
542
 
437
- ##
438
- # How comments in the generated libraries refer to the GRPC client
439
- # if no REST code is generated, this should just be "client",
440
- # if REST code is generated, this should be disambiguated into the "GRPC client"
441
- #
442
- # @return [String]
443
- def grpc_client_designation
444
- generate_rest_clients? ? "GRPC client" : "client"
445
- end
446
-
447
543
  ##
448
544
  # The method to use for quick start samples. Normally this is simply the
449
545
  # first non-client-streaming method defined, but it can be overridden via
@@ -467,13 +563,251 @@ module Gapic
467
563
  # @return [ServicePresenter,ServiceRestPresenter,nil]
468
564
  #
469
565
  def usable_service_presenter
470
- if @api.generate_grpc_clients?
566
+ if generate_grpc_clients?
471
567
  self
472
- elsif @api.generate_rest_clients? && methods_rest_bindings?
568
+ elsif generate_rest_clients?
473
569
  rest
474
570
  end
475
571
  end
476
572
 
573
+ ##
574
+ # Whether this service presenter is a mixin inside a host service's gem
575
+ # (and not in its own gem)
576
+ #
577
+ # @return [Boolean]
578
+ #
579
+ def is_hosted_mixin?
580
+ Gapic::Model::Mixins.mixin_service_address? address, gem_name: @gem_presenter.name
581
+ end
582
+
583
+ ##
584
+ # Whether this service presenter is a mixin inside it's own gem
585
+ # (and not in another service's gem)
586
+ #
587
+ # @return [Boolean]
588
+ #
589
+ def is_main_mixin_service?
590
+ Gapic::Model::Mixins.mixin_service_address?(address) &&
591
+ !Gapic::Model::Mixins.mixin_service_address?(address, gem_name: @gem_presenter.name)
592
+ end
593
+
594
+ ##
595
+ # Whether there are mixin services that should be referenced
596
+ # in the client for this service
597
+ #
598
+ # @return [Boolean]
599
+ #
600
+ def mixins?
601
+ @gem_presenter.mixins?
602
+ end
603
+
604
+ ##
605
+ # The models for the mixins
606
+ #
607
+ # @return [Enumerable<::Gapic::Model::Mixins::Mixin>]
608
+ #
609
+ def mixin_models
610
+ @gem_presenter.mixins_model.mixins
611
+ end
612
+
613
+ ##
614
+ # Whether there are mixin services that this package has http binding overrides for.
615
+ #
616
+ # @return [Boolean]
617
+ #
618
+ def mixin_binding_overrides?
619
+ mixin_presenters.any? { |mixin| !mixin.bindings_override.empty? }
620
+ end
621
+
622
+ ##
623
+ # Whether config for this service should include the `bindings_override` field.
624
+ # This field is needed:
625
+ # * if a service is a mixin in it's own package, e.g. `google.Cloud.Location`
626
+ # * if a service hosts a mixin and has bindings overrides for it
627
+ # but the generated Operations clients should not have it since override for
628
+ # their bindings are generated instead of set during runtime.
629
+ #
630
+ # GRPC clients should not have this for now, since the overrides are not currently used.
631
+ #
632
+ def mixin_should_generate_override_config?
633
+ false
634
+ end
635
+
636
+ ##
637
+ # The mixin services that should be referenced
638
+ # in the client for this service
639
+ #
640
+ # @return [Enumerable<Gapic::Presenters::Service::MixinClientPresenter>]
641
+ #
642
+ def mixin_presenters
643
+ return [] unless mixins?
644
+ mixin_models.map do |model|
645
+ # we don't have mixin's descriptors loaded, so instead of starting with descriptor's methods
646
+ # and looking up the override, we'll start with overrides and see if any fit the mixin's namespace
647
+ bindings_override = begin
648
+ if @api.service_config&.http.nil?
649
+ {}
650
+ else
651
+ service_http_rules = @api.service_config.http.rules.select do |http_rule|
652
+ http_rule.selector.include? model.service
653
+ end
654
+
655
+ service_http_rules.to_h do |http_rule|
656
+ bindings = Gapic::Model::Method::HttpAnnotation.new(http_rule).bindings.map do |binding|
657
+ Gapic::Presenters::Method::HttpBindingPresenter.new binding
658
+ end
659
+ [http_rule.selector, bindings]
660
+ end
661
+ end
662
+ end
663
+
664
+ Gapic::Presenters::Service::MixinClientPresenter.new service: model.service,
665
+ client_class_name: model.client_class_name,
666
+ client_class_docname: model.client_class_docname,
667
+ client_var_name: model.client_var_name,
668
+ require_str: model.require_str,
669
+ service_description: model.service_description,
670
+ bindings_override: bindings_override
671
+ end
672
+ end
673
+
674
+ ##
675
+ # Name of the nonstandard LRO module
676
+ #
677
+ # @return [String]
678
+ #
679
+ def nonstandard_lro_name
680
+ "NonstandardLro"
681
+ end
682
+
683
+ ##
684
+ # Full name of the nonstandard LRO module
685
+ #
686
+ # @return [String]
687
+ #
688
+ def nonstandard_lro_name_full
689
+ fix_namespace @api, "#{service_name_full}::#{nonstandard_lro_name}"
690
+ end
691
+
692
+ ##
693
+ # Full file path to the nonstandard LRO module
694
+ #
695
+ # @return [String]
696
+ #
697
+ def nonstandard_lro_file_path
698
+ "#{nonstandard_lro_require}.rb"
699
+ end
700
+
701
+ ##
702
+ # File name of the nonstandard LRO module
703
+ #
704
+ # @return [String]
705
+ #
706
+ def nonstandard_lro_file_name
707
+ nonstandard_lro_file_path.split("/").last
708
+ end
709
+
710
+ ##
711
+ # The require string for the nonstandard LRO module
712
+ #
713
+ # @return [String]
714
+ #
715
+ def nonstandard_lro_require
716
+ ruby_file_path @api, "#{service_name_full}::#{nonstandard_lro_name}"
717
+ end
718
+
719
+ ##
720
+ # Nonstandard lro model for this service
721
+ #
722
+ # @return [Gapic::Model::Service::NonstandardLro, Gapic::Model::Service::NoLro]
723
+ def nonstandard_lro
724
+ @nonstandard_lro
725
+ end
726
+
727
+ ##
728
+ # The Ruby name for the polling method of the nonstandard LRO provided by this service
729
+ #
730
+ # @return [String]
731
+ def nonstandard_lro_polling_method_name
732
+ return unless nonstandard_lro_provider?
733
+ methods.find { |m| m.grpc_method_name == nonstandard_lro.polling_method_name }.name
734
+ end
735
+
736
+ ##
737
+ # Whether this service is a provider of the nonstandard LRO functionality
738
+ #
739
+ # @return [Boolean]
740
+ def nonstandard_lro_provider?
741
+ @nonstandard_lro.nonstandard_lro?
742
+ end
743
+
744
+ ##
745
+ # Whether one or more methods of this service use the nonstandard LRO functionality
746
+ #
747
+ # @return [Boolean]
748
+ def nonstandard_lro_consumer?
749
+ methods.find(&:nonstandard_lro?) || false
750
+ end
751
+
752
+ ##
753
+ # The client presenters of the nonstandard LROs that are used by the methods of this service
754
+ #
755
+ # @return [Enumerable<Gapic::Presenters::Service::LroClientPresenter>]
756
+ def nonstandard_lros
757
+ return [] unless nonstandard_lro_consumer?
758
+ nonstandard_lros_models.map do |lro|
759
+ lro_wrapper = @api.lookup lro.service_full_name
760
+ lro_service = ServicePresenter.new @gem_presenter, @api, lro_wrapper
761
+
762
+ service_description = "long-running operations via #{lro_service.name}"
763
+ client_var_name = ruby_file_path_for_namespace lro_service.name
764
+ Gapic::Presenters::Service::LroClientPresenter.new service: lro.service_full_name,
765
+ client_class_name: lro_service.client_name_full,
766
+ client_class_docname: lro_service.client_name_full,
767
+ client_var_name: client_var_name,
768
+ require_str: lro_service.service_require,
769
+ service_description: service_description,
770
+ helper_type: lro_service.nonstandard_lro_name_full
771
+ end
772
+ end
773
+
774
+ ##
775
+ # Whether there are any subclients to generate with this service.
776
+ # Subclients are the clients to other services (e.g. an LRO provider service).
777
+ #
778
+ # @return [Boolean]
779
+ def subclients?
780
+ subclients.any?
781
+ end
782
+
783
+ ##
784
+ # Subclients for this service
785
+ # Subclients are the clients to other services (e.g. an LRO provider service).
786
+ #
787
+ # The following is typically generated for a subclient:
788
+ # - a require statement for the subclient's class
789
+ # - a class-level variable in the host service's client
790
+ # - a code to initialize this variable with a subclient's class instance in the host service's constructor
791
+ #
792
+ # @return [Enumerable<Gapic::Presenters::Service::LroClientPresenter, Gapic::Model::Mixins::Mixin>]
793
+ def subclients
794
+ [lro_client_presenter, mixin_presenters, nonstandard_lros].flatten.compact
795
+ end
796
+
797
+ def lro_subclients
798
+ [lro_client_presenter, nonstandard_lros].flatten.compact
799
+ end
800
+
801
+ ##
802
+ # @private
803
+ # The nonstandard LRO models for the nonstandard LROs that are used by the methods of this service
804
+ #
805
+ # @return [Enumerable<Gapic::Model::Method::Lro>]
806
+ def nonstandard_lros_models
807
+ return [] unless nonstandard_lro_consumer?
808
+ methods.select(&:nonstandard_lro?).map(&:lro).uniq(&:service_full_name)
809
+ end
810
+
477
811
  private
478
812
 
479
813
  def default_config key