gapic-generator 0.11.0 → 0.45.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (276) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +299 -0
  3. data/CONTRIBUTING.md +1 -1
  4. data/README.md +71 -37
  5. data/bin/protoc-gen-ruby_gapic +2 -2
  6. data/lib/gapic/file_formatter.rb +23 -19
  7. data/lib/gapic/formatting_utils.rb +22 -9
  8. data/lib/gapic/gem_builder.rb +15 -17
  9. data/lib/gapic/generator/version.rb +1 -1
  10. data/lib/gapic/generators/base_generator.rb +6 -4
  11. data/lib/gapic/generators/default_generator.rb +70 -34
  12. data/lib/gapic/generators/default_generator_parameters.rb +9 -3
  13. data/lib/gapic/grpc_service_config/parser.rb +2 -2
  14. data/lib/gapic/model/api_metadata.rb +173 -0
  15. data/lib/gapic/model/method/http_annotation.rb +158 -60
  16. data/lib/gapic/model/method/lro.rb +8 -5
  17. data/lib/gapic/model/method/routing.rb +3 -18
  18. data/lib/gapic/model/mixins.rb +76 -10
  19. data/lib/gapic/model/service/nonstandard_lro_provider.rb +10 -11
  20. data/lib/gapic/package_snippets.rb +159 -0
  21. data/lib/gapic/path_pattern/parser.rb +11 -2
  22. data/lib/gapic/path_pattern/pattern.rb +18 -1
  23. data/lib/gapic/path_pattern/segment.rb +11 -4
  24. data/lib/gapic/presenters/enum_presenter.rb +14 -0
  25. data/lib/gapic/presenters/enum_value_presenter.rb +4 -1
  26. data/lib/gapic/presenters/field_presenter.rb +78 -21
  27. data/lib/gapic/presenters/gem_presenter.rb +109 -35
  28. data/lib/gapic/presenters/message_presenter.rb +15 -0
  29. data/lib/gapic/presenters/method/http_binding_presenter.rb +128 -0
  30. data/lib/gapic/presenters/method/rest_pagination_info.rb +25 -16
  31. data/lib/gapic/presenters/method_presenter.rb +109 -35
  32. data/lib/gapic/presenters/method_rest_presenter.rb +70 -137
  33. data/lib/gapic/presenters/package_presenter.rb +63 -18
  34. data/lib/gapic/presenters/resource_presenter.rb +9 -3
  35. data/lib/gapic/presenters/service/lro_client_presenter.rb +14 -14
  36. data/lib/gapic/presenters/service/mixin_client_presenter.rb +89 -0
  37. data/lib/gapic/presenters/service/sub_client_presenter.rb +84 -0
  38. data/lib/gapic/presenters/service_presenter.rb +183 -31
  39. data/lib/gapic/presenters/service_rest_presenter.rb +180 -27
  40. data/lib/gapic/presenters/snippet/client_call_presenter.rb +82 -0
  41. data/lib/gapic/presenters/snippet/client_initialization_presenter.rb +87 -0
  42. data/lib/gapic/presenters/snippet/declaration_presenter.rb +91 -0
  43. data/lib/gapic/presenters/snippet/expression_presenter.rb +135 -0
  44. data/lib/gapic/presenters/snippet/iteration_presenter.rb +118 -0
  45. data/lib/gapic/presenters/snippet/parameter_presenter.rb +67 -0
  46. data/lib/gapic/presenters/snippet/request_initialization_presenters.rb +202 -0
  47. data/lib/gapic/presenters/snippet/response_handling_presenters.rb +329 -0
  48. data/lib/gapic/presenters/snippet/statement_presenter.rb +134 -0
  49. data/lib/gapic/presenters/snippet/type_presenter.rb +98 -0
  50. data/lib/gapic/presenters/snippet_presenter.rb +199 -10
  51. data/lib/gapic/presenters.rb +2 -0
  52. data/lib/gapic/runner.rb +1 -1
  53. data/lib/gapic/schema/api.rb +49 -3
  54. data/lib/gapic/schema/loader.rb +67 -22
  55. data/lib/gapic/schema/parameter_schema.rb +8 -8
  56. data/lib/gapic/schema/proto_tools.rb +193 -0
  57. data/lib/gapic/schema/request_param_parser.rb +5 -7
  58. data/lib/gapic/schema/service_config_parser.rb +38 -4
  59. data/lib/gapic/schema/wrappers.rb +192 -31
  60. data/lib/gapic/uri_template/parser.rb +15 -7
  61. data/lib/google/cloud/tools/snippetgen/configlanguage/v1/snippet_config_language_pb.rb +104 -0
  62. data/lib/google/cloud/tools/snippetgen/snippetindex/v1/snippet_index_pb.rb +58 -0
  63. data/lib/google/protobuf/compiler/plugin_pb.rb +47 -0
  64. data/templates/default/binding_override.text.erb +6 -0
  65. data/templates/default/gem/gemfile.text.erb +12 -0
  66. data/templates/default/gem/{gemspec.erb → gemspec.text.erb} +3 -11
  67. data/templates/default/gem/{readme.erb → readme.text.erb} +10 -6
  68. data/templates/default/gem/{rubocop.erb → rubocop.text.erb} +3 -0
  69. data/templates/default/gem/{test_helper.erb → test_helper.text.erb} +4 -2
  70. data/templates/default/gem/toys.text.erb +12 -0
  71. data/templates/default/helpers/default_helper.rb +33 -1
  72. data/templates/default/lib/_binding_override.text.erb +49 -0
  73. data/templates/default/lib/{_package.erb → _package.text.erb} +6 -9
  74. data/templates/default/lib/_package_rest.text.erb +24 -0
  75. data/templates/default/lib/{_service.erb → _service.text.erb} +11 -23
  76. data/templates/default/lib/package/_self_configure.text.erb +16 -0
  77. data/templates/default/lib/package/_self_configure_defaults.text.erb +13 -0
  78. data/templates/default/lib/package/self_configure/_binding_default.text.erb +15 -0
  79. data/templates/default/lib/rest/_rest.text.erb +46 -0
  80. data/templates/default/package_rest.text.erb +6 -0
  81. data/templates/default/proto_docs/_deprecated.text.erb +9 -0
  82. data/templates/default/proto_docs/{_enum.erb → _enum.text.erb} +1 -0
  83. data/templates/default/proto_docs/{_message.erb → _message.text.erb} +2 -0
  84. data/templates/default/service/client/{_client.erb → _client.text.erb} +60 -12
  85. data/templates/default/service/client/{_config.erb → _config.text.erb} +39 -8
  86. data/templates/default/service/client/{_operations.erb → _operations.text.erb} +24 -3
  87. data/templates/default/service/client/method/{_def.erb → _def.text.erb} +2 -2
  88. data/templates/default/service/client/method/def/{_options_defaults.erb → _options_defaults.text.erb} +2 -1
  89. data/templates/default/service/client/method/def/_request_normal.text.erb +18 -0
  90. data/templates/default/service/client/method/def/_request_streaming.text.erb +23 -0
  91. data/templates/default/service/client/method/def/{_response.erb → _response.text.erb} +2 -0
  92. data/templates/default/service/client/method/def/{_response_nonstandard_lro.erb → _response_nonstandard_lro.text.erb} +1 -1
  93. data/templates/default/service/client/method/def/_response_normal.text.erb +4 -0
  94. data/templates/default/service/client/method/def/{_response_normal.erb → _response_normal_lro.text.erb} +1 -3
  95. data/templates/default/service/client/method/def/{_response_paged.erb → _response_paged.text.erb} +1 -1
  96. data/templates/default/service/client/method/docs/{_request_normal.erb → _request_normal.text.erb} +1 -1
  97. data/templates/default/service/client/method/docs/_snippets.text.erb +6 -0
  98. data/templates/default/service/client/resource/_def.text.erb +7 -0
  99. data/templates/default/service/nonstandard_lro.text.erb +6 -0
  100. data/templates/default/service/rest/client/{_client.erb → _client.text.erb} +82 -13
  101. data/templates/default/service/rest/client/_config.text.erb +178 -0
  102. data/templates/default/service/rest/client/_operations.text.erb +124 -0
  103. data/templates/default/service/rest/client/method/{_def.erb → _def.text.erb} +7 -1
  104. data/templates/default/service/rest/client/method/def/{_options_defaults.erb → _options_defaults.text.erb} +8 -3
  105. data/templates/default/service/rest/client/method/def/{_response.erb → _response.text.erb} +4 -0
  106. data/templates/default/service/rest/client/method/def/{_response_nonstandard_lro.erb → _response_nonstandard_lro.text.erb} +5 -4
  107. data/templates/default/service/rest/client/method/def/_response_normal.text.erb +5 -0
  108. data/templates/default/service/rest/client/method/def/_response_normal_lro.text.erb +7 -0
  109. data/templates/default/service/rest/client/method/def/_response_paged.text.erb +7 -0
  110. data/templates/default/service/rest/client/method/def/_response_server_streaming.text.erb +11 -0
  111. data/templates/default/service/rest/client/method/docs/{_request.erb → _request.text.erb} +1 -3
  112. data/templates/default/service/rest/client/method/docs/_result.text.erb +10 -0
  113. data/templates/default/service/rest/client/method/docs/_snippets.text.erb +6 -0
  114. data/templates/default/service/{nonstandard_lro.erb → rest/nonstandard_lro.text.erb} +1 -1
  115. data/templates/default/service/rest/operations.text.erb +6 -0
  116. data/templates/default/service/rest/service_stub/_service_stub.text.erb +63 -0
  117. data/templates/default/service/rest/service_stub/grpc_transcoding_method/_def.text.erb +37 -0
  118. data/templates/default/service/rest/service_stub/method/_def.text.erb +35 -0
  119. data/templates/default/service/rest/service_stub/method/def/_response.text.erb +37 -0
  120. data/templates/default/service/rest/test/{client.erb → client.text.erb} +3 -3
  121. data/templates/default/service/rest/test/method/_assert_response.text.erb +2 -0
  122. data/templates/default/service/rest/test/method/{_configure.erb → _configure.text.erb} +3 -2
  123. data/templates/default/service/rest/test/method/_normal.text.erb +60 -0
  124. data/templates/default/service/rest/test/method/_server.text.erb +60 -0
  125. data/templates/default/service/rest/test/method/{_setup.erb → _setup.text.erb} +26 -10
  126. data/templates/default/service/test/{_resource.erb → _resource.text.erb} +1 -1
  127. data/templates/default/service/test/{client.erb → client.text.erb} +3 -2
  128. data/templates/default/service/test/client_paths.text.erb +33 -0
  129. data/templates/default/service/test/method/{_bidi.erb → _bidi.text.erb} +1 -1
  130. data/templates/default/service/test/method/{_client.erb → _client.text.erb} +1 -1
  131. data/templates/default/service/test/method/{_configure.erb → _configure.text.erb} +2 -1
  132. data/templates/default/service/test/method/{_normal.erb → _normal.text.erb} +1 -1
  133. data/templates/default/service/test/method/{_server.erb → _server.text.erb} +1 -1
  134. data/templates/default/service/test/method/{_setup.erb → _setup.text.erb} +19 -2
  135. data/templates/default/snippets/{gemfile.erb → gemfile.text.erb} +2 -2
  136. data/templates/default/snippets/snippet/_body.text.erb +24 -0
  137. data/templates/default/snippets/snippet/_inline.text.erb +11 -0
  138. data/templates/default/snippets/snippet/_standalone.text.erb +25 -0
  139. data/templates/default/snippets/{standalone.erb → standalone.text.erb} +1 -1
  140. metadata +198 -273
  141. data/lib/google/api/annotations.pb.rb +0 -39
  142. data/lib/google/api/auth.pb.rb +0 -75
  143. data/lib/google/api/backend.pb.rb +0 -59
  144. data/lib/google/api/billing.pb.rb +0 -53
  145. data/lib/google/api/client.pb.rb +0 -43
  146. data/lib/google/api/context.pb.rb +0 -47
  147. data/lib/google/api/control.pb.rb +0 -38
  148. data/lib/google/api/documentation.pb.rb +0 -56
  149. data/lib/google/api/endpoint.pb.rb +0 -42
  150. data/lib/google/api/field_behavior.pb.rb +0 -51
  151. data/lib/google/api/http.pb.rb +0 -60
  152. data/lib/google/api/label.pb.rb +0 -49
  153. data/lib/google/api/launch_stage.pb.rb +0 -37
  154. data/lib/google/api/log.pb.rb +0 -47
  155. data/lib/google/api/logging.pb.rb +0 -48
  156. data/lib/google/api/metric.pb.rb +0 -90
  157. data/lib/google/api/monitored_resource.pb.rb +0 -68
  158. data/lib/google/api/monitoring.pb.rb +0 -48
  159. data/lib/google/api/quota.pb.rb +0 -63
  160. data/lib/google/api/resource.pb.rb +0 -80
  161. data/lib/google/api/routing.pb.rb +0 -58
  162. data/lib/google/api/service.pb.rb +0 -90
  163. data/lib/google/api/source_info.pb.rb +0 -44
  164. data/lib/google/api/system_parameter.pb.rb +0 -51
  165. data/lib/google/api/usage.pb.rb +0 -47
  166. data/lib/google/cloud/extended_operations.pb.rb +0 -57
  167. data/lib/google/longrunning/operations.pb.rb +0 -115
  168. data/lib/google/protobuf/any.pb.rb +0 -40
  169. data/lib/google/protobuf/api.pb.rb +0 -69
  170. data/lib/google/protobuf/compiler/plugin.pb.rb +0 -79
  171. data/lib/google/protobuf/descriptor.pb.rb +0 -360
  172. data/lib/google/protobuf/duration.pb.rb +0 -41
  173. data/lib/google/protobuf/empty.pb.rb +0 -36
  174. data/lib/google/protobuf/source_context.pb.rb +0 -39
  175. data/lib/google/protobuf/struct.pb.rb +0 -65
  176. data/lib/google/protobuf/type.pb.rb +0 -128
  177. data/lib/google/protobuf/wrappers.pb.rb +0 -80
  178. data/lib/google/rpc/status.pb.rb +0 -46
  179. data/templates/default/gem/gemfile.erb +0 -4
  180. data/templates/default/lib/rest/_rest.erb +0 -9
  181. data/templates/default/service/client/method/def/_request_normal.erb +0 -4
  182. data/templates/default/service/client/method/def/_request_streaming.erb +0 -9
  183. data/templates/default/service/client/method/docs/_deprecated.erb +0 -5
  184. data/templates/default/service/client/method/docs/_snippets.erb +0 -6
  185. data/templates/default/service/client/resource/_def.erb +0 -6
  186. data/templates/default/service/rest/client/_config.erb +0 -122
  187. data/templates/default/service/rest/client/method/def/_response_normal.erb +0 -6
  188. data/templates/default/service/rest/client/method/def/_response_paged.erb +0 -7
  189. data/templates/default/service/rest/client/method/docs/_result.erb +0 -6
  190. data/templates/default/service/rest/service_stub/_service_stub.erb +0 -25
  191. data/templates/default/service/rest/service_stub/grpc_transcoding_method/_def.erb +0 -24
  192. data/templates/default/service/rest/service_stub/method/_def.erb +0 -20
  193. data/templates/default/service/rest/service_stub/method/def/_response.erb +0 -17
  194. data/templates/default/service/rest/test/method/_assert_response.erb +0 -2
  195. data/templates/default/service/rest/test/method/_normal.erb +0 -71
  196. data/templates/default/service/test/client_paths.erb +0 -15
  197. data/templates/default/snippets/snippet/_structure.erb +0 -71
  198. /data/gem_templates/{binary.erb → binary.text.erb} +0 -0
  199. /data/gem_templates/{dockerfile.erb → dockerfile.text.erb} +0 -0
  200. /data/gem_templates/{entrypoint.erb → entrypoint.text.erb} +0 -0
  201. /data/gem_templates/{gapic_sh.erb → gapic_sh.text.erb} +0 -0
  202. /data/gem_templates/{gemfile.erb → gemfile.text.erb} +0 -0
  203. /data/gem_templates/{gemspec.erb → gemspec.text.erb} +0 -0
  204. /data/gem_templates/{generator.erb → generator.text.erb} +0 -0
  205. /data/gem_templates/{gitignore.erb → gitignore.text.erb} +0 -0
  206. /data/gem_templates/{rakefile.erb → rakefile.text.erb} +0 -0
  207. /data/gem_templates/{readme.erb → readme.text.erb} +0 -0
  208. /data/gem_templates/{rubocop.erb → rubocop.text.erb} +0 -0
  209. /data/gem_templates/shared/{_header.erb → _header.text.erb} +0 -0
  210. /data/gem_templates/shared/{_license.erb → _license.text.erb} +0 -0
  211. /data/gem_templates/shared/{_warning.erb → _warning.text.erb} +0 -0
  212. /data/gem_templates/{test_generator.erb → test_generator.text.erb} +0 -0
  213. /data/gem_templates/{test_helper.erb → test_helper.text.erb} +0 -0
  214. /data/gem_templates/{version.erb → version.text.erb} +0 -0
  215. /data/templates/default/gem/{_version.erb → _version.text.erb} +0 -0
  216. /data/templates/default/gem/{changelog.erb → changelog.text.erb} +0 -0
  217. /data/templates/default/gem/{entrypoint.erb → entrypoint.text.erb} +0 -0
  218. /data/templates/default/gem/{gapic_metadata_json.erb → gapic_metadata_json.text.erb} +0 -0
  219. /data/templates/default/gem/{gitignore.erb → gitignore.text.erb} +0 -0
  220. /data/templates/default/gem/{license.erb → license.text.erb} +0 -0
  221. /data/templates/default/gem/{rakefile.erb → rakefile.text.erb} +0 -0
  222. /data/templates/default/gem/{version.erb → version.text.erb} +0 -0
  223. /data/templates/default/gem/{yardopts.erb → yardopts.text.erb} +0 -0
  224. /data/templates/default/layouts/{_ruby.erb → _ruby.text.erb} +0 -0
  225. /data/templates/default/{package.erb → package.text.erb} +0 -0
  226. /data/templates/default/proto_docs/{_proto_file.erb → _proto_file.text.erb} +0 -0
  227. /data/templates/default/proto_docs/{proto_file.erb → proto_file.text.erb} +0 -0
  228. /data/templates/default/proto_docs/{readme.erb → readme.text.erb} +0 -0
  229. /data/templates/default/service/{_helpers.erb → _helpers.text.erb} +0 -0
  230. /data/templates/default/service/client/{_credentials.erb → _credentials.text.erb} +0 -0
  231. /data/templates/default/service/client/{_nonstandard_lro.erb → _nonstandard_lro.text.erb} +0 -0
  232. /data/templates/default/service/client/{_paths.erb → _paths.text.erb} +0 -0
  233. /data/templates/default/service/client/{_requires.erb → _requires.text.erb} +0 -0
  234. /data/templates/default/service/client/{_resource.erb → _resource.text.erb} +0 -0
  235. /data/templates/default/service/client/{_self_configure.erb → _self_configure.text.erb} +0 -0
  236. /data/templates/default/service/client/{_self_configure_defaults.erb → _self_configure_defaults.text.erb} +0 -0
  237. /data/templates/default/service/client/method/def/{_request.erb → _request.text.erb} +0 -0
  238. /data/templates/default/service/client/method/def/{_rescue.erb → _rescue.text.erb} +0 -0
  239. /data/templates/default/service/client/method/def/{_routing_params.erb → _routing_params.text.erb} +0 -0
  240. /data/templates/default/service/client/method/docs/{_error.erb → _error.text.erb} +0 -0
  241. /data/templates/default/service/client/method/docs/{_request.erb → _request.text.erb} +0 -0
  242. /data/templates/default/service/client/method/docs/{_request_field.erb → _request_field.text.erb} +0 -0
  243. /data/templates/default/service/client/method/docs/{_request_streaming.erb → _request_streaming.text.erb} +0 -0
  244. /data/templates/default/service/client/method/docs/{_response.erb → _response.text.erb} +0 -0
  245. /data/templates/default/service/client/method/docs/{_sample.erb → _sample.text.erb} +0 -0
  246. /data/templates/default/service/client/method/docs/{_sample_response.erb → _sample_response.text.erb} +0 -0
  247. /data/templates/default/service/client/method/docs/{_samples.erb → _samples.text.erb} +0 -0
  248. /data/templates/default/service/client/method/docs/request_field/{_arg.erb → _arg.text.erb} +0 -0
  249. /data/templates/default/service/client/method/docs/request_field/{_hash.erb → _hash.text.erb} +0 -0
  250. /data/templates/default/service/client/method/docs/sample_response/{_comment.erb → _comment.text.erb} +0 -0
  251. /data/templates/default/service/client/method/docs/sample_response/{_define.erb → _define.text.erb} +0 -0
  252. /data/templates/default/service/client/method/docs/sample_response/{_loop.erb → _loop.text.erb} +0 -0
  253. /data/templates/default/service/client/method/docs/sample_response/{_print.erb → _print.text.erb} +0 -0
  254. /data/templates/default/service/client/method/docs/sample_response/{_write_file.erb → _write_file.text.erb} +0 -0
  255. /data/templates/default/service/client/resource/{_doc.erb → _doc.text.erb} +0 -0
  256. /data/templates/default/service/client/resource/{_multi.erb → _multi.text.erb} +0 -0
  257. /data/templates/default/service/client/resource/{_single.erb → _single.text.erb} +0 -0
  258. /data/templates/default/service/{client.erb → client.text.erb} +0 -0
  259. /data/templates/default/service/{credentials.erb → credentials.text.erb} +0 -0
  260. /data/templates/default/service/{operations.erb → operations.text.erb} +0 -0
  261. /data/templates/default/service/{paths.erb → paths.text.erb} +0 -0
  262. /data/templates/default/service/rest/client/method/def/{_rescue.erb → _rescue.text.erb} +0 -0
  263. /data/templates/default/service/rest/client/method/docs/{_error.erb → _error.text.erb} +0 -0
  264. /data/templates/default/service/rest/{client.erb → client.text.erb} +0 -0
  265. /data/templates/default/service/rest/{grpc_transcoding.erb → grpc_transcoding.text.erb} +0 -0
  266. /data/templates/default/service/rest/service_stub/grpc_transcoding_method/def/{_query_string_param.erb → _query_string_param.text.erb} +0 -0
  267. /data/templates/default/service/rest/service_stub/method/def/{_request.erb → _request.text.erb} +0 -0
  268. /data/templates/default/service/rest/{service_stub.erb → service_stub.text.erb} +0 -0
  269. /data/templates/default/service/{rest.erb → rest.text.erb} +0 -0
  270. /data/templates/default/service/test/{client_operations.erb → client_operations.text.erb} +0 -0
  271. /data/templates/default/service/test/method/{_assert_response.erb → _assert_response.text.erb} +0 -0
  272. /data/templates/default/service/test/{smoke.erb → smoke.text.erb} +0 -0
  273. /data/templates/default/{service.erb → service.text.erb} +0 -0
  274. /data/templates/default/shared/{_header.erb → _header.text.erb} +0 -0
  275. /data/templates/default/shared/{_license.erb → _license.text.erb} +0 -0
  276. /data/templates/default/shared/{_warning.erb → _warning.text.erb} +0 -0
