gapic-generator 0.10.1 → 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 (257) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +333 -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 -32
  12. data/lib/gapic/generators/default_generator_parameters.rb +11 -3
  13. data/lib/gapic/grpc_service_config/{service_config.rb → config.rb} +2 -2
  14. data/lib/gapic/grpc_service_config/parser.rb +10 -10
  15. data/lib/gapic/model/api_metadata.rb +173 -0
  16. data/lib/gapic/model/method/http_annotation.rb +221 -0
  17. data/lib/gapic/model/method/lro.rb +163 -0
  18. data/lib/gapic/model/method/routing.rb +248 -0
  19. data/lib/gapic/model/mixins.rb +247 -0
  20. data/lib/gapic/model/model_error.rb +26 -0
  21. data/lib/gapic/model/service/nonstandard_lro_provider.rb +292 -0
  22. data/lib/gapic/model.rb +22 -0
  23. data/lib/gapic/package_snippets.rb +159 -0
  24. data/lib/gapic/path_pattern/parser.rb +11 -2
  25. data/lib/gapic/path_pattern/pattern.rb +64 -1
  26. data/lib/gapic/path_pattern/segment.rb +108 -13
  27. data/lib/gapic/presenters/enum_presenter.rb +14 -0
  28. data/lib/gapic/presenters/enum_value_presenter.rb +4 -1
  29. data/lib/gapic/presenters/field_presenter.rb +78 -21
  30. data/lib/gapic/presenters/gem_presenter.rb +140 -34
  31. data/lib/gapic/presenters/{service_config_presenter.rb → grpc_service_config_presenter.rb} +1 -1
  32. data/lib/gapic/presenters/message_presenter.rb +15 -0
  33. data/lib/gapic/presenters/method/http_binding_presenter.rb +128 -0
  34. data/lib/gapic/presenters/method/rest_pagination_info.rb +25 -16
  35. data/lib/gapic/presenters/method_presenter.rb +149 -35
  36. data/lib/gapic/presenters/method_rest_presenter.rb +79 -168
  37. data/lib/gapic/presenters/package_presenter.rb +63 -18
  38. data/lib/gapic/presenters/resource_presenter.rb +9 -3
  39. data/lib/gapic/presenters/service/lro_client_presenter.rb +90 -0
  40. data/lib/gapic/presenters/service/mixin_client_presenter.rb +89 -0
  41. data/lib/gapic/presenters/service/sub_client_presenter.rb +84 -0
  42. data/lib/gapic/presenters/service_presenter.rb +361 -27
  43. data/lib/gapic/presenters/service_rest_presenter.rb +247 -13
  44. data/lib/gapic/presenters/snippet/client_call_presenter.rb +82 -0
  45. data/lib/gapic/presenters/snippet/client_initialization_presenter.rb +87 -0
  46. data/lib/gapic/presenters/snippet/declaration_presenter.rb +91 -0
  47. data/lib/gapic/presenters/snippet/expression_presenter.rb +135 -0
  48. data/lib/gapic/presenters/snippet/iteration_presenter.rb +118 -0
  49. data/lib/gapic/presenters/snippet/parameter_presenter.rb +67 -0
  50. data/lib/gapic/presenters/snippet/request_initialization_presenters.rb +202 -0
  51. data/lib/gapic/presenters/snippet/response_handling_presenters.rb +329 -0
  52. data/lib/gapic/presenters/snippet/statement_presenter.rb +134 -0
  53. data/lib/gapic/presenters/snippet/type_presenter.rb +98 -0
  54. data/lib/gapic/presenters/snippet_presenter.rb +199 -9
  55. data/lib/gapic/presenters.rb +5 -1
  56. data/lib/gapic/runner.rb +1 -1
  57. data/lib/gapic/schema/api.rb +105 -5
  58. data/lib/gapic/schema/loader.rb +69 -21
  59. data/lib/gapic/schema/parameter_schema.rb +8 -8
  60. data/lib/gapic/schema/proto_tools.rb +193 -0
  61. data/lib/gapic/schema/request_param_parser.rb +5 -7
  62. data/lib/gapic/schema/service_config_parser.rb +152 -0
  63. data/lib/gapic/schema/wrappers.rb +309 -25
  64. data/lib/gapic/uri_template/parser.rb +15 -7
  65. data/lib/google/cloud/tools/snippetgen/configlanguage/v1/snippet_config_language_pb.rb +104 -0
  66. data/lib/google/cloud/tools/snippetgen/snippetindex/v1/snippet_index_pb.rb +58 -0
  67. data/lib/google/protobuf/compiler/plugin_pb.rb +47 -0
  68. data/templates/default/binding_override.text.erb +6 -0
  69. data/templates/default/gem/gemfile.text.erb +12 -0
  70. data/templates/default/gem/{gemspec.erb → gemspec.text.erb} +3 -11
  71. data/templates/default/gem/{readme.erb → readme.text.erb} +10 -6
  72. data/templates/default/gem/{rubocop.erb → rubocop.text.erb} +3 -0
  73. data/templates/default/gem/{test_helper.erb → test_helper.text.erb} +4 -2
  74. data/templates/default/gem/toys.text.erb +12 -0
  75. data/templates/default/gem/{yardopts.erb → yardopts.text.erb} +1 -1
  76. data/templates/default/helpers/default_helper.rb +33 -1
  77. data/templates/default/lib/_binding_override.text.erb +49 -0
  78. data/templates/default/lib/{_package.erb → _package.text.erb} +7 -6
  79. data/templates/default/lib/_package_rest.text.erb +24 -0
  80. data/templates/default/lib/{_service.erb → _service.text.erb} +14 -20
  81. data/templates/default/lib/package/_self_configure.text.erb +16 -0
  82. data/templates/default/lib/package/_self_configure_defaults.text.erb +13 -0
  83. data/templates/default/lib/package/self_configure/_binding_default.text.erb +15 -0
  84. data/templates/default/lib/rest/_rest.text.erb +46 -0
  85. data/templates/default/package_rest.text.erb +6 -0
  86. data/templates/default/proto_docs/_deprecated.text.erb +9 -0
  87. data/templates/default/proto_docs/{_enum.erb → _enum.text.erb} +1 -0
  88. data/templates/default/proto_docs/{_message.erb → _message.text.erb} +2 -0
  89. data/templates/default/service/client/{_client.erb → _client.text.erb} +77 -17
  90. data/templates/default/service/client/{_config.erb → _config.text.erb} +39 -8
  91. data/templates/default/service/client/_nonstandard_lro.text.erb +57 -0
  92. data/templates/default/service/client/{_operations.erb → _operations.text.erb} +24 -3
  93. data/templates/default/service/client/{_self_configure_defaults.erb → _self_configure_defaults.text.erb} +2 -2
  94. data/templates/default/service/client/method/{_def.erb → _def.text.erb} +2 -2
  95. data/templates/default/service/client/method/def/{_options_defaults.erb → _options_defaults.text.erb} +3 -9
  96. data/templates/default/service/client/method/def/_request_normal.text.erb +18 -0
  97. data/templates/default/service/client/method/def/_request_streaming.text.erb +23 -0
  98. data/templates/default/service/client/method/def/_response.text.erb +10 -0
  99. data/templates/default/service/client/method/def/_response_nonstandard_lro.text.erb +23 -0
  100. data/templates/default/service/client/method/def/_response_normal.text.erb +4 -0
  101. data/templates/default/service/client/method/def/{_response_normal.erb → _response_normal_lro.text.erb} +1 -3
  102. data/templates/default/service/client/method/def/{_response_paged.erb → _response_paged.text.erb} +1 -1
  103. data/templates/default/service/client/method/def/_routing_params.text.erb +36 -0
  104. data/templates/default/service/client/method/docs/{_request_normal.erb → _request_normal.text.erb} +1 -1
  105. data/templates/default/service/client/method/docs/_snippets.text.erb +6 -0
  106. data/templates/default/service/client/resource/_def.text.erb +7 -0
  107. data/templates/default/service/nonstandard_lro.text.erb +6 -0
  108. data/templates/default/service/rest/client/_client.text.erb +202 -0
  109. data/templates/default/service/rest/client/_config.text.erb +178 -0
  110. data/templates/default/service/rest/client/_operations.text.erb +124 -0
  111. data/templates/default/service/rest/client/method/{_def.erb → _def.text.erb} +7 -1
  112. data/templates/default/service/rest/client/method/def/{_options_defaults.erb → _options_defaults.text.erb} +8 -3
  113. data/templates/default/service/rest/client/method/def/_response.text.erb +12 -0
  114. data/templates/default/service/rest/client/method/def/_response_nonstandard_lro.text.erb +24 -0
  115. data/templates/default/service/rest/client/method/def/_response_normal.text.erb +5 -0
  116. data/templates/default/service/rest/client/method/def/_response_normal_lro.text.erb +7 -0
  117. data/templates/default/service/rest/client/method/def/_response_paged.text.erb +7 -0
  118. data/templates/default/service/rest/client/method/def/_response_server_streaming.text.erb +11 -0
  119. data/templates/default/service/rest/client/method/docs/{_request.erb → _request.text.erb} +1 -3
  120. data/templates/default/service/rest/client/method/docs/_result.text.erb +10 -0
  121. data/templates/default/service/rest/client/method/docs/_snippets.text.erb +6 -0
  122. data/templates/default/service/rest/nonstandard_lro.text.erb +6 -0
  123. data/templates/default/service/rest/operations.text.erb +6 -0
  124. data/templates/default/service/rest/service_stub/_service_stub.text.erb +63 -0
  125. data/templates/default/service/rest/service_stub/grpc_transcoding_method/_def.text.erb +37 -0
  126. data/templates/default/service/rest/service_stub/method/_def.text.erb +35 -0
  127. data/templates/default/service/rest/service_stub/method/def/_response.text.erb +37 -0
  128. data/templates/default/service/rest/test/{client.erb → client.text.erb} +3 -3
  129. data/templates/default/service/rest/test/method/_assert_response.text.erb +2 -0
  130. data/templates/default/service/rest/test/method/{_configure.erb → _configure.text.erb} +3 -2
  131. data/templates/default/service/rest/test/method/_normal.text.erb +60 -0
  132. data/templates/default/service/rest/test/method/_server.text.erb +60 -0
  133. data/templates/default/service/rest/test/method/{_setup.erb → _setup.text.erb} +26 -10
  134. data/templates/default/service/test/{_resource.erb → _resource.text.erb} +1 -1
  135. data/templates/default/service/test/{client.erb → client.text.erb} +3 -2
  136. data/templates/default/service/test/client_paths.text.erb +33 -0
  137. data/templates/default/service/test/method/{_assert_response.erb → _assert_response.text.erb} +3 -0
  138. data/templates/default/service/test/method/{_bidi.erb → _bidi.text.erb} +1 -1
  139. data/templates/default/service/test/method/{_client.erb → _client.text.erb} +1 -1
  140. data/templates/default/service/test/method/{_configure.erb → _configure.text.erb} +2 -1
  141. data/templates/default/service/test/method/{_normal.erb → _normal.text.erb} +1 -1
  142. data/templates/default/service/test/method/{_server.erb → _server.text.erb} +1 -1
  143. data/templates/default/service/test/method/{_setup.erb → _setup.text.erb} +19 -2
  144. data/templates/default/snippets/{gemfile.erb → gemfile.text.erb} +2 -2
  145. data/templates/default/snippets/snippet/_body.text.erb +24 -0
  146. data/templates/default/snippets/snippet/_inline.text.erb +11 -0
  147. data/templates/default/snippets/snippet/_standalone.text.erb +25 -0
  148. data/templates/default/snippets/{standalone.erb → standalone.text.erb} +1 -1
  149. metadata +209 -230
  150. data/lib/google/api/annotations.pb.rb +0 -39
  151. data/lib/google/api/client.pb.rb +0 -43
  152. data/lib/google/api/field_behavior.pb.rb +0 -51
  153. data/lib/google/api/http.pb.rb +0 -60
  154. data/lib/google/api/resource.pb.rb +0 -80
  155. data/lib/google/longrunning/operations.pb.rb +0 -115
  156. data/lib/google/protobuf/any.pb.rb +0 -40
  157. data/lib/google/protobuf/compiler/plugin.pb.rb +0 -79
  158. data/lib/google/protobuf/descriptor.pb.rb +0 -360
  159. data/lib/google/protobuf/empty.pb.rb +0 -36
  160. data/lib/google/rpc/status.pb.rb +0 -46
  161. data/templates/default/gem/gemfile.erb +0 -4
  162. data/templates/default/lib/rest/_rest.erb +0 -9
  163. data/templates/default/service/client/method/def/_request_normal.erb +0 -4
  164. data/templates/default/service/client/method/def/_request_streaming.erb +0 -9
  165. data/templates/default/service/client/method/def/_response.erb +0 -6
  166. data/templates/default/service/client/method/docs/_deprecated.erb +0 -5
  167. data/templates/default/service/client/method/docs/_snippets.erb +0 -6
  168. data/templates/default/service/client/resource/_def.erb +0 -6
  169. data/templates/default/service/rest/client/_client.erb +0 -106
  170. data/templates/default/service/rest/client/_config.erb +0 -122
  171. data/templates/default/service/rest/client/method/def/_response.erb +0 -8
  172. data/templates/default/service/rest/client/method/def/_response_lro.erb +0 -7
  173. data/templates/default/service/rest/client/method/def/_response_normal.erb +0 -6
  174. data/templates/default/service/rest/client/method/def/_response_paged.erb +0 -7
  175. data/templates/default/service/rest/client/method/docs/_result.erb +0 -6
  176. data/templates/default/service/rest/service_stub/_service_stub.erb +0 -25
  177. data/templates/default/service/rest/service_stub/grpc_transcoding_method/_def.erb +0 -24
  178. data/templates/default/service/rest/service_stub/method/_def.erb +0 -20
  179. data/templates/default/service/rest/service_stub/method/def/_response.erb +0 -17
  180. data/templates/default/service/rest/test/method/_assert_response.erb +0 -2
  181. data/templates/default/service/rest/test/method/_normal.erb +0 -71
  182. data/templates/default/service/test/client_paths.erb +0 -15
  183. data/templates/default/snippets/snippet/_structure.erb +0 -71
  184. /data/gem_templates/{binary.erb → binary.text.erb} +0 -0
  185. /data/gem_templates/{dockerfile.erb → dockerfile.text.erb} +0 -0
  186. /data/gem_templates/{entrypoint.erb → entrypoint.text.erb} +0 -0
  187. /data/gem_templates/{gapic_sh.erb → gapic_sh.text.erb} +0 -0
  188. /data/gem_templates/{gemfile.erb → gemfile.text.erb} +0 -0
  189. /data/gem_templates/{gemspec.erb → gemspec.text.erb} +0 -0
  190. /data/gem_templates/{generator.erb → generator.text.erb} +0 -0
  191. /data/gem_templates/{gitignore.erb → gitignore.text.erb} +0 -0
  192. /data/gem_templates/{rakefile.erb → rakefile.text.erb} +0 -0
  193. /data/gem_templates/{readme.erb → readme.text.erb} +0 -0
  194. /data/gem_templates/{rubocop.erb → rubocop.text.erb} +0 -0
  195. /data/gem_templates/shared/{_header.erb → _header.text.erb} +0 -0
  196. /data/gem_templates/shared/{_license.erb → _license.text.erb} +0 -0
  197. /data/gem_templates/shared/{_warning.erb → _warning.text.erb} +0 -0
  198. /data/gem_templates/{test_generator.erb → test_generator.text.erb} +0 -0
  199. /data/gem_templates/{test_helper.erb → test_helper.text.erb} +0 -0
  200. /data/gem_templates/{version.erb → version.text.erb} +0 -0
  201. /data/templates/default/gem/{_version.erb → _version.text.erb} +0 -0
  202. /data/templates/default/gem/{changelog.erb → changelog.text.erb} +0 -0
  203. /data/templates/default/gem/{entrypoint.erb → entrypoint.text.erb} +0 -0
  204. /data/templates/default/gem/{gapic_metadata_json.erb → gapic_metadata_json.text.erb} +0 -0
  205. /data/templates/default/gem/{gitignore.erb → gitignore.text.erb} +0 -0
  206. /data/templates/default/gem/{license.erb → license.text.erb} +0 -0
  207. /data/templates/default/gem/{rakefile.erb → rakefile.text.erb} +0 -0
  208. /data/templates/default/gem/{version.erb → version.text.erb} +0 -0
  209. /data/templates/default/layouts/{_ruby.erb → _ruby.text.erb} +0 -0
  210. /data/templates/default/{package.erb → package.text.erb} +0 -0
  211. /data/templates/default/proto_docs/{_proto_file.erb → _proto_file.text.erb} +0 -0
  212. /data/templates/default/proto_docs/{proto_file.erb → proto_file.text.erb} +0 -0
  213. /data/templates/default/proto_docs/{readme.erb → readme.text.erb} +0 -0
  214. /data/templates/default/service/{_helpers.erb → _helpers.text.erb} +0 -0
  215. /data/templates/default/service/client/{_credentials.erb → _credentials.text.erb} +0 -0
  216. /data/templates/default/service/client/{_paths.erb → _paths.text.erb} +0 -0
  217. /data/templates/default/service/client/{_requires.erb → _requires.text.erb} +0 -0
  218. /data/templates/default/service/client/{_resource.erb → _resource.text.erb} +0 -0
  219. /data/templates/default/service/client/{_self_configure.erb → _self_configure.text.erb} +0 -0
  220. /data/templates/default/service/client/method/def/{_request.erb → _request.text.erb} +0 -0
  221. /data/templates/default/service/client/method/def/{_rescue.erb → _rescue.text.erb} +0 -0
  222. /data/templates/default/service/client/method/docs/{_error.erb → _error.text.erb} +0 -0
  223. /data/templates/default/service/client/method/docs/{_request.erb → _request.text.erb} +0 -0
  224. /data/templates/default/service/client/method/docs/{_request_field.erb → _request_field.text.erb} +0 -0
  225. /data/templates/default/service/client/method/docs/{_request_streaming.erb → _request_streaming.text.erb} +0 -0
  226. /data/templates/default/service/client/method/docs/{_response.erb → _response.text.erb} +0 -0
  227. /data/templates/default/service/client/method/docs/{_sample.erb → _sample.text.erb} +0 -0
  228. /data/templates/default/service/client/method/docs/{_sample_response.erb → _sample_response.text.erb} +0 -0
  229. /data/templates/default/service/client/method/docs/{_samples.erb → _samples.text.erb} +0 -0
  230. /data/templates/default/service/client/method/docs/request_field/{_arg.erb → _arg.text.erb} +0 -0
  231. /data/templates/default/service/client/method/docs/request_field/{_hash.erb → _hash.text.erb} +0 -0
  232. /data/templates/default/service/client/method/docs/sample_response/{_comment.erb → _comment.text.erb} +0 -0
  233. /data/templates/default/service/client/method/docs/sample_response/{_define.erb → _define.text.erb} +0 -0
  234. /data/templates/default/service/client/method/docs/sample_response/{_loop.erb → _loop.text.erb} +0 -0
  235. /data/templates/default/service/client/method/docs/sample_response/{_print.erb → _print.text.erb} +0 -0
  236. /data/templates/default/service/client/method/docs/sample_response/{_write_file.erb → _write_file.text.erb} +0 -0
  237. /data/templates/default/service/client/resource/{_doc.erb → _doc.text.erb} +0 -0
  238. /data/templates/default/service/client/resource/{_multi.erb → _multi.text.erb} +0 -0
  239. /data/templates/default/service/client/resource/{_single.erb → _single.text.erb} +0 -0
  240. /data/templates/default/service/{client.erb → client.text.erb} +0 -0
  241. /data/templates/default/service/{credentials.erb → credentials.text.erb} +0 -0
  242. /data/templates/default/service/{operations.erb → operations.text.erb} +0 -0
  243. /data/templates/default/service/{paths.erb → paths.text.erb} +0 -0
  244. /data/templates/default/service/rest/client/method/def/{_rescue.erb → _rescue.text.erb} +0 -0
  245. /data/templates/default/service/rest/client/method/docs/{_error.erb → _error.text.erb} +0 -0
  246. /data/templates/default/service/rest/{client.erb → client.text.erb} +0 -0
  247. /data/templates/default/service/rest/{grpc_transcoding.erb → grpc_transcoding.text.erb} +0 -0
  248. /data/templates/default/service/rest/service_stub/grpc_transcoding_method/def/{_query_string_param.erb → _query_string_param.text.erb} +0 -0
  249. /data/templates/default/service/rest/service_stub/method/def/{_request.erb → _request.text.erb} +0 -0
  250. /data/templates/default/service/rest/{service_stub.erb → service_stub.text.erb} +0 -0
  251. /data/templates/default/service/{rest.erb → rest.text.erb} +0 -0
  252. /data/templates/default/service/test/{client_operations.erb → client_operations.text.erb} +0 -0
  253. /data/templates/default/service/test/{smoke.erb → smoke.text.erb} +0 -0
  254. /data/templates/default/{service.erb → service.text.erb} +0 -0
  255. /data/templates/default/shared/{_header.erb → _header.text.erb} +0 -0
  256. /data/templates/default/shared/{_license.erb → _license.text.erb} +0 -0
  257. /data/templates/default/shared/{_warning.erb → _warning.text.erb} +0 -0
