gapic-generator 0.4.2 → 0.5.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: bd638c7b5855aa89dfd03c87f3f5d8d936d78005b51dd04a409ac7552e3eea05
4
- data.tar.gz: 6372183134b8556a0a5ac7a4a6bf1250820c5b167b576454fae5f0228194078c
3
+ metadata.gz: 9d91e35272532a7605649615f5267d364c30a05a91f3e8f36414994260dc2d22
4
+ data.tar.gz: 18642517ba285a7aefd2620356e7d78d6a276ad987935d41358b80eb5de78858
5
5
  SHA512:
6
- metadata.gz: 67b82518fe047ac185a3b596af6b3da223c774c96dbc6cb01761998920ca164e546bd72fc2222c6a945636c49e39a5b80ded892b821d493d79f40133fa973fa3
7
- data.tar.gz: c316dd8c291a1204e73f18d7df06800734bf7e3690db5d5967e586cbaf0c215b02496a090a44eb5baee9b501fd418717312b8bb33d096fda5f5c6ef84e11d1fa
6
+ metadata.gz: 897662bfc6bae108225577e384cf043aa1ce2861597685a472d50b6fd034c960d7d535152d89a4f5d1d4bcedb01311bc427fc517cc702f8ea52d5ad7f61cf3df
7
+ data.tar.gz: 401ae995df47b01fd1ede289ed91a05dbac03ffaabc82996259c859b2996868ccd3058b35a7a6a88849de802d4047a25e034bec6b5609ed6f1c77d4264c6ad65
data/CHANGELOG.md CHANGED
@@ -1,5 +1,13 @@
1
1
  # Release History for gapic-generator
2
2
 
3
+ ### 0.5.0 / 2020-05-19
4
+
5
+ * Add quota_project to the generated configs.
6
+ * Allow resource patterns with a star as a segment template.
7
+ * Generate tests for resource path helpers.
8
+ * Pin protobuf dependency for Ruby < 2.5.
9
+ * Create a test helper in for generated tests.
10
+
3
11
  ### 0.4.2 / 2020-04-28
4
12
 
5
13
  * Prepend double-colon to absolute/global namespaces to prevent conflicts.
@@ -16,6 +16,6 @@
16
16
 
17
17
  module Gapic
18
18
  module Generator
19
- VERSION = "0.4.2"
19
+ VERSION = "0.5.0"
20
20
  end
21
21
  end
@@ -58,22 +58,24 @@ module Gapic
58
58
  files << g("service/paths.erb", "lib/#{service.paths_file_path}", service: service) if service.paths?
59
59
  files << g("service/operations.erb", "lib/#{service.operations_file_path}", service: service) if service.lro?
60
60
  files << g("service/test/client.erb", "test/#{service.test_client_file_path}", service: service)
61
+ files << g("service/test/client_paths.erb", "test/#{service.test_paths_file_path}", service: service) if service.paths?
61
62
  files << g("service/test/client_operations.erb", "test/#{service.test_client_operations_file_path}", service: service) if service.lro?
62
63
  end
63
64
  end
64
65
 
65
66
  # Gem level files
