From 1b6c7e8c0b992598f400a009022330016e42c812 Mon Sep 17 00:00:00 2001 From: Viacheslav Rostovtsev <58152857+viacheslav-rostovtsev@users.noreply.github.com> Date: Thu, 18 Jun 2020 18:28:52 -0700 Subject: [PATCH] Dev/virost/feat/proto3 optional (#466) --- README.md | 4 -- gapic-common/CHANGELOG.md | 4 ++ gapic-common/gapic-common.gemspec | 2 +- gapic-common/lib/gapic/common/version.rb | 2 +- gapic-generator-ads/CHANGELOG.md | 4 ++ gapic-generator-ads/Dockerfile | 2 +- gapic-generator-ads/docker-entrypoint.sh | 1 + .../gapic-generator-ads.gemspec | 4 +- .../lib/gapic/generator/ads/version.rb | 2 +- gapic-generator-cloud/CHANGELOG.md | 4 ++ .../gapic-generator-cloud.gemspec | 4 +- .../lib/gapic/generator/cloud/version.rb | 2 +- .../templates/cloud/wrapper_gem/gemfile.erb | 3 -- gapic-generator/CHANGELOG.md | 7 +++ gapic-generator/Dockerfile | 2 +- gapic-generator/Rakefile | 1 + gapic-generator/docker-entrypoint.sh | 1 + gapic-generator/gapic-generator.gemspec | 2 +- gapic-generator/gem_templates/dockerfile.erb | 2 +- gapic-generator/gem_templates/entrypoint.erb | 1 + .../lib/gapic/generator/version.rb | 2 +- .../lib/gapic/presenters/field_presenter.rb | 8 +++ .../lib/gapic/presenters/gem_presenter.rb | 2 +- gapic-generator/lib/gapic/runner.rb | 4 +- gapic-generator/lib/gapic/schema/wrappers.rb | 3 +- .../lib/google/protobuf/compiler/plugin.pb.rb | 6 ++- .../lib/google/protobuf/descriptor.pb.rb | 1 + .../templates/default/gem/gemfile.erb | 3 -- .../default/service/test/method/_bidi.erb | 6 +++ .../default/service/test/method/_client.erb | 6 +++ .../default/service/test/method/_normal.erb | 6 +++ .../default/service/test/method/_server.erb | 6 +++ .../test/gapic/annotations/enum_test.rb | 2 +- .../test/gapic/annotations/field_test.rb | 2 +- .../field_presenter_showcase_test.rb | 15 ++++++ .../gapic/presenters/field_presenter_test.rb | 21 +++++++- .../gapic/presenters/method_presenter_test.rb | 8 ++- .../service/showcase_messaging_test.rb | 2 +- shared/Gemfile | 2 +- shared/Rakefile | 1 + shared/input/garbage_desc.bin | Bin 153573 -> 155016 bytes shared/input/googleads_desc.bin | Bin 202762 -> 204068 bytes shared/input/grpc_service_config_desc.bin | Bin 52971 -> 54277 bytes shared/input/language_v1_desc.bin | Bin 115129 -> 116435 bytes shared/input/language_v1beta1_desc.bin | Bin 98661 -> 99967 bytes shared/input/language_v1beta2_desc.bin | Bin 119404 -> 120710 bytes shared/input/secretmanager_v1beta1_desc.bin | Bin 136326 -> 137632 bytes shared/input/showcase_desc.bin | Bin 179598 -> 182962 bytes shared/input/speech_v1_desc.bin | Bin 142909 -> 144215 bytes shared/input/vision_v1_desc.bin | Bin 242113 -> 243419 bytes .../services/campaign_service_services_pb.rb | 2 +- shared/output/cloud/language_v1/Gemfile | 3 -- .../google-cloud-language-v1.gemspec | 2 +- shared/output/cloud/language_v1beta1/Gemfile | 3 -- .../google-cloud-language-v1beta1.gemspec | 2 +- shared/output/cloud/language_v1beta2/Gemfile | 3 -- .../google-cloud-language-v1beta2.gemspec | 2 +- shared/output/cloud/noservice/Gemfile | 3 -- .../google-garbage-noservice.gemspec | 2 +- .../cloud/secretmanager_v1beta1/Gemfile | 3 -- ...oogle-cloud-secret_manager-v1beta1.gemspec | 2 +- .../cloud/secretmanager_wrapper/Gemfile | 3 -- shared/output/cloud/speech_v1/Gemfile | 3 -- .../speech_v1/google-cloud-speech-v1.gemspec | 2 +- .../google/cloud/speech/v1/speech_test.rb | 1 + shared/output/cloud/vision_v1/Gemfile | 3 -- .../vision_v1/google-cloud-vision-v1.gemspec | 2 +- .../cloud/vision/v1/product_search_test.rb | 1 + shared/output/gapic/gems/my_plugin/Dockerfile | 2 +- .../gapic/gems/my_plugin/docker-entrypoint.sh | 1 + shared/output/gapic/templates/garbage/Gemfile | 3 -- .../templates/garbage/google-garbage.gemspec | 2 +- .../garbage/lib/garbage/garbage_pb.rb | 1 + .../lib/garbage/garbage_services_pb.rb | 2 +- .../so/much/trash/garbage_service/client.rb | 3 +- .../garbage/proto_docs/garbage/garbage.rb | 2 + .../so/much/trash/garbage_service_test.rb | 16 ++++-- .../templates/grpc_service_config/Gemfile | 3 -- .../testing-grpc_service_config.gemspec | 2 +- .../output/gapic/templates/showcase/Gemfile | 3 -- .../showcase/google-showcase.gemspec | 2 +- .../lib/google/showcase/v1beta1/echo.rb | 3 +- .../google/showcase/v1beta1/echo/client.rb | 3 +- .../showcase/v1beta1/echo_services_pb.rb | 5 +- .../google/showcase/v1beta1/identity_pb.rb | 4 ++ .../showcase/v1beta1/messaging/paths.rb | 44 ++++++++++++--- .../google/showcase/v1beta1/messaging_pb.rb | 4 ++ .../google/showcase/v1beta1/identity.rb | 18 +++++++ .../google/showcase/v1beta1/messaging.rb | 8 +++ .../test/google/showcase/v1beta1/echo_test.rb | 6 +++ .../showcase/v1beta1/messaging_paths_test.rb | 10 +++- .../google/showcase/v1beta1/messaging_test.rb | 1 + shared/protos/garbage/garbage.proto | 2 + .../protos/google/showcase/v1beta1/echo.proto | 7 +-- .../google/showcase/v1beta1/identity.proto | 19 +++++++ .../google/showcase/v1beta1/messaging.proto | 18 ++++++- shared/test/showcase/identity_test.rb | 50 ++++++++++++++++++ shared/test/test_helper.rb | 11 +++- 98 files changed, 351 insertions(+), 106 deletions(-) create mode 100644 shared/test/showcase/identity_test.rb diff --git a/README.md b/README.md index e80bd69b0..a480d6ec6 100644 --- a/README.md +++ b/README.md @@ -162,10 +162,6 @@ $ protoc googleapis/google/cloud/vision/v1/*.proto \ --ruby_gapic_opt=configuration=vision.yml --ruby_gapic_out=dest ``` -Note that generated clients depend on the `gapic-common` 2.0 gem, which is not -yet released. To test a client, you may need to modify it to pull `gapic-common` -from the github master branch. - ### Create a custom generator If you want to customize the output, you may create a new generator using the `gapic-generator` binary installed by the main generator. A new generator takes diff --git a/gapic-common/CHANGELOG.md b/gapic-common/CHANGELOG.md index 0f0c2aac4..f68e5e47d 100644 --- a/gapic-common/CHANGELOG.md +++ b/gapic-common/CHANGELOG.md @@ -1,5 +1,9 @@ # Release History +### 0.3.0 / 2020-06-18 + +* Update the dependency on google-protobuf to 3.12.2 + ### 0.2.1 / 2020-06-02 * Fix a crash when resetting a config field to nil when it has a parent but no default diff --git a/gapic-common/gapic-common.gemspec b/gapic-common/gapic-common.gemspec index adde53a51..bf486589f 100644 --- a/gapic-common/gapic-common.gemspec +++ b/gapic-common/gapic-common.gemspec @@ -35,7 +35,7 @@ Gem::Specification.new do |spec| spec.required_ruby_version = ">= 2.4" - spec.add_dependency "google-protobuf", "~> 3.2" + spec.add_dependency "google-protobuf", "~> 3.12", ">= 3.12.2" spec.add_dependency "googleapis-common-protos", ">= 1.3.9", "< 2.0" spec.add_dependency "googleapis-common-protos-types", ">= 1.0.4", "< 2.0" spec.add_dependency "googleauth", "~> 0.9" diff --git a/gapic-common/lib/gapic/common/version.rb b/gapic-common/lib/gapic/common/version.rb index df352a8a9..1d29ba097 100644 --- a/gapic-common/lib/gapic/common/version.rb +++ b/gapic-common/lib/gapic/common/version.rb @@ -14,6 +14,6 @@ module Gapic module Common - VERSION = "0.2.1".freeze + VERSION = "0.3.0".freeze end end diff --git a/gapic-generator-ads/CHANGELOG.md b/gapic-generator-ads/CHANGELOG.md index ada6073bd..9b4319054 100644 --- a/gapic-generator-ads/CHANGELOG.md +++ b/gapic-generator-ads/CHANGELOG.md @@ -1,5 +1,9 @@ # Release History for gapic-generator-ads +### 0.6.2 / 2020-06-18 + +* Includes changes from gapic-generator 0.6.2. + ### 0.6.1 / 2020-06-16 * Includes changes from gapic-generator 0.6.1. diff --git a/gapic-generator-ads/Dockerfile b/gapic-generator-ads/Dockerfile index 722f409e4..4afbda028 100644 --- a/gapic-generator-ads/Dockerfile +++ b/gapic-generator-ads/Dockerfile @@ -54,7 +54,7 @@ RUN if [ -f gapic-generator.gem ]; then \ ;fi # Install the subgenerator and other needed tools. -RUN gem install grpc-tools gapic-generator-ads.gem \ +RUN gem install --pre grpc-tools gapic-generator-ads.gem \ && rm gapic-generator-ads.gem \ && mkdir -p --mode=777 /.cache diff --git a/gapic-generator-ads/docker-entrypoint.sh b/gapic-generator-ads/docker-entrypoint.sh index 20923fdf6..a34fe6a63 100755 --- a/gapic-generator-ads/docker-entrypoint.sh +++ b/gapic-generator-ads/docker-entrypoint.sh @@ -27,6 +27,7 @@ done mkdir -p /workspace/out/lib grpc_tools_ruby_protoc \ + --experimental_allow_proto3_optional=1 \ --proto_path=/workspace/common-protos/ --proto_path=/workspace/in/ \ --ruby_out=/workspace/out/lib \ --grpc_out=/workspace/out/lib \ diff --git a/gapic-generator-ads/gapic-generator-ads.gemspec b/gapic-generator-ads/gapic-generator-ads.gemspec index 1f06eeb53..0af8ae23c 100644 --- a/gapic-generator-ads/gapic-generator-ads.gemspec +++ b/gapic-generator-ads/gapic-generator-ads.gemspec @@ -40,12 +40,12 @@ Gem::Specification.new do |spec| spec.require_paths = ["lib"] spec.add_dependency "actionpack", "~> 5.2" - spec.add_dependency "gapic-generator", "= 0.6.1" + spec.add_dependency "gapic-generator", "= 0.6.2" spec.add_dependency "protobuf", "~> 3.8" spec.add_development_dependency "bundler", "~> 2.1" spec.add_development_dependency "google-style", "~> 1.24.0" - spec.add_development_dependency "grpc-tools", "~> 1.19" + spec.add_development_dependency "grpc-tools", "~> 1.30.0.pre1" spec.add_development_dependency "minitest", "~> 5.0" spec.add_development_dependency "minitest-focus", "~> 1.0" spec.add_development_dependency "rake", ">= 12.0" diff --git a/gapic-generator-ads/lib/gapic/generator/ads/version.rb b/gapic-generator-ads/lib/gapic/generator/ads/version.rb index 2b67bd9fe..88b9f9b8c 100644 --- a/gapic-generator-ads/lib/gapic/generator/ads/version.rb +++ b/gapic-generator-ads/lib/gapic/generator/ads/version.rb @@ -18,7 +18,7 @@ module Gapic module Generator module Ads - VERSION = "0.6.1" + VERSION = "0.6.2" end end end diff --git a/gapic-generator-cloud/CHANGELOG.md b/gapic-generator-cloud/CHANGELOG.md index 2a098856b..a7655b43d 100644 --- a/gapic-generator-cloud/CHANGELOG.md +++ b/gapic-generator-cloud/CHANGELOG.md @@ -1,5 +1,9 @@ # Release History for gapic-generator-cloud +### 0.6.2 / 2020-06-18 + +* Includes changes from gapic-generator 0.6.2. + ### 0.6.1 / 2020-06-16 * Includes changes from gapic-generator 0.6.1. diff --git a/gapic-generator-cloud/gapic-generator-cloud.gemspec b/gapic-generator-cloud/gapic-generator-cloud.gemspec index 35644e1af..7af59efc0 100644 --- a/gapic-generator-cloud/gapic-generator-cloud.gemspec +++ b/gapic-generator-cloud/gapic-generator-cloud.gemspec @@ -39,12 +39,12 @@ Gem::Specification.new do |spec| spec.require_paths = ["lib"] spec.add_dependency "actionpack", "~> 5.2" - spec.add_dependency "gapic-generator", "= 0.6.1" + spec.add_dependency "gapic-generator", "= 0.6.2" spec.add_dependency "google-style", "~> 1.24.0" spec.add_dependency "protobuf", "~> 3.8" spec.add_development_dependency "bundler", "~> 2.1" - spec.add_development_dependency "grpc-tools", "~> 1.19" + spec.add_development_dependency "grpc-tools", "~> 1.30.0.pre1" spec.add_development_dependency "minitest", "~> 5.0" spec.add_development_dependency "minitest-autotest", "~> 1.0" spec.add_development_dependency "minitest-focus", "~> 1.0" diff --git a/gapic-generator-cloud/lib/gapic/generator/cloud/version.rb b/gapic-generator-cloud/lib/gapic/generator/cloud/version.rb index c9d572fd3..e6086494e 100644 --- a/gapic-generator-cloud/lib/gapic/generator/cloud/version.rb +++ b/gapic-generator-cloud/lib/gapic/generator/cloud/version.rb @@ -18,7 +18,7 @@ module Gapic module Generator module Cloud - VERSION = "0.6.1" + VERSION = "0.6.2" end end end diff --git a/gapic-generator-cloud/templates/cloud/wrapper_gem/gemfile.erb b/gapic-generator-cloud/templates/cloud/wrapper_gem/gemfile.erb index ebdfb55c8..6835fbd5a 100644 --- a/gapic-generator-cloud/templates/cloud/wrapper_gem/gemfile.erb +++ b/gapic-generator-cloud/templates/cloud/wrapper_gem/gemfile.erb @@ -6,6 +6,3 @@ gemspec <%- gem.versioned_gems.each do |name| -%> gem "<%= name %>", path: "../<%= name %>" <%- end -%> - -# google-protobuf 3.12.0 requires Ruby 2.5 or later, so pin to 3.11 on older Rubies -gem "google-protobuf", (RUBY_VERSION < "2.5" ? "~> 3.11.4" : "~> 3.12") diff --git a/gapic-generator/CHANGELOG.md b/gapic-generator/CHANGELOG.md index 29a3ff944..756ace0f8 100644 --- a/gapic-generator/CHANGELOG.md +++ b/gapic-generator/CHANGELOG.md @@ -1,5 +1,12 @@ # Release History for gapic-generator +### 0.6.2 / 2020-06-18 + +* Support for the proto3_optional +* Fixed an issue where tests for the oneof fields were not generating correctly +* Removed ruby <2.5 pin for the protobuf dependency since new protobuf supports it again +* Generated libraries now depend on gapic-common 0.3 + ### 0.6.1 / 2020-06-16 * Add auto-generated disclaimer to generated tests. diff --git a/gapic-generator/Dockerfile b/gapic-generator/Dockerfile index 23907d811..5f1eb2ae4 100644 --- a/gapic-generator/Dockerfile +++ b/gapic-generator/Dockerfile @@ -41,7 +41,7 @@ COPY --from=gcr.io/gapic-images/api-common-protos:latest /protos/ /workspace/com COPY --from=builder /workspace/*.gem /workspace/ # Install the generator and other needed tools. -RUN gem install grpc-tools ./gapic-generator.gem \ +RUN gem install --pre grpc-tools ./gapic-generator.gem \ && rm gapic-generator.gem \ && mkdir -p --mode=777 /.cache diff --git a/gapic-generator/Rakefile b/gapic-generator/Rakefile index 218bd5bbf..557eca6a0 100644 --- a/gapic-generator/Rakefile +++ b/gapic-generator/Rakefile @@ -169,6 +169,7 @@ def generate_default_templates service protoc_cmd = [ "grpc_tools_ruby_protoc", + "--experimental_allow_proto3_optional=1", "-I ../shared/api-common-protos", "-I ../shared/googleapis", "-I ../shared/protos", diff --git a/gapic-generator/docker-entrypoint.sh b/gapic-generator/docker-entrypoint.sh index a08fc9e84..fca44959c 100755 --- a/gapic-generator/docker-entrypoint.sh +++ b/gapic-generator/docker-entrypoint.sh @@ -27,6 +27,7 @@ done mkdir -p /workspace/out/lib exec grpc_tools_ruby_protoc \ + --experimental_allow_proto3_optional=1 \ --proto_path=/workspace/common-protos/ --proto_path=/workspace/in/ \ --ruby_out=/workspace/out/lib \ --grpc_out=/workspace/out/lib \ diff --git a/gapic-generator/gapic-generator.gemspec b/gapic-generator/gapic-generator.gemspec index fb790054b..9ec01bcca 100644 --- a/gapic-generator/gapic-generator.gemspec +++ b/gapic-generator/gapic-generator.gemspec @@ -43,7 +43,7 @@ Gem::Specification.new do |spec| spec.add_development_dependency "bundler", "~> 2.1" spec.add_development_dependency "google-style", "~> 1.24.0" - spec.add_development_dependency "grpc-tools", "~> 1.19" + spec.add_development_dependency "grpc-tools", "~> 1.30.0.pre1" spec.add_development_dependency "minitest", "~> 5.0" spec.add_development_dependency "minitest-autotest", "~> 1.0" spec.add_development_dependency "minitest-focus", "~> 1.0" diff --git a/gapic-generator/gem_templates/dockerfile.erb b/gapic-generator/gem_templates/dockerfile.erb index 070878b5b..9b75ca054 100644 --- a/gapic-generator/gem_templates/dockerfile.erb +++ b/gapic-generator/gem_templates/dockerfile.erb @@ -30,7 +30,7 @@ COPY --from=gcr.io/gapic-images/api-common-protos:beta /protos/ /workspace/commo COPY --from=builder /workspace/*.gem /workspace/ # Install the subgenerator and other needed tools. -RUN gem install grpc-tools gapic-generator-<%= gem_name %>.gem \ +RUN gem install --pre grpc-tools gapic-generator-<%= gem_name %>.gem \ && rm gapic-generator-<%= gem_name %>.gem \ && mkdir -p --mode=777 /.cache diff --git a/gapic-generator/gem_templates/entrypoint.erb b/gapic-generator/gem_templates/entrypoint.erb index c3a96b553..bcc9306d2 100644 --- a/gapic-generator/gem_templates/entrypoint.erb +++ b/gapic-generator/gem_templates/entrypoint.erb @@ -16,6 +16,7 @@ done mkdir -p /workspace/out/lib exec grpc_tools_ruby_protoc \ + --experimental_allow_proto3_optional=1 \ --proto_path=/workspace/common-protos/ --proto_path=/workspace/in/ \ --ruby_out=/workspace/out/lib \ --grpc_out=/workspace/out/lib \ diff --git a/gapic-generator/lib/gapic/generator/version.rb b/gapic-generator/lib/gapic/generator/version.rb index e44da5544..f9d8e6c5e 100644 --- a/gapic-generator/lib/gapic/generator/version.rb +++ b/gapic-generator/lib/gapic/generator/version.rb @@ -16,6 +16,6 @@ module Gapic module Generator - VERSION = "0.6.1" + VERSION = "0.6.2" end end diff --git a/gapic-generator/lib/gapic/presenters/field_presenter.rb b/gapic-generator/lib/gapic/presenters/field_presenter.rb index cc1b6cfae..68406ef19 100644 --- a/gapic-generator/lib/gapic/presenters/field_presenter.rb +++ b/gapic-generator/lib/gapic/presenters/field_presenter.rb @@ -80,6 +80,10 @@ def enum? @field.enum? end + def proto3_optional? + @field.proto3_optional? + end + def repeated? @field.repeated? end @@ -92,6 +96,10 @@ def oneof? @field.oneof? end + def oneof_name + @message.oneof_decl[@field.oneof_index].name + end + protected def field_doc_types field, output diff --git a/gapic-generator/lib/gapic/presenters/gem_presenter.rb b/gapic-generator/lib/gapic/presenters/gem_presenter.rb index 35356560b..3dc4b35e7 100644 --- a/gapic-generator/lib/gapic/presenters/gem_presenter.rb +++ b/gapic-generator/lib/gapic/presenters/gem_presenter.rb @@ -174,7 +174,7 @@ def extra_files end def dependencies - deps = { "gapic-common" => "~> 0.2" } + deps = { "gapic-common" => "~> 0.3" } deps["grpc-google-iam-v1"] = [">= 0.6.10", "< 2.0"] if iam_dependency? extra_deps = gem_config :extra_dependencies deps.merge! extra_deps if extra_deps diff --git a/gapic-generator/lib/gapic/runner.rb b/gapic-generator/lib/gapic/runner.rb index 02ada3148..3221b3228 100644 --- a/gapic-generator/lib/gapic/runner.rb +++ b/gapic-generator/lib/gapic/runner.rb @@ -48,8 +48,10 @@ def run generator_type: nil output_files = generator.new(api).generate # Create and write the response - Google::Protobuf::Compiler::CodeGeneratorResponse.new \ + response = Google::Protobuf::Compiler::CodeGeneratorResponse.new \ file: output_files + response.supported_features = Google::Protobuf::Compiler::CodeGeneratorResponse::FEATURE_PROTO3_OPTIONAL + response end # Run protoc generation. diff --git a/gapic-generator/lib/gapic/schema/wrappers.rb b/gapic-generator/lib/gapic/schema/wrappers.rb index 5ce1795de..57d91b17c 100644 --- a/gapic-generator/lib/gapic/schema/wrappers.rb +++ b/gapic-generator/lib/gapic/schema/wrappers.rb @@ -740,7 +740,8 @@ def immutable? :default_value, :oneof_index, :json_name, - :options + :options, + :proto3_optional? ) end diff --git a/gapic-generator/lib/google/protobuf/compiler/plugin.pb.rb b/gapic-generator/lib/google/protobuf/compiler/plugin.pb.rb index b679493f6..4e0f5642c 100644 --- a/gapic-generator/lib/google/protobuf/compiler/plugin.pb.rb +++ b/gapic-generator/lib/google/protobuf/compiler/plugin.pb.rb @@ -1,7 +1,8 @@ # encoding: utf-8 ## -# This file is auto-generated. DO NOT EDIT! +# This file was auto-generated initially but now is hand-edited to add support +# for response features and proto3_optional # require 'protobuf' @@ -54,6 +55,8 @@ class CodeGeneratorRequest end class CodeGeneratorResponse + FEATURE_PROTO3_OPTIONAL = 1 + class File optional :string, :name, 1 optional :string, :insertion_point, 2 @@ -61,6 +64,7 @@ class File end optional :string, :error, 1 + optional :int32, :supported_features, 2 repeated ::Google::Protobuf::Compiler::CodeGeneratorResponse::File, :file, 15 end diff --git a/gapic-generator/lib/google/protobuf/descriptor.pb.rb b/gapic-generator/lib/google/protobuf/descriptor.pb.rb index ed8b16615..c3100bca9 100644 --- a/gapic-generator/lib/google/protobuf/descriptor.pb.rb +++ b/gapic-generator/lib/google/protobuf/descriptor.pb.rb @@ -190,6 +190,7 @@ class FieldDescriptorProto optional :int32, :oneof_index, 9 optional :string, :json_name, 10 optional ::Google::Protobuf::FieldOptions, :options, 8 + optional :bool, :proto3_optional, 17 end class OneofDescriptorProto diff --git a/gapic-generator/templates/default/gem/gemfile.erb b/gapic-generator/templates/default/gem/gemfile.erb index bfdc959f6..fb9cea0d9 100644 --- a/gapic-generator/templates/default/gem/gemfile.erb +++ b/gapic-generator/templates/default/gem/gemfile.erb @@ -2,6 +2,3 @@ source "https://rubygems.org" gemspec - -# google-protobuf 3.12.0 requires Ruby 2.5 or later, so pin to 3.11 on older Rubies -gem "google-protobuf", (RUBY_VERSION < "2.5" ? "~> 3.11.4" : "~> 3.12") diff --git a/gapic-generator/templates/default/service/test/method/_bidi.erb b/gapic-generator/templates/default/service/test/method/_bidi.erb index 71e8123ee..0cc86f8bc 100644 --- a/gapic-generator/templates/default/service/test/method/_bidi.erb +++ b/gapic-generator/templates/default/service/test/method/_bidi.erb @@ -93,6 +93,12 @@ def test_<%= method.name %> <%- else -%> assert_equal <%= field.default_value %>, r.<%= field.name %> <%- end -%> + <%- if field.oneof? && !field.proto3_optional? -%> + assert_equal :<%= field.name %>, r.<%= field.oneof_name %> + <%- end -%> + <%- if field.proto3_optional? -%> + assert r.has_<%= field.name %>? + <%- end -%> <%- end -%> end end diff --git a/gapic-generator/templates/default/service/test/method/_client.erb b/gapic-generator/templates/default/service/test/method/_client.erb index 4602cccbf..3215fc308 100644 --- a/gapic-generator/templates/default/service/test/method/_client.erb +++ b/gapic-generator/templates/default/service/test/method/_client.erb @@ -77,6 +77,12 @@ def test_<%= method.name %> <%- else -%> assert_equal <%= field.default_value %>, r.<%= field.name %> <%- end -%> + <%- if field.oneof? && !field.proto3_optional? -%> + assert_equal :<%= field.name %>, r.<%= field.oneof_name %> + <%- end -%> + <%- if field.proto3_optional? -%> + assert r.has_<%= field.name %>? + <%- end -%> <%- end -%> end end diff --git a/gapic-generator/templates/default/service/test/method/_normal.erb b/gapic-generator/templates/default/service/test/method/_normal.erb index 8a315ae5b..d470cf97a 100644 --- a/gapic-generator/templates/default/service/test/method/_normal.erb +++ b/gapic-generator/templates/default/service/test/method/_normal.erb @@ -26,6 +26,12 @@ def test_<%= method.name %> <%- else -%> assert_equal <%= field.default_value %>, request.<%= field.name %> <%- end -%> + <%- if field.oneof? && !field.proto3_optional? -%> + assert_equal :<%= field.name %>, request.<%= field.oneof_name %> + <%- end -%> + <%- if field.proto3_optional? -%> + assert request.has_<%= field.name %>? + <%- end -%> <%- end -%> refute_nil options end diff --git a/gapic-generator/templates/default/service/test/method/_server.erb b/gapic-generator/templates/default/service/test/method/_server.erb index f096d8c8c..c85929733 100644 --- a/gapic-generator/templates/default/service/test/method/_server.erb +++ b/gapic-generator/templates/default/service/test/method/_server.erb @@ -24,6 +24,12 @@ def test_<%= method.name %> <%- else -%> assert_equal <%= field.default_value %>, request.<%= field.name %> <%- end -%> + <%- if field.oneof? && !field.proto3_optional? -%> + assert_equal :<%= field.name %>, request.<%= field.oneof_name %> + <%- end -%> + <%- if field.proto3_optional? -%> + assert request.has_<%= field.name %>? + <%- end -%> <%- end -%> refute_nil options end diff --git a/gapic-generator/test/gapic/annotations/enum_test.rb b/gapic-generator/test/gapic/annotations/enum_test.rb index b00246e73..ce8a29011 100644 --- a/gapic-generator/test/gapic/annotations/enum_test.rb +++ b/gapic-generator/test/gapic/annotations/enum_test.rb @@ -22,7 +22,7 @@ def test_enum message = garbage.messages.find { |s| s.name == "TypicalGarbage" } refute_nil message - assert_equal 21, message.fields.count + assert_equal 22, message.fields.count assert_equal "enum", message.fields[12].name assert_equal Google::Protobuf::FieldDescriptorProto::Type::TYPE_ENUM, message.fields[12].type diff --git a/gapic-generator/test/gapic/annotations/field_test.rb b/gapic-generator/test/gapic/annotations/field_test.rb index e3b92f478..456fab966 100644 --- a/gapic-generator/test/gapic/annotations/field_test.rb +++ b/gapic-generator/test/gapic/annotations/field_test.rb @@ -22,7 +22,7 @@ def test_garbage_TypicalGarbage message = garbage.messages.find { |s| s.name == "TypicalGarbage" } refute_nil message - assert_equal 21, message.fields.count + assert_equal 22, message.fields.count assert_equal "name", message.fields[0].name refute_nil message.fields[0].options diff --git a/gapic-generator/test/gapic/presenters/field_presenter_showcase_test.rb b/gapic-generator/test/gapic/presenters/field_presenter_showcase_test.rb index a51fd73c2..c15853b93 100644 --- a/gapic-generator/test/gapic/presenters/field_presenter_showcase_test.rb +++ b/gapic-generator/test/gapic/presenters/field_presenter_showcase_test.rb @@ -37,6 +37,21 @@ def test_showcase_User_name_field assert_nil fp.type_name_full end + def test_showcase_User_name_field + fp = field_presenter :showcase, "google.showcase.v1beta1.User", "age" + + assert_equal "age", fp.name + assert_equal "@!attribute [rw] age", fp.doc_attribute_type + assert_equal "::Integer", fp.output_doc_types + assert_equal "The age of the use in years.\n", fp.doc_description + assert_equal "42", fp.default_value + assert_equal "", fp.type_name + assert_nil fp.type_name_full + assert fp.proto3_optional? + assert fp.oneof? + assert_equal "_age", fp.oneof_name + end + def test_showcase_User_create_time_field fp = field_presenter :showcase, "google.showcase.v1beta1.User", "create_time" diff --git a/gapic-generator/test/gapic/presenters/field_presenter_test.rb b/gapic-generator/test/gapic/presenters/field_presenter_test.rb index 8a4cd012c..f8d07df30 100644 --- a/gapic-generator/test/gapic/presenters/field_presenter_test.rb +++ b/gapic-generator/test/gapic/presenters/field_presenter_test.rb @@ -125,10 +125,12 @@ def test_typical_garbage_oneof_singular_field assert_equal "\"hello world\"", fp.default_value assert_equal "", fp.type_name assert_nil fp.type_name_full + refute fp.proto3_optional? assert fp.oneof? + assert_equal "oneof_singular", fp.oneof_name end - def test_typical_garbage_enum_field + def test_typical_garbage_oneof_enum_field fp = typical_garbage "oneof_multiple_enum" assert_equal "oneof_multiple_enum", fp.name @@ -138,6 +140,23 @@ def test_typical_garbage_enum_field assert_equal ":DEFAULT_GARBAGE", fp.default_value assert_equal ".endless.trash.forever.GarbageEnum", fp.type_name assert_equal "::So::Much::Trash::GarbageEnum", fp.type_name_full + refute fp.proto3_optional? + assert fp.oneof? + assert_equal "oneof_multiple", fp.oneof_name + end + + def test_typical_garbage_proto3_optional_field + fp = typical_garbage "optional_int32" + + assert_equal "optional_int32", fp.name + assert_equal "@!attribute [rw] optional_int32", fp.doc_attribute_type + assert_equal "::Integer", fp.output_doc_types + assert_nil fp.doc_description + assert_equal "42", fp.default_value + assert_equal "", fp.type_name + assert_nil fp.type_name_full + assert fp.proto3_optional? assert fp.oneof? + assert_equal "_optional_int32", fp.oneof_name end end diff --git a/gapic-generator/test/gapic/presenters/method_presenter_test.rb b/gapic-generator/test/gapic/presenters/method_presenter_test.rb index 1819ff2ce..55ffac955 100644 --- a/gapic-generator/test/gapic/presenters/method_presenter_test.rb +++ b/gapic-generator/test/gapic/presenters/method_presenter_test.rb @@ -36,9 +36,13 @@ def test_garbage_GetSpecificGarbage def test_garbage_GetTypical presenter = method_presenter :garbage, "GarbageService", "GetTypicalGarbage" + non_oneof_fields = 14 + oneof_fields = 8 + oneof_groups = 4 + assert_equal "get_typical_garbage", presenter.name - assert_equal 21, presenter.fields.length - assert_equal 17, presenter.fields_with_first_oneof.length + assert_equal (non_oneof_fields + oneof_fields), presenter.fields.length + assert_equal (non_oneof_fields + oneof_groups), presenter.fields_with_first_oneof.length end def test_garbage_GetNestedGarbage diff --git a/gapic-generator/test/gapic/presenters/service/showcase_messaging_test.rb b/gapic-generator/test/gapic/presenters/service/showcase_messaging_test.rb index bb7eb35d5..a376e15ee 100644 --- a/gapic-generator/test/gapic/presenters/service/showcase_messaging_test.rb +++ b/gapic-generator/test/gapic/presenters/service/showcase_messaging_test.rb @@ -36,7 +36,7 @@ def test_references refute_empty presenter.references presenter.references.each { |ref| assert_kind_of Gapic::Presenters::ResourcePresenter, ref } assert_equal ["Blurb", "Room", "User"], presenter.references.map(&:name) - assert_equal ["rooms/{room_id}/blurbs/{blurb_id}", "rooms/{room_id}", "users/{user_id}"], presenter.references.map(&:patterns).map(&:first).map(&:pattern) + assert_equal ["users/{user_id}/profile/blurbs/legacy/{legacy_user_id}~{blurb_id}", "rooms/{room_id}", "users/{user_id}"], presenter.references.map(&:patterns).map(&:first).map(&:pattern) end def test_proto_service_name_full diff --git a/shared/Gemfile b/shared/Gemfile index e5ea35cc5..1bded2013 100644 --- a/shared/Gemfile +++ b/shared/Gemfile @@ -5,7 +5,7 @@ source "https://rubygems.org" gem "gapic-common", path: "../gapic-common" gem "gapic-generator", path: "../gapic-generator" gem "google-style", "~> 1.24.0" -gem "grpc-tools", "~> 1.18" +gem "grpc-tools", "~> 1.30.0.pre1" gem "minitest", "~> 5.0" gem "minitest-autotest", "~> 1.0" gem "minitest-focus", "~> 1.0" diff --git a/shared/Rakefile b/shared/Rakefile index f9ab99f78..4fc1561f6 100644 --- a/shared/Rakefile +++ b/shared/Rakefile @@ -161,6 +161,7 @@ def generate_input_file service Dir.mktmpdir do |tmp| protoc_cmd = [ "grpc_tools_ruby_protoc", + "--experimental_allow_proto3_optional=1", "-I ../shared/api-common-protos", "-I ../shared/googleapis", "-I ../shared/protos", diff --git a/shared/input/garbage_desc.bin b/shared/input/garbage_desc.bin index 53c1763dcd91281c2c0cbca124d9f634f0ce593e..68c9a5e5f702080dfa2825f9255c04264cdcd2ff 100644 GIT binary patch delta 15984 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 KWRyL2>;DJZjpH2v delta 14455 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%0DXtEA{IrfMVDvuZ`NjTB`Wy_HL>vi+oSOaM5o3{T zg+)iqM9T&YJYptVHbBr3GtsgE6Me)?v}(Y-9-)c;o|XlUqh8qm^!LXc%@jsab=0_z zMp9HA^@_`-`(y)z9rbXbO<(O%1DM;r@UN$z{%(6F6GcpWrrH!S?Vi5rmjl7n?qMO` zXB>crQ(pMYnUAkJl}SZ`aw?OG0_Bvaulk9K*1l6->cy|`d0)KM$YzzUasI-(xV$N6 zP5FClwfMtER>0O&zR&(%5`Xsz`ZzNyYmZ>j2j#qU%@v=p&YjrWH8-7RkLAR#L{OlD zhpW1;qxeNOWDsuX=!zVr8eHG6 z6a_js1UOp{r#aflV}_jaej|~qv6!DtQB4Ov2H9kX&}3|~Lnv7{(U1XB9MG1i`3&m= zS>*gJ)(~?27M`QNuu^rmEgau8s)5MHZPAGiHgMoJJA^WDn;k-%%QhOKdRCXXjWI z?DpY=HqOnQ)7?)SKC#qPbobN7OG^D}sSECQ_D0V#e(m7BoSUhm!t`FQD_(JVo3od9 zxy=6#4WZTQ6VA^>_||85@h99b#SDAYPCH%I{ja}7OJ(RHrc*#iraxDlfpJ9Qfpf4vuBPi_AqV86SmjeGY z4pzfUq5l~PG8_ng+{PA1*LP?RT9(rHv&2D}a43_5a^Vnh(6_eK0~lAeouVCQSOw`Z zoKgZU)?iAC!*mU5^q}?VFfT4ib09Ikh&~Z~(9kb32U2Q$kvWi(;|m&SybV!Dqw5?# zaOhD~xzYkCL5|XTVkA2Y%PsXqpSUOg+g9)c0eu0Td@G(v2f1i%#;+H>N{N=g~>t<%YCZkx8ey(=~eJ zoQmP-aeS$DE1GO5QAVBSC}=hPd9JVE06~79V^@_WJh>s9=e=%~O97s$>^RS>Zo$6=kO+*v z5Z#{5ue#=f6+!uNfu~FSlpPm%p}L<{CG86&LNV~@wrt)dYRl&3H5V-h<;O+KL4qz? z4$6g##4${20d$E+!(vb)ebJ8EFDP))t~NJ7P+a2r7_TbBm*~SNMd3t)W4vqh=NK=q zPG4=Kf(s5@Z5s~ClUkAHpe(5s;86ZX-{+&!96qf2d2p z&kMYlC}$wd>Y^z*{Hp3Y%RpO8ok+WrGN(?Y-AQ>%?NKrl=foz%-5AQ-08<*|x8N}lPW?+C~An`u#w=8i_L_`gxoW ztC?Yyq`hc{&>xWIa>|?;qEx-&0z$+L`VL_vPFAQt&lXt=qmSc!L@-;RBGDVFqkpB%D00+}sS3@Zz|{^NzyNUo3q{F%A*908AWu$n1>QU8m5N#x zlhfu2=ZEquuRMzA1<~8N{HB4pqgO{LG*YXGshI+V&I<$ z=hfAds$?$_rRwceRkD`|yq)%v3=rB7U7yc;U(sMxK{1+IMUJX)sLFMNz`>eSL7DeW zk@e?jZa!3blP;obK!kcM3S!aze16^S%Y;4?pb zMOHRI;wn---2j=ZMA;a*oXZ|c>MGHFw49v+tS??l@IOR9O7P)@DUy1flqxUHR!55y zeAHd5tyDBa>S`+$4UoFpN<{;tuC`LCLE5^Sqz;$1^1ypX@IOV@6!NPJ-?36T*}68G zSjb2H+gd9X&5*iQ1YNXgXn@qUbZ4z>MFXU+72Ut9ZKVb&b*(5L<9~p+Rn-2x^&)Fq z)Ft5C3)Txa;a}}LDEdL`x|`1hk*i_qtNq0WuyL$`wO z3mhBnlsrJ2qa{WBN8LBmmk(GJ(1*f*vq0^1r0fH&w??JKyrz7sUINgE{+Da3z`gD- z5pt-q?+{tLqNj@aeKP!2}{NAUh~tpP&V1FC<{0EB)!MTsh-0z%AAfj56D z9Ldsoi{R>u0U!(oR4Jkg<}E^hw5F_SZsWO5Q7hSwnwo&kB-2LO$L!Z z9C|UJfK)sZ5-zU_G(6N82ha-_Q9;)QA8oys)fQ|m8kC1INH02 zd;h-Y{`PnFndQ$$x9*ERR&PW*=NaS8=7-GekH>Fytd||PJlH(3JZQMCS5Q6G&EEX= zgfY?^?v~7NOr=v3?@rB6CsPga`o5*UF(UlEVlg~Zj%GV2Ewzo+*{@%}jtv~^#%gNr zPBg^tsZZP;Z^R!>eFxF1Z&>NZ1=;h{`WHoB{BPzKdiL;wm7#3knX7skOM~{>t*qGy z{`&gAO*HKS&uTV``npA~Z2=h^mMX{y_Uh|SbeUy&&Lc)acW^8*Vca7|xW8NMTKHGs zIm->U!!Y?8U{EYKLJ{|N*P+J@5*`h{KIi+h9yP2Ix5N#JQBXf>cx7M_)39unVU^`3 z7-FDU4`9VAqttU3$`!z?gTKyMG;6hC>1m9HX__K7J?nA9D$ntlAjW`J#l(uoNfkwG zdDa>b&j>!7J1(;(pWMRKHTmSWXSEnsuN=7zaty@u09LdZW#u__9M4*tzrw)^4CoaO zR;7DVb5yIw>gXz7|=F{v7(J^K50mA7JAl3 zEUEaN;m?ZC9aEdAPtHrG6G2t-ca?ac9bAZ|8;#O3cZ^)=de)|(@4eSnZpt^q#k5UE zSub~poEGt{Cxhg@RhcLA*&>+sB(bS*MLlavzJH=n9RphRC{}DSJnhjU&)S-wIYn53 z0qve5tk`PAWJ=V*qs5-J&9M6999WDc7%0^PShCG1@10Yt#It^#zoG;yFrZhIV8yR# z#c*kFEO_a@5yN7b*PgF_4D;GaeKoJtv$h8h+*dWd6jQh7Pc6mN?ZQ&pX@=+QGT5`Z zoklxkml2A(qqszacG}aynEL9>(>hx)3YMphUdj}MVc9d<6ksu+@(Tl4@l5^-;Ewzi zM1cXlf;L?Tt%y=h$dD$_8LXcu39JAc3eZ&$o8~zqB8rT~s9-#2c)itA?APavYbpd4 zNy-|mzkCRp1QnA3rmPW(si%B$X`h6`pvoE*{UjB1+^v;jpaN7>4Eu7orXsn!jZ&o) z1JiC&YP~@Q5_}=}uX!7%zMvUQFuY(yN~CZqGcOpias_FL(WkHbJmU$mlZnQvg&=@$#eULL??x7$$fAQ2qn!u((O+eM?kl|HG9c&OBG6oEE zJB1EV_-OXX{E5cYqng42#ZgT`<>{#54U!ZND2^JHL)?diBT$;&3MMr!o%)t$2!Y`( z?MkXvZyBX3gds4zWeoD&%Yp%=>Yd<=#xFAOXofHt-qAWx^?FD9Aq<9hjDfxkD+<>! zgAJ7m7Q(TBDy)UD@t6_mqn?84n9)~RQwXMGWKFiv%}`uX%04z&RmIjqf5sdihiIbO zPuC@zeEg65;wbhj)e&7e*8f3WqCr2IlT6gt(p)v8+E1ok@WgBGYr^tGQ=*|J;WsAc z#v5zv6HS;n#}|vznMLyxV_jD;eyJBA$~W)t`x3SOoK&MQn9CUJ&w}x;q{Y1Z8d3{k zFFB*KX;DMEE|E^wREp=-e!QVJZ?UfwOhRH)sy^ZR^Ahv!Ni_N+67iZkrIT`1Mml0{ z0@G;;Ny^C(B1Vq&Z&y;KR!x55fg~J}Y=G#5Uz=#EX-v*f!;Dlz{UV`LZOU&*rTw{y zhD2jLoq(Q;{Ast&_-C>VxvnXvbgHp7(Fljc=cJ)=yuRMAY)r)KrL9dAshc2V9)cL3 zn-ID;RZF9CO`KnwN;EYLPy01kEG0K3=EWP}HovAW-Y_>&O|e2&*wC?IOt7iFcLwgQ zUl?CRF-PL$0yWnEm(;?<{ZJ>F_M6hl`g#{;*CuPgOfgOPIqKR(I-abj>{^Hr)nN%e zUeJU;7NX5eao#E%yw z5d!R=)c^AY06qdnIAw;}X4vMU#T)35*_X)XuFY^K6=cY6z(ohEK z&Z&>jtnYYfGG4qybH~$FYs98s` zLa9Tw%0U#(kM;TEqSSqC#8jzsQR+T6Du=q2Xyt9sId2sFEy$z?XUvst&1o z*eG1_BkJqM`=l3nL;r z3OohV7e=3fl8HKsFO0#JZU-IBj)}LbhZtMN%!-Z7{~px|Kb5V!f3Q*h5Oe#v{n7DZ z61kz7Sp$N9EbKFboB$BzJuH6+H#D;%(WUVL$ZTe1ef11TZD#%Y=lC#TDGRPF9B|{( zd?xC%mgX~&AC|JR-Z>@;+ERuFX(yfP4wn6l8GEf;&lzCNV=TC7(Y&dTX$ESL9%Hg~bQm>Ak1^St0D|E$hRhj{%n5nU6Re;u z=vg!_^8^cvZXrY-Tf<~$3Ir*DB1V9qU!&*&LBEE{&J+;zYsg00Eg=eE3zMBG5SRcJ z6M3wK$<8!`$9#6F=tBTO)xu%KD2e0|Zkm z8#de>3Y){8vz`_FiWwEX{Tum7cn?m7crfs%WtsIXJdkT1CLe52J^+F^Kp_qgnr~1( z0ED;=$_IcDw?X+JOuB4jtePth1SUYmM4M+Li}?I$29Npd!Nb*TP;F$RMoXpOgUyT$ zlMl%UfQpKIu$e`!QBT3NnN6$_GFY2Pnh=!Ux-w4*(%9pbMbVg@I|OW+G`jnKwX92GdUF4<@GDKn3^|V^#90 z2`WHEMf>k577>>{m*fkZ!n!&1iis@ zY7sU>bZQYcM0Apfj$$N&>p8z?1-~_o3Agw`JToPjp9y6*WKKD;-?MO;`!@=nOL=fS z2$o))dR*y%G3anyxf~EW9A};=)qv39I76vENTu4PfV`i5ZP_&AhW9lE#s7UxLGgc| zc_O>91QhSHk)zx#CZ|9GoMmis#S>=m+ZFw?iANqXW@A9a&1IAVXO&L?L3WnKL@XO_qw}-ur7;N{EoLsa=w-dd%;i=HYPM)KL!1(73U}b)T9c``h2aiBB}(Z8a+ip2wH1?b+QzMH~v=bcY5OoRDud2s8t(O z2sy3VAbR6(&1j1XA*fYbR0u(>{qt zu*n=C`g=eK*kt*kX?Viu<^*0JpH)gXwFZn6h2-7lD7fPEfj--EMlSa20`n zJB4Bf*AaKJyMkV=-<`Tk6BL7BmnNWV+Fhn6PD+;*gJ73gHQZe-b_woiJF^>F%Zw?V znxX_0otlE~Z9C0eF)sl{r#W~Czf*Hr%(M0c=h_xe-J=O&AlRb`=t6go)*%LhJ*2~n z!VS31-52aw_tLlaX@*iT?9&W%&%4i*U8~DV!LZN7o7qvp;Nh0fWMeD#2hXgV9Gv=( zl~Vy##5__9SJ%%JUH!$CMZWSI$}oDaaaz5Bj%uqGV#hmaK!xTBzKwNnilPmH%;_P zKM8J2Oba?T-jI3IlwX@%{<>r=d;rwi)j2{=tSp5q@}gWz(Df#O~-)CSeq6cBy>;h(%py zOf;%;jfqB;4kSSAgDz8^Pk`75T_(<_v*hy#9nNQh9Z!CI#~IB}-M|^mPu;*7Gj^>c zq;BAhIYD?31mHhoUN>Dm1^*fI`WxMD!4F$|g7aH??(EV0bQ1Mwe$t^wRf-625PD2p z`wIQ3LFh3DjZ+Z(J?5xu-OUcyAIdDVvQxJWHm5AZ9fO=jJ;E|e9upDXIxe$fq8|t3 zi~0}1ONePj5V=RJVBPkrF^^c0s371W%ZD(7!$ESzaw|Bu-5G7GMd;HcKu%X&8UV@!#Z&OCvSfk+Lf2Im5_C36hFPmE`V@Lggg%9?wq$Yw zVHu!EPC$rXZ6P@+$D(+*vvtDuUvt24wJ;%iAIT1XirKii&ynMgve|qa_<5j>SMYw}LvOjT996K1VZv zH(TQaH1rmJ^SoacN$aMwLfS}w5x=|9GYas#O(+m{LxPS zSV!A7NWp--{{>jFY?GNUFVz=dqw;MoE?6z>XAzVsXzuOuh+E_e=OLto% z#!Hvt)7l=3y_j<;sk6rl74eUBQHy_Cdmd?45!7~8RpKx4agjfPZqHk29Y=Bp@y~1f zf?b`XEBED3BR}rTp9Xv&xYRj%@PYhkWa$B#_6c<$Q8MC0_QvOa?A&oe8%~??g!UaZ z>?bVwr3p)DjfF2w!f+FYpRleOr63GHVc`brBPu6Rdf7Y~#QyWl-6u6awd*G}KW(6s zmTWw*0{kZ}Sxx}Kf6|iW1Q7fuEtHe%IX#%VELL4HKIoY}Ay~1`y#r7bl_;Zky)G?> zTI4Qm2ersuRv%GgFd1^XtO`+u0U@W$sv6}|Ifzm!oEGH(f5WEJT8hJ;$#Q_FkaAj; z13*YQt;zxQL+5xo$V90eoKxih2+IIPIRHeQ&QUq&k17&H#p||MQDq4(t>>lg$7h3k z)A*d@^1~}ihgY|%Yd~PihhXB63QLjaoVN--vy5x_=|v6Gd8#aAWD)J_3&KeJ4I?io zBLQLL1y%C^vG9U25)ejSP)1Tyc99$TuSI0!MP(!qmH`SQ0ioJORr88H=kHd*N?V+( z)QSDw!fW)8pjk0#b|q*#aL+fdD3ve*z(i?4Ygpgqm%fF#RSL zQ#hJ!c`yNiG#|od4$0-kv>hL|>6n>@zv1$SwQ`hm58E=Y@Dw}`+wzzJgmMqt@|dAE zc17^s>pz%TOdelh%Topjs{n<^0U>XNEl-&e&sk*`tdkz6#&wk)?(2R=4l5y-2X=7j zrAv1NN+%3LP@o(Jh&6#N9R>)U0_8A3I4n>O1BAl@au``&Lgusx%keiXZ_!fdVy{J6 zj;DO8v>XspT9oC~eYcV2x0I0OZOU>WtO6941H$q)WqHhV*4qWoNXx0?UT>p^`y<_! z#K`jY>`xCJH)gjhoiGSN?aFdMtZ7%4145^ETfQs-!t!=ozAOR4@^%|9OJsSBEZ-SC z`|53zcWQbvd8aZNQ)rF~HX!JCDwFAb;c0Gij7)x7nGA$gfWl-znEbRdxzux>wF};q zCetgzvv#+^@-Lz=wj>M<-tagA)Ehti|od^{Ho1f zv&B^rFcJ|1;s60eR9>~^)i@wTziRgvZ4)3o@Tx6ut^nbI*K9|;&H};%ui2$Tqde-R zB=`u=_h8fO&g3In2<`JDD)g8KAxBi`0U_jw3O&8(y@Al*dF>l2>ZLsDfFkOE5cCE` zeT9jF?|IHKyWmXrzBiT|WyfrM-+G<8CXYSaV2E=zCJ^(G=wTr}0>G%Lte%CG^pqD`DcWvAnQ&UGXFyYU(H6%BI{EPv~nV}gV z{WDoXKj7m__!_)O=LSIfXB+pT)VX-1=6g01_tZcj1QdY-giqhIBW1iP0R-23cDZO- z0KxR0jn<9-+Q#D@{0G6T-)_u&peab94{X`}c|7(X*z#%s5ELKSRl}q*@OhWb#AS@f z3pt=thTfjKG!r?a%l5=Y4km-C%f?L|%*wznz*DyTRs#gP02LK=W~Xe~<>M)+PT8g6 z!UK@6#kU&aAuRpSmY)k@q=1Tvdaw_*Qq+TeXlLZT1!jZlL+xx#{>WzHUc_T`6A7rO zsLlFFD@ASAM|P=-47FJwQ7#Cj5SY`p{0!rXR!TEXq#MW6S}Wd5*`D|ggV~@uZR0!4 zpA4jS8G0GJ;M3sAxBnPBPv!gHOOY65lo%VbEB@!9@Ld}msUrpb>vv~5u-4FlbdHL~J~DF2NT{jA{j)PlyE z#0{zJn3FLlgQwbLO73n)76USf(!1L!ADXj}GP>JAf>SY|8Ni=7)~MVB%5e;6PRjC6 z@;NEbKXJ;d_>v6g;3OkP=19TO<5&}Nq?GO$(4>^`J^7@R@;y%Z7`+6XJe{ER!-^mxx-e3M7jZE_UHH+xBE-_?JO{fxEfqJvpRECS;R+S z(Nz_HK7fT+Rs8t?1YK3}=L3lURTY0RfN)=>_|KHG!10TaHMHV-e?~2S%$39sS;UWj z@MD~y=-i~~cq+U~>nR6+5t8BO1AKk?AnsK@03Ci2!bfxZ^)n4XU~?!~aqfYen)8_` zk(xtt@9=qGY7WU?6Yv2rHHT2Pk1M}mV0kE*@$ret%k!xyf0pM{QT{9s$)6Jt6;;aR fAzT}t2)k>i{oNR_cR_wm?V-gdG9FowTCZ9$LHYnbzrZz%5Oqpn%#q?K0C= zq6uIF26$kMO`;Ma$~v*Mnd6zpkws+*2xtu8K}4Z(Xb9Ud*l3*JcbB@=`76J>{J!;m z?|b*v%J*V_{Eyh887$g5lZ|#xe#cXfk6!7Cmp#8Qd~Hl&cvD45>W*utved!r=D2K0 zs`AEHI2##$KfagiK3F+pcBO#8}9k-N?yalvmgD- z7{|>DL=DUB>F4^c0Adm*4CDm6_4LR1T!_G%$FkbPuBlg!n#Ur2{5)UaFDvj~VEj$y z$UVTIc!6a{{a^VWO>;&X59UgXI!0zy{iqfC1t)eE zydExoxIFoKCR-HCUMDsau2>*eWcnut)iGdIk736O7Fdtw2BJALb8@i*1J*sc*wM`5 zIwc-~NAm))l8GK^2j*c51`>7vTUN5d?rF911JRPXBOg03V0YwWM+@y3r0tCd;*IdN zM~0NVk*R$g%ibXE&9X$;_{iWeK0}OOmANi~b*q$>bjn!Zt!8{f`jpY>Sk1Cy{!l56 z(J5OS-aTV@a;?o2jDlq?>t@Vg9NX4eGl12A$t?_E$GXfN!0R)25CsP84mxn_X-ACe zL6S6SWxTg42RsXh3D7qX2d0%pRe=$libX36x|>;?)mGN4NKuibw;AuFCn1xdVPar< zn?>VhRxVETNE!^Pw^>ndO$8lORw)iDKtsiGCR3J*p9bj2sgbh#k zOCF%d9;LZUS$@zY6cG3U6+a*}J!muq1ph&k<$&NnXtLa;Y&&E$1p*VGVPeqqkkND? zrsZm_Dj=v1k*b66fc66KOP2K=3-5oXJozPysNDBR)gwk#AP4|d0sx`v5u+*~_>UM> z0l|O7sOpibM;X6Dx(x_SfQE@wJ<6i}hDFs0#4MP;VLke4COU!NuzqF!21;1ZK?m|T#ygo))Wl2wxpLM+Q%fHWYyU7H zeBMu66x7q?^wo40 zJTmtJ3!nPKnu-h7MO0TVu&6peSOby^tazAqkt6q9G18wQ8DQ8Y7C!Lo%!*5vfy&Ay z8+j@#m&}p&IF*%4lv$&ZS=oX2JKsPVr5f+yG*4A0u!KNB9C>M%8|shT%Ay-7Z6lkrqX9qVpVZISULg-RDgzx z603?wRqezqn5uXmm4$#{s^S9&`2%2cB=Bl@)(e~!buXPTb@r6sP5;f**`<}?wN(Yl z8XoB@^Eg62sO9=;2Ly3|N*o|GujTq_2MBSsTtDpqA+8n=63v9kIh+rdibtdm01Xoz zt~oqfDrb|JmaF>>GOIx~hYua5so;ZooDbBK5nC9`Keg=YR9v@Kd zkAe?!0&fA&!fQoQ*+2MTVs*)+1w2wL#pRF>78)M_K^&kG2M8Z5G(G@?xP`_CfDpHk zd{9rho*!fS?PY(S?I) ziDe>bOL$Oh7K3RCFYQN6{{$+)rJR@RSqD^rhKkPLQXW+=PFM@7rM#Dl51`!Je}I3h zR0><`!(q?gHmTkc(DAG1x-rP%bo}ah+z`<5tLGq~_cF}ld05ZOuQrh02>7V0G(DIa z!d=hbc29$)r)PeHrKe|pgQcfueuJfVLEm8MUC=iW{f0awfggB(;aUHgdbH+>?D$`J zq`<#GvGOVGTf%koFIH?ZVlf7>Ta1SRA$AK7ROJSQ*ex8D`+ch1KKXxV>d1oetYW97 zpm6WB6cp~AJW$DuEuh%RhYa0e!orr`Wgi_y|ovv2W+2t~3zz z?R?Ax`6l6Whx(LuKK2&>xbgvV<8bPmMbp^5hphxkj>A?0CC6bNH$I@`ILwErVlPV- z;P4795Y-y+nsNReWB|RNALab7;af{?PaNgh1^xs)3^7dM`#N;PpO$@%gDxLFaug2z zn#Xee+w?MsJ{HalCzc)K`jv{7(QCpnjyF!T4ET815l&1V=lWfimeFxM&hhq3htsF9 zoZ$Qht*8sr0o94ZBu>-`uA4GI2tL7ksuKVRn@{jTCTNtgCv4CtV^2`fjz*PN!PUuA zYnD!7Kk2k0sEh5isYP9Er>P`9r!KaWm-O>Lg@2$eIJYpkAjlUD1T4AXYpjzSR*G``&K()dt8{qFyQ~|C`!vB74SH&vJ5P)HoWeC8q z$_Y#v3Ba(*88*V-tQZRD7G?YETgR`p3O{@cunqzR}@%>g?yB%x`p}xk^Y5J&-dYHcA-7 zVSk2cbKH1)AODa>F#&9uq-N{-EFBCS03b(+l)yVg_>>VKmcM>n-f=UsovwD zEu}675C@{o(GMy>9Edgt52};o{3vw;`@$`&PEFot`KcM$XZfia*yqGYYC>uT_BmH7 z4}t*v`<$`2npyDgb8ejApH}>^wIhtab>^N9%TJG_4$DtEbeNJ6m7PL|gR2pxKXnQn zPRS?(!QbHw9qGU3N&TTrr<3~i>VD3+PAh?$g-$DhnuSg$uDb82Y!o}4KE-(Da6}Z5 zJL`n+tScXJ)``ZH7#Xrm2s0!s(L2sLp|`&DigR`cc_|ZOhlF=ZHBpo=I^kDae-<{a z_r_hcn&JWhGdew^vLn4{(i0HoU8MA!L~>!&cMg3*_(haHA$(_269~cqRcZo4_;-|= zlwmQvM><)b3zcD1J->G%g?=+tqZlvEd~xp>ji%5gq{=p1>vaG@=L{Y0(Yn-Xmv163e*UZUla~* zEl%P;bu}PoU`36{&67y;l)TsU1~?`J*=Y6`hyNcozPEftf56Bu5L;I;g34<$18MbVb{MSdy}_X!|5n)wZ5aHxK-%8SZtv^0(Y^> za0iBO6}^TU2*bAu+-9AiViKbl%N^m+P5(1#hvlcPeTU_zu6>8l{Reh{e}~Y;1Q7f? zgf1q4;NKxoOm39)U}_6zy+3|(o292$x;9Hs4RV`RpBm&g(L)uM7^eogO%$op3kdo) zQ9jhC8W5ul*ej?8+>HNW%3dqQlXJQXU=~vL3jL4*gp|EPR{`pVJ{432M#rcMd@A$< z3JBW(RTTh4cs>=V0)0?CVkmR%VetojC$`f8k?xjNE)!ydgj6|RV+bZ-$RVK(0mQaL#t=Xla>y7$ZP#IG$j@`hki*6hAZ!Cv zh5$mZ!(<5Ql^1wliL47+FY2|v5_mm+0D9$-UdO`J=HL9}m{AF1kaNsL5D+_#iMYCr z0)$G(1a9(=QHtf!xjZStUu`*_JZUND{GYTGbl^^!9K#k+oHRKGh$J{^atshjaFTM2 z9vyjz!YRRX%YxE}D}P@(t8&((_gBuoe+It!`LcD$qt@XRMQ8|x2oSO)))20ckm8U> z2k;EV;g{piSZyiM&X^cr4H(Xt7yv@sGbRSqxt^CXxHFGpaNfiK2-^Tv3;-eOyoo`6 z;9V41&$;T6Le1($5$WmwAGt7}f^b=c!H1V7Up7i%5Rxt%7Xo6>W#d9XD0SJm5D+fB zY+MKk7hWb8lF|8OPnSx*4Ig=zg-=k`RJaB)vi82 z`O;)SWilX4u6A|W#RIR#&3Z|jOzm}zi$3iDU5LcVaDl z#GX1=S0+HHQ|Ib8BS4s3=jt~jK$u+T;?0Omj+4nt!XsO6ACG@gIhI%|$q2q8;cT{-9#VHs@x^)KQS>t)7pAnXEEh6BRzWybJC;Jxf-y{iqUmw}hvNH@Qo z3{Q~Z&8f>fJJ@~AMkfqHP_r={5PO=9;egPo*%%H8!<&uafH1t73_nB3l%W3MO_#3? zNAK>uD>eT$I;P-UB&tA2DM z2cW?=x3Ji5f#%y>+zC?~M=P-4Ls#@qFCcGYKyxN(1xP<6E9j>#a*N!9H|X>LNI!IO z4NARAKx%&Ma&-$01VTU+K0rA3V>enLACrLK`q(X0O$s2GK6cTp$#2tv?AdpPvp#D| z?y?l5&@NZ^dx6Y=U9P?p00hM@w|t;h20m|dxw?f3WRwAoGW538W|_ztZEm1$aIhFm zZ7#0pU{(@#0q%D7mlz<}1!$1yi<$_WQ zf!XWok1T=eqAb%Gx@z2OwUTX=8>p`=SPiPZF21rHWJv7-^fzwS!SKI6KM+4arTn=B z5~F|;qc+vjQ4_hZ*3&v-5OQlhoe+S~vDPb8?K&WcYdw4op;w*)IvaC5e!x?&Jiu5z z$HNhMJ{$QAOfs5MbHA!}l1+F|ktr&Np?;I6KYhvp>}>K1R85lukksU%rcqYQ0o0Br zug@?)?nm?hlBvln9_sJoS{g`NJTbiJ1713Q#*>v#&n}%-IlFY~Q zDnW_clBon0ua-y53T0mL;c_t_2`R86?x!jVJ9Fk=4kTfYc zIy`Y@nv~KV1D2E$z9W;AQoh409AUSBv%?!Tnr=S0D8%mqJpBHT6@AGvKI1(xExh~m zq5LnsNH6~>WJ@9C!qM=?&S&mBYSIm3NVlV2w41CyfDm=m>#jai0YcDG51*+h-3lq) zzV`Teoo>Kb{WX5C=-1J&%z#P6@vz64#nX-(i{vOQI&K0j2e9$D3A7x5pyMXcasYuo zZUU_a5ZB`r=sUG6aD3~9@w30Y_1jEglvUpv_t8$us&Bo*66roU0Ab&H`1Vad2&4fp zpYp<%vrql>R3;N;%&APZDPvA~`u72HBbZKksLzLt12AyT3#Xj>;)ZjXRFo*^GN~w0 n&UyM*0YpV5@tlYIz%L?x{RdC7;^*tn&#gbtHrAi#3y1taMMf&Z diff --git a/shared/input/grpc_service_config_desc.bin b/shared/input/grpc_service_config_desc.bin index 00b76fed24653b5cdfdb0e548ae1169a32cb66bf..3769452ce191bddcf33b3f8a8d97f773c7d22bdc 100644 GIT binary patch delta 12085 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 diff --git a/shared/input/language_v1_desc.bin b/shared/input/language_v1_desc.bin index b5c37bea4472edca110a9dfee8338e52175d4f0b..f55a256ac34f2f9dcdaa55066ddf448f51e9ceb6 100644 GIT binary patch delta 12074 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 T!A~N7adu8ue~ diff --git a/shared/input/language_v1beta1_desc.bin b/shared/input/language_v1beta1_desc.bin index 41fd0ba1e2fb15dfbf8c829cc445205fcfad7424..54a5aa4f24d2054b28131a11d7f6887942d7cfc0 100644 GIT binary patch delta 12031 zcmZWvdvsLQxzE|>G0B-pGC2tkLx4jdAWuQmRwcDqtvLO@Pcumb+ zK{9c7V{liZ1%I>-97?OMu~IE_GJl&|Q5b#kf0$d~*`xB7Mlu!Cm-RCihFfaa8*Sl? z;EoAxM&UrW(6ueo&NDm;yv$ z6zKu1SZ0)X?p(P7ctzMVYu;@u3`CFPq>cW!p z-y8mIiMsK%L1V-0hEx!aZuosA9%u&_U}=|8QtFPED_zf88&>@6vdXo&X1JKP)+p`g z4wuuSp7nG%`)5_@r*qk&nD#WWsc^+SYhA8?Vo)6eTJ;!KtTR0A(L&E!pPM;_Sb+iU zoqyipc;|#)!t%Q$D$5K%g+FGDi6zNd+BuXr&ma z02LL(R^6egNbU}!L@C9HVtY5 zDo_UuuUzV2gW!NMc!=9Abb!K#GH*0bHmVP43I`O2GzC?xLxwk0QaGSEWK<4!9} zR#m>fz@IkD$AKD*^HcQ=tv>!Id~q!MmFl>zoZ$bcK1k{(vl@cNTAHh7jPn~(E_f0( z_q1Yp&>AFb0>34wOSIHB2CbMl%NL7M>3Pk;1lJXe|I!x_WsWjp#q2q)DgW*O{~Mc< zb$+S|dNd^iFs7PZzqO$b4F!!hK_#hqO=CllOo6LDk<#jL@rmmz+`AIxm^34^j;^mE!q0Kas4>S?ntX8z8Z@sWEW<*}?3)gBJhN zAW>7VbW*NLOGnfNm`+PbQdWi#F?xdkeI-?D)#?ZLHNX)KNr(>o+MudO@6W|<<|wtpe2zCpyxb)>WpdsOqM3swPuxWYN-uc;E=?u6f{mWHu{wG%DNB`L#_!YjRY|ufbv|xiy%bNWyJ?O?@I+7mTA=AuH0* zF*&{^Xr_s^|3VA}<|gJ*5+IYZk(=P(+%z}%IrM8t`K_sj#zq%@sBNeL0|hzov$AS~ zRHC7g(rqqcR*xn0cup(+n2R1X@GH|Q5HPWY{58Sl(f4Z-NlG)!oi(SCCrC@voMi3z z6#U%WK$!=o2|UB#hQ?q5cT7!FvK4VbzR&aLBJ_0)KM(%RsNDE+|HIDKrg1)OqHs3N zsjDZ`ka!fomf+qw4TuRgRMWqCf)bS`2CdCOO#|XJ&u^IB+|-hSuc3ZT0{U}Jn-eW$ zHLMy%TQfjp8)hM&)7j0N$m$74!1y3JXZAQ`FsZ_GS_VVK6aiF8DbkdZV+M8hmuCxs zOc3M)H>EX5K^dq!t1(eGj_a3}3eJNMkSw*(UxpHyF5d+Fxecj$|EIT1z5d2q?wUU1 zwrSIEoqEepA&&ZaR4>#%l&>sA6+NxbBNw&rv=LXe&qeJ!ZB&kME79%So@0GtsKUF6t5cmNFKOp!&RaF`g{GY0091#4Us$<-y6SWv$8pA5xZFE*UCf>XrVr&sJ%e$EWJ*pgj zQ>O9f!wl~s<_>Zz&;nu-xuK1PYv&HWv5i?V-r@3LIG~LciiV93Kw29s9jIqOUK<-! zk!8Y!g)B7g8+^mUTqbI{7UnXM2Ntr@{#hmp*FuI~X)_)04jHnPg?Hb#rFtpL8c)sA zQWh0W0p@^YDH}Xi8gKG76E1TbIRpH*oQ2<-H@kYdW}seaIg?$a!>CtU&Sakg2!`bh zIWq}46Y-oUSYBuN*Lf4uPq2K^IYh`;E17IkfglA?L%pBa|{7j9tnd0R$>QMMWvo!J?ue z#8WVJunLi1fMDuiBS*O-U~|6btY&$?Vn%s?{|0_4-i<>c5mx?ZX?iuwAHp@yCm*a) zJ^+F^Kp_qgny*nl0EDcv~o9MR{Aqia1`2)-QooQTts~;xPU(a-Eu>4Z@ zuM{+w;(s(;weVc^Q6(Q^kbhLU8W8f2GEWp|K*&GJP@MNsads&X?_~}xnrc+Przt4z z?`aB(`+Lk2S&b#2c#n-9sFR3?va!yO2EIFqoP?0{z;>rhQtIA-BM-wAzAwTvkAAcA3+#A)3h_}m z^a~a%bZ?T=Ao@c1qh-@7FEDvqMAPW1;{wBFnwkcDG2FjwTKXcB*K{j$*z@(+AtkZY%M&*)|zk1cTPYEo^K8mTLBO@&o@V@pi%11H?u*b)SYi4Xvd?% ztKeE>W>!8{V|;Cq7D4ami%fa;xs2Y?7n!o807AqfbLcSlE%*o8g0tPsT(#l{EZwd- z=qjNr51rXGs4Jv?~4s8&< z>vyEJMFkMlp)D$apbm1pum~3cohDOSP-6|K1i28@sRdDE-D$>EfT^+WG)IY!&}A;< zbedyCuJi|npicA3YuvM<_~4>+Z8&7*-+r=I3y4C%S}h<70c*{;xW#c<6avWL|vG=CxZH|YeWOWIAQrwUgg_%~4~rg0r{ zKf5Koq~qJwTQort2)1Yfy0YD3dg5GkSrG`fm{p_P6=Ij*zP3B_tBz7*O1Gvc21U1~ zpgY`dGh4!oLD6jv8_qA&T!#DGonc?+{OX;WAP$0^njj8>omz)D2zHVVFA6u{8h3ZN z^~sm2cWZ_cFznV0biupZls&4;O2DwFe#!QkO~FWmgg*RS8F89XrT(+nOM_L-il z9v&F>nPbPh`vpU(XT4&w5#^b1+b{j_kE_>C1ynIF1=TB>suWbOXn&M~>J{?G{X8aR zo^{Y<*OVv2-|o9IJiX?IDS(Qp3{~l%8C9oY8JG^5Lnq4&ECbU)^Qx=eMTToyv{~K= zXLmi4e#4Yso?QOr2~gYs1ERXVVdBeElonu<|JGzhVkZ`$y8qUU77FeHI)`&17IGNF z=@IpuH_g1qErZk0rg_uM@9+N6hCxw&WcOt5Tl+SJsQE1nr_5mOk^_X$dmdZ6I z+EVIb0I?5xOnE*5VjuLFIG;|D^P|)RoD8=$clz5)57iotm0 zFs&#e_lOmCZK@joh!u?q0v@tl2s1bwDpxGF!oE%Z_{Dk!c_|lS1&7nQnyAIg!dv%$ z`}!z-rL>l5RdF`}DAN*8L9@(~X$c5bmsv>5nIsrit+2xH20sk_&GxhvmQ2kkPfb9P znt%|#!a{0NhQ;t6Y2}@f8Ae6(2`j(MT}MSIMtw+UCb_xFNOvloFbJJGE&1{Xh&7#- z{Hy>7ojNVNK2U%F5ui?MkZ8aF5ui?MmwcjAi%ES8Zs!IGNJ~Q$s(Cs%C8pqMxLHw)Q?r>Z8 z*vj3x)5wpzbEg6C#k785$@c!k_U29{YxmOBGt`5`$dF^1o44QV+PyoSy+>!+a5d6n26qM^YJ(zmJAMc(zvq#g@Yh90~r{1_nt53agk2OFP zml&hoxW_6NOf$(d4oGB-?2!|f1Du8JaaY9uAK!`Y@ssMFC zAM+|ODQ08$e5}d<5S9UoG60C!d`xAa0>vYSI@cRU{(H#Hy{c%%c$v$ESim9GjY7}) z#LD|j)(vWgKB2lnb`;XCJdNUsawn!R^_?Sj$>V-Rye zg%1!bE?9AK9R&!DE?D?J*+cnNL>qH~9ag{i!OR7=JWntPiUqbjPXPHOnP7mRSYXQp z14ITauw{Y)A_ErKNH97(iV%f18)wI$$wky9wAu2=0Rm|*gv}h1!;5H}J#2^5_kZhp z{0)yktd*mrdf1jH2%duHVOyRcfKcvXTb>})pf0iL1esn$xwFKUM+gv>0ScD`Lf{fx z9wEh^v&_zWQo5Xa(q(r3K=(89STXrLw8Jl7`uz4#DTP5u3YEtIu_m;o#{i*Js5}M; zkA=!(fbdvI9wXC>$)0vHea4h_%};l8?aFA(;gh7%fZ%UeMpH}O$&J3Xn2hdJMgw6P zpfDN`Mt3Ts8(rAS7*6MgwBaMrAZ0 zl-g*^S0F$bz0sDhK!7lMqm5S}GCEF1Z|3n1|M9AG?Pe{54BxB_$2>k!8V(2J-jF6!@{0l00CqBVLi8 z3egS$!UM0`@;(X>9(c`m#7in5Jn))bG9t#KUP6Koid~MsA?BbKL%aN-iaVY{%t5uw z0U_p~iaWi)z0MQ<15ww zQdi{BXPjd;`%5Nv_*+K$nC*(6DPf!<^Nwv*^2l%ur7!hy4 zBQ@W(nYeQX0wJIXARs*Zt{pAq4F@2&-nGj_I|2x%cWtz0{6{n%Z_wWlfBd_y^!u8E z6nfv5-JQpC;C)-Z_ydCCeYExUL;1=R<3iMY-HnYi`v7~L}hDk|!wKGI52FZGdKq9Q}R)JK#HLMa61 zge^a*cnsM=P%%xW`@|DkE8a8Np7^GM*`PXMMh!-4S z%E~-HD0W7?z0?h{?=%NZVA3&flsz8eY#PuQtdb*Sajt3**`BO7) zd@v&2M-wTl9*oF1^8r4wY$$ghAAqn2Blx6Ezg(sPFt-#LBk%Eh@a0^$9}7nSHj&@Qyq>9jLlinStwP^mARRdq&h zg5g!5fgBLykT?({iab`lTDsa*sytL40U;U#xKJacI23|F87vy+_wC2sxA`l-efIbJ z9{bzh{?0!4>N4--d~e0$EZY188!JwK%l+^#7y75xjGga^mps2PeDB7>Fn?T+)a^Gu z#!|;8EOc3IYUV93b2hs6);_K~Yx>-IsghfZbEEsWb3Z3=2WMUMQd92!T@SV(Y<=ie zUd_TMcK>^LaHcz|n&tNPbA4AhZWap!V8TF7ut#ryyw8OQyu~c5E#$MtUALG;iv2ua z;4drimN5Q0bEFI~D3-A7sQ**nqsKfe5X+b-ESenNKetaff7T5@1I+jH{cQCZI+n4Z z0CZ|T5UZK!ktTORj)AxxfW&H6P?$Ey3&e|= z5*{QlU?n_AyqK1li%@0EKs08iNiHNXU}KRBiAEOJ>;DMC zmludvndp^{Rvtt!kgx*~d6gCROq-P-h^9=5d`MuxO5{VLi6jPVf8&98E$n)vd_Wvi zU(56$j;XJa2WDy_T=&S3+Y*?!A#+{=^EN0?X@9Z6+sOFV^!}plu#siQ{9#ffqy4oh zyl3u+%rIY-W9m6cuTDi}7Op5IPAOCI+UrSTt^) z%E^gdGYtmSTdb(Brh<(rYZM0+prPW}gegl!dQ&W6jN)KQkx^?IIY@9@c;727O> z1BPuZny-~pP1(lcg$9xc>($%e#w7!^Z%^%fbOM{W-BJknv)x7pD-IZ#FbYs?XV>)e zpO*}nyCb~u@yd!FmcXS!OF*S(2Mda{4K4_Fu##*1W@Q5m-jn+KHc+W*wQ-1mp_N@zs+Sd2>J!EXY6Ei+SU|I^Iq>ll7VTx8g6R|1 z+jx@$rccP5GM`5feD4U$`Yfz}rhoDX9cz@#F6Hu3lQux$2UPrku=J?06cGGJO)dk1 z|ES4jmvZWuu@neQfQE^|(qqQbL3k`@Yf}M1b&O0Mj04yUyw6$Iw=A6TYX}sb3gV0m1);F%=N}Ul>z8GPQ&8Q8H{mU;;EuWNHVC4vCBfqnT)*onZaT{H>I*o`VkK zZ;W>_r>KFK{_FHdAD&tISh(c5f#Jsg{J!vS%8J4TcmmGlFGpwMuodLyXSl{9_A10h-Vc+LUZaF$w77a1QDKJZ}AaMg2R1%QbK6_AT8sx}H{g6bkG8LngDNXb#7{kf6{K3!(v zL(l)Z;<9C+`f=GVG1ZUDX775O>c?eDp|MDz?7;huWmScF$uY_ASVV26Y>M0WCWC;W z1yC6X2>S00Js{}6HyH#7`tMB!Wz$M_o5BqQCP2ePaqBiEB8kUxc0z4aKu~p?!ktYS zRLS`e83-Uy0U9dGph_N9MG{ZJRLP4~x&eZzk`Ef}4}{N=z^mq2OE@d)SvqCrycti< zd2r^u(&^#E%7SDyk6a@YHbOC2!1dt;1a*K)9Uv@U!1dt;2z3j%KD+>-ZUNVaSA=X? z$oU9qI1rcs4HNC6g*;j+pC<8G&h9_h%m&p$K5V!)3NcvB`5^s}VgP8UCXw@r07BhzioqJn_#6tt%JBWFy5vgBKplhTI@@mST>1G-e)Oj>GxR*TKauFP>Br@Q0(JFhxv_;q`=y@a(+|M zDknUyK+w1G@l)h0gU=mmQ`-2oll@K= z4P?ym)TtG-*)NV;4U{g&tp-Y$<2-JnLFsaw4^>BiEMR~mDzrk>aKIZT`adEE==HmU z^S_3hYwt{S@azJA3eG|d(?Wg~=7hJGeTD5W4<XWz&Yba2?Prnu~pQitC;X zbD{VY@2&O(AbdW>2b)Es96n_ijdJ)DEm}uZMHO6KJhgSz40dyuRY6T`mrXKiV!KRz z@i{fIUA$j^|6{}l)`GK}r~c)|f8)t+%Ry~yw_O@)W4mo`Q5)NBb1NHWc3U&EB_+&M z;lRVIoSSuvARK@u9MtSy)q0Y!hPvIWJg$lqAQWBYLx$;CMkLqpi3UQ^Ret?VS`m8T zN+%t6>V*M~q8uoybaZL*c@FecI_b?qy>MmHN$-{%D5`YQyCnyTDxI`Pc;~NjxUs^A zB0!_ahoUO0$cLgTCvFzlhoUNHu<90l?n6(NGfd@5Phcpja<2P#)#L+0!6K)0td3X|{EM97WBjCCdt5gxb@+|p zZ~y!GY52#u5QB!LRs&r^EOm4l_jwE&mO2B>62+ilsWa#Xtsw>tOP#UT`?bmg+)u0s zXRKW{afRj21^)_1w-G+4D~lCQUDS0yeSEQsjf8&Qj2gMxB!`=J}wgbNUaEZ<{{HZAN|Q zzfxIIZwcZcsJ8@k&rxq}h=ZV>Y}l^CkifM~_`xgh-n!m0B*3uVGSCgkdPl!(`aA)K z^-kG9f3IQ)a2?|CQAK|W_rG#eDAp~j05mHWfNF!K3P82N2}~IYK()acKGNTzs0!$+ zq-EW%iJL4#0T?z}h5|5bvhgSY!zPNyf5|l|#4SbGvi|u=&6c1L#i-edn&Yq#1kFyr z@j5LELD1}6Kfzzbd`Hk8dB;JU^lbRceUrkL#>vTd9DV!h%iC8#bwvV*>iUj@+t(;b zVv}!kc%ItwIjHX2oM^66l0zqQCWN4bF`ORJ!26?<^$&+h8rn2}bRs?db{7ss<>B3u zs(tk+pVner!YIsaG5Y`zLM={Q^{86LL61u93?TMFi=)pcKGiJhrE2I>*IoVaSmqq1x4a*9jv{^5uyR_+@o{KMw*k>5Dcm{KE`EEB>F3Hxb@^G@h* zDIIm*N>G$CAtWTcTbhYle8~w9?!DvIC|%V9=sg061ifSu6c9X@Oo9T!!Aq2&_mXC~ z^{qo+2JVWw$gyutasojNP$efI)PGCKNjVn7Yo(L*sZcpaW%D~HQs_5Q8H!OSQk7b~ zwVWlZgfV^am@u;DAyiD6RMoQPF9!{<0$+eb(-UrtTeY#){DAtNVz1RSPVy(dCh6*WV z{aR6?+E_eANY{!XV|7Sz>0B@PYw3`ZIrSntSKeL6guHZq1!-0k&i{RR8U9n(?(zw2 zdqtpi94Z4OFP_(jdwxH>Y<=c5isSmsX~0ck&uzo|H)T#EPn&337xh#za$;BN!EH}? z({@?MX*2G!v7^nnOXxdTh>(oH9jtQPf#bVGpJ4{V@m&J9Sf{9*#OOV9Z#ZiE|Ne5X z<)?OiujQu=v{&fH0}|lhD|9&l1pi*4%LyR(_X?DgTO>W0S_B_aG&U@rHg2Y}h#F-K zsv|AN>1D6QYNJNE#d<@Ha*ODtDh(z>TZ<@CwHOfET15FUpNc|^65^1MMFIaq%OR`9 zlh5?2g{RPRNa#}w5LyliT@>wffbWA0Z`QhKrGhB0yUu+r6h*3 z*B17F@0zJ?v|XgDvg&0*2uMgpBscJmh^)_b5ux7bh(Hk`PjYDsA5)&-e|U1tcmfDd zjtT7vAOw#YPXOV`G2;pKU&o~yPOgw;d4cz($hxR4qo(Ui zfj8y{U|Aknb~4rCc8E)6*jS`OeOJ zPFo792d6CsZNSqe=O6-#(U}>2+wO={Xzr?&ud(~5RvC`^1L=Yu=gi7)mnOT zxz^Pi3sY#0t6c^JeXXlY1icfimM+K1<<-VzAV>i!mjU7OYU6Su@LqDW-q9}8Yrsox zq=(-|E+@$4#?;k)?d<+WV-p6UsL{9#2$@FXG9YYfG%f?ekf2He%;OPC69Crljb*EQ7q4ViJ=7p>cg=dfERDL_{2C6XB-V+!p897gM-R8 zy84$3aum}xx;=aOH|S}=Z-!eBPDsA#>K`i5G}>x!y7Gq#=vum2oMq2?CRSoKty1R>#0{(Kty1Rn;00CtDYdm%~22<9TKj7gwDxbCwFiO}pjvxCsC%2%eyM|^8U)^U zH|ua}$)Vq}g6%H8X6@rxmViF@>~i@BsX?uGu;eb+S0C^(PV2JU6=iZ=B!qO3-)IIVyzhzu=?N5V3~0_I%>e29EIm8&K*|0y6VMm#fQYAP@qo zWUszIeDafqNF^1lgS}YR< zqs0x>l?^6?sl~;e9NbF6FTew?{vZPczW@yt^#(W)JlD1jiOfSBR64I zhFYnQC>NAbSeQeu{?-zxcF8i0r@O^N)+*UAxq&74i8ABt`)x#)8xv?bVU{7kJu63_|Y$PbUN*Y+T?Ksx}=E#0xxp6roq00@@o3 zJ$}SfuR6e(z0kuJc_AD53`{y2QcJ&F;3OOHej-y;4#WHgPk;QB1CVU+3RF##1JKmq zp{7w*%K_Am2CsOyANM1A0Lj$gl??L_bFB>|O`aH0^d2vrH1{{tpP5%Wd-}Z6nNLrj z@l>kjWCcs&sWpNUw<*&IDqc;QMo{uLWg0;RtSQq7Mn70;A|sk&+6WA^d17eMs#xjN zS*1_So-?oXr;q)|lQU*cek^t8U*ld9PpuJ@^KG845#%RjeVbP}Fzq-cdYgy5ry4;s zfIs!bu=E5hOB14_JUu)ZyU+7G+@}W#LyIzo4@a7_+~^j}rYF`VAQ{ zspt&*o?DshG#<%Oc+_duUk*U9)2zQ7fTB*b{&E28-)Yug4Pd!DY5niky1?1#Qs&YWe7xt4;l>@NhYY!jH z=~sX>0EK6~@QrVtzWq!l6D87_Om8TW&UpIw1X2)8XFOE%VMFsS{mwNg_cKH9#5FLO3 diff --git a/shared/input/language_v1beta2_desc.bin b/shared/input/language_v1beta2_desc.bin index a127343b91d0f1527b027dfe69c09f32496287ef..c60fa505e6b531ee14c6356713e316966bc284f0 100644 GIT binary patch delta 12036 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 JM_<7Q{}0hI!P)=- delta 10780 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 diff --git a/shared/input/secretmanager_v1beta1_desc.bin b/shared/input/secretmanager_v1beta1_desc.bin index 14933f04004daa1f0805bf7db9874dcfd593a8dc..3f55c6e4cb630e907dd2e1f65a15aa353d27e782 100644 GIT binary patch delta 12055 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 diff --git a/shared/input/vision_v1_desc.bin b/shared/input/vision_v1_desc.bin index 906fd98145b7f38fdc0951d6818bc7eddbe629c5..4869b6c523c6f77d250254275551937a238af13c 100644 GIT binary patch delta 12121 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 delta 10790 zcmYjXdw5humQU5Kd(*kyNxE;s!w4n>!W(%hijZ+t(2vm_bw_8v1s{VN9wW*s%=hp3`oq2ygp7-V?#-gdojExqjzU6-H9dXt#_3)U59(yiz`q~#*YTI>-T(&AT z{vV#_#UuUrgAd+c@#ypi=2YB2{c-#=uXk|?8yvaLoiTmRywo>0_Q{Rz-@*Nyz#Wuz z-b?kqTqMl%e;z(BlrJetm9?{qKf7A_H%t#05J&@26BQudi!I2E=1rhVOgzV z>x?m@mas@4KhGEV%L=?_7=M*HQU(|l&#>&M|8w7?#~d1#h1br!`>th7SP2gj&!#1kh+uXgYMBVqoY@e;K&~BtNG*#e(n=zMcrMfD2qZ9IeU3ol zIr6!k>1gHzVjV<^4ziNFrq3MlP{o|tkIbH55tjYxU@0Eh0Ovq-9ZMAWBebL+i2AVi z!y`-UGu`kpt)3P1@cZj&(Lk&ZXFpt)T%XAn#kBRrW|k`!hz*(XiNSOXSkq&W*uVlC z(cC~ZWM)n-BrssZlM9Ik7S}035zPz4%S`l22QUvJ7)aOwh`h`Sd#26G4@6_8L_Q=i zU?uV)(MS@5w7>B{yaGo`dzIWhuVP-w)Y&tqPM=v)@o2bgPLE)znkhjP7_btw3Ad6&jA}%ZENNo=a#bRD7B(25Zy+{N z6N{>%BRCb1CKmKGPqBZS*kwhEiZpFwypMheodgXN1JgDZjhm-(a-vs-!Jyj4iZ0hw zurXzg;-CUFR2=&>WvNJSiY1Iu984)PYAquN32qPn@MwMccFW*^VLOZFYvojSwzGJl zfh59u_4c=O$pGy;Qnho(vxz$_g@8XhY-F(FfPo340L2b=MX~>sWWd~=VeGL5d{D83Zh_Mt9{6|bK1A_mE$z_*v>Zq|42uy&6 ziNVsN#?pa!EN5#|0YPhTlBdYYGJcASNrle26e~vRqZW2xL&RiD$DOcaOHte|I_i5BfN1$7hUx<~GuXW<=Byvsab|)aHx=p>#ro>sm`Cu6cAW#7sDoUIMJgRCVo`Pus z@1wE|5KIgBz(M{1_#6qmDxUQWXGJ|rCRNOP@bTFX;C!AQ#w!bwRXlQq%+mh7I8jY8V&>|K*L0vXAzH<$ftAhSkCS@ z$jk=SB0hAOHVQFV!ude`kYWI6s3-{KC5AO3Og& zz0xv}t1Ee+G940NSjlk`P@T=87AX*zbRkuv7wFI=?YPmk> zb2x3cS{^q9wB2es2kU9IWCR2RNnb<6ZROHXHbou#KUyw1|o z8D3}UUC`HAdKdI{ME^z}7TpiLKk}@195&`>CE=abKM8+X?WSs~JG}TGd8EKUPYdT$ z4(tl6mt82|Wo*D0Y}jSO4G0@{@j#VjK-jR0qb&c4%Cb+3u`l(`@*7zBK1)Gszt2+8 z+VA6m%4CRuVjmwe)NgPk1s1<0HLj+SO>MChwCF7+629EyEj+IFI3Orm_&`-30I8AS zL#~s721F!U_*LWmA(9_+Tf?hY4!ft-(mSAUwe*w-tvo(L6Hp?w@=;?91br(XJ4wDE z_}rl;q?KQFli#6YfJ8Z#`oqdu?A~Km17*rFtAR4*7>}D6P^KK?LsX@gbqa8JxmJi$ z4S3B&|2A@fUc1{l|KG4Oyfx9zvkUx5IP5S?%Xd8dYj|_%aqMz=^2kvH^f-^@`nTw5 zP<FFeHdI>~j%1qj6_d2h8H0O9jVKFBN@rSD0*Xq3JuY0=uFDyrb>;;EdKq&f=4<4#x8IfGW zCK?DuKk{)Cv?6r63!HS^snZ2CigKW6fupOE&vT$>fs@`W)aforI_ce#14Rp*^lr(4 zq6JRcBfQ~PI^0;{LlK}+)VRpdiar4u&`>_btdGf4G2bTnk!`KV|ckg1WAPNPGt%4{NEOz4RCC2AbC|Kt zOP$f<{8h>W+(xVjuUWTx;tI>33;q?3?iPGb7ZfX;z!a`r@UNhym?CY&-9#8>*WX$m zT7o%-sz$VsNihNMiSqi$psB_XKJRcNw zPQU*0UDD^cyI2<qZ61i z5`b!>Gi-#vQ&APrMacRMyC-h830@oQiwZZGJ6Yd3Ow!P% z`MneA>9@IXC@PQa=G2VFBYax3aS5X^v)SweKnOKEan*`y83(N>buxh12hEN?p8&BB znjM@^rzqx8Y61?0FTC10?U3cC9^jDWryk&t6CbGwsRuaZj8PE;0r(F&S4}og!GFlP zev*G$@x#})@c3(I?rF39bP}~$ezKv>REnr<5ZWAEcPRU*L1=S|M;QqIHfQKa|0Pe_ z4`aHV)X3NSITO3A2I>*ItOn{4x}3P`xTCUJ>~i|_#cPHmqFA|aoN(FJvJu}n(U?*r zmn;*)4GD|2#91diwzcHSvsQwllnEgr;qB5))ZzO?A2_q|qzE=Z;QI!HO5wt{rSfWaCxoW`x zu|$<(;BfR@;HMU7q2SL5N6nUB9u^ARe-@+1!DBL@N{IZTRonU|@sBUNA^8AKREgX? z*}TyJtXL#;A0)9Fh@>T`FG z6_nh-J1nw36HFa`)F>Sms3_!JF74-|@b1Z~d<1ynS5X1nLkASf382Lz+^b<}`;A@I)pOBj|%hMfqP?t0)S zCyYrLgPs#+RRJM!Ld4bm6d+7GA#itpg7PnqHti`94%^-FFQ+U86^B!nf_CF6lYkHb z#VM13fJlr}CIJDF7^f%!>0rsj0(FLe-P&hN9xXWro4V{O7k%4dx)+I)-!-X6_8eu?YFu4FFbF+0u0BKnAyeb( zLIntuYFzz-1PH%tT>XLs2)}DwydaU^aq@eWOYOuB_#ck1vRcUTRj#fhcq*srIsynS zt6W`2=v8429KUDE8sl_aIt{3t287dVjMIt0d(O>zTRTlJ2G6;X9)2r1ogk+hQZ4)2 z*nJJg91KE7gK-)VG7ZLQK$z2DoCbu`4aR9eINd-_pP_6@P$%)K%QuHPA9daIs+-+Q zp7Izb&9Awlk8A@Zh87H{565x#?t z142!cS$BHDdy5kOss!!yx6I-LK?+bUJ|OhHMT@`GL2V5JZ-<+8D0T0l|6~O_TztOT z$FVK}ec##b^8ZPF*YZ=A-0k}63qHnaVcv5^sazO|VKWBQXB{~JQ{HoP)$d8<04#XV zE$nMWVEKD4E{Un7qZyd+zAO5tCs4RCpgEH?1ElYh7xXI@DI#U?7M&gd>H99OLaA>F z$jlF1uCAqlKnSST4-kROBja}f|+AGn38VF3iw2QC^n`H4A@?fd@l=GOY;eoH|H z?RRzW7swRY@9KL2Kv3*=%LZy=5c6i2tDBfWt}>u8hF+bTEfWQ!*$vb!4km-C*~K*- z+)BbPzz<#hDFz6B0U9dm%RY2z)hHyp(g79<$^K_3v>y~E#?p1;L2H$4sN6t(X2EPw9dz-TTO zp3X)-1Cx&W)cx(%&a8U8v&a;c!!W~W zkNXilfMlxo`VRFEajgv`jj7u@?qbQtOl_2*jhWi0Of_a|qbzOA)JCPMF;g3(Un@0| zw#Jy&hJjX33@KV2E15E*Wd5w#^Gbd`_t%dn{he{vBrh)c}^e zgVz6ctqUAqd164(^(9jts(5t%>>0E11$X|eijo<#=Y&6gGk!9js;H7Y<=|H)s&YWe z7Z%H?$^qE$m4|QQ^bQi9oXw=7{5k9CUkeZwRm!v8)3=>peA{`p{kHSGX6OF{J$oHn diff --git a/shared/output/ads/googleads/lib/google/ads/googleads/v1/services/campaign_service_services_pb.rb b/shared/output/ads/googleads/lib/google/ads/googleads/v1/services/campaign_service_services_pb.rb index af22d6ea3..c5f48615f 100644 --- a/shared/output/ads/googleads/lib/google/ads/googleads/v1/services/campaign_service_services_pb.rb +++ b/shared/output/ads/googleads/lib/google/ads/googleads/v1/services/campaign_service_services_pb.rb @@ -37,7 +37,7 @@ class Service self.service_name = 'google.ads.googleads.v1.services.CampaignService' # Returns the requested campaign in full detail. - rpc :GetCampaign, Google::Ads::GoogleAds::V1::Services::GetCampaignRequest, Google::Ads::GoogleAds::V1::Resources::Campaign + rpc :GetCampaign, Google::Ads::GoogleAds::V1::Services::GetCampaignRequest, Google::Ads::GoogleAds::V1::Resources::Google::Ads::Googleads::V1::Resources::Campaign # Creates, updates, or removes campaigns. Operation statuses are returned. rpc :MutateCampaigns, Google::Ads::GoogleAds::V1::Services::MutateCampaignsRequest, Google::Ads::GoogleAds::V1::Services::MutateCampaignsResponse end diff --git a/shared/output/cloud/language_v1/Gemfile b/shared/output/cloud/language_v1/Gemfile index a27cdfb0f..b4e2a20bb 100644 --- a/shared/output/cloud/language_v1/Gemfile +++ b/shared/output/cloud/language_v1/Gemfile @@ -1,6 +1,3 @@ source "https://rubygems.org" gemspec - -# google-protobuf 3.12.0 requires Ruby 2.5 or later, so pin to 3.11 on older Rubies -gem "google-protobuf", (RUBY_VERSION < "2.5" ? "~> 3.11.4" : "~> 3.12") diff --git a/shared/output/cloud/language_v1/google-cloud-language-v1.gemspec b/shared/output/cloud/language_v1/google-cloud-language-v1.gemspec index 24f812868..fce331b7a 100644 --- a/shared/output/cloud/language_v1/google-cloud-language-v1.gemspec +++ b/shared/output/cloud/language_v1/google-cloud-language-v1.gemspec @@ -23,7 +23,7 @@ Gem::Specification.new do |gem| gem.required_ruby_version = ">= 2.4" - gem.add_dependency "gapic-common", "~> 0.2" + gem.add_dependency "gapic-common", "~> 0.3" gem.add_dependency "google-cloud-errors", "~> 1.0" gem.add_development_dependency "google-style", "~> 1.24.0" diff --git a/shared/output/cloud/language_v1beta1/Gemfile b/shared/output/cloud/language_v1beta1/Gemfile index a27cdfb0f..b4e2a20bb 100644 --- a/shared/output/cloud/language_v1beta1/Gemfile +++ b/shared/output/cloud/language_v1beta1/Gemfile @@ -1,6 +1,3 @@ source "https://rubygems.org" gemspec - -# google-protobuf 3.12.0 requires Ruby 2.5 or later, so pin to 3.11 on older Rubies -gem "google-protobuf", (RUBY_VERSION < "2.5" ? "~> 3.11.4" : "~> 3.12") diff --git a/shared/output/cloud/language_v1beta1/google-cloud-language-v1beta1.gemspec b/shared/output/cloud/language_v1beta1/google-cloud-language-v1beta1.gemspec index 4ded42aaf..2f79f8381 100644 --- a/shared/output/cloud/language_v1beta1/google-cloud-language-v1beta1.gemspec +++ b/shared/output/cloud/language_v1beta1/google-cloud-language-v1beta1.gemspec @@ -23,7 +23,7 @@ Gem::Specification.new do |gem| gem.required_ruby_version = ">= 2.4" - gem.add_dependency "gapic-common", "~> 0.2" + gem.add_dependency "gapic-common", "~> 0.3" gem.add_dependency "google-cloud-errors", "~> 1.0" gem.add_development_dependency "google-style", "~> 1.24.0" diff --git a/shared/output/cloud/language_v1beta2/Gemfile b/shared/output/cloud/language_v1beta2/Gemfile index a27cdfb0f..b4e2a20bb 100644 --- a/shared/output/cloud/language_v1beta2/Gemfile +++ b/shared/output/cloud/language_v1beta2/Gemfile @@ -1,6 +1,3 @@ source "https://rubygems.org" gemspec - -# google-protobuf 3.12.0 requires Ruby 2.5 or later, so pin to 3.11 on older Rubies -gem "google-protobuf", (RUBY_VERSION < "2.5" ? "~> 3.11.4" : "~> 3.12") diff --git a/shared/output/cloud/language_v1beta2/google-cloud-language-v1beta2.gemspec b/shared/output/cloud/language_v1beta2/google-cloud-language-v1beta2.gemspec index 3906de421..a48762d2c 100644 --- a/shared/output/cloud/language_v1beta2/google-cloud-language-v1beta2.gemspec +++ b/shared/output/cloud/language_v1beta2/google-cloud-language-v1beta2.gemspec @@ -23,7 +23,7 @@ Gem::Specification.new do |gem| gem.required_ruby_version = ">= 2.4" - gem.add_dependency "gapic-common", "~> 0.2" + gem.add_dependency "gapic-common", "~> 0.3" gem.add_dependency "google-cloud-errors", "~> 1.0" gem.add_development_dependency "google-style", "~> 1.24.0" diff --git a/shared/output/cloud/noservice/Gemfile b/shared/output/cloud/noservice/Gemfile index a27cdfb0f..b4e2a20bb 100644 --- a/shared/output/cloud/noservice/Gemfile +++ b/shared/output/cloud/noservice/Gemfile @@ -1,6 +1,3 @@ source "https://rubygems.org" gemspec - -# google-protobuf 3.12.0 requires Ruby 2.5 or later, so pin to 3.11 on older Rubies -gem "google-protobuf", (RUBY_VERSION < "2.5" ? "~> 3.11.4" : "~> 3.12") diff --git a/shared/output/cloud/noservice/google-garbage-noservice.gemspec b/shared/output/cloud/noservice/google-garbage-noservice.gemspec index 850281295..2ffd2734c 100644 --- a/shared/output/cloud/noservice/google-garbage-noservice.gemspec +++ b/shared/output/cloud/noservice/google-garbage-noservice.gemspec @@ -23,7 +23,7 @@ Gem::Specification.new do |gem| gem.required_ruby_version = ">= 2.4" - gem.add_dependency "gapic-common", "~> 0.2" + gem.add_dependency "gapic-common", "~> 0.3" gem.add_dependency "google-cloud-errors", "~> 1.0" gem.add_development_dependency "google-style", "~> 1.24.0" diff --git a/shared/output/cloud/secretmanager_v1beta1/Gemfile b/shared/output/cloud/secretmanager_v1beta1/Gemfile index a27cdfb0f..b4e2a20bb 100644 --- a/shared/output/cloud/secretmanager_v1beta1/Gemfile +++ b/shared/output/cloud/secretmanager_v1beta1/Gemfile @@ -1,6 +1,3 @@ source "https://rubygems.org" gemspec - -# google-protobuf 3.12.0 requires Ruby 2.5 or later, so pin to 3.11 on older Rubies -gem "google-protobuf", (RUBY_VERSION < "2.5" ? "~> 3.11.4" : "~> 3.12") diff --git a/shared/output/cloud/secretmanager_v1beta1/google-cloud-secret_manager-v1beta1.gemspec b/shared/output/cloud/secretmanager_v1beta1/google-cloud-secret_manager-v1beta1.gemspec index fafd29abc..79710603b 100644 --- a/shared/output/cloud/secretmanager_v1beta1/google-cloud-secret_manager-v1beta1.gemspec +++ b/shared/output/cloud/secretmanager_v1beta1/google-cloud-secret_manager-v1beta1.gemspec @@ -23,7 +23,7 @@ Gem::Specification.new do |gem| gem.required_ruby_version = ">= 2.4" - gem.add_dependency "gapic-common", "~> 0.2" + gem.add_dependency "gapic-common", "~> 0.3" gem.add_dependency "google-cloud-errors", "~> 1.0" gem.add_dependency "grpc-google-iam-v1", ">= 0.6.10", "< 2.0" diff --git a/shared/output/cloud/secretmanager_wrapper/Gemfile b/shared/output/cloud/secretmanager_wrapper/Gemfile index 7413be868..67242ff19 100644 --- a/shared/output/cloud/secretmanager_wrapper/Gemfile +++ b/shared/output/cloud/secretmanager_wrapper/Gemfile @@ -4,6 +4,3 @@ gemspec gem "google-cloud-secret_manager-v1", path: "../google-cloud-secret_manager-v1" gem "google-cloud-secret_manager-v1beta1", path: "../google-cloud-secret_manager-v1beta1" - -# google-protobuf 3.12.0 requires Ruby 2.5 or later, so pin to 3.11 on older Rubies -gem "google-protobuf", (RUBY_VERSION < "2.5" ? "~> 3.11.4" : "~> 3.12") diff --git a/shared/output/cloud/speech_v1/Gemfile b/shared/output/cloud/speech_v1/Gemfile index a27cdfb0f..b4e2a20bb 100644 --- a/shared/output/cloud/speech_v1/Gemfile +++ b/shared/output/cloud/speech_v1/Gemfile @@ -1,6 +1,3 @@ source "https://rubygems.org" gemspec - -# google-protobuf 3.12.0 requires Ruby 2.5 or later, so pin to 3.11 on older Rubies -gem "google-protobuf", (RUBY_VERSION < "2.5" ? "~> 3.11.4" : "~> 3.12") diff --git a/shared/output/cloud/speech_v1/google-cloud-speech-v1.gemspec b/shared/output/cloud/speech_v1/google-cloud-speech-v1.gemspec index 560c70dfe..9907a4105 100644 --- a/shared/output/cloud/speech_v1/google-cloud-speech-v1.gemspec +++ b/shared/output/cloud/speech_v1/google-cloud-speech-v1.gemspec @@ -23,7 +23,7 @@ Gem::Specification.new do |gem| gem.required_ruby_version = ">= 2.4" - gem.add_dependency "gapic-common", "~> 0.2" + gem.add_dependency "gapic-common", "~> 0.3" gem.add_dependency "google-cloud-errors", "~> 1.0" gem.add_development_dependency "google-style", "~> 1.24.0" diff --git a/shared/output/cloud/speech_v1/test/google/cloud/speech/v1/speech_test.rb b/shared/output/cloud/speech_v1/test/google/cloud/speech/v1/speech_test.rb index 40db6ad95..cc7adc182 100644 --- a/shared/output/cloud/speech_v1/test/google/cloud/speech/v1/speech_test.rb +++ b/shared/output/cloud/speech_v1/test/google/cloud/speech/v1/speech_test.rb @@ -255,6 +255,7 @@ def test_streaming_recognize request.to_a.each do |r| assert_kind_of ::Google::Cloud::Speech::V1::StreamingRecognizeRequest, r assert_equal Gapic::Protobuf.coerce({}, to: ::Google::Cloud::Speech::V1::StreamingRecognitionConfig), r.streaming_config + assert_equal :streaming_config, r.streaming_request end end end diff --git a/shared/output/cloud/vision_v1/Gemfile b/shared/output/cloud/vision_v1/Gemfile index a27cdfb0f..b4e2a20bb 100644 --- a/shared/output/cloud/vision_v1/Gemfile +++ b/shared/output/cloud/vision_v1/Gemfile @@ -1,6 +1,3 @@ source "https://rubygems.org" gemspec - -# google-protobuf 3.12.0 requires Ruby 2.5 or later, so pin to 3.11 on older Rubies -gem "google-protobuf", (RUBY_VERSION < "2.5" ? "~> 3.11.4" : "~> 3.12") diff --git a/shared/output/cloud/vision_v1/google-cloud-vision-v1.gemspec b/shared/output/cloud/vision_v1/google-cloud-vision-v1.gemspec index af8c4d5d8..133c15ea1 100644 --- a/shared/output/cloud/vision_v1/google-cloud-vision-v1.gemspec +++ b/shared/output/cloud/vision_v1/google-cloud-vision-v1.gemspec @@ -23,7 +23,7 @@ Gem::Specification.new do |gem| gem.required_ruby_version = ">= 2.4" - gem.add_dependency "gapic-common", "~> 0.2" + gem.add_dependency "gapic-common", "~> 0.3" gem.add_dependency "google-cloud-errors", "~> 1.0" gem.add_development_dependency "google-style", "~> 1.24.0" diff --git a/shared/output/cloud/vision_v1/test/google/cloud/vision/v1/product_search_test.rb b/shared/output/cloud/vision_v1/test/google/cloud/vision/v1/product_search_test.rb index 96136a44d..5972ca597 100644 --- a/shared/output/cloud/vision_v1/test/google/cloud/vision/v1/product_search_test.rb +++ b/shared/output/cloud/vision_v1/test/google/cloud/vision/v1/product_search_test.rb @@ -1170,6 +1170,7 @@ def test_purge_products assert_equal :purge_products, name assert_kind_of ::Google::Cloud::Vision::V1::PurgeProductsRequest, request assert_equal Gapic::Protobuf.coerce({}, to: ::Google::Cloud::Vision::V1::ProductSetPurgeConfig), request.product_set_purge_config + assert_equal :product_set_purge_config, request.target assert_equal "hello world", request.parent assert_equal true, request.force refute_nil options diff --git a/shared/output/gapic/gems/my_plugin/Dockerfile b/shared/output/gapic/gems/my_plugin/Dockerfile index f4e85c16b..8b95620e6 100644 --- a/shared/output/gapic/gems/my_plugin/Dockerfile +++ b/shared/output/gapic/gems/my_plugin/Dockerfile @@ -46,7 +46,7 @@ COPY --from=gcr.io/gapic-images/api-common-protos:beta /protos/ /workspace/commo COPY --from=builder /workspace/*.gem /workspace/ # Install the subgenerator and other needed tools. -RUN gem install grpc-tools gapic-generator-my_plugin.gem \ +RUN gem install --pre grpc-tools gapic-generator-my_plugin.gem \ && rm gapic-generator-my_plugin.gem \ && mkdir -p --mode=777 /.cache diff --git a/shared/output/gapic/gems/my_plugin/docker-entrypoint.sh b/shared/output/gapic/gems/my_plugin/docker-entrypoint.sh index 67bf91cd9..59a175fab 100644 --- a/shared/output/gapic/gems/my_plugin/docker-entrypoint.sh +++ b/shared/output/gapic/gems/my_plugin/docker-entrypoint.sh @@ -28,6 +28,7 @@ done mkdir -p /workspace/out/lib exec grpc_tools_ruby_protoc \ + --experimental_allow_proto3_optional=1 \ --proto_path=/workspace/common-protos/ --proto_path=/workspace/in/ \ --ruby_out=/workspace/out/lib \ --grpc_out=/workspace/out/lib \ diff --git a/shared/output/gapic/templates/garbage/Gemfile b/shared/output/gapic/templates/garbage/Gemfile index a27cdfb0f..b4e2a20bb 100644 --- a/shared/output/gapic/templates/garbage/Gemfile +++ b/shared/output/gapic/templates/garbage/Gemfile @@ -1,6 +1,3 @@ source "https://rubygems.org" gemspec - -# google-protobuf 3.12.0 requires Ruby 2.5 or later, so pin to 3.11 on older Rubies -gem "google-protobuf", (RUBY_VERSION < "2.5" ? "~> 3.11.4" : "~> 3.12") diff --git a/shared/output/gapic/templates/garbage/google-garbage.gemspec b/shared/output/gapic/templates/garbage/google-garbage.gemspec index 67e9ca891..f6cbba7cb 100644 --- a/shared/output/gapic/templates/garbage/google-garbage.gemspec +++ b/shared/output/gapic/templates/garbage/google-garbage.gemspec @@ -23,7 +23,7 @@ Gem::Specification.new do |gem| gem.required_ruby_version = ">= 2.4" - gem.add_dependency "gapic-common", "~> 0.2" + gem.add_dependency "gapic-common", "~> 0.3" gem.add_dependency "grpc-google-iam-v1", ">= 0.6.10", "< 2.0" gem.add_development_dependency "google-style", "~> 1.24.0" diff --git a/shared/output/gapic/templates/garbage/lib/garbage/garbage_pb.rb b/shared/output/gapic/templates/garbage/lib/garbage/garbage_pb.rb index de6e73057..b4c4f923a 100644 --- a/shared/output/gapic/templates/garbage/lib/garbage/garbage_pb.rb +++ b/shared/output/gapic/templates/garbage/lib/garbage/garbage_pb.rb @@ -68,6 +68,7 @@ optional :msg, :message, 12, "endless.trash.forever.GarbageMap" optional :enum, :enum, 13, "endless.trash.forever.GarbageEnum" map :amap, :string, :string, 14 + proto3_optional :optional_int32, :int32, 22 oneof :oneof_singular do optional :oneof_singular_str, :string, 15 end diff --git a/shared/output/gapic/templates/garbage/lib/garbage/garbage_services_pb.rb b/shared/output/gapic/templates/garbage/lib/garbage/garbage_services_pb.rb index 55dc43681..fec30a2b5 100644 --- a/shared/output/gapic/templates/garbage/lib/garbage/garbage_services_pb.rb +++ b/shared/output/gapic/templates/garbage/lib/garbage/garbage_services_pb.rb @@ -24,7 +24,7 @@ class Service # Retrieves a SpecificGarbage resource. rpc :GetSpecificGarbage, So::Much::Trash::SpecificGarbage, So::Much::Trash::SpecificGarbage # Retrieves a NestedGarbage resource. - rpc :GetNestedGarbage, So::Much::Trash::NestedGarbage, So::Much::Trash::NestedGarbage + rpc :GetNestedGarbage, So::Much::Trash::SpecificGarbage::NestedGarbage, So::Much::Trash::SpecificGarbage::NestedGarbage # Retrieves a RepeatedGarbage resource. rpc :GetRepeatedGarbage, So::Much::Trash::RepeatedGarbage, So::Much::Trash::RepeatedGarbage # Retrieves a TypicalGarbage resource. diff --git a/shared/output/gapic/templates/garbage/lib/so/much/trash/garbage_service/client.rb b/shared/output/gapic/templates/garbage/lib/so/much/trash/garbage_service/client.rb index 3ab046b4d..0f856775e 100644 --- a/shared/output/gapic/templates/garbage/lib/so/much/trash/garbage_service/client.rb +++ b/shared/output/gapic/templates/garbage/lib/so/much/trash/garbage_service/client.rb @@ -555,7 +555,7 @@ def get_repeated_garbage request, options = nil # @param options [::Gapic::CallOptions, ::Hash] # Overrides the default settings for this call, e.g, timeout, retries, etc. Optional. # - # @overload get_typical_garbage(name: nil, int32: nil, int64: nil, uint32: nil, uint64: nil, bool: nil, float: nil, double: nil, bytes: nil, timeout: nil, duration: nil, enum: nil, amap: nil, oneof_singular_str: nil, oneof_pair_int32: nil, oneof_pair_float: nil, oneof_multiple_message: nil, oneof_multiple_bytes: nil, oneof_multiple_enum: nil, oneof_multiple_double: nil) + # @overload get_typical_garbage(name: nil, int32: nil, int64: nil, uint32: nil, uint64: nil, bool: nil, float: nil, double: nil, bytes: nil, timeout: nil, duration: nil, enum: nil, amap: nil, oneof_singular_str: nil, oneof_pair_int32: nil, oneof_pair_float: nil, oneof_multiple_message: nil, oneof_multiple_bytes: nil, oneof_multiple_enum: nil, oneof_multiple_double: nil, optional_int32: nil) # Pass arguments to `get_typical_garbage` via keyword arguments. Note that at # least one keyword argument is required. To specify no parameters, or to keep all # the default parameter values, pass an empty Hash as a request object (see above). @@ -600,6 +600,7 @@ def get_repeated_garbage request, options = nil # This is a multiple-field oneof's enum field. # @param oneof_multiple_double [::Float] # This is a multiple-field oneof's double field. + # @param optional_int32 [::Integer] # # @yield [response, operation] Access the result along with the RPC operation # @yieldparam response [::So::Much::Trash::TypicalGarbage] diff --git a/shared/output/gapic/templates/garbage/proto_docs/garbage/garbage.rb b/shared/output/gapic/templates/garbage/proto_docs/garbage/garbage.rb index a75488b6e..c5a763d38 100644 --- a/shared/output/gapic/templates/garbage/proto_docs/garbage/garbage.rb +++ b/shared/output/gapic/templates/garbage/proto_docs/garbage/garbage.rb @@ -201,6 +201,8 @@ class SimpleGarbageItem # @!attribute [rw] oneof_multiple_double # @return [::Float] # This is a multiple-field oneof's double field. + # @!attribute [rw] optional_int32 + # @return [::Integer] class TypicalGarbage include ::Google::Protobuf::MessageExts extend ::Google::Protobuf::MessageExts::ClassMethods diff --git a/shared/output/gapic/templates/garbage/test/so/much/trash/garbage_service_test.rb b/shared/output/gapic/templates/garbage/test/so/much/trash/garbage_service_test.rb index 2445b8cf0..77be94b06 100644 --- a/shared/output/gapic/templates/garbage/test/so/much/trash/garbage_service_test.rb +++ b/shared/output/gapic/templates/garbage/test/so/much/trash/garbage_service_test.rb @@ -424,6 +424,7 @@ def test_get_typical_garbage oneof_singular_str = "hello world" oneof_pair_int32 = 42 oneof_multiple_message = {} + optional_int32 = 42 get_typical_garbage_client_stub = ClientStub.new grpc_response, grpc_operation do |name, request, options:| assert_equal :get_typical_garbage, name @@ -443,8 +444,13 @@ def test_get_typical_garbage assert_equal :DEFAULT_GARBAGE, request.enum assert_equal({}, request.amap.to_h) assert_equal "hello world", request.oneof_singular_str + assert_equal :oneof_singular_str, request.oneof_singular assert_equal 42, request.oneof_pair_int32 + assert_equal :oneof_pair_int32, request.oneof_pair assert_equal Gapic::Protobuf.coerce({}, to: ::So::Much::Trash::SimpleGarbageItem), request.oneof_multiple_message + assert_equal :oneof_multiple_message, request.oneof_multiple + assert_equal 42, request.optional_int32 + assert request.has_optional_int32? refute_nil options end @@ -455,31 +461,31 @@ def test_get_typical_garbage end # Use hash object - client.get_typical_garbage({ name: name, int32: int32, int64: int64, uint32: uint32, uint64: uint64, bool: bool, float: float, double: double, bytes: bytes, timeout: timeout, duration: duration, msg: msg, enum: enum, amap: amap, oneof_singular_str: oneof_singular_str, oneof_pair_int32: oneof_pair_int32, oneof_multiple_message: oneof_multiple_message }) do |response, operation| + client.get_typical_garbage({ name: name, int32: int32, int64: int64, uint32: uint32, uint64: uint64, bool: bool, float: float, double: double, bytes: bytes, timeout: timeout, duration: duration, msg: msg, enum: enum, amap: amap, oneof_singular_str: oneof_singular_str, oneof_pair_int32: oneof_pair_int32, oneof_multiple_message: oneof_multiple_message, optional_int32: optional_int32 }) do |response, operation| assert_equal grpc_response, response assert_equal grpc_operation, operation end # Use named arguments - client.get_typical_garbage name: name, int32: int32, int64: int64, uint32: uint32, uint64: uint64, bool: bool, float: float, double: double, bytes: bytes, timeout: timeout, duration: duration, msg: msg, enum: enum, amap: amap, oneof_singular_str: oneof_singular_str, oneof_pair_int32: oneof_pair_int32, oneof_multiple_message: oneof_multiple_message do |response, operation| + client.get_typical_garbage name: name, int32: int32, int64: int64, uint32: uint32, uint64: uint64, bool: bool, float: float, double: double, bytes: bytes, timeout: timeout, duration: duration, msg: msg, enum: enum, amap: amap, oneof_singular_str: oneof_singular_str, oneof_pair_int32: oneof_pair_int32, oneof_multiple_message: oneof_multiple_message, optional_int32: optional_int32 do |response, operation| assert_equal grpc_response, response assert_equal grpc_operation, operation end # Use protobuf object - client.get_typical_garbage ::So::Much::Trash::TypicalGarbage.new(name: name, int32: int32, int64: int64, uint32: uint32, uint64: uint64, bool: bool, float: float, double: double, bytes: bytes, timeout: timeout, duration: duration, msg: msg, enum: enum, amap: amap, oneof_singular_str: oneof_singular_str, oneof_pair_int32: oneof_pair_int32, oneof_multiple_message: oneof_multiple_message) do |response, operation| + client.get_typical_garbage ::So::Much::Trash::TypicalGarbage.new(name: name, int32: int32, int64: int64, uint32: uint32, uint64: uint64, bool: bool, float: float, double: double, bytes: bytes, timeout: timeout, duration: duration, msg: msg, enum: enum, amap: amap, oneof_singular_str: oneof_singular_str, oneof_pair_int32: oneof_pair_int32, oneof_multiple_message: oneof_multiple_message, optional_int32: optional_int32) do |response, operation| assert_equal grpc_response, response assert_equal grpc_operation, operation end # Use hash object with options - client.get_typical_garbage({ name: name, int32: int32, int64: int64, uint32: uint32, uint64: uint64, bool: bool, float: float, double: double, bytes: bytes, timeout: timeout, duration: duration, msg: msg, enum: enum, amap: amap, oneof_singular_str: oneof_singular_str, oneof_pair_int32: oneof_pair_int32, oneof_multiple_message: oneof_multiple_message }, grpc_options) do |response, operation| + client.get_typical_garbage({ name: name, int32: int32, int64: int64, uint32: uint32, uint64: uint64, bool: bool, float: float, double: double, bytes: bytes, timeout: timeout, duration: duration, msg: msg, enum: enum, amap: amap, oneof_singular_str: oneof_singular_str, oneof_pair_int32: oneof_pair_int32, oneof_multiple_message: oneof_multiple_message, optional_int32: optional_int32 }, grpc_options) do |response, operation| assert_equal grpc_response, response assert_equal grpc_operation, operation end # Use protobuf object with options - client.get_typical_garbage ::So::Much::Trash::TypicalGarbage.new(name: name, int32: int32, int64: int64, uint32: uint32, uint64: uint64, bool: bool, float: float, double: double, bytes: bytes, timeout: timeout, duration: duration, msg: msg, enum: enum, amap: amap, oneof_singular_str: oneof_singular_str, oneof_pair_int32: oneof_pair_int32, oneof_multiple_message: oneof_multiple_message), grpc_options do |response, operation| + client.get_typical_garbage ::So::Much::Trash::TypicalGarbage.new(name: name, int32: int32, int64: int64, uint32: uint32, uint64: uint64, bool: bool, float: float, double: double, bytes: bytes, timeout: timeout, duration: duration, msg: msg, enum: enum, amap: amap, oneof_singular_str: oneof_singular_str, oneof_pair_int32: oneof_pair_int32, oneof_multiple_message: oneof_multiple_message, optional_int32: optional_int32), grpc_options do |response, operation| assert_equal grpc_response, response assert_equal grpc_operation, operation end diff --git a/shared/output/gapic/templates/grpc_service_config/Gemfile b/shared/output/gapic/templates/grpc_service_config/Gemfile index a27cdfb0f..b4e2a20bb 100644 --- a/shared/output/gapic/templates/grpc_service_config/Gemfile +++ b/shared/output/gapic/templates/grpc_service_config/Gemfile @@ -1,6 +1,3 @@ source "https://rubygems.org" gemspec - -# google-protobuf 3.12.0 requires Ruby 2.5 or later, so pin to 3.11 on older Rubies -gem "google-protobuf", (RUBY_VERSION < "2.5" ? "~> 3.11.4" : "~> 3.12") diff --git a/shared/output/gapic/templates/grpc_service_config/testing-grpc_service_config.gemspec b/shared/output/gapic/templates/grpc_service_config/testing-grpc_service_config.gemspec index 944fc32e6..b4c86325f 100644 --- a/shared/output/gapic/templates/grpc_service_config/testing-grpc_service_config.gemspec +++ b/shared/output/gapic/templates/grpc_service_config/testing-grpc_service_config.gemspec @@ -23,7 +23,7 @@ Gem::Specification.new do |gem| gem.required_ruby_version = ">= 2.4" - gem.add_dependency "gapic-common", "~> 0.2" + gem.add_dependency "gapic-common", "~> 0.3" gem.add_development_dependency "google-style", "~> 1.24.0" gem.add_development_dependency "minitest", "~> 5.14" diff --git a/shared/output/gapic/templates/showcase/Gemfile b/shared/output/gapic/templates/showcase/Gemfile index a27cdfb0f..b4e2a20bb 100644 --- a/shared/output/gapic/templates/showcase/Gemfile +++ b/shared/output/gapic/templates/showcase/Gemfile @@ -1,6 +1,3 @@ source "https://rubygems.org" gemspec - -# google-protobuf 3.12.0 requires Ruby 2.5 or later, so pin to 3.11 on older Rubies -gem "google-protobuf", (RUBY_VERSION < "2.5" ? "~> 3.11.4" : "~> 3.12") diff --git a/shared/output/gapic/templates/showcase/google-showcase.gemspec b/shared/output/gapic/templates/showcase/google-showcase.gemspec index 0fcf4ee4c..c66bcd894 100644 --- a/shared/output/gapic/templates/showcase/google-showcase.gemspec +++ b/shared/output/gapic/templates/showcase/google-showcase.gemspec @@ -23,7 +23,7 @@ Gem::Specification.new do |gem| gem.required_ruby_version = ">= 2.4" - gem.add_dependency "gapic-common", "~> 0.2" + gem.add_dependency "gapic-common", "~> 0.3" gem.add_development_dependency "google-style", "~> 1.24.0" gem.add_development_dependency "minitest", "~> 5.14" diff --git a/shared/output/gapic/templates/showcase/lib/google/showcase/v1beta1/echo.rb b/shared/output/gapic/templates/showcase/lib/google/showcase/v1beta1/echo.rb index 0f484dc9b..8e0a20774 100644 --- a/shared/output/gapic/templates/showcase/lib/google/showcase/v1beta1/echo.rb +++ b/shared/output/gapic/templates/showcase/lib/google/showcase/v1beta1/echo.rb @@ -41,7 +41,8 @@ module V1beta1 # This service is used showcase the four main types of rpcs - unary, server # side streaming, client side streaming, and bidirectional streaming. This # service also exposes methods that explicitly implement server delay, and - # paginated calls. + # paginated calls. Set the 'showcase-trailer' metadata key on any method + # to have the values echoed in the response trailers. # # To load this service and instantiate a client: # diff --git a/shared/output/gapic/templates/showcase/lib/google/showcase/v1beta1/echo/client.rb b/shared/output/gapic/templates/showcase/lib/google/showcase/v1beta1/echo/client.rb index 5bef4a750..e9015a313 100644 --- a/shared/output/gapic/templates/showcase/lib/google/showcase/v1beta1/echo/client.rb +++ b/shared/output/gapic/templates/showcase/lib/google/showcase/v1beta1/echo/client.rb @@ -36,7 +36,8 @@ module Echo # This service is used showcase the four main types of rpcs - unary, server # side streaming, client side streaming, and bidirectional streaming. This # service also exposes methods that explicitly implement server delay, and - # paginated calls. + # paginated calls. Set the 'showcase-trailer' metadata key on any method + # to have the values echoed in the response trailers. # class Client # @private diff --git a/shared/output/gapic/templates/showcase/lib/google/showcase/v1beta1/echo_services_pb.rb b/shared/output/gapic/templates/showcase/lib/google/showcase/v1beta1/echo_services_pb.rb index 59cbfc0e9..afeb044d8 100644 --- a/shared/output/gapic/templates/showcase/lib/google/showcase/v1beta1/echo_services_pb.rb +++ b/shared/output/gapic/templates/showcase/lib/google/showcase/v1beta1/echo_services_pb.rb @@ -26,7 +26,8 @@ module Echo # This service is used showcase the four main types of rpcs - unary, server # side streaming, client side streaming, and bidirectional streaming. This # service also exposes methods that explicitly implement server delay, and - # paginated calls. + # paginated calls. Set the 'showcase-trailer' metadata key on any method + # to have the values echoed in the response trailers. class Service include GRPC::GenericService @@ -54,7 +55,7 @@ class Service # This method will wait the requested amount of and then return. # This method showcases how a client handles a request timing out. rpc :Wait, WaitRequest, Google::Longrunning::Operation - # This method will block (wait) for the requested amount of time + # This method will block (wait) for the requested amount of time # and then return the response or error. # This method showcases how a client handles delays or retries. rpc :Block, BlockRequest, BlockResponse diff --git a/shared/output/gapic/templates/showcase/lib/google/showcase/v1beta1/identity_pb.rb b/shared/output/gapic/templates/showcase/lib/google/showcase/v1beta1/identity_pb.rb index 5c276c6e8..99d88e128 100644 --- a/shared/output/gapic/templates/showcase/lib/google/showcase/v1beta1/identity_pb.rb +++ b/shared/output/gapic/templates/showcase/lib/google/showcase/v1beta1/identity_pb.rb @@ -18,6 +18,10 @@ optional :email, :string, 3 optional :create_time, :message, 4, "google.protobuf.Timestamp" optional :update_time, :message, 5, "google.protobuf.Timestamp" + proto3_optional :age, :int32, 6 + proto3_optional :height_feet, :double, 7 + proto3_optional :nickname, :string, 8 + proto3_optional :enable_notifications, :bool, 9 end add_message "google.showcase.v1beta1.CreateUserRequest" do optional :user, :message, 1, "google.showcase.v1beta1.User" diff --git a/shared/output/gapic/templates/showcase/lib/google/showcase/v1beta1/messaging/paths.rb b/shared/output/gapic/templates/showcase/lib/google/showcase/v1beta1/messaging/paths.rb index 911e0e281..441f1aecc 100644 --- a/shared/output/gapic/templates/showcase/lib/google/showcase/v1beta1/messaging/paths.rb +++ b/shared/output/gapic/templates/showcase/lib/google/showcase/v1beta1/messaging/paths.rb @@ -34,6 +34,23 @@ module Paths ## # Create a fully-qualified Blurb resource string. # + # @overload blurb_path(user_id:, legacy_user_id:, blurb_id:) + # The resource will be in the following format: + # + # `users/{user_id}/profile/blurbs/legacy/{legacy_user_id}~{blurb_id}` + # + # @param user_id [String] + # @param legacy_user_id [String] + # @param blurb_id [String] + # + # @overload blurb_path(user_id:, blurb_id:) + # The resource will be in the following format: + # + # `users/{user_id}/profile/blurbs/{blurb_id}` + # + # @param user_id [String] + # @param blurb_id [String] + # # @overload blurb_path(room_id:, blurb_id:) # The resource will be in the following format: # @@ -42,26 +59,39 @@ module Paths # @param room_id [String] # @param blurb_id [String] # - # @overload blurb_path(user_id:, blurb_id:) + # @overload blurb_path(room_id:, legacy_room_id:, blurb_id:) # The resource will be in the following format: # - # `user/{user_id}/profile/blurbs/{blurb_id}` + # `rooms/{room_id}/blurbs/legacy/{legacy_room_id}.{blurb_id}` # - # @param user_id [String] + # @param room_id [String] + # @param legacy_room_id [String] # @param blurb_id [String] # # @return [::String] def blurb_path **args resources = { - "blurb_id:room_id" => (proc do |room_id:, blurb_id:| + "blurb_id:legacy_user_id:user_id" => (proc do |user_id:, legacy_user_id:, blurb_id:| + raise ::ArgumentError, "user_id cannot contain /" if user_id.to_s.include? "/" + raise ::ArgumentError, "legacy_user_id cannot contain /" if legacy_user_id.to_s.include? "/" + + "users/#{user_id}/profile/blurbs/legacy/#{legacy_user_id}~#{blurb_id}" + end), + "blurb_id:user_id" => (proc do |user_id:, blurb_id:| + raise ::ArgumentError, "user_id cannot contain /" if user_id.to_s.include? "/" + + "users/#{user_id}/profile/blurbs/#{blurb_id}" + end), + "blurb_id:room_id" => (proc do |room_id:, blurb_id:| raise ::ArgumentError, "room_id cannot contain /" if room_id.to_s.include? "/" "rooms/#{room_id}/blurbs/#{blurb_id}" end), - "blurb_id:user_id" => (proc do |user_id:, blurb_id:| - raise ::ArgumentError, "user_id cannot contain /" if user_id.to_s.include? "/" + "blurb_id:legacy_room_id:room_id" => (proc do |room_id:, legacy_room_id:, blurb_id:| + raise ::ArgumentError, "room_id cannot contain /" if room_id.to_s.include? "/" + raise ::ArgumentError, "legacy_room_id cannot contain /" if legacy_room_id.to_s.include? "/" - "user/#{user_id}/profile/blurbs/#{blurb_id}" + "rooms/#{room_id}/blurbs/legacy/#{legacy_room_id}.#{blurb_id}" end) } diff --git a/shared/output/gapic/templates/showcase/lib/google/showcase/v1beta1/messaging_pb.rb b/shared/output/gapic/templates/showcase/lib/google/showcase/v1beta1/messaging_pb.rb index c67e86308..69c4f5950 100644 --- a/shared/output/gapic/templates/showcase/lib/google/showcase/v1beta1/messaging_pb.rb +++ b/shared/output/gapic/templates/showcase/lib/google/showcase/v1beta1/messaging_pb.rb @@ -51,6 +51,10 @@ optional :text, :string, 3 optional :image, :bytes, 4 end + oneof :legacy_id do + optional :legacy_room_id, :string, 7 + optional :legacy_user_id, :string, 8 + end end add_message "google.showcase.v1beta1.CreateBlurbRequest" do optional :parent, :string, 1 diff --git a/shared/output/gapic/templates/showcase/proto_docs/google/showcase/v1beta1/identity.rb b/shared/output/gapic/templates/showcase/proto_docs/google/showcase/v1beta1/identity.rb index b08c3b907..7fc2ad0c9 100644 --- a/shared/output/gapic/templates/showcase/proto_docs/google/showcase/v1beta1/identity.rb +++ b/shared/output/gapic/templates/showcase/proto_docs/google/showcase/v1beta1/identity.rb @@ -44,6 +44,24 @@ module V1beta1 # @!attribute [r] update_time # @return [::Google::Protobuf::Timestamp] # The latest timestamp at which the user was updated. + # @!attribute [rw] age + # @return [::Integer] + # The age of the use in years. + # @!attribute [rw] height_feet + # @return [::Float] + # The height of the user in feet. + # @!attribute [rw] nickname + # @return [::String] + # The nickname of the user. + # + # (-- aip.dev/not-precedent: An empty string is a valid nickname. + # Ordinarily, proto3_optional should not be used on a `string` field. --) + # @!attribute [rw] enable_notifications + # @return [::Boolean] + # Enables the receiving of notifications. The default is true if unset. + # + # (-- aip.dev/not-precedent: The default for the feature is true. + # Ordinarily, the default for a `bool` field should be false. --) class User include ::Google::Protobuf::MessageExts extend ::Google::Protobuf::MessageExts::ClassMethods diff --git a/shared/output/gapic/templates/showcase/proto_docs/google/showcase/v1beta1/messaging.rb b/shared/output/gapic/templates/showcase/proto_docs/google/showcase/v1beta1/messaging.rb index 7dd44f8d6..cb6d0fd8d 100644 --- a/shared/output/gapic/templates/showcase/proto_docs/google/showcase/v1beta1/messaging.rb +++ b/shared/output/gapic/templates/showcase/proto_docs/google/showcase/v1beta1/messaging.rb @@ -145,6 +145,14 @@ class ListRoomsResponse # @!attribute [r] update_time # @return [::Google::Protobuf::Timestamp] # The latest timestamp at which the blurb was updated. + # @!attribute [rw] legacy_room_id + # @return [::String] + # The legacy id of the room. This field is used to signal + # the use of the compound resource pattern `rooms/{room_id}/blurbs/legacy/{legacy_room_id}.{blurb_id}` + # @!attribute [rw] legacy_user_id + # @return [::String] + # The legacy id of the user. This field is used to signal + # the use of the compound resource pattern `users/{user_id}/profile/blurbs/legacy/{legacy_user_id}~{blurb_id}` class Blurb include ::Google::Protobuf::MessageExts extend ::Google::Protobuf::MessageExts::ClassMethods diff --git a/shared/output/gapic/templates/showcase/test/google/showcase/v1beta1/echo_test.rb b/shared/output/gapic/templates/showcase/test/google/showcase/v1beta1/echo_test.rb index 8e26c48bf..68498eda1 100644 --- a/shared/output/gapic/templates/showcase/test/google/showcase/v1beta1/echo_test.rb +++ b/shared/output/gapic/templates/showcase/test/google/showcase/v1beta1/echo_test.rb @@ -69,6 +69,7 @@ def test_echo assert_equal :echo, name assert_kind_of ::Google::Showcase::V1beta1::EchoRequest, request assert_equal "hello world", request.content + assert_equal :content, request.response refute_nil options end @@ -259,6 +260,7 @@ def test_collect request.to_a.each do |r| assert_kind_of ::Google::Showcase::V1beta1::EchoRequest, r assert_equal "hello world", r.content + assert_equal :content, r.response end end end @@ -347,6 +349,7 @@ def test_chat request.to_a.each do |r| assert_kind_of ::Google::Showcase::V1beta1::EchoRequest, r assert_equal "hello world", r.content + assert_equal :content, r.response end end end @@ -434,7 +437,9 @@ def test_wait assert_equal :wait, name assert_kind_of ::Google::Showcase::V1beta1::WaitRequest, request assert_equal Gapic::Protobuf.coerce({}, to: ::Google::Protobuf::Timestamp), request.end_time + assert_equal :end_time, request.end assert_equal Gapic::Protobuf.coerce({}, to: ::Google::Rpc::Status), request.error + assert_equal :error, request.response refute_nil options end @@ -500,6 +505,7 @@ def test_block assert_kind_of ::Google::Showcase::V1beta1::BlockRequest, request assert_equal Gapic::Protobuf.coerce({}, to: ::Google::Protobuf::Duration), request.response_delay assert_equal Gapic::Protobuf.coerce({}, to: ::Google::Rpc::Status), request.error + assert_equal :error, request.response refute_nil options end diff --git a/shared/output/gapic/templates/showcase/test/google/showcase/v1beta1/messaging_paths_test.rb b/shared/output/gapic/templates/showcase/test/google/showcase/v1beta1/messaging_paths_test.rb index c4a2bd100..273e75898 100644 --- a/shared/output/gapic/templates/showcase/test/google/showcase/v1beta1/messaging_paths_test.rb +++ b/shared/output/gapic/templates/showcase/test/google/showcase/v1beta1/messaging_paths_test.rb @@ -38,11 +38,17 @@ def test_blurb_path config.credentials = grpc_channel end + path = client.blurb_path user_id: "value0", legacy_user_id: "value1", blurb_id: "value2" + assert_equal "users/value0/profile/blurbs/legacy/value1~value2", path + + path = client.blurb_path user_id: "value0", blurb_id: "value1" + assert_equal "users/value0/profile/blurbs/value1", path + path = client.blurb_path room_id: "value0", blurb_id: "value1" assert_equal "rooms/value0/blurbs/value1", path - path = client.blurb_path user_id: "value0", blurb_id: "value1" - assert_equal "user/value0/profile/blurbs/value1", path + path = client.blurb_path room_id: "value0", legacy_room_id: "value1", blurb_id: "value2" + assert_equal "rooms/value0/blurbs/legacy/value1.value2", path end end diff --git a/shared/output/gapic/templates/showcase/test/google/showcase/v1beta1/messaging_test.rb b/shared/output/gapic/templates/showcase/test/google/showcase/v1beta1/messaging_test.rb index 2dd188d2d..382ff9689 100644 --- a/shared/output/gapic/templates/showcase/test/google/showcase/v1beta1/messaging_test.rb +++ b/shared/output/gapic/templates/showcase/test/google/showcase/v1beta1/messaging_test.rb @@ -962,6 +962,7 @@ def test_connect request.to_a.each do |r| assert_kind_of ::Google::Showcase::V1beta1::ConnectRequest, r assert_equal Gapic::Protobuf.coerce({}, to: ::Google::Showcase::V1beta1::ConnectRequest::ConnectConfig), r.config + assert_equal :config, r.request end end end diff --git a/shared/protos/garbage/garbage.proto b/shared/protos/garbage/garbage.proto index d3c5dc497..21c3ae106 100644 --- a/shared/protos/garbage/garbage.proto +++ b/shared/protos/garbage/garbage.proto @@ -312,6 +312,8 @@ message TypicalGarbage { // This is a multiple-field oneof's double field. double oneof_multiple_double = 21; } + + optional int32 optional_int32 = 22; } // This is one specific garbage, man. diff --git a/shared/protos/google/showcase/v1beta1/echo.proto b/shared/protos/google/showcase/v1beta1/echo.proto index b20826e66..6e9d78a37 100644 --- a/shared/protos/google/showcase/v1beta1/echo.proto +++ b/shared/protos/google/showcase/v1beta1/echo.proto @@ -31,7 +31,8 @@ option java_multiple_files = true; // This service is used showcase the four main types of rpcs - unary, server // side streaming, client side streaming, and bidirectional streaming. This // service also exposes methods that explicitly implement server delay, and -// paginated calls. +// paginated calls. Set the 'showcase-trailer' metadata key on any method +// to have the values echoed in the response trailers. service Echo { // This service is meant to only run locally on the port 7469 (keypad digits // for "show"). @@ -94,7 +95,7 @@ service Echo { }; } - // This method will block (wait) for the requested amount of time + // This method will block (wait) for the requested amount of time // and then return the response or error. // This method showcases how a client handles delays or retries. rpc Block(BlockRequest) returns (BlockResponse) { @@ -106,7 +107,7 @@ service Echo { } // The request message used for the Echo, Collect and Chat methods. If content -// is set in this message then the request will succeed. If status is set in +// is set in this message then the request will succeed. If status is set in // this message then the status will be returned as an error. message EchoRequest { oneof response { diff --git a/shared/protos/google/showcase/v1beta1/identity.proto b/shared/protos/google/showcase/v1beta1/identity.proto index a723a0f1f..4bfb4bcdc 100644 --- a/shared/protos/google/showcase/v1beta1/identity.proto +++ b/shared/protos/google/showcase/v1beta1/identity.proto @@ -41,6 +41,7 @@ service Identity { body: "*" }; option (google.api.method_signature) = "user.display_name,user.email"; + option (google.api.method_signature) = "user.display_name,user.email,user.age,user.nickname,user.enable_notifications,user.height_feet"; } // Retrieves the User with the given uri. @@ -100,6 +101,24 @@ message User { google.protobuf.Timestamp update_time = 5 [ (google.api.field_behavior) = OUTPUT_ONLY ]; + + // The age of the use in years. + optional int32 age = 6; + + // The height of the user in feet. + optional double height_feet = 7; + + // The nickname of the user. + // + // (-- aip.dev/not-precedent: An empty string is a valid nickname. + // Ordinarily, proto3_optional should not be used on a `string` field. --) + optional string nickname = 8; + + // Enables the receiving of notifications. The default is true if unset. + // + // (-- aip.dev/not-precedent: The default for the feature is true. + // Ordinarily, the default for a `bool` field should be false. --) + optional bool enable_notifications = 9; } // The request message for the google.showcase.v1beta1.Identity\CreateUser diff --git a/shared/protos/google/showcase/v1beta1/messaging.proto b/shared/protos/google/showcase/v1beta1/messaging.proto index 6aa515f48..3b343f5da 100644 --- a/shared/protos/google/showcase/v1beta1/messaging.proto +++ b/shared/protos/google/showcase/v1beta1/messaging.proto @@ -287,9 +287,11 @@ message ListRoomsResponse { // posted on a user profile. message Blurb { option (google.api.resource) = { - type: "google.showcase.com/Blurb" + type: "showcase.googleapis.com/Blurb" + pattern: "users/{user_id}/profile/blurbs/legacy/{legacy_user_id}~{blurb_id}" + pattern: "users/{user_id}/profile/blurbs/{blurb_id}" pattern: "rooms/{room_id}/blurbs/{blurb_id}" - pattern: "user/{user_id}/profile/blurbs/{blurb_id}" + pattern: "rooms/{room_id}/blurbs/legacy/{legacy_room_id}.{blurb_id}" }; // The resource name of the chat room. @@ -317,6 +319,18 @@ message Blurb { google.protobuf.Timestamp update_time = 6 [ (google.api.field_behavior) = OUTPUT_ONLY ]; + + // (-- aip.dev/not-precedent: This is designed for testing non-slash + // resource patterns. Ordinarily, non-slash separators are discouraged. --) + oneof legacy_id { + // The legacy id of the room. This field is used to signal + // the use of the compound resource pattern `rooms/{room_id}/blurbs/legacy/{legacy_room_id}.{blurb_id}` + string legacy_room_id = 7; + + // The legacy id of the user. This field is used to signal + // the use of the compound resource pattern `users/{user_id}/profile/blurbs/legacy/{legacy_user_id}~{blurb_id}` + string legacy_user_id = 8; + } } // The request message for the google.showcase.v1beta1.Messaging\CreateBlurb diff --git a/shared/test/showcase/identity_test.rb b/shared/test/showcase/identity_test.rb new file mode 100644 index 000000000..015612061 --- /dev/null +++ b/shared/test/showcase/identity_test.rb @@ -0,0 +1,50 @@ +# frozen_string_literal: true + +# Copyright 2018 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +require "test_helper" +require "google/showcase/v1beta1/identity" +require "grpc" + +class IdentityTest < ShowcaseTest + def setup + @client = new_identity_client + end + + def test_user_create + display_name = "Jane Doe" + email = "janedoe@example.com" + nickname = "doe" + height_feet = 6.2 + + user = { + display_name: display_name, + email: email, + nickname: nickname, + height_feet: height_feet + } + + response = @client.create_user user: user + assert_kind_of ::Google::Showcase::V1beta1::User, response + refute_nil response.name + assert_equal display_name, response.display_name + assert_equal email, response.email + refute response.has_age? + assert response.has_height_feet? + assert_equal height_feet, response.height_feet + assert response.has_nickname? + assert_equal nickname, response.nickname + end +end diff --git a/shared/test/test_helper.rb b/shared/test/test_helper.rb index 05cad9106..a1395af48 100644 --- a/shared/test/test_helper.rb +++ b/shared/test/test_helper.rb @@ -25,6 +25,7 @@ def generate_library_for_test imports, protos protoc_cmd = [ "grpc_tools_ruby_protoc", + "--experimental_allow_proto3_optional=1", "#{imports.map {|x| "-I#{x}"}.join " "}", "--ruby_out=#{client_lib}/lib", "--grpc_out=#{client_lib}/lib", @@ -45,6 +46,12 @@ def new_echo_client end end + def new_identity_client + Google::Showcase::V1beta1::Identity::Client.new do |config| + config.credentials = GRPC::Core::Channel.new "localhost:7469", nil, :this_channel_is_insecure + end + end + def new_echo_operations_client Google::Showcase::V1beta1::Echo::Operations.new do |config| config.credentials = GRPC::Core::Channel.new "localhost:7469", nil, :this_channel_is_insecure @@ -56,7 +63,7 @@ def new_echo_operations_client if ENV['CI'].nil? puts "Starting showcase server..." if ENV["VERBOSE"] server_id, status = Open3.capture2 "docker run --rm -d -p 7469:7469/tcp -p 7469:7469/udp "\ - "gcr.io/gapic-images/gapic-showcase:0.5.0" + "gcr.io/gapic-images/gapic-showcase:0.11.0" raise "failed to start showcase" unless status.exitstatus.zero? server_id.chop! @@ -69,7 +76,7 @@ def new_echo_operations_client @showcase_library = begin library = generate_library_for_test( %w[api-common-protos protos], - %w[google/showcase/v1beta1/echo.proto]) + %w[google/showcase/v1beta1/echo.proto google/showcase/v1beta1/identity.proto]) $LOAD_PATH.unshift "#{library}/lib" library end