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
@@ -15,6 +15,17 @@
15
15
  # limitations under the License.
16
16
 
17
17
  require "active_support/inflector"
18
+ require "google/cloud/tools/snippetgen/configlanguage/v1/snippet_config_language_pb"
19
+ require "gapic/presenters/snippet/client_call_presenter"
20
+ require "gapic/presenters/snippet/client_initialization_presenter"
21
+ require "gapic/presenters/snippet/declaration_presenter"
22
+ require "gapic/presenters/snippet/expression_presenter"
23
+ require "gapic/presenters/snippet/iteration_presenter"
24
+ require "gapic/presenters/snippet/parameter_presenter"
25
+ require "gapic/presenters/snippet/request_initialization_presenters"
26
+ require "gapic/presenters/snippet/response_handling_presenters"
27
+ require "gapic/presenters/snippet/statement_presenter"
28
+ require "gapic/presenters/snippet/type_presenter"
18
29
 
19
30
  module Gapic
20
31
  module Presenters
@@ -22,17 +33,27 @@ module Gapic
22
33
  # A presenter for snippets.
23
34
  #
24
35
  class SnippetPresenter
25
- def initialize method_presenter, api
36
+ def initialize method_presenter, api, config: nil, transport: nil
26
37
  @method_presenter = method_presenter
27
38
  @api = api
39
+ @config = config
40
+ @transport = transport || @api.default_transport
41
+ analyze_config
42
+ end
43
+
44
+ attr_reader :config
45
+ attr_reader :transport
46
+
47
+ def config?
48
+ !config.nil?
28
49
  end
29
50
 
30
51
  def client_streaming?
31
52
  @method_presenter.client_streaming?
32
53
  end
33
54
 
34
- def bidi_streaming?
35
- @method_presenter.client_streaming? && @method_presenter.server_streaming?
55
+ def server_streaming?
56
+ @method_presenter.server_streaming?
36
57
  end
37
58
 
38
59
  def response_kind
@@ -48,7 +69,7 @@ module Gapic
48
69
  end
49
70
 
50
71
  def snippet_file_path
51
- "#{@method_presenter.service.service_require.split('/').last}/#{@method_presenter.name}.rb"
72
+ "#{@method_presenter.service.service_require.split('/').last}/#{snippet_method_name}.rb"
52
73
  end
53
74
 
54
75
  def require_path
@@ -56,7 +77,13 @@ module Gapic
56
77
  end
57
78
 
58
79
  def client_type
59
- @method_presenter.service.client_name_full.sub(/^::/, "")
80
+ service = @method_presenter.service
81
+ service = service.rest if transport == :rest
82
+ service.client_name_full.sub(/^::/, "")
83
+ end
84
+
85
+ def service_name_short
86
+ @method_presenter.service.module_name
60
87
  end
61
88
 
62
89
  def request_type
@@ -82,21 +109,184 @@ module Gapic
82
109
  @method_presenter.name
83
110
  end
84
111
 
112
+ def snippet_method_name
113
+ config? ? "#{method_name}_#{snake_config_id}" : method_name
114
+ end
115
+
116
+ def snippet_name
117
+ @config&.metadata&.snippet_name ||
118
+ "Snippet for the #{method_name} call in the #{service_name_short} service"
119
+ end
120
+
121
+ def description
122
+ @config&.metadata&.snippet_description ||
123
+ "This is an auto-generated example demonstrating basic usage of #{client_type}##{method_name}."
124
+ end
125
+
126
+ def disclaimer
127
+ "This snippet has been automatically generated and should be regarded as a code template only. " \
128
+ "It will require modifications to work:\n" \
129
+ "- It may require correct/in-range values for request initialization.\n" \
130
+ "- It may require specifying regional endpoints when creating the service client as shown in https://cloud.google.com/ruby/docs/reference."
131
+ end
132
+
133
+ def snippet_method_parameters
134
+ @snippet_method_parameters ||= begin
135
+ parameters_proto = @config&.signature&.parameters
136
+ if parameters_proto
137
+ parameters_json = @config.json_representation["signature"]["parameters"]
138
+ parameters_proto.each_with_index.map do |param_proto, index|
139
+ ParameterPresenter.new param_proto, parameters_json[index]
140
+ end
141
+ else
142
+ []
143
+ end
144
+ end
145
+ end
146
+
147
+ def snippet_method_parameters_render
148
+ return "" if snippet_method_parameters.empty?
149
+ names = snippet_method_parameters.map { |param| "#{param.name}:" }.join ", "
150
+ "(#{names})"
151
+ end
152
+
153
+ attr_reader :client_initialization
154
+ attr_reader :request_initialization
155
+ attr_reader :client_call
156
+ attr_reader :response_handling
157
+ attr_reader :final_statements
158
+
85
159
  def region_tag
