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
@@ -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
@@ -30,7 +30,8 @@ module Gapic
30
30
 
31
31
  def initialize api
32
32
  @api = api
33
- @mixins_model = Gapic::Model::Mixins.new api.services.map(&:full_name), api.service_config
33
+ service_config = api.configuration[:common_services] ? nil : api.service_config
34
+ @mixins_model = Gapic::Model::Mixins.new api.services.map(&:full_name), service_config, name
34
35
  end
35
36
 
36
37
  ##
@@ -53,7 +54,10 @@ module Gapic
53
54
  def services
54
55
  @services ||= begin
55
56
  files = @api.generate_files
56
- files.map(&:services).flatten.map { |s| ServicePresenter.new self, @api, s }
57
+ service_list = files.map(&:services).flatten
58
+ mixin_service_names = mixins_model.mixin_services
59
+ service_list.delete_if { |s| mixin_service_names.include? s.full_name }
60
+ service_list.map { |s| ServicePresenter.new self, @api, s }
57
61
  end
58
62
  end
59
63
 
@@ -63,17 +67,12 @@ module Gapic
63
67
 
64
68
  def proto_files
65
69
  @proto_files ||= begin
66
- files = @api.files
67
- files = files.reject { |f| blacklist_protos.include? f.name }
68
- files = files.reject { |f| f.messages.empty? && f.enums.empty? }
69
- files.map { |f| FilePresenter.new @api, f }
70
+ @api.files
71
+ .select { |f| useful_proto_file? f }
72
+ .map { |f| FilePresenter.new @api, f }
70
73
  end
71
74
  end
72
75
 
73
- def address
74
- name.split("-").map(&:camelize)
75
- end
76
-
77
76
  def name
78
77
  gem_config :name
79
78
  end
@@ -85,6 +84,7 @@ module Gapic
85
84
 
86
85
  def title
87
86
  gem_config(:title) ||
87
+ @api.api_metadata.title ||
88
88
  namespace.split("::").join(" ")
89
89
  end
90
90
 
@@ -117,11 +117,29 @@ module Gapic
117
117
 
118
118
  def description
119
119
  gem_config(:description) ||
120
+ @api.api_metadata.description ||
120
121
  "#{name} is the official client library for the #{title} API."
121
122
  end
122
123
 
124
+ def gemspec_description
125
+ description.gsub(/\s+/, " ").strip
126
+ end
127
+
128
+ ##
129
+ # Generates a description text for README files, accounting for markdown
130
+ # rendering and properly escaping variables.
131
+ #
132
+ # @return [Array<String>] The description text as an array of lines.
133
+ #
134
+ def readme_description
135
+ has_markdown = description.strip.start_with? "#"
136
+ desc = has_markdown ? description.split("\n") : [description.gsub(/\s+/, " ").strip]
137
+ Gapic::FormattingUtils.format_doc_lines @api, desc
138
+ end
139
+
123
140
  def summary
124
141
  gem_config(:summary) ||
142
+ @api.api_metadata.summary ||
125
143
  "API Client library for the #{title} API"
126
144
  end
127
145
 
@@ -143,17 +161,21 @@ module Gapic
143
161
  end
144
162
 
145
163
  def product_documentation_url
146
- gem_config :product_documentation_url
164
+ gem_config(:product_documentation_url) || @api.api_metadata.documentation_url
147
165
  end
148
166
 
149
167
  def api_id
150
- raw_id = gem_config :api_id
168
+ raw_id = gem_config(:api_id) || @api.api_metadata.name
151
169
  return nil unless raw_id
152
170
  raw_id.include?(".") ? raw_id : "#{raw_id}.googleapis.com"
153
171
  end
154
172
 
155
173
  def api_shortname
156
- gem_config :api_shortname
174
+ gem_config(:api_shortname) || @api.api_metadata.short_name
175
+ end
176
+
177
+ def doc_tag_prefix
178
+ @api.api_metadata.doc_tag_prefix || api_shortname || api_id&.split(".")&.first
157
179
  end
