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
@@ -17,6 +17,7 @@
17
17
  require "active_support/inflector"
18
18
  require "gapic/helpers/filepath_helper"
19
19
  require "gapic/helpers/namespace_helper"
20
+ require "forwardable"
20
21
 
21
22
  module Gapic
22
23
  module Presenters
@@ -27,6 +28,18 @@ module Gapic
27
28
  include Gapic::Helpers::FilepathHelper
28
29
  include Gapic::Helpers::NamespaceHelper
29
30
 
31
+ extend Forwardable
32
+ def_delegators :@main_service, :name, :helpers_file_name, :is_hosted_mixin?, :is_main_mixin_service?, :mixins?,
33
+ :mixin_binding_overrides?, :grpc_service_config, :grpc_service_config_presenter, :lro_service,
34
+ :lro_client_var, :nonstandard_lro_provider?, :credentials_class_xref, :client_name, :module_name,
35
+ :grpc_full_name, :client_suffix_for_default_transport, :client_endpoint_template
36
+
37
+ # The namespace of the service. (not the client)
38
+ # Intentionally does not include "Rest", since
39
+ # we do not want Rest service's configuration to
40
+ # default to GRPC configuration (right now).
41
+ def_delegators :@main_service, :namespace
42
+
30
43
  ##
31
44
  # @param main_service [Gapic::Presenters::ServicePresenter]
32
45
  # @param api [Gapic::Schema::Api]
@@ -34,15 +47,7 @@ module Gapic
34
47
  def initialize main_service, api
35
48
  @main_service = main_service
36
49
  @api = api
37
- end
38
-
39
- ##
40
- # Ruby name of this service
41
- #
42
- # @return [String]
43
- #
44
- def name
45
- main_service.name
50
+ @type = "service"
46
51
  end
47
52
 
48
53
  ##
@@ -65,11 +70,12 @@ module Gapic
65
70
 
66
71
  ##
67
72
  # Folder name for this service
73
+ # This is just "rest" for rest services
68
74
  #
69
75
  # @return [String]
70
76
  #
71
77
  def service_directory_name
72
- service_require.split("/")[-2]
78
+ "rest"
73
79
  end
74
80
 
75
81
  ##
@@ -100,13 +106,6 @@ module Gapic
100
106
  "#{service_stub_require}.rb"
101
107
  end
102
108
 
103
- ##
104
- # @return [String]
105
- #
106
- def client_name
107
- main_service.client_name
108
- end
109
-
110
109
  ##
111
110
  # @return [String]
112
111
  #
@@ -153,14 +152,7 @@ module Gapic
153
152
  # @return [String]
154
153
  #
155
154
  def test_client_file_path
156
- main_service.service_file_path.sub ".rb", "_test.rb"
157
- end
158
-
159
- ##
160
- # @return [String]
161
- #
162
- def credentials_class_xref
163
- main_service.credentials_class_xref
155
+ main_service.service_file_path.sub ".rb", "_rest_test.rb"
164
156
  end
165
157
 
166
158
  ##
@@ -215,13 +207,141 @@ module Gapic
215
207
  ruby_file_path @api, "#{service_name_full}::#{nonstandard_lro_name}"
216
208
  end
217
209
 
