gapic-generator-cloud 0.10.1 → 0.45.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (46) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +330 -0
  3. data/README.md +82 -61
  4. data/bin/protoc-gen-bazel_ruby_cloud +2 -2
  5. data/bin/protoc-gen-ruby_cloud +2 -2
  6. data/lib/gapic/generator/cloud/version.rb +1 -1
  7. data/lib/gapic/generators/cloud_generator.rb +20 -21
  8. data/lib/gapic/generators/cloud_generator_parameters.rb +5 -1
  9. data/lib/gapic/presenters/cloud_gem_presenter.rb +60 -13
  10. data/lib/gapic/presenters/wrapper_gem_presenter.rb +31 -9
  11. data/lib/gapic/presenters/wrapper_service_presenter.rb +23 -1
  12. data/lib/gapic/presenters/wrapper_service_rest_presenter.rb +49 -0
  13. data/templates/cloud/gem/authentication.text.erb +125 -0
  14. data/templates/cloud/gem/{rakefile.erb → rakefile.text.erb} +0 -37
  15. data/templates/cloud/gem/{readme.erb → readme.text.erb} +48 -26
  16. data/templates/cloud/gem/{repo-metadata.erb → repo-metadata.text.erb} +3 -0
  17. data/templates/cloud/gem/{rubocop.erb → rubocop.text.erb} +3 -0
  18. data/templates/cloud/gem/{yardopts.erb → yardopts.text.erb} +1 -1
  19. data/templates/cloud/service/rest/client/method/def/_rescue.text.erb +3 -0
  20. data/templates/cloud/wrapper_gem/{_main.erb → _main.text.erb} +69 -9
  21. data/templates/cloud/wrapper_gem/client_test.text.erb +59 -0
  22. data/templates/cloud/wrapper_gem/gemfile.text.erb +29 -0
  23. data/templates/cloud/wrapper_gem/{gemspec.erb → gemspec.text.erb} +2 -11
  24. data/templates/cloud/wrapper_gem/{rakefile.erb → rakefile.text.erb} +2 -37
  25. data/templates/cloud/wrapper_gem/{readme.erb → readme.text.erb} +45 -35
  26. data/templates/cloud/wrapper_gem/{version_test.erb → version_test.text.erb} +1 -1
  27. data/templates/cloud/wrapper_gem/{yardopts.erb → yardopts.text.erb} +1 -1
  28. metadata +34 -151
  29. data/templates/cloud/gem/authentication.erb +0 -174
  30. data/templates/cloud/gem/yardopts-cloudrad.erb +0 -15
  31. data/templates/cloud/service/rest/client/method/def/_rescue.erb +0 -4
  32. data/templates/cloud/wrapper_gem/client_test.erb +0 -22
  33. data/templates/cloud/wrapper_gem/gemfile.erb +0 -8
  34. data/templates/cloud/wrapper_gem/yardopts-cloudrad.erb +0 -17
  35. /data/templates/cloud/gem/{gitignore.erb → gitignore.text.erb} +0 -0
  36. /data/templates/cloud/gem/{license.erb → license.text.erb} +0 -0
  37. /data/templates/cloud/service/client/{_credentials.erb → _credentials.text.erb} +0 -0
  38. /data/templates/cloud/service/client/{_requires.erb → _requires.text.erb} +0 -0
  39. /data/templates/cloud/service/client/{_self_configure.erb → _self_configure.text.erb} +0 -0
  40. /data/templates/cloud/service/client/method/def/{_rescue.erb → _rescue.text.erb} +0 -0
  41. /data/templates/cloud/service/client/method/docs/{_error.erb → _error.text.erb} +0 -0
  42. /data/templates/cloud/service/rest/client/method/docs/{_error.erb → _error.text.erb} +0 -0
  43. /data/templates/cloud/shared/{_license.erb → _license.text.erb} +0 -0
  44. /data/templates/cloud/wrapper_gem/{entrypoint.erb → entrypoint.text.erb} +0 -0
  45. /data/templates/cloud/wrapper_gem/{main.erb → main.text.erb} +0 -0
  46. /data/templates/cloud/wrapper_gem/{rubocop.erb → rubocop.text.erb} +0 -0