158
180
 
159
181
  def issue_tracker_url
@@ -185,8 +207,38 @@ module Gapic
185
207
  ##
186
208
  # @return [Boolean]
187
209
  #
210
+ def rest_numeric_enums?
211
+ gem_config(:rest_numeric_enums) || false
212
+ end
213
+
214
+ ##
215
+ # @return [Boolean] Whether the generation of REST clients is requested
216
+ # and can be done because at least one method has rest bindings.
217
+ #
188
218
  def generate_rest_clients?
189
- @api.generate_rest_clients?
219
+ @api.generate_rest_clients? && packages.any? { |package| !package.first_service_with_rest.nil? }
220
+ end
221
+
222
+ ##
223
+ # @return [Boolean] Whether generation of gRPC clients is requested.
224
+ #
225
+ def generate_grpc_clients?
226
+ @api.generate_grpc_clients?
227
+ end
228
+
229
+ ##
230
+ # @return [:grpc] If gRPC is the default transport
231
+ # @return [:rest] if REST is the default transport
232
+ #
233
+ def default_transport
234
+ @api.default_transport
235
+ end
236
+
237
+ ##
238
+ # @return [String] Pretty name of the default transport
239
+ #
240
+ def default_transport_name
241
+ @api.default_transport == :grpc ? "gRPC" : "REST"
190
242
  end
191
243
 
192
244
  def entrypoint_require
@@ -204,11 +256,15 @@ module Gapic
204
256
 
205
257
  def dependencies
206
258
  @dependencies ||= begin
207
- deps = { "gapic-common" => [">= 0.7", "< 2.a"] }
208
- deps["grpc-google-iam-v1"] = [">= 0.6.10", "< 2.a"] if iam_dependency?
259
+ deps = { "gapic-common" => "~> 1.0" }
260
+ deps["grpc-google-iam-v1"] = "~> 1.11" if iam_dependency?
209
261
  extra_deps = gem_config_dependencies
210
- deps.merge! extra_deps if extra_deps
211
262
  deps.merge! mixins_model.dependencies if mixins_model.mixins?
263
+ # extra deps should be last, overriding mixins or defaults
264
+ deps.merge! extra_deps if extra_deps
265
+ # google-iam-v1 is a superset of grpc-google-iam-v1, so if both are
266
+ # listed, use only google-iam-v1.
267
+ deps.delete "grpc-google-iam-v1" if deps.include? "google-iam-v1"
212
268
  deps
213
269
  end
214
270
  end
@@ -253,14 +309,13 @@ module Gapic
253
309
  end
254
310
 
255
311
  ##
256
- # Whether the "Enabling (gRPC) Logging" section of the readme should
257
- # appear. This is true if there is a quick-start service displayed in the
258
- # readme, AND it uses gRPC.
312
+ # Whether the "Enabling Logging" section of the readme should appear.
313
+ # This is true if there is a quick-start service displayed in the readme.
259
314
  #
260
315
  # @return [Boolean]
261
316
  #
262
- def show_grpc_logging_docs?
263
- packages? && quick_start_service.usable_service_presenter.is_a?(ServicePresenter)
317
+ def show_logging_docs?
318
+ packages? && !quick_start_service.usable_service_presenter.nil?
264
319
  end
265
320
 
266
321
  ##
@@ -293,35 +348,54 @@ module Gapic
293
348
  ##
294
349
  # There is a special case (from PoV of generator parameters)
295
350
  # in gem dependencies where a dependency needs to be an array of strings
296
- # e.g. ">= 1.6", "< 2.a"
351
+ # e.g. `">= 1.6", "< 2.a"``
297
352
  # Rather than creating a special generator param case for this I will special-case it here.
298
- # '|' is the separator.
299
- # The above would be represented as ">= 1.6|< 2.a"
353
+ # Supported separators are `|` and `+`. The latter is preferred.
354
+ # Spaces in the version requirements are optional.
355
+ # The above would be represented as `">=1.6+<2.a"`
300
356
  #
