gapic-generator 0.11.0 → 0.45.2

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 +303 -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 +24 -10
  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/{rest_pagination_info.rb → compute_pagination_info.rb} +31 -20
  30. data/lib/gapic/presenters/method/http_binding_presenter.rb +128 -0
  31. data/lib/gapic/presenters/method_presenter.rb +109 -35
  32. data/lib/gapic/presenters/method_rest_presenter.rb +83 -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 +154 -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 +199 -274
  141. data/lib/google/api/annotations.pb.rb +0 -39
  142. data/lib/google/api/auth.pb.rb +0 -75
  143. data/lib/google/api/backend.pb.rb +0 -59
  144. data/lib/google/api/billing.pb.rb +0 -53
  145. data/lib/google/api/client.pb.rb +0 -43
  146. data/lib/google/api/context.pb.rb +0 -47
  147. data/lib/google/api/control.pb.rb +0 -38
  148. data/lib/google/api/documentation.pb.rb +0 -56
  149. data/lib/google/api/endpoint.pb.rb +0 -42
  150. data/lib/google/api/field_behavior.pb.rb +0 -51
  151. data/lib/google/api/http.pb.rb +0 -60
  152. data/lib/google/api/label.pb.rb +0 -49
  153. data/lib/google/api/launch_stage.pb.rb +0 -37
  154. data/lib/google/api/log.pb.rb +0 -47
  155. data/lib/google/api/logging.pb.rb +0 -48
  156. data/lib/google/api/metric.pb.rb +0 -90
  157. data/lib/google/api/monitored_resource.pb.rb +0 -68
  158. data/lib/google/api/monitoring.pb.rb +0 -48
  159. data/lib/google/api/quota.pb.rb +0 -63
  160. data/lib/google/api/resource.pb.rb +0 -80
  161. data/lib/google/api/routing.pb.rb +0 -58
  162. data/lib/google/api/service.pb.rb +0 -90
  163. data/lib/google/api/source_info.pb.rb +0 -44
  164. data/lib/google/api/system_parameter.pb.rb +0 -51
  165. data/lib/google/api/usage.pb.rb +0 -47
  166. data/lib/google/cloud/extended_operations.pb.rb +0 -57
  167. data/lib/google/longrunning/operations.pb.rb +0 -115
  168. data/lib/google/protobuf/any.pb.rb +0 -40
  169. data/lib/google/protobuf/api.pb.rb +0 -69
  170. data/lib/google/protobuf/compiler/plugin.pb.rb +0 -79
  171. data/lib/google/protobuf/descriptor.pb.rb +0 -360
  172. data/lib/google/protobuf/duration.pb.rb +0 -41
  173. data/lib/google/protobuf/empty.pb.rb +0 -36
  174. data/lib/google/protobuf/source_context.pb.rb +0 -39
  175. data/lib/google/protobuf/struct.pb.rb +0 -65
  176. data/lib/google/protobuf/type.pb.rb +0 -128
  177. data/lib/google/protobuf/wrappers.pb.rb +0 -80
  178. data/lib/google/rpc/status.pb.rb +0 -46
  179. data/templates/default/gem/gemfile.erb +0 -4
  180. data/templates/default/lib/rest/_rest.erb +0 -9
  181. data/templates/default/service/client/method/def/_request_normal.erb +0 -4
  182. data/templates/default/service/client/method/def/_request_streaming.erb +0 -9
  183. data/templates/default/service/client/method/docs/_deprecated.erb +0 -5
  184. data/templates/default/service/client/method/docs/_snippets.erb +0 -6
  185. data/templates/default/service/client/resource/_def.erb +0 -6
  186. data/templates/default/service/rest/client/_config.erb +0 -122
  187. data/templates/default/service/rest/client/method/def/_response_normal.erb +0 -6
  188. data/templates/default/service/rest/client/method/def/_response_paged.erb +0 -7
  189. data/templates/default/service/rest/client/method/docs/_result.erb +0 -6
  190. data/templates/default/service/rest/service_stub/_service_stub.erb +0 -25
  191. data/templates/default/service/rest/service_stub/grpc_transcoding_method/_def.erb +0 -24
  192. data/templates/default/service/rest/service_stub/method/_def.erb +0 -20
  193. data/templates/default/service/rest/service_stub/method/def/_response.erb +0 -17
  194. data/templates/default/service/rest/test/method/_assert_response.erb +0 -2
  195. data/templates/default/service/rest/test/method/_normal.erb +0 -71
  196. data/templates/default/service/test/client_paths.erb +0 -15
  197. data/templates/default/snippets/snippet/_structure.erb +0 -71
  198. /data/gem_templates/{binary.erb → binary.text.erb} +0 -0
  199. /data/gem_templates/{dockerfile.erb → dockerfile.text.erb} +0 -0
  200. /data/gem_templates/{entrypoint.erb → entrypoint.text.erb} +0 -0
  201. /data/gem_templates/{gapic_sh.erb → gapic_sh.text.erb} +0 -0
  202. /data/gem_templates/{gemfile.erb → gemfile.text.erb} +0 -0
  203. /data/gem_templates/{gemspec.erb → gemspec.text.erb} +0 -0
  204. /data/gem_templates/{generator.erb → generator.text.erb} +0 -0
  205. /data/gem_templates/{gitignore.erb → gitignore.text.erb} +0 -0
  206. /data/gem_templates/{rakefile.erb → rakefile.text.erb} +0 -0
  207. /data/gem_templates/{readme.erb → readme.text.erb} +0 -0
  208. /data/gem_templates/{rubocop.erb → rubocop.text.erb} +0 -0
  209. /data/gem_templates/shared/{_header.erb → _header.text.erb} +0 -0
  210. /data/gem_templates/shared/{_license.erb → _license.text.erb} +0 -0
  211. /data/gem_templates/shared/{_warning.erb → _warning.text.erb} +0 -0
  212. /data/gem_templates/{test_generator.erb → test_generator.text.erb} +0 -0
  213. /data/gem_templates/{test_helper.erb → test_helper.text.erb} +0 -0
  214. /data/gem_templates/{version.erb → version.text.erb} +0 -0
  215. /data/templates/default/gem/{_version.erb → _version.text.erb} +0 -0
  216. /data/templates/default/gem/{changelog.erb → changelog.text.erb} +0 -0
  217. /data/templates/default/gem/{entrypoint.erb → entrypoint.text.erb} +0 -0
  218. /data/templates/default/gem/{gapic_metadata_json.erb → gapic_metadata_json.text.erb} +0 -0
  219. /data/templates/default/gem/{gitignore.erb → gitignore.text.erb} +0 -0
  220. /data/templates/default/gem/{license.erb → license.text.erb} +0 -0
  221. /data/templates/default/gem/{rakefile.erb → rakefile.text.erb} +0 -0
  222. /data/templates/default/gem/{version.erb → version.text.erb} +0 -0
  223. /data/templates/default/gem/{yardopts.erb → yardopts.text.erb} +0 -0
  224. /data/templates/default/layouts/{_ruby.erb → _ruby.text.erb} +0 -0
  225. /data/templates/default/{package.erb → package.text.erb} +0 -0
  226. /data/templates/default/proto_docs/{_proto_file.erb → _proto_file.text.erb} +0 -0
  227. /data/templates/default/proto_docs/{proto_file.erb → proto_file.text.erb} +0 -0
  228. /data/templates/default/proto_docs/{readme.erb → readme.text.erb} +0 -0
  229. /data/templates/default/service/{_helpers.erb → _helpers.text.erb} +0 -0
  230. /data/templates/default/service/client/{_credentials.erb → _credentials.text.erb} +0 -0
  231. /data/templates/default/service/client/{_nonstandard_lro.erb → _nonstandard_lro.text.erb} +0 -0
  232. /data/templates/default/service/client/{_paths.erb → _paths.text.erb} +0 -0
  233. /data/templates/default/service/client/{_requires.erb → _requires.text.erb} +0 -0
  234. /data/templates/default/service/client/{_resource.erb → _resource.text.erb} +0 -0
  235. /data/templates/default/service/client/{_self_configure.erb → _self_configure.text.erb} +0 -0
  236. /data/templates/default/service/client/{_self_configure_defaults.erb → _self_configure_defaults.text.erb} +0 -0
  237. /data/templates/default/service/client/method/def/{_request.erb → _request.text.erb} +0 -0
  238. /data/templates/default/service/client/method/def/{_rescue.erb → _rescue.text.erb} +0 -0
  239. /data/templates/default/service/client/method/def/{_routing_params.erb → _routing_params.text.erb} +0 -0
  240. /data/templates/default/service/client/method/docs/{_error.erb → _error.text.erb} +0 -0
  241. /data/templates/default/service/client/method/docs/{_request.erb → _request.text.erb} +0 -0
  242. /data/templates/default/service/client/method/docs/{_request_field.erb → _request_field.text.erb} +0 -0
  243. /data/templates/default/service/client/method/docs/{_request_streaming.erb → _request_streaming.text.erb} +0 -0
  244. /data/templates/default/service/client/method/docs/{_response.erb → _response.text.erb} +0 -0
  245. /data/templates/default/service/client/method/docs/{_sample.erb → _sample.text.erb} +0 -0
  246. /data/templates/default/service/client/method/docs/{_sample_response.erb → _sample_response.text.erb} +0 -0
  247. /data/templates/default/service/client/method/docs/{_samples.erb → _samples.text.erb} +0 -0
  248. /data/templates/default/service/client/method/docs/request_field/{_arg.erb → _arg.text.erb} +0 -0
  249. /data/templates/default/service/client/method/docs/request_field/{_hash.erb → _hash.text.erb} +0 -0
  250. /data/templates/default/service/client/method/docs/sample_response/{_comment.erb → _comment.text.erb} +0 -0
  251. /data/templates/default/service/client/method/docs/sample_response/{_define.erb → _define.text.erb} +0 -0
  252. /data/templates/default/service/client/method/docs/sample_response/{_loop.erb → _loop.text.erb} +0 -0
  253. /data/templates/default/service/client/method/docs/sample_response/{_print.erb → _print.text.erb} +0 -0
  254. /data/templates/default/service/client/method/docs/sample_response/{_write_file.erb → _write_file.text.erb} +0 -0
  255. /data/templates/default/service/client/resource/{_doc.erb → _doc.text.erb} +0 -0
  256. /data/templates/default/service/client/resource/{_multi.erb → _multi.text.erb} +0 -0
  257. /data/templates/default/service/client/resource/{_single.erb → _single.text.erb} +0 -0
  258. /data/templates/default/service/{client.erb → client.text.erb} +0 -0
  259. /data/templates/default/service/{credentials.erb → credentials.text.erb} +0 -0
  260. /data/templates/default/service/{operations.erb → operations.text.erb} +0 -0
  261. /data/templates/default/service/{paths.erb → paths.text.erb} +0 -0
  262. /data/templates/default/service/rest/client/method/def/{_rescue.erb → _rescue.text.erb} +0 -0
  263. /data/templates/default/service/rest/client/method/docs/{_error.erb → _error.text.erb} +0 -0
  264. /data/templates/default/service/rest/{client.erb → client.text.erb} +0 -0
  265. /data/templates/default/service/rest/{grpc_transcoding.erb → grpc_transcoding.text.erb} +0 -0
  266. /data/templates/default/service/rest/service_stub/grpc_transcoding_method/def/{_query_string_param.erb → _query_string_param.text.erb} +0 -0
  267. /data/templates/default/service/rest/service_stub/method/def/{_request.erb → _request.text.erb} +0 -0
  268. /data/templates/default/service/rest/{service_stub.erb → service_stub.text.erb} +0 -0
  269. /data/templates/default/service/{rest.erb → rest.text.erb} +0 -0
  270. /data/templates/default/service/test/{client_operations.erb → client_operations.text.erb} +0 -0
  271. /data/templates/default/service/test/method/{_assert_response.erb → _assert_response.text.erb} +0 -0
  272. /data/templates/default/service/test/{smoke.erb → smoke.text.erb} +0 -0
  273. /data/templates/default/{service.erb → service.text.erb} +0 -0
  274. /data/templates/default/shared/{_header.erb → _header.text.erb} +0 -0
  275. /data/templates/default/shared/{_license.erb → _license.text.erb} +0 -0
  276. /data/templates/default/shared/{_warning.erb → _warning.text.erb} +0 -0
