gapic-generator 0.11.0 → 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 (276) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +299 -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 -34
  12. data/lib/gapic/generators/default_generator_parameters.rb +9 -3
  13. data/lib/gapic/grpc_service_config/parser.rb +2 -2
  14. data/lib/gapic/model/api_metadata.rb +173 -0
  15. data/lib/gapic/model/method/http_annotation.rb +158 -60
  16. data/lib/gapic/model/method/lro.rb +8 -5
  17. data/lib/gapic/model/method/routing.rb +3 -18
  18. data/lib/gapic/model/mixins.rb +76 -10
  19. data/lib/gapic/model/service/nonstandard_lro_provider.rb +10 -11
  20. data/lib/gapic/package_snippets.rb +159 -0
  21. data/lib/gapic/path_pattern/parser.rb +11 -2
  22. data/lib/gapic/path_pattern/pattern.rb +18 -1
  23. data/lib/gapic/path_pattern/segment.rb +11 -4
  24. data/lib/gapic/presenters/enum_presenter.rb +14 -0
  25. data/lib/gapic/presenters/enum_value_presenter.rb +4 -1
  26. data/lib/gapic/presenters/field_presenter.rb +78 -21
  27. data/lib/gapic/presenters/gem_presenter.rb +109 -35
  28. data/lib/gapic/presenters/message_presenter.rb +15 -0
  29. data/lib/gapic/presenters/method/http_binding_presenter.rb +128 -0
  30. data/lib/gapic/presenters/method/rest_pagination_info.rb +25 -16
  31. data/lib/gapic/presenters/method_presenter.rb +109 -35
  32. data/lib/gapic/presenters/method_rest_presenter.rb +70 -137
  33. data/lib/gapic/presenters/package_presenter.rb +63 -18
  34. data/lib/gapic/presenters/resource_presenter.rb +9 -3
  35. data/lib/gapic/presenters/service/lro_client_presenter.rb +14 -14
  36. data/lib/gapic/presenters/service/mixin_client_presenter.rb +89 -0
  37. data/lib/gapic/presenters/service/sub_client_presenter.rb +84 -0
  38. data/lib/gapic/presenters/service_presenter.rb +183 -31
  39. data/lib/gapic/presenters/service_rest_presenter.rb +180 -27
  40. data/lib/gapic/presenters/snippet/client_call_presenter.rb +82 -0
  41. data/lib/gapic/presenters/snippet/client_initialization_presenter.rb +87 -0
  42. data/lib/gapic/presenters/snippet/declaration_presenter.rb +91 -0
  43. data/lib/gapic/presenters/snippet/expression_presenter.rb +135 -0
  44. data/lib/gapic/presenters/snippet/iteration_presenter.rb +118 -0
  45. data/lib/gapic/presenters/snippet/parameter_presenter.rb +67 -0
  46. data/lib/gapic/presenters/snippet/request_initialization_presenters.rb +202 -0
  47. data/lib/gapic/presenters/snippet/response_handling_presenters.rb +329 -0
  48. data/lib/gapic/presenters/snippet/statement_presenter.rb +134 -0
  49. data/lib/gapic/presenters/snippet/type_presenter.rb +98 -0
  50. data/lib/gapic/presenters/snippet_presenter.rb +199 -10
  51. data/lib/gapic/presenters.rb +2 -0
  52. data/lib/gapic/runner.rb +1 -1
  53. data/lib/gapic/schema/api.rb +49 -3
  54. data/lib/gapic/schema/loader.rb +67 -22
  55. data/lib/gapic/schema/parameter_schema.rb +8 -8
  56. data/lib/gapic/schema/proto_tools.rb +193 -0
  57. data/lib/gapic/schema/request_param_parser.rb +5 -7
  58. data/lib/gapic/schema/service_config_parser.rb +38 -4
  59. data/lib/gapic/schema/wrappers.rb +192 -31
  60. data/lib/gapic/uri_template/parser.rb +15 -7
  61. data/lib/google/cloud/tools/snippetgen/configlanguage/v1/snippet_config_language_pb.rb +104 -0
  62. data/lib/google/cloud/tools/snippetgen/snippetindex/v1/snippet_index_pb.rb +58 -0
  63. data/lib/google/protobuf/compiler/plugin_pb.rb +47 -0
  64. data/templates/default/binding_override.text.erb +6 -0
  65. data/templates/default/gem/gemfile.text.erb +12 -0
  66. data/templates/default/gem/{gemspec.erb → gemspec.text.erb} +3 -11
  67. data/templates/default/gem/{readme.erb → readme.text.erb} +10 -6
  68. data/templates/default/gem/{rubocop.erb → rubocop.text.erb} +3 -0
  69. data/templates/default/gem/{test_helper.erb → test_helper.text.erb} +4 -2
  70. data/templates/default/gem/toys.text.erb +12 -0
  71. data/templates/default/helpers/default_helper.rb +33 -1
  72. data/templates/default/lib/_binding_override.text.erb +49 -0
  73. data/templates/default/lib/{_package.erb → _package.text.erb} +6 -9
  74. data/templates/default/lib/_package_rest.text.erb +24 -0
  75. data/templates/default/lib/{_service.erb → _service.text.erb} +11 -23
  76. data/templates/default/lib/package/_self_configure.text.erb +16 -0
  77. data/templates/default/lib/package/_self_configure_defaults.text.erb +13 -0
  78. data/templates/default/lib/package/self_configure/_binding_default.text.erb +15 -0
  79. data/templates/default/lib/rest/_rest.text.erb +46 -0
  80. data/templates/default/package_rest.text.erb +6 -0
  81. data/templates/default/proto_docs/_deprecated.text.erb +9 -0
  82. data/templates/default/proto_docs/{_enum.erb → _enum.text.erb} +1 -0
  83. data/templates/default/proto_docs/{_message.erb → _message.text.erb} +2 -0
  84. data/templates/default/service/client/{_client.erb → _client.text.erb} +60 -12
  85. data/templates/default/service/client/{_config.erb → _config.text.erb} +39 -8
  86. data/templates/default/service/client/{_operations.erb → _operations.text.erb} +24 -3
  87. data/templates/default/service/client/method/{_def.erb → _def.text.erb} +2 -2
  88. data/templates/default/service/client/method/def/{_options_defaults.erb → _options_defaults.text.erb} +2 -1
  89. data/templates/default/service/client/method/def/_request_normal.text.erb +18 -0
  90. data/templates/default/service/client/method/def/_request_streaming.text.erb +23 -0
  91. data/templates/default/service/client/method/def/{_response.erb → _response.text.erb} +2 -0
  92. data/templates/default/service/client/method/def/{_response_nonstandard_lro.erb → _response_nonstandard_lro.text.erb} +1 -1
  93. data/templates/default/service/client/method/def/_response_normal.text.erb +4 -0
  94. data/templates/default/service/client/method/def/{_response_normal.erb → _response_normal_lro.text.erb} +1 -3
  95. data/templates/default/service/client/method/def/{_response_paged.erb → _response_paged.text.erb} +1 -1
  96. data/templates/default/service/client/method/docs/{_request_normal.erb → _request_normal.text.erb} +1 -1
  97. data/templates/default/service/client/method/docs/_snippets.text.erb +6 -0
  98. data/templates/default/service/client/resource/_def.text.erb +7 -0
  99. data/templates/default/service/nonstandard_lro.text.erb +6 -0
  100. data/templates/default/service/rest/client/{_client.erb → _client.text.erb} +82 -13
  101. data/templates/default/service/rest/client/_config.text.erb +178 -0
  102. data/templates/default/service/rest/client/_operations.text.erb +124 -0
  103. data/templates/default/service/rest/client/method/{_def.erb → _def.text.erb} +7 -1
  104. data/templates/default/service/rest/client/method/def/{_options_defaults.erb → _options_defaults.text.erb} +8 -3
  105. data/templates/default/service/rest/client/method/def/{_response.erb → _response.text.erb} +4 -0
  106. data/templates/default/service/rest/client/method/def/{_response_nonstandard_lro.erb → _response_nonstandard_lro.text.erb} +5 -4
  107. data/templates/default/service/rest/client/method/def/_response_normal.text.erb +5 -0
  108. data/templates/default/service/rest/client/method/def/_response_normal_lro.text.erb +7 -0
  109. data/templates/default/service/rest/client/method/def/_response_paged.text.erb +7 -0
  110. data/templates/default/service/rest/client/method/def/_response_server_streaming.text.erb +11 -0
  111. data/templates/default/service/rest/client/method/docs/{_request.erb → _request.text.erb} +1 -3
  112. data/templates/default/service/rest/client/method/docs/_result.text.erb +10 -0
  113. data/templates/default/service/rest/client/method/docs/_snippets.text.erb +6 -0
  114. data/templates/default/service/{nonstandard_lro.erb → rest/nonstandard_lro.text.erb} +1 -1
  115. data/templates/default/service/rest/operations.text.erb +6 -0
  116. data/templates/default/service/rest/service_stub/_service_stub.text.erb +63 -0
  117. data/templates/default/service/rest/service_stub/grpc_transcoding_method/_def.text.erb +37 -0
  118. data/templates/default/service/rest/service_stub/method/_def.text.erb +35 -0
  119. data/templates/default/service/rest/service_stub/method/def/_response.text.erb +37 -0
  120. data/templates/default/service/rest/test/{client.erb → client.text.erb} +3 -3
  121. data/templates/default/service/rest/test/method/_assert_response.text.erb +2 -0
  122. data/templates/default/service/rest/test/method/{_configure.erb → _configure.text.erb} +3 -2
  123. data/templates/default/service/rest/test/method/_normal.text.erb +60 -0
  124. data/templates/default/service/rest/test/method/_server.text.erb +60 -0
  125. data/templates/default/service/rest/test/method/{_setup.erb → _setup.text.erb} +26 -10
  126. data/templates/default/service/test/{_resource.erb → _resource.text.erb} +1 -1
  127. data/templates/default/service/test/{client.erb → client.text.erb} +3 -2
  128. data/templates/default/service/test/client_paths.text.erb +33 -0
  129. data/templates/default/service/test/method/{_bidi.erb → _bidi.text.erb} +1 -1
  130. data/templates/default/service/test/method/{_client.erb → _client.text.erb} +1 -1
  131. data/templates/default/service/test/method/{_configure.erb → _configure.text.erb} +2 -1
  132. data/templates/default/service/test/method/{_normal.erb → _normal.text.erb} +1 -1
  133. data/templates/default/service/test/method/{_server.erb → _server.text.erb} +1 -1
  134. data/templates/default/service/test/method/{_setup.erb → _setup.text.erb} +19 -2
  135. data/templates/default/snippets/{gemfile.erb → gemfile.text.erb} +2 -2
  136. data/templates/default/snippets/snippet/_body.text.erb +24 -0
  137. data/templates/default/snippets/snippet/_inline.text.erb +11 -0
  138. data/templates/default/snippets/snippet/_standalone.text.erb +25 -0
  139. data/templates/default/snippets/{standalone.erb → standalone.text.erb} +1 -1
  140. metadata +198 -273
  141. data/lib/google/api/annotations.pb.rb +0 -39
  142. data/lib/google/api/auth.pb.rb +0 -75
  143. data/lib/google/api/backend.pb.rb +0 -59
  144. data/lib/google/api/billing.pb.rb +0 -53
  145. data/lib/google/api/client.pb.rb +0 -43
  146. data/lib/google/api/context.pb.rb +0 -47
  147. data/lib/google/api/control.pb.rb +0 -38
  148. data/lib/google/api/documentation.pb.rb +0 -56
  149. data/lib/google/api/endpoint.pb.rb +0 -42
  150. data/lib/google/api/field_behavior.pb.rb +0 -51
  151. data/lib/google/api/http.pb.rb +0 -60
  152. data/lib/google/api/label.pb.rb +0 -49
  153. data/lib/google/api/launch_stage.pb.rb +0 -37
  154. data/lib/google/api/log.pb.rb +0 -47
  155. data/lib/google/api/logging.pb.rb +0 -48
  156. data/lib/google/api/metric.pb.rb +0 -90
  157. data/lib/google/api/monitored_resource.pb.rb +0 -68
  158. data/lib/google/api/monitoring.pb.rb +0 -48
  159. data/lib/google/api/quota.pb.rb +0 -63
  160. data/lib/google/api/resource.pb.rb +0 -80
  161. data/lib/google/api/routing.pb.rb +0 -58
  162. data/lib/google/api/service.pb.rb +0 -90
  163. data/lib/google/api/source_info.pb.rb +0 -44
  164. data/lib/google/api/system_parameter.pb.rb +0 -51
  165. data/lib/google/api/usage.pb.rb +0 -47
  166. data/lib/google/cloud/extended_operations.pb.rb +0 -57
  167. data/lib/google/longrunning/operations.pb.rb +0 -115
  168. data/lib/google/protobuf/any.pb.rb +0 -40
  169. data/lib/google/protobuf/api.pb.rb +0 -69
  170. data/lib/google/protobuf/compiler/plugin.pb.rb +0 -79
  171. data/lib/google/protobuf/descriptor.pb.rb +0 -360
  172. data/lib/google/protobuf/duration.pb.rb +0 -41
  173. data/lib/google/protobuf/empty.pb.rb +0 -36
  174. data/lib/google/protobuf/source_context.pb.rb +0 -39
  175. data/lib/google/protobuf/struct.pb.rb +0 -65
  176. data/lib/google/protobuf/type.pb.rb +0 -128
  177. data/lib/google/protobuf/wrappers.pb.rb +0 -80
  178. data/lib/google/rpc/status.pb.rb +0 -46
  179. data/templates/default/gem/gemfile.erb +0 -4
  180. data/templates/default/lib/rest/_rest.erb +0 -9
  181. data/templates/default/service/client/method/def/_request_normal.erb +0 -4
  182. data/templates/default/service/client/method/def/_request_streaming.erb +0 -9
  183. data/templates/default/service/client/method/docs/_deprecated.erb +0 -5
  184. data/templates/default/service/client/method/docs/_snippets.erb +0 -6
  185. data/templates/default/service/client/resource/_def.erb +0 -6
  186. data/templates/default/service/rest/client/_config.erb +0 -122
  187. data/templates/default/service/rest/client/method/def/_response_normal.erb +0 -6
  188. data/templates/default/service/rest/client/method/def/_response_paged.erb +0 -7
  189. data/templates/default/service/rest/client/method/docs/_result.erb +0 -6
  190. data/templates/default/service/rest/service_stub/_service_stub.erb +0 -25
  191. data/templates/default/service/rest/service_stub/grpc_transcoding_method/_def.erb +0 -24
  192. data/templates/default/service/rest/service_stub/method/_def.erb +0 -20
  193. data/templates/default/service/rest/service_stub/method/def/_response.erb +0 -17
  194. data/templates/default/service/rest/test/method/_assert_response.erb +0 -2
  195. data/templates/default/service/rest/test/method/_normal.erb +0 -71
  196. data/templates/default/service/test/client_paths.erb +0 -15
  197. data/templates/default/snippets/snippet/_structure.erb +0 -71
  198. /data/gem_templates/{binary.erb → binary.text.erb} +0 -0
  199. /data/gem_templates/{dockerfile.erb → dockerfile.text.erb} +0 -0
  200. /data/gem_templates/{entrypoint.erb → entrypoint.text.erb} +0 -0
  201. /data/gem_templates/{gapic_sh.erb → gapic_sh.text.erb} +0 -0
  202. /data/gem_templates/{gemfile.erb → gemfile.text.erb} +0 -0
  203. /data/gem_templates/{gemspec.erb → gemspec.text.erb} +0 -0
  204. /data/gem_templates/{generator.erb → generator.text.erb} +0 -0
  205. /data/gem_templates/{gitignore.erb → gitignore.text.erb} +0 -0
  206. /data/gem_templates/{rakefile.erb → rakefile.text.erb} +0 -0
  207. /data/gem_templates/{readme.erb → readme.text.erb} +0 -0
  208. /data/gem_templates/{rubocop.erb → rubocop.text.erb} +0 -0
  209. /data/gem_templates/shared/{_header.erb → _header.text.erb} +0 -0
  210. /data/gem_templates/shared/{_license.erb → _license.text.erb} +0 -0
  211. /data/gem_templates/shared/{_warning.erb → _warning.text.erb} +0 -0
  212. /data/gem_templates/{test_generator.erb → test_generator.text.erb} +0 -0
  213. /data/gem_templates/{test_helper.erb → test_helper.text.erb} +0 -0
  214. /data/gem_templates/{version.erb → version.text.erb} +0 -0
  215. /data/templates/default/gem/{_version.erb → _version.text.erb} +0 -0
  216. /data/templates/default/gem/{changelog.erb → changelog.text.erb} +0 -0
  217. /data/templates/default/gem/{entrypoint.erb → entrypoint.text.erb} +0 -0
  218. /data/templates/default/gem/{gapic_metadata_json.erb → gapic_metadata_json.text.erb} +0 -0
  219. /data/templates/default/gem/{gitignore.erb → gitignore.text.erb} +0 -0
  220. /data/templates/default/gem/{license.erb → license.text.erb} +0 -0
  221. /data/templates/default/gem/{rakefile.erb → rakefile.text.erb} +0 -0
  222. /data/templates/default/gem/{version.erb → version.text.erb} +0 -0
  223. /data/templates/default/gem/{yardopts.erb → yardopts.text.erb} +0 -0
  224. /data/templates/default/layouts/{_ruby.erb → _ruby.text.erb} +0 -0
  225. /data/templates/default/{package.erb → package.text.erb} +0 -0
  226. /data/templates/default/proto_docs/{_proto_file.erb → _proto_file.text.erb} +0 -0
  227. /data/templates/default/proto_docs/{proto_file.erb → proto_file.text.erb} +0 -0
  228. /data/templates/default/proto_docs/{readme.erb → readme.text.erb} +0 -0
  229. /data/templates/default/service/{_helpers.erb → _helpers.text.erb} +0 -0
  230. /data/templates/default/service/client/{_credentials.erb → _credentials.text.erb} +0 -0
  231. /data/templates/default/service/client/{_nonstandard_lro.erb → _nonstandard_lro.text.erb} +0 -0
  232. /data/templates/default/service/client/{_paths.erb → _paths.text.erb} +0 -0
  233. /data/templates/default/service/client/{_requires.erb → _requires.text.erb} +0 -0
  234. /data/templates/default/service/client/{_resource.erb → _resource.text.erb} +0 -0
  235. /data/templates/default/service/client/{_self_configure.erb → _self_configure.text.erb} +0 -0
  236. /data/templates/default/service/client/{_self_configure_defaults.erb → _self_configure_defaults.text.erb} +0 -0
  237. /data/templates/default/service/client/method/def/{_request.erb → _request.text.erb} +0 -0
  238. /data/templates/default/service/client/method/def/{_rescue.erb → _rescue.text.erb} +0 -0
  239. /data/templates/default/service/client/method/def/{_routing_params.erb → _routing_params.text.erb} +0 -0
  240. /data/templates/default/service/client/method/docs/{_error.erb → _error.text.erb} +0 -0
  241. /data/templates/default/service/client/method/docs/{_request.erb → _request.text.erb} +0 -0
  242. /data/templates/default/service/client/method/docs/{_request_field.erb → _request_field.text.erb} +0 -0
  243. /data/templates/default/service/client/method/docs/{_request_streaming.erb → _request_streaming.text.erb} +0 -0
  244. /data/templates/default/service/client/method/docs/{_response.erb → _response.text.erb} +0 -0
  245. /data/templates/default/service/client/method/docs/{_sample.erb → _sample.text.erb} +0 -0
  246. /data/templates/default/service/client/method/docs/{_sample_response.erb → _sample_response.text.erb} +0 -0
  247. /data/templates/default/service/client/method/docs/{_samples.erb → _samples.text.erb} +0 -0
  248. /data/templates/default/service/client/method/docs/request_field/{_arg.erb → _arg.text.erb} +0 -0
  249. /data/templates/default/service/client/method/docs/request_field/{_hash.erb → _hash.text.erb} +0 -0
  250. /data/templates/default/service/client/method/docs/sample_response/{_comment.erb → _comment.text.erb} +0 -0
  251. /data/templates/default/service/client/method/docs/sample_response/{_define.erb → _define.text.erb} +0 -0
  252. /data/templates/default/service/client/method/docs/sample_response/{_loop.erb → _loop.text.erb} +0 -0
  253. /data/templates/default/service/client/method/docs/sample_response/{_print.erb → _print.text.erb} +0 -0
  254. /data/templates/default/service/client/method/docs/sample_response/{_write_file.erb → _write_file.text.erb} +0 -0
  255. /data/templates/default/service/client/resource/{_doc.erb → _doc.text.erb} +0 -0
  256. /data/templates/default/service/client/resource/{_multi.erb → _multi.text.erb} +0 -0
  257. /data/templates/default/service/client/resource/{_single.erb → _single.text.erb} +0 -0
  258. /data/templates/default/service/{client.erb → client.text.erb} +0 -0
  259. /data/templates/default/service/{credentials.erb → credentials.text.erb} +0 -0
  260. /data/templates/default/service/{operations.erb → operations.text.erb} +0 -0
  261. /data/templates/default/service/{paths.erb → paths.text.erb} +0 -0
  262. /data/templates/default/service/rest/client/method/def/{_rescue.erb → _rescue.text.erb} +0 -0
  263. /data/templates/default/service/rest/client/method/docs/{_error.erb → _error.text.erb} +0 -0
  264. /data/templates/default/service/rest/{client.erb → client.text.erb} +0 -0
  265. /data/templates/default/service/rest/{grpc_transcoding.erb → grpc_transcoding.text.erb} +0 -0
  266. /data/templates/default/service/rest/service_stub/grpc_transcoding_method/def/{_query_string_param.erb → _query_string_param.text.erb} +0 -0
  267. /data/templates/default/service/rest/service_stub/method/def/{_request.erb → _request.text.erb} +0 -0
  268. /data/templates/default/service/rest/{service_stub.erb → service_stub.text.erb} +0 -0
  269. /data/templates/default/service/{rest.erb → rest.text.erb} +0 -0
  270. /data/templates/default/service/test/{client_operations.erb → client_operations.text.erb} +0 -0
  271. /data/templates/default/service/test/method/{_assert_response.erb → _assert_response.text.erb} +0 -0
  272. /data/templates/default/service/test/{smoke.erb → smoke.text.erb} +0 -0
  273. /data/templates/default/{service.erb → service.text.erb} +0 -0
  274. /data/templates/default/shared/{_header.erb → _header.text.erb} +0 -0
  275. /data/templates/default/shared/{_license.erb → _license.text.erb} +0 -0
  276. /data/templates/default/shared/{_warning.erb → _warning.text.erb} +0 -0
