gapic-generator 0.11.0 → 0.45.2

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 +303 -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 +24 -10
  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/{rest_pagination_info.rb → compute_pagination_info.rb} +31 -20
  30. data/lib/gapic/presenters/method/http_binding_presenter.rb +128 -0
  31. data/lib/gapic/presenters/method_presenter.rb +109 -35
  32. data/lib/gapic/presenters/method_rest_presenter.rb +83 -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 +154 -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 +199 -274
  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
@@ -38,22 +38,39 @@ module Gapic
38
38
  # @return [Gapic::Model::Method::HttpAnnotation]
39
39
  attr_accessor :http
40
40
 
41
+ # @return [Array<Gapic::Presenters::Method::HttpBindingsPresenter>]
42
+ attr_accessor :http_bindings
43
+
41
44
  # @return [Gapic::Model::Method::AipLro, Gapic::Model::Method::NonStandardLro, Gapic::Model::Method::NoLro]
42
45
  attr_accessor :lro
43
46
 
47
+ # @return [String] String representation of this presenter type.
48
+ attr_reader :type
49
+
44
50
  ##
45
51
  # @param service_presenter [Gapic::Presenters::ServicePresenter]
46
52
  # @param api [Gapic::Schema::Api]
47
53
  # @param method [Gapic::Schema::Method]
54
+ #
48
55
  def initialize service_presenter, api, method
49
56
  @service_presenter = service_presenter
50
57
  @api = api
51
58
  @method = method
52
- @http = Gapic::Model::Method::HttpAnnotation.new @method
53
- @routing = Gapic::Model::Method::Routing.new @method.routing, http
54
- @lro = Gapic::Model::Method.parse_lro @method, api
59
+ @type = "method"
60
+
61
+ # Service config override should only happen for Operations.
62
+ # For the main services we expect service config overrides to be rolled into the protos by the publisher.
63
+ # For all other mixins, since we do not generate them for the service,
64
+ # the overrides should get configured separately.
65
+ is_lro = @service_presenter.address.join(".") == Gapic::Model::Mixins::LRO_SERVICE
66
+ service_config_override_http = is_lro ? @api.service_config : nil
67
+ @http = Gapic::Model::Method::HttpAnnotation.create_with_override @method, service_config_override_http
68
+
69
+ @http_bindings = @http.bindings.map { |binding| Gapic::Presenters::Method::HttpBindingPresenter.new binding }
70
+ @routing = Gapic::Model::Method::Routing.new @method.routing, @http
71
+ @lro = Gapic::Model::Method.parse_lro @method, @api
55
72
 
56
- @rest = MethodRestPresenter.new self, api
73
+ @rest = MethodRestPresenter.new self, @api
57
74
  end
58
75
 
59
76
  ##
@@ -64,10 +81,21 @@ module Gapic
64
81
  end
65
82
 
66
83
  ##
84
+ # Return the "primary" snippet for this method. This should be used for
85
+ # inline snippets.
67
86
  # @return [Gapic::Presenters::SnippetPresenter]
68
87
  #
69
- def snippet
70
- SnippetPresenter.new self, @api
88
+ def snippet transport: nil
89
+ configs = @api.snippet_configs_for @method.full_name
90
+ SnippetPresenter.new self, @api, config: configs.first, transport: transport
91
+ end
92
+
93
+ ##
94
+ # @return [Array<Gapic::Presenters::SnippetPresenter>]
95
+ #
96
+ def all_snippets transport: nil
97
+ configs = @api.snippet_configs_for(@method.full_name) + [nil]
98
+ configs.map { |config| SnippetPresenter.new self, @api, config: config, transport: transport }
71
99
  end
72
100
 
73
101
  def generate_yardoc_snippets?
@@ -82,6 +110,18 @@ module Gapic
82
110
  end
83
111
  end
84
112
 
113
+ # Proto name of the method (PascalCase)
114
+ # @return [String]
115
+ def grpc_name
116
+ @method.name
117
+ end
118
+
119
+ # Fully qualified proto name of the method (namespace.PascalCase)
120
+ # @return [String]
121
+ def grpc_full_name
122
+ @method.full_name
123
+ end
124
+
85
125
  def kind
86
126
  if client_streaming?
87
127
  if server_streaming?