@@ -0,0 +1,159 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Copyright 2022 Google LLC
4
+ #
5
+ # Licensed under the Apache License, Version 2.0 (the "License");
6
+ # you may not use this file except in compliance with the License.
7
+ # You may obtain a copy of the License at
8
+ #
9
+ # https://www.apache.org/licenses/LICENSE-2.0
10
+ #
11
+ # Unless required by applicable law or agreed to in writing, software
12
+ # distributed under the License is distributed on an "AS IS" BASIS,
13
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ # See the License for the specific language governing permissions and
15
+ # limitations under the License.
16
+
17
+ require "google/protobuf/compiler/plugin_pb"
18
+ require "google/cloud/tools/snippetgen/snippetindex/v1/snippet_index_pb"
19
+ require "json"
20
+
21
+ module Gapic
22
+ # An object that collects snippets for a package and generates the metadata
23
+ # content.
24
+ class PackageSnippets
25
+ # @private
26
+ SnippetIndex = ::Google::Cloud::Tools::SnippetGen::SnippetIndex::V1
27
+
28
+ ##
29
+ # Start collecting snippets for a package
30
+ #
31
+ # @param proto_package [String] Fully qualified proto package name including
32
+ # API version, e.g. `google.cloud.translate.v3`. Required.
33
+ # @param gem_name [String] Name of the gem being generated, e.g.
34
+ # `google-cloud-translate-v3`. Required.
35
+ # @param snippet_dir [String] Directory where snippets are generated.
36
+ # Optional. Defaults to `snippets`.
37
+ #
38
+ def initialize proto_package:, gem_name:, snippet_dir: "snippets"
39
+ api = SnippetIndex::Api.new(
40
+ id: proto_package,
41
+ version: proto_package.split(".").last
42
+ )
43
+ client_library_object = SnippetIndex::ClientLibrary.new(
44
+ name: gem_name,
45
+ version: "",
46
+ language: "RUBY",
47
+ apis: [api]
48
+ )
49
+ @index_object = SnippetIndex::Index.new(
50
+ client_library: client_library_object
51
+ )
52
+ @metadata_filename = "#{snippet_dir}/snippet_metadata_#{proto_package}.json"
53
+ @snippet_files = []
54
+ end
55
+
56
+ ##
57
+ # Add a snippet to the collection
58
+ #
59
+ # @param method_presenter [Gapic::Presenters::MethodPresenter]
60
+ # @param snippet_presenter [Gapic::Presenters::SnippetPresenter]
61
+ # @param snippet_file [Google::Protobuf::Compiler::CodeGeneratorResponse::File]
62
+ # @return [self]
63
+ #
64
+ def add method_presenter:, snippet_presenter:, snippet_file:
65
+ service_presenter = method_presenter.service
66
+ snippet_lines = [""] + snippet_file.content.split("\n")
67
+ @index_object.snippets <<
68
+ build_snippet_object(snippet_presenter, method_presenter, service_presenter, snippet_lines)
69
+ @snippet_files << snippet_file
70
+ self
71
+ end
72
+
73
+ ##
74
+ # Return a list of files to render for this package. This includes all the
75
+ # snippet files themselves, and the metadata file.
76
+ #
77
+ # @return [Array<Google::Protobuf::Compiler::CodeGeneratorResponse::File>]
78
+ #
79
+ def files
80
+ metadata_content = JSON.pretty_generate json_value_for @index_object
81
+ metadata_file = Google::Protobuf::Compiler::CodeGeneratorResponse::File.new(
82
+ name: @metadata_filename,
83
+ content: metadata_content
84
+ )
85
+ @snippet_files + [metadata_file]
86
+ end
87
+
88
+ private
89
+
90
+ def build_snippet_object snippet_presenter, method_presenter, service_presenter, snippet_lines
91
+ service_presenter = service_presenter.rest if snippet_presenter.transport == :rest
92
+ SnippetIndex::Snippet.new(
93
+ region_tag: snippet_presenter.region_tag,
94
+ title: snippet_presenter.snippet_name,
95
+ description: snippet_presenter.description,
96
+ file: snippet_presenter.snippet_file_path,
97
+ language: "RUBY",
98
+ client_method: build_client_method_object(method_presenter, service_presenter),
99
+ canonical: true,
100
+ origin: "API_DEFINITION",
101
+ segments: build_segments_array(snippet_lines, snippet_presenter.region_tag)
102
+ )
103
+ end
104
+
105
+ def build_client_method_object method_presenter, service_presenter
106
+ parameter = SnippetIndex::ClientMethod::Parameter.new(
107
+ type: method_presenter.request_type,
108
+ name: "request"
109
+ )
110
+ client = SnippetIndex::ServiceClient.new(
111
+ short_name: service_presenter.client_suffix_for_default_transport,
112
+ full_name: service_presenter.client_name_full
113
+ )
114
+ SnippetIndex::ClientMethod.new(
115
+ short_name: method_presenter.name,
116
+ full_name: "#{service_presenter.client_name_full}##{method_presenter.name}",
117
+ async: false,
118
+ parameters: [parameter],
119
+ result_type: method_presenter.return_type,
120
+ client: client,
121
+ method: build_method_object(method_presenter, service_presenter)
122
+ )
123
+ end
124
+
125
+ def build_method_object method_presenter, service_presenter
126
+ service = SnippetIndex::Service.new(
127
+ short_name: service_presenter.name,
128
+ full_name: service_presenter.grpc_full_name
129
+ )
130
+ SnippetIndex::Method.new(
131
+ short_name: method_presenter.grpc_name,
132
+ full_name: method_presenter.grpc_full_name,
133
+ service: service
134
+ )
135
+ end
136
+
137
+ # Currently this builds only the FULL segment. We can fill out additional
138
+ # segment types once requirements have been clarified.
139
+ def build_segments_array snippet_lines, region_tag
140
+ start_tag_line = snippet_lines.index { |line| line.include? "[START #{region_tag}]" }
141
+ end_tag_line = snippet_lines.index { |line| line.include? "[END #{region_tag}]" }
142
+ result = []
143
+ if start_tag_line && end_tag_line
144
+ result << SnippetIndex::Snippet::Segment.new(
145
+ start: start_tag_line + 1,
146
+ end: end_tag_line - 1,
147
+ type: "FULL"
148
+ )
149
+ end
150
+ result
151
+ end
152
+
153
+ def json_value_for value
154
+ json = value.class.encode_json value, preserve_proto_fieldnames: true,
155
+ emit_defaults: true
156
+ JSON.parse json
157
+ end
158
+ end
159
+ end
@@ -14,6 +14,7 @@
14
14
  # See the License for the specific language governing permissions and