@@ -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 "singleton"
18
+
17
19
  require "gapic/path_pattern"
18
20
 
19
21
  module Gapic
@@ -55,9 +57,9 @@ module Gapic
55
57
  !f.operation_request_field.nil? && !f.operation_request_field.empty?
56
58
  end
57
59
 
58
- @operation_request_fields = ops_request_fields.map do |field|
60
+ @operation_request_fields = ops_request_fields.to_h do |field|
59
61
  [field.name, field.operation_request_field]
60
- end.to_h
62
+ end
61
63
  end
62
64
 
63
65
  ##
@@ -138,14 +140,15 @@ module Gapic
138
140
  ops_service_lro = api.nonstandard_lro_model_for service_full_name
139
141
  unless ops_service_lro.nonstandard_lro?
140
142
  error_text = "A service #{service_full_name} specified as a nonstandard LRO service for " \
141
- "the method #{method.full_name} was not found."
143
+ "the method #{method.full_name} was not found."
142
144
  raise ModelError, error_text
143
145
  end
144
146
 
145
147
  unless method.output.full_name == ops_service_lro.lro_object_full_name
146
148
  error_text = "A service #{service_full_name} specified as a nonstandard LRO service for " \
147
- "the method #{method.full_name} has a different LRO object (#{ops_service_lro.lro_object_full_name}) " \
148
- "from the method's return type (#{method.output.full_name})."
149
+ "the method #{method.full_name} has a different LRO object " \
150
+ "(#{ops_service_lro.lro_object_full_name}) from the method's return type " \
151
+ "(#{method.output.full_name})."
149
152
  raise ModelError, error_text