@@ -14,16 +14,19 @@ require "google/cloud/config"
14
14
 
15
15
  # Set the default configuration
16
16
  ::Google::Cloud.configure.add_config! :<%= gem.google_cloud_short_name %> do |config|
17
- config.add_field! :endpoint, <%= gem.services.first&.client_endpoint.inspect %>, match: ::String
17
+ config.add_field! :endpoint, nil, match: ::String
18
18
  config.add_field! :credentials, nil, match: [::String, ::Hash, ::Google::Auth::Credentials]
19
19
  config.add_field! :scope, nil, match: [::Array, ::String]
20
20
  config.add_field! :lib_name, nil, match: ::String
21
21
  config.add_field! :lib_version, nil, match: ::String
22
+ <%- if gem.generate_grpc_clients? -%>
22
23
  config.add_field! :interceptors, nil, match: ::Array
24
+ <%- end -%>
23
25
  config.add_field! :timeout, nil, match: ::Numeric
24
26
  config.add_field! :metadata, nil, match: ::Hash
25
27
  config.add_field! :retry_policy, nil, match: [::Hash, ::Proc]
26
28
  config.add_field! :quota_project, nil, match: ::String
29
+ config.add_field! :universe_domain, nil, match: ::String
27
30
  end
28
31
  <%- end -%>
29
32
  <% end %>
@@ -32,12 +35,21 @@ end
32
35
  # Create a new client object for <%= service.module_name %>.
33
36
  #
34
37
  # By default, this returns an instance of
35
- # <%= gem.docs_link version: gem.default_version, class_name: "#{service.module_name}::Client" %>
36
- # for version <%= gem.default_version.capitalize %> of the API.
37
- # However, you can specify specify a different API version by passing it in the
38
+ # <%= gem.docs_link version: gem.default_version, class_name: service.client_suffix_for_default_transport %>
39
+ # for a <%= gem.default_transport_name %> client for version <%= gem.default_version.capitalize %> of the API.
40
+ # However, you can specify a different API version by passing it in the
38
41
  # `version` parameter. If the <%= service.module_name %> service is
39
42
  # supported by that API version, and the corresponding gem is available, the
40
43
  # appropriate versioned client will be returned.
44
+ <%- if service.supports_multiple_transports? -%>
45
+ # You can also specify a different transport by passing `:rest` or `:grpc` in
46
+ # the `transport` parameter.
47
+ <%- end -%>
48
+ #
49
+ # Raises an exception if the currently installed versioned client gem for the
50
+ # given API version does not support the <% if service.supports_multiple_transports? %>given transport of the <% end %><%= service.module_name %> service.
51
+ # You can determine whether the method will succeed by calling
52
+ # {<%= gem.namespace %>.<%= service.factory_method_name %>_available?}.
41
53
  #
42
54
  <%- if service.doc_description -%>
43
55
  # ## About <%= service.module_name %>
@@ -47,17 +59,63 @@ end
47
59
  <%- end -%>
48
60
  # @param version [::String, ::Symbol] The API version to connect to. Optional.
49
61
  # Defaults to `:<%= gem.default_version %>`.
50
- # @return [<%= service.module_name %>::Client] A client object for the specified version.
62
+ <%- if service.supports_multiple_transports? -%>
63
+ # @param transport [:grpc, :rest] The transport to use. Defaults to `<%= gem.default_transport.inspect %>`.
64
+ <%- end -%>
65
+ # @return [::Object] A client object for the specified version.
51
66
  #
52
- def self.<%= service.factory_method_name %> version: :<%= gem.default_version %>, &block
67
+ def self.<%= service.factory_method_name %> version: :<%= gem.default_version %><% if service.supports_multiple_transports? %>, transport: <%= gem.default_transport.inspect %><% end %>, &block
53
68
  require "<%= gem.namespace_require %>/#{version.to_s.downcase}"