15
15
  # limitations under the License.
16
16
 
17
+ require "active_support/inflector"
17
18
  require "gapic/path_pattern/segment"
18
19
  require "gapic/path_pattern/pattern"
19
20
 
@@ -39,7 +40,7 @@ module Gapic
39
40
  segments << segment
40
41
  end
41
42
 
42
- Pattern.new path_pattern, segments
43
+ Pattern.new format_pattern(path_pattern), segments
43
44
  end
44
45
 
45
46
  # @private
@@ -117,7 +118,7 @@ module Gapic
117
118
  match = simple_resource_id_regex.match url_pattern
118
119
  segment_pattern = match[:segment_pattern]
119
120
 
120
- resource_name = match[:resource_name]
121
+ resource_name = ActiveSupport::Inflector.underscore match[:resource_name]
121
122
  resource_pattern = match[:resource_pattern] if match.names.include? "resource_pattern"
122
123
  resource_patterns = resource_pattern.nil? ? [] : [resource_pattern]
123
124
 
@@ -141,6 +142,14 @@ module Gapic
141
142
  remainder = match.post_match
142
143
  [segment, remainder]
143
144
  end
145
+
146
+ # Formats variables within a path pattern.
147
+ # @private
148
+ def self.format_pattern pattern
149
+ pattern.gsub(/\{([a-zA-Z0-9_]+)\}/) do
150
+ "{#{ActiveSupport::Inflector.underscore ::Regexp.last_match(1)}}"
151
+ end
152
+ end
144
153
  end
