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
@@ -16,6 +16,6 @@
16
16
 
17
17
  module Gapic
18
18
  module Generator
19
- VERSION = "0.11.0"
19
+ VERSION = "0.45.1"
20
20
  end
21
21
  end
@@ -16,7 +16,7 @@
16
16
 
17
17
  require "gapic/file_formatter"
18
18
  require "action_controller"
19
- require "google/protobuf/compiler/plugin.pb"
19
+ require "google/protobuf/compiler/plugin_pb"
20
20
  require "tempfile"
21
21
 
22
22
  module Gapic
@@ -46,8 +46,10 @@ module Gapic
46
46
  template_path = File.expand_path template_path
47
47
  helpers_path = File.join template_path, "helpers"
48
48
 
49
- # Configure Dependencies to know how to load helpers
50
- ActiveSupport::Dependencies.autoload_paths.prepend helpers_path
49
+ # For some reason autoload doesn't seem to be working for helpers in Rails 8:
50
+ # ActiveSupport::Dependencies.autoload_paths.prepend helpers_path
51
+ # So instead we eagerly load helpers
52
+ Dir.glob("#{helpers_path}/*_helper.rb") { |file| require file }
51
53
 
52
54
  # Configure the controller to know about the templates and helpers
53
55
  controller.prepend_view_path template_path
@@ -66,7 +68,7 @@ module Gapic
66
68
  template: template, formats: :text, locals: args
67
69
  )
68
70
  Google::Protobuf::Compiler::CodeGeneratorResponse::File.new(
69
- name: filename, content: content
71
+ name: filename, content: String.new(content)
70
72
  )
71
73
  end
72
74
  alias_method :g, :generate_file
@@ -17,6 +17,7 @@
17
17
  require "gapic/generators/base_generator"
18
18
  require "gapic/generators/default_generator_parameters"
19
19
  require "gapic/presenters"
20
+ require "gapic/package_snippets"
20
21
 
21
22
  module Gapic
22
23
  module Generators
@@ -47,57 +48,92 @@ module Gapic
47
48
 
48
49
  gem = gem_presenter || Gapic::Presenters.gem_presenter(@api)
49
50
 
51
+ if @api.generate_rest_clients? && gem.packages.find(&:generate_rest_clients?).nil?
52
+ raise "Rest transport specified but no services have HTTP bindings"
53
+ end
54
+
50
55
  gem.packages.each do |package|
56
+ package_snippets = PackageSnippets.new snippet_dir: "snippets",
57
+ proto_package: package.name,
58
+ gem_name: gem.name
59
+
51
60
  # Package level files
52
- files << g("package.erb", "lib/#{package.package_file_path}", package: package)
61
+ files << g("package", "lib/#{package.package_file_path}", package: package)
62
+ files << g("package_rest", "lib/#{package.package_rest_file_path}", package: package) if package.generate_rest_clients?
63
+ files << g("binding_override", "lib/#{package.mixin_binding_overrides_file_path}", package: package) if package.mixin_binding_overrides? && package.generate_rest_clients?
53
64
 
54
65
  package.services.each do |service|
66
+ should_generate_grpc = service.generate_grpc_clients?
67
+ should_generate_rest = service.generate_rest_clients?
68
+
55
69
  # Service level files