210
+ ##
211
+ # A presenter for the LRO subclient if needed
212
+ #
213
+ # @return [Gapic::Presenters::Service::LroClientPresenter, nil]
214
+ def lro_client_presenter
215
+ return nil unless lro?
216
+ Gapic::Presenters::Service::LroClientPresenter.new service: "google.longrunning.operations",
217
+ client_class_name: "Operations",
218
+ client_class_docname: operations_name_full,
219
+ client_var_name: lro_client_var,
220
+ require_str: operations_file_path,
221
+ service_description: "long-running operations"
222
+ end
223
+
224
+ ##
225
+ # Whether an AIP-151 LRO subclient needs to be generated for this service
226
+ #
227
+ # @return [Boolean]
228
+ def lro?
229
+ methods.find(&:lro?)
230
+ end
231
+
232
+ def operations_name
233
+ "Operations"
234
+ end
235
+
236
+ def operations_name_full
237
+ fix_namespace @api, "#{service_name_full}::#{operations_name}"
238
+ end
239
+
240
+ def operations_file_path
241
+ "#{operations_require}.rb"
242
+ end
243
+
244
+ def operations_file_name
245
+ operations_file_path.split("/").last
246
+ end
247
+
248
+ def operations_require
249
+ ruby_file_path @api, "#{service_name_full}::#{operations_name}"
250
+ end
251
+
252
+ def operations_stub_name
253
+ "OperationsServiceStub"
254
+ end
255
+
256
+ ##
257
+ # The client presenters of the nonstandard LROs that are used by the methods of this service
258
+ #
259
+ # @return [Enumerable<Gapic::Presenters::Service::LroClientPresenter>]
260
+ def nonstandard_lros
261
+ return [] unless main_service.nonstandard_lro_consumer?
262
+ main_service.nonstandard_lros_models.map do |lro|
263
+ lro_wrapper = @api.lookup lro.service_full_name
264
+ lro_service = ServicePresenter.new(main_service.gem, @api, lro_wrapper).rest
265
+
266
+ service_description = "long-running operations via #{lro_service.name}"
267
+ client_var_name = ruby_file_path_for_namespace lro_service.name
268
+ Gapic::Presenters::Service::LroClientPresenter.new service: lro.service_full_name,
269
+ client_class_name: lro_service.client_name_full,
270
+ client_class_docname: lro_service.client_name_full,
271
+ client_var_name: client_var_name,
272
+ require_str: lro_service.service_require,
273
+ service_description: service_description,
274
+ helper_type: lro_service.nonstandard_lro_name_full
275
+ end
276
+ end
277
+
278
+ ##
279
+ # Whether config for this service should include the `bindings_override` field.
280
+ # This field is needed:
281
+ # * if a service is a mixin in it's own package, e.g. `google.Cloud.Location`
282
+ # * if a service hosts a mixin and has bindings overrides for it
283
+ # but the generated Operations clients should not have it since override for
284
+ # their bindings are generated instead of set during runtime.
285
+ #
286
+ def mixin_should_generate_override_config?
287
+ (is_main_mixin_service? || main_service.mixin_binding_overrides?) &&
288
+ main_service.grpc_full_name != "google.longrunning.Operations"
289
+ end
290
+
291
+ ##
292
+ # The client presenters of the mixin services that are used by the methods of this service
293
+ #
294
+ # @return [Enumerable<Gapic::Presenters::Service::MixinClientPresenter>]
295
+ def mixin_presenters
296
+ return [] unless main_service.mixins?
297
+ main_service.mixin_presenters.map do |grpc_presenter|
298
+ model = main_service.mixin_models.find { |mdl| mdl.service == grpc_presenter.service }
299
+ raise "Mismatch between model and presenters in service #{service_name_full}" unless model
300
+
301
+ Gapic::Presenters::Service::MixinClientPresenter.new service: model.service,
302
+ client_class_name: model.client_class_name_rest,
303
+ client_class_docname: model.client_class_docname_rest,
304
+ client_var_name: model.client_var_name,
305
+ require_str: model.require_str_rest,
306
+ service_description: model.service_description,
307
+ bindings_override: grpc_presenter.bindings_override
308
+ end
309
+ end
310
+
311
+ ##
312
+ # Whether there are any subclients to generate with this service.
313
+ # Subclients are the clients to other services (e.g. an LRO provider service).
314
+ #
315
+ # @return [Boolean]
316
+ def subclients?
317
+ subclients.any?
318
+ end
319
+
320
+ ##
321
+ # Subclients for this service
322
+ # Subclients are the clients to other services (e.g. an LRO provider service).
323
+ #
324
+ # The following is typically generated for a subclient:
325
+ # - a require statement for the subclient's class
326
+ # - a class-level variable in the host service's client
327
+ # - a code to initialize this variable with a subclient's class instance in the host service's constructor
328
+ #
329
+ # @return [Enumerable<Gapic::Presenters::Service::LroClientPresenter, Gapic::Model::Mixins::Mixin>]
330
+ def subclients
331
+ [lro_client_presenter, mixin_presenters, nonstandard_lros].flatten.compact
332
+ end
333
+
334
+ def lro_subclients
335
+ [lro_client_presenter, nonstandard_lros].flatten.compact
336
+ end
337
+
218
338
  ##
219
339
  # The method to use for quick start samples. Normally this is simply the
220
340
  # first non-client-streaming method defined, but it can be overridden via
221
341
  # a gem config.
222
342
  #