145
154
  end
146
155
  end
@@ -38,7 +38,7 @@ module Gapic
38
38
  end
39
39
 
40
40
  ##
41
- # All argument names from this pattern
41
+ # All argument from this pattern, including ids for positional arguments
42
42
  # @return [Array<String>]
43
43
  def arguments
44
44
  @segments.select(&:provides_arguments?).map(&:arguments).flatten
@@ -58,6 +58,13 @@ module Gapic
58
58
  @segments.length == 1 && @segments[0].pattern == "**"
59
59
  end
60
60
 
61
+ ##
62
+ # Whether this pattern ends with a double-star ("**")
63
+ # @return [Boolean]
64
+ def ends_with_double_star_pattern?
65
+ segments.last.pattern.end_with? "**"
66
+ end
67
+
61
68
  ##
62
69
  # Converts the PathPattern into a regex string
63
70
  # @return [String]
@@ -81,6 +88,16 @@ module Gapic
81
88
  regex_str
82
89
  end
83
90
 
91
+ ##
92
+ # Converts the PathPattern into a regex string that matches a whole field
93
+ # - adds markers for the beginning and end of the string
94
+ # - adds handling of an optional tail `/` if needed
95
+ # @return [String]
96
+ def to_field_regex_str
97
+ tail_slash_accept = ends_with_double_star_pattern? ? "" : "/?"
98
+ "^#{to_regex_str}#{tail_slash_accept}$"
99
+ end
100
+
84
101
  ##