150
153
  end
151
154
 
@@ -175,8 +175,8 @@ module Gapic
175
175
  end
176
176
 
177
177
  @field_pattern = @path_pattern.simplified_pattern
178
- @field_full_regex_str = to_field_pattern @path_pattern
179
- @field_regex_str = to_field_pattern Gapic::PathPattern.parse(@field_pattern)
178
+ @field_full_regex_str = @path_pattern.to_field_regex_str
179
+ @field_regex_str = Gapic::PathPattern.parse(@field_pattern).to_field_regex_str
180
180
 
181
181
  @key = resource_segment.arguments[0]
182
182
  @value_pattern = resource_segment.resource_patterns[0]
@@ -200,20 +200,6 @@ module Gapic
200
200
 
201
201
  private
202
202
 
203
- # Makes a regex pattern match a field
204
- # - adds markers for the beginning and end of the string
205
- # - adds handling of an optional tail `/` if needed
206
- # @param pattern [String]
207
- # @return [String]
208
- def to_field_pattern pattern
209
- tail_slash_accept = if pattern.segments.last.simplified_pattern == "**"
210
- ""
211
- else
212
- "/?"
213
- end
214
- "^#{pattern.to_regex_str}#{tail_slash_accept}$"
215
- end
216
-
217
203
  # Converts path template simplified forms into canonical