@@ -9,15 +9,24 @@ require "<%= subclient.require_str %>"
9
9
  <%- end -%>
10
10
  <%- end -%>
11
11
  <%- end -%>
12
+ <%- if service.autogenerates_uuid? -%>
13
+ require "securerandom"
14
+ <%- end -%>
12
15
  <% end %>
13
16
  ##
14
17
  # Client for the <%= service.name %> service.
15
18
  #
16
19
  <%- if service.doc_description -%>
17
- <%= indent service.doc_description, "# " %>
20
+ <%= indent service.doc_description(transport: :grpc), "# " %>
18
21
  #
19
22
  <%- end -%>
20
23
  class <%= service.client_name %>
24
+ # @private
25
+ API_VERSION = "<%= service.api_version %>".freeze
26
+
27
+ # @private
28
+ DEFAULT_ENDPOINT_TEMPLATE = <%= service.client_endpoint_template.inspect %>
29
+
21
30
  <%- if service.paths? -%>
22
31
  include <%= service.paths_name %>
23
32
 
@@ -30,11 +39,8 @@ class <%= service.client_name %>
30
39
  #
31
40
  # See {<%= service.client_name_full %>::Configuration}
32
41
  # for a description of the configuration fields.
33
- <%- if service.is_deprecated? -%>
34
- #
35
- # @deprecated This service is deprecated and may be removed in the next major version update.
36
- <%- end -%>
37
42
  #