85
102
  # Whether pattern contains a positional segment
86
103
  # @return [Boolean]
@@ -127,7 +127,7 @@ module Gapic
127
127
  def == other
128
128
  return false unless other.is_a? self.class
129
129
 
130
- (pattern == other.pattern && position == other.position)
130
+ pattern == other.pattern && position == other.position
131
131
  end
132
132
  end
133
133
 
@@ -210,7 +210,13 @@ module Gapic
210
210
  # Path string for this segment
211
211
  # @return [String]
212
212
  def path_string
213
- type == :simple_resource_id ? "\#{#{resource_names[0]}}" : pattern.gsub("{", "\#{")
213
+ if type == :simple_resource_id
214
+ name = resource_names[0]
215
+ name = "binding.local_variable_get :#{name}" if Gapic::RubyInfo.keywords.include? name
216
+ "\#{#{name}}"
217
+ else
218
+ pattern.gsub "{", "\#{"
219
+ end
214
220
  end
215
221
 
216
222
  ##
@@ -272,9 +278,10 @@ module Gapic
272
278
  def == other
273
279
  return false unless other.is_a? self.class
274
280
 
275
- (type == other.type && pattern == other.pattern &&
281
+ type == other.type &&
282
+ pattern == other.pattern &&
276
283
  resource_names == other.resource_names &&
277
- resource_patterns == other.resource_patterns)
284
+ resource_patterns == other.resource_patterns
278
285
  end
