gapic-generator-cloud 0.1.7 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: '08e2bcc2bd866986ff0297a7362e96fbc0aa43a508ce42fe660e6018913da292'
4
- data.tar.gz: fd460034ab84232f65e1ff26d0206df9cef2f0ef00f0ab686617609d0cbec7f7
3
+ metadata.gz: 94f5a540b0be42593cb412dd12b4faedde7bfb63ab763a17fc0996b092aad140
4
+ data.tar.gz: f56a2ad37c354bfc8bfcaceec8ba2243fdd91fd90adcc225c63f1e3d4e9259af
5
5
  SHA512:
6
- metadata.gz: bdc310b93f8b8e06c346706faa1356a184362f9185916ac16b6b85e0e7a373dc26294aa32af15e5707679952d799e27de2c52c45735a819b9d9cd984a24453b8
7
- data.tar.gz: f0f0ad3514794a3070fbf63dca95a37087cd8f2987832a662e090b76d3df0b8f2a5857d3a7cfe47deb596ed09af606dd0f835c0f7ef02c2225916f9e5001ea9a
6
+ metadata.gz: 3967ad36a668b618cfcb254aee896451bc404a885f0d0ebee309878f56c1df5868ebe5fe237c990b9c51bd39ea4fb9626f4a919e1b1ff4c4a5165d1574b7605c
7
+ data.tar.gz: 73232e7e89e8f450e428c8cc13bc474ad77023d780e2ae29e8426f942940cdb6f07cb1ad0da8d59304d2f1a5956835f014d3ccec607a52cb9efa45866b2576cc
data/CHANGELOG.md CHANGED
@@ -1,5 +1,10 @@
1
1
  # Release History for gapic-generator-cloud
2
2
 
3
+ ### 0.2.0 / 2020-03-23
4
+
5
+ * Includes changes from gapic-generator 0.2.0
6
+ * The cloud generator can now be configured to generate wrapper gems.
7
+
3
8
  ### 0.1.7 / 2020-03-18
4
9
 
5
10
  * Includes changes from gapic-generator 0.1.7
@@ -18,38 +18,51 @@
18
18
  require "optparse"
19
19
  require "fileutils"
20
20
 
21
+ bool_option_map = {
22
+ ":gem.:free_tier" => "ruby-cloud-free-tier",
23
+ ":gem.:yard_strict" => "ruby-cloud-yard-strict"
24
+ }
25
+ value_option_map = {
26
+ "configuration" => "ruby-cloud-config",
27
+ ":gem.:name" => "ruby-cloud-gem-name",
28
+ ":gem.:title" => "ruby-cloud-title",
29
+ ":gem.:description" => "ruby-cloud-description",
30
+ ":gem.:summary" => "ruby-cloud-summary",
31
+ ":gem.:homepage" => "ruby-cloud-homepage",
32
+ ":gem.:env_prefix" => "ruby-cloud-env-prefix",
33
+ ":gem.:version_dependencies" => "ruby-cloud-wrapper-of",
34
+ ":gem.:migration_version" => "ruby-cloud-migration-version",
35
+ ":gem.:product_documentation_url" => "ruby-cloud-product-url",
36
+ ":gem.:api_id" => "ruby-cloud-api-id",
37
+ ":gem.:factory_method_suffix" => "ruby-cloud-factory-method-suffix"
38
+ }
39
+ path_option_map = {
40
+ "samples" => ["ruby-cloud-samples", "samples"],
41
+ "grpc_service_config" => "ruby-cloud-grpc-service-config"
42
+ }
43
+
21
44
  parameters = {}
22
45
 
23
46
  OptionParser.new do |op|