66
- files << g("gem/gitignore.erb", ".gitignore", gem: gem)
67
- files << g("gem/version.erb", "lib/#{gem.version_file_path}", gem: gem)
68
- files << g("gem/gemspec.erb", "#{gem.name}.gemspec", gem: gem)
69
- files << g("gem/gemfile.erb", "Gemfile", gem: gem)
70
- files << g("gem/rakefile.erb", "Rakefile", gem: gem)
71
- files << g("gem/readme.erb", "README.md", gem: gem)
72
- files << g("gem/changelog.erb", "CHANGELOG.md", gem: gem)
73
- files << g("gem/rubocop.erb", ".rubocop.yml", gem: gem)
74
- files << g("gem/yardopts.erb", ".yardopts", gem: gem)
75
- files << g("gem/license.erb", "LICENSE.md", gem: gem)
76
- files << g("gem/entrypoint.erb", "lib/#{gem.name}.rb", gem: gem)
67
+ files << g("gem/gitignore.erb", ".gitignore", gem: gem)
68
+ files << g("gem/version.erb", "lib/#{gem.version_file_path}", gem: gem)
69
+ files << g("gem/test_helper.erb", "test/helper.rb", gem: gem)
70
+ files << g("gem/gemspec.erb", "#{gem.name}.gemspec", gem: gem)
71
+ files << g("gem/gemfile.erb", "Gemfile", gem: gem)
72
+ files << g("gem/rakefile.erb", "Rakefile", gem: gem)
73
+ files << g("gem/readme.erb", "README.md", gem: gem)
74
+ files << g("gem/changelog.erb", "CHANGELOG.md", gem: gem)
75
+ files << g("gem/rubocop.erb", ".rubocop.yml", gem: gem)
76
+ files << g("gem/yardopts.erb", ".yardopts", gem: gem)
77
+ files << g("gem/license.erb", "LICENSE.md", gem: gem)
78
+ files << g("gem/entrypoint.erb", "lib/#{gem.name}.rb", gem: gem)
77
79
 
78
80
  gem.proto_files.each do |proto_file|
79
81
  files << g("proto_docs/proto_file.erb", "proto_docs/#{proto_file.docs_file_path}", file: proto_file)
@@ -56,6 +56,13 @@ module Gapic
56
56
  !@pattern.nil?
57
57
  end
58
58
 
59
+ # Determines if the segment has a nontrivial pattern (i.e. not `*` or `**`).
60
+ #
61
+ # @return [Boolean]
62
+ def nontrivial_pattern?
63
+ @pattern && @pattern != "*" && @pattern != "**"
64
+ end
65
+
59
66
  # @private
60
67
  def == other
61
68
  return false unless other.is_a? self.class
@@ -15,7 +15,6 @@
15
15
  # limitations under the License.
16
16
 
17
17
  require "gapic/path_template"
18
- require "ostruct"
19
18
  require "active_support/inflector"
20
19
 
21
20
  module Gapic
@@ -28,20 +27,10 @@ module Gapic
28
27
  def initialize resource
29
28
  @resource = resource
30
29
 
31
- @patterns = resource.pattern.map do |template|
32
- segments = Gapic::PathTemplate.parse template
33
- OpenStruct.new(
34
- template: template,
35
- segments: segments,
36
- arguments: arguments_for(segments),
37
- path_string: path_string_for(segments)
38
- )
39
- end
30
+ @patterns = resource.pattern.map { |template| PatternPresenter.new template }
40
31
 
41
32
  # Keep only patterns that can be used to create path helpers
42
- @patterns.reject! do |pattern|
43
- named_arg_patterns?(pattern.segments) || positional_args?(pattern.segments)
44
- end
33
+ @patterns.filter!(&:useful_for_helpers?)
45
34
  end
46
35
 
47
36
  def name
@@ -60,33 +49,64 @@ module Gapic
60
49
  "#{ActiveSupport::Inflector.underscore name}_path"
61
50
  end
62
51
 
63
- private
52
+ ##
53
+ # A presenter for a particular pattern
54
+ #
55
+ class PatternPresenter
56
+ def initialize template
57
+ @template = template
58
+ @segments = Gapic::PathTemplate.parse template
59
+ @arguments = arg_segments.map(&:name)
60
+ @path_string = build_path_string
61
+ end
64
62
 
65
- def arguments_for segments
66
- arg_segments(segments).map(&:name)
67
- end
63
+ attr_reader :template, :segments, :arguments, :path_string
68
64
 
69
- def arg_segments segments
70
- segments.select { |segment| segment.is_a? Gapic::PathTemplate::Segment }
71
- end
65
+ def useful_for_helpers?
66
+ arg_segments.none?(&:nontrivial_pattern?) && arg_segments.none?(&:positional?)
67
+ end
72
68
 
73
- def path_string_for segments
74
- segments.map do |segment|
75
- if segment.is_a? Gapic::PathTemplate::Segment
76
- "\#{#{segment.name}}"
77
- else
78
- # Should be a String
79
- segment
80
- end
81
- end.join
82
- end
69
+ def formal_arguments
70
+ arguments.map { |arg| "#{arg}:" }.join ", "
71
+ end
83
72
 