43
+ <%= render partial: "proto_docs/deprecated", locals: { presenter: service, newline: true } -%>
38
44
  # @example
39
45
  #
40
46
  # # Modify the configuration for all <%= service.name %> clients
@@ -71,6 +77,15 @@ class <%= service.client_name %>
71
77
  @config
72
78
  end
73
79
 
80
+ ##
81
+ # The effective universe domain
82
+ #
83
+ # @return [String]
84
+ #
85
+ def universe_domain
86
+ @<%= service.stub_name %>.universe_domain
87
+ end
88
+
74
89
  ##
75
90
  # Create a new <%= service.name %> client object.
76
91
  #
@@ -105,7 +120,8 @@ class <%= service.client_name %>
105
120
  <%- unless service.generic_endpoint? -%>
106
121
  # Use self-signed JWT if the endpoint is unchanged from default,
107
122
  # but only if the default endpoint does not have a region prefix.
108
- enable_self_signed_jwt = @config.endpoint == <%= service.client_name %>.configure.endpoint &&
123
+ enable_self_signed_jwt = @config.endpoint.nil? ||
124
+ @config.endpoint == Configuration::DEFAULT_ENDPOINT &&
109
125
  !@config.endpoint.split(".").first.include?("-")
110
126
  credentials ||= Credentials.default scope: @config.scope,