24
- op.on "--ruby-cloud-config FILE" do |val|
25
- parameters["configuration"] = val
26
- end
27
- op.on "--ruby-cloud-samples FILE", "--samples FILE" do |val|
28
- paths = val.split(";")
29
- .map { |path| File.expand_path path, "/in" }
30
- .join(";")
31
- parameters["samples"] = paths
32
- end
33
- op.on "--ruby-cloud-grpc-service-config FILE" do |val|
34
- paths = val.split(";")
35
- .map { |path| File.expand_path path, "/in" }
36
- .join(";")
37
- parameters["grpc_service_config"] = paths
38
- end
39
- op.on "--ruby-cloud-gem-name NAME" do |val|
40
- parameters[":gem.:name"] = val
47
+ bool_option_map.each do |key, flags|
48
+ flags = Array(flags).map { |f| "--#{f}" }
49
+ op.on(*flags) do
50
+ parameters[key] = "true"
51
+ end
41
52
  end
42
- op.on "--ruby-cloud-title NAME" do |val|
43
- parameters[":gem.:title"] = val
53
+ value_option_map.each do |key, flags|
54
+ flags = Array(flags).map { |f| "--#{f} VAL" }
55
+ op.on(*flags) do |val|
56
+ parameters[key] = val
57
+ end
44
58
  end
45
- op.on "--ruby-cloud-summary VAL" do |val|
46
- parameters[":gem.:summary"] = val
47
- end
48
- op.on "--ruby-cloud-homepage VAL" do |val|
49
- parameters[":gem.:homepage"] = val
50
- end
51
- op.on "--ruby-cloud-env-prefix VAL" do |val|
52
- parameters[":gem.:env_prefix"] = val
59
+ path_option_map.each do |key, flags|
60
+ flags = Array(flags).map { |f| "--#{f} PATH" }
61
+ op.on(*flags) do |paths|
62
+ parameters[key] = paths.split(";")
63
+ .map { |path| File.expand_path path, "/in" }
64
+ .join(";")
65
+ end
53
66
  end
54
67
  end.parse! ARGV
55
68
 
@@ -59,11 +72,17 @@ parameter_strs =
59
72
  "#{k}=#{v}"
60
73
  end
61
74
 
75
+ ruby_plugin_args =
76
+ if parameters[":gem.:version_dependencies"]
77
+ []
78
+ else
79
+ ["--ruby_out=/out/lib", "--grpc_out=/out/lib"]
80
+ end
81
+
62
82
  protoc_cmd = [
63
83
  "grpc_tools_ruby_protoc",
64
- "--proto_path=/protos/", "--proto_path=/in/",
65
- "--ruby_out=/out/lib",
66
- "--grpc_out=/out/lib",
84
+ "--proto_path=/protos/", "--proto_path=/in/"
85
+ ] + ruby_plugin_args + [
67
86
  "--ruby_cloud_out=/out/",
68
87
  "--ruby_cloud_opt", parameter_strs.join(",")
69
88
  ] + ARGV + Dir.glob("/in/**/*.proto").sort
@@ -17,7 +17,7 @@
17
17
  module Gapic
18
18
  module Generator
19
19
  module Cloud
20
- VERSION = "0.1.7"
20
+ VERSION = "0.2.0"
21
21
  end
22
22
  end
23
23
  end
@@ -15,6 +15,8 @@
15
15
  # limitations under the License.
16
16
 
17
17
  require "gapic/generators/default_generator"
18
+ require "gapic/presenters"
19
+ require "gapic/presenters/wrapper_gem_presenter"
18
20
 
19
21
  module Gapic
20
22
  module Generators
@@ -41,11 +43,14 @@ module Gapic
41
43
  # Google::Protobuf::Compiler::CodeGeneratorResponse::File>]
42
44
  # The files that were generated for the API.
43
45
  def generate
46
+ gem_config = @api.configuration[:gem] ||= {}
47
+ return generate_wrapper if gem_config[:version_dependencies]
48
+
44
49
  orig_files = super
45
50
 
46
51
  cloud_files = []
47
52
 
48
- gem = gem_presenter @api
53
+ gem = Gapic::Presenters.gem_presenter @api
49
54
 
50
55
  # Additional Gem level files
51
56
  cloud_files << g("gem/repo-metadata.erb", ".repo-metadata.json", gem: gem)
