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
@@ -30,6 +30,8 @@ module Gapic
30
30
 
31
31
  def initialize api
32
32
  @api = api
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
33
35
  end
34
36
 
35
37
  ##
@@ -46,10 +48,16 @@ module Gapic
46
48
  !packages.empty?
47
49
  end
48
50
 
51
+ ##
52
+ # @return [Enumerable<Gapic::Presenters::ServicePresenter>]
53
+ #
49
54
  def services
50
55
  @services ||= begin
51
56
  files = @api.generate_files
52
- 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 }
53
61
  end
54
62
  end
55
63
 
@@ -59,17 +67,12 @@ module Gapic
59
67
 
60
68
  def proto_files
61
69
  @proto_files ||= begin
62
- files = @api.files
63
- files = files.reject { |f| blacklist_protos.include? f.name }
64
- files = files.reject { |f| f.messages.empty? && f.enums.empty? }
65
- files.map { |f| FilePresenter.new @api, f }
70
+ @api.files
71
+ .select { |f| useful_proto_file? f }
72
+ .map { |f| FilePresenter.new @api, f }
66
73
  end
67
74
  end
68
75
 
69
- def address
70
- name.split("-").map(&:camelize)
71
- end
72
-
73
76
  def name
74
77
  gem_config :name
75
78
  end
@@ -81,6 +84,7 @@ module Gapic
81
84
 
82
85
  def title
83
86
  gem_config(:title) ||
87
+ @api.api_metadata.title ||
84
88
  namespace.split("::").join(" ")
85
89
  end
86
90
 
@@ -113,11 +117,29 @@ module Gapic
113
117
 
114
118
  def description
115
119
  gem_config(:description) ||
120
+ @api.api_metadata.description ||
116
121
  "#{name} is the official client library for the #{title} API."
117
122
  end
118
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
+
119
140
  def summary
120
141
  gem_config(:summary) ||
142
+ @api.api_metadata.summary ||
121
143
  "API Client library for the #{title} API"
122
144
  end
123
145
 
@@ -135,21 +157,25 @@ module Gapic
135
157
  end
136
158
 
137
159
  def library_documentation_url
138
- gem_config(:library_documentation_url) || "https://googleapis.dev/ruby/#{name}/latest"
160
+ gem_config(:library_documentation_url) || "https://rubydoc.info/gems/#{name}"
139
161
  end
140
162
 
141
163
  def product_documentation_url
142
- gem_config :product_documentation_url
164
+ gem_config(:product_documentation_url) || @api.api_metadata.documentation_url
143
165
  end
144
166
 
145
167
  def api_id
146
- raw_id = gem_config :api_id
168
+ raw_id = gem_config(:api_id) || @api.api_metadata.name
147
169
  return nil unless raw_id
148
170
  raw_id.include?(".") ? raw_id : "#{raw_id}.googleapis.com"
149
171
  end
150
172
 
151
173
  def api_shortname
152
- 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
153
179
  end
154
180
 
155
181
  def issue_tracker_url
@@ -178,7 +204,45 @@ module Gapic
178
204
  gem_config(:generic_endpoint) || false
179
205
  end
180
206
 
207
+ ##
208
+ # @return [Boolean]
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
+ #
218
+ def 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"
242
+ end
243
+
181
244
  def entrypoint_require
245
+ return "" unless packages?
182
246
  packages.first.package_require
183
247
  end
184
248
 
@@ -192,10 +256,15 @@ module Gapic
192
256
 
193
257
  def dependencies
194
258
  @dependencies ||= begin
195
- deps = { "gapic-common" => [">= 0.7", "< 2.a"] }
196
- 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?
197
261
  extra_deps = gem_config_dependencies
262
+ deps.merge! mixins_model.dependencies if mixins_model.mixins?
263
+ # extra deps should be last, overriding mixins or defaults
198
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"
199
268
  deps
200
269
  end
201
270
  end
@@ -215,7 +284,7 @@ module Gapic
215
284
  # @return [Hash]
216
285
  def first_package_drift_manifest
217
286
  return {} unless packages?
218
- packages[0].drift_manifest
287
+ packages.first.drift_manifest
219
288
  end
220
289
 
221
290
  ##
@@ -240,14 +309,32 @@ module Gapic
240
309
  end
241
310
 
242
311
  ##
243
- # Whether the "Enabling (gRPC) Logging" section of the readme should
244
- # appear. This is true if there is a quick-start service displayed in the
245
- # 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.
314
+ #
315
+ # @return [Boolean]
316
+ #
317
+ def show_logging_docs?
318
+ packages? && !quick_start_service.usable_service_presenter.nil?
319
+ end
320
+
321
+ ##
322
+ # Whether there are mixin services that should be referenced
323
+ # in the services for this gem
246
324
  #
247
325
  # @return [Boolean]
248
326
  #
249
- def show_grpc_logging_docs?
250
- packages? && quick_start_service.usable_service_presenter.is_a?(ServicePresenter)
327
+ def mixins?
328
+ @mixins_model.mixins?
329
+ end
330
+
331
+ ##
332
+ # The model for the mixin services
333
+ #
334
+ # @return [Gapic::Model::Mixins]
335
+ #
336
+ def mixins_model
337
+ @mixins_model
251
338
  end
252
339
 
253
340
  private
@@ -261,35 +348,54 @@ module Gapic
261
348
  ##
262
349
  # There is a special case (from PoV of generator parameters)
263
350
  # in gem dependencies where a dependency needs to be an array of strings
264
- # e.g. ">= 1.6", "< 2.a"
351
+ # e.g. `">= 1.6", "< 2.a"``
265
352
  # Rather than creating a special generator param case for this I will special-case it here.
266
- # '|' is the separator.
267
- # 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"`
268
356
  #
269
357
  # @return [Hash<String, String>, Hash{String=>Array<String>}, nil]
270
358
  def gem_config_dependencies
271
359
  return unless gem_config :extra_dependencies
272
- gem_config(:extra_dependencies).map do |dep_name, dep_versions|
360
+ gem_config(:extra_dependencies).transform_values do |dep_versions|
273
361
  if dep_versions.include? "|"
274
- [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 }
275
365
  else
276
- [dep_name, dep_versions]
366
+ check_dep_version dep_versions
277
367
  end
278
- end.to_h
368
+ end
279
369
  end
280
370
 
281
- def blacklist_protos
282
- blacklist = gem_config :blacklist
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]}"
375
+ end
376
+
377
+ def denylist_protos
378
+ denylist = gem_config(:denylist) || gem_config(:blacklist)
283
379
 
284
- return default_blacklist_protos if blacklist.nil?
285
- 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?
286
382
 
287
- default_blacklist_protos[:protos]
383
+ default_denylist_protos[:protos]
288
384
  end
289
385
 
290
- def default_blacklist_protos
386
+ def default_denylist_protos
291
387
  ["google/api/http.proto", "google/protobuf/descriptor.proto"]
292
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
293
399
  end
294
400
  end
295
401
  end
@@ -19,7 +19,7 @@ module Gapic
19
19
  ##
20
20
  # A presenter for grpc service config.
21
21
  #
22
- class ServiceConfigPresenter
22
+ class GrpcServiceConfigPresenter
23
23
  def initialize grpc_service_config
24
24
  @grpc_service_config = grpc_service_config
25
25
  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