111
127
  enable_self_signed_jwt: enable_self_signed_jwt
@@ -116,23 +132,46 @@ class <%= service.client_name %>
116
132
  @quota_project_id = @config.quota_project
117
133
  @quota_project_id ||= credentials.quota_project_id if credentials.respond_to? :quota_project_id
118
134
 
119
- <%- if service.subclients? -%>
120
- <%- service.subclients.each do |subclient| -%>
135
+ <%- service.lro_subclients.each do |subclient| -%>
121
136
  @<%= subclient.client_var_name %> = <%= subclient.client_class_name %>.new do |config|
122
137
  config.credentials = credentials
123
138
  config.quota_project = @quota_project_id
124
139
  config.endpoint = @config.endpoint
140
+ config.universe_domain = @config.universe_domain
125
141
  end
126
142
 
127
- <%- end -%>
128
143
  <%- end -%>
129
144
  @<%= service.stub_name %> = ::Gapic::ServiceStub.new(
130
145
  <%= service.proto_service_stub_name_full %>,
131
- credentials: credentials,
132
- endpoint: @config.endpoint,
146
+ credentials: credentials,
147
+ endpoint: @config.endpoint,
148
+ endpoint_template: DEFAULT_ENDPOINT_TEMPLATE,
149
+ universe_domain: @config.universe_domain,
133
150
  channel_args: @config.channel_args,
134
- interceptors: @config.interceptors
151
+ interceptors: @config.interceptors,
152
+ channel_pool_config: @config.channel_pool,
153
+ logger: @config.logger
135
154
  )