218
204
  # ResourceId representations by adding a field as a Resource Id
219
205
  # @param template [String]
@@ -244,8 +230,7 @@ module Gapic
244
230
  "it contains a multivariate ResourceId segment (e.g. `{foo}~{bar}`)"
245
231
  end
246
232
 
247
- "A routing header parameter with the path_template #{raw_template}\n " \
248
- "is invalid: #{reason}"
233
+ "A routing header parameter with the path_template #{raw_template}\n is invalid: #{reason}"
249
234
  end
250
235
  end
251
236
 
@@ -36,9 +36,12 @@ module Gapic
36
36
  # List of services from the Api model
37
37
  # @param service_config [Google::Api::Service]
38
38
  # The service config
39
- def initialize api_services, service_config
39
+ # @param gem_name [String]
40
+ # The name of the gem.
41
+ def initialize api_services, service_config, gem_name
40
42
  @api_services = api_services
41
43
  @service_config = service_config
44
+ @gem_name = gem_name
42
45
  end
43
46
 
44
47
  # @return [Boolean] Whether there are any mix-in services
@@ -50,13 +53,14 @@ module Gapic
50
53
  # List of Mixin objects, providing the information that is needed
51
54
  # to add the mixin service references to the generated library
52
55
  def mixins
53
- @mixins ||= mixin_services.map { |service| create_mixin(service) }
56
+ @mixins ||= mixin_services.map { |service| create_mixin service }
54
57
  end