56
- files << g("service.erb", "lib/#{service.service_file_path}", service: service)
57
- files << g("service/rest.erb", "lib/#{service.rest.service_rest_file_path}", service: service) if @api.generate_rest_clients? and service.methods_rest_bindings?
58
- files << g("service/client.erb", "lib/#{service.client_file_path}", service: service) unless @api.generate_rest_clients?
59
- files << g("service/credentials.erb", "lib/#{service.credentials_file_path}", service: service) unless gem.generic_endpoint?
60
- files << g("service/paths.erb", "lib/#{service.paths_file_path}", service: service) if service.paths?
61
- files << g("service/operations.erb", "lib/#{service.operations_file_path}", service: service) if service.lro? && !@api.generate_rest_clients?
62
- files << g("service/nonstandard_lro.erb", "lib/#{service.nonstandard_lro_file_path}", service: service) if service.nonstandard_lro_provider? && !service.methods_rest_bindings?
63
- files << g("service/nonstandard_lro.erb", "lib/#{service.rest.nonstandard_lro_file_path}", service: service) if service.nonstandard_lro_provider? && service.methods_rest_bindings?
64
- files << g("service/rest/client.erb", "lib/#{service.rest.client_file_path}", service: service) if @api.generate_rest_clients? and service.methods_rest_bindings?
65
- files << g("service/rest/service_stub.erb", "lib/#{service.rest.service_stub_file_path}", service: service) if @api.generate_rest_clients? and service.methods_rest_bindings?
66
- files << g("service/rest/test/client.erb", "test/#{service.rest.test_client_file_path}", service: service) if @api.generate_rest_clients? and service.methods_rest_bindings?
67
- files << g("service/test/client.erb", "test/#{service.test_client_file_path}", service: service) unless @api.generate_rest_clients?
68
- files << g("service/test/client_paths.erb", "test/#{service.test_paths_file_path}", service: service) if service.paths?
69
- files << g("service/test/client_operations.erb", "test/#{service.test_client_operations_file_path}", service: service) if service.lro? && !@api.generate_rest_clients?
70
+ files << g("service", "lib/#{service.service_file_path}", service: service)
71
+ files << g("service/credentials", "lib/#{service.credentials_file_path}", service: service) unless gem.generic_endpoint?
72
+ files << g("service/paths", "lib/#{service.paths_file_path}", service: service) if service.paths?
73
+
74
+ # Rest module file
75
+ files << g("service/rest", "lib/#{service.rest.service_rest_file_path}", service: service) if should_generate_rest
76
+
77
+ # client.rb
78
+ files << g("service/client", "lib/#{service.client_file_path}", service: service) if should_generate_grpc
79
+ files << g("service/rest/client", "lib/#{service.rest.client_file_path}", service: service) if should_generate_rest
80
+
81
+ # Standard LRO shim
82
+ files << g("service/operations", "lib/#{service.operations_file_path}", service: service) if service.lro? && should_generate_grpc
83
+ files << g("service/rest/operations", "lib/#{service.rest.operations_file_path}", service: service) if service.rest.lro? && should_generate_rest
84
+
85
+ # Nonstandard LRO shim
86
+ files << g("service/nonstandard_lro", "lib/#{service.nonstandard_lro_file_path}", service: service) if service.nonstandard_lro_provider? && should_generate_grpc
87
+ files << g("service/rest/nonstandard_lro", "lib/#{service.rest.nonstandard_lro_file_path}", service: service) if service.rest.nonstandard_lro_provider? && should_generate_rest
88
+
89
+ # Rest-only `service.stub` file
90
+ files << g("service/rest/service_stub", "lib/#{service.rest.service_stub_file_path}", service: service) if should_generate_rest
91
+
92
+ # Unit tests for `client.rb`
93
+ files << g("service/test/client", "test/#{service.test_client_file_path}", service: service) if should_generate_grpc
94
+ files << g("service/rest/test/client", "test/#{service.rest.test_client_file_path}", service: service) if should_generate_rest
95
+
96
+ # Unit tests for `paths.rb`
97
+ files << g("service/test/client_paths", "test/#{service.test_paths_file_path}", service: service) if service.paths? && should_generate_grpc
98
+
99
+ # Unit tests for standard LRO shim
100
+ files << g("service/test/client_operations", "test/#{service.test_client_operations_file_path}", service: service) if service.lro? && should_generate_grpc
70
101
 
71
102
  if @api.generate_standalone_snippets?
72
103
  service.methods.each do |method|
73
- snippet = method.snippet
74
- files << g("snippets/standalone.erb", "snippets/#{snippet.snippet_file_path}", snippet: snippet)
104
+ method.all_snippets.each do |snippet|
105
+ snippet_file = g("snippets/standalone", "snippets/#{snippet.snippet_file_path}", snippet: snippet)
106
+ package_snippets.add(method_presenter: method, snippet_presenter: snippet, snippet_file: snippet_file)
107
+ end
75
108
  end
76
109
  end
77
110
  end
111
+
112
+ files += package_snippets.files if @api.generate_standalone_snippets?
78
113
  end