155
+
156
+ @<%= service.stub_name %>.stub_logger&.info do |entry|
157
+ entry.set_system_name
158
+ entry.set_service
159
+ entry.message = "Created client for #{entry.service}"
160
+ entry.set_credentials_fields credentials
161
+ entry.set "customEndpoint", @config.endpoint if @config.endpoint
162
+ entry.set "defaultTimeout", @config.timeout if @config.timeout
163
+ entry.set "quotaProject", @quota_project_id if @quota_project_id
164
+ end
165
+ <%- service.mixin_presenters.each do |subclient| -%>
166
+
167
+ @<%= subclient.client_var_name %> = <%= subclient.client_class_name %>.new do |config|
168
+ config.credentials = credentials
169
+ config.quota_project = @quota_project_id
170
+ config.endpoint = @<%= service.stub_name %>.endpoint
171
+ config.universe_domain = @<%= service.stub_name %>.universe_domain
172
+ config.logger = @<%= service.stub_name %>.logger if config.respond_to? :logger=
173
+ end
174
+ <%- end -%>
136
175
  end
137
176
 
138
177
  <%- if service.subclients? -%>
@@ -146,6 +185,15 @@ class <%= service.client_name %>
146
185
 
147
186
  <%- end -%>
148
187
  <%- end -%>
188
+ ##
189
+ # The logger used for request/response debug logging.
190
+ #
191
+ # @return [Logger]
192
+ #
193
+ def logger
194
+ @<%= service.stub_name %>.logger
195
+ end
196
+
149
197
  # Service calls
150
198
  <%- service.methods.each do |method| -%>
151
199
 
@@ -32,20 +32,27 @@
32
32
  #
33
33
  <%- end -%>
34
34
  # @!attribute [rw] endpoint
35
- # The hostname or hostname:port of the service endpoint.
36
- # Defaults to `<%= service.client_endpoint.inspect %>`.
37
- # @return [::String]
35
+ # A custom service endpoint, as a hostname or hostname:port. The default is
36
+ # nil, indicating to use the default endpoint in the current universe domain.
37
+ # @return [::String,nil]
38
38
  # @!attribute [rw] credentials
39
39
  # Credentials to send with calls. You may provide any of the following types:
40
40
  # * (`String`) The path to a service account key file in JSON format
41
41
  # * (`Hash`) A service account key as a Hash
42
42
  # * (`Google::Auth::Credentials`) A googleauth credentials object
43
- # (see the [googleauth docs](https://googleapis.dev/ruby/googleauth/latest/index.html))
43
+ # (see the [googleauth docs](https://rubydoc.info/gems/googleauth/Google/Auth/Credentials))
44
44
  # * (`Signet::OAuth2::Client`) A signet oauth2 client object
45
- # (see the [signet docs](https://googleapis.dev/ruby/signet/latest/Signet/OAuth2/Client.html))
45
+ # (see the [signet docs](https://rubydoc.info/gems/signet/Signet/OAuth2/Client))
46
46
  # * (`GRPC::Core::Channel`) a gRPC channel with included credentials
47
47
  # * (`GRPC::Core::ChannelCredentials`) a gRPC credentails object
48
48
  # * (`nil`) indicating no credentials
49
+ #
50
+ # Warning: If you accept a credential configuration (JSON file or Hash) from an
51
+ # external source for authentication to Google Cloud, you must validate it before
52
+ # providing it to a Google API client library. Providing an unvalidated credential
53
+ # configuration to Google APIs can compromise the security of your systems and data.
54
+ # For more information, refer to [Validate credential configurations from external
55
+ # sources](https://cloud.google.com/docs/authentication/external/externally-sourced-credentials).
49
56
  # @return [::Object]
50
57
  # @!attribute [rw] scope
51
58
  # The OAuth scopes
@@ -80,14 +87,28 @@
80
87
  # @!attribute [rw] quota_project
81
88
  # A separate project against which to charge quota.
82
89
  # @return [::String]
90
+ # @!attribute [rw] universe_domain
91
+ # The universe domain within which to make requests. This determines the
92
+ # default endpoint URL. The default value of nil uses the environment
93
+ # universe (usually the default "googleapis.com" universe).
94
+ # @return [::String,nil]
95
+ # @!attribute [rw] logger
96
+ # A custom logger to use for request/response debug logging, or the value
97
+ # `:default` (the default) to construct a default logger, or `nil` to
98
+ # explicitly disable logging.
99
+ # @return [::Logger,:default,nil]
83
100
  #