55
58
 
56
59
  # @return [Enumerable<String>] Full proto names of the mix-in services
57
60
  def mixin_services
58
- @mixin_services ||= services_in_config.select do |service|
59
- service != LRO_SERVICE && !@api_services.include?(service)
61
+ @mixin_services ||= begin
62
+ candidates = services_in_config & SERVICE_TO_DEPENDENCY.keys
63
+ candidates.reject { |name| SERVICE_TO_DEPENDENCY[name].include? @gem_name }
60
64
  end
61
65
  end
62
66
 
@@ -77,12 +81,21 @@ module Gapic
77
81
  # @!attribute [r] require_str
78
82
  # Path to `require` the client of the service
79
83
  # @return [String]
84
+ # @!attribute [r] require_str_rest
85
+ # Path to `require` the REST client of the service
86
+ # @return [String]
80
87
  # @!attribute [r] client_class_name
81
88
  # Full name of the class of the client of the service
82
89
  # @return [String]
90
+ # @!attribute [r] client_class_name_rest
91
+ # Full name of the class of the REST client of the service
92
+ # @return [String]
83
93
  # @!attribute [r] client_class_docname
84
94
  # Name of the class as it should appear in the documentation
85
95
  # @return [String]
96
+ # @!attribute [r] client_class_docname_rest
97
+ # Name of the REST class as it should appear in the documentation
98
+ # @return [String]
86
99
  # @!attribute [r] client_var_name
