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
@@ -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,12 +38,66 @@ 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
45
45
  end
46
46
 
47
+ ##
48
+ # Whether this is a basic single-star ("*") pattern
49
+ # @return [Boolean]
50
+ def star_pattern?
51
+ @segments.length == 1 && @segments[0].pattern == "*"
52
+ end
53
+
54
+ ##
55
+ # Whether this is a basic double-star ("**") pattern
56
+ # @return [Boolean]
57
+ def double_star_pattern?
58
+ @segments.length == 1 && @segments[0].pattern == "**"
59
+ end
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
+
68
+ ##
69
+ # Converts the PathPattern into a regex string
70
+ # @return [String]
71
+ def to_regex_str
72
+ regex_str = segments.first.to_regex_str
73
+
74
+ # for double wildcards the leading `/`` is optional
75
+ # e.g. `foo/**` should match `foo`
76
+ # this is why segments 'bring' the leading separator
77
+ # with them as they build the pattern
78
+ segments.drop(1).each_with_index do |segment, _index|
79
+ is_double_wildcard = segment.pattern == "**"
80
+
81
+ regex_str = if is_double_wildcard
82
+ "#{regex_str}(?:/.*)?"
83
+ else
84
+ "#{regex_str}/#{segment.to_regex_str}"
85
+ end
86
+ end
87
+
88
+ regex_str
89
+ end
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
+
47
101
  ##
48
102
  # Whether pattern contains a positional segment
49
103
  # @return [Boolean]
@@ -76,6 +130,15 @@ module Gapic
76
130
  parent_pattern_segments = last_segment.provides_arguments? ? segments[0...-2] : segments[0...-1]
77
131
  parent_pattern_segments.map(&:pattern_template).join("/")
78
132
  end
133
+
134
+ ##
135
+ # The pattern with the resource names stripped
136
+ # from the ResourceId segments
137
+ # (e.g. `collections/{resource_id=foo/*}` => `collections/foo/*`)
138
+ #
139
+ def simplified_pattern
140
+ @segments.map(&:simplified_pattern).join("/")
141
+ end
79
142
  end
80
143
  end
81
144
  end
@@ -97,11 +97,37 @@ module Gapic
97
97
  pattern
98
98
  end
99
99
 
100
+ ##
101
+ # Whether the segment is a resource id segment
102
+ # @return [Boolean]
103
+ def resource_id_segment?
104
+ false
105
+ end
106
+
107
+ ##
108
+ # The difference between `simplified_pattern` and `pattern`
109
+ # does not exist for the Positional segments
110
+ # @return [String]
111
+ def simplified_pattern
112
+ pattern
113
+ end
114
+
115
+ ##
116
+ # Creates a string with a regex representation of this segment's pattern
117
+ # @return [String]
118
+ def to_regex_str
119
+ if pattern == "**"
120
+ ".*"
121
+ else
122
+ "[^/]+"
123
+ end
124
+ end
125
+
100
126
  # @private
101
127
  def == other
102
128
  return false unless other.is_a? self.class
103
129
 
104
- (pattern == other.pattern && position == other.position)
130
+ pattern == other.pattern && position == other.position
105
131
  end
106
132
  end
107
133
 
@@ -129,6 +155,12 @@ module Gapic
129
155
  @type = type
130
156
  @pattern = pattern
131
157
  @resource_names = resource_names
158
+
159
+ # For the segments specified like `{foo}`, the implied resource pattern is `*`
160
+ # `{foo}` === `{foo=*}`
161
+ if resource_patterns.empty?
162
+ resource_patterns = ["*"]
163
+ end
132
164
  @resource_patterns = resource_patterns
133
165
  end
134
166
 
@@ -139,15 +171,9 @@ module Gapic
139
171
  false
140
172
  end
141
173
 
142
- ##
143
- # Whether the segment provides a resource pattern
144
- # @return [Boolean]
145
- def resource_pattern?
146
- resource_patterns.any?
147
- end
148
-
149
174
  ##
