gapic-generator-cloud 0.3.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 (40) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +81 -0
  3. data/CONTRIBUTING.md +28 -0
  4. data/LICENSE +202 -0
  5. data/README.md +84 -0
  6. data/bin/protoc-gen-ruby_cloud +33 -0
  7. data/bin/ruby-cloud-docker-entrypoint +103 -0
  8. data/cloud-rubocop.yml +14 -0
  9. data/lib/gapic/generator/cloud/version.rb +23 -0
  10. data/lib/gapic/generators/cloud_generator.rb +119 -0
  11. data/lib/gapic/presenters/wrapper_gem_presenter.rb +123 -0
  12. data/lib/gapic/presenters/wrapper_service_presenter.rb +49 -0
  13. data/templates/cloud/gem/authentication.erb +172 -0
  14. data/templates/cloud/gem/gemspec.erb +38 -0
  15. data/templates/cloud/gem/gitignore.erb +23 -0
  16. data/templates/cloud/gem/license.erb +204 -0
  17. data/templates/cloud/gem/rakefile.erb +156 -0
  18. data/templates/cloud/gem/readme.erb +93 -0
  19. data/templates/cloud/gem/repo-metadata.erb +6 -0
  20. data/templates/cloud/gem/rubocop.erb +36 -0
  21. data/templates/cloud/gem/yardopts.erb +13 -0
  22. data/templates/cloud/service/client/_credentials.erb +30 -0
  23. data/templates/cloud/service/client/_requires.erb +2 -0
  24. data/templates/cloud/service/client/_self_configure.erb +15 -0
  25. data/templates/cloud/service/client/method/def/_rescue.erb +3 -0
  26. data/templates/cloud/service/client/method/docs/_error.erb +2 -0
  27. data/templates/cloud/shared/_license.erb +13 -0
  28. data/templates/cloud/wrapper_gem/_main.erb +90 -0
  29. data/templates/cloud/wrapper_gem/client_test.erb +22 -0
  30. data/templates/cloud/wrapper_gem/entrypoint.erb +4 -0
  31. data/templates/cloud/wrapper_gem/gemfile.erb +17 -0
  32. data/templates/cloud/wrapper_gem/gemspec.erb +40 -0
  33. data/templates/cloud/wrapper_gem/main.erb +5 -0
  34. data/templates/cloud/wrapper_gem/rakefile.erb +190 -0
  35. data/templates/cloud/wrapper_gem/readme.erb +95 -0
  36. data/templates/cloud/wrapper_gem/rubocop.erb +23 -0
  37. data/templates/cloud/wrapper_gem/test_helper.erb +9 -0
  38. data/templates/cloud/wrapper_gem/version_test.erb +11 -0
  39. data/templates/cloud/wrapper_gem/yardopts.erb +15 -0
  40. metadata +227 -0