87
100
  # Name for the variable for the client of the
88
101
  # mixin service to use when generating library's service
@@ -91,8 +104,11 @@ module Gapic
91
104
  attr_reader :service
92
105
  attr_reader :dependency
93
106
  attr_reader :require_str
107
+ attr_reader :require_str_rest
94
108
  attr_reader :client_class_name
109
+ attr_reader :client_class_name_rest
95
110
  attr_reader :client_class_docname
111
+ attr_reader :client_class_docname_rest
96
112
  attr_reader :client_var_name
97
113
 
98
114
  # @param service [String]
@@ -102,17 +118,25 @@ module Gapic
102
118
  # `{ gem_name => version pattern }` format
103
119
  # @param require_str [String]
104
120
  # Path to require the client of the service
121
+ # @param require_str_rest [String]
122
+ # Path to require the REST client of the service
105
123
  # @param client_class_name [String]
106
124
  # Full name of the class of the client of the service
125
+ # @param client_class_name_rest [String]
126
+ # Full name of the class of the REST client of the service
107
127
  # @param client_var_name [String]
108
128
  # Name for the variable for the client of the mixin service
109
129
  # to use when generating library's service
110
- def initialize service, dependency, require_str, client_class_name, client_var_name
130
+ def initialize service, dependency, require_str, require_str_rest, client_class_name, client_class_name_rest,
131
+ client_var_name
111
132
  @service = service