84
- def positional_args? segments
85
- arg_segments(segments).any?(&:positional?)
86
- end
73
+ def arguments_key
74
+ arguments.sort.join ":"
75
+ end
76
+
77
+ def arguments_with_dummy_values
78
+ arguments.each_with_index.map { |arg, index| "#{arg}: \"value#{index}\"" }.join ", "
79
+ end
80
+
81
+ def expected_path_for_dummy_values
82
+ index = -1
83
+ segments.map do |segment|
84
+ if segment.is_a? Gapic::PathTemplate::Segment
85
+ index += 1
86
+ "value#{index}"
87
+ else
88
+ # Should be a String
89
+ segment
90
+ end
91
+ end.join
92
+ end
87
93
 
88
- def named_arg_patterns? segments
89
- arg_segments(segments).any?(&:pattern)
94
+ private
95
+
96
+ def arg_segments
97
+ segments.select { |segment| segment.is_a? Gapic::PathTemplate::Segment }
98
+ end
99
+
100
+ def build_path_string
101
+ segments.map do |segment|
102
+ if segment.is_a? Gapic::PathTemplate::Segment
103
+ "\#{#{segment.name}}"
104
+ else
105
+ # Should be a String
106
+ segment
107
+ end
108
+ end.join
109
+ end
90
110
  end
91
111
  end
92
112
  end
@@ -272,6 +272,10 @@ module Gapic
272
272
  service_file_path.sub ".rb", "_test.rb"
273
273
  end
274
274
 
275
+ def test_paths_file_path
276
+ service_file_path.sub ".rb", "_paths_test.rb"
277
+ end
278
+
275
279
  def test_client_operations_file_path
276
280
  service_file_path.sub ".rb", "_operations_test.rb"
277
281
  end
@@ -2,3 +2,6 @@
2
2
  source "https://rubygems.org"
3
3
 
4
4
  gemspec
5
+
6
+ # google-protobuf 3.12.0 requires Ruby 2.5 or later, so pin to 3.11 on older Rubies
7
+ gem "google-protobuf", (RUBY_VERSION < "2.5" ? "~> 3.11.4" : "~> 3.12")
@@ -29,7 +29,9 @@ Gem::Specification.new do |gem|
29
29
  <%- end -%>
30
30
 
31
31
  gem.add_development_dependency "google-style", "~> 1.24.0"
32
- gem.add_development_dependency "minitest", "~> 5.10"
32
+ gem.add_development_dependency "minitest", "~> 5.14"
33
+ gem.add_development_dependency "minitest-focus", "~> 1.1"
34
+ gem.add_development_dependency "minitest-rg", "~> 5.2"
33
35
  gem.add_development_dependency "rake", ">= 12.0"
34
36
  gem.add_development_dependency "redcarpet", "~> 3.0"
35
37
  gem.add_development_dependency "simplecov", "~> 0.18"
@@ -10,6 +10,7 @@ RuboCop::RakeTask.new
10
10
  require "rake/testtask"
11
11
  desc "Run tests."
12
12
  Rake::TestTask.new do |t|
13
+ t.libs << "test"
13
14
  t.test_files = FileList["test/**/*_test.rb"]
14
15
  t.warning = false
15
16
  end
@@ -0,0 +1,8 @@
1
+ <%- assert_locals gem -%>
2
+ <%= render partial: "shared/header" -%>
3
+
4
+ require "simplecov"
5
+
6
+ require "minitest/autorun"
7
+ require "minitest/focus"
8
+ require "minitest/rg"
@@ -100,7 +100,8 @@ class <%= service.client_name %>
100
100
  if credentials.is_a?(String) || credentials.is_a?(Hash)
101
101
  credentials = Credentials.new credentials, scope: @config.scope
102
102
  end
103
- @quota_project_id = credentials.respond_to?(:quota_project_id) ? credentials.quota_project_id : nil
103
+ @quota_project_id = @config.quota_project
104
+ @quota_project_id ||= credentials.quota_project_id if credentials.respond_to? :quota_project_id
104
105
 