@@ -57,6 +62,45 @@ module Gapic
57
62
  orig_files + cloud_files
58
63
  end
59
64
 
65
+ # Disable Rubocop because we expect generate to grow and violate more
66
+ # and more style rules.
67
+ # rubocop:disable all
68
+
69
+ # Generates the files for a wrapper.
70
+ #
71
+ # @return [Array<Google::Protobuf::Compiler::CodeGeneratorResponse::File>]
72
+ # The files that were generated for the API.
73
+ #
74
+ def generate_wrapper
75
+ files = []
76
+
77
+ gem = Gapic::Presenters.wrapper_gem_presenter @api
78
+
79
+ files << g("gem/gitignore.erb", ".gitignore", gem: gem)
80
+ files << g("gem/repo-metadata.erb", ".repo-metadata.json", gem: gem)
81
+ files << g("wrapper_gem/rubocop.erb", ".rubocop.yml", gem: gem)
82
+ files << g("wrapper_gem/yardopts.erb", ".yardopts", gem: gem)
83
+ files << g("gem/authentication.erb", "AUTHENTICATION.md", gem: gem)
84
+ files << g("gem/changelog.erb", "CHANGELOG.md", gem: gem)
85
+ files << g("wrapper_gem/gemfile.erb", "Gemfile", gem: gem)
86
+ files << g("gem/license.erb", "LICENSE.md", gem: gem)
87
+ files << g("wrapper_gem/rakefile.erb", "Rakefile", gem: gem)
88
+ files << g("wrapper_gem/readme.erb", "README.md", gem: gem)
89
+ files << g("wrapper_gem/gemspec.erb", "#{gem.name}.gemspec", gem: gem)
90
+ files << g("wrapper_gem/dashed.erb", "lib/#{gem.name}.rb", gem: gem) if gem.needs_dashed_ruby_file?
91
+ files << g("wrapper_gem/main.erb", "lib/#{gem.namespace_file_path}", gem: gem)
92
+ files << g("gem/version.erb", "lib/#{gem.version_file_path}", gem: gem)
93
+ files << g("wrapper_gem/test_helper.erb", "test/helper.rb", gem: gem)
94
+ files << g("wrapper_gem/client_test.erb", "test/#{gem.namespace_require}/client_test.rb", gem: gem)
95
+ files << g("wrapper_gem/version_test.erb", "test/#{gem.namespace_require}/version_test.rb", gem: gem)
96
+
97
+ format_files files
98
+
99
+ files
100
+ end
101
+
102
+ # rubocop:enable all
103
+
60
104
  private
61
105
 
62
106
  ##