223
343
  # @return [Gapic::Presenters::MethodRestPresenter] if there is a method
224
- # appropriatke for quick start
344
+ # appropriate for quick start
225
345
  # @return [nil] if there is no method appropriate for quick start
226
346
  #
227
347
  def quick_start_method
@@ -229,10 +349,41 @@ module Gapic
229
349
  end
230
350
 
231
351
  ##
352
+ # Presenters for methods that can be generated in REST clients.
353
+ #
232
354
  # @return [Enumerable<Gapic::Presenters::MethodPresenter>]
233
355
  #
234
356
  def methods
235
- main_service.methods
357
+ main_service.methods.select(&:can_generate_rest?)
358
+ end
359
+
360
+ ##
361
+ # Require string for the helpers file
362
+ #
363
+ # @return [String]
364
+ #
365
+ def helpers_require
366
+ ruby_file_path @api, "#{service_name_full}::Helpers"
367
+ end
368
+
369
+ ##
370
+ # Whether this rest service should send the numeric enums signal
371
+ # @return [Boolean]
372
+ #
373
+ def numeric_enums?
374
+ main_service.gem.rest_numeric_enums?
375
+ end
376
+
377
+ ##
378
+ # @return [Boolean] Whether the service is marked as deprecated.
379
+ #
380
+ def is_deprecated?
381
+ @main_service.is_deprecated?
382
+ end
383
+
384
+ # @return [String] The api_version for this service, or empty if not defined.
385
+ def api_version
386
+ @main_service.api_version.to_s
236
387
  end
237
388
 
238
389
  private
@@ -241,6 +392,8 @@ module Gapic
241
392
  attr_reader :main_service
242
393
  # @return [Gapic::Schema::Api]
243
394
  attr_reader :api
395
+ # @return [String] String representation of this presenter type.
396
+ attr_reader :type
244
397
  end
245
398
  end
246
399
  end