105
106
  <%- if service.lro? -%>
106
107
  <%= service.lro_client_ivar %> = <%= service.operations_name %>.new do |config|
@@ -78,24 +78,28 @@
78
78
  # * `:retry_codes` (*type:* `Array<String>`) - The error codes that should
79
79
  # trigger a retry.
80
80
  # @return [::Hash]
81
+ # @!attribute [rw] quota_project
82
+ # A separate project against which to charge quota.
83
+ # @return [::String]
81
84
  #
82
85
  class Configuration
83
86
  extend ::Gapic::Config
84
87
 
85
- config_attr :endpoint, <%= service.client_endpoint.inspect %>, String
86
- config_attr :credentials, nil do |value|
88
+ config_attr :endpoint, <%= service.client_endpoint.inspect %>, ::String
89
+ config_attr :credentials, nil do |value|
87
90
  allowed = [::String, ::Hash, ::Proc, ::Google::Auth::Credentials, ::Signet::OAuth2::Client, nil]
88
91
  allowed += [::GRPC::Core::Channel, ::GRPC::Core::ChannelCredentials] if defined? ::GRPC
89
92
  allowed.any? { |klass| klass === value }
90
93
  end
91
- config_attr :scope, nil, ::String, ::Array, nil
92
- config_attr :lib_name, nil, ::String, nil
93
- config_attr :lib_version, nil, ::String, nil
94
- config_attr(:channel_args, <%= service.config_channel_args.inspect %>, ::Hash, nil)
95
- config_attr :interceptors, nil, ::Array, nil
96
- config_attr :timeout, nil, ::Numeric, nil
97
- config_attr :metadata, nil, ::Hash, nil
98
- config_attr :retry_policy, nil, ::Hash, Proc, nil
94
+ config_attr :scope, nil, ::String, ::Array, nil
95
+ config_attr :lib_name, nil, ::String, nil
96
+ config_attr :lib_version, nil, ::String, nil
97
+ config_attr(:channel_args, <%= service.config_channel_args.inspect %>, ::Hash, nil)
98
+ config_attr :interceptors, nil, ::Array, nil
99
+ config_attr :timeout, nil, ::Numeric, nil
100
+ config_attr :metadata, nil, ::Hash, nil
101
+ config_attr :retry_policy, nil, ::Hash, ::Proc, nil
102
+ config_attr :quota_project, nil, ::String, nil
99
103
 
100
104
  # @private
101
105
  def initialize parent_config = nil
@@ -3,8 +3,7 @@
3
3
  # Create a fully-qualified <%= resource.name %> resource string.
4
4
  #
5
5
  <%- resource.patterns.each do |pattern| -%>
6
- <%- args_doc_sig = pattern.arguments.map { |arg| "#{arg}:" }.join ", " -%>
7
- # @overload <%= resource.path_helper %>(<%= args_doc_sig %>)
6
+ # @overload <%= resource.path_helper %>(<%= pattern.formal_arguments %>)
8
7
  <%= indent render(partial: "service/client/resource/doc", locals: { pattern: pattern }), "# " %>
9
8
  #
10
9
  <%- end -%>
@@ -14,9 +13,7 @@ def <%= resource.path_helper %> **args
14
13
  <%- last_pattern_index = resource.patterns.count - 1 -%>
15
14
  <%- resource.patterns.each_with_index do |pattern, index| -%>
16
15
  <%- comma = last_pattern_index == index ? "" : "," -%>