86
160
  gem_presenter = @method_presenter.service.gem
87
- api_id = gem_presenter.api_shortname || gem_presenter.api_id&.split(".")&.first
161
+ prefix = gem_presenter.doc_tag_prefix
88
162
  names = gem_presenter.name.split "-"
89
163
  final_name = names.pop
90
164
  if final_name =~ /^v\d/
91
165
  api_version = final_name
92
- api_id ||= names.last
166
+ prefix ||= names.last
93
167
  else
94
- api_id ||= final_name
168
+ prefix ||= final_name
95
169
  api_version = "v0"
96
170
  end
171
+ prefix = prefix.downcase.gsub(/[^a-z0-9]/, "")
97
172
  service_name = @method_presenter.service.module_name
98
173
  method_name = @method_presenter.method.name
99
- "#{api_id}_#{api_version}_generated_#{service_name}_#{method_name}_sync"
174
+ type = config? ? "config" : "generated"
175
+ config_id = config? ? "#{@config.metadata.config_id}_" : ""
176
+ "#{prefix}_#{api_version}_#{type}_#{service_name}_#{method_name}_#{config_id}sync"
177
+ end
178
+
179
+ private
180
+
181
+ def analyze_config
182
+ snippet_proto, snippet_json = snippet_proto_info
183
+ call_proto, call_json = call_proto_info snippet_proto, snippet_json
184
+ @client_initialization = build_client_initialization_presenter snippet_proto, snippet_json
185
+ @request_initialization = build_request_initialization_presenter call_proto, call_json
186
+ @response_handling = build_response_handling_presenter call_proto, call_json
187
+ @client_call = build_client_call_presenter call_proto, call_json,
188
+ @request_initialization.request_name,
189
+ @response_handling.response_name
190
+ @final_statements = build_final_statements snippet_proto, snippet_json
191
+ end
192
+
193
+ def snippet_proto_info
194
+ [@config&.snippet, @config&.json_representation&.fetch("snippet", nil)]
195
+ end
196
+
197
+ def call_proto_info snippet_proto, snippet_json
198
+ if snippet_proto&.standard
199
+ [snippet_proto.standard, snippet_json["standard"]]
200
+ elsif snippet_proto&.paginated
201
+ [snippet_proto.paginated, snippet_json["paginated"]]
202
+ elsif snippet_proto&.lro
203
+ [snippet_proto.lro, snippet_json["lro"]]
204
+ elsif snippet_proto&.server_streaming
205
+ [snippet_proto.server_streaming, snippet_json["serverStreaming"]]
206
+ elsif snippet_proto&.client_streaming
207
+ [snippet_proto.client_streaming, snippet_json["clientStreaming"]]
208
+ elsif snippet_proto&.bidi_streaming
209
+ [snippet_proto.bidi_streaming, snippet_json["bidiStreaming"]]
210
+ else
211
+ [nil, nil]
212
+ end
213
+ end
214
+
215
+ def build_client_initialization_presenter snippet_proto, snippet_json
216
+ ClientInitializationPresenter.new snippet_proto&.service_client_initialization,
217
+ snippet_json&.fetch("serviceClientInitialization", nil),
218
+ phase1: !config?, client_type: client_type
219
+ end
220
+
221
+ def build_request_initialization_presenter call_proto, call_json
222
+ phase1 = !config?
223
+ request_init_proto = call_proto&.request_initialization
224
+ request_init_json = call_json&.fetch "requestInitialization", nil
225
+ if client_streaming?
226
+ request_name = phase1 ? "input" : call_proto.client_stream_name
227
+ StreamingRequestInitializationPresenter.new request_init_proto, request_init_json,
228
+ request_name: request_name, request_type: request_type,
229
+ phase1: phase1
230
+ else
231
+ SimpleRequestInitializationPresenter.new request_init_proto, request_init_json,
232
+ request_type: request_type, phase1: phase1
233
+ end
234
+ end
235
+
236
+ def build_response_handling_presenter call_proto, call_json
237
+ phase1 = !config?
238
+ case response_kind
239
+ when :paged
240
+ PaginatedResponseHandlingPresenter.new call_proto&.paginated_handling,
241
+ call_json&.fetch("paginatedHandling", nil),
242
+ paged_response_type: paged_response_type, phase1: phase1
243
+ when :lro
244
+ LroResponseHandlingPresenter.new call_proto&.lro_handling,
245
+ call_json&.fetch("lroHandling", nil),
246
+ phase1: phase1
247
+ when :streaming
248
+ response_name = phase1 ? "output" : call_proto&.server_stream_name
249
+ response_name = nil if response_name == ""
250
+ StreamingResponseHandlingPresenter.new call_proto&.response_handling,
251
+ call_json&.fetch("responseHandling", nil),
252
+ response_name: response_name, base_response_type: base_response_type,
253
+ phase1: phase1
254
+ else
255
+ SimpleResponseHandlingPresenter.new call_proto&.response_handling,
256
+ call_json&.fetch("responseHandling", nil),
257
+ response_type: return_type, phase1: phase1
258
+ end
259
+ end
260
+
261
+ def build_client_call_presenter call_proto, call_json, request_name, response_name
262
+ phase1 = !config?
263
+ if response_kind == :paged
264
+ ClientCallPresenter.new call_proto&.paginated_call, call_json&.fetch("paginatedCall", nil),
265
+ method_name: method_name, request_name: request_name, response_name: response_name,
266
+ client_streaming: client_streaming?, server_streaming: server_streaming?,
267
+ phase1: phase1
268
+ elsif client_streaming? || server_streaming?
269
+ ClientCallPresenter.new call_proto&.initialization_call, call_json&.fetch("initializationCall", nil),
270
+ method_name: method_name, request_name: request_name, response_name: response_name,
271
+ client_streaming: client_streaming?, server_streaming: server_streaming?,
272
+ phase1: phase1
273
+ else
274
+ ClientCallPresenter.new call_proto&.call, call_json&.fetch("call", nil),
275
+ method_name: method_name, request_name: request_name, response_name: response_name,
276
+ client_streaming: false, server_streaming: false, phase1: phase1
277
+ end
278
+ end
279
+
280
+ def build_final_statements snippet_proto, snippet_json
281
+ return [] unless snippet_proto&.final_statements
282
+ snippet_proto.final_statements.each_with_index.map do |statement_proto, index|
283
+ statement_json = snippet_json["finalStatements"][index]
284
+ StatementPresenter.new statement_proto, statement_json
285
+ end
286
+ end
287
+
288
+ def snake_config_id
289
+ ActiveSupport::Inflector.underscore @config.metadata.config_id
100
290
  end