84
101
  class Configuration
85
102
  extend ::Gapic::Config
86
103
 
87
- config_attr :endpoint, <%= service.client_endpoint.inspect %>, ::String
104
+ # @private
105
+ # The endpoint specific to the default "googleapis.com" universe. Deprecated.
106
+ DEFAULT_ENDPOINT = <%= service.client_endpoint.inspect %>
107
+
108
+ config_attr :endpoint, nil, ::String, nil
88
109
  config_attr :credentials, nil do |value|
89
- allowed = [::String, ::Hash, ::Proc, ::Symbol, ::Google::Auth::Credentials, ::Signet::OAuth2::Client, nil]
90
- allowed += [::GRPC::Core::Channel, ::GRPC::Core::ChannelCredentials] if defined? ::GRPC
110
+ allowed = [::String, ::Hash, ::Proc, ::Symbol, ::Google::Auth::Credentials, ::Google::Auth::BaseClient, ::Signet::OAuth2::Client, nil]
111
+ allowed += [::GRPC::Core::Channel, ::GRPC::Core::ChannelCredentials] if defined? ::GRPC::Core::Channel
91
112
  allowed.any? { |klass| klass === value }
92
113
  end
93
114
  config_attr :scope, nil, ::String, ::Array, nil
@@ -99,6 +120,8 @@ class Configuration
99
120
  config_attr :metadata, nil, ::Hash, nil
100
121
  config_attr :retry_policy, nil, ::Hash, ::Proc, nil
101
122
  config_attr :quota_project, nil, ::String, nil
123
+ config_attr :universe_domain, nil, ::String, nil
124
+ config_attr :logger, :default, ::Logger, nil, :default
102
125
 
103
126
  # @private
104
127
  def initialize parent_config = nil
@@ -119,6 +142,14 @@ class Configuration
119
142
  end
120
143
  end
121
144
 
145
+ ##
146
+ # Configuration for the channel pool
147
+ # @return [::Gapic::ServiceStub::ChannelPool::Configuration]
148
+ #
149
+ def channel_pool
150
+ @channel_pool ||= ::Gapic::ServiceStub::ChannelPool::Configuration.new
151
+ end
152
+
122
153
  ##
123
154
  # Configuration RPC class for the <%= service.name %> API.
124
155
  #
@@ -5,6 +5,12 @@ require "<%= service.lro_service.proto_service_require %>"
5
5
  <% end %>
6
6
  # Service that implements Longrunning Operations API.
7
7
  class <%= service.operations_name %>
8
+ # @private
9
+ API_VERSION = "<%= service.api_version %>".freeze
10
+
11
+ # @private
12
+ DEFAULT_ENDPOINT_TEMPLATE = <%= service.client_endpoint_template.inspect %>
13
+
8
14
  # @private
9
15
  attr_reader :<%= service.lro_service.stub_name %>
10
16
 
@@ -39,6 +45,15 @@ class <%= service.operations_name %>
39
45
  @config
40
46
  end
41
47
 
48
+ ##
49
+ # The effective universe domain
50
+ #
51
+ # @return [String]
52
+ #
53
+ def universe_domain
54
+ @<%= service.lro_service.stub_name %>.universe_domain
55
+ end
56
+
42
57
  ##
43
58
  # Create a new <%= service.operations_name %> client object.
44
59
  #
@@ -69,11 +84,17 @@ class <%= service.operations_name %>
69
84
 
70
85
  @<%= service.lro_service.stub_name %> = ::Gapic::ServiceStub.new(
71
86
  <%= service.lro_service.proto_service_stub_name_full %>,
72
- credentials: credentials,
73
- endpoint: @config.endpoint,
87
+ credentials: credentials,
88
+ endpoint: @config.endpoint,
89
+ endpoint_template: DEFAULT_ENDPOINT_TEMPLATE,
90
+ universe_domain: @config.universe_domain,
74
91
  channel_args: @config.channel_args,
75
- interceptors: @config.interceptors
92
+ interceptors: @config.interceptors,
93
+ channel_pool_config: @config.channel_pool
76
94
  )
95
+
96
+ # Used by an LRO wrapper for some methods of this service
97
+ @operations_client = self
77
98
  end
78
99
 
79
100
  # Service calls
@@ -1,10 +1,10 @@
1
1
  <%- assert_locals method -%>
2
2
  ##
3
3
  <%- if method.doc_description -%>
4
- <%= indent method.doc_description, "# " %>
4
+ <%= indent method.doc_description(transport: :grpc), "# " %>
5
5
  #
6
6
  <%- end -%>
7
- <%= render partial: "service/client/method/docs/deprecated", locals: { method: method } -%>
7
+ <%= render partial: "proto_docs/deprecated", locals: { presenter: method , newline: true} -%>
8
8
  <%= render partial: "service/client/method/docs/request", locals: { method: method } -%>
9
9
  #
10
10
  <%= render partial: "service/client/method/docs/response", locals: { method: method } -%>
@@ -5,10 +5,11 @@ options = ::Gapic::CallOptions.new(**options.to_h) if options.respond_to? :to_h
5
5
  # Customize the options with defaults
6
6
  metadata = @config.rpcs.<%= method.name %>.metadata.to_h
7
7
 
8
- # Set x-goog-api-client and x-goog-user-project headers
8
+ # Set x-goog-api-client, x-goog-user-project and x-goog-api-version headers
9
9
  metadata[:"x-goog-api-client"] ||= ::Gapic::Headers.x_goog_api_client \
10
10
  lib_name: @config.lib_name, lib_version: @config.lib_version,
11
11
  gapic_version: ::<%= method.service.gem.version_name_full %>
12
+ metadata[:"x-goog-api-version"] = API_VERSION unless API_VERSION.empty?
12
13
  metadata[:"x-goog-user-project"] = @quota_project_id if @quota_project_id
13
14
  <%- if method.routing_params? && !method.client_streaming? -%>
14
15
 