@@ -0,0 +1,119 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Copyright 2019 Google LLC
4
+ #
5
+ # Licensed under the Apache License, Version 2.0 (the "License");
6
+ # you may not use this file except in compliance with the License.
7
+ # You may obtain a copy of the License at
8
+ #
9
+ # https://www.apache.org/licenses/LICENSE-2.0
10
+ #
11
+ # Unless required by applicable law or agreed to in writing, software
12
+ # distributed under the License is distributed on an "AS IS" BASIS,
13
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ # See the License for the specific language governing permissions and
15
+ # limitations under the License.
16
+
17
+ require "gapic/presenters"
18
+ require "gapic/presenters/wrapper_service_presenter"
19
+
20
+ module Gapic
21
+ module Presenters
22
+ ##
23
+ # A presenter for wrapper gems.
24
+ #
25
+ class WrapperGemPresenter < GemPresenter
26
+ def entrypoint_require
27
+ namespace_require
28
+ end
29
+
30
+ def services
31
+ @services ||= begin
32
+ files = @api.generate_files
33
+ files.map(&:services).flatten.map { |s| WrapperServicePresenter.new @api, s }
34
+ end
35
+ end
36
+
37
+ def namespace_require
38
+ ruby_file_path @api, namespace
39
+ end
40
+
41
+ def namespace_file_path
42
+ "#{namespace_require}.rb"
43
+ end
44
+
45
+ def needs_dashed_ruby_file?
46
+ name != namespace_file_path
47
+ end
48
+
49
+ def migration_version
50
+ gem_config :migration_version
51
+ end
52
+
53
+ def pre_migration_version
54
+ m = /^(\d)+\./.match migration_version.to_s
55
+ return nil unless m
56
+ "#{m[1].to_i - 1}.x"
57
+ end
58
+
59
+ def migration?
60
+ migration_version ? true : false
61
+ end
62
+
63
+ def extra_files
64
+ files = ["README.md", "AUTHENTICATION.md", "LICENSE.md", ".yardopts"]
65
+ files << "MIGRATING.md" if migration?
66
+ files
67
+ end
68
+
69
+ def factory_method_suffix
70
+ gem_config(:factory_method_suffix).to_s
71
+ end
72
+
73
+ def version_dependencies
74
+ gem_config(:version_dependencies).to_s.split(";").map { |str| str.split ":" }
75
+ end
76
+
77
+ def gem_version_dependencies
78
+ version_dependencies.sort_by { |version, _requirement| version }
79
+ .map { |version, requirement| ["#{name}-#{version}", requirement] }
80
+ end
81
+
82
+ def versioned_gems
83
+ gem_version_dependencies.map { |name, _requirement| name }
84
+ end
85
+
86
+ def default_version
87
+ version_dependencies.first&.first
88
+ end
89
+
90
+ def google_cloud_short_name
91
+ m = /^google-cloud-(.*)$/.match name
92
+ return nil unless m
93
+ m[1].tr "-", "_"
94
+ end
95
+
96
+ def docs_link version: nil, class_name: nil, text: nil
97
+ gem_name = version ? "#{name}-#{version}" : name
98
+ base_url = "https://googleapis.dev/ruby/#{gem_name}/latest"
99
+ if class_name
100
+ path = namespace.gsub "::", "/"
101
+ path = "#{path}/#{version.capitalize}" if version
102
+ class_path = class_name.gsub "::", "/"
103
+ text ||= namespaced_class class_name, version: version
104
+ return "[#{text}](#{base_url}/#{path}/#{class_path}.html)"
105
+ end
106
+ "[#{text || name}](#{base_url})"
107
+ end
108
+
109
+ def namespaced_class name, version: nil
110
+ base = version ? "#{namespace}::#{version.capitalize}" : namespace
111
+ "#{base}::#{name}"
112
+ end
113
+ end
114
+
115
+ def self.wrapper_gem_presenter api
116
+ WrapperGemPresenter.new api
117
+ end
118
+ end
119
+ end
@@ -0,0 +1,49 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Copyright 2019 Google LLC
4
+ #
5
+ # Licensed under the Apache License, Version 2.0 (the "License");
6
+ # you may not use this file except in compliance with the License.
7
+ # You may obtain a copy of the License at
8
+ #
9
+ # https://www.apache.org/licenses/LICENSE-2.0
10
+ #
11
+ # Unless required by applicable law or agreed to in writing, software
12
+ # distributed under the License is distributed on an "AS IS" BASIS,
13
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ # See the License for the specific language governing permissions and
15
+ # limitations under the License.
16
+
17
+ require "gapic/presenters"
18
+
19
+ module Gapic
20
+ module Presenters
21
+ ##
22
+ # A presenter for wrapper services.
23
+ #
24
+ class WrapperServicePresenter < ServicePresenter
25
+ def gem
26
+ WrapperGemPresenter.new @api
27
+ end
28
+
29
+ def factory_method_name
30
+ method_name = ActiveSupport::Inflector.underscore name
31
+ suffix = gem.factory_method_suffix
32
+ method_name = "#{method_name}#{suffix}" unless method_name.end_with? suffix
33
+ method_name
34
+ end
35
+
36
+ def create_client_call
37
+ "#{gem.namespace}.#{factory_method_name}"
38
+ end
39
+
40
+ def configure_client_call
41
+ "#{gem.namespace}.configure"
42
+ end
43
+
44
+ def credentials_class_xref
45
+ "`#{credentials_name_full}`"
46
+ end
47
+ end
48
+ end
49
+ end
@@ -28,16 +28,16 @@ export <%= gem.env_prefix %>_CREDENTIALS=path/to/keyfile.json
28
28
  3. Initialize the client.