112
133
  @dependency = dependency
113
134
  @require_str = require_str
135
+ @require_str_rest = require_str_rest
114
136
  @client_class_name = client_class_name
137
+ @client_class_name_rest = client_class_name_rest
115
138
  @client_class_docname = client_class_name # For mixins, the doc name should be the full class name
139
+ @client_class_docname_rest = client_class_name_rest # For mixins, the doc name should be the full class name
116
140
  @client_var_name = client_var_name
117
141
  end
118
142
 
@@ -123,6 +147,21 @@ module Gapic
123
147
  end
124
148
  end
125
149
 
150
+ ##
151
+ # Returns true if the given service address is a mixin.
152
+ # This just checks the service against a (hard-coded) set of known mixins.
153
+ # If `gem_name` is provided, services that correspond to that gem_name are not considered mixins.
154
+ #
155
+ # @param service_address [String,Array<String>] The address (either array
156
+ # or dot-delimited) of the service to check.
157
+ # @param gem_name [String] The name of the gem.
158
+ # @return [boolean]
159
+ #
160
+ def self.mixin_service_address? service_address, gem_name: nil
161
+ service_address = service_address.join "." unless service_address.is_a? String
162
+ MIXIN_GEM_NAMES.include?(service_address) && gem_name != MIXIN_GEM_NAMES[service_address]
163
+ end
164
+
126
165
  private
127
166
 
128
167
  # @return [Enumerable<String>] Names of all services that are specified
@@ -133,28 +172,51 @@ module Gapic
133
172
  @service_config.apis.map(&:name)
134
173
  end
135
174
 
175
+ MIXIN_GEM_NAMES = {
176
+ LOCATIONS_SERVICE => "google-cloud-location",
177
+ IAM_SERVICE => "google-iam-v1",
178
+ LRO_SERVICE => "google-longrunning-operations"
179
+ }.freeze
180
+ private_constant :MIXIN_GEM_NAMES
181
+
136
182
  # Since mixins are scope-limited to a couple of services, it is easier to
137
183
  # have these in lookup tables than to construct a ServicePresenter
138
184
 
139
185
  SERVICE_TO_DEPENDENCY = {
140
- LOCATIONS_SERVICE => { "google-cloud-location" => "~> 0.1" },
141
- IAM_SERVICE => { "google-iam-v1" => "~> 0.1" }
186
+ LOCATIONS_SERVICE => { "google-cloud-location" => ["~> 1.0"] },
187
+ IAM_SERVICE => { "google-iam-v1" => ["~> 1.3"] }
142
188
  }.freeze
189
+ private_constant :SERVICE_TO_DEPENDENCY
143
190
 
144
191
  SERVICE_TO_REQUIRE_STR = {
145
192
  LOCATIONS_SERVICE => "google/cloud/location",
146
- IAM_SERVICE => "google/iam/v1/iam_policy"
193
+ IAM_SERVICE => "google/iam/v1"
194
+ }.freeze
195
+ private_constant :SERVICE_TO_REQUIRE_STR
196
+
197
+ SERVICE_TO_REQUIRE_STR_REST = {
198
+ LOCATIONS_SERVICE => "google/cloud/location/rest",
199
+ IAM_SERVICE => "google/iam/v1/rest"
147
200
  }.freeze
201
+ private_constant :SERVICE_TO_REQUIRE_STR_REST
148
202
 
149
203
  SERVICE_TO_CLIENT_CLASS_NAME = {
150
204
  LOCATIONS_SERVICE => "Google::Cloud::Location::Locations::Client",
151
205
  IAM_SERVICE => "Google::Iam::V1::IAMPolicy::Client"
152
206
  }.freeze
207
+ private_constant :SERVICE_TO_CLIENT_CLASS_NAME
208
+
209
+ SERVICE_TO_CLIENT_CLASS_NAME_REST = {
210
+ LOCATIONS_SERVICE => "Google::Cloud::Location::Locations::Rest::Client",
211
+ IAM_SERVICE => "Google::Iam::V1::IAMPolicy::Rest::Client"
212
+ }.freeze
213
+ private_constant :SERVICE_TO_CLIENT_CLASS_NAME_REST
153
214
 