279
286
  end
280
287
 
@@ -20,8 +20,15 @@ module Gapic
20
20
  # A presenter for proto enums.
21
21
  #
22
22
  class EnumPresenter
23
+ # @return [String] String representation of this presenter type.
24
+ attr_reader :type
25
+
26
+ ##
27
+ # @param enum [Gapic::Schema::Enum]
28
+ #
23
29
  def initialize enum
24
30
  @enum = enum
31
+ @type = "enum"
25
32
  end
26
33
 
27
34
  def name
@@ -35,6 +42,13 @@ module Gapic
35
42
  def values
36
43
  @values ||= @enum.values.map { |v| EnumValuePresenter.new v }
37
44
  end
45
+
46
+ ##
47
+ # @return [Boolean] Whether the enum is marked as deprecated.
48
+ #
49
+ def is_deprecated?
50
+ @enum.is_deprecated?
51
+ end
38
52
  end
39
53
  end
40
54
  end
@@ -14,6 +14,8 @@
14
14
  # See the License for the specific language governing permissions and
15
15
  # limitations under the License.
16
16
 
17
+ require "gapic/ruby_info"
18
+
17
19
  module Gapic
18
20
  module Presenters
19
21
  ##
@@ -24,8 +26,9 @@ module Gapic
24
26
  @value = value