17
- <%- args_key = pattern.arguments.sort.join(":").inspect -%>
18
- <%- args_sig = pattern.arguments.map { |arg| "#{arg}:" }.join ", " -%>
19
- <%= args_key %> => (proc do |<%= args_sig %>|
16
+ <%= pattern.arguments_key.inspect %> => (proc do |<%= pattern.formal_arguments %>|
20
17
  <%= indent render(partial: "service/client/resource/def", locals: { pattern: pattern }), 6 %>
21
18
  end)<%= comma %>
22
19
  <%- end -%>
@@ -5,7 +5,6 @@
5
5
  <%= indent render(partial: "service/client/resource/doc", locals: { pattern: resource.patterns.first }), "# " %>
6
6
  #
7
7
  # @return [::String]
8
- <%- args = resource.patterns.first.arguments.map { |arg| "#{arg}:" }.join ", " -%>
9
- def <%= resource.path_helper %> <%= args %>
8
+ def <%= resource.path_helper %> <%= resource.patterns.first.formal_arguments %>
10
9
  <%= indent render(partial: "service/client/resource/def", locals: { pattern: resource.patterns.first }), 2 %>
11
10
  end
@@ -0,0 +1,16 @@
1
+ <%- assert_locals resource -%>
2
+ <%- assert_locals service -%>
3
+ <%- full_client_name = defined?(client_name_full) ? client_name_full : service.client_name_full -%>
4
+ def test_<%= resource.path_helper%>
5
+ grpc_channel = ::GRPC::Core::Channel.new "localhost:8888", nil, :this_channel_is_insecure
6
+ ::Gapic::ServiceStub.stub :new, nil do
7
+ client = <%= full_client_name %>.new do |config|
8
+ config.credentials = grpc_channel
9
+ end
10
+ <%- resource.patterns.each do |pattern| -%>
11
+
12
+ path = client.<%= resource.path_helper%> <%= pattern.arguments_with_dummy_values %>
13
+ assert_equal <%= pattern.expected_path_for_dummy_values.inspect %>, path
14
+ <%- end -%>
15
+ end
16
+ end
@@ -2,8 +2,7 @@
2
2
  # frozen_string_literal: true
3
3
 
4
4
  <%= render partial: "shared/license" %>
5
- require "simplecov"
6
- require "minitest/autorun"
5
+ require "helper"
7
6
 
8
7
  require "gapic/grpc/service_stub"
9
8
 
@@ -2,8 +2,7 @@
2
2
  # frozen_string_literal: true
3
3
 
4
4
  <%= render partial: "shared/license" %>
5
- require "simplecov"
6
- require "minitest/autorun"
5
+ require "helper"
7
6
 
8
7
  require "gapic/grpc/service_stub"
9
8
 
@@ -0,0 +1,17 @@
1
+ <%- assert_locals service -%>
2
+ # frozen_string_literal: true
3
+
4
+ <%= render partial: "shared/license" %>
5
+ require "helper"
6
+
7
+ require "gapic/grpc/service_stub"
8
+
9
+ require "<%= service.service_require %>"
10
+
11
+ class <%= service.client_name_full %>PathsTest < Minitest::Test
12
+ <%- service.references.each do |resource| -%>
13
+ <%= indent render(partial: "service/test/resource",
14
+ locals: { resource: resource, service: service }), 2 %>
15
+
16
+ <%- end %>
17
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: gapic-generator
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.2
4
+ version: 0.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ernest Landrito
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2020-04-29 00:00:00.000000000 Z
13
+ date: 2020-05-19 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: actionpack
@@ -260,6 +260,7 @@ files:
260
260
  - templates/default/gem/rakefile.erb
261
261
  - templates/default/gem/readme.erb
262
262
  - templates/default/gem/rubocop.erb
263
+ - templates/default/gem/test_helper.erb
263
264
  - templates/default/gem/version.erb
264
265
  - templates/default/gem/yardopts.erb
265
266
  - templates/default/helpers/default_helper.rb
@@ -319,8 +320,10 @@ files:
319
320
  - templates/default/service/credentials.erb
320
321
  - templates/default/service/operations.erb
321
322
  - templates/default/service/paths.erb
323
+ - templates/default/service/test/_resource.erb
322
324
  - templates/default/service/test/client.erb
323
325
  - templates/default/service/test/client_operations.erb
326
+ - templates/default/service/test/client_paths.erb
324
327
  - templates/default/service/test/method/_assert_response.erb
325
328
  - templates/default/service/test/method/_bidi.erb
326
329
  - templates/default/service/test/method/_client.erb