301
357
  # @return [Hash<String, String>, Hash{String=>Array<String>}, nil]
302
358
  def gem_config_dependencies
303
359
  return unless gem_config :extra_dependencies
304
- gem_config(:extra_dependencies).map do |dep_name, dep_versions|
360
+ gem_config(:extra_dependencies).transform_values do |dep_versions|
305
361
  if dep_versions.include? "|"
306
- [dep_name, dep_versions.split("|")]
362
+ dep_versions.split("|").map { |dep_version| check_dep_version dep_version }
363
+ elsif dep_versions.include? "+"
364
+ dep_versions.split("+").map { |dep_version| check_dep_version dep_version }
307
365
  else
308
- [dep_name, dep_versions]
366
+ check_dep_version dep_versions
309
367
  end
310
- end.to_h
368
+ end
369
+ end
370
+
371
+ def check_dep_version dep_version
372
+ match = /([>=<~]+)\s*(\d+(?:\.\w+)+)/.match dep_version
373
+ raise "Bad syntax for extra_dependency: #{dep_version}" unless match
374
+ "#{match[1]} #{match[2]}"
311
375
  end
312
376
 
313
- def blacklist_protos
314
- blacklist = gem_config :blacklist
377
+ def denylist_protos
378
+ denylist = gem_config(:denylist) || gem_config(:blacklist)
315
379
 
316
- return default_blacklist_protos if blacklist.nil?
317
- return default_blacklist_protos if blacklist[:protos].nil?
380
+ return default_denylist_protos if denylist.nil?
381
+ return default_denylist_protos if denylist[:protos].nil?
318
382
 
319
- default_blacklist_protos[:protos]
383
+ default_denylist_protos[:protos]
320
384
  end
321
385
 
322
- def default_blacklist_protos
386
+ def default_denylist_protos
323
387
  ["google/api/http.proto", "google/protobuf/descriptor.proto"]
324
388
  end
389
+
390
+ def mixin_paths
391
+ mixins_model.mixins.map(&:require_str)
392
+ end
393
+
394
+ def useful_proto_file? file
395
+ return false if file.messages.empty? && file.enums.empty?
396
+ return false if denylist_protos.include? file.name
397
+ mixin_paths.none? { |m| file.name.start_with? m }
398
+ end
325
399
  end
326
400
  end
327
401
  end
@@ -26,9 +26,17 @@ module Gapic
26
26
  class MessagePresenter
27
27
  include Gapic::Helpers::NamespaceHelper
28
28
 
29
+ # @return [String] String representation of this presenter type.
30
+ attr_reader :type
31
+
32
+ ##
33
+ # @param api [Gapic::Schema::Api]
34
+ # @param message [Gapic::Schema::Message]
35
+ #
29
36
  def initialize api, message
30
37
  @api = api
31
38
  @message = message
39
+ @type = "message"
32
40
  end
33
41
 
34
42
  def name
@@ -63,6 +71,13 @@ module Gapic
63
71
  @nested_messages ||= @message.nested_messages.map { |m| MessagePresenter.new @api, m }
64
72
  end
65
73
 
74
+ ##
75
+ # @return [Boolean] Whether the message is marked as deprecated.
76
+ #
77
+ def is_deprecated?
78
+ @message.is_deprecated?
79
+ end
80
+
66
81
  protected
67
82
 
68
83
  def message_ruby_type message