@@ -0,0 +1,18 @@
1
+ <%- assert_locals method -%>
2
+ raise ::ArgumentError, "request must be provided" if request.nil?
3
+ <% method.auto_populated_fields.each do |field| %>
4
+ <% name = field.name %>
5
+
6
+ # Auto populate request field `<%= name %>`.
7
+ if request.is_a? Hash
8
+ request[:<%= name %>] = SecureRandom.uuid unless request.key?(:<%= name %>) || request.key?("<%= name %>")
9
+ else
10
+ <%- if field.proto3_optional? -%>
11
+ request.<%= name %> = SecureRandom.uuid unless request.has_<%= name %>?
12
+ <%- else -%>
13
+ request.<%= name %> = SecureRandom.uuid if request.respond_to?(:<%= name %>) && request.<%= name %>.empty?
14
+ <%- end -%>
15
+ end
16
+ <% end %>
17
+
18
+ request = ::Gapic::Protobuf.coerce request, to: <%= method.request_type %>
@@ -0,0 +1,23 @@
1
+ <%- assert_locals method -%>
2
+ unless request.is_a? ::Enumerable
3
+ raise ::ArgumentError, "request must be an Enumerable" unless request.respond_to? :to_enum
4
+ request = request.to_enum
5
+ end
6
+ <% method.auto_populated_fields.each do |field| %>
7
+ <% name = field.name %>
8
+
9
+ # Auto populate request field `<%= name %>`.
10
+ if request.is_a? Hash
11
+ request[:<%= name %>] = SecureRandom.uuid unless request.key?(:<%= name %>) || request.key?("<%= name %>")
12
+ else
13
+ <%- if field.proto3_optional? -%>
14
+ request.<%= name %> = SecureRandom.uuid unless request.has_<%= name %>?
15
+ <%- else -%>
16
+ request.<%= name %> = SecureRandom.uuid if request.respond_to?(:<%= name %>) && request.<%= name %>.empty?
17
+ <%- end -%>
18
+ end
19
+ <% end %>
20
+
21
+ request = request.lazy.map do |req|
22
+ ::Gapic::Protobuf.coerce req, to: <%= method.request_type %>
23
+ end
@@ -3,6 +3,8 @@
3
3
  <%= render partial: "service/client/method/def/response_paged", locals: { method: method } -%>
4
4
  <%- elsif method.rest.nonstandard_lro? -%>
5
5
  <%= render partial: "service/client/method/def/response_nonstandard_lro", locals: { method: method } -%>
6
+ <%- elsif method.lro? -%>
7
+ <%= render partial: "service/client/method/def/response_normal_lro", locals: { method: method } -%>
6
8
  <%- else -%>
7
9
  <%= render partial: "service/client/method/def/response_normal", locals: { method: method } -%>
8
10
  <%- end -%>
@@ -19,5 +19,5 @@
19
19
  options: options
20
20
  )
21
21
  yield result, response if block_given?
22
- return result
22
+ throw :response, result
23
23
  end
@@ -0,0 +1,4 @@
1
+ <%- assert_locals method -%>
2
+ @<%= method.service.stub_name %>.call_rpc :<%= method.name %>, request, options: options do |response, operation|
3
+ yield response, operation if block_given?
4
+ end
@@ -1,8 +1,6 @@
1
1
  <%- assert_locals method -%>
2
2
  @<%= method.service.stub_name %>.call_rpc :<%= method.name %>, request, options: options do |response, operation|
3
- <%- if method.lro? -%>
4
3
  response = ::Gapic::Operation.new response, <%= method.service.lro_client_ivar %>, options: options
5
- <%- end -%>
6
4
  yield response, operation if block_given?
7
- return response
5
+ throw :response, response
8
6
  end
@@ -5,5 +5,5 @@
5
5
  <%- end -%>
6
6
  response = ::Gapic::PagedEnumerable.new @<%= method.service.stub_name %>, :<%= method.name %>, request, response, operation, options<%- if method.lro? -%>, format_resource: wrap_lro_operation<%- end -%>
7
7
  yield response, operation if block_given?
8
- return response
8
+ throw :response, response
9
9
  end
@@ -19,7 +19,7 @@
19
19
  <%- method.arguments.each do |arg| -%>
20
20
  # @param <%= arg.name %> [<%= arg.doc_types %>]
21
21
  <%- if arg.doc_description -%>
22
- <%= indent arg.doc_description, "# " %>
22
+ <%= indent arg.doc_description(transport: :grpc), "# " %>
23
23
  <%- end -%>
24
24
  <%- end -%>
25
25
  <%- end -%>
@@ -0,0 +1,6 @@
1
+ <%- assert_locals method -%>
2
+ <%- if method.generate_yardoc_snippets? -%>
3
+ # @example Basic example
4
+ <%= indent render(partial: "snippets/snippet/inline", locals: { snippet: method.snippet(transport: :grpc) }), "# " %>
5
+ #
6
+ <%- end -%>
@@ -0,0 +1,7 @@
1
+ <%- assert_locals pattern -%>
2
+ <%- pattern.arguments[0...-1].each do |arg| -%>
3
+ <% escaped_argument = pattern.escape_argument arg %>
4
+ raise ::ArgumentError, "<%= arg %> cannot contain /" if <%= escaped_argument %>.to_s.include? "/"
5
+ <%- end -%>
6
+
7
+ "<%= pattern.path_string %>"
@@ -0,0 +1,6 @@
1
+ <%- assert_locals service -%>
2
+ <%= render partial: "service/client/nonstandard_lro",
3
+ layout: "layouts/ruby",
4
+ locals: { service: service,
5
+ namespace: service.service_name_full }
6
+ %>
@@ -3,22 +3,31 @@
3
3
  <%= render partial: "service/client/requires", locals: { service: service} -%>
4
4
  require "<%= service.proto_service_require %>"
5
5
  require "<%= service.rest.service_stub_require %>"
6
- <%- if service.subclients? -%>
7
- <%- service.subclients.each do |subclient| -%>
6
+ <%- if service.rest.subclients? -%>
7
+ <%- service.rest.subclients.each do |subclient| -%>
8
8
  <%- unless subclient.client_class_name == "Operations" -%>
9
9
  require "<%= subclient.require_str %>"
10
10
  <%- end -%>
11
11
  <%- end -%>
12
12
  <%- end -%>
13
+ <%- if service.autogenerates_uuid? -%>
14
+ require "securerandom"
15
+ <%- end -%>
13
16
  <% end %>
14
17
  ##
15
18
  # REST client for the <%= service.name %> service.
16
19
  #
17
20
  <%- if service.doc_description -%>
18
- <%= indent service.doc_description, "# " %>
21
+ <%= indent service.doc_description(transport: :rest), "# " %>
19
22
  #
20
23
  <%- end -%>
21
24
  class <%= service.rest.client_name %>