25
27
  end
26
28
 
29
+ # @return [String] The enum value name without keyword collision.
27
30
  def name
28
- @value.name
31
+ Gapic::RubyInfo.keywords.include?(@value.name) ? "#{@value.parent.name}::#{@value.name}" : @value.name
29
32
  end
30
33
 
31
34
  def doc_description
@@ -25,16 +25,33 @@ module Gapic
25
25
  class FieldPresenter
26
26
  include Gapic::Helpers::NamespaceHelper
27
27
 
28
+ # @return [String] String representation of this presenter type.
29
+ attr_reader :type
30
+
31
+ ##
32
+ # @param api [Gapic::Schema::Api]
33
+ # @param message [Gapic::Schema::Message]
34
+ # @param field [Gapic::Schema::Field]
35
+ #
28
36
  def initialize api, message, field
29
37
  @api = api
30
38
  @message = message
31
39
  @field = field
40
+ @type = "field"
32
41
  end
33
42
 
34
43
  def name
35
44
  @field.name
36
45
  end
37
46
 
47
+ ##
48
+ # @return [String] The field name to be used as a value without reserved keywords.
49
+ #
50
+ def value_name
51
+ name = @field.name
52
+ Gapic::RubyInfo.keywords.include?(name) ? "#{name}_param" : name
53
+ end
54
+
38
55
  def doc_types
39
56
  field_doc_types @field, false
40
57
  end
@@ -48,8 +65,15 @@ module Gapic
48
65
  field_doc_types @field, true
49
66
  end
50
67
 
51
- def doc_description
52
- @field.docs_leading_comments
68
+ ##
69
+ # The description as it should appear in YARD docs.
70
+ #
71
+ # @param transport [:grpc,:rest] Whether xref links should go to REST or
72
+ # gRPC client classes. Uses the default transport if not provided.
73
+ # @return [String]
74
+ #
75
+ def doc_description transport: nil
76
+ @field.docs_leading_comments transport: transport
53
77
  end
54
78
 
55
79
  def default_value
@@ -59,7 +83,7 @@ module Gapic
59
83
  end
60
84
 
61
85
  def as_kwarg value: nil
62
- "#{name}: #{value || name}"
86
+ "#{name}: #{value || value_name}"
63
87
  end
64
88
 
65
89
  # TODO: remove, only used in tests
@@ -126,14 +150,60 @@ module Gapic
126
150
  end
127
151
 
128
152
  ##
129
- # Name of this field, camel-cased
153
+ # Name of this field, camel-cased.
130
154
  # @return [String]