@@ -0,0 +1,82 @@
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 client call invocation
23
+ #
24
+ class ClientCallPresenter
25
+ ##
26
+ # Create a client call presenter
27
+ #
28
+ # @param proto [Google::Cloud::Tools::SnippetGen::ConfigLanguage::V1::Snippet::ClientCall]
29
+ # The protobuf representation
30
+ # @param json [String]
31
+ # The JSON representation
32
+ # @param method_name [String] The method name
33
+ # @param request_name [String] The request variable name
34
+ # @param response_name [String,nil] The response variable name, or nil for no response handling
35
+ # @param client_streaming [Boolean] True if the call is client streaming
36
+ # @param server_streaming [Boolean] True if the call is server streaming
37
+ # @param phase1 [Boolean] True if this is a phase 1 snippet without config
38
+ #
39
+ def initialize proto, json,
40
+ method_name:, request_name:, response_name:, client_streaming:, server_streaming:, phase1:
41
+ @render_lines = pre_call_lines proto, json, method_name, client_streaming, server_streaming, phase1
42
+ main_line = "client.#{method_name} #{request_name}"
43
+ main_line = "#{response_name} = #{main_line}" if response_name
44
+ @render_lines << main_line
45
+ @render = @render_lines.join "\n"
46
+ end
47
+
48
+ ##
49
+ # The lines of rendered code
50
+ # @return [Array<String>]
51
+ #
52
+ attr_reader :render_lines
53
+
54
+ ##
55
+ # The rendered code as a single string, possibly with line breaks
56
+ # @return [String]
57
+ #
58
+ attr_reader :render
59
+
60
+ private
61
+
62
+ def pre_call_lines proto, json, method_name, client_streaming, server_streaming, phase1
63
+ lines = []
64
+ if json&.key? "preCall"
65
+ proto.pre_call.each_with_index do |statement_proto, index|
66
+ statement = StatementPresenter.new statement_proto, json["preCall"][index]
67
+ lines += statement.render_lines
68
+ end
69
+ elsif phase1
70
+ lines <<
71
+ if client_streaming || server_streaming
72
+ "# Call the #{method_name} method to start streaming."
73
+ else
74
+ "# Call the #{method_name} method."
75
+ end
76
+ end
77
+ lines
78
+ end
79
+ end
80
+ end
81
+ end
82
+ end
@@ -0,0 +1,87 @@
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 client object initialization
23
+ #
24
+ class ClientInitializationPresenter
25
+ ##
26
+ # Create an client init presenter.
27
+ #
28
+ # @param proto [Google::Cloud::Tools::SnippetGen::ConfigLanguage::V1::Snippet::ClientInitialization]
29
+ # The protobuf representation
30
+ # @param json [String]
31
+ # The JSON representation
32
+ # @param phase1 [Boolean] Whether to inject phase 1 content
33
+ # @param client_type [String] The fully qualified class name of the client
34
+ #
35
+ def initialize proto, json, phase1:, client_type:
36
+ @render_lines = []
37
+ if json&.key? "preClientInitialization"
38
+ proto.pre_client_initialization.each_with_index do |stmt_proto, index|
39
+ statement = StatementPresenter.new stmt_proto, json["preClientInitialization"][index]
40
+ @render_lines += statement.render_lines
41
+ end
42
+ elsif phase1
43
+ @render_lines << "# Create a client object. The client can be reused for multiple calls."
44
+ end
45
+ @render_lines += build_create_code proto, client_type
46
+ @render = @render_lines.join "\n"
47
+ end
48
+
49
+ ##
50
+ # The lines of rendered code
51
+ # @return [Array<String>]
52
+ #
53
+ attr_reader :render_lines
54
+
55
+ ##
56
+ # The rendered code as a single string, possibly with line breaks
57
+ # @return [String]
58
+ #
59
+ attr_reader :render
60
+
61
+ private
62
+
63
+ def build_create_code proto, client_type
64
+ create_code = "client = #{client_type}.new"
65
+ if proto&.custom_service_endpoint
66
+ endpoint = build_endpoint proto.custom_service_endpoint
67
+ [
68
+ "#{create_code} do |config|",
69
+ " config.endpoint = #{endpoint.inspect}",
70
+ "end"
71
+ ]
72
+ else
73
+ [create_code]
74
+ end
75
+ end
76
+
77
+ def build_endpoint proto
78
+ init_module = Google::Cloud::Tools::SnippetGen::ConfigLanguage::V1::Snippet::ClientInitialization
79
+ schema = proto.schema == init_module::ServiceEndpoint::ServiceEndpointSchema::HTTP ? "http://" : "https://"
80
+ region = proto.region.to_s.empty? ? "" : "#{proto.region}-"
81
+ port = proto.port.zero? ? "" : ":#{proto.port}"
82
+ [schema, region, proto.host, port].join
83
+ end
84
+ end
85
+ end
86
+ end
87
+ end
@@ -0,0 +1,91 @@
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 declaration
23
+ #
24
+ class DeclarationPresenter
25
+ ##
26
+ # Create a declaration presenter.
27
+ #
28
+ # @param proto [Google::Cloud::Tools::SnippetGen::ConfigLanguage::V1::Statement::Declaration]
29
+ # The protobuf representation of the declaration
30
+ # @param json [String]
31
+ # The JSON representation of the declaration
32
+ #
33
+ def initialize proto, json
34
+ @render = @render_lines = @name = @description = @has_value = nil
35
+ return unless proto && json
36
+ @name = proto.name
37
+ @description = proto.description unless proto.description.empty?
38
+ @render_lines = @description ? ["# #{@description}"] : []
39
+ expr = ExpressionPresenter.new proto.value, json["value"]
40
+ @has_value = expr.exist?
41
+ if @has_value
42
+ expr_lines = expr.render_lines
43
+ expr_lines[0] = "#{proto.name} = #{expr_lines.first}"
44
+ @render_lines += expr_lines
45
+ end
46
+ @render = @render_lines.join "\n"
47
+ end
48
+
49
+ ##
50
+ # The name of the variable being declared
51
+ # @return [String]
52
+ #
53
+ attr_reader :name
54
+
55
+ ##
56
+ # The description, or nil if none
57
+ # @return [String,nil]
58
+ #
59
+ attr_reader :description
60
+
61
+ ##
62
+ # The lines of rendered code
63
+ # @return [Array<String>]
64
+ #
65
+ attr_reader :render_lines
66
+
67
+ ##
68
+ # The rendered code as a single string, possibly with line breaks
69
+ # @return [String]
70
+ #
71
+ attr_reader :render
72
+
73
+ ##
74
+ # Whether the declaration could be interpreted.
75
+ # @return [Boolean]
76
+ #
77
+ def exist?
78
+ !render_lines.nil?
79
+ end
80
+
81
+ ##
82
+ # Whether the declaration includes a value.
83
+ # @return [Boolean]
84
+ #
85
+ def value?
86
+ @has_value
87
+ end
88
+ end
89
+ end
90
+ end
91
+ end
@@ -0,0 +1,135 @@
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 an expression
23
+ #
24
+ class ExpressionPresenter
25
+ ##
26
+ # Create an expression presenter.
27
+ #
28
+ # @param proto [Google::Cloud::Tools::SnippetGen::ConfigLanguage::V1::Expression]
29
+ # The protobuf representation of the expression
30
+ # @param json [String]
31
+ # The JSON representation of the expression
32
+ #
33
+ def initialize proto, json
34
+ @render_lines =
35
+ if json&.key? "stringValue"
36
+ render_string proto
37
+ elsif json&.key? "numberValue"
38
+ render_number proto
39
+ elsif json&.key? "booleanValue"
40
+ render_boolean proto
41
+ elsif json&.key? "nullValue"
42
+ ["nil"]
43
+ elsif json&.key? "nameValue"
44
+ render_name proto.name_value
45
+ elsif json&.key? "complexValue"
46
+ render_complex proto.complex_value.properties, json["complexValue"]["properties"]
47
+ elsif json&.key? "listValue"
48
+ render_list proto.list_value.values, json["listValue"]["values"]
49
+ elsif json&.key? "mapValue"
50
+ render_map proto.map_value, json["mapValue"]
51
+ end
52
+ @render = @render_lines&.join " "
53
+ end
54
+
55
+ ##
56
+ # The lines of rendered code
57
+ # @return [Array<String>]
58
+ #
59
+ attr_reader :render_lines
60
+
61
+ ##
62
+ # The rendered code as a single string, possibly with line breaks
63
+ # @return [String]
64
+ #
65
+ attr_reader :render
66
+
67
+ ##
68
+ # Whether the expression could be interpreted.
69
+ # @return [Boolean]
70
+ #
71
+ def exist?
72
+ !render_lines.nil?
73
+ end
74
+
75
+ private
76
+
77
+ def render_string proto
78
+ [proto.string_value.inspect]
79
+ end
80
+
81
+ def render_number proto
82
+ value = proto.number_value
83
+ value = value.to_i if value == value.to_i
84
+ [value.inspect]
85
+ end
86
+
87
+ def render_boolean proto
88
+ [proto.boolean_value.inspect]
89
+ end
90
+
91
+ def render_name proto
92
+ line = ([proto.name] + Array(proto.path&.to_a)).join "."
93
+ [line]
94
+ end
95
+
96
+ def render_complex proto, json
97
+ lines = ["{"]
98
+ proto.each do |key, value_expr|
99
+ value_presenter = ExpressionPresenter.new value_expr, json[key]
100
+ value_lines = value_presenter.render_lines
101
+ next unless value_lines
102
+ lines[lines.size - 1] = "#{lines.last}," if lines.size > 1
103
+ value_lines[0] = "#{key}: #{value_lines.first}"
104
+ lines += value_lines.map { |line| " #{line}" }
105
+ end
106
+ lines + ["}"]
107
+ end
108
+
109
+ def render_list proto, json
110
+ lines = ["["]
111
+ proto.each_with_index do |item, index|
112
+ expr = ExpressionPresenter.new item, json[index]
113
+ value_lines = expr.render_lines
114
+ lines[lines.size - 1] = "#{lines.last}," if lines.size > 1
115
+ lines += value_lines.map { |line| " #{line}" }
116
+ end
117
+ lines + ["]"]
118
+ end
119
+
120
+ def render_map proto, json
121
+ lines = ["{"]
122
+ proto.keys.zip(proto.values).each_with_index do |(key, value), index|
123
+ key_lines = ExpressionPresenter.new(key, json["keys"][index]).render_lines
124
+ value_lines = ExpressionPresenter.new(value, json["values"][index]).render_lines
125
+ next unless key_lines && value_lines
126
+ elem_lines = key_lines[0..-2] + ["#{key_lines.last} => #{value_lines.first}"] + value_lines[1..]
127
+ lines[lines.size - 1] = "#{lines.last}," if lines.size > 1
128
+ lines += elem_lines.map { |line| " #{line}" }
129
+ end
130
+ lines + ["}"]
131
+ end
132
+ end
133
+ end
134
+ end
135
+ end