gapic-generator 0.1.7 → 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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +48 -0
- data/lib/gapic/formatting_utils.rb +9 -4
- data/lib/gapic/generator/version.rb +1 -1
- data/lib/gapic/generators/base_generator.rb +0 -8
- data/lib/gapic/generators/default_generator.rb +13 -14
- data/lib/gapic/helpers/filepath_helper.rb +45 -0
- data/lib/gapic/helpers/namespace_helper.rb +51 -0
- data/lib/gapic/presenters.rb +44 -0
- data/{templates/default/helpers → lib/gapic}/presenters/enum_presenter.rb +19 -14
- data/{templates/default/helpers → lib/gapic}/presenters/enum_value_presenter.rb +19 -12
- data/lib/gapic/presenters/field_presenter.rb +154 -0
- data/lib/gapic/presenters/file_presenter.rb +59 -0
- data/lib/gapic/presenters/gem_presenter.rb +176 -0
- data/lib/gapic/presenters/message_presenter.rb +73 -0
- data/lib/gapic/presenters/method_presenter.rb +307 -0
- data/lib/gapic/presenters/package_presenter.rb +80 -0
- data/lib/gapic/presenters/resource_presenter.rb +93 -0
- data/lib/gapic/presenters/sample_presenter.rb +84 -0
- data/lib/gapic/presenters/service_presenter.rb +306 -0
- data/lib/gapic/resource_lookup.rb +23 -38
- data/lib/gapic/schema/api.rb +62 -0
- data/lib/gapic/schema/loader.rb +9 -2
- data/lib/gapic/schema/wrappers.rb +118 -24
- data/templates/default/gem/entrypoint.erb +8 -0
- data/templates/default/gem/gemspec.erb +1 -1
- data/templates/default/gem/readme.erb +17 -3
- data/templates/default/gem/rubocop.erb +13 -41
- data/templates/default/helpers/filepath_helper.rb +2 -21
- data/templates/default/helpers/namespace_helper.rb +2 -27
- data/templates/default/layouts/_ruby.erb +1 -3
- data/templates/default/lib/_package.erb +17 -0
- data/templates/default/lib/_service.erb +32 -0
- data/templates/default/package.erb +5 -5
- data/templates/default/service.erb +5 -7
- data/templates/default/service/_helpers.erb +3 -0
- data/templates/default/service/client/_client.erb +7 -17
- data/templates/default/service/client/_operations.erb +0 -4
- data/templates/default/service/client/_resource.erb +1 -1
- data/templates/default/service/client/method/docs/_request_normal.erb +10 -5
- data/templates/default/service/client/method/docs/_request_streaming.erb +1 -1
- metadata +20 -15
- data/templates/default/helpers/presenter_helper.rb +0 -24
- data/templates/default/helpers/presenters/field_presenter.rb +0 -146
- data/templates/default/helpers/presenters/file_presenter.rb +0 -53
- data/templates/default/helpers/presenters/gem_presenter.rb +0 -140
- data/templates/default/helpers/presenters/message_presenter.rb +0 -66
- data/templates/default/helpers/presenters/method_presenter.rb +0 -293
- data/templates/default/helpers/presenters/package_presenter.rb +0 -65
- data/templates/default/helpers/presenters/resource_presenter.rb +0 -92
- data/templates/default/helpers/presenters/sample_presenter.rb +0 -74
- data/templates/default/helpers/presenters/service_presenter.rb +0 -276
- data/templates/default/service/client/_helpers.erb +0 -9
@@ -0,0 +1,59 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# Copyright 2018 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/helpers/namespace_helper"
|
18
|
+
|
19
|
+
module Gapic
|
20
|
+
module Presenters
|
21
|
+
##
|
22
|
+
# A presenter for proto files.
|
23
|
+
#
|
24
|
+
class FilePresenter
|
25
|
+
include Gapic::Helpers::NamespaceHelper
|
26
|
+
|
27
|
+
# @param file [Gapic::Schema::File] the file to present
|
28
|
+
def initialize api, file
|
29
|
+
@api = api
|
30
|
+
@file = file
|
31
|
+
end
|
32
|
+
|
33
|
+
def name
|
34
|
+
@file.name
|
35
|
+
end
|
36
|
+
|
37
|
+
def address
|
38
|
+
@file.address
|
39
|
+
end
|
40
|
+
|
41
|
+
def namespace
|
42
|
+
return @file.ruby_package if @file.ruby_package.present?
|
43
|
+
ruby_namespace_for_address address
|
44
|
+
end
|
45
|
+
|
46
|
+
def messages
|
47
|
+
@messages ||= @file.messages.map { |m| MessagePresenter.new @api, m }
|
48
|
+
end
|
49
|
+
|
50
|
+
def enums
|
51
|
+
@enums ||= @file.enums.map { |e| EnumPresenter.new e }
|
52
|
+
end
|
53
|
+
|
54
|
+
def docs_file_path
|
55
|
+
@file.name.gsub ".proto", ".rb"
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
@@ -0,0 +1,176 @@
|
|
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/helpers/filepath_helper"
|
18
|
+
require "gapic/helpers/namespace_helper"
|
19
|
+
|
20
|
+
module Gapic
|
21
|
+
module Presenters
|
22
|
+
##
|
23
|
+
# A presenter for gems.
|
24
|
+
#
|
25
|
+
class GemPresenter
|
26
|
+
include Gapic::Helpers::FilepathHelper
|
27
|
+
include Gapic::Helpers::NamespaceHelper
|
28
|
+
|
29
|
+
def initialize api
|
30
|
+
@api = api
|
31
|
+
end
|
32
|
+
|
33
|
+
def packages
|
34
|
+
@packages ||= begin
|
35
|
+
packages = @api.generate_files.map(&:package).uniq.sort
|
36
|
+
packages.map { |p| PackagePresenter.new @api, p }.delete_if(&:empty?)
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
def packages?
|
41
|
+
!packages.empty?
|
42
|
+
end
|
43
|
+
|
44
|
+
def services
|
45
|
+
@services ||= begin
|
46
|
+
files = @api.generate_files
|
47
|
+
files.map(&:services).flatten.map { |s| ServicePresenter.new @api, s }
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
def proto_files
|
52
|
+
@proto_files ||= begin
|
53
|
+
files = @api.files
|
54
|
+
files = files.reject { |f| blacklist_protos.include? f.name }
|
55
|
+
files = files.reject { |f| f.messages.empty? && f.enums.empty? }
|
56
|
+
files.map { |f| FilePresenter.new @api, f }
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
def address
|
61
|
+
name.split("-").map(&:camelize)
|
62
|
+
end
|
63
|
+
|
64
|
+
def name
|
65
|
+
gem_config :name
|
66
|
+
end
|
67
|
+
|
68
|
+
def namespace
|
69
|
+
gem_config(:namespace) ||
|
70
|
+
fix_namespace(@api, name.split("-").map(&:camelize).join("::"))
|
71
|
+
end
|
72
|
+
|
73
|
+
def title
|
74
|
+
gem_config(:title) ||
|
75
|
+
namespace.split("::").join(" ")
|
76
|
+
end
|
77
|
+
|
78
|
+
def version
|
79
|
+
gem_config(:version) ||
|
80
|
+
"0.0.1"
|
81
|
+
end
|
82
|
+
|
83
|
+
def version_require
|
84
|
+
ruby_file_path @api, version_name_full
|
85
|
+
end
|
86
|
+
|
87
|
+
def version_file_path
|
88
|
+
"#{version_require}.rb"
|
89
|
+
end
|
90
|
+
|
91
|
+
def version_name_full
|
92
|
+
"#{namespace}::VERSION"
|
93
|
+
end
|
94
|
+
|
95
|
+
def authors
|
96
|
+
gem_config(:authors) ||
|
97
|
+
["Google LLC"]
|
98
|
+
end
|
99
|
+
|
100
|
+
def email
|
101
|
+
gem_config(:email) ||
|
102
|
+
"googleapis-packages@google.com"
|
103
|
+
end
|
104
|
+
|
105
|
+
def description
|
106
|
+
gem_config(:description) ||
|
107
|
+
"#{name} is the official client library for the #{title} API."
|
108
|
+
end
|
109
|
+
|
110
|
+
def summary
|
111
|
+
gem_config(:summary) ||
|
112
|
+
"API Client library for the #{title} API"
|
113
|
+
end
|
114
|
+
|
115
|
+
def homepage
|
116
|
+
gem_config(:homepage) ||
|
117
|
+
"https://github.com/googleapis/googleapis"
|
118
|
+
end
|
119
|
+
|
120
|
+
def env_prefix
|
121
|
+
(gem_config(:env_prefix) || name.split("-").last).upcase
|
122
|
+
end
|
123
|
+
|
124
|
+
def iam_dependency?
|
125
|
+
@api.files.map(&:name).any? { |f| f.start_with? "google/iam/v1/" }
|
126
|
+
end
|
127
|
+
|
128
|
+
def library_documentation_url
|
129
|
+
gem_config(:library_documentation_url) || "https://googleapis.dev/ruby/#{name}/latest"
|
130
|
+
end
|
131
|
+
|
132
|
+
def product_documentation_url
|
133
|
+
gem_config :product_documentation_url
|
134
|
+
end
|
135
|
+
|
136
|
+
def api_id
|
137
|
+
gem_config :api_id
|
138
|
+
end
|
139
|
+
|
140
|
+
def free_tier?
|
141
|
+
# Default to false unless the config is explicitly set to "true"
|
142
|
+
gem_config(:free_tier) == "true"
|
143
|
+
end
|
144
|
+
|
145
|
+
def yard_strict?
|
146
|
+
# Default to true unless the config is explicitly set to "false"
|
147
|
+
gem_config(:yard_strict) != "false"
|
148
|
+
end
|
149
|
+
|
150
|
+
def entrypoint_require
|
151
|
+
packages.first.package_require
|
152
|
+
end
|
153
|
+
|
154
|
+
private
|
155
|
+
|
156
|
+
def gem_config key
|
157
|
+
return unless @api.configuration[:gem]
|
158
|
+
|
159
|
+
@api.configuration[:gem][key]
|
160
|
+
end
|
161
|
+
|
162
|
+
def blacklist_protos
|
163
|
+
blacklist = gem_config :blacklist
|
164
|
+
|
165
|
+
return default_blacklist_protos if blacklist.nil?
|
166
|
+
return default_blacklist_protos if blacklist[:protos].nil?
|
167
|
+
|
168
|
+
default_blacklist_protos[:protos]
|
169
|
+
end
|
170
|
+
|
171
|
+
def default_blacklist_protos
|
172
|
+
["google/api/http.proto", "google/protobuf/descriptor.proto"]
|
173
|
+
end
|
174
|
+
end
|
175
|
+
end
|
176
|
+
end
|
@@ -0,0 +1,73 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# Copyright 2018 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 "active_support/inflector"
|
18
|
+
|
19
|
+
require "gapic/helpers/namespace_helper"
|
20
|
+
|
21
|
+
module Gapic
|
22
|
+
module Presenters
|
23
|
+
##
|
24
|
+
# A presenter for proto messages.
|
25
|
+
#
|
26
|
+
class MessagePresenter
|
27
|
+
include Gapic::Helpers::NamespaceHelper
|
28
|
+
|
29
|
+
def initialize api, message
|
30
|
+
@api = api
|
31
|
+
@message = message
|
32
|
+
end
|
33
|
+
|
34
|
+
def name
|
35
|
+
@message.name
|
36
|
+
end
|
37
|
+
|
38
|
+
def doc_types
|
39
|
+
type_name_full
|
40
|
+
end
|
41
|
+
|
42
|
+
def doc_description
|
43
|
+
@message.docs_leading_comments
|
44
|
+
end
|
45
|
+
|
46
|
+
def default_value
|
47
|
+
"{}"
|
48
|
+
end
|
49
|
+
|
50
|
+
def type_name_full
|
51
|
+
message_ruby_type @message
|
52
|
+
end
|
53
|
+
|
54
|
+
def fields
|
55
|
+
@fields = @message.fields.map { |f| FieldPresenter.new @api, @message, f }
|
56
|
+
end
|
57
|
+
|
58
|
+
def nested_enums
|
59
|
+
@nested_enums ||= @message.nested_enums.map { |e| EnumPresenter.new e }
|
60
|
+
end
|
61
|
+
|
62
|
+
def nested_messages
|
63
|
+
@nested_messages ||= @message.nested_messages.map { |m| MessagePresenter.new @api, m }
|
64
|
+
end
|
65
|
+
|
66
|
+
protected
|
67
|
+
|
68
|
+
def message_ruby_type message
|
69
|
+
ruby_namespace @api, message.address.join(".")
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
@@ -0,0 +1,307 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# Copyright 2018 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 "active_support/inflector"
|
18
|
+
require "gapic/path_template"
|
19
|
+
require "gapic/helpers/namespace_helper"
|
20
|
+
|
21
|
+
module Gapic
|
22
|
+
module Presenters
|
23
|
+
##
|
24
|
+
# A presenter for rpc methods.
|
25
|
+
#
|
26
|
+
class MethodPresenter
|
27
|
+
include Gapic::Helpers::NamespaceHelper
|
28
|
+
|
29
|
+
def initialize api, method
|
30
|
+
@api = api
|
31
|
+
@method = method
|
32
|
+
end
|
33
|
+
|
34
|
+
def service
|
35
|
+
ServicePresenter.new @api, @method.parent
|
36
|
+
end
|
37
|
+
|
38
|
+
def name
|
39
|
+
ActiveSupport::Inflector.underscore @method.name
|
40
|
+
end
|
41
|
+
|
42
|
+
def kind
|
43
|
+
if client_streaming?
|
44
|
+
if server_streaming?
|
45
|
+
:bidi
|
46
|
+
else
|
47
|
+
:client
|
48
|
+
end
|
49
|
+
elsif server_streaming?
|
50
|
+
:server
|
51
|
+
else
|
52
|
+
:normal
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
def doc_description
|
57
|
+
@method.docs_leading_comments
|
58
|
+
end
|
59
|
+
|
60
|
+
def doc_response_type
|
61
|
+
ret = return_type
|
62
|
+
ret = "Gapic::Operation" if lro?
|
63
|
+
if server_streaming?
|
64
|
+
ret = "Enumerable<#{ret}>"
|
65
|
+
elsif paged?
|
66
|
+
paged_type = paged_response_type
|
67
|
+
paged_type = "Gapic::Operation" if paged_type == "Google::Longrunning::Operation"
|
68
|
+
ret = "Gapic::PagedEnumerable<#{paged_type}>"
|
69
|
+
end
|
70
|
+
ret
|
71
|
+
end
|
72
|
+
|
73
|
+
def arguments
|
74
|
+
arguments = @method.input.fields.reject(&:output_only?)
|
75
|
+
arguments.map { |arg| FieldPresenter.new @api, @method.input, arg }
|
76
|
+
end
|
77
|
+
|
78
|
+
def fields
|
79
|
+
@method.input.fields.map { |field| FieldPresenter.new @api, @method.input, field }
|
80
|
+
end
|
81
|
+
|
82
|
+
def fields_with_first_oneof
|
83
|
+
return fields if @method.input.oneof_decl.empty?
|
84
|
+
|
85
|
+
selected_fields = []
|
86
|
+
have_oneof = []
|
87
|
+
|
88
|
+
@method.input.fields.each do |field|
|
89
|
+
idx = field.oneof_index
|
90
|
+
selected_fields << field unless have_oneof.include? idx
|
91
|
+
have_oneof << idx
|
92
|
+
end
|
93
|
+
|
94
|
+
selected_fields.map { |field| FieldPresenter.new @api, @method.input, field }
|
95
|
+
end
|
96
|
+
|
97
|
+
def request_type
|
98
|
+
message_ruby_type @method.input
|
99
|
+
end
|
100
|
+
|
101
|
+
def return_type
|
102
|
+
message_ruby_type @method.output
|
103
|
+
end
|
104
|
+
|
105
|
+
def yields?
|
106
|
+
# Server streaming RCP calls are the only one that does not yield
|
107
|
+
!server_streaming?
|
108
|
+
end
|
109
|
+
|
110
|
+
def yield_doc_description
|
111
|
+
return "Register a callback to be run when an operation is done." if lro?
|
112
|
+
|
113
|
+
"Access the result along with the RPC operation"
|
114
|
+
end
|
115
|
+
|
116
|
+
def yield_params
|
117
|
+
if lro?
|
118
|
+
return [
|
119
|
+
OpenStruct.new(
|
120
|
+
name: "operation",
|
121
|
+
doc_types: "Gapic::Operation"
|
122
|
+
)
|
123
|
+
]
|
124
|
+
end
|
125
|
+
[
|
126
|
+
OpenStruct.new(
|
127
|
+
name: "result",
|
128
|
+
doc_types: return_type
|
129
|
+
),
|
130
|
+
OpenStruct.new(
|
131
|
+
name: "operation",
|
132
|
+
doc_types: "GRPC::ActiveCall::Operation"
|
133
|
+
)
|
134
|
+
]
|
135
|
+
end
|
136
|
+
|
137
|
+
# @api.incode samples and sample_configs are yaml configuration files such as
|
138
|
+
# speech_transcribe_sync_gcs.yaml
|
139
|
+
def samples
|
140
|
+
sample_configs = @api.incode_samples.select do |sample_config|
|
141
|
+
sample_config["service"] == @method.address[0...-1].join(".") &&
|
142
|
+
sample_config["rpc"] == @method.name
|
143
|
+
end
|
144
|
+
sample_configs.map { |sample_config| SamplePresenter.new @api, sample_config }
|
145
|
+
end
|
146
|
+
|
147
|
+
def lro?
|
148
|
+
return paged_response_type == "Google::Longrunning::Operation" if paged?
|
149
|
+
|
150
|
+
message_ruby_type(@method.output) == "Google::Longrunning::Operation"
|
151
|
+
end
|
152
|
+
|
153
|
+
def client_streaming?
|
154
|
+
@method.client_streaming
|
155
|
+
end
|
156
|
+
|
157
|
+
def server_streaming?
|
158
|
+
@method.server_streaming
|
159
|
+
end
|
160
|
+
|
161
|
+
def paged?
|
162
|
+
return false if server_streaming? # Cannot page a streaming response
|
163
|
+
|
164
|
+
# HACK(dazuma, 2020-04-06): Two specific RPCs should not be paged.
|
165
|
+
# This is an intentionally hard-coded exception (and a temporary one,
|
166
|
+
# to be removed when these methods no longer conform to AIP-4233.) For
|
167
|
+
# detailed information, see internal link go/actools-talent-pagination.
|
168
|
+
address = @method.address.join "."
|
169
|
+
return false if address == "google.cloud.talent.v4beta1.SearchProfiles"
|
170
|
+
return false if address == "google.cloud.talent.v4beta1.SearchJobs"
|
171
|
+
|
172
|
+
paged_request?(@method.input) && paged_response?(@method.output)
|
173
|
+
end
|
174
|
+
|
175
|
+
def paged_response_type
|
176
|
+
return nil unless paged_response? @method.output
|
177
|
+
|
178
|
+
repeated_field = @method.output.fields.find do |f|
|
179
|
+
f.label == Google::Protobuf::FieldDescriptorProto::Label::LABEL_REPEATED &&
|
180
|
+
f.type == Google::Protobuf::FieldDescriptorProto::Type::TYPE_MESSAGE
|
181
|
+
end
|
182
|
+
message_ruby_type repeated_field.message
|
183
|
+
end
|
184
|
+
|
185
|
+
##
|
186
|
+
#
|
187
|
+
# @return [Array<String>] The segment key names.
|
188
|
+
#
|
189
|
+
def routing_params
|
190
|
+
segments = Gapic::PathTemplate.parse method_path
|
191
|
+
segments.select { |s| s.is_a? Gapic::PathTemplate::Segment }.map(&:name)
|
192
|
+
end
|
193
|
+
|
194
|
+
def routing_params?
|
195
|
+
routing_params.any?
|
196
|
+
end
|
197
|
+
|
198
|
+
def grpc_service_config
|
199
|
+
if @api.grpc_service_config&.service_method_level_configs&.key?(service.grpc_full_name) &&
|
200
|
+
@api.grpc_service_config.service_method_level_configs[service.grpc_full_name]&.key?(grpc_method_name)
|
201
|
+
@api.grpc_service_config.service_method_level_configs[service.grpc_full_name][grpc_method_name]
|
202
|
+
end
|
203
|
+
end
|
204
|
+
|
205
|
+
def grpc_method_name
|
206
|
+
@method.name
|
207
|
+
end
|
208
|
+
|
209
|
+
protected
|
210
|
+
|
211
|
+
def message_ruby_type message
|
212
|
+
ruby_namespace @api, message.address.join(".")
|
213
|
+
end
|
214
|
+
|
215
|
+
def doc_types_for arg
|
216
|
+
if arg.message?
|
217
|
+
"#{message_ruby_type arg.message}, Hash"
|
218
|
+
elsif arg.enum?
|
219
|
+
# TODO: handle when arg message is nil and enum is the type
|
220
|
+
message_ruby_type arg.enum
|
221
|
+
else
|
222
|
+
case arg.type
|
223
|
+
when 1, 2 then "Float"
|
224
|
+
when 3, 4, 5, 6, 7, 13, 15, 16, 17, 18 then "Integer"
|
225
|
+
when 9, 12 then "String"
|
226
|
+
when 8 then "Boolean"
|
227
|
+
else
|
228
|
+
"Object"
|
229
|
+
end
|
230
|
+
end
|
231
|
+
end
|
232
|
+
|
233
|
+
def doc_desc_for arg
|
234
|
+
return nil if arg.docs.leading_comments.empty?
|
235
|
+
|
236
|
+
arg.docs.leading_comments
|
237
|
+
end
|
238
|
+
|
239
|
+
def default_value_for arg
|
240
|
+
if arg.message?
|
241
|
+
"{}"
|
242
|
+
elsif arg.enum?
|
243
|
+
# TODO: select the first non-0 enum value
|
244
|
+
# ":ENUM"
|
245
|
+
arg.enum.values.first
|
246
|
+
else
|
247
|
+
case arg.type
|
248
|
+
when 1, 2 then "3.14"
|
249
|
+
when 3, 4, 5, 6, 7, 13, 15, 16, 17, 18 then "42"
|
250
|
+
when 9, 12 then "\"hello world\""
|
251
|
+
when 8 then "true"
|
252
|
+
else
|
253
|
+
"Object"
|
254
|
+
end
|
255
|
+
end
|
256
|
+
end
|
257
|
+
|
258
|
+
def method_path
|
259
|
+
return "" if @method.http.nil?
|
260
|
+
|
261
|
+
method = [
|
262
|
+
@method.http.get, @method.http.post, @method.http.put,
|
263
|
+
@method.http.patch, @method.http.delete
|
264
|
+
].find { |x| !x.empty? }
|
265
|
+
return method unless method.nil?
|
266
|
+
|
267
|
+
return @method.http.custom.path unless @method.http.custom.nil?
|
268
|
+
end
|
269
|
+
|
270
|
+
def paged_request? request
|
271
|
+
page_token = request.fields.find do |f|
|
272
|
+
f.name == "page_token" && f.type == Google::Protobuf::FieldDescriptorProto::Type::TYPE_STRING
|
273
|
+
end
|
274
|
+
return false if page_token.nil?
|
275
|
+
|
276
|
+
page_size_types = [
|
277
|
+
Google::Protobuf::FieldDescriptorProto::Type::TYPE_INT32,
|
278
|
+
Google::Protobuf::FieldDescriptorProto::Type::TYPE_INT64
|
279
|
+
]
|
280
|
+
page_size = request.fields.find do |f|
|
281
|
+
f.name == "page_size" && page_size_types.include?(f.type)
|
282
|
+
end
|
283
|
+
return false if page_size.nil?
|
284
|
+
|
285
|
+
true
|
286
|
+
end
|
287
|
+
|
288
|
+
def paged_response? response
|
289
|
+
next_page_token = response.fields.find do |f|
|
290
|
+
f.name == "next_page_token" && f.type == Google::Protobuf::FieldDescriptorProto::Type::TYPE_STRING
|
291
|
+
end
|
292
|
+
return false if next_page_token.nil?
|
293
|
+
|
294
|
+
repeated_field = response.fields.find do |f|
|
295
|
+
f.label == Google::Protobuf::FieldDescriptorProto::Label::LABEL_REPEATED &&
|
296
|
+
f.type == Google::Protobuf::FieldDescriptorProto::Type::TYPE_MESSAGE
|
297
|
+
end
|
298
|
+
return false if repeated_field.nil?
|
299
|
+
|
300
|
+
# We want to make sure the first repeated field is also has the lowest field number,
|
301
|
+
# but the google-protobuf gem sorts fields by number, so we lose the original order.
|
302
|
+
|
303
|
+
true
|
304
|
+
end
|
305
|
+
end
|
306
|
+
end
|
307
|
+
end
|