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
@@ -0,0 +1,329 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Copyright 2022 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
+
18
+ module Gapic
19
+ module Presenters
20
+ class SnippetPresenter
21
+ ##
22
+ # Some common private methods for response handling presenters
23
+ #
24
+ module ResponseHandlingPresenterCommon
25
+ private
26
+
27
+ def compute_response_name proto, phase1
28
+ return "result" if phase1
29
+ return nil if proto&.response_name.to_s.empty?
30
+ proto.response_name
31
+ end
32
+ end
33
+
34
+ ##
35
+ # Presentation information about simple response handling
36
+ #
37
+ class SimpleResponseHandlingPresenter
38
+ include ResponseHandlingPresenterCommon
39
+
40
+ ##
41
+ # Create a simple response handling presenter
42
+ #
43
+ # @param proto [Google::Cloud::Tools::SnippetGen::ConfigLanguage::V1::Snippet::SimpleResponseHandling]
44
+ # The protobuf representation
45
+ # @param json [String]
46
+ # The JSON representation
47
+ # @param response_type [String] The fully qualified response message class
48
+ # @param phase1 [Boolean] True if this is a phase 1 snippet without config
49
+ #
50
+ def initialize proto, _json, response_type:, phase1:
51
+ @response_name = compute_response_name proto, phase1
52
+ @render_lines =
53
+ if @response_name && phase1
54
+ [
55
+ "# The returned object is of type #{response_type}.",
56
+ "p #{@response_name}"
57
+ ]
58
+ else
59
+ []
60
+ end
61
+ @render = @render_lines.join "\n"
62
+ end
63
+
64
+ ##
65
+ # The lines of rendered code
66
+ # @return [Array<String>]
67
+ #
68
+ attr_reader :render_lines
69
+
70
+ ##
71
+ # The rendered code as a single string, possibly with line breaks
72
+ # @return [String]
73
+ #
74
+ attr_reader :render
75
+
76
+ ##
77
+ # The name of the response variable, or nil for no response handling
78
+ # @return [String,nil]
79
+ #
80
+ attr_reader :response_name
81
+ end
82
+
83
+ ##
84
+ # Presentation information about LRO response handling
85
+ #
86
+ class LroResponseHandlingPresenter
87
+ include ResponseHandlingPresenterCommon
88
+
89
+ ##
90
+ # Create an LRO response handling presenter
91
+ #
92
+ # @param proto [Google::Cloud::Tools::SnippetGen::ConfigLanguage::V1::Snippet::LroResponseHandling]
93
+ # The protobuf representation
94
+ # @param json [String]
95
+ # The JSON representation
96
+ # @param phase1 [Boolean] True if this is a phase 1 snippet without config
97
+ #
98
+ def initialize proto, _json, phase1:
99
+ @response_name = compute_response_name proto, phase1
100
+ @render_lines = []
101
+ if @response_name
102
+ if phase1
103
+ @render_lines << "# The returned object is of type Gapic::Operation. You can use it to"
104
+ @render_lines << "# check the status of an operation, cancel it, or wait for results."
105
+ end
106
+ case proto&.polling_type
107
+ when :NONE
108
+ # Do nothing
109
+ when :ONCE
110
+ @render_lines += check_once_lines phase1
111
+ else
112
+ @render_lines += wait_response_lines phase1
113
+ end
114
+ end
115
+ @render = @render_lines.join "\n"
116
+ end
117
+
118
+ ##
119
+ # The lines of rendered code
120
+ # @return [Array<String>]
121
+ #
122
+ attr_reader :render_lines
123
+
124
+ ##
125
+ # The rendered code as a single string, possibly with line breaks
126
+ # @return [String]
127
+ #
128
+ attr_reader :render
129
+
130
+ ##
131
+ # The name of the response variable, or nil for no response handling
132
+ # @return [String,nil]
133
+ #
134
+ attr_reader :response_name
135
+
136
+ private
137
+
138
+ def check_once_lines phase1
139
+ lines = []
140
+ lines << "# Here is how to check once for a response." if phase1
141
+ lines + [
142
+ "if #{@response_name}.response?",
143
+ " p #{@response_name}.response",
144
+ "else",
145
+ ' puts "Response not yet arrived."',
146
+ "end"
147
+ ]
148
+ end
149
+
150
+ def wait_response_lines phase1
151
+ lines = []
152
+ lines << "# Here is how to wait for a response." if phase1
153
+ lines + [
154
+ "#{@response_name}.wait_until_done! timeout: 60",
155
+ "if #{@response_name}.response?",
156
+ " p #{@response_name}.response",
157
+ "else",
158
+ ' puts "No response received."',
159
+ "end"
160
+ ]
161
+ end
162
+ end
163
+
164
+ ##
165
+ # Presentation information about server-streaming response handling
166
+ #
167
+ class StreamingResponseHandlingPresenter
168
+ ##
169
+ # Create a server-streaming response handling presenter
170
+ #
171
+ # @param proto [Google::Cloud::Tools::SnippetGen::ConfigLanguage::V1::Snippet::StreamingResponseHandling]
172
+ # The protobuf representation
173
+ # @param json [String]
174
+ # The JSON representation
175
+ # @param response_name [String] The name of the stream variable
176
+ # @param base_response_type [String] The fully qualified message class
177
+ # for individual responses
178
+ # @param phase1 [Boolean] True if this is a phase 1 snippet without config
179
+ #
180
+ def initialize proto, json, response_name:, base_response_type:, phase1:
181
+ @response_name = response_name
182
+ @render_lines = []
183
+ if response_name
184
+ if phase1 && base_response_type
185
+ @render_lines << "# The returned object is a streamed enumerable yielding elements of type"
186
+ @render_lines << "# #{base_response_type}"
187
+ end
188
+ @render_lines += per_stream_response_lines proto, json, response_name, phase1
189
+ end
190
+ @render = @render_lines.join "\n"
191
+ end
192
+
193
+ ##
194
+ # The lines of rendered code
195
+ # @return [Array<String>]
196
+ #
197
+ attr_reader :render_lines
198
+
199
+ ##
200
+ # The rendered code as a single string, possibly with line breaks
201
+ # @return [String]
202
+ #
203
+ attr_reader :render
204
+
205
+ ##
206
+ # The name of the response variable, or nil for no response handling
207
+ # @return [String,nil]
208
+ #
209
+ attr_reader :response_name
210
+
211
+ private
212
+
213
+ def per_stream_response_lines proto, json, response_name, phase1
214
+ lines = []
215
+ item_name = phase1 ? "current_response" : proto.current_response_name
216
+ lines << "#{response_name}.each do |#{item_name}|"
217
+ if json&.key? "perStreamResponseStatements"
218
+ proto.per_stream_response_statements&.each_with_index do |statement_proto, index|
219
+ statement = StatementPresenter.new statement_proto, json["perStreamResponseStatements"][index]
220
+ lines += statement.render_lines.map { |line| " #{line}" }
221
+ end
222
+ else
223
+ lines << " p #{item_name}"
224
+ end
225
+ lines << "end"
226
+ lines
227
+ end
228
+ end
229
+
230
+ ##
231
+ # Presentation information about paginated response handling
232
+ #
233
+ class PaginatedResponseHandlingPresenter
234
+ include ResponseHandlingPresenterCommon
235
+
236
+ ##
237
+ # Create a paginated response handling presenter
238
+ #
239
+ # @param proto [Google::Cloud::Tools::SnippetGen::ConfigLanguage::V1::Snippet::PaginatedResponseHandling]
240
+ # The protobuf representation
241
+ # @param json [String]
242
+ # The JSON representation
243
+ # @param paged_response_type [String] The fully qualified message class
244
+ # for individual responses
245
+ # @param phase1 [Boolean] True if this is a phase 1 snippet without config
246
+ #
247
+ def initialize proto, json, paged_response_type:, phase1:
248
+ @response_name = compute_response_name proto, phase1
249
+ @render_lines = []
250
+ if @response_name
251
+ if phase1
252
+ @render_lines << "# The returned object is of type Gapic::PagedEnumerable. You can iterate"
253
+ @render_lines << "# over elements, and API calls will be issued to fetch pages as needed."
254
+ end
255
+ @render_lines +=
256
+ if proto&.by_page
257
+ by_page_lines proto, json, @response_name, paged_response_type, phase1
258
+ elsif proto&.next_page_token
259
+ next_page_token_lines proto, json
260
+ else
261
+ by_item_lines proto, json, @response_name, paged_response_type, phase1
262
+ end
263
+ end
264
+ @render = @render_lines.join "\n"
265
+ end
266
+
267
+ ##
268
+ # The lines of rendered code
269
+ # @return [Array<String>]
270
+ #
271
+ attr_reader :render_lines
272
+
273
+ ##
274
+ # The rendered code as a single string, possibly with line breaks
275
+ # @return [String]
276
+ #
277
+ attr_reader :render
278
+
279
+ ##
280
+ # The name of the response variable, or nil for no response handling
281
+ # @return [String,nil]
282
+ #
283
+ attr_reader :response_name
284
+
285
+ private
286
+
287
+ def by_item_lines proto, json, collection_name, paged_response_type, phase1
288
+ lines = []
289
+ proto = proto&.by_item
290
+ json = json&.fetch "byItem", nil
291
+ item_name = phase1 ? "item" : proto.item_name
292
+ lines << "#{collection_name}.each do |#{item_name}|"
293
+ if json&.key? "perItemStatements"
294
+ proto.per_item_statements&.each_with_index do |item_proto, index|
295
+ statement = StatementPresenter.new item_proto, json["perItemStatements"][index]
296
+ lines += statement.render_lines.map { |line| " #{line}" }
297
+ end
298
+ else
299
+ lines << " # Each element is of type #{paged_response_type}." if phase1
300
+ lines << " p #{item_name}"
301
+ end
302
+ lines << "end"
303
+ lines
304
+ end
305
+
306
+ def by_page_lines proto, json, response_name, paged_response_type, phase1
307
+ lines = []
308
+ proto = proto.by_page
309
+ json = json["byPage"]
310
+ page_name = phase1 ? "page" : proto.page_name
311
+ lines << "#{response_name}.each_page do |#{page_name}|"
312
+ if json&.key? "perPageStatements"
313
+ proto.per_page_statements&.each_with_index do |page_proto, index|
314
+ statement = StatementPresenter.new page_proto, json["perPageStatements"][index]
315
+ lines += statement.render_lines.map { |line| " #{line}" }
316
+ end
317
+ end
318
+ iteration_lines = by_item_lines proto, json, page_name, paged_response_type, phase1
319
+ lines + iteration_lines.map { |line| " #{line}" } + ["end"]
320
+ end
321
+
322
+ def next_page_token_lines _proto, _json
323
+ # TODO
324
+ []
325
+ end
326
+ end
327
+ end
328
+ end
329
+ end
@@ -0,0 +1,134 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Copyright 2022 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
+
18
+ module Gapic
19
+ module Presenters
20
+ class SnippetPresenter
21
+ ##
22
+ # Presentation information about a statement
23
+ #
24
+ class StatementPresenter
25
+ ##
26
+ # Create a statement presenter.
27
+ #
28
+ # @param proto [Google::Cloud::Tools::SnippetGen::ConfigLanguage::V1::Statement]
29
+ # The protobuf representation of the statement
30
+ # @param json [String]
31
+ # The JSON representation of the statement
32
+ #
33
+ def initialize proto, json
34
+ @render_lines =
35
+ if json&.key? "declaration"
36
+ declaration_lines proto.declaration, json["declaration"]
37
+ elsif json&.key? "standardOutput"
38
+ output_lines proto.standard_output, json["standardOutput"]
39
+ elsif json&.key? "return"
40
+ return_lines proto.return, json["return"]
41
+ elsif json&.key? "conditional"
42
+ conditional_lines proto.conditional, json["conditional"]
43
+ elsif json&.key? "iteration"
44
+ iteration_lines proto.iteration, json["iteration"]
45
+ else
46
+ ["# Unknown statement omitted here."]
47
+ end
48
+ @render = @render_lines.join "\n"
49
+ end
50
+
51
+ ##
52
+ # The lines of rendered code
53
+ # @return [Array<String>]
54
+ #
55
+ attr_reader :render_lines
56
+
57
+ ##
58
+ # The rendered code as a single string, possibly with line breaks
59
+ # @return [String]
60
+ #
61
+ attr_reader :render
62
+
63
+ private
64
+
65
+ def declaration_lines proto, json
66
+ declaration = DeclarationPresenter.new proto, json
67
+ if declaration.exist?
68
+ declaration.render_lines
69
+ else
70
+ ["# Unknown declaration statement omitted here."]
71
+ end
72
+ end
73
+
74
+ def output_lines proto, json
75
+ expr = ExpressionPresenter.new proto.value, json["value"]
76
+ return ["# Unknown output statement omitted here."] unless expr.exist?
77
+ lines = expr.render_lines
78
+ if lines.size == 1
79
+ ["puts(#{lines.first})"]
80
+ else
81
+ ["puts("] + lines.map { |line| " #{line}" } + [")"]
82
+ end
83
+ end
84
+
85
+ def return_lines proto, json
86
+ expr = ExpressionPresenter.new proto.result, json["result"]
87
+ return ["# Unknown return statement omitted here."] unless expr.exist?
88
+ lines = expr.render_lines
89
+ lines[0] = "return #{lines.first}"
90
+ lines
91
+ end
92
+
93
+ def conditional_lines proto, json
94
+ expr = ExpressionPresenter.new proto.condition, json["condition"]
95
+ return ["# Unknown conditional statement omitted here."] unless expr.exist?
96
+
97
+ if json.key? "onTrue"
98
+ conditional_lines_inner "if", expr, proto.on_true, json["onTrue"], proto.on_false, json["onFalse"]
99
+ elsif json.key? "onFalse"
100
+ conditional_lines_inner "unless", expr, proto.on_false, json["onFalse"], nil, nil
101
+ else
102
+ ["# Do nothing"]
103
+ end
104
+ end
105
+
106
+ def conditional_lines_inner keyword, expr, if_protos, if_json, else_protos, else_json
107
+ lines = ["#{keyword} #{expr.render}"]
108
+ if_protos.each_with_index do |statement_proto, index|
109
+ statement = StatementPresenter.new statement_proto, if_json[index]
110
+ lines += statement.render_lines.map { |line| " #{line}" }
111
+ end
112
+ if else_json
113
+ lines << "else"
114
+ else_protos.each_with_index do |statement_proto, index|
115
+ statement = StatementPresenter.new statement_proto, else_json[index]
116
+ lines += statement.render_lines.map { |line| " #{line}" }
117
+ end
118
+ end
119
+ lines << "end"
120
+ lines
121
+ end
122
+
123
+ def iteration_lines proto, json
124
+ iteration = IterationPresenter.new proto, json
125
+ if iteration.exist?
126
+ iteration.render_lines
127
+ else
128
+ ["# Unknown iteration statement omitted here."]
129
+ end
130
+ end
131
+ end
132
+ end
133
+ end
134
+ end
@@ -0,0 +1,98 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Copyright 2022 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
+ require "active_support/inflector"
18
+
19
+ module Gapic
20
+ module Presenters
21
+ class SnippetPresenter
22
+ ##
23
+ # Presentation information about a type
24
+ #
25
+ class TypePresenter
26
+ ##
27
+ # Create a type presenter.
28
+ #
29
+ # @param proto [Google::Cloud::Tools::SnippetGen::ConfigLanguage::V1::Type]
30
+ # The protobuf representation of the type
31
+ # @param json [String]
32
+ # The JSON representation of the type
33
+ #
34
+ def initialize proto, json
35
+ @render =
36
+ if json&.key? "scalarType"
37
+ SCALAR_TYPE_MAPPING[proto.scalar_type] || "Object"
38
+ elsif json&.key? "bytesType"
39
+ "String"
40
+ elsif json&.key? "messageType"
41
+ proto_to_ruby proto.message_type.message_full_name
42
+ elsif json&.key? "enumType"
43
+ proto_to_ruby proto.enum_type.enum_full_name
44
+ elsif json&.key? "repeatedType"
45
+ repeated_render proto, json
46
+ elsif json&.key? "mapType"
47
+ map_render proto, json
48
+ else
49
+ "Object"
50
+ end
51
+ end
52
+
53
+ ##
54
+ # The rendered type string.
55
+ # @return [String]
56
+ #
57
+ attr_reader :render
58
+
59
+ private
60
+
61
+ def proto_to_ruby name
62
+ name.split(".").map { |str| ActiveSupport::Inflector.upcase_first str }.join "::"
63
+ end
64
+
65
+ def repeated_render proto, json
66
+ inner_type = TypePresenter.new proto.repeated_type.element_type, json["repeatedType"]["elementType"]
67
+ "Array<#{inner_type.render}>"
68
+ end
69
+
70
+ def map_render proto, json
71
+ proto = proto.map_type
72
+ json = json["mapType"]
73
+ key_type = TypePresenter.new proto.key_type, json["keyType"]
74
+ value_type = TypePresenter.new proto.value_type, json["valueType"]
75
+ "Hash{#{key_type.render}=>#{value_type.render}}"
76
+ end
77
+
78
+ SCALAR_TYPE_MAPPING = {
79
+ TYPE_DOUBLE: "Float",
80
+ TYPE_FLOAT: "Float",
81
+ TYPE_INT64: "Integer",
82
+ TYPE_UINT64: "Integer",
83
+ TYPE_INT32: "Integer",
84
+ TYPE_FIXED64: "Integer",
85
+ TYPE_FIXED32: "Integer",
86
+ TYPE_BOOL: "boolean",
87
+ TYPE_STRING: "String",
88
+ TYPE_UINT32: "Integer",
89
+ TYPE_SFIXED32: "Integer",
90
+ TYPE_SFIXED64: "Integer",
91
+ TYPE_SINT32: "Integer",
92
+ TYPE_SINT64: "Integer"
93
+ }.freeze
94
+ private_constant :SCALAR_TYPE_MAPPING
95
+ end
96
+ end
97
+ end
98
+ end