79
114
 
80
115
  # Gem level files
81
- files << g("gem/gitignore.erb", ".gitignore", gem: gem)
82
- files << g("gem/version.erb", "lib/#{gem.version_file_path}", gem: gem)
83
- files << g("gem/test_helper.erb", "test/helper.rb", gem: gem)
84
- files << g("gem/gemspec.erb", "#{gem.name}.gemspec", gem: gem)
85
- files << g("gem/gemfile.erb", "Gemfile", gem: gem)
86
- files << g("gem/rakefile.erb", "Rakefile", gem: gem)
87
- files << g("gem/readme.erb", "README.md", gem: gem)
88
- files << g("gem/changelog.erb", "CHANGELOG.md", gem: gem)
89
- files << g("gem/rubocop.erb", ".rubocop.yml", gem: gem)
90
- files << g("gem/yardopts.erb", ".yardopts", gem: gem)
91
- files << g("gem/license.erb", "LICENSE.md", gem: gem)
92
- files << g("gem/entrypoint.erb", "lib/#{gem.name}.rb", gem: gem)
93
- files << g("gem/gapic_metadata_json.erb", "gapic_metadata.json", gem: gem) if @api.generate_metadata
94
-
95
- files << g("snippets/gemfile.erb", "snippets/Gemfile", gem: gem) if @api.generate_standalone_snippets?
116
+ files << g("gem/gitignore", ".gitignore", gem: gem)
117
+ files << g("gem/version", "lib/#{gem.version_file_path}", gem: gem)
118
+ files << g("gem/test_helper", "test/helper.rb", gem: gem)
119
+ files << g("gem/gemspec", "#{gem.name}.gemspec", gem: gem)
120
+ files << g("gem/gemfile", "Gemfile", gem: gem)
121
+ files << g("gem/rakefile", "Rakefile", gem: gem)
122
+ files << g("gem/readme", "README.md", gem: gem)
123
+ files << g("gem/changelog", "CHANGELOG.md", gem: gem)
124
+ files << g("gem/rubocop", ".rubocop.yml", gem: gem)
125
+ files << g("gem/toys", ".toys.rb", gem: gem)
126
+ files << g("gem/yardopts", ".yardopts", gem: gem)
127
+ files << g("gem/license", "LICENSE.md", gem: gem)
128
+ files << g("gem/entrypoint", "lib/#{gem.name}.rb", gem: gem)
129
+ files << g("gem/gapic_metadata_json", "gapic_metadata.json", gem: gem) if @api.generate_metadata
130
+
131
+ files << g("snippets/gemfile", "snippets/Gemfile", gem: gem) if @api.generate_standalone_snippets?
96
132
 
97
133
  gem.proto_files.each do |proto_file|
98
- files << g("proto_docs/proto_file.erb", "proto_docs/#{proto_file.docs_file_path}", file: proto_file)
134
+ files << g("proto_docs/proto_file", "proto_docs/#{proto_file.docs_file_path}", file: proto_file)
99
135
  end
100
- files << g("proto_docs/readme.erb", "proto_docs/README.md", gem: gem)
136
+ files << g("proto_docs/readme", "proto_docs/README.md", gem: gem)
101
137
 
102
138
  format_files files
103
139
 
@@ -24,6 +24,8 @@ module Gapic
24
24
  ":gem.:free_tier",
25
25
  ":gem.:yard_strict",
26
26
  ":gem.:generic_endpoint",
27
+ ":gem.:is_cloud_product",
28
+ ":gem.:rest_numeric_enums",
27
29
  ":generate_metadata",
28
30
  ":generate_standalone_snippets",
29
31
  ":generate_yardoc_snippets"
@@ -47,7 +49,8 @@ module Gapic
47
49
  ":defaults.:service.:default_host",
48
50
  "grpc_service_config",
49
51
  ":service_yaml",
50
- ":overrides.:wrapper_gem_name"
52
+ ":overrides.:wrapper_gem_name",
53
+ ":snippet_configs_path"
51
54
  ].freeze
52
55
 