101
291
  end
102
292
  end
@@ -14,19 +14,23 @@
14
14
  # See the License for the specific language governing permissions and
15
15
  # limitations under the License.
16
16
 
17
+ require "gapic/model"
17
18
  require "gapic/presenters/enum_presenter"
18
19
  require "gapic/presenters/enum_value_presenter"
19
20
  require "gapic/presenters/field_presenter"
20
21
  require "gapic/presenters/file_presenter"
21
22
  require "gapic/presenters/gem_presenter"
22
23
  require "gapic/presenters/message_presenter"
24
+ require "gapic/presenters/method/http_binding_presenter"
23
25
  require "gapic/presenters/method_presenter"
24
26
  require "gapic/presenters/method_rest_presenter"
25
27
  require "gapic/presenters/package_presenter"
26
28
  require "gapic/presenters/resource_presenter"
27
29
  require "gapic/presenters/sample_presenter"
30
+ require "gapic/presenters/service/lro_client_presenter"
31
+ require "gapic/presenters/service/mixin_client_presenter"
28
32
  require "gapic/presenters/service_presenter"
29
- require "gapic/presenters/service_config_presenter"
33
+ require "gapic/presenters/grpc_service_config_presenter"
30
34
  require "gapic/presenters/service_rest_presenter"
31
35
  require "gapic/presenters/snippet_presenter"
32
36
 
data/lib/gapic/runner.rb CHANGED
@@ -17,7 +17,7 @@
17
17
  require "gapic/generator"
18
18
  require "gapic/schema"
19
19
  require "gapic/schema/request_param_parser"
20
- require "google/protobuf/compiler/plugin.pb"
20
+ require "google/protobuf/compiler/plugin_pb"
21
21
 
22
22
  module Gapic
23
23
  # TODO: Enter docs
@@ -20,6 +20,8 @@ require "gapic/generators/default_generator_parameters"
20
20
  require "gapic/schema/loader"
21
21
  require "gapic/schema/request_param_parser"
22
22
  require "gapic/grpc_service_config/parser"