25
+ # @private
26
+ API_VERSION = "<%= service.api_version %>".freeze
27
+
28
+ # @private
29
+ DEFAULT_ENDPOINT_TEMPLATE = <%= service.client_endpoint_template.inspect %>
30
+
22
31
  <%- if service.paths? -%>
23
32
  include <%= service.paths_name %>
24
33
 
@@ -31,6 +40,7 @@ class <%= service.rest.client_name %>
31
40
  #
32
41
  # See {<%= service.rest.client_name_full %>::Configuration}
33
42
  # for a description of the configuration fields.
43
+ <%= render partial: "proto_docs/deprecated", locals: { presenter: service } -%>
34
44
  #
35
45
  # @example
36
46
  #
@@ -45,7 +55,7 @@ class <%= service.rest.client_name %>
45
55
  # @return [<%= service.rest.client_name %>::Configuration]
46
56
  #
47
57
  def self.configure
48
- <%= indent render(partial: "service/client/self_configure", locals: { service: service }), 4 %>
58
+ <%= indent render(partial: "service/client/self_configure", locals: { service: service.rest }), 4 %>
49
59
  end
50
60
 
51
61
  ##
@@ -68,6 +78,15 @@ class <%= service.rest.client_name %>
68
78
  @config
69
79
  end
70
80
 
81
+ ##
82
+ # The effective universe domain
83
+ #
84
+ # @return [String]
85
+ #
86
+ def universe_domain
87
+ @<%= service.stub_name %>.universe_domain
88
+ end
89
+
71
90
  ##
72
91
  # Create a new <%= service.name %> REST client object.
73
92
  #
@@ -94,26 +113,67 @@ class <%= service.rest.client_name %>
94
113
  # Create credentials
95
114
  credentials = @config.credentials
96
115
  <%- unless service.generic_endpoint? -%>
97
- credentials ||= Credentials.default scope: @config.scope
116
+ # Use self-signed JWT if the endpoint is unchanged from default,
117
+ # but only if the default endpoint does not have a region prefix.
118
+ enable_self_signed_jwt = @config.endpoint.nil? ||
119
+ @config.endpoint == Configuration::DEFAULT_ENDPOINT &&
120
+ !@config.endpoint.split(".").first.include?("-")
121
+ credentials ||= Credentials.default scope: @config.scope,
122
+ enable_self_signed_jwt: enable_self_signed_jwt
98
123
  if credentials.is_a?(::String) || credentials.is_a?(::Hash)
99
124
  credentials = Credentials.new credentials, scope: @config.scope
100
125
  end
101
126
  <%- end -%>
102
-
103
- <%- if service.subclients? -%>
104
- <%- service.subclients.each do |subclient| -%>
105
- @<%= subclient.client_var_name %> = <%= subclient.client_class_name %>.new do |config|
127
+
128
+ @quota_project_id = @config.quota_project
129
+ @quota_project_id ||= credentials.quota_project_id if credentials.respond_to? :quota_project_id
130
+
131
+ <%- service.rest.lro_subclients.each do |subclient| -%>
132
+ @<%= subclient.client_var_name %> = <%= subclient.client_class_docname %>.new do |config|
106
133
  config.credentials = credentials
134
+ config.quota_project = @quota_project_id
107
135
  config.endpoint = @config.endpoint
136
+ config.universe_domain = @config.universe_domain
137
+ <%- if subclient.respond_to?(:bindings_override) && !subclient.bindings_override.empty? -%>
138
+ config.bindings_override = @config.bindings_override
139
+ <%- end -%>
108
140
  end
109
141
 
110
142
  <%- end -%>
143
+ @<%= service.stub_name %> = <%= service.rest.service_stub_name_full %>.new(
144
+ endpoint: @config.endpoint,
145
+ endpoint_template: DEFAULT_ENDPOINT_TEMPLATE,
146
+ universe_domain: @config.universe_domain,
147
+ credentials: credentials,
148
+ logger: @config.logger
149
+ )
150
+
151
+ @<%= service.stub_name %>.logger(stub: true)&.info do |entry|
152
+ entry.set_system_name
153
+ entry.set_service
154
+ entry.message = "Created client for #{entry.service}"
155
+ entry.set_credentials_fields credentials
156
+ entry.set "customEndpoint", @config.endpoint if @config.endpoint
157
+ entry.set "defaultTimeout", @config.timeout if @config.timeout
158
+ entry.set "quotaProject", @quota_project_id if @quota_project_id
159
+ end
160
+ <%- service.rest.mixin_presenters.each do |subclient| -%>
161
+
162
+ @<%= subclient.client_var_name %> = <%= subclient.client_class_docname %>.new do |config|
163
+ config.credentials = credentials
164
+ config.quota_project = @quota_project_id
165
+ config.endpoint = @<%= service.stub_name %>.endpoint
166
+ config.universe_domain = @<%= service.stub_name %>.universe_domain
167
+ <%- if subclient.respond_to?(:bindings_override) && !subclient.bindings_override.empty? -%>
168
+ config.bindings_override = @config.bindings_override
169
+ <%- end -%>
170
+ config.logger = @<%= service.stub_name %>.logger if config.respond_to? :logger=
171
+ end
111
172
  <%- end -%>
112
- @<%= service.stub_name %> = <%= service.rest.service_stub_name_full %>.new endpoint: @config.endpoint, credentials: credentials
113
173
  end
114
174
 
115
- <%- if service.subclients? -%>
116
- <%- service.subclients.each do |subclient| -%>
175
+ <%- if service.rest.subclients? -%>
176
+ <%- service.rest.subclients.each do |subclient| -%>
117
177
  ##
118
178
  # Get the associated client for <%= subclient.service_description %>.
119
179
  #
@@ -123,8 +183,17 @@ class <%= service.rest.client_name %>
123
183
 
124
184
  <%- end -%>
125
185
  <%- end -%>
186
+ ##
187
+ # The logger used for request/response debug logging.
188
+ #
189
+ # @return [Logger]
190
+ #
191
+ def logger
192
+ @<%= service.stub_name %>.logger
193
+ end
194
+
126
195
  # Service calls
127
- <%- service.methods.each do |method| -%>
196
+ <%- service.rest.methods.each do |method| -%>
128
197
 
129
198
  <%= indent_tail render(partial: "service/rest/client/method/def", locals: { method: method }), 2 %>
130
199
  <%- end -%>