29
29
 
30
30
  ```ruby
31
- require "<%= service.package.package_require %>"
31
+ require "<%= gem.entrypoint_require %>"
32
32
 
33
- client = <%= service.client_name_full %>.new
33
+ client = <%= service.create_client_call %>
34
34
  ```
35
35
 
36
36
  ## Credential Lookup
37
37
 
38
38
  The <%= gem.name %> library aims to make authentication
39
39
  as simple as possible, and provides several mechanisms to configure your system
40
- without **Service Account Credentials** directly in code.
40
+ without requiring **Service Account Credentials** directly in code.
41
41
 
42
42
  **Credentials** are discovered in the following order:
43
43
 
@@ -67,7 +67,7 @@ containers where writing files is difficult or not encouraged.
67
67
 
68
68
  The environment variables that <%= gem.name %>
69
69
  checks for credentials are configured on the service Credentials class (such as
70
- {<%= service.credentials_name_full %>}):
70
+ <%= service.credentials_class_xref %>):
71
71
 
72
72
  1. `<%= gem.env_prefix %>_CREDENTIALS` - Path to JSON file, or JSON contents
73
73
  2. `<%= gem.env_prefix %>_KEYFILE` - Path to JSON file, or JSON contents
@@ -76,11 +76,11 @@ checks for credentials are configured on the service Credentials class (such as
76
76
  5. `GOOGLE_APPLICATION_CREDENTIALS` - Path to JSON file
77
77
 
78
78
  ```ruby
79
- require "<%= service.package.package_require %>"
79
+ require "<%= gem.entrypoint_require %>"
80
80
 
81
81
  ENV["<%= gem.env_prefix %>_CREDENTIALS"] = "path/to/keyfile.json"
82
82
 
83
- client = <%= service.client_name_full %>.new
83
+ client = <%= service.create_client_call %>
84
84
  ```
85
85
 
86
86
  ### Configuration
@@ -89,9 +89,9 @@ The **Credentials JSON** can be configured instead of placing them in
89
89
  environment variables. Either on an individual client initialization:
90
90
 
91
91
  ```ruby
92
- require "<%= service.package.package_require %>"
92
+ require "<%= gem.entrypoint_require %>"
93
93
 
94
- client = <%= service.client_name_full %>.new do |config|
94
+ client = <%= service.create_client_call %> do |config|
95
95
  config.credentials = "path/to/keyfile.json"
96
96
  end
97
97
  ```
@@ -99,13 +99,13 @@ end
99
99
  Or configured globally for all clients:
100
100
 
101
101
  ```ruby
102
- require "<%= service.package.package_require %>"
102
+ require "<%= gem.entrypoint_require %>"
103
103
 
104
- <%= service.client_name_full %>.configure do |config|
104
+ <%= service.configure_client_call %> do |config|
105
105
  config.credentials = "path/to/keyfile.json"
106
106
  end
107
107
 
108
- client = <%= service.client_name_full %>.new
108
+ client = <%= service.create_client_call %>
109
109
  ```
110
110
 
111
111
  ### Cloud SDK
@@ -138,9 +138,9 @@ Google Cloud requires **Service Account Credentials** to
138
138
  connect to the APIs. You will use the **JSON key file** to
139
139
  connect to most services with <%= gem.name %>.
140
140
 
141
- If you are not running this client within [Google Cloud Platform
142
- environments](#google-cloud-platform-environments), you need a Google
143
- Developers service account.
141
+ If you are not running this client within
142
+ [Google Cloud Platform environments](#google-cloud-platform-environments), you
143
+ need a Google Developers service account.
144
144
 
145
145
  1. Visit the [Google Developers Console][dev-console].
146
146
  2. Create a new project or click on an existing project.