23
+ require "gapic/schema/service_config_parser"
24
+ require "gapic/model/api_metadata"
23
25
 
24
26
  module Gapic
25
27
  module Schema
@@ -41,6 +43,7 @@ module Gapic
41
43
  class Api
42
44
  attr_accessor :request
43
45
  attr_accessor :files
46
+ attr_reader :snippet_configs
44
47
 
45
48
  # Initializes an API object with the file descriptors that represent the
46
49
  # API.
@@ -60,9 +63,11 @@ module Gapic
60
63
  @files.each { |f| f.parent = self }
61
64
  @configuration = configuration
62
65
  @resource_types = analyze_resources
66
+ @nonstandard_lro_services = analyze_nonstandard_lros
63
67
 
64
68
  parameter_schema ||= Gapic::Generators::DefaultGeneratorParameters.default_schema
65
69
  @protoc_parameters = parse_parameter request.parameter, parameter_schema, error_output
70
+ @snippet_configs = loader.load_snippet_configs self.configuration[:snippet_configs_path]
66
71
  sanity_checks error_output
67
72
  end
68
73
 
@@ -90,7 +95,7 @@ module Gapic
90
95
  end
91
96
 
92
97
  def overrides_of key
93
- configuration&.fetch(:overrides, nil)&.fetch(key, nil) || {}
98
+ configuration&.dig(:overrides, key) || {}
94
99
  end
95
100
 
96
101
  def fix_file_path str
@@ -114,14 +119,17 @@ module Gapic
114
119
  configuration[:overrides][:service].fetch str, str
115
120
  end
116
121
 
122
+ # @return [Enumerable<Gapic::Schema::File>]
117
123
  def generate_files
118
124
  @files.select(&:generate?)
119
125
  end
120
126
 
127
+ # @return [Enumerable<Gapic::Schema::Service>]
121
128
  def services
122
129
  @files.map(&:services).flatten
123
130
  end
124
131
 
132
+ # @return [Enumerable<Gapic::Schema::Message>]
125
133
  def messages
126
134
  @files.map(&:messages).flatten
127
135
  end
@@ -201,6 +209,22 @@ module Gapic
201
209
  end
202
210
  end
203
211
 
212
+ # Return all snippet configs for the given method address. Returns the
213
+ # empty array if there are no snippet configs.
214
+ # @param address [String] Method address in the form
215
+ # `proto.package.v1.ServiceName.MethodName`
216
+ # @return [Array<
217
+ # Google::Cloud::Tools::SnippetGen::ConfigLanguage::V1::SnippetConfig>]
218
+ def snippet_configs_for address
219
+ address = address.join "." if address.is_a? ::Array
220
+ @snippet_configs.find_all do |config|
221
+ rpc = config.rpc
222
+ rpc.api_version.any? do |vers|
223
+ address == "#{rpc.proto_package}.#{vers}.#{rpc.service_name}.#{rpc.rpc_name}"
224
+ end
225
+ end
226
+ end
227
+
204
228
  # Structured Hash representation of the configuration file.
205
229
  # @return [Hash]
206
230
  # A Hash of the configuration values.
@@ -245,14 +269,24 @@ module Gapic
245
269
  configuration[:transports].include? "grpc"
246
270
  end
247
271
 
272
+ ##
273
+ # The default transport, used when choosing which client class a docs
274
+ # xref should link to.
275
+ #
276
+ # @return [:grpc,:rest]
277
+ #
278
+ def default_transport
279
+ generate_grpc_clients? ? :grpc : :rest
280
+ end
281
+
248
282
  # Whether to generate standalone snippets
249
283
  def generate_standalone_snippets?
250
- configuration[:generate_standalone_snippets] ||= false
284
+ configuration.fetch :generate_standalone_snippets, true
251
285
  end
252
286
 
253
287
  # Whether to generate inline documentation snippets
254
288
  def generate_yardoc_snippets?
255
- configuration[:generate_yardoc_snippets] ||= false
289
+ configuration.fetch :generate_yardoc_snippets, true
256
290
  end
257
291
 
258
292
  # Whether to generate gapic metadata (drift manifest) file
@@ -293,6 +327,36 @@ module Gapic
293
327
  @grpc_service_config ||= Gapic::GrpcServiceConfig::Parser.parse grpc_service_config_raw
294
328
  end
295
329
 