@@ -96,8 +136,15 @@ module Gapic
96
136
  end
97
137
  end
98
138
 
99
- def doc_description
100
- @method.docs_leading_comments
139
+ ##
140
+ # The description as it should appear in YARD docs.
141
+ #
142
+ # @param transport [:grpc,:rest] Whether xref links should go to REST or
143
+ # gRPC client classes. Uses the default transport if not provided.
144
+ # @return [String]
145
+ #
146
+ def doc_description transport: nil
147
+ @method.docs_leading_comments transport: transport
101
148
  end
102
149
 
103
150
  def doc_response_type
@@ -114,7 +161,7 @@ module Gapic
114
161
  end
115
162
 
116
163
  ##
117
- # @return [Boolean]
164
+ # @return [Boolean] Whether the method is marked as deprecated.
118
165
  #
119
166
  def is_deprecated?
120
167
  @method.is_deprecated?
@@ -125,6 +172,14 @@ module Gapic
125
172
  arguments.map { |arg| FieldPresenter.new @api, @method.input, arg }
126
173
  end
127
174
 
175
+ # @return [Array<Gapic::Presenters::FieldPresenter>] List of auto populated fields.
176
+ def auto_populated_fields
177
+ field_names_to_filter = @api.api_metadata.auto_populated_fields_by_method_name[name] || []
178
+ @method.input.fields.filter_map do |field|
179
+ FieldPresenter.new @api, @method.input, field if field_names_to_filter.include? field.name
180
+ end
181
+ end
182
+
128
183
  def fields
129
184
  @method.input.fields.map { |field| FieldPresenter.new @api, @method.input, field }
130
185
  end
@@ -168,25 +223,20 @@ module Gapic
168
223
  "Access the result along with the RPC operation"
169
224
  end
170
225
 
226
+ # Type for MethodPresenter#yield_params
227
+ YieldParams = Struct.new :name, :doc_types
228
+
171
229
  def yield_params
172
230
  if lro?