155
+ #
131
156
  def camel_name
132
157
  camel_name_for name
133
158
  end
134
159
 
160
+ ##
161
+ # @return [Boolean] Whether the field is marked as deprecated.
162
+ #
163
+ def is_deprecated?
164
+ @field.is_deprecated?
165
+ end
166
+
135
167
  protected
136
168
 
169
+ # @private
170
+ FIELD_TYPE_MAPPING = {
171
+ TYPE_DOUBLE: "::Float",
172
+ TYPE_FLOAT: "::Float",
173
+ TYPE_INT64: "::Integer",
174
+ TYPE_UINT64: "::Integer",
175
+ TYPE_INT32: "::Integer",
176
+ TYPE_FIXED64: "::Integer",
177
+ TYPE_FIXED32: "::Integer",
178
+ TYPE_BOOL: "::Boolean",
179
+ TYPE_STRING: "::String",
180
+ TYPE_BYTES: "::String",
181
+ TYPE_UINT32: "::Integer",
182
+ TYPE_SFIXED32: "::Integer",
183
+ TYPE_SFIXED64: "::Integer",
184
+ TYPE_SINT32: "::Integer",
185
+ TYPE_SINT64: "::Integer"
186
+ }.freeze
187
+
188
+ # @private
189
+ FIELD_VALUE_MAPPING = {
190
+ TYPE_DOUBLE: "3.5",
191
+ TYPE_FLOAT: "3.5",
192
+ TYPE_INT64: "42",
193
+ TYPE_UINT64: "42",
194
+ TYPE_INT32: "42",
195
+ TYPE_FIXED64: "42",
196
+ TYPE_FIXED32: "42",
197
+ TYPE_BOOL: "true",
198
+ TYPE_STRING: "\"hello world\"",
199
+ TYPE_BYTES: "\"hello world\"",
200
+ TYPE_UINT32: "42",
201
+ TYPE_SFIXED32: "42",
202
+ TYPE_SFIXED64: "42",
203
+ TYPE_SINT32: "42",
204
+ TYPE_SINT64: "42"
205
+ }.freeze
206
+
137
207
  def field_doc_types field, output
138
208
  return field_map_type field.message, output if field.map?
139
209
  base_type =
@@ -144,14 +214,7 @@ module Gapic
144
214
  # TODO: handle when arg message is nil and enum is the type
145
215
  message_ruby_type field.enum
146
216
  else
147
- case field.type
148
- when 1, 2 then "::Float"
149
- when 3, 4, 5, 6, 7, 13, 15, 16, 17, 18 then "::Integer"
150
- when 9, 12 then "::String"
151
- when 8 then "::Boolean"
152
- else
153
- "::Object"
154
- end
217
+ FIELD_TYPE_MAPPING[field.type] || "::Object"
155
218
  end
156
219
  field.repeated? ? "::Array<#{base_type}>" : base_type
157
220
  end
@@ -179,14 +242,8 @@ module Gapic
179
242
  # TODO: select the first non-0 enum value
180
243
  ":#{@field.enum.values.first.name}"
181
244
  else
182
- case @field.type
183
- when 1, 2 then "3.5"
184
- when 3, 4, 5, 6, 7, 13, 15, 16, 17, 18 then "42"
185
- when 9, 12 then "\"hello world\""
186
- when 8 then "true"
187
- else
188
- "::Object"
189
- end
245
+ # BUG: This should default to a better value
246
+ FIELD_VALUE_MAPPING[@field.type] || "::Object"
190
247
  end
191
248
  end
192
249
 
@@ -201,7 +258,7 @@ module Gapic
201
258
  def camel_name_for attr_name
202
259
  parts = attr_name.split "_"
203
260
  first_part = parts[0]
204
- other_parts = parts[1..-1]
261
+ other_parts = parts[1..]
205
262
  other_parts_pascal = other_parts.map(&:capitalize).join
206
263
  "#{first_part}#{other_parts_pascal}"
207
264
  end