330
+ # Raw text of the service.yaml if given as a parameter
331
+ # or nil if no parameter given
332
+ # @return [String]
333
+ def service_config_raw
334
+ @service_config_raw ||= begin
335
+ filename = protoc_options[:service_yaml]
336
+ ::File.read filename if filename
337
+ end
338
+ end
339
+
340
+ # Parsed service config
341
+ # @return [Google::Api::Service]
342
+ def service_config
343
+ @service_config ||= Gapic::Schema::ServiceConfigParser.parse_service_yaml service_config_raw
344
+ end
345
+
346
+ # Parsed API Metadata model
347
+ # @return [Gapic::Model::ApiMetadata]
348
+ def api_metadata
349
+ @api_metadata ||= begin
350
+ api_metadata = Gapic::Model::ApiMetadata.new
351
+ Gapic::Schema::ServiceConfigParser.parse_api_metadata service_config_raw, api_metadata
352
+ api_metadata.standardize_names!
353
+ api_metadata.standardize_title! gem_name: configuration.fetch(:gem, nil)&.fetch(:name, "")
354
+ api_metadata.standardize_descriptions!
355
+ api_metadata.standardize_auto_populated_fields! @service_config
356
+ api_metadata
357
+ end
358
+ end
359
+
296
360
  # Get a resource given its type string
297
361
  def lookup_resource_type resource_type
298
362
  @resource_types[resource_type]
@@ -318,6 +382,21 @@ module Gapic
318
382
  services.find { |s| s.address == addr }
319
383
  end
320
384
 
385
+ ##
386
+ # Returns a model for the nonstandard LRO for a given service
387
+ # The `analyze_nonstandard_lros` method fills in the model cache
388
+ #
389
+ # @param service_full_name [String]
390
+ #
391
+ # @return [Gapic::Model::Service::NonstandardLroProvider, Gapic::Model::Service::NoNonstandardLro]
392
+ def nonstandard_lro_model_for service_full_name
393
+ if @nonstandard_lro_services.key? service_full_name
394
+ @nonstandard_lro_services[service_full_name]
395
+ else
396
+ Gapic::Model::Service::NoNonstandardLro.instance
397
+ end
398
+ end
399
+
321
400
  ##
322
401
  # Whether configuration has an override for the wrapper gem name
323
402
  # @return [Boolean]
@@ -351,6 +430,9 @@ module Gapic
351
430
  output.puts "WARNING: configured common service #{k} is not present" unless addrs.include? k
352
431
  output.puts "WARNING: configured common service delegate #{v} is not present" unless addrs.include? v
353
432
  end
433
+ # TODO: Sanity check snippet configs to ensure that the type of call
434
+ # (e.g. streaming, lro, etc) matches the rpc type. Warn and remove any
435
+ # noncomplying snippet configs to prevent crashes when rendering.
354
436
  end
355
437
 
356
438
  # Does a pre-analysis of all resources defined in the job. This has
@@ -375,7 +457,7 @@ module Gapic
375
457
  file.resources.each { |resource| populate_resource_lookups resource, types, patterns }
376
458
  file.messages.each { |message| populate_message_resource_lookups message, types, patterns }
377
459
  end
378
- types.each do |_type, resource|
460
+ types.each_value do |resource|
379
461
  parents = resource.parsed_parent_patterns
380
462
  .flat_map { |pat| Array(patterns[pat]) }
381
463
  .uniq
@@ -398,6 +480,24 @@ module Gapic
398
480
  end
399
481
  end
400
482
 
483
+ ##
484
+ # Does a pre-analysis of the nonstandard LRO for every service.
485
+ # For the services that provide nonstandard LRO functionality, cashes a model for the future use
486
+ #
487
+ # @return [Hash<String, Gapic::Model::Service::NonstandardLroProvider>]
488
+ def analyze_nonstandard_lros
489
+ service_registry = {}
490
+
491
+ @files.each do |file|
492
+ file.services.each do |service|
493
+ nonstandard_lro = Gapic::Model::Service.parse_nonstandard_lro service
494
+ service_registry[service.full_name] = nonstandard_lro if nonstandard_lro
495
+ end
496
+ end
497
+
498
+ service_registry
499
+ end
500
+
401
501
  # Parse a comma-delimited list of equals-delimited lists of strings, while
402
502
  # mapping backslash-escaped commas and equal signs to literal characters.
403
503
  # @param str [String]
@@ -427,7 +527,7 @@ module Gapic
427
527
 
428
528
  def str_to_key str
429
529
  str = str.to_s
430
- str.start_with?(":") ? str[1..-1].to_sym : str
530
+ str.start_with?(":") ? str[1..].to_sym : str
431
531
  end
432
532
 
433
533
  def key_to_str key