@@ -32,15 +32,45 @@ module Gapic
32
32
  # @return [Gapic::Presenters::MethodRestPresenter]
33
33
  attr_accessor :rest
34
34
 
35
+ # @return [Gapic::Model::Method::Routing]
36
+ attr_accessor :routing
37
+
38
+ # @return [Gapic::Model::Method::HttpAnnotation]
39
+ attr_accessor :http
40
+
41
+ # @return [Array<Gapic::Presenters::Method::HttpBindingsPresenter>]
42
+ attr_accessor :http_bindings
43
+
44
+ # @return [Gapic::Model::Method::AipLro, Gapic::Model::Method::NonStandardLro, Gapic::Model::Method::NoLro]
45
+ attr_accessor :lro
46
+
47
+ # @return [String] String representation of this presenter type.
48
+ attr_reader :type
49
+
35
50
  ##
36
51
  # @param service_presenter [Gapic::Presenters::ServicePresenter]
37
52
  # @param api [Gapic::Schema::Api]
38
53
  # @param method [Gapic::Schema::Method]
54
+ #
39
55
  def initialize service_presenter, api, method
40
56
  @service_presenter = service_presenter
41
57
  @api = api
42
58
  @method = method
43
- @rest = MethodRestPresenter.new self, api
59
+ @type = "method"
60
+
61
+ # Service config override should only happen for Operations.
62
+ # For the main services we expect service config overrides to be rolled into the protos by the publisher.
63
+ # For all other mixins, since we do not generate them for the service,
64
+ # the overrides should get configured separately.
65
+ is_lro = @service_presenter.address.join(".") == Gapic::Model::Mixins::LRO_SERVICE
66
+ service_config_override_http = is_lro ? @api.service_config : nil
67
+ @http = Gapic::Model::Method::HttpAnnotation.create_with_override @method, service_config_override_http
68
+
69
+ @http_bindings = @http.bindings.map { |binding| Gapic::Presenters::Method::HttpBindingPresenter.new binding }
70
+ @routing = Gapic::Model::Method::Routing.new @method.routing, @http
71
+ @lro = Gapic::Model::Method.parse_lro @method, @api
72
+
73
+ @rest = MethodRestPresenter.new self, @api
44
74
  end