53
56
  ARRAY_PARAMETERS = [
@@ -66,7 +69,9 @@ module Gapic
66
69
  BOOL_PARAMETERS_ALIASES = {
67
70
  "gem-free-tier" => ":gem.:free_tier",
68
71
  "gem-yard-strict" => ":gem.:yard_strict",
69
- "gem-generic-endpoint" => ":gem.:generic_endpoint"
72
+ "gem-generic-endpoint" => ":gem.:generic_endpoint",
73
+ "gem-is-cloud-product" => ":gem.:is_cloud_product",
74
+ "rest-numeric-enums" => ":gem.:rest_numeric_enums"
70
75
  }.freeze
71
76
 
72
77
  STRING_PARAMETERS_ALIASES = {
@@ -86,7 +91,8 @@ module Gapic
86
91
  "gem-factory-method-suffix" => ":gem.:factory_method_suffix",
87
92
  "default-service-host" => ":defaults.:service.:default_host",
88
93
  "grpc-service-config" => "grpc_service_config",
89
- "service-yaml" => ":service_yaml"
94
+ "service-yaml" => ":service_yaml",
95
+ "snippet-configs-path" => ":snippet_configs_path"
90
96
  }.freeze
91
97
 
92
98
  ARRAY_PARAMETERS_ALIASES = {
@@ -62,7 +62,7 @@ module Gapic
62
62
  "UNAUTHENTICATED"
63
63
  ].freeze
64
64
 
65
- ERROR_STRING_MAPPING = ERROR_CODE_MAPPING.each_with_index.each_with_object({}) do |(str, num), hash|
65
+ ERROR_STRING_MAPPING = ERROR_CODE_MAPPING.each_with_index.with_object({}) do |(str, num), hash|
66
66
  hash[str] = num
67
67
  end.freeze
68
68
 
@@ -209,7 +209,7 @@ module Gapic
209
209
  timestring_nos = timestring.delete_suffix "s"
210
210
  unless valid_float? timestring_nos
211
211
  error_text = "Was not able to convert the string `#{timestring}` " \
212
- "to a time interval when parsing a grpc service config"
212
+ "to a time interval when parsing a grpc service config"
213
213
  raise ParsingError, error_text
214
214
  end
215
215
  Float(timestring_nos)
@@ -0,0 +1,173 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Copyright 2023 Google LLC
4
+ #
5
+ # Licensed under the Apache License, Version 2.0 (the "License");
6
+ # you may not use this file except in compliance with the License.
7
+ # You may obtain a copy of the License at
8
+ #
9
+ # https://www.apache.org/licenses/LICENSE-2.0
10
+ #
11
+ # Unless required by applicable law or agreed to in writing, software
12
+ # distributed under the License is distributed on an "AS IS" BASIS,
13
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ # See the License for the specific language governing permissions and
15
+ # limitations under the License.
16
+
17
+ module Gapic
18
+ module Model
19
+ ##
20
+ # A collection of metadata about an API.
21
+ #
22
+ # This information generally comes from the service yaml rather than from
23
+ # proto input.
24
+ #
25
+ class ApiMetadata
26
+ ##
27
+ # @return [String] The full ID of the API, including `".googleapis.com"`.
28
+ # For example, `"pubsub.googleapis.com"`.
29
+ #
30
+ attr_reader :name
31
+
32
+ ##
33
+ # @return [String] The shortname of the API, omitting `".googleapis.com"`.
34
+ # For example, `"pubsub"`.
35
+ #
36
+ attr_reader :short_name
37
+
38
+ ##
39
+ # @return [String] A title of the API, including the version.
40
+ # For example, `"Cloud Pub/Sub V1"`
41
+ #
42
+ attr_reader :title
43
+
44
+ ##
45
+ # @return [String] A short description of the API, suitable for the
46
+ # RubyGems summary field.
47
+ #
48
+ attr_reader :summary
49
+
50
+ ##
51
+ # @return [String] A longer description of the API, suitable for the
52
+ # RubyGems description field.
53
+ #
54
+ attr_reader :description
55
+
56
+ ##
57
+ # @return [String] The organization name, determining where the API's
58
+ # documentation should be published, among other things. This value
59
+ # is `"CLOUD"` for Google Cloud APIs.
60
+ #
61
+ attr_reader :organization
62
+
63
+ ##
64
+ # @return [String] The URL for the documentation.
65
+ #
66
+ attr_reader :documentation_url
67
+
68
+ ##
69
+ # @return [String] The prefix string for sample doc tags.
70
+ #
71
+ attr_reader :doc_tag_prefix
72
+
73
+ ##
74
+ # @return [Hash{String => Array<String>}] A mapping from method name to a list of auto
75
+ # populated fields.
76
+ #
77
+ attr_reader :auto_populated_fields_by_method_name
78
+
79
+ ######## Internal ########
80
+ # @private
81
+ SELECTOR = "selector"
82
+ # @private
83
+ AUTO_POPULATED_FIELDS = "auto_populated_fields"
84
+
85
+ ##
86
+ # @private
87
+ # Special cases for short names
88
+ #
89
+ SHORT_NAME_MAPPING = {
90
+ "iam-meta-api" => "iam"
91
+ }.freeze
92
+
93
+ # @private
94
+ def update! **keywords
95
+ omit_patterns = [
96
+ nil,
97
+ "",
98
+ "CLIENT_LIBRARY_ORGANIZATION_UNSPECIFIED",
99
+ /\A\s*\(==.+==\)\s*\Z/
100
+ ]
101
+ keywords.each do |key, value|
102
+ instance_variable_set "@#{key}", value unless omit_patterns.any? { |pat| pat === value }
103
+ end
104
+ self
105
+ end
106
+
107
+ # @private
108
+ def standardize_names!
109
+ return unless name || short_name
110
+ @name ||= short_name
111
+ @short_name ||= name
112
+ @name = "#{name}.googleapis.com" unless name.include? "."
113
+ @short_name = short_name.split(".").first
114
+ @short_name = SHORT_NAME_MAPPING.fetch @short_name, @short_name
115
+ @doc_tag_prefix ||= short_name
116
+ self
117
+ end
118
+
119
+ # @private
120
+ def standardize_title! gem_name:
121
+ return unless title
122
+ @title = title.sub %r{\s+API$}, ""
123
+ return if title =~ /\s+V\d+\w*$/
124
+ vers = gem_name.split("-").last
125
+ @title = "#{title} #{vers.upcase}" if vers =~ /^v\d+\w*$/
126
+ self
127
+ end
128
+
129
+ # @private
130
+ def standardize_descriptions!
131
+ return unless summary || description
132
+ @description ||= summary
133
+ if summary
134
+ @summary = summary.gsub(/\s+/, " ").strip
135
+ @summary = "#{summary}." if summary =~ /\w\z/
136
+ @summary = remove_html_tags summary
137
+ end
138
+ @description = "#{description}." if description =~ /\w\z/
139
+ @description = remove_html_tags description
140
+ self
141
+ end
142
+
143
+ # @private
144
+ # Remove html tags and markdown links
145
+ def remove_html_tags str
146
+ str
147
+ .gsub(%r{</?[[:alpha:]]+(?:\s+[[:alpha:]]+\s*=\s*(?:"[^"]+"|'[^']+'|[^\s">]+))*\s*/?>}, "")
148
+ .gsub(%r{\[([^\]]+)\]\([^)]+\)}, "\\1")
149
+ end
150
+
151
+ ##
152
+ # @private
153
+ # Parses a service configuration, mapping method names to their respective
154
+ # auto populated field lists.
155
+ #
156
+ def standardize_auto_populated_fields! service_config
157
+ @auto_populated_fields_by_method_name = {}
158
+ return unless !service_config.nil? && !service_config.apis.nil?
159
+ @method_settings.each do |setting|
160
+ selector = setting[SELECTOR]
161
+ methods = service_config.apis.filter_map do |api|
162
+ # Removes API prefix and trailing period.
163
+ selector[api.name.length + 1..].downcase if selector.start_with? api.name
164
+ end
165
+ if !methods.nil? && setting.key?(AUTO_POPULATED_FIELDS)
166
+ @auto_populated_fields_by_method_name[methods.first] = setting[AUTO_POPULATED_FIELDS]
167
+ end
168
+ end
169
+ self
170
+ end
171
+ end
172
+ end
173
+ end
@@ -23,99 +23,197 @@ module Gapic
23
23
  # The information used in the generation process that