150
175
  # Whether the segment provides a nontrivial resource pattern
176
+ # (not `*` or `**`)
151
177
  # @return [Boolean]
152
178
  def nontrivial_resource_pattern?
153
179
  resource_patterns.any? { |res_pattern| !res_pattern.match?(/^\*+$/) }
@@ -168,8 +194,8 @@ module Gapic
168
194
  end
169
195
 
170
196
  ##
171
- # Returns a segment's pattern filled with dummy values
172
- # names of the values are generated starting from the index provided
197
+ # Returns a segment's pattern filled with dummy values.
198
+ # Names of the values are generated starting from the index provided.
173
199
  # @param start_index [Integer] a starting index for dummy value generation
174
200
  # @return [String] a pattern filled with dummy values
175
201
  def expected_path_for_dummy_values start_index
@@ -184,7 +210,13 @@ module Gapic
184
210
  # Path string for this segment
185
211
  # @return [String]
186
212
  def path_string
187
- 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
188
220
  end
189
221
 
190
222
  ##
@@ -194,6 +226,46 @@ module Gapic
194
226
  "*"
195
227
  end
196
228
 
229
+ ##
230
+ # Whether the segment is a resource id segment
231
+ # @return [Boolean]
232
+ def resource_id_segment?
233
+ true
234
+ end
235
+
236
+ ##
237
+ # The pattern with the resource name
238
+ # (e.g. `foo` in `{foo=bar/*}`) stripped.
239
+ # So `{foo=bar/*}` -> `bar/*`.
240
+ #
241
+ # Not implemented for multivariate segments
242
+ # (e.g `{foo}~{bar}`).
243
+ #
244
+ # @return [String]
245
+ def simplified_pattern
246
+ if resource_patterns.count > 1
247
+ raise "Not implemented for multivariate ResourceId segments"
248
+ end
249
+ resource_patterns[0]
250
+ end
251
+
252
+ ##
253
+ # Creates a string with a regex representation of this segment's pattern
254
+ # @return [String]
255
+ def to_regex_str
256
+ raise "Not implemented for multivariate ResourceId segments" if resource_patterns.count > 1
257
+
258
+ resource_pattern = if resource_patterns[0].nil?
259
+ "*"
260
+ else
261
+ resource_patterns[0]
262
+ end
263
+
264
+ resource_pattern_regex = Gapic::PathPattern::Parser.parse(resource_pattern).to_regex_str
265
+
266
+ "(?<#{resource_names[0]}>#{resource_pattern_regex})"
267
+ end
268
+
197
269
  ##
198
270
  # Initialization helper to create a simple resource without a pattern
199
271
  # @param name [String] resource name
@@ -206,9 +278,10 @@ module Gapic
206
278
  def == other
207
279
  return false unless other.is_a? self.class
208
280
 
209
- (type == other.type && pattern == other.pattern &&
281
+ type == other.type &&
282
+ pattern == other.pattern &&
210
283
  resource_names == other.resource_names &&
211
- resource_patterns == other.resource_patterns)
284
+ resource_patterns == other.resource_patterns
212
285
  end
213
286
  end
214
287
 
@@ -272,6 +345,28 @@ module Gapic
272
345
  pattern
273
346
  end
274
347
 
348
+ ##
349
+ # Whether the segment is a resource id segment
350
+ # @return [Boolean]
351
+ def resource_id_segment?
352
+ false
353
+ end
354
+
355
+ ##
356
+ # The difference between `simplified_pattern` and `pattern`
357
+ # does not exist for the CollectionId segments
358
+ # @return [String]
359
+ def simplified_pattern
360
+ pattern
361
+ end
362
+
363
+ ##
364
+ # Creates a string with a regex representation of this segment's pattern
365
+ # @return [String]
366
+ def to_regex_str
367
+ pattern
368
+ end
369
+
275
370
  # @private
276
371
  def == other
277
372
  return false unless other.is_a? self.class
@@ -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