45
75
 
46
76
  ##
@@ -50,8 +80,22 @@ module Gapic
50
80
  @service_presenter
51
81
  end
52
82
 
53
- def snippet
54
- SnippetPresenter.new self, @api
83
+ ##
84
+ # Return the "primary" snippet for this method. This should be used for
85
+ # inline snippets.
86
+ # @return [Gapic::Presenters::SnippetPresenter]
87
+ #
88
+ def snippet transport: nil
89
+ configs = @api.snippet_configs_for @method.full_name
90
+ SnippetPresenter.new self, @api, config: configs.first, transport: transport
91
+ end
92
+
93
+ ##
94
+ # @return [Array<Gapic::Presenters::SnippetPresenter>]
95
+ #
96
+ def all_snippets transport: nil
97
+ configs = @api.snippet_configs_for(@method.full_name) + [nil]
98
+ configs.map { |config| SnippetPresenter.new self, @api, config: config, transport: transport }
55
99
  end
56
100
 
57
101
  def generate_yardoc_snippets?
@@ -66,6 +110,18 @@ module Gapic
66
110
  end
67
111
  end
68
112
 
113
+ # Proto name of the method (PascalCase)
114
+ # @return [String]
115
+ def grpc_name
116
+ @method.name
117
+ end
118
+
119
+ # Fully qualified proto name of the method (namespace.PascalCase)
120
+ # @return [String]
121
+ def grpc_full_name
122
+ @method.full_name
123
+ end
124
+
69
125
  def kind