@@ -0,0 +1,6 @@
1
+ <%- assert_locals gem -%>
2
+ {
3
+ "language": "ruby",
4
+ "distribution_name": "<%= gem.name %>",
5
+ "client_documentation": "https://googleapis.dev/ruby/<%= gem.name %>/latest"
6
+ }
@@ -0,0 +1,36 @@
1
+ <%- assert_locals gem -%>
2
+ inherit_gem:
3
+ google-style: google-style.yml
4
+
5
+ AllCops:
6
+ Exclude:
7
+ - "<%= gem.name %>.gemspec"
8
+ - "lib/**/*_pb.rb"
9
+ - "proto_docs/**/*"
10
+ - "test/**/*"
11
+ - "acceptance/**/*"
12
+ - "Rakefile"
13
+
14
+ Metrics/AbcSize:
15
+ Enabled: false
16
+ Metrics/ClassLength:
17
+ Enabled: false
18
+ Metrics/CyclomaticComplexity:
19
+ Enabled: false
20
+ Metrics/LineLength:
21
+ Enabled: false
22
+ Metrics/MethodLength:
23
+ Enabled: false
24
+ Metrics/ModuleLength:
25
+ Enabled: false
26
+ Metrics/PerceivedComplexity:
27
+ Enabled: false
28
+ Naming/FileName:
29
+ Exclude:
30
+ - "lib/<%= gem.name %>.rb"
31
+ Style/CaseEquality:
32
+ Enabled: false
33
+ Style/IfUnlessModifier:
34
+ Enabled: false
35
+ Style/ModuleFunction:
36
+ Enabled: false
@@ -0,0 +1,13 @@
1
+ <%- assert_locals gem -%>
2
+ --no-private
3
+ --title=<%= gem.title %> API
4
+ --exclude _pb\.rb$
5
+ --markup markdown
6
+ --markup-provider redcarpet
7
+
8
+ ./lib/**/*.rb
9
+ ./proto_docs/**/*.rb
10
+ -
11
+ README.md
12
+ LICENSE.md
13
+ AUTHENTICATION.md
@@ -0,0 +1,30 @@
1
+ <%- assert_locals service -%>
2
+ <% @requires = capture do %>
3
+ require "googleauth"
4
+ <% end %>
5
+ # Credentials for the <%= service.name %> API.
6
+ class <%= service.credentials_name %> < Google::Auth::Credentials
7
+ <%- if service.client_scopes.any? -%>
8
+ self.scope = [
9
+ <%- service.client_scopes.each_with_index do |client_scope, index| -%>
10
+ <%- comma = index == service.client_scopes.count - 1 ? "" : "," -%>
11
+ <%= client_scope.inspect %><%= comma %>
12
+ <%- end -%>
13
+ ]
14
+ <%- end -%>
15
+ self.env_vars = [
16
+ "<%= service.gem.env_prefix %>_CREDENTIALS",
17
+ "<%= service.gem.env_prefix %>_KEYFILE",
18
+ "GOOGLE_CLOUD_CREDENTIALS",
19
+ "GOOGLE_CLOUD_KEYFILE",
20
+ "GCLOUD_KEYFILE",
21
+ "<%= service.gem.env_prefix %>_CREDENTIALS_JSON",
22
+ "<%= service.gem.env_prefix %>_KEYFILE_JSON",
23
+ "GOOGLE_CLOUD_CREDENTIALS_JSON",
24
+ "GOOGLE_CLOUD_KEYFILE_JSON",
25
+ "GCLOUD_KEYFILE_JSON"
26
+ ]
27
+ self.paths = [
28
+ "~/.config/google_cloud/application_default_credentials.json"
29
+ ]
30
+ end
@@ -0,0 +1,2 @@
1
+ <%- assert_locals service -%>
2
+ require "google/cloud/errors"
@@ -0,0 +1,15 @@
1
+ <%- assert_locals service -%>
2
+ @configure ||= begin
3
+ namespace = <%= service.namespace.split("::").inspect %>
4
+ parent_config = while namespace.any?
5
+ parent_name = namespace.join "::"
6
+ parent_const = const_get parent_name
7
+ break parent_const.configure if parent_const&.respond_to? :configure
8
+ namespace.pop
9
+ end
10
+ default_config = <%= service.client_name %>::Configuration.new parent_config
11
+ <%= render partial: "service/client/self_configure_defaults", locals: {service: service} %>
12
+ default_config
13
+ end
14
+ yield @configure if block_given?
15
+ @configure
@@ -0,0 +1,3 @@
1
+ <%- assert_locals method -%>
2
+ rescue GRPC::BadStatus => e
3
+ raise Google::Cloud::Error.from_error(e)
@@ -0,0 +1,2 @@
1
+ <%- assert_locals method -%>
2
+ # @raise [Google::Cloud::Error] if the RPC is aborted.
@@ -0,0 +1,13 @@
1
+ # Copyright <%= Time.now.year %> Google LLC
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # https://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
@@ -0,0 +1,90 @@
1
+ <%- assert_locals gem -%>
2
+ <% @requires = capture do %>
3
+ require "<%= gem.version_require %>"
4
+ require "googleauth"
5
+ <%- if gem.needs_default_config_block? -%>
6
+ gem "google-cloud-core"
7
+ require "google/cloud" unless defined? Google::Cloud.new
8
+ require "google/cloud/config"
9
+
10
+ # Set the default configuration
11
+ Google::Cloud.configure.add_config! :<%= gem.google_cloud_short_name %> do |config|
12
+ config.add_field! :credentials, nil, match: [String, Hash, Google::Auth::Credentials]
13
+ config.add_field! :lib_name, nil, match: String
14
+ config.add_field! :lib_version, nil, match: String
15
+ config.add_field! :interceptors, nil, match: Array
16
+ config.add_field! :timeout, nil, match: Numeric
17
+ config.add_field! :metadata, nil, match: Hash
18
+ config.add_field! :retry_policy, nil, match: [Hash, Proc]
19
+ end
20
+ <%- end -%>
21
+ <% end %>
22
+ <%- gem.services.each do |service| -%>
23
+ ##
24
+ # Create a new client object for <%= service.name %>.
25
+ #
26
+ # By default, this returns an instance of
27
+ # <%= gem.docs_link version: gem.default_version, class_name: "#{service.name}::Client" %>
28
+ # for version <%= gem.default_version.capitalize %> of the API.
29
+ # However, you can specify specify a different API version by passing it in the
30
+ # `version` parameter. If the <%= service.name %> service is
31
+ # supported by that API version, and the corresponding gem is available, the
32
+ # appropriate versioned client will be returned.
33
+ #
34
+ <%- if service.doc_description -%>
35
+ # ## About <%= service.name %>
36
+ #
37
+ <%= indent service.doc_description(disable_xrefs: true), "# " %>
38
+ #
39
+ <%- end -%>
40
+ # @param version [String, Symbol] The API version to connect to. Optional.
41
+ # Defaults to `:<%= gem.default_version %>`.
42
+ # @return [<%= service.name %>::Client] A client object for the specified version.
43
+ #
44
+ def self.<%= service.factory_method_name %> version: :<%= gem.default_version %>, &block
45
+ require "<%= gem.namespace_require %>/#{version.to_s.downcase}"
46
+
47
+ package_name = <%= gem.namespace %>
48
+ .constants
49
+ .select { |sym| sym.to_s.downcase == version.to_s.downcase.tr("_", "") }
50
+ .first
51
+ package_module = <%= gem.namespace %>.const_get package_name
52
+ package_module.const_get(:<%= service.name %>).const_get(:Client).new(&block)
53
+ end
54
+
55
+ <%- end -%>
56
+ <%- if gem.google_cloud_short_name -%>
57
+ ##
58
+ # Configure the <%= gem.name %> library.
59
+ #
60
+ # The following configuration parameters are supported:
61
+ #
62
+ # * `credentials` (*type:* `String, Hash, Google::Auth::Credentials`) -
63
+ # The path to the keyfile as a String, the contents of the keyfile as a
64
+ # Hash, or a Google::Auth::Credentials object.
65
+ # * `lib_name` (*type:* `String`) -
66
+ # The library name as recorded in instrumentation and logging.
67
+ # * `lib_version` (*type:* `String`) -
68
+ # The library version as recorded in instrumentation and logging.
69
+ # * `interceptors` (*type:* `Array<GRPC::ClientInterceptor>`) -
70
+ # An array of interceptors that are run before calls are executed.
71
+ # * `timeout` (*type:* `Integer`) -
72
+ # Default timeout in milliseconds.
73
+ # * `metadata` (*type:* `Hash{Symbol=>String}`) -
74
+ # Additional gRPC headers to be sent with the call.
75
+ # * `retry_policy` (*type:* `Hash`) -
76
+ # The retry policy. The value is a hash with the following keys:
77
+ # * `:initial_delay` (*type:* `Numeric`) - The initial delay in seconds.
78
+ # * `:max_delay` (*type:* `Numeric`) - The max delay in seconds.
79
+ # * `:multiplier` (*type:* `Numeric`) - The incremental backoff multiplier.
80
+ # * `:retry_codes` (*type:* `Array<String>`) -
81
+ # The error codes that should trigger a retry.
82
+ #
83
+ # @return [Google::Cloud::Config] The default configuration used by this library
84
+ #
85
+ def self.configure
86
+ yield Google::Cloud.configure.<%= gem.google_cloud_short_name %> if block_given?
87
+
88
+ Google::Cloud.configure.<%= gem.google_cloud_short_name %>
89
+ end
90
+ <%- end -%>
@@ -0,0 +1,22 @@
1
+ <%- assert_locals gem -%>
2
+ <%= render partial: "shared/header" -%>
3
+
4
+ require "helper"
5
+ require "<%= gem.namespace_require %>"
6
+ require "gapic/common"
7
+ require "gapic/grpc"
8
+
9
+ class <%= gem.namespace %>::ClientConstructionMinitest < Minitest::Test
10
+ <%- gem.services.each do |service| -%>
11
+ def test_<%= service.factory_method_name %>
12
+ Gapic::ServiceStub.stub :new, :stub do
13
+ grpc_channel = GRPC::Core::Channel.new "localhost:8888", nil, :this_channel_is_insecure
14
+ client = <%= gem.namespace %>.<%= service.factory_method_name %> do |config|
15
+ config.credentials = grpc_channel
16
+ end
17
+ assert_kind_of <%= gem.namespaced_class "#{service.name}::Client", version: gem.default_version %>, client
18
+ end
19
+ end
20
+
21
+ <%- end -%>
22
+ end
@@ -0,0 +1,4 @@
1
+ <%- assert_locals gem -%>
2
+ <%= render partial: "shared/header" -%>
3
+
4
+ require "<%= gem.namespace_require %>"
@@ -0,0 +1,17 @@
1
+ <%- assert_locals gem -%>
2
+ source "https://rubygems.org"
3
+
4
+ gemspec
5
+
6
+ gem "google-cloud-core", path: "../google-cloud-core"
7
+ gem "google-cloud-env", path: "../google-cloud-env"
8
+ gem "google-cloud-errors", path: "../google-cloud-errors"
9
+ <%- gem.gem_version_dependencies.each do |name, _requirement| -%>
10
+ gem "<%= name %>", path: "../<%= name %>"
11
+ <%- end -%>
12
+
13
+ gem "rake"
14
+
15
+ # Pin minitest to 5.11.x to avoid warnings emitted by 5.12.
16
+ # See https://github.com/googleapis/google-cloud-ruby/issues/4110
17
+ gem "minitest", "~> 5.11.3"
@@ -0,0 +1,40 @@
1
+ <%- assert_locals gem -%>
2
+ # -*- ruby -*-
3
+ # encoding: utf-8
4
+
5
+ require File.expand_path("lib/<%= gem.version_require %>", __dir__)
6
+
7
+ Gem::Specification.new do |gem|
8
+ gem.name = "<%= gem.name %>"
9
+ gem.version = <%= gem.version_name_full %>
10
+
11
+ gem.authors = <%= gem.authors.inspect %>
12
+ gem.email = <%= gem.email.inspect %>
13
+ gem.description = <%= gem.description.inspect %>
14
+ gem.summary = <%= gem.summary.inspect %>
15
+ gem.homepage = <%= gem.homepage.inspect %>
16
+ gem.license = "Apache-2.0"
17
+
18
+ gem.platform = Gem::Platform::RUBY
19
+
20
+ gem.files = `git ls-files -- lib/*`.split("\n") +
21
+ <%= gem.extra_files.inspect %>
22
+ gem.require_paths = ["lib"]
23
+
24
+ gem.required_ruby_version = ">= 2.4"
25
+
26
+ gem.add_dependency "google-cloud-core", "~> 1.5"
27
+ <%- gem.gem_version_dependencies.each do |name, requirement| -%>
28
+ gem.add_dependency "<%= name %>", "~> <%= requirement %>"
29
+ <%- end -%>
30
+
31
+ gem.add_development_dependency "autotest-suffix", "~> 1.1"
32
+ gem.add_development_dependency "google-style", "~> 1.24.0"
33
+ gem.add_development_dependency "minitest", "~> 5.10"
34
+ gem.add_development_dependency "minitest-autotest", "~> 1.0"
35
+ gem.add_development_dependency "minitest-focus", "~> 1.1"
36
+ gem.add_development_dependency "minitest-rg", "~> 5.2"
37
+ gem.add_development_dependency "redcarpet", "~> 3.0"
38
+ gem.add_development_dependency "simplecov", "~> 0.9"
39
+ gem.add_development_dependency "yard", "~> 0.9"
40
+ end
@@ -0,0 +1,5 @@
1
+ <%- assert_locals gem -%>
2
+ <%= render partial: "wrapper_gem/main",
3
+ layout: "layouts/ruby",
4
+ locals: { gem: gem, namespace: gem.namespace }
5
+ %>
@@ -0,0 +1,190 @@
1
+ <%- assert_locals gem -%>
2
+ <%- service = gem.services.first -%>
3
+ <%- assert_locals service -%>
4
+ <%= render partial: "shared/header" -%>
5
+
6
+ require "bundler/setup"
7
+ require "bundler/gem_tasks"
8
+
9
+ require "rubocop/rake_task"
10
+ RuboCop::RakeTask.new
11
+
12
+ require "rake/testtask"
13
+ desc "Run tests."
14
+ Rake::TestTask.new do |t|
15
+ t.libs << "test"
16
+ t.test_files = FileList["test/**/*_test.rb"]
17
+ t.warning = true
18
+ end
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
+ desc "Runs the smoke tests."
35
+ Rake::TestTask.new :smoke_test do |t|
36
+ t.test_files = FileList["acceptance/**/*smoke_test.rb"]
37
+ t.warning = false
38
+ end
39
+
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
+ # Acceptance tests
55
+ desc "Run the <%= gem.name %> acceptance tests."
56
+ task :acceptance, :project, :keyfile do |t, args|
57
+ project = args[:project]
58
+ project ||=
59
+ ENV["<%= gem.env_prefix %>_TEST_PROJECT"] ||
60
+ ENV["GCLOUD_TEST_PROJECT"]
61
+ keyfile = args[:keyfile]
62
+ keyfile ||=
63
+ ENV["<%= gem.env_prefix %>_TEST_KEYFILE"] ||
64
+ ENV["GCLOUD_TEST_KEYFILE"]
65
+ if keyfile
66
+ keyfile = File.read keyfile
67
+ else
68
+ keyfile ||=
69
+ ENV["<%= gem.env_prefix %>_TEST_KEYFILE_JSON"] ||
70
+ ENV["GCLOUD_TEST_KEYFILE_JSON"]
71
+ end
72
+ if project.nil? || keyfile.nil?
73
+ fail "You must provide a project and keyfile. e.g. rake acceptance[test123, /path/to/keyfile.json] or <%= gem.env_prefix %>_TEST_PROJECT=test123 <%= gem.env_prefix %>_TEST_KEYFILE=/path/to/keyfile.json rake acceptance"
74
+ end
75
+ require "<%= service.credentials_require %>"
76
+ <%= service.credentials_name_full %>.env_vars.each do |path|
77
+ ENV[path] = nil
78
+ end
79
+ ENV["<%= gem.env_prefix %>_PROJECT"] = project
80
+ ENV["<%= gem.env_prefix %>_TEST_PROJECT"] = project
81
+ ENV["<%= gem.env_prefix %>_KEYFILE_JSON"] = keyfile
82
+
83
+ Rake::Task["acceptance:run"].invoke
84
+ end
85
+
86
+ namespace :acceptance do
87
+ task :run do
88
+ if File.directory? "acceptance"
89
+ Rake::Task[:smoke_test].invoke
90
+ else
91
+ puts "The <%= gem.name %> gem has no acceptance tests."
92
+ end
93
+ end
94
+
95
+ desc "Run acceptance tests with coverage."
96
+ task :coverage do
97
+ end
98
+
99
+ desc "Run acceptance cleanup."
100
+ task :cleanup do
101
+ end
102
+ end
103
+
104
+ task :samples do
105
+ Rake::Task["samples:latest"].invoke
106
+ end
107
+
108
+ namespace :samples do
109
+ task :latest do
110
+ if File.directory? "samples"
111
+ Dir.chdir "samples" do
112
+ Bundler.with_clean_env do
113
+ ENV["GOOGLE_CLOUD_SAMPLES_TEST"] = "not_master"
114
+ sh "bundle update"
115
+ sh "bundle exec rake test"
116
+ end
117
+ end
118
+ else
119
+ puts "The <%= gem.name %> gem has no samples to test."
120
+ end
121
+ end
122
+
123
+ task :master do
124
+ if File.directory? "samples"
125
+ Dir.chdir "samples" do
126
+ Bundler.with_clean_env do
127
+ ENV["GOOGLE_CLOUD_SAMPLES_TEST"] = "master"
128
+ sh "bundle update"
129
+ sh "bundle exec rake test"
130
+ end
131
+ end
132
+ else
133
+ puts "The <%= gem.name %> gem has no samples to test."
134
+ end
135
+ end
136
+ end
137
+
138
+ require "yard"
139
+ require "yard/rake/yardoc_task"
140
+ YARD::Rake::YardocTask.new do |y|
141
+ <%- if gem.yard_strict? -%>
142
+ y.options << "--fail-on-warning"
143
+ <%- end -%>
144
+ end
145
+
146
+ desc "Run yard-doctest example tests."
147
+ task :doctest do
148
+ puts "The <%= gem.name %> gem does not have doctest tests."
149
+ end
150
+
151
+ desc "Run the CI build"
152
+ task :ci do
153
+ header "BUILDING <%= gem.name %>"
154
+ header "<%= gem.name %> rubocop", "*"
155
+ Rake::Task[:rubocop].invoke
156
+ header "<%= gem.name %> yard", "*"
157
+ Rake::Task[:yard].invoke
158
+ header "<%= gem.name %> test", "*"
159
+ Rake::Task[:test].invoke
160
+ end
161
+
162
+ namespace :ci do
163
+ desc "Run the CI build, with smoke tests."
164
+ task :smoke_test do
165
+ Rake::Task[:ci].invoke
166
+ header "<%= gem.name %> smoke_test", "*"
167
+ Rake::Task[:smoke_test].invoke
168
+ end
169
+ desc "Run the CI build, with acceptance tests."
170
+ task :acceptance do
171
+ Rake::Task[:ci].invoke
172
+ header "<%= gem.name %> acceptance", "*"
173
+ Rake::Task[:acceptance].invoke
174
+ end
175
+ task :a do
176
+ # This is a handy shortcut to save typing
177
+ Rake::Task["ci:acceptance"].invoke
178
+ end
179
+ end
180
+
181
+ task default: :test
182
+
183
+ def header str, token = "#"
184
+ line_length = str.length + 8
185
+ puts ""
186
+ puts token * line_length
187
+ puts "#{token * 3} #{str} #{token * 3}"
188
+ puts token * line_length
189
+ puts ""
190
+ end