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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +299 -0
- data/CONTRIBUTING.md +1 -1
- data/README.md +71 -37
- data/bin/protoc-gen-ruby_gapic +2 -2
- data/lib/gapic/file_formatter.rb +23 -19
- data/lib/gapic/formatting_utils.rb +22 -9
- data/lib/gapic/gem_builder.rb +15 -17
- data/lib/gapic/generator/version.rb +1 -1
- data/lib/gapic/generators/base_generator.rb +6 -4
- data/lib/gapic/generators/default_generator.rb +70 -34
- data/lib/gapic/generators/default_generator_parameters.rb +9 -3
- data/lib/gapic/grpc_service_config/parser.rb +2 -2
- data/lib/gapic/model/api_metadata.rb +173 -0
- data/lib/gapic/model/method/http_annotation.rb +158 -60
- data/lib/gapic/model/method/lro.rb +8 -5
- data/lib/gapic/model/method/routing.rb +3 -18
- data/lib/gapic/model/mixins.rb +76 -10
- data/lib/gapic/model/service/nonstandard_lro_provider.rb +10 -11
- data/lib/gapic/package_snippets.rb +159 -0
- data/lib/gapic/path_pattern/parser.rb +11 -2
- data/lib/gapic/path_pattern/pattern.rb +18 -1
- data/lib/gapic/path_pattern/segment.rb +11 -4
- data/lib/gapic/presenters/enum_presenter.rb +14 -0
- data/lib/gapic/presenters/enum_value_presenter.rb +4 -1
- data/lib/gapic/presenters/field_presenter.rb +78 -21
- data/lib/gapic/presenters/gem_presenter.rb +109 -35
- data/lib/gapic/presenters/message_presenter.rb +15 -0
- data/lib/gapic/presenters/method/http_binding_presenter.rb +128 -0
- data/lib/gapic/presenters/method/rest_pagination_info.rb +25 -16
- data/lib/gapic/presenters/method_presenter.rb +109 -35
- data/lib/gapic/presenters/method_rest_presenter.rb +70 -137
- data/lib/gapic/presenters/package_presenter.rb +63 -18
- data/lib/gapic/presenters/resource_presenter.rb +9 -3
- data/lib/gapic/presenters/service/lro_client_presenter.rb +14 -14
- data/lib/gapic/presenters/service/mixin_client_presenter.rb +89 -0
- data/lib/gapic/presenters/service/sub_client_presenter.rb +84 -0
- data/lib/gapic/presenters/service_presenter.rb +183 -31
- data/lib/gapic/presenters/service_rest_presenter.rb +180 -27
- data/lib/gapic/presenters/snippet/client_call_presenter.rb +82 -0
- data/lib/gapic/presenters/snippet/client_initialization_presenter.rb +87 -0
- data/lib/gapic/presenters/snippet/declaration_presenter.rb +91 -0
- data/lib/gapic/presenters/snippet/expression_presenter.rb +135 -0
- data/lib/gapic/presenters/snippet/iteration_presenter.rb +118 -0
- data/lib/gapic/presenters/snippet/parameter_presenter.rb +67 -0
- data/lib/gapic/presenters/snippet/request_initialization_presenters.rb +202 -0
- data/lib/gapic/presenters/snippet/response_handling_presenters.rb +329 -0
- data/lib/gapic/presenters/snippet/statement_presenter.rb +134 -0
- data/lib/gapic/presenters/snippet/type_presenter.rb +98 -0
- data/lib/gapic/presenters/snippet_presenter.rb +199 -10
- data/lib/gapic/presenters.rb +2 -0
- data/lib/gapic/runner.rb +1 -1
- data/lib/gapic/schema/api.rb +49 -3
- data/lib/gapic/schema/loader.rb +67 -22
- data/lib/gapic/schema/parameter_schema.rb +8 -8
- data/lib/gapic/schema/proto_tools.rb +193 -0
- data/lib/gapic/schema/request_param_parser.rb +5 -7
- data/lib/gapic/schema/service_config_parser.rb +38 -4
- data/lib/gapic/schema/wrappers.rb +192 -31
- data/lib/gapic/uri_template/parser.rb +15 -7
- data/lib/google/cloud/tools/snippetgen/configlanguage/v1/snippet_config_language_pb.rb +104 -0
- data/lib/google/cloud/tools/snippetgen/snippetindex/v1/snippet_index_pb.rb +58 -0
- data/lib/google/protobuf/compiler/plugin_pb.rb +47 -0
- data/templates/default/binding_override.text.erb +6 -0
- data/templates/default/gem/gemfile.text.erb +12 -0
- data/templates/default/gem/{gemspec.erb → gemspec.text.erb} +3 -11
- data/templates/default/gem/{readme.erb → readme.text.erb} +10 -6
- data/templates/default/gem/{rubocop.erb → rubocop.text.erb} +3 -0
- data/templates/default/gem/{test_helper.erb → test_helper.text.erb} +4 -2
- data/templates/default/gem/toys.text.erb +12 -0
- data/templates/default/helpers/default_helper.rb +33 -1
- data/templates/default/lib/_binding_override.text.erb +49 -0
- data/templates/default/lib/{_package.erb → _package.text.erb} +6 -9
- data/templates/default/lib/_package_rest.text.erb +24 -0
- data/templates/default/lib/{_service.erb → _service.text.erb} +11 -23
- data/templates/default/lib/package/_self_configure.text.erb +16 -0
- data/templates/default/lib/package/_self_configure_defaults.text.erb +13 -0
- data/templates/default/lib/package/self_configure/_binding_default.text.erb +15 -0
- data/templates/default/lib/rest/_rest.text.erb +46 -0
- data/templates/default/package_rest.text.erb +6 -0
- data/templates/default/proto_docs/_deprecated.text.erb +9 -0
- data/templates/default/proto_docs/{_enum.erb → _enum.text.erb} +1 -0
- data/templates/default/proto_docs/{_message.erb → _message.text.erb} +2 -0
- data/templates/default/service/client/{_client.erb → _client.text.erb} +60 -12
- data/templates/default/service/client/{_config.erb → _config.text.erb} +39 -8
- data/templates/default/service/client/{_operations.erb → _operations.text.erb} +24 -3
- data/templates/default/service/client/method/{_def.erb → _def.text.erb} +2 -2
- data/templates/default/service/client/method/def/{_options_defaults.erb → _options_defaults.text.erb} +2 -1
- data/templates/default/service/client/method/def/_request_normal.text.erb +18 -0
- data/templates/default/service/client/method/def/_request_streaming.text.erb +23 -0
- data/templates/default/service/client/method/def/{_response.erb → _response.text.erb} +2 -0
- data/templates/default/service/client/method/def/{_response_nonstandard_lro.erb → _response_nonstandard_lro.text.erb} +1 -1
- data/templates/default/service/client/method/def/_response_normal.text.erb +4 -0
- data/templates/default/service/client/method/def/{_response_normal.erb → _response_normal_lro.text.erb} +1 -3
- data/templates/default/service/client/method/def/{_response_paged.erb → _response_paged.text.erb} +1 -1
- data/templates/default/service/client/method/docs/{_request_normal.erb → _request_normal.text.erb} +1 -1
- data/templates/default/service/client/method/docs/_snippets.text.erb +6 -0
- data/templates/default/service/client/resource/_def.text.erb +7 -0
- data/templates/default/service/nonstandard_lro.text.erb +6 -0
- data/templates/default/service/rest/client/{_client.erb → _client.text.erb} +82 -13
- data/templates/default/service/rest/client/_config.text.erb +178 -0
- data/templates/default/service/rest/client/_operations.text.erb +124 -0
- data/templates/default/service/rest/client/method/{_def.erb → _def.text.erb} +7 -1
- data/templates/default/service/rest/client/method/def/{_options_defaults.erb → _options_defaults.text.erb} +8 -3
- data/templates/default/service/rest/client/method/def/{_response.erb → _response.text.erb} +4 -0
- data/templates/default/service/rest/client/method/def/{_response_nonstandard_lro.erb → _response_nonstandard_lro.text.erb} +5 -4
- data/templates/default/service/rest/client/method/def/_response_normal.text.erb +5 -0
- data/templates/default/service/rest/client/method/def/_response_normal_lro.text.erb +7 -0
- data/templates/default/service/rest/client/method/def/_response_paged.text.erb +7 -0
- data/templates/default/service/rest/client/method/def/_response_server_streaming.text.erb +11 -0
- data/templates/default/service/rest/client/method/docs/{_request.erb → _request.text.erb} +1 -3
- data/templates/default/service/rest/client/method/docs/_result.text.erb +10 -0
- data/templates/default/service/rest/client/method/docs/_snippets.text.erb +6 -0
- data/templates/default/service/{nonstandard_lro.erb → rest/nonstandard_lro.text.erb} +1 -1
- data/templates/default/service/rest/operations.text.erb +6 -0
- data/templates/default/service/rest/service_stub/_service_stub.text.erb +63 -0
- data/templates/default/service/rest/service_stub/grpc_transcoding_method/_def.text.erb +37 -0
- data/templates/default/service/rest/service_stub/method/_def.text.erb +35 -0
- data/templates/default/service/rest/service_stub/method/def/_response.text.erb +37 -0
- data/templates/default/service/rest/test/{client.erb → client.text.erb} +3 -3
- data/templates/default/service/rest/test/method/_assert_response.text.erb +2 -0
- data/templates/default/service/rest/test/method/{_configure.erb → _configure.text.erb} +3 -2
- data/templates/default/service/rest/test/method/_normal.text.erb +60 -0
- data/templates/default/service/rest/test/method/_server.text.erb +60 -0
- data/templates/default/service/rest/test/method/{_setup.erb → _setup.text.erb} +26 -10
- data/templates/default/service/test/{_resource.erb → _resource.text.erb} +1 -1
- data/templates/default/service/test/{client.erb → client.text.erb} +3 -2
- data/templates/default/service/test/client_paths.text.erb +33 -0
- data/templates/default/service/test/method/{_bidi.erb → _bidi.text.erb} +1 -1
- data/templates/default/service/test/method/{_client.erb → _client.text.erb} +1 -1
- data/templates/default/service/test/method/{_configure.erb → _configure.text.erb} +2 -1
- data/templates/default/service/test/method/{_normal.erb → _normal.text.erb} +1 -1
- data/templates/default/service/test/method/{_server.erb → _server.text.erb} +1 -1
- data/templates/default/service/test/method/{_setup.erb → _setup.text.erb} +19 -2
- data/templates/default/snippets/{gemfile.erb → gemfile.text.erb} +2 -2
- data/templates/default/snippets/snippet/_body.text.erb +24 -0
- data/templates/default/snippets/snippet/_inline.text.erb +11 -0
- data/templates/default/snippets/snippet/_standalone.text.erb +25 -0
- data/templates/default/snippets/{standalone.erb → standalone.text.erb} +1 -1
- metadata +198 -273
- data/lib/google/api/annotations.pb.rb +0 -39
- data/lib/google/api/auth.pb.rb +0 -75
- data/lib/google/api/backend.pb.rb +0 -59
- data/lib/google/api/billing.pb.rb +0 -53
- data/lib/google/api/client.pb.rb +0 -43
- data/lib/google/api/context.pb.rb +0 -47
- data/lib/google/api/control.pb.rb +0 -38
- data/lib/google/api/documentation.pb.rb +0 -56
- data/lib/google/api/endpoint.pb.rb +0 -42
- data/lib/google/api/field_behavior.pb.rb +0 -51
- data/lib/google/api/http.pb.rb +0 -60
- data/lib/google/api/label.pb.rb +0 -49
- data/lib/google/api/launch_stage.pb.rb +0 -37
- data/lib/google/api/log.pb.rb +0 -47
- data/lib/google/api/logging.pb.rb +0 -48
- data/lib/google/api/metric.pb.rb +0 -90
- data/lib/google/api/monitored_resource.pb.rb +0 -68
- data/lib/google/api/monitoring.pb.rb +0 -48
- data/lib/google/api/quota.pb.rb +0 -63
- data/lib/google/api/resource.pb.rb +0 -80
- data/lib/google/api/routing.pb.rb +0 -58
- data/lib/google/api/service.pb.rb +0 -90
- data/lib/google/api/source_info.pb.rb +0 -44
- data/lib/google/api/system_parameter.pb.rb +0 -51
- data/lib/google/api/usage.pb.rb +0 -47
- data/lib/google/cloud/extended_operations.pb.rb +0 -57
- data/lib/google/longrunning/operations.pb.rb +0 -115
- data/lib/google/protobuf/any.pb.rb +0 -40
- data/lib/google/protobuf/api.pb.rb +0 -69
- data/lib/google/protobuf/compiler/plugin.pb.rb +0 -79
- data/lib/google/protobuf/descriptor.pb.rb +0 -360
- data/lib/google/protobuf/duration.pb.rb +0 -41
- data/lib/google/protobuf/empty.pb.rb +0 -36
- data/lib/google/protobuf/source_context.pb.rb +0 -39
- data/lib/google/protobuf/struct.pb.rb +0 -65
- data/lib/google/protobuf/type.pb.rb +0 -128
- data/lib/google/protobuf/wrappers.pb.rb +0 -80
- data/lib/google/rpc/status.pb.rb +0 -46
- data/templates/default/gem/gemfile.erb +0 -4
- data/templates/default/lib/rest/_rest.erb +0 -9
- data/templates/default/service/client/method/def/_request_normal.erb +0 -4
- data/templates/default/service/client/method/def/_request_streaming.erb +0 -9
- data/templates/default/service/client/method/docs/_deprecated.erb +0 -5
- data/templates/default/service/client/method/docs/_snippets.erb +0 -6
- data/templates/default/service/client/resource/_def.erb +0 -6
- data/templates/default/service/rest/client/_config.erb +0 -122
- data/templates/default/service/rest/client/method/def/_response_normal.erb +0 -6
- data/templates/default/service/rest/client/method/def/_response_paged.erb +0 -7
- data/templates/default/service/rest/client/method/docs/_result.erb +0 -6
- data/templates/default/service/rest/service_stub/_service_stub.erb +0 -25
- data/templates/default/service/rest/service_stub/grpc_transcoding_method/_def.erb +0 -24
- data/templates/default/service/rest/service_stub/method/_def.erb +0 -20
- data/templates/default/service/rest/service_stub/method/def/_response.erb +0 -17
- data/templates/default/service/rest/test/method/_assert_response.erb +0 -2
- data/templates/default/service/rest/test/method/_normal.erb +0 -71
- data/templates/default/service/test/client_paths.erb +0 -15
- data/templates/default/snippets/snippet/_structure.erb +0 -71
- /data/gem_templates/{binary.erb → binary.text.erb} +0 -0
- /data/gem_templates/{dockerfile.erb → dockerfile.text.erb} +0 -0
- /data/gem_templates/{entrypoint.erb → entrypoint.text.erb} +0 -0
- /data/gem_templates/{gapic_sh.erb → gapic_sh.text.erb} +0 -0
- /data/gem_templates/{gemfile.erb → gemfile.text.erb} +0 -0
- /data/gem_templates/{gemspec.erb → gemspec.text.erb} +0 -0
- /data/gem_templates/{generator.erb → generator.text.erb} +0 -0
- /data/gem_templates/{gitignore.erb → gitignore.text.erb} +0 -0
- /data/gem_templates/{rakefile.erb → rakefile.text.erb} +0 -0
- /data/gem_templates/{readme.erb → readme.text.erb} +0 -0
- /data/gem_templates/{rubocop.erb → rubocop.text.erb} +0 -0
- /data/gem_templates/shared/{_header.erb → _header.text.erb} +0 -0
- /data/gem_templates/shared/{_license.erb → _license.text.erb} +0 -0
- /data/gem_templates/shared/{_warning.erb → _warning.text.erb} +0 -0
- /data/gem_templates/{test_generator.erb → test_generator.text.erb} +0 -0
- /data/gem_templates/{test_helper.erb → test_helper.text.erb} +0 -0
- /data/gem_templates/{version.erb → version.text.erb} +0 -0
- /data/templates/default/gem/{_version.erb → _version.text.erb} +0 -0
- /data/templates/default/gem/{changelog.erb → changelog.text.erb} +0 -0
- /data/templates/default/gem/{entrypoint.erb → entrypoint.text.erb} +0 -0
- /data/templates/default/gem/{gapic_metadata_json.erb → gapic_metadata_json.text.erb} +0 -0
- /data/templates/default/gem/{gitignore.erb → gitignore.text.erb} +0 -0
- /data/templates/default/gem/{license.erb → license.text.erb} +0 -0
- /data/templates/default/gem/{rakefile.erb → rakefile.text.erb} +0 -0
- /data/templates/default/gem/{version.erb → version.text.erb} +0 -0
- /data/templates/default/gem/{yardopts.erb → yardopts.text.erb} +0 -0
- /data/templates/default/layouts/{_ruby.erb → _ruby.text.erb} +0 -0
- /data/templates/default/{package.erb → package.text.erb} +0 -0
- /data/templates/default/proto_docs/{_proto_file.erb → _proto_file.text.erb} +0 -0
- /data/templates/default/proto_docs/{proto_file.erb → proto_file.text.erb} +0 -0
- /data/templates/default/proto_docs/{readme.erb → readme.text.erb} +0 -0
- /data/templates/default/service/{_helpers.erb → _helpers.text.erb} +0 -0
- /data/templates/default/service/client/{_credentials.erb → _credentials.text.erb} +0 -0
- /data/templates/default/service/client/{_nonstandard_lro.erb → _nonstandard_lro.text.erb} +0 -0
- /data/templates/default/service/client/{_paths.erb → _paths.text.erb} +0 -0
- /data/templates/default/service/client/{_requires.erb → _requires.text.erb} +0 -0
- /data/templates/default/service/client/{_resource.erb → _resource.text.erb} +0 -0
- /data/templates/default/service/client/{_self_configure.erb → _self_configure.text.erb} +0 -0
- /data/templates/default/service/client/{_self_configure_defaults.erb → _self_configure_defaults.text.erb} +0 -0
- /data/templates/default/service/client/method/def/{_request.erb → _request.text.erb} +0 -0
- /data/templates/default/service/client/method/def/{_rescue.erb → _rescue.text.erb} +0 -0
- /data/templates/default/service/client/method/def/{_routing_params.erb → _routing_params.text.erb} +0 -0
- /data/templates/default/service/client/method/docs/{_error.erb → _error.text.erb} +0 -0
- /data/templates/default/service/client/method/docs/{_request.erb → _request.text.erb} +0 -0
- /data/templates/default/service/client/method/docs/{_request_field.erb → _request_field.text.erb} +0 -0
- /data/templates/default/service/client/method/docs/{_request_streaming.erb → _request_streaming.text.erb} +0 -0
- /data/templates/default/service/client/method/docs/{_response.erb → _response.text.erb} +0 -0
- /data/templates/default/service/client/method/docs/{_sample.erb → _sample.text.erb} +0 -0
- /data/templates/default/service/client/method/docs/{_sample_response.erb → _sample_response.text.erb} +0 -0
- /data/templates/default/service/client/method/docs/{_samples.erb → _samples.text.erb} +0 -0
- /data/templates/default/service/client/method/docs/request_field/{_arg.erb → _arg.text.erb} +0 -0
- /data/templates/default/service/client/method/docs/request_field/{_hash.erb → _hash.text.erb} +0 -0
- /data/templates/default/service/client/method/docs/sample_response/{_comment.erb → _comment.text.erb} +0 -0
- /data/templates/default/service/client/method/docs/sample_response/{_define.erb → _define.text.erb} +0 -0
- /data/templates/default/service/client/method/docs/sample_response/{_loop.erb → _loop.text.erb} +0 -0
- /data/templates/default/service/client/method/docs/sample_response/{_print.erb → _print.text.erb} +0 -0
- /data/templates/default/service/client/method/docs/sample_response/{_write_file.erb → _write_file.text.erb} +0 -0
- /data/templates/default/service/client/resource/{_doc.erb → _doc.text.erb} +0 -0
- /data/templates/default/service/client/resource/{_multi.erb → _multi.text.erb} +0 -0
- /data/templates/default/service/client/resource/{_single.erb → _single.text.erb} +0 -0
- /data/templates/default/service/{client.erb → client.text.erb} +0 -0
- /data/templates/default/service/{credentials.erb → credentials.text.erb} +0 -0
- /data/templates/default/service/{operations.erb → operations.text.erb} +0 -0
- /data/templates/default/service/{paths.erb → paths.text.erb} +0 -0
- /data/templates/default/service/rest/client/method/def/{_rescue.erb → _rescue.text.erb} +0 -0
- /data/templates/default/service/rest/client/method/docs/{_error.erb → _error.text.erb} +0 -0
- /data/templates/default/service/rest/{client.erb → client.text.erb} +0 -0
- /data/templates/default/service/rest/{grpc_transcoding.erb → grpc_transcoding.text.erb} +0 -0
- /data/templates/default/service/rest/service_stub/grpc_transcoding_method/def/{_query_string_param.erb → _query_string_param.text.erb} +0 -0
- /data/templates/default/service/rest/service_stub/method/def/{_request.erb → _request.text.erb} +0 -0
- /data/templates/default/service/rest/{service_stub.erb → service_stub.text.erb} +0 -0
- /data/templates/default/service/{rest.erb → rest.text.erb} +0 -0
- /data/templates/default/service/test/{client_operations.erb → client_operations.text.erb} +0 -0
- /data/templates/default/service/test/method/{_assert_response.erb → _assert_response.text.erb} +0 -0
- /data/templates/default/service/test/{smoke.erb → smoke.text.erb} +0 -0
- /data/templates/default/{service.erb → service.text.erb} +0 -0
- /data/templates/default/shared/{_header.erb → _header.text.erb} +0 -0
- /data/templates/default/shared/{_license.erb → _license.text.erb} +0 -0
- /data/templates/default/shared/{_warning.erb → _warning.text.erb} +0 -0
@@ -16,7 +16,7 @@
|
|
16
16
|
|
17
17
|
require "gapic/file_formatter"
|
18
18
|
require "action_controller"
|
19
|
-
require "google/protobuf/compiler/
|
19
|
+
require "google/protobuf/compiler/plugin_pb"
|
20
20
|
require "tempfile"
|
21
21
|
|
22
22
|
module Gapic
|
@@ -46,8 +46,10 @@ module Gapic
|
|
46
46
|
template_path = File.expand_path template_path
|
47
47
|
helpers_path = File.join template_path, "helpers"
|
48
48
|
|
49
|
-
#
|
50
|
-
ActiveSupport::Dependencies.autoload_paths.prepend helpers_path
|
49
|
+
# For some reason autoload doesn't seem to be working for helpers in Rails 8:
|
50
|
+
# ActiveSupport::Dependencies.autoload_paths.prepend helpers_path
|
51
|
+
# So instead we eagerly load helpers
|
52
|
+
Dir.glob("#{helpers_path}/*_helper.rb") { |file| require file }
|
51
53
|
|
52
54
|
# Configure the controller to know about the templates and helpers
|
53
55
|
controller.prepend_view_path template_path
|
@@ -66,7 +68,7 @@ module Gapic
|
|
66
68
|
template: template, formats: :text, locals: args
|
67
69
|
)
|
68
70
|
Google::Protobuf::Compiler::CodeGeneratorResponse::File.new(
|
69
|
-
name: filename, content: content
|
71
|
+
name: filename, content: String.new(content)
|
70
72
|
)
|
71
73
|
end
|
72
74
|
alias_method :g, :generate_file
|
@@ -17,6 +17,7 @@
|
|
17
17
|
require "gapic/generators/base_generator"
|
18
18
|
require "gapic/generators/default_generator_parameters"
|
19
19
|
require "gapic/presenters"
|
20
|
+
require "gapic/package_snippets"
|
20
21
|
|
21
22
|
module Gapic
|
22
23
|
module Generators
|
@@ -47,57 +48,92 @@ module Gapic
|
|
47
48
|
|
48
49
|
gem = gem_presenter || Gapic::Presenters.gem_presenter(@api)
|
49
50
|
|
51
|
+
if @api.generate_rest_clients? && gem.packages.find(&:generate_rest_clients?).nil?
|
52
|
+
raise "Rest transport specified but no services have HTTP bindings"
|
53
|
+
end
|
54
|
+
|
50
55
|
gem.packages.each do |package|
|
56
|
+
package_snippets = PackageSnippets.new snippet_dir: "snippets",
|
57
|
+
proto_package: package.name,
|
58
|
+
gem_name: gem.name
|
59
|
+
|
51
60
|
# Package level files
|
52
|
-
files << g("package
|
61
|
+
files << g("package", "lib/#{package.package_file_path}", package: package)
|
62
|
+
files << g("package_rest", "lib/#{package.package_rest_file_path}", package: package) if package.generate_rest_clients?
|
63
|
+
files << g("binding_override", "lib/#{package.mixin_binding_overrides_file_path}", package: package) if package.mixin_binding_overrides? && package.generate_rest_clients?
|
53
64
|
|
54
65
|
package.services.each do |service|
|
66
|
+
should_generate_grpc = service.generate_grpc_clients?
|
67
|
+
should_generate_rest = service.generate_rest_clients?
|
68
|
+
|
55
69
|
# Service level files
|
56
|
-
files << g("service
|
57
|
-
files << g("service/
|
58
|
-
files << g("service/
|
59
|
-
|
60
|
-
|
61
|
-
files << g("service/
|
62
|
-
|
63
|
-
|
64
|
-
files << g("service/
|
65
|
-
files << g("service/rest/
|
66
|
-
|
67
|
-
|
68
|
-
files << g("service/
|
69
|
-
files << g("service/
|
70
|
+
files << g("service", "lib/#{service.service_file_path}", service: service)
|
71
|
+
files << g("service/credentials", "lib/#{service.credentials_file_path}", service: service) unless gem.generic_endpoint?
|
72
|
+
files << g("service/paths", "lib/#{service.paths_file_path}", service: service) if service.paths?
|
73
|
+
|
74
|
+
# Rest module file
|
75
|
+
files << g("service/rest", "lib/#{service.rest.service_rest_file_path}", service: service) if should_generate_rest
|
76
|
+
|
77
|
+
# client.rb
|
78
|
+
files << g("service/client", "lib/#{service.client_file_path}", service: service) if should_generate_grpc
|
79
|
+
files << g("service/rest/client", "lib/#{service.rest.client_file_path}", service: service) if should_generate_rest
|
80
|
+
|
81
|
+
# Standard LRO shim
|
82
|
+
files << g("service/operations", "lib/#{service.operations_file_path}", service: service) if service.lro? && should_generate_grpc
|
83
|
+
files << g("service/rest/operations", "lib/#{service.rest.operations_file_path}", service: service) if service.rest.lro? && should_generate_rest
|
84
|
+
|
85
|
+
# Nonstandard LRO shim
|
86
|
+
files << g("service/nonstandard_lro", "lib/#{service.nonstandard_lro_file_path}", service: service) if service.nonstandard_lro_provider? && should_generate_grpc
|
87
|
+
files << g("service/rest/nonstandard_lro", "lib/#{service.rest.nonstandard_lro_file_path}", service: service) if service.rest.nonstandard_lro_provider? && should_generate_rest
|
88
|
+
|
89
|
+
# Rest-only `service.stub` file
|
90
|
+
files << g("service/rest/service_stub", "lib/#{service.rest.service_stub_file_path}", service: service) if should_generate_rest
|
91
|
+
|
92
|
+
# Unit tests for `client.rb`
|
93
|
+
files << g("service/test/client", "test/#{service.test_client_file_path}", service: service) if should_generate_grpc
|
94
|
+
files << g("service/rest/test/client", "test/#{service.rest.test_client_file_path}", service: service) if should_generate_rest
|
95
|
+
|
96
|
+
# Unit tests for `paths.rb`
|
97
|
+
files << g("service/test/client_paths", "test/#{service.test_paths_file_path}", service: service) if service.paths? && should_generate_grpc
|
98
|
+
|
99
|
+
# Unit tests for standard LRO shim
|
100
|
+
files << g("service/test/client_operations", "test/#{service.test_client_operations_file_path}", service: service) if service.lro? && should_generate_grpc
|
70
101
|
|
71
102
|
if @api.generate_standalone_snippets?
|
72
103
|
service.methods.each do |method|
|
73
|
-
|
74
|
-
|
104
|
+
method.all_snippets.each do |snippet|
|
105
|
+
snippet_file = g("snippets/standalone", "snippets/#{snippet.snippet_file_path}", snippet: snippet)
|
106
|
+
package_snippets.add(method_presenter: method, snippet_presenter: snippet, snippet_file: snippet_file)
|
107
|
+
end
|
75
108
|
end
|
76
109
|
end
|
77
110
|
end
|
111
|
+
|
112
|
+
files += package_snippets.files if @api.generate_standalone_snippets?
|
78
113
|
end
|
79
114
|
|
80
115
|
# Gem level files
|
81
|
-
files << g("gem/gitignore
|
82
|
-
files << g("gem/version
|
83
|
-
files << g("gem/test_helper
|
84
|
-
files << g("gem/gemspec
|
85
|
-
files << g("gem/gemfile
|
86
|
-
files << g("gem/rakefile
|
87
|
-
files << g("gem/readme
|
88
|
-
files << g("gem/changelog
|
89
|
-
files << g("gem/rubocop
|
90
|
-
files << g("gem/
|
91
|
-
files << g("gem/
|
92
|
-
files << g("gem/
|
93
|
-
files << g("gem/
|
94
|
-
|
95
|
-
|
116
|
+
files << g("gem/gitignore", ".gitignore", gem: gem)
|
117
|
+
files << g("gem/version", "lib/#{gem.version_file_path}", gem: gem)
|
118
|
+
files << g("gem/test_helper", "test/helper.rb", gem: gem)
|
119
|
+
files << g("gem/gemspec", "#{gem.name}.gemspec", gem: gem)
|
120
|
+
files << g("gem/gemfile", "Gemfile", gem: gem)
|
121
|
+
files << g("gem/rakefile", "Rakefile", gem: gem)
|
122
|
+
files << g("gem/readme", "README.md", gem: gem)
|
123
|
+
files << g("gem/changelog", "CHANGELOG.md", gem: gem)
|
124
|
+
files << g("gem/rubocop", ".rubocop.yml", gem: gem)
|
125
|
+
files << g("gem/toys", ".toys.rb", gem: gem)
|
126
|
+
files << g("gem/yardopts", ".yardopts", gem: gem)
|
127
|
+
files << g("gem/license", "LICENSE.md", gem: gem)
|
128
|
+
files << g("gem/entrypoint", "lib/#{gem.name}.rb", gem: gem)
|
129
|
+
files << g("gem/gapic_metadata_json", "gapic_metadata.json", gem: gem) if @api.generate_metadata
|
130
|
+
|
131
|
+
files << g("snippets/gemfile", "snippets/Gemfile", gem: gem) if @api.generate_standalone_snippets?
|
96
132
|
|
97
133
|
gem.proto_files.each do |proto_file|
|
98
|
-
files << g("proto_docs/proto_file
|
134
|
+
files << g("proto_docs/proto_file", "proto_docs/#{proto_file.docs_file_path}", file: proto_file)
|
99
135
|
end
|
100
|
-
files << g("proto_docs/readme
|
136
|
+
files << g("proto_docs/readme", "proto_docs/README.md", gem: gem)
|
101
137
|
|
102
138
|
format_files files
|
103
139
|
|
@@ -24,6 +24,8 @@ module Gapic
|
|
24
24
|
":gem.:free_tier",
|
25
25
|
":gem.:yard_strict",
|
26
26
|
":gem.:generic_endpoint",
|
27
|
+
":gem.:is_cloud_product",
|
28
|
+
":gem.:rest_numeric_enums",
|
27
29
|
":generate_metadata",
|
28
30
|
":generate_standalone_snippets",
|
29
31
|
":generate_yardoc_snippets"
|
@@ -47,7 +49,8 @@ module Gapic
|
|
47
49
|
":defaults.:service.:default_host",
|
48
50
|
"grpc_service_config",
|
49
51
|
":service_yaml",
|
50
|
-
":overrides.:wrapper_gem_name"
|
52
|
+
":overrides.:wrapper_gem_name",
|
53
|
+
":snippet_configs_path"
|
51
54
|
].freeze
|
52
55
|
|
53
56
|
ARRAY_PARAMETERS = [
|
@@ -66,7 +69,9 @@ module Gapic
|
|
66
69
|
BOOL_PARAMETERS_ALIASES = {
|
67
70
|
"gem-free-tier" => ":gem.:free_tier",
|
68
71
|
"gem-yard-strict" => ":gem.:yard_strict",
|
69
|
-
"gem-generic-endpoint" => ":gem.:generic_endpoint"
|
72
|
+
"gem-generic-endpoint" => ":gem.:generic_endpoint",
|
73
|
+
"gem-is-cloud-product" => ":gem.:is_cloud_product",
|
74
|
+
"rest-numeric-enums" => ":gem.:rest_numeric_enums"
|
70
75
|
}.freeze
|
71
76
|
|
72
77
|
STRING_PARAMETERS_ALIASES = {
|
@@ -86,7 +91,8 @@ module Gapic
|
|
86
91
|
"gem-factory-method-suffix" => ":gem.:factory_method_suffix",
|
87
92
|
"default-service-host" => ":defaults.:service.:default_host",
|
88
93
|
"grpc-service-config" => "grpc_service_config",
|
89
|
-
"service-yaml" => ":service_yaml"
|
94
|
+
"service-yaml" => ":service_yaml",
|
95
|
+
"snippet-configs-path" => ":snippet_configs_path"
|
90
96
|
}.freeze
|
91
97
|
|
92
98
|
ARRAY_PARAMETERS_ALIASES = {
|
@@ -62,7 +62,7 @@ module Gapic
|
|
62
62
|
"UNAUTHENTICATED"
|
63
63
|
].freeze
|
64
64
|
|
65
|
-
ERROR_STRING_MAPPING = ERROR_CODE_MAPPING.each_with_index.
|
65
|
+
ERROR_STRING_MAPPING = ERROR_CODE_MAPPING.each_with_index.with_object({}) do |(str, num), hash|
|
66
66
|
hash[str] = num
|
67
67
|
end.freeze
|
68
68
|
|
@@ -209,7 +209,7 @@ module Gapic
|
|
209
209
|
timestring_nos = timestring.delete_suffix "s"
|
210
210
|
unless valid_float? timestring_nos
|
211
211
|
error_text = "Was not able to convert the string `#{timestring}` " \
|
212
|
-
|
212
|
+
"to a time interval when parsing a grpc service config"
|
213
213
|
raise ParsingError, error_text
|
214
214
|
end
|
215
215
|
Float(timestring_nos)
|
@@ -0,0 +1,173 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# Copyright 2023 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 Model
|
19
|
+
##
|
20
|
+
# A collection of metadata about an API.
|
21
|
+
#
|
22
|
+
# This information generally comes from the service yaml rather than from
|
23
|
+
# proto input.
|
24
|
+
#
|
25
|
+
class ApiMetadata
|
26
|
+
##
|
27
|
+
# @return [String] The full ID of the API, including `".googleapis.com"`.
|
28
|
+
# For example, `"pubsub.googleapis.com"`.
|
29
|
+
#
|
30
|
+
attr_reader :name
|
31
|
+
|
32
|
+
##
|
33
|
+
# @return [String] The shortname of the API, omitting `".googleapis.com"`.
|
34
|
+
# For example, `"pubsub"`.
|
35
|
+
#
|
36
|
+
attr_reader :short_name
|
37
|
+
|
38
|
+
##
|
39
|
+
# @return [String] A title of the API, including the version.
|
40
|
+
# For example, `"Cloud Pub/Sub V1"`
|
41
|
+
#
|
42
|
+
attr_reader :title
|
43
|
+
|
44
|
+
##
|
45
|
+
# @return [String] A short description of the API, suitable for the
|
46
|
+
# RubyGems summary field.
|
47
|
+
#
|
48
|
+
attr_reader :summary
|
49
|
+
|
50
|
+
##
|
51
|
+
# @return [String] A longer description of the API, suitable for the
|
52
|
+
# RubyGems description field.
|
53
|
+
#
|
54
|
+
attr_reader :description
|
55
|
+
|
56
|
+
##
|
57
|
+
# @return [String] The organization name, determining where the API's
|
58
|
+
# documentation should be published, among other things. This value
|
59
|
+
# is `"CLOUD"` for Google Cloud APIs.
|
60
|
+
#
|
61
|
+
attr_reader :organization
|
62
|
+
|
63
|
+
##
|
64
|
+
# @return [String] The URL for the documentation.
|
65
|
+
#
|
66
|
+
attr_reader :documentation_url
|
67
|
+
|
68
|
+
##
|
69
|
+
# @return [String] The prefix string for sample doc tags.
|
70
|
+
#
|
71
|
+
attr_reader :doc_tag_prefix
|
72
|
+
|
73
|
+
##
|
74
|
+
# @return [Hash{String => Array<String>}] A mapping from method name to a list of auto
|
75
|
+
# populated fields.
|
76
|
+
#
|
77
|
+
attr_reader :auto_populated_fields_by_method_name
|
78
|
+
|
79
|
+
######## Internal ########
|
80
|
+
# @private
|
81
|
+
SELECTOR = "selector"
|
82
|
+
# @private
|
83
|
+
AUTO_POPULATED_FIELDS = "auto_populated_fields"
|
84
|
+
|
85
|
+
##
|
86
|
+
# @private
|
87
|
+
# Special cases for short names
|
88
|
+
#
|
89
|
+
SHORT_NAME_MAPPING = {
|
90
|
+
"iam-meta-api" => "iam"
|
91
|
+
}.freeze
|
92
|
+
|
93
|
+
# @private
|
94
|
+
def update! **keywords
|
95
|
+
omit_patterns = [
|
96
|
+
nil,
|
97
|
+
"",
|
98
|
+
"CLIENT_LIBRARY_ORGANIZATION_UNSPECIFIED",
|
99
|
+
/\A\s*\(==.+==\)\s*\Z/
|
100
|
+
]
|
101
|
+
keywords.each do |key, value|
|
102
|
+
instance_variable_set "@#{key}", value unless omit_patterns.any? { |pat| pat === value }
|
103
|
+
end
|
104
|
+
self
|
105
|
+
end
|
106
|
+
|
107
|
+
# @private
|
108
|
+
def standardize_names!
|
109
|
+
return unless name || short_name
|
110
|
+
@name ||= short_name
|
111
|
+
@short_name ||= name
|
112
|
+
@name = "#{name}.googleapis.com" unless name.include? "."
|
113
|
+
@short_name = short_name.split(".").first
|
114
|
+
@short_name = SHORT_NAME_MAPPING.fetch @short_name, @short_name
|
115
|
+
@doc_tag_prefix ||= short_name
|
116
|
+
self
|
117
|
+
end
|
118
|
+
|
119
|
+
# @private
|
120
|
+
def standardize_title! gem_name:
|
121
|
+
return unless title
|
122
|
+
@title = title.sub %r{\s+API$}, ""
|
123
|
+
return if title =~ /\s+V\d+\w*$/
|
124
|
+
vers = gem_name.split("-").last
|
125
|
+
@title = "#{title} #{vers.upcase}" if vers =~ /^v\d+\w*$/
|
126
|
+
self
|
127
|
+
end
|
128
|
+
|
129
|
+
# @private
|
130
|
+
def standardize_descriptions!
|
131
|
+
return unless summary || description
|
132
|
+
@description ||= summary
|
133
|
+
if summary
|
134
|
+
@summary = summary.gsub(/\s+/, " ").strip
|
135
|
+
@summary = "#{summary}." if summary =~ /\w\z/
|
136
|
+
@summary = remove_html_tags summary
|
137
|
+
end
|
138
|
+
@description = "#{description}." if description =~ /\w\z/
|
139
|
+
@description = remove_html_tags description
|
140
|
+
self
|
141
|
+
end
|
142
|
+
|
143
|
+
# @private
|
144
|
+
# Remove html tags and markdown links
|
145
|
+
def remove_html_tags str
|
146
|
+
str
|
147
|
+
.gsub(%r{</?[[:alpha:]]+(?:\s+[[:alpha:]]+\s*=\s*(?:"[^"]+"|'[^']+'|[^\s">]+))*\s*/?>}, "")
|
148
|
+
.gsub(%r{\[([^\]]+)\]\([^)]+\)}, "\\1")
|
149
|
+
end
|
150
|
+
|
151
|
+
##
|
152
|
+
# @private
|
153
|
+
# Parses a service configuration, mapping method names to their respective
|
154
|
+
# auto populated field lists.
|
155
|
+
#
|
156
|
+
def standardize_auto_populated_fields! service_config
|
157
|
+
@auto_populated_fields_by_method_name = {}
|
158
|
+
return unless !service_config.nil? && !service_config.apis.nil?
|
159
|
+
@method_settings.each do |setting|
|
160
|
+
selector = setting[SELECTOR]
|
161
|
+
methods = service_config.apis.filter_map do |api|
|
162
|
+
# Removes API prefix and trailing period.
|
163
|
+
selector[api.name.length + 1..].downcase if selector.start_with? api.name
|
164
|
+
end
|
165
|
+
if !methods.nil? && setting.key?(AUTO_POPULATED_FIELDS)
|
166
|
+
@auto_populated_fields_by_method_name[methods.first] = setting[AUTO_POPULATED_FIELDS]
|
167
|
+
end
|
168
|
+
end
|
169
|
+
self
|
170
|
+
end
|
171
|
+
end
|
172
|
+
end
|
173
|
+
end
|
@@ -23,99 +23,197 @@ module Gapic
|
|
23
23
|
# The information used in the generation process that
|
24
24
|
# can be gathered from the `google.api.http` annotation.
|
25
25
|
# `google.api.http` is used in two distinct ways:
|
26
|
-
# -
|
27
|
-
# -
|
26
|
+
# - REST libs use it as part of the transcoding to set up the REST call
|
27
|
+
# - gRPC libs use it as a source of implicit routing headers
|
28
28
|
#
|
29
29
|
class HttpAnnotation
|
30
30
|
##
|
31
|
-
#
|
31
|
+
# The Http bindings found in the annotation
|
32
|
+
# this includes main binding in the annotation itself,
|
33
|
+
# as well as those in the `additional_bindings`.
|
32
34
|
#
|
33
|
-
|
34
|
-
|
35
|
+
# @return [Array<HttpBinding>]
|
36
|
+
attr_reader :bindings
|
37
|
+
|
38
|
+
##
|
39
|
+
# @param proto_http [::Google::Api::HttpRule]
|
40
|
+
# The base http annotation
|
41
|
+
#
|
42
|
+
def initialize proto_http
|
43
|
+
@bindings = parse_bindings proto_http
|
35
44
|
end
|
36
45
|
|
37
46
|
##
|
38
|
-
# Whether
|
47
|
+
# Whether any implicit routing parameters are present.
|
39
48
|
#
|
40
49
|
# @return [Boolean]
|
41
|
-
def
|
42
|
-
|
50
|
+
def routing_params?
|
51
|
+
routing_params.any?
|
43
52
|
end
|
44
53
|
|
45
54
|
##
|
46
|
-
# The
|
55
|
+
# The implicit routing parameter names.
|
47
56
|
#
|
48
|
-
# @return [
|
49
|
-
def
|
50
|
-
|
51
|
-
|
52
|
-
method = {
|
53
|
-
get: @proto_method.http.get,
|
54
|
-
post: @proto_method.http.post,
|
55
|
-
put: @proto_method.http.put,
|
56
|
-
patch: @proto_method.http.patch,
|
57
|
-
delete: @proto_method.http.delete
|
58
|
-
}.find { |_, value| !value.empty? }
|
59
|
-
|
60
|
-
method[0] unless method.nil?
|
57
|
+
# @return [Array<String>]
|
58
|
+
def routing_params
|
59
|
+
routing_params_with_patterns.map { |param, _| param }
|
61
60
|
end
|
62
61
|
|
63
62
|
##
|
64
|
-
#
|
63
|
+
# The implicit routing parameter names and their corresponding paterns,
|
64
|
+
# including the `*` pattern implied for the named segments
|
65
|
+
# without an explicitly specified pattern.
|
65
66
|
#
|
66
|
-
# @return [
|
67
|
-
def
|
68
|
-
|
67
|
+
# @return [Array<Array<String>>]
|
68
|
+
def routing_params_with_patterns
|
69
|
+
bindings.first&.routing_params_with_patterns || []
|
69
70
|
end
|
70
71
|
|
71
72
|
##
|
72
|
-
#
|
73
|
+
# @param proto_method [::Gapic::Schema::Method]
|
74
|
+
# The proto method this annotation model applies to
|
75
|
+
# @param service_config [::Google::Api::Service]
|
76
|
+
# The service config that might contain an override for the http annotation.
|
77
|
+
# This is used for mixins: when generating Operations sublients, and when
|
78
|
+
# setting up overrides for other mixin clients in the host services's classes.
|
79
|
+
# For non-mixin service generation
|
80
|
+
# it is assumed that the service config is merged into protos before generation.
|
73
81
|
#
|
74
|
-
|
75
|
-
|
76
|
-
return "" if @proto_method.http.nil?
|
82
|
+
def self.create_with_override proto_method, service_config = nil
|
83
|
+
proto_http = proto_method.http
|
77
84
|
|
78
|
-
|
79
|
-
@proto_method.http.get, @proto_method.http.post, @proto_method.http.put,
|
80
|
-
@proto_method.http.patch, @proto_method.http.delete
|
81
|
-
].find { |x| !x.empty? }
|
85
|
+
http_override = service_config&.http&.rules&.find { |http_rule| http_rule.selector == proto_method.full_name }
|
82
86
|
|
83
|
-
|
87
|
+
http = http_override || proto_http
|
88
|
+
HttpAnnotation.new http
|
84
89
|
end
|
85
90
|
|
86
91
|
##
|
87
|
-
#
|
92
|
+
# A single Http binding.
|
88
93
|
#
|
89
|
-
|
90
|
-
|
91
|
-
|
94
|
+
class HttpBinding
|
95
|
+
##
|
96
|
+
# @param binding [::Google::Api::HttpRule]
|
97
|
+
# The baseline instance of the Http annotation
|
98
|
+
def initialize binding
|
99
|
+
@binding = binding
|
100
|
+
end
|
101
|
+
|
102
|
+
##
|
103
|
+
# Whether a http verb is present for this method
|
104
|
+
#
|
105
|
+
# @return [Boolean]
|
106
|
+
def verb?
|
107
|
+
!verb.nil?
|
108
|
+
end
|
109
|
+
|
110
|
+
##
|
111
|
+
# The http verb for this method
|
112
|
+
#
|
113
|
+
# @return [Symbol, nil]
|
114
|
+
def verb
|
115
|
+
verb_path[0] if verb_path
|
116
|
+
end
|
117
|
+
|
118
|
+
##
|
119
|
+
# Whether a method path is present and non-empty
|
120
|
+
#
|
121
|
+
# @return [Boolean]
|
122
|
+
def path?
|
123
|
+
!path.empty?
|
124
|
+
end
|
125
|
+
|
126
|
+
##
|
127
|
+
# A method path or an empty string if not present
|
128
|
+
#
|
129
|
+
# @return [String]
|
130
|
+
def path
|
131
|
+
return "" unless verb_path
|
132
|
+
verb_path[1]
|
133
|
+
end
|
134
|
+
|
135
|
+
##
|
136
|
+
# Whether any routing params are present
|
137
|
+
#
|
138
|
+
# @return [Boolean]
|
139
|
+
def routing_params?
|
140
|
+
routing_params.any?
|
141
|
+
end
|
142
|
+
|
143
|
+
##
|
144
|
+
# The segment key names and their corresponding paterns,
|
145
|
+
# including the `*` pattern implied for the named segments
|
146
|
+
# without pattern explicitly specified.
|
147
|
+
#
|
148
|
+
# @return [Array<Array<String>>]
|
149
|
+
def routing_params_with_patterns
|
150
|
+
@routing_params_with_patterns ||= begin
|
151
|
+
Gapic::UriTemplate.parse_arguments(path).map do |name, pattern|
|
152
|
+
[name, pattern.empty? ? "*" : pattern]
|
153
|
+
end
|
154
|
+
end
|
155
|
+
end
|
156
|
+
|
157
|
+
##
|
158
|
+
# The segment key names.
|
159
|
+
#
|
160
|
+
# @return [Array<String>]
|
161
|
+
def routing_params
|
162
|
+
routing_params_with_patterns.map { |param, _| param }
|
163
|
+
end
|
164
|
+
|
165
|
+
##
|
166
|
+
# Whether method has body specified in proto
|
167
|
+
#
|
168
|
+
# @return [Boolean]
|
169
|
+
def body?
|
170
|
+
!body.empty?
|
171
|
+
end
|
172
|
+
|
173
|
+
##
|
174
|
+
# The body specified for the given method in proto
|
175
|
+
# or an empty string if not specified
|
176
|
+
#
|
177
|
+
# @return [String]
|
178
|
+
def body
|
179
|
+
@binding&.body || ""
|
180
|
+
end
|
181
|
+
|
182
|
+
private
|
183
|
+
|
184
|
+
##
|
185
|
+
# The combination of verb and path found in the http annotation
|
186
|
+
# (or Nil if the annotation is Nil).
|
187
|
+
#
|
188
|
+
# @return [Array<Symbol, String>, Nil]
|
189
|
+
def verb_path
|
190
|
+
return nil if @binding.nil?
|
191
|
+
|
192
|
+
{
|
193
|
+
get: @binding.get,
|
194
|
+
post: @binding.post,
|
195
|
+
put: @binding.put,
|
196
|
+
patch: @binding.patch,
|
197
|
+
delete: @binding.delete
|
198
|
+
}.find { |_, value| !value.empty? }
|
199
|
+
end
|
92
200
|
end
|
93
201
|
|
94
|
-
|
95
|
-
# The segment key names.
|
96
|
-
#
|
97
|
-
# @return [Array<String>]
|
98
|
-
def routing_params
|
99
|
-
Gapic::UriTemplate.parse_arguments path
|
100
|
-
end
|
202
|
+
private
|
101
203
|
|
102
204
|
##
|
103
|
-
#
|
205
|
+
# Parses http bindings from the `google.api.http` annotation, preserving order.
|
104
206
|
#
|
105
|
-
# @
|
106
|
-
|
107
|
-
return false if @proto_method.http.nil?
|
108
|
-
|
109
|
-
!@proto_method.http.body.empty?
|
110
|
-
end
|
111
|
-
|
112
|
-
##
|
113
|
-
# The body specified for the given method in proto
|
114
|
-
# or an empty string if not specified
|
207
|
+
# @param http [::Google::Api::HttpRule]
|
208
|
+
# The root instance of the HttpRule to parse.
|
115
209
|
#
|
116
|
-
# @return
|
117
|
-
|
118
|
-
|
210
|
+
# @return Array<HttpBinding>
|
211
|
+
# The parsed bindings.
|
212
|
+
def parse_bindings http
|
213
|
+
return [] if http.nil?
|
214
|
+
|
215
|
+
raw_binds = [http] + http.additional_bindings.to_a
|
216
|
+
raw_binds.map { |raw_bind| HttpBinding.new raw_bind }
|
119
217
|
end
|
120
218
|
end
|
121
219
|
end
|