70
126
  if client_streaming?
71
127
  if server_streaming?
@@ -80,8 +136,15 @@ module Gapic
80
136
  end
81
137
  end
82
138
 
83
- def doc_description
84
- @method.docs_leading_comments
139
+ ##
140
+ # The description as it should appear in YARD docs.
141
+ #
142
+ # @param transport [:grpc,:rest] Whether xref links should go to REST or
143
+ # gRPC client classes. Uses the default transport if not provided.
144
+ # @return [String]
145
+ #
146
+ def doc_description transport: nil
147
+ @method.docs_leading_comments transport: transport
85
148
  end
86
149
 
87
150
  def doc_response_type
@@ -98,7 +161,7 @@ module Gapic
98
161
  end
99
162
 
100
163
  ##
101
- # @return [Boolean]
164
+ # @return [Boolean] Whether the method is marked as deprecated.
102
165
  #
103
166
  def is_deprecated?
104
167
  @method.is_deprecated?
@@ -109,6 +172,14 @@ module Gapic
109
172
  arguments.map { |arg| FieldPresenter.new @api, @method.input, arg }
110
173
  end
111
174
 
175
+ # @return [Array<Gapic::Presenters::FieldPresenter>] List of auto populated fields.
176
+ def auto_populated_fields
177
+ field_names_to_filter = @api.api_metadata.auto_populated_fields_by_method_name[name] || []
178
+ @method.input.fields.filter_map do |field|
179
+ FieldPresenter.new @api, @method.input, field if field_names_to_filter.include? field.name
180
+ end
181
+ end
182
+
112
183
  def fields
