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
@@ -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
 
@@ -23,147 +23,32 @@ module Gapic
23
23
  #
24
24
  class MethodRestPresenter
25
25
  # @return [Gapic::Presenters::Method::RestPaginationInfo]
26
- attr_reader :pagination
26
+ attr_reader :compute_pagination
27
+
28
+ attr_reader :http_bindings
29
+
30
+ # @return [String] String representation of this presenter type.
31
+ attr_reader :type
27
32
 
28
33
  ##
29
34
  # @param main_method [Gapic::Presenters::MethodPresenter] the main presenter for this method.
30
35
  # @param api [Gapic::Schema::Api]
31
36
  #
32
37
  def initialize main_method, api
33
- @api = api
34
38
  @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
50
- #
51
- def verb
52
- @http.verb
53
- end
54
-
55
- ##
56
- # @return [Boolean] Whether a method path is present and non-empty
57
- #
58
- def path?
59
- @http.path?
60
- end
61
-
62
- ##
63
- # @return [Boolean] Whether any routing params are present
64
- #
65
- def routing_params?
66
- @http.routing_params?
67
- end
68
-
69
- ##
70
- # @return [Array<String>] The segment key names.
71
- #
72
- def routing_params
73
- @http.routing_params
74
- end
75
-
76
- ##
77
- # @return [Boolean] Whether method has body specified in proto
78
- #
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
- # @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
- #
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"
133
- end
134
-
135
- ##
136
- # @return [Boolean] whether any query string parameters are present
137
- #
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
- # @return [String]
159
- def query_string_params_var_name
160
- query_string_params? ? "query_string_params" : "_query_string_params"
39
+ @http_bindings = main_method.http_bindings
40
+ @compute_pagination =
41
+ if @main_method.service.special_compute_behavior?
42
+ Gapic::Presenters::Method::RestPaginationInfo.new main_method.method, api
43
+ end
44
+ @type = "method"
161
45
  end
162
46
 
163
47
  ##
164
48
  # Name for the GRPC transcoding helper method
165
49
  #
166
50
  # @return [String]
51
+ #
167
52
  def transcoding_helper_name
168
53
  "transcode_#{name}_request"
169
54
  end
@@ -177,6 +62,12 @@ module Gapic
177
62
  @main_method.name
178
63
  end
179
64
 
65
+ # Fully qualified proto name of the method (namespace.PascalCase)
66
+ # @return [String]
67
+ def grpc_full_name
68
+ @main_method.grpc.full_name
69
+ end
70
+
180
71
  ##
181
72
  # Full class name of the request type
182
73
  #
@@ -202,18 +93,37 @@ module Gapic
202
93
  # @return [String]
203
94
  #
204
95
  def doc_response_type
205
- return "::Gapic::Rest::PagedEnumerable<#{pagination.paged_element_doc_type}>" if paged?
96
+ return "::Gapic::Operation" if lro?
97
+ if paged?
98
+ elem_type = compute_pagination&.paged_element_doc_type || @main_method.paged_response_type
99
+ return "::Gapic::Rest::PagedEnumerable<#{elem_type}>"
100
+ end
206
101
  return "::Gapic::GenericLRO::Operation" if nonstandard_lro?
207
102
  return_type
208
103
  end
209
104
 
105
+ ##
106
+ # @return [String] The name of the repeated field in paginated responses
107
+ #
108
+ def paged_response_repeated_field_name
109
+ if compute_pagination
110
+ compute_pagination.response_repeated_field_name
111
+ else
112
+ @main_method.paged_response_repeated_field_name
113
+ end
114
+ end
115
+
210
116
  ##
211
117
  # Whether the REGAPIC method should be rendered as paged
212
118
  #
213
119
  # @return [Boolean]
214
120
  #
215
121
  def paged?
216
- @pagination.paged?
122
+ compute_pagination ? compute_pagination.paged? : @main_method.paged?
123
+ end
124
+
125
+ def lro?
126
+ @main_method.lro?
217
127
  end
218
128
 
219
129
  ##
@@ -225,20 +135,43 @@ module Gapic
225
135
  @main_method.nonstandard_lro?
226
136
  end
227
137
 
228
- private
138
+ ##
139
+ # The presenter for the nonstandard LRO client of the kind this method uses
140
+ #
141
+ # @return [Gapic::Presenters::Service::LroClientPresenter, nil]
142
+ #
143
+ def nonstandard_lro_client
144
+ return unless nonstandard_lro?
145
+ @main_method.service.rest.nonstandard_lros.find { |model| model.service == @main_method.lro.service_full_name }
146
+ end
147
+
148
+ ##
149
+ # Whether this method can be generated in REST clients
150
+ # Only methods with http bindings can be generated, and
151
+ # additionally only unary methods are currently supported.
152
+ #
153
+ # @return [Boolean]
154
+ #
155
+ def can_generate_rest?
156
+ [:normal, :server].include?(@main_method.kind) &&
157
+ http_bindings.first&.verb? &&
158
+ http_bindings.first&.path?
159
+ end
229
160
 
230
161
  ##
231
- # @return [String] A method path or an empty string if not present
162
+ # Whether this method is a server-streaming method
163
+ #
164
+ # @return [Boolean]
232
165
  #
233
- def path
234
- @http.path
166
+ def server_streaming?
167
+ @main_method.server_streaming?
235
168
  end
236
169
 
237
170
  ##
238
- # @return [String] A body specified for the given method in proto or an empty string if not specified
171
+ # @return [Boolean] Whether the method is marked as deprecated.
239
172
  #
240
- def body
241
- @http.body
173
+ def is_deprecated?
174
+ @main_method.is_deprecated?
242
175
  end
243
176
  end
244
177
  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
@@ -15,7 +15,6 @@
15
15
  # limitations under the License.
16
16
 
17
17
  require "gapic/path_pattern"
18
- require "active_support/inflector"
19
18
 
20
19
  module Gapic
21
20
  module Presenters
@@ -58,12 +57,10 @@ module Gapic
58
57
  #
59
58
  class PatternPresenter
60
59
  def initialize pattern_string
61
- @pattern = pattern_string
62
60
  @parsed_pattern = Gapic::PathPattern.parse pattern_string
63
61
  @path_string = build_path_string
64
62
  end
65
63
 
66
- attr_reader :pattern
67
64
  attr_reader :path_string
68
65
 
69
66
  def pattern_template
@@ -78,6 +75,11 @@ module Gapic
78
75
  @parsed_pattern.arguments
79
76
  end
80
77
 
78
+ # @return [String] The conflicting argument name escaped with local binding.
79
+ def escape_argument arg
80
+ Gapic::RubyInfo.keywords.include?(arg) ? "binding.local_variable_get(:#{arg})" : arg
81
+ end
82
+
81
83
  def formal_arguments
82
84
  @parsed_pattern.arguments.map { |name| "#{name}:" }.join ", "
83
85
  end
@@ -103,6 +105,10 @@ module Gapic
103
105
  end.join "/"
104
106
  end
105
107
 
108
+ def pattern
109
+ @parsed_pattern.path_pattern
110
+ end
111
+
106
112
  private
107
113
 
108
114
  def build_path_string