@@ -0,0 +1,128 @@
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
+ module Gapic
18
+ module Presenters
19
+ module Method
20
+ ##
21
+ # A presenter for the Http Binding, used to generate code setting up gRPC transcoding
22
+ #
23
+ class HttpBindingPresenter
24
+ extend Forwardable
25
+
26
+ def initialize binding
27
+ @binding = binding
28
+ end
29
+
30
+ ##
31
+ # Performs a limited URI transcoding to create a string that will interpolate
32
+ # the values from the request object to create a request URI at runtime.
33
+ # Currently only supports "value" into "request_object.value"
34
+ # @param [String] request_obj_name the name of the request object for the interpolation
35
+ # defaults to "request_pb"
36
+ # @return [String] A string to interpolate values from the request object into URI
37
+ #
38
+ def uri_for_transcoding
39
+ return path unless routing_params?
40
+
41
+ @binding.routing_params.reduce path do |uri, param|
42
+ param_esc = Regexp.escape param
43
+ uri.gsub(/{#{param_esc}[^}]*}/, "{#{param}}")
44
+ end
45
+ end
46
+
47
+ ##
48
+ # The strings to initialize the `matches` parameter when initializing a
49
+ # grpc transcoder binding. The `matches` parameter is an array of arrays,
50
+ # so every string here is in a ruby array syntax. All strings except for the
51
+ # last one have a comma at the end.
52
+ #
53
+ # @return [Array<String>]
54
+ #
55
+ def routing_params_transcoder_matches_strings
56
+ return [] if routing_params_with_regexes.empty?
57
+ match_init_strings = routing_params_with_regexes.map do |name, regex, preserve_slashes|
58
+ "[\"#{name}\", %r{#{regex}}, #{preserve_slashes}],"
59
+ end
60
+ match_init_strings << match_init_strings.pop.chop # remove the trailing comma for the last element
61
+ match_init_strings
62
+ end
63
+
64
+ ##
65
+ # The strings to initialize the `bindings` parameter when initializing a
66
+ # gapic http binding. The `bindings` parameter is an array of FieldBinding objects,
67
+ # All strings except for the last one have a comma at the end.
68
+ #
69
+ # @return [Array<String>]
70
+ #
71
+ def routing_params_transcoder_field_binding_strings
72
+ return [] if routing_params_with_regexes.empty?
73
+ match_init_strings = routing_params_with_regexes.map do |name, regex, preserve_slashes|
74
+ "Gapic::Rest::GrpcTranscoder::HttpBinding::FieldBinding" \
75
+ ".new(\"#{name}\", %r{#{regex}}, #{preserve_slashes}),"
76
+ end
77
+ match_init_strings << match_init_strings.pop.chop # remove the trailing comma for the last element
78
+ match_init_strings
79
+ end
80
+
81
+ # @!method verb?
82
+ # @return [Boolean]
83
+ # Whether a http verb is present for this binding.
84
+ # @!method verb
85
+ # @return [String]
86
+ # The http verb for this binding.
87
+ # @!method path?
88
+ # @return [Boolean]
89
+ # Whether a binding path is present and non-empty.
90
+ # @!method path
91
+ # @return [String]
92
+ # A binding path or an empty string if not present.
93
+ # @!method routing_params?
94
+ # @return [Boolean]
95
+ # Whether any routing params are present for this bindings.
96
+ # @!method body?
97
+ # @return [Boolean]
98
+ # Whether the binding has a `body` specified.
99
+ # @!method body
100
+ # @return [String]
101
+ # The `body` specified for this binding
102
+ # or an empty string if not specified.
103
+ def_delegators :@binding, :verb?, :verb, :path?, :path, :routing_params?, :body?, :body
104
+
105
+ private
106
+
107
+ ##
108
+ # The segment key names, the regexes for their patterns (including
109
+ # the regexes for `*` patterns implied for the named segments without
110
+ # pattern explicitly specified), and whether the slash `/` symbols in
111
+ # the segment variable should be preserved (as opposed to percent-escaped).
112
+ #
113
+ # These are used to initialize the grpc transcoder `matches` binding parameter.
114
+ #
115
+ # @return [Array<Array<String|Boolean>>]
116
+ #
117
+ def routing_params_with_regexes
118
+ @routing_params_with_regexes ||= begin
119
+ @binding.routing_params_with_patterns.map do |name, pattern|
120
+ path_pattern = PathPattern.parse pattern
121
+ [name, path_pattern.to_field_regex_str, path_pattern.ends_with_double_star_pattern?]
122
+ end
123
+ end
124
+ end
125
+ end
126
+ end
127
+ end
128
+ end
@@ -109,7 +109,7 @@ module Gapic
109
109
  def request_page_token_field
110
110
  # Has a String page_token field which specifies the actual (next) page to retrieve.
111
111
  @request_page_token_field ||= @request.fields.find do |f|
112
- f.name == "page_token" && f.type == Google::Protobuf::FieldDescriptorProto::Type::TYPE_STRING
112
+ f.name == "page_token" && f.type == :TYPE_STRING
113
113
  end
114
114
  end
115
115
 
@@ -125,10 +125,7 @@ module Gapic
125
125
 
126
126
  # Has the int32 page_size or int32 max_results field
127
127
  # which defines the maximum number of paginated resources to return in the response.
128
- page_size_types = [
129
- Google::Protobuf::FieldDescriptorProto::Type::TYPE_UINT32,
130
- Google::Protobuf::FieldDescriptorProto::Type::TYPE_INT32
131
- ]
128
+ page_size_types = [:TYPE_UINT32, :TYPE_INT32]
132
129
 
133
130
  field = @request.fields.find do |f|
134
131
  page_size_names.include?(f.name) && page_size_types.include?(f.type)
@@ -156,7 +153,7 @@ module Gapic
156
153
  def response_next_page_token_field
157
154
  # Has the string next_page_token field to be used in the next request as page_token to retrieve the next page.
158
155
  @response_next_page_token_field ||= @response.fields.find do |f|
159
- f.name == "next_page_token" && f.type == Google::Protobuf::FieldDescriptorProto::Type::TYPE_STRING
156
+ f.name == "next_page_token" && f.type == :TYPE_STRING
160
157
  end
161
158
  end
162
159
 
@@ -169,8 +166,7 @@ module Gapic
169
166
  @response_results_field ||= begin
170
167
  map_fields = @response.fields.find_all(&:map?)
171
168
  repeated_fields = @response.fields.find_all do |f|
172
- !f.map? &&
173
- f.label == Google::Protobuf::FieldDescriptorProto::Label::LABEL_REPEATED
169
+ !f.map? && f.label == :LABEL_REPEATED
174
170
  end
175
171
 
176
172
  if map_fields.count == 1
@@ -187,6 +183,26 @@ module Gapic
187
183
  end
188
184
  end
189
185
 
186
+ # @private
187
+ FIELD_TYPE_MAPPING = {
188
+ TYPE_DOUBLE: "::Float",
189
+ TYPE_FLOAT: "::Float",
190
+ TYPE_INT64: "::Integer",
191
+ TYPE_UINT64: "::Integer",
192
+ TYPE_INT32: "::Integer",
193
+ TYPE_FIXED64: "::Integer",
194
+ TYPE_FIXED32: "::Integer",
195
+ TYPE_BOOL: "::Boolean",
196
+ TYPE_STRING: "::String",
197
+ TYPE_BYTES: "::String",
198
+ TYPE_UINT32: "::Integer",
199
+ TYPE_SFIXED32: "::Integer",
200
+ TYPE_SFIXED64: "::Integer",
201
+ TYPE_SINT32: "::Integer",
202
+ TYPE_SINT64: "::Integer"
203
+ }.freeze
204
+ private_constant :FIELD_TYPE_MAPPING
205
+
190
206
  ##
191
207
  # A helper to get a Ruby doc-type for a paginated element.
192
208
  #
@@ -201,14 +217,7 @@ module Gapic
201
217
  # TODO: handle when arg message is nil and enum is the type
202
218
  message_ruby_type field.enum
203
219
  else
204
- case field.type
205
- when 1, 2 then "::Float"
206
- when 3, 4, 5, 6, 7, 13, 15, 16, 17, 18 then "::Integer"
207
- when 9, 12 then "::String"
208
- when 8 then "::Boolean"
209
- else
210
- "::Object"
211
- end
220
+ FIELD_TYPE_MAPPING[field.type] || "::Object"
212
221
  end
213
222
  end
214
223