24
24
  # can be gathered from the `google.api.http` annotation.
25
25
  # `google.api.http` is used in two distinct ways:
26
- # - the rest libs use it as part of the transcoding to set up the REST call
27
- # - both rest and grpc libs use it as a source of implicit routing headers
26
+ # - REST libs use it as part of the transcoding to set up the REST call
27
+ # - gRPC libs use it as a source of implicit routing headers
28
28
  #
29
29
  class HttpAnnotation
30
30
  ##
31
- # @param proto_method [Gapic::Schema::Method]
31
+ # The Http bindings found in the annotation
32
+ # this includes main binding in the annotation itself,
33
+ # as well as those in the `additional_bindings`.
32
34
  #
33
- def initialize proto_method
34
- @proto_method = proto_method
35
+ # @return [Array<HttpBinding>]
36
+ attr_reader :bindings
37
+
38
+ ##
39
+ # @param proto_http [::Google::Api::HttpRule]
40
+ # The base http annotation
41
+ #
42
+ def initialize proto_http
43
+ @bindings = parse_bindings proto_http
35
44
  end
36
45
 
37
46
  ##
38
- # Whether a http verb is present for this method
47
+ # Whether any implicit routing parameters are present.
39
48
  #
40
49
  # @return [Boolean]
41
- def verb?
42
- !verb.nil?
50
+ def routing_params?
51
+ routing_params.any?
43
52
  end