154
215
  SERVICE_TO_CLIENT_ATTR_NAME = {
155
216
  LOCATIONS_SERVICE => "location_client",
156
217
  IAM_SERVICE => "iam_policy_client"
157
218
  }.freeze
219
+ private_constant :SERVICE_TO_CLIENT_ATTR_NAME
158
220
 
159
221
  # @param service [String] full grpc name of the service
160
222
  # @raise [ModelError]
@@ -162,8 +224,10 @@ module Gapic
162
224
  def create_mixin service
163
225
  unless SERVICE_TO_DEPENDENCY.key?(service) &&
164
226
  SERVICE_TO_REQUIRE_STR.key?(service) &&
165
- SERVICE_TO_CLIENT_CLASS_NAME.key?(service)
166
- SERVICE_TO_CLIENT_ATTR_NAME.key? service
227
+ SERVICE_TO_REQUIRE_STR_REST.key?(service) &&
228
+ SERVICE_TO_CLIENT_CLASS_NAME.key?(service) &&
229
+ SERVICE_TO_CLIENT_CLASS_NAME_REST.key?(service) &&
230
+ SERVICE_TO_CLIENT_ATTR_NAME.key?(service)
167
231
 
168
232
  error_text = "A mixin service #{service} is specified in service config, but " \
169
233
  "the Generator does not know of it."
@@ -173,7 +237,9 @@ module Gapic
173
237
  Mixin.new service,
174
238
  SERVICE_TO_DEPENDENCY[service],
175
239
  SERVICE_TO_REQUIRE_STR[service],
240
+ SERVICE_TO_REQUIRE_STR_REST[service],
176
241
  SERVICE_TO_CLIENT_CLASS_NAME[service],
242
+ SERVICE_TO_CLIENT_CLASS_NAME_REST[service],
177
243
  SERVICE_TO_CLIENT_ATTR_NAME[service]
178
244
  end
179
245
  end
@@ -114,7 +114,6 @@ module Gapic
114
114
  operation_err_code_field,
115
115
  operation_err_msg_field,
116
116
  operation_response_fields
117
-
118
117
  @service_full_name = service_full_name
119
118
  @polling_method_name = polling_method_name
120
119
  @lro_object_full_name = lro_object_full_name
@@ -166,11 +165,11 @@ module Gapic
166
165
  if nonstandard_lro_candidates.length.positive?
167
166
  ops_service_method = nonstandard_lro_candidates[0]
168
167
  error_text = "A service `#{service.name}` has a method annotated " \
169
- "with `polling_method` (`#{polling_method.name}`), and also a method annotated " \
170
- "with `operation_service` (`#{ops_service_method.name}`). "\
171
- "This means a grpc service tries to be a client " \
172
- "and a provider of the nonstandard LRO at the same time. " \
173
- "This is not supported."
168
+ "with `polling_method` (`#{polling_method.name}`), and also a method annotated " \
169
+ "with `operation_service` (`#{ops_service_method.name}`). " \
170
+ "This means a grpc service tries to be a client " \
171
+ "and a provider of the nonstandard LRO at the same time. " \
172
+ "This is not supported."
174
173
  raise ModelError, error_text
175
174
  end
176
175
 
@@ -191,9 +190,9 @@ module Gapic
191
190
  !f.operation_response_field.nil? && !f.operation_response_field.empty?
192
191
  end
193
192
 
194
- operation_response_fields = ops_response_fields.map do |field|
193
+ operation_response_fields = ops_response_fields.to_h do |field|
195
194
  [field.name, field.operation_response_field]
196
- end.to_h
195
+ end
197
196
 
198
197
  NonstandardLroProvider.new service.full_name,
199
198
  polling_method.name,
@@ -221,7 +220,7 @@ module Gapic
221
220
  name_candidate = polling_method.output.fields.find do |f|
222
221
  f.operation_field == ops_response_field
223
222
  end
224
- return name_candidate.name if name_candidate
223
+ name_candidate&.name
225
224
  end
226
225
 
227
226
  ##
@@ -242,7 +241,7 @@ module Gapic
242
241
  end
243
242
  if polling_method_candidates.length > 1
244
243
  error_text = "A service #{service.name} has more than one method annotated " \
245
- "with `operation_polling_method`. This should not happen."
244
+ "with `operation_polling_method`. This should not happen."
246
245
  raise ModelError, error_text
247
246
  end
248
247
 
@@ -277,7 +276,7 @@ module Gapic
277
276
  raise ModelError, error_text
278
277
  end
279
278
 
280
- if status_candidates.length.zero?
279
+ if status_candidates.empty?
281
280
  error_text = "A nonstandard LRO provider service `#{service.name}`'s " \
282
281
  "polling method `#{polling_method.name}`'s output message " \
283
282
  "`#{polling_method.output.name}` does not have any fields annotated " \
@@ -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