113
184
  @method.input.fields.map { |field| FieldPresenter.new @api, @method.input, field }
114
185
  end
@@ -152,25 +223,20 @@ module Gapic
152
223
  "Access the result along with the RPC operation"
153
224
  end
154
225
 
226
+ # Type for MethodPresenter#yield_params
227
+ YieldParams = Struct.new :name, :doc_types
228
+
155
229
  def yield_params
156
230
  if lro?
157
- return [
158
- OpenStruct.new(
159
- name: "operation",
160
- doc_types: "::Gapic::Operation"
161
- )
231
+ [
232
+ YieldParams.new("operation", "::Gapic::Operation")
233
+ ]
234
+ else
235
+ [
236
+ YieldParams.new("result", return_type),
237
+ YieldParams.new("operation", "::GRPC::ActiveCall::Operation")
162
238
  ]
163
239
  end
164
- [
165
- OpenStruct.new(
166
- name: "result",
167
- doc_types: return_type
168
- ),
169
- OpenStruct.new(
170
- name: "operation",
171
- doc_types: "::GRPC::ActiveCall::Operation"
172
- )
173
- ]
174
240
  end
175
241
 
176
242
  # @api.incode samples and sample_configs are yaml configuration files such as
@@ -183,12 +249,36 @@ module Gapic
183
249
  sample_configs.map { |sample_config| SamplePresenter.new @api, sample_config }
184
250
  end
185
251
 
252
+ ##
253
+ # Whether this method uses standard (AIP-151) LROs
254
+ #
255
+ # @return [Boolean]
256
+ #
186
257
  def lro?
187
258
  return paged_response_type == "::Google::Longrunning::Operation" if paged?
188
259
 
189
260
  return_type == "::Google::Longrunning::Operation"
190
261
  end
191
262
 
263
+ ##
264
+ # Whether this method uses nonstandard LROs
265
+ #
266
+ # @return [Boolean]
267
+ #
268
+ def nonstandard_lro?
269
+ @lro.nonstandard_lro?
270
+ end
271
+
272
+ ##
273
+ # The presenter for the nonstandard LRO client of the kind this method uses
274
+ #
275
+ # @return [Gapic::Presenters::Service::LroClientPresenter, nil]
276
+ #
277
+ def nonstandard_lro_client
278
+ return unless nonstandard_lro?
279
+ service.nonstandard_lros.find { |model| model.service == @lro.service_full_name }
280
+ end
281
+
192
282
  def client_streaming?
193
283
  @method.client_streaming
194
284
  end
@@ -216,24 +306,35 @@ module Gapic
216
306
  return nil unless paged_response? @method.output
217
307
 
218
308
  repeated_field = @method.output.fields.find do |f|
219
- f.label == Google::Protobuf::FieldDescriptorProto::Label::LABEL_REPEATED &&
220
- f.type == Google::Protobuf::FieldDescriptorProto::Type::TYPE_MESSAGE
309
+ f.label == :LABEL_REPEATED && f.type == :TYPE_MESSAGE
221
310
  end
222
311
  message_ruby_type repeated_field.message
223
312
  end
224
313
 
314
+ ##
315
+ # @return [String] The name of the repeated field in paginated responses
316
+ #
317
+ def paged_response_repeated_field_name
318
+ return nil unless paged_response? @method.output
319
+
320
+ repeated_field = @method.output.fields.find do |f|
321
+ f.label == :LABEL_REPEATED && f.type == :TYPE_MESSAGE
322
+ end
323
+ repeated_field.name
324
+ end
325
+
225
326
  ##
226
327
  # @return [Array<String>] The segment key names.
227
328
  #
228
329
  def routing_params
229
- rest.routing_params
330
+ @http.routing_params
230
331
  end
231
332
 
232
333
  ##
233
334
  # @return [Boolean] Whether any routing params are present
234
335
  #
235
336
  def routing_params?
236
- rest.routing_params?
337
+ @routing.routing_params?
237
338
  end
238
339
 
239
340
  def grpc_service_config
@@ -243,8 +344,8 @@ module Gapic
243
344
  end
244
345
  end
245
346
 
246
- def service_config_presenter
247
- ServiceConfigPresenter.new grpc_service_config
347
+ def grpc_service_config_presenter
348
+ GrpcServiceConfigPresenter.new grpc_service_config
248
349
  end
249
350
 
250
351
  def grpc_method_name
@@ -264,12 +365,25 @@ module Gapic
264
365
  { methods: [name] }
265
366
  end
266
367
 
368
+ ##
369
+ # Whether this method can be generated in REST clients
370
+ # Only methods with http bindings can be generated, and
371
+ # additionally only unary methods are currently supported.
372
+ #
373
+ # @return [Boolean]
374
+ #
375
+ def can_generate_rest?
376
+ rest.can_generate_rest?
377
+ end
378
+
267
379
  protected
268
380
 
269
381
  def message_ruby_type message
270
382
  ruby_namespace @api, message.address.join(".")
271
383
  end
272
384
 
385
+ # @private
386
+ # BUG: This code seems to be dead
273
387
  def doc_types_for arg
274
388
  if arg.message?
275
389
  "#{message_ruby_type arg.message}, Hash"
@@ -288,12 +402,16 @@ module Gapic
288
402
  end
289
403
  end
290
404
 
405
+ # @private
406
+ # BUG: This code seems to be dead
291
407
  def doc_desc_for arg
292
408
  return nil if arg.docs.leading_comments.empty?
293
409
 
294
410
  arg.docs.leading_comments
295
411
  end
296
412
 
413
+ # @private
414
+ # BUG: This code seems to be dead
297
415
  def default_value_for arg
298
416
  if arg.message?
299
417
  "{}"
@@ -315,14 +433,11 @@ module Gapic
315
433
 
316
434
  def paged_request? request
317
435
  page_token = request.fields.find do |f|
318
- f.name == "page_token" && f.type == Google::Protobuf::FieldDescriptorProto::Type::TYPE_STRING
436
+ f.name == "page_token" && f.type == :TYPE_STRING
319
437
  end
320
438
  return false if page_token.nil?
321
439
 
322
- page_size_types = [
323
- Google::Protobuf::FieldDescriptorProto::Type::TYPE_INT32,
324
- Google::Protobuf::FieldDescriptorProto::Type::TYPE_INT64
325
- ]
440
+ page_size_types = [:TYPE_INT32, :TYPE_INT64]
326
441
  page_size = request.fields.find do |f|
327
442
  f.name == "page_size" && page_size_types.include?(f.type)
328
443
  end
@@ -333,13 +448,12 @@ module Gapic
333
448
 
334
449
  def paged_response? response
335
450
  next_page_token = response.fields.find do |f|
336
- f.name == "next_page_token" && f.type == Google::Protobuf::FieldDescriptorProto::Type::TYPE_STRING
451
+ f.name == "next_page_token" && f.type == :TYPE_STRING
337
452
  end
338
453
  return false if next_page_token.nil?
339
454
 
340
455
  repeated_field = response.fields.find do |f|
341
- f.label == Google::Protobuf::FieldDescriptorProto::Label::LABEL_REPEATED &&
342
- f.type == Google::Protobuf::FieldDescriptorProto::Type::TYPE_MESSAGE
456
+ f.label == :LABEL_REPEATED && f.type == :TYPE_MESSAGE
343
457
  end
344
458
  return false if repeated_field.nil?
345
459
 
@@ -15,7 +15,6 @@
15
15
  # limitations under the License.
16
16
 
17
17
  require "gapic/presenters/method/rest_pagination_info"
18
- require "gapic/uri_template"
19
18
 
20
19
  module Gapic
21
20
  module Presenters
@@ -24,243 +23,155 @@ module Gapic
24
23
  #
25
24
  class MethodRestPresenter
26
25
  # @return [Gapic::Presenters::Method::RestPaginationInfo]
27
- attr_reader :pagination
26
+ attr_reader :compute_pagination
27
+
28
+ attr_reader :http_bindings
29
+
30
+ # @return [String] String representation of this presenter type.
31
+ attr_reader :type
28
32
 
29
33
  ##
30
34
  # @param main_method [Gapic::Presenters::MethodPresenter] the main presenter for this method.
31
35
  # @param api [Gapic::Schema::Api]
32
36
  #
33
37
  def initialize main_method, api
34
- @api = api
35
38
  @main_method = main_method
36
- @proto_method = main_method.method
37
-
38
- @pagination = Gapic::Presenters::Method::RestPaginationInfo.new @proto_method, api
39
+ @http_bindings = main_method.http_bindings
40
+ @compute_pagination =
41
+ if @main_method.service.special_compute_behavior?
42
+ Gapic::Presenters::Method::RestPaginationInfo.new main_method.method, api
43
+ end
44
+ @type = "method"
39
45
  end
40
46
 
41
47
  ##
42
- # @return [Boolean] Whether a http verb is present for this method
48
+ # Name for the GRPC transcoding helper method
43
49
  #
44
- def verb?
45
- !verb.nil?
46
- end
47
-
48
- ##
49
- # @return [Symbol] a http verb for this method
50
+ # @return [String]
50
51
  #
51
- def verb
52
- return nil if @proto_method.http.nil?
53
-
54
- method = {
55
- get: @proto_method.http.get,
56
- post: @proto_method.http.post,
57
- put: @proto_method.http.put,
58
- patch: @proto_method.http.patch,
59
- delete: @proto_method.http.delete
60
- }.find { |_, value| !value.empty? }
61
-
62
- method[0] unless method.nil?
52
+ def transcoding_helper_name
53
+ "transcode_#{name}_request"
63
54
  end
64
55
 
65
56
  ##
66
- # @return [Boolean] Whether a method path is present and non-empty
57
+ # Method name
67
58
  #
68
- def path?
69
- !path.empty?
70
- end
71
-
72
- ##
73
- # @return [String] A method path or an empty string if not present
59
+ # @return [String]
74
60
  #
75
- def path
76
- return "" if @proto_method.http.nil?
77
-
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? }
82
-
83
- verb_path || @proto_method.http.custom&.path || ""
61
+ def name
62
+ @main_method.name
84
63
  end