54
69
 
55
70
  package_name = <%= gem.namespace %>
56
71
  .constants
57
72
  .select { |sym| sym.to_s.downcase == version.to_s.downcase.tr("_", "") }
58
73
  .first
59
- package_module = <%= gem.namespace %>.const_get package_name
60
- package_module.const_get(:<%= service.module_name %>).const_get(:Client).new(&block)
74
+ service_module = <%= gem.namespace %>.const_get(package_name).const_get(:<%= service.module_name %>)
75
+ <%- if service.supports_multiple_transports? -%>
76
+ service_module = service_module.const_get(:Rest) if transport == :rest
77
+ service_module.const_get(:Client).new(&block)
78
+ <%- else -%>
79
+ service_module<% if service.generate_rest_clients? %>.const_get(:Rest)<% end %>.const_get(:Client).new(&block)
80
+ <%- end -%>
81
+ end
82
+
83
+ ##
84
+ # Determines whether the <%= service.module_name %> service is supported by the current client.
85
+ # If true, you can retrieve a client object by calling {<%= gem.namespace %>.<%= service.factory_method_name %>}.
86
+ # If false, that method will raise an exception. This could happen if the given
87
+ # API version does not exist or does not support the <%= service.module_name %> service,
88
+ # or if the versioned client gem needs an update to support the <%= service.module_name %> service.
89
+ #
90
+ # @param version [::String, ::Symbol] The API version to connect to. Optional.
91
+ # Defaults to `:<%= gem.default_version %>`.
92
+ <%- if service.supports_multiple_transports? -%>
93
+ # @param transport [:grpc, :rest] The transport to use. Defaults to `<%= gem.default_transport.inspect %>`.
94
+ <%- end -%>
95
+ # @return [boolean] Whether the service is available.
96
+ #
97
+ def self.<%= service.factory_method_name %>_available? version: :<%= gem.default_version %><% if service.supports_multiple_transports? %>, transport: <%= gem.default_transport.inspect %><% end %>
98
+ require "<%= gem.namespace_require %>/#{version.to_s.downcase}"
99
+ package_name = <%= gem.namespace %>
100
+ .constants
101
+ .select { |sym| sym.to_s.downcase == version.to_s.downcase.tr("_", "") }
102
+ .first
103
+ return false unless package_name
104
+ service_module = <%= gem.namespace %>.const_get package_name
105
+ return false unless service_module.const_defined? :<%= service.module_name %>
106
+ service_module = service_module.const_get :<%= service.module_name %>
107
+ <%- if service.supports_multiple_transports? -%>
108
+ if transport == :rest
109
+ return false unless service_module.const_defined? :Rest
110
+ service_module = service_module.const_get :Rest
111
+ end
112
+ <%- elsif service.generate_rest_clients? -%>
113
+ return false unless service_module.const_defined? :Rest
114
+ service_module = service_module.const_get :Rest
115
+ <%- end -%>
116
+ service_module.const_defined? :Client
117
+ rescue ::LoadError
118
+ false
61
119
  end
62
120
 
63
121
  <%- end -%>
@@ -74,12 +132,14 @@ end
74
132
  # The library name as recorded in instrumentation and logging.
75
133
  # * `lib_version` (*type:* `String`) -
76
134
  # The library version as recorded in instrumentation and logging.
135
+ <%- if gem.generate_grpc_clients? -%>
77
136
  # * `interceptors` (*type:* `Array<GRPC::ClientInterceptor>`) -
78
137
  # An array of interceptors that are run before calls are executed.
138
+ <%- end -%>
79
139
  # * `timeout` (*type:* `Numeric`) -
80
140
  # Default timeout in seconds.
81
141
  # * `metadata` (*type:* `Hash{Symbol=>String}`) -
82
- # Additional gRPC headers to be sent with the call.
142
+ # Additional headers to be sent with the call.
83
143
  # * `retry_policy` (*type:* `Hash`) -
84
144
  # The retry policy. The value is a hash with the following keys:
85
145
  # * `:initial_delay` (*type:* `Numeric`) - The initial delay in seconds.
@@ -0,0 +1,59 @@
1
+ <%- assert_locals gem -%>
2
+ <%= render partial: "shared/header" -%>
3
+
4
+ require "helper"
5
+ require "<%= gem.namespace_require %>"
6
+ require "gapic/common"
7
+ <%- if gem.generate_grpc_clients? -%>
8
+ require "gapic/grpc"
9
+ <%- end -%>
10
+ <%- if gem.generate_rest_clients? -%>
11
+ require "gapic/rest"
12
+ <%- end -%>
13
+
14
+ class <%= gem.namespace %>::ClientConstructionMinitest < Minitest::Test
15
+ class DummyStub
16
+ def endpoint
17
+ "endpoint.example.com"
18
+ end
19
+
20
+ def universe_domain
21
+ "example.com"
22
+ end
23
+
24
+ def stub_logger
25
+ nil
26
+ end
27
+
28
+ def logger
29
+ nil
30
+ end
31
+ end
32
+
33
+ <%- start_line_spacer -%>
34
+ <%- gem.services.each do |service| -%>
35
+ <%- if service.generate_grpc_clients? -%>
36
+ <%= line_spacer %> def test_<%= service.factory_method_name %>_grpc
37
+ skip unless <%= gem.namespace %>.<%= service.factory_method_name %>_available?<% if service.supports_multiple_transports? %> transport: :grpc<% end %>
38
+ Gapic::ServiceStub.stub :new, DummyStub.new do
39
+ grpc_channel = GRPC::Core::Channel.new "localhost:8888", nil, :this_channel_is_insecure
40
+ client = <%= gem.namespace %>.<%= service.factory_method_name %><% if service.supports_multiple_transports? %> transport: :grpc<% end %> do |config|
41
+ config.credentials = grpc_channel
42
+ end
43
+ assert_kind_of <%= gem.namespaced_class "#{service.module_name}::#{service.client_name}", version: gem.default_version %>, client
44
+ end
45
+ end
46
+ <%- end -%>
47
+ <%- if service.generate_rest_clients? -%>
48
+ <%= line_spacer %> def test_<%= service.factory_method_name %>_rest
49
+ skip unless <%= gem.namespace %>.<%= service.factory_method_name %>_available?<% if service.supports_multiple_transports? %> transport: :rest<% end %>
50
+ Gapic::Rest::ClientStub.stub :new, DummyStub.new do
51
+ client = <%= gem.namespace %>.<%= service.factory_method_name %><% if service.supports_multiple_transports? %> transport: :rest<% end %> do |config|
52
+ config.credentials = :dummy_credentials
53
+ end
54
+ assert_kind_of <%= gem.namespaced_class "#{service.module_name}::Rest::#{service.client_name}", version: gem.default_version %>, client
55
+ end
56
+ end
57
+ <%- end -%>
58
+ <%- end -%>
59
+ end
@@ -0,0 +1,29 @@
1
+ <%- assert_locals gem -%>
2
+ source "https://rubygems.org"
3
+
4
+ gemspec
5
+
6
+ local_dependencies = <%= gem.versioned_gems.inspect %>
7
+
8
+ main_spec = gemspecs.last || Bundler.load_gemspec(File.join __dir__, "<%= gem.name %>.gemspec")
9
+ local_dependencies.each do |name|
10
+ spec_path = File.expand_path "../#{name}/#{name}.gemspec", __dir__
11
+ unless File.file? spec_path
12
+ warn "WARNING: Disabled local dependency for #{name} because gemspec not found."
13
+ next
14
+ end
15
+ version = Bundler.load_gemspec(spec_path).version
16
+ if main_spec.dependencies.any? { |dep| dep.name == name && !dep.requirement.satisfied_by?(version) }
17
+ warn "WARNING: Disabled local dependency for #{name} because the gemspec disallows version #{version}."
18
+ next
19
+ end
20
+ gem name, path: "../#{name}"
21
+ end
22
+
23
+ gem "google-style", "~> 1.30.1"
24
+ gem "minitest", "~> 5.22"
25
+ gem "minitest-focus", "~> 1.4"
26
+ gem "minitest-rg", "~> 5.3"
27
+ gem "rake", ">= 13.0"
28
+ gem "redcarpet", "~> 3.6"
29
+ gem "yard", "~> 0.9"
@@ -10,7 +10,7 @@ Gem::Specification.new do |gem|
10
10
 
