gapic-generator 0.1.4
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 +7 -0
- data/.yardopts +13 -0
- data/CHANGELOG.md +43 -0
- data/CODE_OF_CONDUCT.md +43 -0
- data/CONTRIBUTING.md +28 -0
- data/LICENSE +202 -0
- data/README.md +72 -0
- data/bin/gapic-generator +103 -0
- data/bin/protoc-gen-ruby_gapic +33 -0
- data/default-rubocop.yml +10 -0
- data/gem_templates/binary.erb +20 -0
- data/gem_templates/dockerfile.erb +39 -0
- data/gem_templates/entrypoint.erb +24 -0
- data/gem_templates/gapic_sh.erb +97 -0
- data/gem_templates/gemfile.erb +8 -0
- data/gem_templates/gemspec.erb +36 -0
- data/gem_templates/generator.erb +37 -0
- data/gem_templates/gitignore.erb +10 -0
- data/gem_templates/rakefile.erb +29 -0
- data/gem_templates/readme.erb +69 -0
- data/gem_templates/rubocop.erb +16 -0
- data/gem_templates/shared/_header.erb +4 -0
- data/gem_templates/shared/_license.erb +13 -0
- data/gem_templates/shared/_warning.erb +1 -0
- data/gem_templates/test_generator.erb +13 -0
- data/gem_templates/test_helper.erb +25 -0
- data/gem_templates/version.erb +10 -0
- data/lib/gapic/file_formatter.rb +62 -0
- data/lib/gapic/formatting_utils.rb +109 -0
- data/lib/gapic/gem_builder.rb +98 -0
- data/lib/gapic/generator.rb +30 -0
- data/lib/gapic/generator/version.rb +21 -0
- data/lib/gapic/generators/base_generator.rb +91 -0
- data/lib/gapic/generators/default_generator.rb +101 -0
- data/lib/gapic/grpc_service_config/method_config.rb +49 -0
- data/lib/gapic/grpc_service_config/parser.rb +218 -0
- data/lib/gapic/grpc_service_config/parsing_error.rb +25 -0
- data/lib/gapic/grpc_service_config/retry_policy.rb +51 -0
- data/lib/gapic/grpc_service_config/service_config.rb +42 -0
- data/lib/gapic/path_template.rb +35 -0
- data/lib/gapic/path_template/parser.rb +83 -0
- data/lib/gapic/path_template/segment.rb +67 -0
- data/lib/gapic/resource_lookup.rb +91 -0
- data/lib/gapic/runner.rb +76 -0
- data/lib/gapic/schema.rb +17 -0
- data/lib/gapic/schema/api.rb +264 -0
- data/lib/gapic/schema/loader.rb +269 -0
- data/lib/gapic/schema/wrappers.rb +717 -0
- data/lib/google/api/annotations.pb.rb +39 -0
- data/lib/google/api/client.pb.rb +43 -0
- data/lib/google/api/field_behavior.pb.rb +51 -0
- data/lib/google/api/http.pb.rb +60 -0
- data/lib/google/api/resource.pb.rb +80 -0
- data/lib/google/longrunning/operations.pb.rb +115 -0
- data/lib/google/protobuf/any.pb.rb +40 -0
- data/lib/google/protobuf/compiler/plugin.pb.rb +72 -0
- data/lib/google/protobuf/descriptor.pb.rb +359 -0
- data/lib/google/protobuf/empty.pb.rb +36 -0
- data/lib/google/rpc/status.pb.rb +46 -0
- data/templates/default/gem/_version.erb +2 -0
- data/templates/default/gem/changelog.erb +3 -0
- data/templates/default/gem/gemfile.erb +4 -0
- data/templates/default/gem/gemspec.erb +37 -0
- data/templates/default/gem/gitignore.erb +20 -0
- data/templates/default/gem/license.erb +22 -0
- data/templates/default/gem/rakefile.erb +27 -0
- data/templates/default/gem/readme.erb +24 -0
- data/templates/default/gem/rubocop.erb +59 -0
- data/templates/default/gem/version.erb +6 -0
- data/templates/default/gem/yardopts.erb +12 -0
- data/templates/default/helpers/default_helper.rb +50 -0
- data/templates/default/helpers/filepath_helper.rb +38 -0
- data/templates/default/helpers/namespace_helper.rb +44 -0
- data/templates/default/helpers/presenter_helper.rb +24 -0
- data/templates/default/helpers/presenters/enum_presenter.rb +35 -0
- data/templates/default/helpers/presenters/enum_value_presenter.rb +33 -0
- data/templates/default/helpers/presenters/field_presenter.rb +146 -0
- data/templates/default/helpers/presenters/file_presenter.rb +53 -0
- data/templates/default/helpers/presenters/gem_presenter.rb +140 -0
- data/templates/default/helpers/presenters/message_presenter.rb +66 -0
- data/templates/default/helpers/presenters/method_presenter.rb +293 -0
- data/templates/default/helpers/presenters/package_presenter.rb +65 -0
- data/templates/default/helpers/presenters/resource_presenter.rb +92 -0
- data/templates/default/helpers/presenters/sample_presenter.rb +74 -0
- data/templates/default/helpers/presenters/service_presenter.rb +276 -0
- data/templates/default/layouts/_ruby.erb +20 -0
- data/templates/default/package.erb +6 -0
- data/templates/default/proto_docs/_enum.erb +13 -0
- data/templates/default/proto_docs/_message.erb +23 -0
- data/templates/default/proto_docs/_proto_file.erb +9 -0
- data/templates/default/proto_docs/proto_file.erb +6 -0
- data/templates/default/proto_docs/readme.erb +5 -0
- data/templates/default/service.erb +8 -0
- data/templates/default/service/client.erb +6 -0
- data/templates/default/service/client/_client.erb +137 -0
- data/templates/default/service/client/_config.erb +155 -0
- data/templates/default/service/client/_credentials.erb +21 -0
- data/templates/default/service/client/_helpers.erb +9 -0
- data/templates/default/service/client/_operations.erb +88 -0
- data/templates/default/service/client/_paths.erb +8 -0
- data/templates/default/service/client/_requires.erb +1 -0
- data/templates/default/service/client/_resource.erb +6 -0
- data/templates/default/service/client/_self_configure.erb +9 -0
- data/templates/default/service/client/_self_configure_defaults.erb +22 -0
- data/templates/default/service/client/_self_configure_retry_policy.erb +15 -0
- data/templates/default/service/client/method/_def.erb +21 -0
- data/templates/default/service/client/method/def/_options_defaults.erb +29 -0
- data/templates/default/service/client/method/def/_request.erb +6 -0
- data/templates/default/service/client/method/def/_request_normal.erb +4 -0
- data/templates/default/service/client/method/def/_request_streaming.erb +9 -0
- data/templates/default/service/client/method/def/_rescue.erb +1 -0
- data/templates/default/service/client/method/def/_response.erb +6 -0
- data/templates/default/service/client/method/def/_response_normal.erb +8 -0
- data/templates/default/service/client/method/def/_response_paged.erb +9 -0
- data/templates/default/service/client/method/docs/_error.erb +2 -0
- data/templates/default/service/client/method/docs/_request.erb +6 -0
- data/templates/default/service/client/method/docs/_request_field.erb +7 -0
- data/templates/default/service/client/method/docs/_request_normal.erb +20 -0
- data/templates/default/service/client/method/docs/_request_streaming.erb +5 -0
- data/templates/default/service/client/method/docs/_response.erb +6 -0
- data/templates/default/service/client/method/docs/_sample.erb +20 -0
- data/templates/default/service/client/method/docs/_sample_response.erb +24 -0
- data/templates/default/service/client/method/docs/_samples.erb +6 -0
- data/templates/default/service/client/method/docs/request_field/_arg.erb +10 -0
- data/templates/default/service/client/method/docs/request_field/_hash.erb +19 -0
- data/templates/default/service/client/method/docs/sample_response/_comment.erb +5 -0
- data/templates/default/service/client/method/docs/sample_response/_define.erb +2 -0
- data/templates/default/service/client/method/docs/sample_response/_loop.erb +12 -0
- data/templates/default/service/client/method/docs/sample_response/_print.erb +2 -0
- data/templates/default/service/client/method/docs/sample_response/_write_file.erb +2 -0
- data/templates/default/service/client/resource/_def.erb +6 -0
- data/templates/default/service/client/resource/_doc.erb +8 -0
- data/templates/default/service/client/resource/_multi.erb +28 -0
- data/templates/default/service/client/resource/_single.erb +11 -0
- data/templates/default/service/credentials.erb +6 -0
- data/templates/default/service/operations.erb +6 -0
- data/templates/default/service/paths.erb +6 -0
- data/templates/default/service/test/client.erb +24 -0
- data/templates/default/service/test/client_operations.erb +24 -0
- data/templates/default/service/test/method/_assert_response.erb +11 -0
- data/templates/default/service/test/method/_bidi.erb +100 -0
- data/templates/default/service/test/method/_client.erb +84 -0
- data/templates/default/service/test/method/_normal.erb +69 -0
- data/templates/default/service/test/method/_server.erb +85 -0
- data/templates/default/service/test/method/_setup.erb +21 -0
- data/templates/default/service/test/smoke.erb +12 -0
- data/templates/default/shared/_header.erb +4 -0
- data/templates/default/shared/_license.erb +21 -0
- data/templates/default/shared/_warning.erb +1 -0
- metadata +351 -0
|
@@ -0,0 +1,269 @@
|
|
|
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 "google/api/annotations.pb"
|
|
18
|
+
require "google/api/client.pb"
|
|
19
|
+
require "google/api/field_behavior.pb"
|
|
20
|
+
require "google/api/resource.pb"
|
|
21
|
+
require "google/longrunning/operations.pb"
|
|
22
|
+
require "google/protobuf/descriptor.pb"
|
|
23
|
+
require "gapic/schema/wrappers"
|
|
24
|
+
|
|
25
|
+
module Gapic
|
|
26
|
+
module Schema
|
|
27
|
+
# Loader
|
|
28
|
+
class Loader
|
|
29
|
+
# Initializes the loader
|
|
30
|
+
def initialize
|
|
31
|
+
@prior_messages = []
|
|
32
|
+
@prior_enums = []
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
# Loads a file.
|
|
36
|
+
#
|
|
37
|
+
# @param file_descriptor [Google::Protobuf::FileDescriptorProto] the
|
|
38
|
+
# descriptor of the proto file.
|
|
39
|
+
# @oaram file_to_generate [Boolean] Whether this file is to be
|
|
40
|
+
# generated.
|
|
41
|
+
def load_file file_descriptor, file_to_generate
|
|
42
|
+
# Setup.
|
|
43
|
+
address = file_descriptor.package.split "."
|
|
44
|
+
path = []
|
|
45
|
+
registry = {}
|
|
46
|
+
|
|
47
|
+
# Load the docs.
|
|
48
|
+
location = file_descriptor.source_code_info.location
|
|
49
|
+
docs = location.each_with_object({}) { |l, ans| ans[l.path] = l }
|
|
50
|
+
|
|
51
|
+
# Load top-level enums.
|
|
52
|
+
enums = file_descriptor.enum_type.each_with_index.map do |e, i|
|
|
53
|
+
load_enum registry, e, address, docs, [5, i]
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
# Load top-level messages.
|
|
57
|
+
messages = file_descriptor.message_type.each_with_index.map do |m, i|
|
|
58
|
+
load_message registry, m, address, docs, [4, i]
|
|
59
|
+
end
|
|
60
|
+
messages.each(&method(:update_fields!))
|
|
61
|
+
|
|
62
|
+
# Load services.
|
|
63
|
+
services = file_descriptor.service.each_with_index.map do |s, i|
|
|
64
|
+
load_service registry, s, address, docs, [6, i]
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
# Construct and return the file.
|
|
68
|
+
File.new file_descriptor, address, docs[path], messages, enums,
|
|
69
|
+
services, file_to_generate, registry
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
# Updates the fields of a message and it's nested messages.
|
|
73
|
+
#
|
|
74
|
+
# @param message [Message] the message whose fields and nested messages
|
|
75
|
+
# to update.
|
|
76
|
+
def update_fields! message
|
|
77
|
+
message.nested_messages.each(&method(:update_fields!))
|
|
78
|
+
non_primitives = message.fields.reject { |f| f.type_name.empty? }
|
|
79
|
+
non_primitives.each do |f|
|
|
80
|
+
f.message ||= cached_message f.type_name
|
|
81
|
+
f.enum ||= cached_enum f.type_name
|
|
82
|
+
end
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
# Loads an enum.
|
|
86
|
+
#
|
|
87
|
+
# @param descriptor [Google::Protobuf::EnumDescriptorProto] the
|
|
88
|
+
# descriptor of this enum.
|
|
89
|
+
# @param address [Enumerable<String>] The address of the parent.
|
|
90
|
+
# @param docs [Hash<Enumerable<Integer>,
|
|
91
|
+
# Google::Protobuf::SourceCodeInfo::Location>]
|
|
92
|
+
# A mapping of a path to the docs. See Proto#docs for more info.
|
|
93
|
+
# @param path [Enumerable<Integer>] The current path. This is used to
|
|
94
|
+
# get the docs for a proto. See Proto#docs for more info.
|
|
95
|
+
# @return [Enum] The loaded enum.
|
|
96
|
+
def load_enum registry, descriptor, address, docs, path
|
|
97
|
+
# Update Address.
|
|
98
|
+
address = address.clone << descriptor.name
|
|
99
|
+
|
|
100
|
+
# Load Enum Values
|
|
101
|
+
values = descriptor.value.each_with_index.map do |value, i|
|
|
102
|
+
load_enum_value registry, value, address, docs, path + [2, i]
|
|
103
|
+
end
|
|
104
|
+
|
|
105
|
+
# Construct, cache and return enum.
|
|
106
|
+
enum = Enum.new descriptor, address, docs[path], values
|
|
107
|
+
@prior_enums << enum
|
|
108
|
+
add_to_registry registry, address, enum
|
|
109
|
+
end
|
|
110
|
+
|
|
111
|
+
# Loads an enum value.
|
|
112
|
+
#
|
|
113
|
+
# @param descriptor [Google::Protobuf::EnumValueDescriptorProto] the
|
|
114
|
+
# descriptor of this enum value.
|
|
115
|
+
# @param address [Enumerable<String>] the address of the parent.
|
|
116
|
+
# @param docs [Hash<Enumerable<Integer>,
|
|
117
|
+
# Google::Protobuf::SourceCodeInfo::Location>]
|
|
118
|
+
# A mapping of a path to the docs. See Proto#docs for more info.
|
|
119
|
+
# @param path [Enumerable<Integer>] The current path. This is used to
|
|
120
|
+
# get the docs for a proto. See Proto#docs for more info.
|
|
121
|
+
# @return [EnumValue] The loaded enum value.
|
|
122
|
+
def load_enum_value registry, descriptor, address, docs, path
|
|
123
|
+
# Update Address.
|
|
124
|
+
address = address.clone << descriptor.name
|
|
125
|
+
|
|
126
|
+
# Construct and return value.
|
|
127
|
+
enum_value = EnumValue.new descriptor, address, docs[path]
|
|
128
|
+
add_to_registry registry, address, enum_value
|
|
129
|
+
end
|
|
130
|
+
|
|
131
|
+
# Loads a message. As a side effect, this alters @messages and @enums
|
|
132
|
+
# with the nested messages that are found.
|
|
133
|
+
#
|
|
134
|
+
# @param descriptor [Google::Protobuf::DescriptorProto] the
|
|
135
|
+
# descriptor of this message.
|
|
136
|
+
# @param address [Enumerable<String>] the address of the parent.
|
|
137
|
+
# @param docs [Hash<Enumerable<Integer>,
|
|
138
|
+
# Google::Protobuf::SourceCodeInfo::Location>]
|
|
139
|
+
# A mapping of a path to the docs. See Proto#docs for more info.
|
|
140
|
+
# @param path [Enumerable<Integer>] The current path. This is used to
|
|
141
|
+
# get the docs for a proto. See Proto#docs for more info.
|
|
142
|
+
# @return [Message] The loaded message.
|
|
143
|
+
def load_message registry, descriptor, address, docs, path
|
|
144
|
+
# Update Address.
|
|
145
|
+
address = address.clone << descriptor.name
|
|
146
|
+
|
|
147
|
+
# Load Children
|
|
148
|
+
nested_messages = descriptor.nested_type.each_with_index.map do |m, i|
|
|
149
|
+
load_message registry, m, address, docs, path + [3, i]
|
|
150
|
+
end
|
|
151
|
+
nested_enums = descriptor.enum_type.each_with_index.map do |e, i|
|
|
152
|
+
load_enum registry, e, address, docs, path + [4, i]
|
|
153
|
+
end
|
|
154
|
+
fields = descriptor.field.each_with_index.map do |f, i|
|
|
155
|
+
load_field registry, f, address, docs, path + [2, i]
|
|
156
|
+
end
|
|
157
|
+
extensions = descriptor.extension.each_with_index.map do |e, i|
|
|
158
|
+
load_field registry, e, address, docs, path + [6, i]
|
|
159
|
+
end
|
|
160
|
+
|
|
161
|
+
# Construct, cache, and return.
|
|
162
|
+
msg = Message.new(descriptor, address, docs[path], fields, extensions,
|
|
163
|
+
nested_messages, nested_enums)
|
|
164
|
+
@prior_messages << msg
|
|
165
|
+
add_to_registry registry, address, msg
|
|
166
|
+
end
|
|
167
|
+
|
|
168
|
+
# Loads a field.
|
|
169
|
+
#
|
|
170
|
+
# @param descriptor [Google::Protobuf::FieldDescriptorProto] the
|
|
171
|
+
# descriptor of this field.
|
|
172
|
+
# @param address [Enumerable<String>] The address of the parent.
|
|
173
|
+
# @param docs [Hash<Enumerable<Integer>,
|
|
174
|
+
# Google::Protobuf::SourceCodeInfo::Location>]
|
|
175
|
+
# A mapping of a path to the docs. See Proto#docs for more info.
|
|
176
|
+
# @param path [Enumerable<Integer>] The current path. This is used to
|
|
177
|
+
# get the docs for a proto. See Proto#docs for more info.
|
|
178
|
+
# @return [Field] The loaded field.
|
|
179
|
+
def load_field registry, descriptor, address, docs, path
|
|
180
|
+
# Update address.
|
|
181
|
+
address = address.clone << descriptor.name
|
|
182
|
+
|
|
183
|
+
# Construct and return the field.
|
|
184
|
+
field = Field.new(descriptor, address, docs[path],
|
|
185
|
+
cached_message(descriptor.type_name), cached_enum(descriptor.type_name))
|
|
186
|
+
add_to_registry registry, address, field
|
|
187
|
+
end
|
|
188
|
+
|
|
189
|
+
# Loads a service.
|
|
190
|
+
#
|
|
191
|
+
# @param descriptor [Google::Protobuf::ServiceDescriptorProto] the
|
|
192
|
+
# descriptor of this service.
|
|
193
|
+
# @param address [Enumerable<String>] The address of the parent.
|
|
194
|
+
# @param docs [Hash<Enumerable<Integer>,
|
|
195
|
+
# Google::Protobuf::SourceCodeInfo::Location>]
|
|
196
|
+
# A mapping of a path to the docs. See Proto#docs for more info.
|
|
197
|
+
# @param path [Enumerable<Integer>] The current path. This is used to
|
|
198
|
+
# get the docs for a proto. See Proto#docs for more info.
|
|
199
|
+
# @return [Service] The loaded service.
|
|
200
|
+
def load_service registry, descriptor, address, docs, path
|
|
201
|
+
# Update the address.
|
|
202
|
+
address = address.clone << descriptor.name
|
|
203
|
+
|
|
204
|
+
# Load children
|
|
205
|
+
methods = descriptor.method.each_with_index.map do |m, i|
|
|
206
|
+
load_method registry, m, address, docs, path + [2, i]
|
|
207
|
+
end
|
|
208
|
+
|
|
209
|
+
# Construct and return the service.
|
|
210
|
+
service = Service.new descriptor, address, docs[path], methods
|
|
211
|
+
add_to_registry registry, address, service
|
|
212
|
+
end
|
|
213
|
+
|
|
214
|
+
# Loads a method.
|
|
215
|
+
#
|
|
216
|
+
# @param descriptor [Google::Protobuf::MethodDescriptorProto] the
|
|
217
|
+
# descriptor of this service.
|
|
218
|
+
# @param address [Enumerable<String>] The address of the parent.
|
|
219
|
+
# @param docs [Hash<Enumerable<Integer>,
|
|
220
|
+
# Google::Protobuf::SourceCodeInfo::Location>]
|
|
221
|
+
# A mapping of a path to the docs. See Proto#docs for more info.
|
|
222
|
+
# @param path [Enumerable<Integer>] The current path. This is used to
|
|
223
|
+
# get the docs for a proto. See Proto#docs for more info.
|
|
224
|
+
# @return [Method] The loaded method.
|
|
225
|
+
def load_method registry, descriptor, address, docs, path
|
|
226
|
+
# Update the address.
|
|
227
|
+
address = address.clone << descriptor.name
|
|
228
|
+
|
|
229
|
+
# Construct and return the method.
|
|
230
|
+
method = Method.new(descriptor, address, docs[path],
|
|
231
|
+
cached_message(descriptor.input_type), cached_message(descriptor.output_type))
|
|
232
|
+
add_to_registry registry, address, method
|
|
233
|
+
end
|
|
234
|
+
|
|
235
|
+
# Retrieves an Enum if it has been seen before.
|
|
236
|
+
#
|
|
237
|
+
# @param type_name [String] the type name of the enum.
|
|
238
|
+
# @return [Enum | nil] The enum if it has already been seen or nil if
|
|
239
|
+
# no enum can be found.
|
|
240
|
+
def cached_enum type_name
|
|
241
|
+
cached_obj @prior_enums, type_name
|
|
242
|
+
end
|
|
243
|
+
|
|
244
|
+
# Retrieves a Message if it has been seen before.
|
|
245
|
+
#
|
|
246
|
+
# @param type_name [String] the type name of the message.
|
|
247
|
+
# @return [Enum | nil] The message if it has already been seen or nil if
|
|
248
|
+
# no message can be found.
|
|
249
|
+
def cached_message type_name
|
|
250
|
+
cached_obj @prior_messages, type_name
|
|
251
|
+
end
|
|
252
|
+
|
|
253
|
+
private
|
|
254
|
+
|
|
255
|
+
def add_to_registry registry, address, obj
|
|
256
|
+
registry[address.join(".")] = obj
|
|
257
|
+
obj
|
|
258
|
+
end
|
|
259
|
+
|
|
260
|
+
def cached_obj collection, type_name
|
|
261
|
+
# Remove leading dot.
|
|
262
|
+
type_name = type_name[1..-1] if type_name && type_name[0] == "."
|
|
263
|
+
|
|
264
|
+
# Create an address from the type & check cache.
|
|
265
|
+
collection.find { |m| m.address == type_name.split(".") }
|
|
266
|
+
end
|
|
267
|
+
end
|
|
268
|
+
end
|
|
269
|
+
end
|
|
@@ -0,0 +1,717 @@
|
|
|
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/formatting_utils"
|
|
18
|
+
|
|
19
|
+
module Gapic
|
|
20
|
+
module Schema
|
|
21
|
+
# Base class for all generic proto types including: enums, messages,
|
|
22
|
+
# methods and services.
|
|
23
|
+
#
|
|
24
|
+
# @!attribute [r] descriptor
|
|
25
|
+
# @return [Object] the descriptor of the proto
|
|
26
|
+
# @!attribute [r] address
|
|
27
|
+
# @return [Enumerable<String>] A sequence of names which determines
|
|
28
|
+
# the address of the proto. For example, a message named "Foo" in
|
|
29
|
+
# package "google.example.v1" will have the address:
|
|
30
|
+
# ["google", "example", "v1", "Foo"].
|
|
31
|
+
# and a nested message within "Foo" named "Bar" will have the address:
|
|
32
|
+
# ["google", "example", "v1", "Foo", "Bar"]
|
|
33
|
+
# @!attribute [r] docs
|
|
34
|
+
# @return [Google::Protobuf::SourceCodeInfo::Location]
|
|
35
|
+
# A Location identifies a piece of source code in a .proto file which
|
|
36
|
+
# corresponds to a particular definition. This information is
|
|
37
|
+
# intended to be useful to IDEs, code indexers, documentation
|
|
38
|
+
# generators, and similar tools.
|
|
39
|
+
#
|
|
40
|
+
# For example, say we have a file like:
|
|
41
|
+
# message Foo {
|
|
42
|
+
# optional string foo = 1;
|
|
43
|
+
# }
|
|
44
|
+
# Let's look at just the field definition:
|
|
45
|
+
# optional string foo = 1;
|
|
46
|
+
# ^ ^^ ^^ ^ ^^^
|
|
47
|
+
# a bc de f ghi
|
|
48
|
+
# We have the following locations:
|
|
49
|
+
# span path represents
|
|
50
|
+
# [a,i) [ 4, 0, 2, 0 ] The whole field definition.
|
|
51
|
+
# [a,b) [ 4, 0, 2, 0, 4 ] The label (optional).
|
|
52
|
+
# [c,d) [ 4, 0, 2, 0, 5 ] The type (string).
|
|
53
|
+
# [e,f) [ 4, 0, 2, 0, 1 ] The name (foo).
|
|
54
|
+
# [g,h) [ 4, 0, 2, 0, 3 ] The number (1).
|
|
55
|
+
#
|
|
56
|
+
# Notes:
|
|
57
|
+
# - A location may refer to a repeated field itself (i.e. not to any
|
|
58
|
+
# particular index within it). This is used whenever a set of
|
|
59
|
+
# elements are logically enclosed in a single code segment. For
|
|
60
|
+
# example, an entire extend block (possibly containing multiple
|
|
61
|
+
# extension definitions) will have an outer location whose path
|
|
62
|
+
# refers to the "extensions" repeated field without an index.
|
|
63
|
+
# - Multiple locations may have the same path. This happens when a
|
|
64
|
+
# single logical declaration is spread out across multiple places.
|
|
65
|
+
# The most obvious example is the "extend" block again -- there may
|
|
66
|
+
# be multiple extend blocks in the same scope, each of which will
|
|
67
|
+
# have the same path.
|
|
68
|
+
# - A location's span is not always a subset of its parent's span.
|
|
69
|
+
# For example, the "extendee" of an extension declaration appears at
|
|
70
|
+
# the beginning of the "extend" block and is shared by all
|
|
71
|
+
# extensions within the block.
|
|
72
|
+
# - Just because a location's span is a subset of some other
|
|
73
|
+
# location's span does not mean that it is a descendent. For
|
|
74
|
+
# example, a "group" defines both a type and a field in a single
|
|
75
|
+
# declaration. Thus, the locations corresponding to the type and
|
|
76
|
+
# field and their components will overlap.
|
|
77
|
+
# - Code which tries to interpret locations should probably be
|
|
78
|
+
# designed to ignore those that it doesn't understand, as more types
|
|
79
|
+
# of locations could be recorded in the future.
|
|
80
|
+
class Proto
|
|
81
|
+
extend Forwardable
|
|
82
|
+
attr_reader :descriptor, :address, :docs
|
|
83
|
+
attr_accessor :parent
|
|
84
|
+
|
|
85
|
+
# Initializes a Proto object.
|
|
86
|
+
# @param descriptor [Object] the protobuf
|
|
87
|
+
# representation of this service.
|
|
88
|
+
# @param address [Enumerable<String>] The address of the proto. See
|
|
89
|
+
# #address for more info.
|
|
90
|
+
# @param docs [Google::Protobuf::SourceCodeInfo::Location] The docs
|
|
91
|
+
# of the proto. See #docs for more info.
|
|
92
|
+
def initialize descriptor, address, docs
|
|
93
|
+
@descriptor = descriptor
|
|
94
|
+
@address = address
|
|
95
|
+
@docs = docs
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
# Gets the cleaned up leading comments documentation
|
|
99
|
+
def docs_leading_comments
|
|
100
|
+
return nil if @docs.nil?
|
|
101
|
+
return nil if @docs.leading_comments.empty?
|
|
102
|
+
|
|
103
|
+
lines = @docs.leading_comments.each_line.to_a
|
|
104
|
+
lines.map! { |line| line.start_with?(" ") ? line[1..-1] : line }
|
|
105
|
+
lines = FormattingUtils.escape_braces lines
|
|
106
|
+
lines.join
|
|
107
|
+
end
|
|
108
|
+
|
|
109
|
+
# @!method path
|
|
110
|
+
# @return [Array<Integer>]
|
|
111
|
+
# Identifies which part of the FileDescriptorProto was defined at
|
|
112
|
+
# this location.
|
|
113
|
+
#
|
|
114
|
+
# Each element is a field number or an index. They form a path from
|
|
115
|
+
# the root FileDescriptorProto to the place where the definition.
|
|
116
|
+
# For example, this path:
|
|
117
|
+
# [ 4, 3, 2, 7, 1 ]
|
|
118
|
+
# refers to:
|
|
119
|
+
# file.message_type(3) // 4, 3
|
|
120
|
+
# .field(7) // 2, 7
|
|
121
|
+
# .name() // 1
|
|
122
|
+
# This is because FileDescriptorProto.message_type has field number
|
|
123
|
+
# 4:
|
|
124
|
+
# repeated DescriptorProto message_type = 4;
|
|
125
|
+
# and DescriptorProto.field has field number 2:
|
|
126
|
+
# repeated FieldDescriptorProto field = 2;
|
|
127
|
+
# and FieldDescriptorProto.name has field number 1:
|
|
128
|
+
# optional string name = 1;
|
|
129
|
+
#
|
|
130
|
+
# Thus, the above path gives the location of a field name. If we
|
|
131
|
+
# removed the last element:
|
|
132
|
+
# [ 4, 3, 2, 7 ]
|
|
133
|
+
# this path refers to the whole field declaration (from the
|
|
134
|
+
# beginning of the label to the terminating semicolon).
|
|
135
|
+
# @!method span
|
|
136
|
+
# @return [Array<Integer
|
|
137
|
+
# Always has exactly three or four elements: start line, start
|
|
138
|
+
# column, end line (optional, otherwise assumed same as start line),
|
|
139
|
+
# end column. These are packed into a single field for efficiency.
|
|
140
|
+
# Note that line and column numbers are zero-based -- typically you
|
|
141
|
+
# will want to add 1 to each before displaying to a user.
|
|
142
|
+
# @!method leading_comments
|
|
143
|
+
# @return [String]
|
|
144
|
+
# If this SourceCodeInfo represents a complete declaration, these
|
|
145
|
+
# are any comments appearing before and after the declaration which
|
|
146
|
+
# appear to be attached to the declaration.
|
|
147
|
+
#
|
|
148
|
+
# A series of line comments appearing on consecutive lines, with no
|
|
149
|
+
# other tokens appearing on those lines, will be treated as a single
|
|
150
|
+
# comment.
|
|
151
|
+
#
|
|
152
|
+
# leading_detached_comments will keep paragraphs of comments that
|
|
153
|
+
# appear before (but not connected to) the current element. Each
|
|
154
|
+
# paragraph, separated by empty lines, will be one comment element
|
|
155
|
+
# in the repeated field.
|
|
156
|
+
#
|
|
157
|
+
# Only the comment content is provided; comment markers (e.g. //)
|
|
158
|
+
# are stripped out. For block comments, leading whitespace and an
|
|
159
|
+
# asterisk will be stripped from the beginning of each line other
|
|
160
|
+
# than the first. Newlines are included in the output.
|
|
161
|
+
#
|
|
162
|
+
# Examples:
|
|
163
|
+
#
|
|
164
|
+
# optional int32 foo = 1; // Comment attached to foo.
|
|
165
|
+
# // Comment attached to bar.
|
|
166
|
+
# optional int32 bar = 2;
|
|
167
|
+
#
|
|
168
|
+
# optional string baz = 3;
|
|
169
|
+
# // Comment attached to baz.
|
|
170
|
+
# // Another line attached to baz.
|
|
171
|
+
#
|
|
172
|
+
# // Comment attached to qux.
|
|
173
|
+
# //
|
|
174
|
+
# // Another line attached to qux.
|
|
175
|
+
# optional double qux = 4;
|
|
176
|
+
#
|
|
177
|
+
# // Detached comment for corge. This is not leading or trailing
|
|
178
|
+
# // comments to qux or corge because there are blank lines
|
|
179
|
+
# // separating it from both.
|
|
180
|
+
#
|
|
181
|
+
# // Detached comment for corge paragraph 2.
|
|
182
|
+
#
|
|
183
|
+
# optional string corge = 5;
|
|
184
|
+
# /* Block comment attached
|
|
185
|
+
# * to corge. Leading asterisks
|
|
186
|
+
# * will be removed. */
|
|
187
|
+
# /* Block comment attached to
|
|
188
|
+
# * grault. */
|
|
189
|
+
# optional int32 grault = 6;
|
|
190
|
+
#
|
|
191
|
+
# // ignored detached comments.
|
|
192
|
+
# @!method trailing_comments
|
|
193
|
+
# @return [String] (see #leading_comments)
|
|
194
|
+
# @!method leading_detached_comments
|
|
195
|
+
# @return [Array<String>] (see #leading_comments)
|
|
196
|
+
def_delegators(
|
|
197
|
+
:docs,
|
|
198
|
+
:path,
|
|
199
|
+
:leading_comments,
|
|
200
|
+
:trailing_comments,
|
|
201
|
+
:leading_detached_comments
|
|
202
|
+
)
|
|
203
|
+
end
|
|
204
|
+
|
|
205
|
+
# Wrapper for a protobuf service.
|
|
206
|
+
#
|
|
207
|
+
# @!attribute [r] methods
|
|
208
|
+
# @ return [Enumerable<Method>] The methods of this service.
|
|
209
|
+
class Service < Proto
|
|
210
|
+
extend Forwardable
|
|
211
|
+
attr_reader :methods
|
|
212
|
+
|
|
213
|
+
# Initializes a Service object.
|
|
214
|
+
# @param descriptor [Google::Protobuf::ServiceDescriptorProto] the
|
|
215
|
+
# protobuf representation of this service.
|
|
216
|
+
# @param address [Enumerable<String>] The address of the proto. See
|
|
217
|
+
# #address for more info.
|
|
218
|
+
# @param docs [Google::Protobuf::SourceCodeInfo::Location] The docs
|
|
219
|
+
# of the proto. See #docs for more info.
|
|
220
|
+
# @param methods [Enumerable<Method>] The methods of this service.
|
|
221
|
+
def initialize descriptor, address, docs, methods
|
|
222
|
+
super descriptor, address, docs
|
|
223
|
+
@methods = methods || []
|
|
224
|
+
@methods.each { |m| m.parent = self }
|
|
225
|
+
end
|
|
226
|
+
|
|
227
|
+
# @return [String] The hostname for this service
|
|
228
|
+
# (e.g. "foo.googleapis.com"). This should be specified with no
|
|
229
|
+
# prefix.
|
|
230
|
+
def host
|
|
231
|
+
options[:".google.api.default_host"] if options
|
|
232
|
+
end
|
|
233
|
+
|
|
234
|
+
# @return [Array<String>] The OAuth scopes information for the client.
|
|
235
|
+
def scopes
|
|
236
|
+
String(options[:".google.api.oauth_scopes"]).split "," if options
|
|
237
|
+
end
|
|
238
|
+
|
|
239
|
+
# @return [String] Ruby Package
|
|
240
|
+
def ruby_package
|
|
241
|
+
return nil if parent.nil?
|
|
242
|
+
|
|
243
|
+
parent.ruby_package
|
|
244
|
+
end
|
|
245
|
+
|
|
246
|
+
# @return [Array<Google::Api::ResourceDescriptor>] A representation of the resource.
|
|
247
|
+
# This is generally intended to be attached to the "name" field.
|
|
248
|
+
# See `google/api/resource.proto`.
|
|
249
|
+
def resources
|
|
250
|
+
require "gapic/resource_lookup"
|
|
251
|
+
|
|
252
|
+
@resources ||= Gapic::ResourceLookup.for_service self
|
|
253
|
+
end
|
|
254
|
+
|
|
255
|
+
# @!method name
|
|
256
|
+
# @return [String] the unqualified name of the service.
|
|
257
|
+
# @!method options
|
|
258
|
+
# @return [Google::Protobuf::ServiceOptions] the options of this
|
|
259
|
+
# service.
|
|
260
|
+
def_delegators(
|
|
261
|
+
:descriptor,
|
|
262
|
+
:name,
|
|
263
|
+
:options
|
|
264
|
+
)
|
|
265
|
+
end
|
|
266
|
+
|
|
267
|
+
# Wrapper for a protobuf method.
|
|
268
|
+
#
|
|
269
|
+
# @!attribute [r] input
|
|
270
|
+
# @ return [Message] The input message of this method.
|
|
271
|
+
# @!attribute [r] output
|
|
272
|
+
# @ return [Message] The output message of this method.
|
|
273
|
+
class Method < Proto
|
|
274
|
+
extend Forwardable
|
|
275
|
+
attr_reader :input, :output
|
|
276
|
+
|
|
277
|
+
# Initializes a method object.
|
|
278
|
+
# @param descriptor [Google::Protobuf::MethodDescriptorProto] the
|
|
279
|
+
# protobuf representation of this service.
|
|
280
|
+
# @param address [Enumerable<String>] The address of the proto. See
|
|
281
|
+
# #address for more info.
|
|
282
|
+
# @param docs [Google::Protobuf::SourceCodeInfo::Location] The docs
|
|
283
|
+
# of the proto. See #docs for more info.
|
|
284
|
+
# @param input [Message] The input message of this method.
|
|
285
|
+
# @param output [Message] The output message of this method.
|
|
286
|
+
def initialize descriptor, address, docs, input, output
|
|
287
|
+
super descriptor, address, docs
|
|
288
|
+
@input = input
|
|
289
|
+
@output = output
|
|
290
|
+
end
|
|
291
|
+
|
|
292
|
+
# @return [Array<Array<String>>] The parameter lists
|
|
293
|
+
# defined for this method. See `google/api/client.proto`.
|
|
294
|
+
def signatures
|
|
295
|
+
return [] if options.nil?
|
|
296
|
+
|
|
297
|
+
Array(options[:".google.api.method_signature"]).map do |sig|
|
|
298
|
+
String(sig).split ","
|
|
299
|
+
end
|
|
300
|
+
end
|
|
301
|
+
|
|
302
|
+
# @return [Google::Longrunning::OperationInfo] Additional information
|
|
303
|
+
# regarding long-running operations.
|
|
304
|
+
# In particular, this specifies the types that are returned from
|
|
305
|
+
# long-running operations.
|
|
306
|
+
# Required for methods that return `google.longrunning.Operation`;
|
|
307
|
+
# invalid otherwise.
|
|
308
|
+
def operation_info
|
|
309
|
+
options[:".google.longrunning.operation_info"] if options
|
|
310
|
+
end
|
|
311
|
+
|
|
312
|
+
# @return [Google::Api::HttpRule] The HTTP bindings for this method. See
|
|
313
|
+
# `google/api/http.proto`.
|
|
314
|
+
def http
|
|
315
|
+
options[:".google.api.http"] if options
|
|
316
|
+
end
|
|
317
|
+
|
|
318
|
+
# @!method name
|
|
319
|
+
# @return [String] the unqualified name of the method.
|
|
320
|
+
# @!method options
|
|
321
|
+
# @return [Google::Protobuf::MethodOptions] the options of this
|
|
322
|
+
# method.
|
|
323
|
+
# @!method client_streaming
|
|
324
|
+
# @return [Boolean]
|
|
325
|
+
# Identifies if client streams multiple client messages.
|
|
326
|
+
# @!method server_streaming
|
|
327
|
+
# @return [Boolean]
|
|
328
|
+
# Identifies if server streams multiple server messages.
|
|
329
|
+
def_delegators(
|
|
330
|
+
:descriptor,
|
|
331
|
+
:name,
|
|
332
|
+
:options,
|
|
333
|
+
:client_streaming,
|
|
334
|
+
:server_streaming
|
|
335
|
+
)
|
|
336
|
+
end
|
|
337
|
+
|
|
338
|
+
# Wrapper for a protobuf file.
|
|
339
|
+
#
|
|
340
|
+
# @!attribute [r] messages
|
|
341
|
+
# @ return [Enumerable<Message>] The top level messages contained in
|
|
342
|
+
# this file.
|
|
343
|
+
# @!attribute [r] enums
|
|
344
|
+
# @ return [Enumerable<Enum>] The top level enums contained in this
|
|
345
|
+
# file.
|
|
346
|
+
# @!attribute [r] services
|
|
347
|
+
# @ return [Enumerable<Service>] The services contained in this file.
|
|
348
|
+
class File < Proto
|
|
349
|
+
extend Forwardable
|
|
350
|
+
attr_reader :messages, :enums, :services, :registry
|
|
351
|
+
|
|
352
|
+
# Initializes a message object.
|
|
353
|
+
# @param descriptor [Google::Protobuf::DescriptorProto] the protobuf
|
|
354
|
+
# representation of this service.
|
|
355
|
+
# @param address [Enumerable<String>] The address of the proto. See
|
|
356
|
+
# #address for more info.
|
|
357
|
+
# @param docs [Google::Protobuf::SourceCodeInfo::Location] The docs
|
|
358
|
+
# of the proto. See #docs for more info.
|
|
359
|
+
# @param messages [Enumerable<Message>] The top level messages of this
|
|
360
|
+
# file.
|
|
361
|
+
# @param enums [Enumerable<Enum>] The top level enums of this file.
|
|
362
|
+
# @param services [Enumerable<Service>] The services of this file.
|
|
363
|
+
# @param generate [Boolean] Whether this file should be generated.
|
|
364
|
+
def initialize descriptor, address, docs, messages, enums, services,
|
|
365
|
+
generate, registry
|
|
366
|
+
super descriptor, address, docs
|
|
367
|
+
@messages = messages || []
|
|
368
|
+
@enums = enums || []
|
|
369
|
+
@services = services || []
|
|
370
|
+
@generate = generate
|
|
371
|
+
@registry = registry
|
|
372
|
+
|
|
373
|
+
# Apply parent
|
|
374
|
+
@messages.each { |m| m.parent = self }
|
|
375
|
+
@enums.each { |m| m.parent = self }
|
|
376
|
+
@services.each { |m| m.parent = self }
|
|
377
|
+
end
|
|
378
|
+
|
|
379
|
+
def lookup address
|
|
380
|
+
address = address.split(".").reject(&:empty?).join(".")
|
|
381
|
+
@registry[address]
|
|
382
|
+
end
|
|
383
|
+
|
|
384
|
+
def generate?
|
|
385
|
+
@generate
|
|
386
|
+
end
|
|
387
|
+
|
|
388
|
+
# @return [String] Ruby Package
|
|
389
|
+
def ruby_package
|
|
390
|
+
options[:ruby_package] if options
|
|
391
|
+
end
|
|
392
|
+
|
|
393
|
+
# @return [Array<Google::Api::ResourceDescriptor>] A representation of the resource.
|
|
394
|
+
# This is generally intended to be attached to the "name" field.
|
|
395
|
+
# See `google/api/resource.proto`.
|
|
396
|
+
def resources
|
|
397
|
+
options[:".google.api.resource_definition"] if options
|
|
398
|
+
end
|
|
399
|
+
|
|
400
|
+
# @!method name
|
|
401
|
+
# @return [String] file name, relative to root of source tree.
|
|
402
|
+
# @!method package
|
|
403
|
+
# @return [String] package of the file. e.g. "foo", "foo.bar", etc.
|
|
404
|
+
# @!method dependency
|
|
405
|
+
# @return [Array<String>] Names of files imported by this file.
|
|
406
|
+
# @!method public_dependency
|
|
407
|
+
# @return [Array<Integer>] Indexes of the public imported files in the
|
|
408
|
+
# dependency list returned by #dependency.
|
|
409
|
+
# @!method options
|
|
410
|
+
# @return [Google::Protobuf::FileOptions] the options of this file.
|
|
411
|
+
def_delegators(
|
|
412
|
+
:descriptor,
|
|
413
|
+
:name,
|
|
414
|
+
:package,
|
|
415
|
+
:dependency,
|
|
416
|
+
:public_dependency,
|
|
417
|
+
:options
|
|
418
|
+
)
|
|
419
|
+
end
|
|
420
|
+
|
|
421
|
+
# Wrapper for a protobuf enum.
|
|
422
|
+
#
|
|
423
|
+
# @!attribute [r] values
|
|
424
|
+
# @ return [EnumValue] the EnumValues contained in this file.
|
|
425
|
+
class Enum < Proto
|
|
426
|
+
extend Forwardable
|
|
427
|
+
attr_reader :values
|
|
428
|
+
|
|
429
|
+
# Initializes a message object.
|
|
430
|
+
# @param descriptor [Google::Protobuf::DescriptorProto] the protobuf
|
|
431
|
+
# representation of this service.
|
|
432
|
+
# @param address [Enumerable<String>] The address of the proto. See
|
|
433
|
+
# #address for more info.
|
|
434
|
+
# @param docs [Google::Protobuf::SourceCodeInfo::Location] The docs
|
|
435
|
+
# of the proto. See #docs for more info.
|
|
436
|
+
# @param values [Enumerable<EnumValue>] The EnumValues of this enum.
|
|
437
|
+
def initialize descriptor, address, docs, values
|
|
438
|
+
super descriptor, address, docs
|
|
439
|
+
@values = values || []
|
|
440
|
+
@values.each { |v| v.parent = self }
|
|
441
|
+
end
|
|
442
|
+
|
|
443
|
+
# @!method name
|
|
444
|
+
# @return [String] the unqualified name of the Enum.
|
|
445
|
+
# @!method options
|
|
446
|
+
# @return [Array<Google::Protobuf::EnumOptions>] the options of the
|
|
447
|
+
# enum.
|
|
448
|
+
def_delegators(
|
|
449
|
+
:descriptor,
|
|
450
|
+
:name,
|
|
451
|
+
:options
|
|
452
|
+
)
|
|
453
|
+
end
|
|
454
|
+
|
|
455
|
+
# Wrapper for a protobuf Enum Value.
|
|
456
|
+
class EnumValue < Proto
|
|
457
|
+
extend Forwardable
|
|
458
|
+
|
|
459
|
+
# Initializes a message object.
|
|
460
|
+
# @param descriptor [Google::Protobuf::DescriptorProto] the protobuf
|
|
461
|
+
# representation of this service.
|
|
462
|
+
# @param address [Enumerable<String>] The address of the proto. See
|
|
463
|
+
# #address for more info.
|
|
464
|
+
# @param docs [Google::Protobuf::SourceCodeInfo::Location] The docs
|
|
465
|
+
# of the proto. See #docs for more info.
|
|
466
|
+
def initialize descriptor, address, docs
|
|
467
|
+
super descriptor, address, docs
|
|
468
|
+
end
|
|
469
|
+
|
|
470
|
+
# @!method name
|
|
471
|
+
# @return [String] the unqualified name of the EnumValue
|
|
472
|
+
# @!method number
|
|
473
|
+
# @return [Integer] The number value.
|
|
474
|
+
# @!method options
|
|
475
|
+
# @return [Array<Google::Protobuf::EnumValueOptions>]
|
|
476
|
+
# The options of the enum value.
|
|
477
|
+
def_delegators(
|
|
478
|
+
:descriptor,
|
|
479
|
+
:name,
|
|
480
|
+
:number,
|
|
481
|
+
:options
|
|
482
|
+
)
|
|
483
|
+
end
|
|
484
|
+
|
|
485
|
+
# Wrapper for a protobuf Message.
|
|
486
|
+
#
|
|
487
|
+
# @!attribute [r] fields
|
|
488
|
+
# @ return [Enumerable<Field>] The fields of a message.
|
|
489
|
+
# @!attribute [r] extensions
|
|
490
|
+
# @ return [Enumerable<Field>] The extensions of a message.
|
|
491
|
+
# @!attribute [r] nested_messages
|
|
492
|
+
# @ return [Enumerable<Message>] The nested message declarations of a
|
|
493
|
+
# message.
|
|
494
|
+
# @!attribute [r] nested_enums
|
|
495
|
+
# @ return [Enumerable<Enum>] The nested enum declarations of a message.
|
|
496
|
+
class Message < Proto
|
|
497
|
+
extend Forwardable
|
|
498
|
+
attr_reader :fields, :extensions, :nested_messages, :nested_enums
|
|
499
|
+
|
|
500
|
+
# Initializes a message object.
|
|
501
|
+
# @param descriptor [Google::Protobuf::DescriptorProto] the protobuf
|
|
502
|
+
# representation of this service.
|
|
503
|
+
# @param address [Enumerable<String>] The address of the proto. See
|
|
504
|
+
# #address for more info.
|
|
505
|
+
# @param docs [Google::Protobuf::SourceCodeInfo::Location] The docs
|
|
506
|
+
# of the proto. See #docs for more info.
|
|
507
|
+
# @param fields [Enumerable<Field>] The fields of this message.
|
|
508
|
+
# @param extensions [Enumerable<Field>] The extensions of this message.
|
|
509
|
+
# @param nested_messages [Enumerable<Message>] The nested message
|
|
510
|
+
# declarations of this message.
|
|
511
|
+
# @param nested_enums [Enumerable<Enum>] The nested enum declarations
|
|
512
|
+
# of this message.
|
|
513
|
+
def initialize descriptor, address, docs, fields, extensions,
|
|
514
|
+
nested_messages, nested_enums
|
|
515
|
+
super descriptor, address, docs
|
|
516
|
+
@fields = fields || []
|
|
517
|
+
@extensions = extensions || []
|
|
518
|
+
@nested_messages = nested_messages || []
|
|
519
|
+
@nested_enums = nested_enums || []
|
|
520
|
+
|
|
521
|
+
@fields.each { |f| f.parent = self }
|
|
522
|
+
@extensions.each { |x| x.parent = self }
|
|
523
|
+
@nested_messages.each { |m| m.parent = self }
|
|
524
|
+
@nested_enums.each { |e| e.parent = self }
|
|
525
|
+
end
|
|
526
|
+
|
|
527
|
+
# @return [Google::Api::ResourceDescriptor] A representation of the resource.
|
|
528
|
+
# This is generally intended to be attached to the "name" field.
|
|
529
|
+
# See `google/api/resource.proto`.
|
|
530
|
+
def resource
|
|
531
|
+
options[:".google.api.resource"] if options
|
|
532
|
+
end
|
|
533
|
+
|
|
534
|
+
# @return [Boolean] whether this type is a map entry
|
|
535
|
+
def map_entry?
|
|
536
|
+
descriptor.options&.map_entry
|
|
537
|
+
end
|
|
538
|
+
|
|
539
|
+
# @!method name
|
|
540
|
+
# @return [String] the unqualified name of the message.
|
|
541
|
+
# @!method oneof_decl
|
|
542
|
+
# @return [Array<Google::Protobuf::OneofDescriptorProto>]
|
|
543
|
+
# The oneofs declared in this message.
|
|
544
|
+
# @!method options
|
|
545
|
+
# @return [Array<Google::Protobuf::MessageOptions>]
|
|
546
|
+
# The options of this meessage.
|
|
547
|
+
def_delegators(
|
|
548
|
+
:descriptor,
|
|
549
|
+
:name,
|
|
550
|
+
:oneof_decl,
|
|
551
|
+
:options
|
|
552
|
+
)
|
|
553
|
+
end
|
|
554
|
+
|
|
555
|
+
# Wrapper for a protobuf Field.
|
|
556
|
+
#
|
|
557
|
+
# @!attribute [r] message
|
|
558
|
+
# @ return [Message | nil] The message if the field is a message, nil
|
|
559
|
+
# otherwise.
|
|
560
|
+
# @!attribute [r] enum
|
|
561
|
+
# @ return [Enum | nil] The enum if the field is an enum, nil
|
|
562
|
+
# otherwise.
|
|
563
|
+
class Field < Proto
|
|
564
|
+
extend Forwardable
|
|
565
|
+
attr_reader :message, :enum
|
|
566
|
+
attr_writer :message, :enum
|
|
567
|
+
|
|
568
|
+
# Initializes a message object.
|
|
569
|
+
# @param descriptor [Google::Protobuf::FieldDescriptorProto] the
|
|
570
|
+
# protobuf representation of this service.
|
|
571
|
+
# @param address [Enumerable<String>] The address of the proto. See
|
|
572
|
+
# #address for more info.
|
|
573
|
+
# @param docs [Google::Protobuf::SourceCodeInfo::Location] The docs
|
|
574
|
+
# of the proto. See #docs for more info.
|
|
575
|
+
# @param message [Message | nil] The message if the field is a message,
|
|
576
|
+
# nil otherwise.
|
|
577
|
+
# @param enum [Enum | nil] The enum if the field is an enum, nil
|
|
578
|
+
# otherwise.
|
|
579
|
+
def initialize descriptor, address, docs, message, enum
|
|
580
|
+
super descriptor, address, docs
|
|
581
|
+
@message = message
|
|
582
|
+
@enum = enum
|
|
583
|
+
end
|
|
584
|
+
|
|
585
|
+
# Whether this field is a message.
|
|
586
|
+
# @return [Boolean]
|
|
587
|
+
def message?
|
|
588
|
+
return true if @message
|
|
589
|
+
|
|
590
|
+
false
|
|
591
|
+
end
|
|
592
|
+
|
|
593
|
+
# Whether this field is a repeated field.
|
|
594
|
+
# @return [Boolean]
|
|
595
|
+
def repeated?
|
|
596
|
+
label == Google::Protobuf::FieldDescriptorProto::Label::LABEL_REPEATED
|
|
597
|
+
end
|
|
598
|
+
|
|
599
|
+
# Whether this field is an enum.
|
|
600
|
+
# @return [Boolean]
|
|
601
|
+
def enum?
|
|
602
|
+
return true if @enum
|
|
603
|
+
|
|
604
|
+
false
|
|
605
|
+
end
|
|
606
|
+
|
|
607
|
+
# Whether this field is a map
|
|
608
|
+
# @return [Boolean]
|
|
609
|
+
def map?
|
|
610
|
+
return true if repeated? && @message&.map_entry?
|
|
611
|
+
|
|
612
|
+
false
|
|
613
|
+
end
|
|
614
|
+
|
|
615
|
+
# @return [String] A reference to another resource message or resource
|
|
616
|
+
# definition. See `google/api/resource.proto`.
|
|
617
|
+
def resource_reference
|
|
618
|
+
options[:".google.api.resource_reference"] if options
|
|
619
|
+
end
|
|
620
|
+
|
|
621
|
+
# @return [Array<Google::Api::FieldBehavior>] A designation of a
|
|
622
|
+
# specific field behavior (required, output only, etc.) in protobuf
|
|
623
|
+
# messages.
|
|
624
|
+
def field_behavior
|
|
625
|
+
return options[:".google.api.field_behavior"] if options
|
|
626
|
+
|
|
627
|
+
[]
|
|
628
|
+
end
|
|
629
|
+
|
|
630
|
+
# Specifically denotes a field as optional. While all fields in protocol
|
|
631
|
+
# buffers are optional, this may be specified for emphasis if
|
|
632
|
+
# appropriate.
|
|
633
|
+
def optional?
|
|
634
|
+
field_behavior.include? Google::Api::FieldBehavior::OPTIONAL
|
|
635
|
+
end
|
|
636
|
+
|
|
637
|
+
# Denotes a field as required. This indicates that the field **must** be
|
|
638
|
+
# provided as part of the request, and failure to do so will cause an
|
|
639
|
+
# error (usually `INVALID_ARGUMENT`).
|
|
640
|
+
def required?
|
|
641
|
+
field_behavior.include? Google::Api::FieldBehavior::REQUIRED
|
|
642
|
+
end
|
|
643
|
+
|
|
644
|
+
# Denotes a field as output only. This indicates that the field is
|
|
645
|
+
# provided in responses, but including the field in a request does
|
|
646
|
+
# nothing (the server *must* ignore it and *must not* throw an error as
|
|
647
|
+
# a result of the field's presence).
|
|
648
|
+
def output_only?
|
|
649
|
+
field_behavior.include? Google::Api::FieldBehavior::OUTPUT_ONLY
|
|
650
|
+
end
|
|
651
|
+
|
|
652
|
+
# Denotes a field as input only. This indicates that the field is
|
|
653
|
+
# provided in requests, and the corresponding field is not included in
|
|
654
|
+
# output.
|
|
655
|
+
def input_only?
|
|
656
|
+
field_behavior.include? Google::Api::FieldBehavior::INPUT_ONLY
|
|
657
|
+
end
|
|
658
|
+
|
|
659
|
+
# Denotes a field as immutable. This indicates that the field may be set
|
|
660
|
+
# once in a request to create a resource, but may not be changed
|
|
661
|
+
# thereafter.
|
|
662
|
+
def immutable?
|
|
663
|
+
field_behavior.include? Google::Api::FieldBehavior::IMMUTABLE
|
|
664
|
+
end
|
|
665
|
+
|
|
666
|
+
# @!method name
|
|
667
|
+
# @return [String] the unqualified name of the field.
|
|
668
|
+
# @!method number
|
|
669
|
+
# @return [Integer] the number of the field.
|
|
670
|
+
# @!method label
|
|
671
|
+
# @return [Google::Protobuf::FieldDescriptorProto::Label]
|
|
672
|
+
# The label of the field.
|
|
673
|
+
# @!method type
|
|
674
|
+
# @return [Google::Protobuf::FieldDescriptorProto::Type]
|
|
675
|
+
# If type_name is set, this need not be set. If both this and
|
|
676
|
+
# type_name are set, this must be one of TYPE_ENUM, TYPE_MESSAGE or
|
|
677
|
+
# TYPE_GROUP.
|
|
678
|
+
# @!method type_name
|
|
679
|
+
# @return [String]
|
|
680
|
+
# For message and enum types, this is the name of the type. If the
|
|
681
|
+
# name starts with a '.', it is fully-qualified. Otherwise,
|
|
682
|
+
# C++-like scoping rules are used to find the type (i.e. first the
|
|
683
|
+
# nested types within this message are searched, then within the
|
|
684
|
+
# parent, on up to the root namespace).
|
|
685
|
+
# @!method default_value
|
|
686
|
+
# @return [String]
|
|
687
|
+
# For numeric types, contains the original text representation of
|
|
688
|
+
# the value. For booleans, "true" or "false". For strings, contains
|
|
689
|
+
# the default text contents (not escaped in any way). For bytes,
|
|
690
|
+
# contains the C escaped value. All bytes >= 128 are escaped.
|
|
691
|
+
# @!method oneof_index
|
|
692
|
+
# @return [Integer]
|
|
693
|
+
# If set, gives the index of a oneof in the containing type's
|
|
694
|
+
# oneof_decl list. This field is a member of that oneof.
|
|
695
|
+
# @!method json_name
|
|
696
|
+
# @return [String]
|
|
697
|
+
# JSON name of this field. The value is set by protocol compiler. If
|
|
698
|
+
# the user has set a "json_name" option on this field, that option's
|
|
699
|
+
# value will be used. Otherwise, it's deduced from the field's name
|
|
700
|
+
# by converting it to camelCase.
|
|
701
|
+
# @!method options
|
|
702
|
+
# @return [Google::Protobuf::FieldOptions] the options of this field.
|
|
703
|
+
def_delegators(
|
|
704
|
+
:descriptor,
|
|
705
|
+
:name,
|
|
706
|
+
:number,
|
|
707
|
+
:label,
|
|
708
|
+
:type,
|
|
709
|
+
:type_name,
|
|
710
|
+
:default_value,
|
|
711
|
+
:oneof_index,
|
|
712
|
+
:json_name,
|
|
713
|
+
:options
|
|
714
|
+
)
|
|
715
|
+
end
|
|
716
|
+
end
|
|
717
|
+
end
|