85
64
 
86
- ##
87
- # @return [Boolean] Whether any routing params are present
88
- #
89
- def routing_params?
90
- routing_params.any?
65
+ # Fully qualified proto name of the method (namespace.PascalCase)
66
+ # @return [String]
67
+ def grpc_full_name
68
+ @main_method.grpc.full_name
91
69
  end
92
70
 
93
71
  ##
94
- # @return [Array<String>] The segment key names.
72
+ # Full class name of the request type
95
73
  #
96
- def routing_params
97
- Gapic::UriTemplate.parse_arguments path
98
- end
99
-
100
- ##
101
- # Performs a limited version of grpc transcoding to create a string that will interpolate
102
- # the values from the request object to create a request URI at runtime.
103
- # Currently only supports "value" into "request_object.value"
104
- # @param [String] request_obj_name the name of the request object for the interpolation
105
- # defaults to "request_pb"
106
- # @return [String] A string to interpolate values from the request object into URI
74
+ # @return [String]
107
75
  #
108
- def uri_interpolated request_obj_name = "request_pb"
109
- return path unless routing_params?
110
-
111
- routing_params.reduce path do |uri, param|
112
- param_esc = Regexp.escape param
113
- uri.gsub(/{#{param_esc}[^}]*}/, "\#{#{request_obj_name}.#{param}}")
114
- end
76
+ def request_type
77
+ @main_method.request_type
115
78
  end
116
79
 
117
80
  ##
118
- # @return [Boolean] Whether method has body specified in proto
81
+ # Full class name of the raw return type of the RPC
119
82
  #
120
- def body?
121
- return false if @proto_method.http.nil?
122
-
123
- !@proto_method.http.body.empty?
124
- end
125
-
126
- ##
127
- # Name of the variable to use for storing the body result of the transcoding call
128
- # Normally "body" but use "_body" for discarding the result for
129
- # the calls that do not send body
130
83
  # @return [String]
131
- def body_var_name
132
- body? ? "body" : "_body"
133
- end
134
-
135
- ##
136
- # @return [String] A body specified for the given method in proto or an empty string if not specified
137
- #
138
- def body
139
- @proto_method.http&.body || ""
140
- end
141
-
142
- ##
143
- # @return [Boolean] True if body contains full request object (`*` in the annotation), false otherwise
144
84
  #
145
- def body_is_request_object?
146
- body == "*"
85
+ def return_type
86
+ @main_method.return_type
147
87
  end
148
88
 
149
89
  ##
150
- # Performs a limited version of grpc transcoding to create a string that will interpolate
151
- # the values from the request object to create a request body at runtime.
152
- # Currently only supports either "*" for "the whole request object" or
153
- # "value" for "request_object.value"
154
- #
155
- # @param [String] request_obj_name the name of the request object for the interpolation
156
- # defaults to "request_pb"
90
+ # Full class name of the return type of the method
91
+ # (including LRO and Paged cases)
157
92
  #
158
- # @return [String] A string to interpolate values from the request object into body
93
+ # @return [String]
159
94
  #
160
- def body_interpolated request_obj_name = "request_pb"
161
- return "\"\"" unless body?
162
-
163
- return "#{request_obj_name}.to_json" if body_is_request_object?
164
-
165
- "#{request_obj_name}.#{body}.to_json"
95
+ def doc_response_type
96
+ return "::Gapic::Operation" if lro?
97
+ if paged?
98
+ elem_type = compute_pagination&.paged_element_doc_type || @main_method.paged_response_type
99
+ return "::Gapic::Rest::PagedEnumerable<#{elem_type}>"
100
+ end
101
+ return "::Gapic::GenericLRO::Operation" if nonstandard_lro?
102
+ return_type
166
103
  end
167
104
 
168
105
  ##
169
- # @return [Boolean] whether any query string parameters are present
106
+ # @return [String] The name of the repeated field in paginated responses
170
107
  #
171
- def query_string_params?
172
- query_string_params.any?
173
- end
174
-
175
- # @return [Array<String>]
176
- def query_string_params
177
- return [] if body_is_request_object?
178
-
179
- routing_params_set = routing_params.to_set
180
- @main_method.arguments
181
- .reject { |arg| routing_params_set.include? arg.name }
182
- .reject { |arg| body == arg.name }
183
- .reject(&:message?)
184
- .reject { |arg| arg.default_value_for_type.nil? }
185
- end
186
-
187
- ##
188
- # Name of the variable to use for storing the query_string_params result of the transcoding call
189
- # Normally "query_string_params" but use "_query_string_params" for discarding the result for
190
- # the calls that do not sent query_string_params
191
- # @return [String]
192
- def query_string_params_var_name
193
- query_string_params? ? "query_string_params" : "_query_string_params"
108
+ def paged_response_repeated_field_name
109
+ if compute_pagination
110
+ compute_pagination.response_repeated_field_name
111
+ else
112
+ @main_method.paged_response_repeated_field_name
113
+ end
194
114
  end
195
115
 
196
116
  ##
197
- # Name for the GRPC transcoding helper method
117
+ # Whether the REGAPIC method should be rendered as paged
198
118
  #
199
- # @return [String]
200
- def transcoding_helper_name
201
- "transcode_#{name}_request"
119
+ # @return [Boolean]
120
+ #
121
+ def paged?
122
+ compute_pagination ? compute_pagination.paged? : @main_method.paged?
202
123
  end
203
124
 
204
- ##
205
- # Method name
206
- #
207
- # @return [String]
208
- #
209
- def name
210
- @main_method.name
125
+ def lro?
126
+ @main_method.lro?
211
127
  end
212
128
 
213
129
  ##
214
- # Full class name of the request type
130
+ # Whether this method uses nonstandard LROs
215
131
  #
216
- # @return [String]
132
+ # @return [Boolean]
217
133
  #
218
- def request_type
219
- @main_method.request_type
134
+ def nonstandard_lro?
135
+ @main_method.nonstandard_lro?
220
136
  end
221
137
 
222
138
  ##
223
- # Full class name of the raw return type of the RPC
139
+ # The presenter for the nonstandard LRO client of the kind this method uses
224
140
  #
225
- # @return [String]
141
+ # @return [Gapic::Presenters::Service::LroClientPresenter, nil]
226
142
  #
227
- def return_type
228
- @main_method.return_type
143
+ def nonstandard_lro_client
144
+ return unless nonstandard_lro?
145
+ @main_method.service.rest.nonstandard_lros.find { |model| model.service == @main_method.lro.service_full_name }
229
146
  end
230
147
 
231
148
  ##
232
- # Full class name of the return type of the method
233
- # (including LRO and Paged cases)
149
+ # Whether this method can be generated in REST clients
150
+ # Only methods with http bindings can be generated, and
151
+ # additionally only unary methods are currently supported.
234
152
  #
235
- # @return [String]
153
+ # @return [Boolean]
236
154
  #
237
- def doc_response_type
238
- return "::Gapic::Rest::PagedEnumerable<#{pagination.paged_element_doc_type}>" if paged?
239
- return "::Gapic::Rest::BaseOperation" if lro?
240
- return_type
155
+ def can_generate_rest?
156
+ [:normal, :server].include?(@main_method.kind) &&
157
+ http_bindings.first&.verb? &&
158
+ http_bindings.first&.path?
241
159
  end
242
160
 
243
161
  ##
244
- # Whether the REGAPIC method should be rendered as paged
162
+ # Whether this method is a server-streaming method
245
163
  #
246
164
  # @return [Boolean]
247
165
  #
248
- def paged?
249
- @pagination.paged?
166
+ def server_streaming?
167
+ @main_method.server_streaming?
250
168
  end
251
169
 
252
170
  ##
253
- # Whether the REGAPIC method should be rendered as LRO
254
- # [TODO (virost, 2021-08) Update this when DiReGapic LRO annotations are added to the Compute protos]
171
+ # @return [Boolean] Whether the method is marked as deprecated.
255
172
  #
256
- # @return [Boolean]
257
- #
258
- def lro?
259
- return_type == "::Google::Cloud::Compute::V1::Operation" &&
260
- @main_method.service.name != "ZoneOperations" &&
261
- @main_method.service.name != "RegionOperations" &&
262
- @main_method.service.name != "GlobalOperations" &&
263
- @main_method.service.name != "GlobalOrganizationOperations"
173
+ def is_deprecated?
174
+ @main_method.is_deprecated?
264
175
  end
265
176
  end
266
177
  end