11
11
  gem.authors = <%= gem.authors.inspect %>
12
12
  gem.email = <%= gem.email.inspect %>
13
- gem.description = <%= gem.description.inspect %>
13
+ gem.description = <%= gem.gemspec_description.inspect %>
14
14
  gem.summary = <%= gem.summary.inspect %>
15
15
  gem.homepage = <%= gem.homepage.inspect %>
16
16
  gem.license = <%= gem.license_name.inspect %>
@@ -21,18 +21,9 @@ Gem::Specification.new do |gem|
21
21
  <%= gem.extra_files.inspect %>
22
22
  gem.require_paths = ["lib"]
23
23
 
24
- gem.required_ruby_version = ">= 2.5"
24
+ gem.required_ruby_version = ">= 3.0"
25
25
 
26
26
  <%- gem.dependency_list.each do |name, requirements| -%>
27
27
  gem.add_dependency <%= name.inspect %>, <%= requirements.map { |v| v.inspect }.join ", " %>
28
28
  <%- end -%>
29
-
30
- gem.add_development_dependency "google-style", "~> 1.25.1"
31
- gem.add_development_dependency "minitest", "~> 5.14"
32
- gem.add_development_dependency "minitest-focus", "~> 1.1"
33
- gem.add_development_dependency "minitest-rg", "~> 5.2"
34
- gem.add_development_dependency "rake", ">= 12.0"
35
- gem.add_development_dependency "redcarpet", "~> 3.0"
36
- gem.add_development_dependency "simplecov", "~> 0.9"
37
- gem.add_development_dependency "yard", "~> 0.9"
38
29
  end
@@ -17,43 +17,16 @@ Rake::TestTask.new do |t|
17
17
  t.warning = true
18
18
  end
19
19
 
20
- namespace :test do
21
- desc "Runs tests with coverage."
22
- task :coverage do
23
- require "simplecov"
24
- SimpleCov.start do
25
- command_name "<%= gem.name %>"
26
- track_files "lib/**/*.rb"
27
- add_filter "test/"
28
- end
29
-
30
- Rake::Task[:test].invoke
31
- end
32
- end
33
-
34
20
  desc "Runs the smoke tests."
35
21
  Rake::TestTask.new :smoke_test do |t|
36
22
  t.test_files = FileList["acceptance/**/*smoke_test.rb"]
37
23
  t.warning = false
38
24
  end
39
25
 
40
- namespace :smoke_test do
41
- desc "Runs smoke tests with coverage."
42
- task :coverage do
43
- require "simplecov"
44
- SimpleCov.start do
45
- command_name "<%= gem.name %>"
46
- track_files "lib/**/*.rb"
47
- add_filter "test/"
48
- end
49
-
50
- Rake::Task[:smoke_test].invoke
51
- end
52
- end
53
-
54
26
  # Acceptance tests
55
27
  desc "Run the <%= gem.name %> acceptance tests."
56
28
  task :acceptance, :project, :keyfile do |t, args|
29
+ <%- if service && !gem.generic_endpoint? -%>
57
30
  project = args[:project]
58
31
  project ||=
59
32
  ENV["<%= gem.cloud_env_prefix %>_TEST_PROJECT"] ||
@@ -80,6 +53,7 @@ task :acceptance, :project, :keyfile do |t, args|
80
53
  ENV["<%= gem.cloud_env_prefix %>_TEST_PROJECT"] = project
81
54
  ENV["<%= gem.cloud_env_prefix %>_KEYFILE_JSON"] = keyfile
82
55
 