44
53
 
45
54
  ##
46
- # The http verb for this method
55
+ # The implicit routing parameter names.
47
56
  #
48
- # @return [Symbol, Nil]
49
- def verb
50
- return nil if @proto_method.http.nil?
51
-
52
- method = {
53
- get: @proto_method.http.get,
54
- post: @proto_method.http.post,
55
- put: @proto_method.http.put,
56
- patch: @proto_method.http.patch,
57
- delete: @proto_method.http.delete
58
- }.find { |_, value| !value.empty? }
59
-
60
- method[0] unless method.nil?
57
+ # @return [Array<String>]
58
+ def routing_params
59
+ routing_params_with_patterns.map { |param, _| param }
61
60
  end
62
61
 
63
62
  ##
64
- # Whether a method path is present and non-empty
63
+ # The implicit routing parameter names and their corresponding paterns,
64
+ # including the `*` pattern implied for the named segments
65
+ # without an explicitly specified pattern.
65
66
  #
66
- # @return [Boolean]
67
- def path?
68
- !path.empty?
67
+ # @return [Array<Array<String>>]
68
+ def routing_params_with_patterns
69
+ bindings.first&.routing_params_with_patterns || []
69
70
  end
70
71
 
71
72
  ##
72
- # A method path or an empty string if not present
73
+ # @param proto_method [::Gapic::Schema::Method]
74
+ # The proto method this annotation model applies to
75
+ # @param service_config [::Google::Api::Service]
76
+ # The service config that might contain an override for the http annotation.
77
+ # This is used for mixins: when generating Operations sublients, and when
78
+ # setting up overrides for other mixin clients in the host services's classes.
79
+ # For non-mixin service generation
80
+ # it is assumed that the service config is merged into protos before generation.
73
81
  #
74
- # @return [String]
75
- def path
76
- return "" if @proto_method.http.nil?
82
+ def self.create_with_override proto_method, service_config = nil
83
+ proto_http = proto_method.http
77
84
 
78
- verb_path = [
79
- @proto_method.http.get, @proto_method.http.post, @proto_method.http.put,
80
- @proto_method.http.patch, @proto_method.http.delete
81
- ].find { |x| !x.empty? }
85
+ http_override = service_config&.http&.rules&.find { |http_rule| http_rule.selector == proto_method.full_name }
82
86
 
83
- verb_path || @proto_method.http.custom&.path || ""
87
+ http = http_override || proto_http
88
+ HttpAnnotation.new http
84
89
  end
85
90
 
86
91
  ##
87
- # Whether any routing params are present
92
+ # A single Http binding.
88
93
  #