173
- return [
174
- OpenStruct.new(
175
- name: "operation",
176
- doc_types: "::Gapic::Operation"
177
- )
231
+ [
232
+ YieldParams.new("operation", "::Gapic::Operation")
233
+ ]
234
+ else
235
+ [
236
+ YieldParams.new("result", return_type),
237
+ YieldParams.new("operation", "::GRPC::ActiveCall::Operation")
178
238
  ]
179
239
  end
180
- [
181
- OpenStruct.new(
182
- name: "result",
183
- doc_types: return_type
184
- ),
185
- OpenStruct.new(
186
- name: "operation",
187
- doc_types: "::GRPC::ActiveCall::Operation"
188
- )
189
- ]
190
240
  end
191
241
 
192
242
  # @api.incode samples and sample_configs are yaml configuration files such as
@@ -256,17 +306,28 @@ module Gapic
256
306
  return nil unless paged_response? @method.output
257
307
 
258
308
  repeated_field = @method.output.fields.find do |f|
259
- f.label == Google::Protobuf::FieldDescriptorProto::Label::LABEL_REPEATED &&
260
- f.type == Google::Protobuf::FieldDescriptorProto::Type::TYPE_MESSAGE
309
+ f.label == :LABEL_REPEATED && f.type == :TYPE_MESSAGE
261
310
  end
262
311
  message_ruby_type repeated_field.message
263
312
  end
264
313
 
314
+ ##
315
+ # @return [String] The name of the repeated field in paginated responses
316
+ #
317
+ def paged_response_repeated_field_name
318
+ return nil unless paged_response? @method.output
319
+
320
+ repeated_field = @method.output.fields.find do |f|
321
+ f.label == :LABEL_REPEATED && f.type == :TYPE_MESSAGE
322
+ end
323
+ repeated_field.name
324
+ end
325
+
265
326
  ##
266
327
  # @return [Array<String>] The segment key names.
267
328
  #
268
329
  def routing_params
269
- rest.routing_params
330
+ @http.routing_params
270
331
  end
271
332
 
272
333
  ##
@@ -304,12 +365,25 @@ module Gapic
304
365
  { methods: [name] }
305
366
  end
306
367
 
368
+ ##
369
+ # Whether this method can be generated in REST clients
370
+ # Only methods with http bindings can be generated, and
371
+ # additionally only unary methods are currently supported.
372
+ #
373
+ # @return [Boolean]
374
+ #
375
+ def can_generate_rest?
376
+ rest.can_generate_rest?
377
+ end
378
+
307
379
  protected
308
380
 
309
381
  def message_ruby_type message
310
382
  ruby_namespace @api, message.address.join(".")
311
383
  end
312
384
 
385
+ # @private
386
+ # BUG: This code seems to be dead
313
387
  def doc_types_for arg
314
388
  if arg.message?
315
389
  "#{message_ruby_type arg.message}, Hash"
@@ -328,12 +402,16 @@ module Gapic
328
402
  end
329
403
  end
330
404
 
405
+ # @private
406
+ # BUG: This code seems to be dead
331
407
  def doc_desc_for arg
332
408
  return nil if arg.docs.leading_comments.empty?
333
409
 
334
410
  arg.docs.leading_comments
335
411
  end
336
412
 
413
+ # @private
414
+ # BUG: This code seems to be dead
337
415
  def default_value_for arg
338
416
  if arg.message?
339
417
  "{}"
@@ -355,14 +433,11 @@ module Gapic
355
433
 
356
434
  def paged_request? request
357
435
  page_token = request.fields.find do |f|
358
- f.name == "page_token" && f.type == Google::Protobuf::FieldDescriptorProto::Type::TYPE_STRING
436
+ f.name == "page_token" && f.type == :TYPE_STRING
359
437
  end
360
438
  return false if page_token.nil?
361
439
 
362
- page_size_types = [
363
- Google::Protobuf::FieldDescriptorProto::Type::TYPE_INT32,
364
- Google::Protobuf::FieldDescriptorProto::Type::TYPE_INT64
365
- ]
440
+ page_size_types = [:TYPE_INT32, :TYPE_INT64]
366
441
  page_size = request.fields.find do |f|
367
442
  f.name == "page_size" && page_size_types.include?(f.type)
368
443
  end
@@ -373,13 +448,12 @@ module Gapic
373
448
 
374
449
  def paged_response? response
375
450
  next_page_token = response.fields.find do |f|
376
- f.name == "next_page_token" && f.type == Google::Protobuf::FieldDescriptorProto::Type::TYPE_STRING
451
+ f.name == "next_page_token" && f.type == :TYPE_STRING
377
452
  end
378
453
  return false if next_page_token.nil?
379
454
 
380
455
  repeated_field = response.fields.find do |f|
381
- f.label == Google::Protobuf::FieldDescriptorProto::Label::LABEL_REPEATED &&
382
- f.type == Google::Protobuf::FieldDescriptorProto::Type::TYPE_MESSAGE
456
+ f.label == :LABEL_REPEATED && f.type == :TYPE_MESSAGE
383
457
  end
384
458
  return false if repeated_field.nil?
385
459
 
@@ -14,7 +14,7 @@
14
14
  # See the License for the specific language governing permissions and
15
15
  # limitations under the License.
16
16
 
17
- require "gapic/presenters/method/rest_pagination_info"
17
+ require "gapic/presenters/method/compute_pagination_info"
18
18
 
19
19
  module Gapic
20
20
  module Presenters
@@ -22,159 +22,58 @@ module Gapic
22
22
  # A presenter for rpc methods (REST submethods)
23
23
  #
24
24
  class MethodRestPresenter
25
- # @return [Gapic::Presenters::Method::RestPaginationInfo]
26
- attr_reader :pagination
25
+ # @return [Gapic::Presenters::Method::ComputePaginationInfo] Special pagination presenter for Compute
26
+ attr_reader :compute_pagination
27
27
 
28
28
  ##
29
- # @param main_method [Gapic::Presenters::MethodPresenter] the main presenter for this method.
30
- # @param api [Gapic::Schema::Api]
31
- #
32
- def initialize main_method, api
33
- @api = api
34
- @main_method = main_method
35
- @proto_method = main_method.method
36
- @http = main_method.http
37
-
38
- @pagination = Gapic::Presenters::Method::RestPaginationInfo.new @proto_method, api
39
- end
40
-
41
- ##
42
- # @return [Boolean] Whether a http verb is present for this method
43
- #
44
- def verb?
45
- @http.verb?
46
- end
47
-
48
- ##
49
- # @return [Symbol] a http verb for this method
29
+ # Presenters for HTTP bindings, used to check whether this method should be generated in REST client
50
30
  #
51
- def verb
52
- @http.verb
53
- end
54
-
55
- ##
56
- # @return [Boolean] Whether a method path is present and non-empty
31
+ # @return [Array<Gapic::Presenters::Method::HttpBindingsPresenter>]
57
32
  #
58
- def path?
59
- @http.path?
60
- end
33
+ attr_reader :http_bindings
61
34
 
62
- ##
63
- # @return [Boolean] Whether any routing params are present
64
- #
65
- def routing_params?
66
- @http.routing_params?
67
- end
35
+ # @return [String] String representation of this presenter type.
36
+ attr_reader :type
68
37
 
69
38
  ##
70
- # @return [Array<String>] The segment key names.
39
+ # @param main_method [Gapic::Presenters::MethodPresenter] the main presenter for this method.
40
+ # @param api [Gapic::Schema::Api]
71
41
  #
72
- def routing_params
73
- @http.routing_params
42
+ def initialize main_method, api
43
+ @main_method = main_method
44
+ @http_bindings = main_method.http_bindings
45
+ @compute_pagination =
46
+ if @main_method.service.special_compute_behavior?
47
+ Gapic::Presenters::Method::ComputePaginationInfo.new main_method.method, api
48
+ end
49
+ @type = "method"
74
50
  end
75
51
 
76
52
  ##
77
- # @return [Boolean] Whether method has body specified in proto
53
+ # Name for the GRPC transcoding helper method
78
54
  #
79
- def body?
80
- @http.body?
81
- end
82
-
83
- ##
84
- # Performs a limited version of grpc transcoding to create a string that will interpolate
85
- # the values from the request object to create a request URI at runtime.
86
- # Currently only supports "value" into "request_object.value"
87
- # @param [String] request_obj_name the name of the request object for the interpolation
88
- # defaults to "request_pb"
89
- # @return [String] A string to interpolate values from the request object into URI
90
- #
91
- def uri_interpolated request_obj_name = "request_pb"
92
- return path unless routing_params?
93
-
94
- routing_params.reduce path do |uri, param|
95
- param_esc = Regexp.escape param
96
- uri.gsub(/{#{param_esc}[^}]*}/, "\#{#{request_obj_name}.#{param}}")
97
- end
98
- end
99
-
100
- ##
101
- # Name of the variable to use for storing the body result of the transcoding call
102
- # Normally "body" but use "_body" for discarding the result for
103
- # the calls that do not send body
104
55
  # @return [String]
105
- def body_var_name
106
- body? ? "body" : "_body"
107
- end
108
-
109
- ##
110
- # @return [Boolean] True if body contains full request object (`*` in the annotation), false otherwise
111
- #
112
- def body_is_request_object?
113
- body == "*"
114
- end
115
-
116
- ##
117
- # Performs a limited version of grpc transcoding to create a string that will interpolate
118
- # the values from the request object to create a request body at runtime.
119
- # Currently only supports either "*" for "the whole request object" or
120
- # "value" for "request_object.value"
121
- #
122
- # @param [String] request_obj_name the name of the request object for the interpolation
123
- # defaults to "request_pb"
124
- #
125
- # @return [String] A string to interpolate values from the request object into body
126
56
  #
127
- def body_interpolated request_obj_name = "request_pb"
128
- return "\"\"" unless body?
129
-
130
- return "#{request_obj_name}.to_json" if body_is_request_object?
131
-
132
- "#{request_obj_name}.#{body}.to_json"
57
+ def transcoding_helper_name
58
+ "transcode_#{name}_request"
133
59
  end
134
60
 
135
61
  ##
136
- # @return [Boolean] whether any query string parameters are present
62
+ # Method's name
137
63
  #
138
- def query_string_params?
139
- query_string_params.any?
140
- end
141
-
142
- # @return [Array<String>]
143
- def query_string_params
144
- return [] if body_is_request_object?
145
-
146
- routing_params_set = routing_params.to_set
147
- @main_method.arguments
148
- .reject { |arg| routing_params_set.include? arg.name }
149
- .reject { |arg| body == arg.name }
150
- .reject(&:message?)
151
- .reject { |arg| arg.default_value_for_type.nil? }
152
- end
153
-
154
- ##
155
- # Name of the variable to use for storing the query_string_params result of the transcoding call
156
- # Normally "query_string_params" but use "_query_string_params" for discarding the result for
157
- # the calls that do not sent query_string_params
158
64
  # @return [String]
159
- def query_string_params_var_name
160
- query_string_params? ? "query_string_params" : "_query_string_params"
161
- end
162
-
163
- ##
164
- # Name for the GRPC transcoding helper method
165
65
  #
166
- # @return [String]
167
- def transcoding_helper_name
168
- "transcode_#{name}_request"
66
+ def name
67
+ @main_method.name
169
68
  end
170
69
 
171
70
  ##
172
- # Method name
71
+ # Fully qualified proto name of the method (namespace.PascalCase)
173
72
  #
174
73
  # @return [String]
175
74
  #
176
- def name
177
- @main_method.name
75
+ def grpc_full_name
76
+ @main_method.grpc.full_name
178
77
  end
179
78
 
180
79
  ##
@@ -202,18 +101,40 @@ module Gapic
202
101
  # @return [String]
203
102
  #
204
103
  def doc_response_type
205
- return "::Gapic::Rest::PagedEnumerable<#{pagination.paged_element_doc_type}>" if paged?
104
+ return "::Gapic::Operation" if lro?
105
+ if paged?
106
+ elem_type = compute_pagination&.paged_element_doc_type || @main_method.paged_response_type
107
+ return "::Gapic::Rest::PagedEnumerable<#{elem_type}>"
108
+ end
206
109
  return "::Gapic::GenericLRO::Operation" if nonstandard_lro?
207
110
  return_type
208
111
  end
209
112
 
113
+ ##
114
+ # Name of the repeated field in paginated responses
115
+ # For Compute the pagination is different from GRPC and cannot be looked up in GRPC method presenter
116
+ #
117
+ # @return [String]
118
+ #
119
+ def paged_response_repeated_field_name
120
+ if compute_pagination
121
+ compute_pagination.response_repeated_field_name
122
+ else
123
+ @main_method.paged_response_repeated_field_name
124
+ end
125
+ end
126
+
210
127
  ##
211
128
  # Whether the REGAPIC method should be rendered as paged
212
129
  #
213
130
  # @return [Boolean]
214
131
  #
215
132
  def paged?
216
- @pagination.paged?
133
+ compute_pagination ? compute_pagination.paged? : @main_method.paged?
134
+ end
135
+
136
+ def lro?
137
+ @main_method.lro?
217
138
  end
218
139
 
219
140
  ##
@@ -225,20 +146,45 @@ module Gapic
225
146
  @main_method.nonstandard_lro?
226
147
  end
227
148
 
228
- private
149
+ ##
150
+ # The presenter for the nonstandard LRO client of the kind this method uses
151
+ #
152
+ # @return [Gapic::Presenters::Service::LroClientPresenter, nil]
153
+ #
154
+ def nonstandard_lro_client
155
+ return unless nonstandard_lro?
156
+ @main_method.service.rest.nonstandard_lros.find { |model| model.service == @main_method.lro.service_full_name }
157
+ end
229
158
 
230
159
  ##
231
- # @return [String] A method path or an empty string if not present
160
+ # Whether this method can be generated in REST clients
161
+ # Only methods with http bindings can be generated, and
162
+ # additionally only unary methods are currently supported.
232
163
  #
233
- def path
234
- @http.path
164
+ # @return [Boolean]
165
+ #
166
+ def can_generate_rest?
167
+ [:normal, :server].include?(@main_method.kind) &&
168
+ http_bindings.first&.verb? &&
169
+ http_bindings.first&.path?
170
+ end
171
+
172
+ ##
173
+ # Whether this method is a server-streaming method
174
+ #
175
+ # @return [Boolean]
176
+ #
177
+ def server_streaming?
178
+ @main_method.server_streaming?
235
179
  end
236
180
 
237
181
  ##
238
- # @return [String] A body specified for the given method in proto or an empty string if not specified
182
+ # Whether the method is marked as deprecated.
183
+ #
184
+ # @return [Boolean]
239
185
  #
240
- def body
241
- @http.body
186
+ def is_deprecated?
187
+ @main_method.is_deprecated?
242
188
  end
243
189
  end
244
190
  end
@@ -61,16 +61,68 @@ module Gapic
61
61
  def services
62
62
  @services ||= begin
63
63
  files = @api.generate_files.select { |f| f.package == @package }
64
- services = files.map(&:services).flatten
64
+ service_list = files.map(&:services).flatten
65
+ mixin_service_names = gem.mixins_model.mixin_services
66
+ service_list.delete_if { |s| mixin_service_names.include? s.full_name }
65
67
  # Omit common services in this package. Common service clients do not
66
68
  # go into their own package.
67
- normal_services = services.select { |s| @api.delegate_service_for(s).nil? }
69
+ normal_services = service_list.select { |s| @api.delegate_service_for(s).nil? }
68
70
  # But include common services that delegate to normal services in this package.
69
71
  common_services = normal_services.flat_map { |s| @api.common_services_for s }
70
72
  (normal_services + common_services).map { |s| ServicePresenter.new @gem_presenter, @api, s }
71
73
  end
72
74
  end
73
75
 
76
+ ##
77
+ # @return [Boolean] Whether the generation of REST clients is requested
78
+ # and can be done because at least one method has rest bindings.
79
+ #
80
+ def generate_rest_clients?
81
+ @api.generate_rest_clients? && !first_service_with_rest.nil?
82
+ end
83
+
84
+ ##
85
+ # @return [Boolean] Whether the generation of gRPC clients is requested
86
+ #
87
+ def generate_grpc_clients?
88
+ @api.generate_grpc_clients?
89
+ end
90
+
91
+ ##
92
+ # First service with REST bindings.
93
+ # @return [Gapic::Presenters::ServicePresenter, nil]
94
+ #
95
+ def first_service_with_rest
96
+ services.find(&:methods_rest_bindings?)
97
+ end
98
+
99
+ ##
100
+ # Whether there are mixin services that this package has http binding overrides for.
101
+ #
102
+ # @return [Boolean]
103
+ #
104
+ def mixin_binding_overrides?
105
+ first_service_with_rest&.rest&.mixin_binding_overrides? || false
106
+ end
107
+
108
+ ##
109
+ # Requires path for the mixin binding overrides file
110
+ #
111
+ # @return [String]
112
+ #
113
+ def mixin_binding_overrides_require
114
+ "#{ruby_file_path @api, namespace}/bindings_override"
115
+ end
116
+
117
+ ##
118
+ # File path for the mixin binding overrides file
119
+ #
120
+ # @return [String]
121
+ #
122
+ def mixin_binding_overrides_file_path
123
+ "#{mixin_binding_overrides_require}.rb"
124
+ end
125
+
74
126
  def address
75
127
  @package.split "."
76
128
  end
@@ -79,10 +131,18 @@ module Gapic
79
131
  ruby_file_path @api, namespace
80
132
  end
81
133
 
134
+ def package_rest_require
135
+ "#{ruby_file_path @api, namespace}/rest"
136
+ end
137
+
82
138
  def package_file_path
83
139
  "#{package_require}.rb"
84
140
  end
85
141
 
142
+ def package_rest_file_path
143
+ "#{package_rest_require}.rb"
144
+ end
145
+
86
146
  def package_directory_name
87
147
  package_require.split("/").last
88
148
  end
@@ -117,24 +177,9 @@ module Gapic
117
177
  language: "ruby",
118
178
  protoPackage: name,
119
179
  libraryPackage: namespace,
120
- services: services.map { |s| [s.grpc_service_name, s.drift_manifest] }.to_h
180
+ services: services.to_h { |s| [s.grpc_service_name, s.drift_manifest] }
121
181
  }
122
182
  end
123
-
124
- ##
125
- # How comments in the generated libraries refer to the GRPC client
126
- # if no REST code is generated, this should just be "client",
127
- # if REST code is generated, this should be disambiguated into the "GRPC client"
128
- #
129
- # Since we are using first service for an indication of whether package generates
130
- # REST code, it's OK to defer this to the first service as well.
131
- # For packages with no services the value of this does not really matter as
132
- # no client generation docs will be generated.
133
- #
134
- # @return [String]
135
- def grpc_client_designation
136
- services.first&.grpc_client_designation || ""
137
- end
138
183
  end
139
184
  end
140
185
  end