56
+ <%- end -%>
83
57
  Rake::Task["acceptance:run"].invoke
84
58
  end
85
59
 
@@ -92,10 +66,6 @@ namespace :acceptance do
92
66
  end
93
67
  end
94
68
 
95
- desc "Run acceptance tests with coverage."
96
- task :coverage do
97
- end
98
-
99
69
  desc "Run acceptance cleanup."
100
70
  task :cleanup do
101
71
  end
@@ -148,11 +118,6 @@ task :doctest do
148
118
  puts "The <%= gem.name %> gem does not have doctest tests."
149
119
  end
150
120
 
151
- task :cloudrad do
152
- ENV["CLOUDRAD_GEM_NAME"] = "<%= gem.name %>"
153
- sh "bundle exec yard doc --fail-on-warning --yardopts .yardopts-cloudrad"
154
- end
155
-
156
121
  desc "Run the CI build"
157
122
  task :ci do
158
123
  header "BUILDING <%= gem.name %>"
@@ -2,12 +2,16 @@
2
2
 
3
3
  <%= gem.summary %>
4
4
 
5
- <%= gem.description %>
5
+ <%- if gem.summary != gem.description %>
6
+ <% gem.readme_description.each do |line| %>
7
+ <%= line %>
8
+ <% end %>
9
+ <%- end %>
6
10
 
7
11
  Actual client classes for the various versions of this API are defined in
8
12
  _versioned_ client gems, with names of the form `<%= gem.name %>-v*`.
9
13
  The gem `<%= gem.name %>` is the main client library that brings the
10
- verisoned gems in as dependencies, and provides high-level methods for
14
+ versioned gems in as dependencies, and provides high-level methods for
11
15
  constructing clients. More information on versioned clients can be found below
12
16
  in the section titled *Which client should I use?*.
13
17
 
@@ -18,8 +22,7 @@ themselves can be found in the client library documentation for the versioned
18
22
  client gems:
19
23
  <%- last_index = gem.versioned_gems.size - 1 -%>
20
24
  <%- gem.versioned_gems.each_with_index do |name, i| -%>