89
- # @return [Boolean]
90
- def routing_params?
91
- routing_params.any?
94
+ class HttpBinding
95
+ ##
96
+ # @param binding [::Google::Api::HttpRule]
97
+ # The baseline instance of the Http annotation
98
+ def initialize binding
99
+ @binding = binding
100
+ end
101
+
102
+ ##
103
+ # Whether a http verb is present for this method
104
+ #
105
+ # @return [Boolean]
106
+ def verb?
107
+ !verb.nil?
108
+ end
109
+
110
+ ##
111
+ # The http verb for this method
112
+ #
113
+ # @return [Symbol, nil]
114
+ def verb
115
+ verb_path[0] if verb_path
116
+ end
117
+
118
+ ##
119
+ # Whether a method path is present and non-empty
120
+ #
121
+ # @return [Boolean]
122
+ def path?
123
+ !path.empty?
124
+ end
125
+
126
+ ##
127
+ # A method path or an empty string if not present
128
+ #
129
+ # @return [String]
130
+ def path
131
+ return "" unless verb_path
132
+ verb_path[1]
133
+ end
134
+
135
+ ##
136
+ # Whether any routing params are present
137
+ #
138
+ # @return [Boolean]
139
+ def routing_params?
140
+ routing_params.any?
141
+ end
142
+
143
+ ##
144
+ # The segment key names and their corresponding paterns,
145
+ # including the `*` pattern implied for the named segments
146
+ # without pattern explicitly specified.
147
+ #
148
+ # @return [Array<Array<String>>]
149
+ def routing_params_with_patterns
150
+ @routing_params_with_patterns ||= begin
151
+ Gapic::UriTemplate.parse_arguments(path).map do |name, pattern|
152
+ [name, pattern.empty? ? "*" : pattern]
153
+ end
154
+ end
155
+ end
156
+
157
+ ##
158
+ # The segment key names.
159
+ #
160
+ # @return [Array<String>]
161
+ def routing_params
162
+ routing_params_with_patterns.map { |param, _| param }
163
+ end
164
+
165
+ ##
166
+ # Whether method has body specified in proto
167
+ #
168
+ # @return [Boolean]
169
+ def body?
170
+ !body.empty?
171
+ end
172
+
173
+ ##
174
+ # The body specified for the given method in proto
175
+ # or an empty string if not specified
176
+ #
177
+ # @return [String]
178
+ def body
179
+ @binding&.body || ""
180
+ end
181
+
182
+ private
183
+
184
+ ##
185
+ # The combination of verb and path found in the http annotation
186
+ # (or Nil if the annotation is Nil).
187
+ #
188
+ # @return [Array<Symbol, String>, Nil]
189
+ def verb_path
190
+ return nil if @binding.nil?
191
+
192
+ {
193
+ get: @binding.get,
194
+ post: @binding.post,
195
+ put: @binding.put,
196
+ patch: @binding.patch,
197
+ delete: @binding.delete
198
+ }.find { |_, value| !value.empty? }
199
+ end
92
200
  end
93
201
 
94
- ##
95
- # The segment key names.
96
- #
97
- # @return [Array<String>]
98
- def routing_params
99
- Gapic::UriTemplate.parse_arguments path
100
- end
202
+ private
101
203
 
102
204
  ##
103
- # Whether method has body specified in proto
205
+ # Parses http bindings from the `google.api.http` annotation, preserving order.
104
206
  #
105
- # @return [Boolean]
106
- def body?
107
- return false if @proto_method.http.nil?
108
-
109
- !@proto_method.http.body.empty?
110
- end
111
-
112
- ##
113
- # The body specified for the given method in proto
114
- # or an empty string if not specified
207
+ # @param http [::Google::Api::HttpRule]
208
+ # The root instance of the HttpRule to parse.
115
209
  #
116
- # @return [String]
117
- def body
118
- @proto_method.http&.body || ""
210
+ # @return Array<HttpBinding>
211
+ # The parsed bindings.
212
+ def parse_bindings http
213
+ return [] if http.nil?
214
+
215
+ raw_binds = [http] + http.additional_bindings.to_a
216
+ raw_binds.map { |raw_bind| HttpBinding.new raw_bind }
119
217
  end
120
218
  end
121
219
  end