21
- <%- sep = i == last_index ? "." : "," -%>
22
- [<%= name %>](https://googleapis.dev/ruby/<%= name %>/latest)<%= sep %>
25
+ <%= gem.docs_link gem_name: name, text: name %><%= i == last_index ? "." : "," %>
23
26
  <%- end -%>
24
27
 
25
28
  <%- if gem.product_documentation_url -%>
@@ -47,7 +50,7 @@ In order to use this library, you first need to go through the following steps:
47
50
  <%- if gem.api_id -%>
48
51
  1. [Enable the API.](https://console.cloud.google.com/apis/library/<%= gem.api_id %>)
49
52
  <%- end -%>
50
- 1. {file:AUTHENTICATION.md Set up authentication.}
53
+ 1. [Set up authentication.](AUTHENTICATION.md)
51
54
 
52
55
  <%- end -%>
53
56
  <%- if gem.migration? %>
@@ -60,42 +63,49 @@ versions of this library will likely require updates to use this version.
60
63
  See the {file:MIGRATING.md MIGRATING.md} document for more information.
61
64
 
62
65
  <%- end -%>
63
- ## Enabling Logging
64
-
65
- To enable logging for this library, set the logger for the underlying [gRPC](https://github.com/grpc/grpc/tree/master/src/ruby) library.
66
- The logger that you set may be a Ruby stdlib [`Logger`](https://ruby-doc.org/stdlib/libdoc/logger/rdoc/Logger.html) as shown below,
67
- or a [`Google::Cloud::Logging::Logger`](https://googleapis.dev/ruby/google-cloud-logging/latest)
68
- that will write logs to [Cloud Logging](https://cloud.google.com/logging/). See [grpc/logconfig.rb](https://github.com/grpc/grpc/blob/master/src/ruby/lib/grpc/logconfig.rb)
69
- and the gRPC [spec_helper.rb](https://github.com/grpc/grpc/blob/master/src/ruby/spec/spec_helper.rb) for additional information.
70
-
71
- Configuring a Ruby stdlib logger:
72
-
73
- ```ruby
74
- require "logger"
75
-
76
- module MyLogger
77
- LOGGER = Logger.new $stderr, level: Logger::WARN
78
- def logger
79
- LOGGER
80
- end
81
- end
82
-
83
- # Define a gRPC module-level logger method before grpc/logconfig.rb loads.
84
- module GRPC
85
- extend MyLogger
86
- end
87
- ```
66
+ ## Debug Logging
67
+
68
+ This library comes with opt-in Debug Logging that can help you troubleshoot
69
+ your application's integration with the API. When logging is activated, key
70
+ events such as requests and responses, along with data payloads and metadata
71
+ such as headers and client configuration, are logged to the standard error
72
+ stream.
73
+
74
+ **WARNING:** Client Library Debug Logging includes your data payloads in
75
+ plaintext, which could include sensitive data such as PII for yourself or your
76
+ customers, private keys, or other security data that could be compromising if
77
+ leaked. Always practice good data hygiene with your application logs, and follow
78
+ the principle of least access. Google also recommends that Client Library Debug
79
+ Logging be enabled only temporarily during active debugging, and not used
80
+ permanently in production.
81
+
82
+ To enable logging, set the environment variable `GOOGLE_SDK_RUBY_LOGGING_GEMS`
83
+ to the value `all`. Alternatively, you can set the value to a comma-delimited
84
+ list of client library gem names. This will select the default logging behavior,
85
+ which writes logs to the standard error stream. On a local workstation, this may
86
+ result in logs appearing on the console. When running on a Google Cloud hosting
87
+ service such as [Google Cloud Run](https://cloud.google.com/run), this generally
88
+ results in logs appearing alongside your application logs in the
89
+ [Google Cloud Logging](https://cloud.google.com/logging/) service.
90
+
91
+ Debug logging also requires that the versioned clients for this service be
92
+ sufficiently recent, released after about Dec 10, 2024. If logging is not
93
+ working, try updating the versioned clients in your bundle or installed gems:
94
+ <%- last_index = gem.versioned_gems.size - 1 -%>
95
+ <%- gem.versioned_gems.each_with_index do |name, i| -%>
96
+ <%= gem.docs_link gem_name: name, text: name %><%= i == last_index ? "." : "," %>
97
+ <%- end -%>
88
98
 
89
99
  ## Supported Ruby Versions
90
100
 
91
- This library is supported on Ruby 2.5+.
101
+ This library is supported on Ruby 3.0+.
92
102
 
93
103
  Google provides official support for Ruby versions that are actively supported
94
104
  by Ruby Core—that is, Ruby versions that are either in normal maintenance or
95
- in security maintenance, and not end of life. Currently, this means Ruby 2.5
96
- and later. Older versions of Ruby _may_ still work, but are unsupported and not
97
- recommended. See https://www.ruby-lang.org/en/downloads/branches/ for details
98
- about the Ruby support schedule.
105
+ in security maintenance, and not end of life. Older versions of Ruby _may_
106
+ still work, but are unsupported and not recommended. See
107
+ https://www.ruby-lang.org/en/downloads/branches/ for details about the Ruby
108
+ support schedule.
99
109
 
100
110
  ## Which client should I use?
101
111
 
@@ -6,6 +6,6 @@ require "<%= gem.version_require %>"
6
6
 
7
7
  class <%= gem.namespace %>::VersionMinitest < Minitest::Test
8
8
  def test_has_a_version
9
- refute_nil <%= gem.version_name_full %>
9
+ refute_nil <%= gem.version_name_full %>
10
10
  end
11
11
  end
@@ -1,6 +1,6 @@
1
1
  <%- assert_locals gem -%>
2
2
  --no-private
3
- --title=<%= gem.title %> API
3
+ --title="<%= gem.title %> API"
4
4
  --exclude _pb\.rb$
5
5
  --markup markdown
6
6
  --markup-provider redcarpet