protostar 0.1.0.beta1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (223) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +60 -0
  3. data/LICENSE.txt +21 -0
  4. data/README.md +647 -0
  5. data/THIRD_PARTY_NOTICES.md +61 -0
  6. data/exe/protoc-gen-protostar +7 -0
  7. data/exe/protostar +7 -0
  8. data/lib/protostar/builder/generator.rb +71 -0
  9. data/lib/protostar/builder/sink.rb +35 -0
  10. data/lib/protostar/builder.rb +965 -0
  11. data/lib/protostar/cli.rb +267 -0
  12. data/lib/protostar/codec/decode_generator.rb +199 -0
  13. data/lib/protostar/codec/decoder.rb +296 -0
  14. data/lib/protostar/codec/encode_generator.rb +224 -0
  15. data/lib/protostar/codec/encoder.rb +121 -0
  16. data/lib/protostar/codec/sizer.rb +91 -0
  17. data/lib/protostar/codec.rb +15 -0
  18. data/lib/protostar/compiler/ast.rb +193 -0
  19. data/lib/protostar/compiler/emitters/descriptor_set.rb +57 -0
  20. data/lib/protostar/compiler/emitters/google_ruby.rb +103 -0
  21. data/lib/protostar/compiler/emitters/grpc.rb +175 -0
  22. data/lib/protostar/compiler/emitters/protostar_rbs.rb +252 -0
  23. data/lib/protostar/compiler/emitters/rbs.rb +394 -0
  24. data/lib/protostar/compiler/emitters/ruby.rb +503 -0
  25. data/lib/protostar/compiler/emitters.rb +268 -0
  26. data/lib/protostar/compiler/include/LICENSE +32 -0
  27. data/lib/protostar/compiler/include/google/protobuf/any.proto +106 -0
  28. data/lib/protostar/compiler/include/google/protobuf/api.proto +229 -0
  29. data/lib/protostar/compiler/include/google/protobuf/compiler/plugin.proto +180 -0
  30. data/lib/protostar/compiler/include/google/protobuf/cpp_features.proto +87 -0
  31. data/lib/protostar/compiler/include/google/protobuf/descriptor.proto +1532 -0
  32. data/lib/protostar/compiler/include/google/protobuf/duration.proto +115 -0
  33. data/lib/protostar/compiler/include/google/protobuf/empty.proto +51 -0
  34. data/lib/protostar/compiler/include/google/protobuf/field_mask.proto +243 -0
  35. data/lib/protostar/compiler/include/google/protobuf/java_features.proto +132 -0
  36. data/lib/protostar/compiler/include/google/protobuf/source_context.proto +48 -0
  37. data/lib/protostar/compiler/include/google/protobuf/struct.proto +111 -0
  38. data/lib/protostar/compiler/include/google/protobuf/timestamp.proto +145 -0
  39. data/lib/protostar/compiler/include/google/protobuf/type.proto +217 -0
  40. data/lib/protostar/compiler/include/google/protobuf/wrappers.proto +157 -0
  41. data/lib/protostar/compiler/lexer.rb +659 -0
  42. data/lib/protostar/compiler/linker.rb +894 -0
  43. data/lib/protostar/compiler/option_interpreter.rb +363 -0
  44. data/lib/protostar/compiler/parser.rb +1696 -0
  45. data/lib/protostar/compiler/retention.rb +104 -0
  46. data/lib/protostar/compiler/run.rb +184 -0
  47. data/lib/protostar/compiler/source_info.rb +161 -0
  48. data/lib/protostar/compiler/symbol_table.rb +223 -0
  49. data/lib/protostar/compiler/text_format.rb +340 -0
  50. data/lib/protostar/compiler/validator.rb +944 -0
  51. data/lib/protostar/compiler.rb +304 -0
  52. data/lib/protostar/diagnostics/codes.rb +1307 -0
  53. data/lib/protostar/diagnostics/formats.rb +64 -0
  54. data/lib/protostar/diagnostics/renderer.rb +240 -0
  55. data/lib/protostar/diagnostics/source.rb +153 -0
  56. data/lib/protostar/diagnostics.rb +117 -0
  57. data/lib/protostar/dsl.rb +367 -0
  58. data/lib/protostar/enum.rb +70 -0
  59. data/lib/protostar/errors.rb +23 -0
  60. data/lib/protostar/google/protobuf/any_pb.rb +90 -0
  61. data/lib/protostar/google/protobuf/api_pb.rb +199 -0
  62. data/lib/protostar/google/protobuf/compiler/plugin_pb.rb +168 -0
  63. data/lib/protostar/google/protobuf/descriptor_pb.rb +1239 -0
  64. data/lib/protostar/google/protobuf/duration_pb.rb +99 -0
  65. data/lib/protostar/google/protobuf/empty_pb.rb +36 -0
  66. data/lib/protostar/google/protobuf/field_mask_pb.rb +228 -0
  67. data/lib/protostar/google/protobuf/source_context_pb.rb +33 -0
  68. data/lib/protostar/google/protobuf/struct_pb.rb +91 -0
  69. data/lib/protostar/google/protobuf/timestamp_pb.rb +129 -0
  70. data/lib/protostar/google/protobuf/type_pb.rb +202 -0
  71. data/lib/protostar/google/protobuf/wrappers_pb.rb +125 -0
  72. data/lib/protostar/google_protobuf_shim.rb +24 -0
  73. data/lib/protostar/json/encoder.rb +340 -0
  74. data/lib/protostar/json/errors.rb +34 -0
  75. data/lib/protostar/json/parser.rb +437 -0
  76. data/lib/protostar/json/path.rb +39 -0
  77. data/lib/protostar/json.rb +95 -0
  78. data/lib/protostar/lint/command.rb +197 -0
  79. data/lib/protostar/lint/config.rb +98 -0
  80. data/lib/protostar/lint/context.rb +126 -0
  81. data/lib/protostar/lint/directives.rb +56 -0
  82. data/lib/protostar/lint/fixer.rb +165 -0
  83. data/lib/protostar/lint/naming.rb +54 -0
  84. data/lib/protostar/lint/rule.rb +120 -0
  85. data/lib/protostar/lint/rules/comment_enum.rb +31 -0
  86. data/lib/protostar/lint/rules/comment_enum_value.rb +32 -0
  87. data/lib/protostar/lint/rules/comment_field.rb +33 -0
  88. data/lib/protostar/lint/rules/comment_message.rb +31 -0
  89. data/lib/protostar/lint/rules/comment_rpc.rb +31 -0
  90. data/lib/protostar/lint/rules/comment_service.rb +31 -0
  91. data/lib/protostar/lint/rules/edition_recommended.rb +31 -0
  92. data/lib/protostar/lint/rules/enum_first_value_zero.rb +34 -0
  93. data/lib/protostar/lint/rules/enum_pascal_case.rb +25 -0
  94. data/lib/protostar/lint/rules/enum_value_prefix.rb +38 -0
  95. data/lib/protostar/lint/rules/enum_value_upper_snake_case.rb +28 -0
  96. data/lib/protostar/lint/rules/enum_zero_value_suffix.rb +41 -0
  97. data/lib/protostar/lint/rules/field_lower_snake_case.rb +34 -0
  98. data/lib/protostar/lint/rules/field_not_required.rb +39 -0
  99. data/lib/protostar/lint/rules/field_number_reuse_risk.rb +45 -0
  100. data/lib/protostar/lint/rules/field_numbers_hot_range.rb +44 -0
  101. data/lib/protostar/lint/rules/file_lower_snake_case.rb +27 -0
  102. data/lib/protostar/lint/rules/import_no_public.rb +29 -0
  103. data/lib/protostar/lint/rules/import_no_weak.rb +28 -0
  104. data/lib/protostar/lint/rules/import_used.rb +33 -0
  105. data/lib/protostar/lint/rules/message_pascal_case.rb +27 -0
  106. data/lib/protostar/lint/rules/no_deprecated_features.rb +50 -0
  107. data/lib/protostar/lint/rules/no_groups.rb +34 -0
  108. data/lib/protostar/lint/rules/oneof_lower_snake_case.rb +27 -0
  109. data/lib/protostar/lint/rules/package_defined.rb +28 -0
  110. data/lib/protostar/lint/rules/package_directory_match.rb +33 -0
  111. data/lib/protostar/lint/rules/package_lower_snake_case.rb +28 -0
  112. data/lib/protostar/lint/rules/package_same_directory.rb +39 -0
  113. data/lib/protostar/lint/rules/package_version_suffix.rb +31 -0
  114. data/lib/protostar/lint/rules/reserved_names_with_numbers.rb +44 -0
  115. data/lib/protostar/lint/rules/rpc_pascal_case.rb +25 -0
  116. data/lib/protostar/lint/rules/rpc_request_response_unique.rb +40 -0
  117. data/lib/protostar/lint/rules/rpc_request_standard_name.rb +32 -0
  118. data/lib/protostar/lint/rules/rpc_response_standard_name.rb +31 -0
  119. data/lib/protostar/lint/rules/service_pascal_case.rb +25 -0
  120. data/lib/protostar/lint/rules/service_suffix.rb +28 -0
  121. data/lib/protostar/lint/rules/syntax_specified.rb +35 -0
  122. data/lib/protostar/lint/runner.rb +135 -0
  123. data/lib/protostar/lint.rb +122 -0
  124. data/lib/protostar/message/accessors.rb +86 -0
  125. data/lib/protostar/message/coercion.rb +171 -0
  126. data/lib/protostar/message/field_info.rb +145 -0
  127. data/lib/protostar/message/reflection.rb +149 -0
  128. data/lib/protostar/message.rb +572 -0
  129. data/lib/protostar/plugin.rb +94 -0
  130. data/lib/protostar/schema/default_value.rb +113 -0
  131. data/lib/protostar/schema/descriptor.rb +41 -0
  132. data/lib/protostar/schema/draft/copy.rb +88 -0
  133. data/lib/protostar/schema/draft/resolution.rb +177 -0
  134. data/lib/protostar/schema/draft.rb +779 -0
  135. data/lib/protostar/schema/enum.rb +106 -0
  136. data/lib/protostar/schema/extension_range.rb +37 -0
  137. data/lib/protostar/schema/features.rb +153 -0
  138. data/lib/protostar/schema/field.rb +201 -0
  139. data/lib/protostar/schema/file.rb +217 -0
  140. data/lib/protostar/schema/freezer.rb +61 -0
  141. data/lib/protostar/schema/message.rb +104 -0
  142. data/lib/protostar/schema/oneof.rb +38 -0
  143. data/lib/protostar/schema/options.rb +367 -0
  144. data/lib/protostar/schema/pool.rb +179 -0
  145. data/lib/protostar/schema/proto.rb +576 -0
  146. data/lib/protostar/schema/resolver.rb +118 -0
  147. data/lib/protostar/schema/service.rb +89 -0
  148. data/lib/protostar/schema/source_info.rb +53 -0
  149. data/lib/protostar/schema.rb +65 -0
  150. data/lib/protostar/short_names/any.rb +7 -0
  151. data/lib/protostar/short_names/duration.rb +7 -0
  152. data/lib/protostar/short_names/empty.rb +7 -0
  153. data/lib/protostar/short_names/field_mask.rb +7 -0
  154. data/lib/protostar/short_names/struct.rb +9 -0
  155. data/lib/protostar/short_names/timestamp.rb +7 -0
  156. data/lib/protostar/short_names/wrappers.rb +15 -0
  157. data/lib/protostar/text/extensions.rb +114 -0
  158. data/lib/protostar/text/parser.rb +439 -0
  159. data/lib/protostar/text/printer.rb +304 -0
  160. data/lib/protostar/text/tokenizer.rb +116 -0
  161. data/lib/protostar/text.rb +67 -0
  162. data/lib/protostar/types.rb +152 -0
  163. data/lib/protostar/unknown_field.rb +58 -0
  164. data/lib/protostar/version.rb +5 -0
  165. data/lib/protostar/view/generator.rb +298 -0
  166. data/lib/protostar/view/map.rb +194 -0
  167. data/lib/protostar/view/repeated.rb +143 -0
  168. data/lib/protostar/view/scan.rb +183 -0
  169. data/lib/protostar/view.rb +283 -0
  170. data/lib/protostar/well_known/any.rb +52 -0
  171. data/lib/protostar/well_known/duration.rb +53 -0
  172. data/lib/protostar/well_known/list_value.rb +63 -0
  173. data/lib/protostar/well_known/struct.rb +55 -0
  174. data/lib/protostar/well_known/timestamp.rb +64 -0
  175. data/lib/protostar/well_known/value.rb +60 -0
  176. data/lib/protostar/well_known.rb +38 -0
  177. data/lib/protostar/wire/io_source.rb +40 -0
  178. data/lib/protostar/wire/reader.rb +254 -0
  179. data/lib/protostar/wire/writer.rb +201 -0
  180. data/lib/protostar/wire.rb +96 -0
  181. data/lib/protostar.rb +95 -0
  182. data/shims/google-protobuf/lib/google/protobuf/any_pb.rb +17 -0
  183. data/shims/google-protobuf/lib/google/protobuf/api_pb.rb +22 -0
  184. data/shims/google-protobuf/lib/google/protobuf/compiler/plugin_pb.rb +25 -0
  185. data/shims/google-protobuf/lib/google/protobuf/descriptor_pb.rb +72 -0
  186. data/shims/google-protobuf/lib/google/protobuf/descriptor_pool.rb +164 -0
  187. data/shims/google-protobuf/lib/google/protobuf/descriptors.rb +553 -0
  188. data/shims/google-protobuf/lib/google/protobuf/duration_pb.rb +17 -0
  189. data/shims/google-protobuf/lib/google/protobuf/empty_pb.rb +17 -0
  190. data/shims/google-protobuf/lib/google/protobuf/field_mask_pb.rb +17 -0
  191. data/shims/google-protobuf/lib/google/protobuf/internal/convert.rb +180 -0
  192. data/shims/google-protobuf/lib/google/protobuf/internal/extensions.rb +154 -0
  193. data/shims/google-protobuf/lib/google/protobuf/internal/json.rb +104 -0
  194. data/shims/google-protobuf/lib/google/protobuf/internal/well_known.rb +140 -0
  195. data/shims/google-protobuf/lib/google/protobuf/map.rb +216 -0
  196. data/shims/google-protobuf/lib/google/protobuf/message.rb +544 -0
  197. data/shims/google-protobuf/lib/google/protobuf/message_exts.rb +41 -0
  198. data/shims/google-protobuf/lib/google/protobuf/plugin_pb.rb +4 -0
  199. data/shims/google-protobuf/lib/google/protobuf/repeated_field.rb +366 -0
  200. data/shims/google-protobuf/lib/google/protobuf/source_context_pb.rb +17 -0
  201. data/shims/google-protobuf/lib/google/protobuf/struct_pb.rb +20 -0
  202. data/shims/google-protobuf/lib/google/protobuf/timestamp_pb.rb +17 -0
  203. data/shims/google-protobuf/lib/google/protobuf/type_pb.rb +27 -0
  204. data/shims/google-protobuf/lib/google/protobuf/well_known_types.rb +37 -0
  205. data/shims/google-protobuf/lib/google/protobuf/wrappers_pb.rb +25 -0
  206. data/shims/google-protobuf/lib/google/protobuf.rb +107 -0
  207. data/shims/google-protobuf/lib/google/protobuf_ffi.rb +5 -0
  208. data/shims/google-protobuf/lib/google/protobuf_native.rb +5 -0
  209. data/sig/protostar/google/protobuf/any_pb.rbs +77 -0
  210. data/sig/protostar/google/protobuf/api_pb.rbs +242 -0
  211. data/sig/protostar/google/protobuf/compiler/plugin_pb.rbs +264 -0
  212. data/sig/protostar/google/protobuf/descriptor_pb.rbs +2220 -0
  213. data/sig/protostar/google/protobuf/duration_pb.rbs +82 -0
  214. data/sig/protostar/google/protobuf/empty_pb.rbs +18 -0
  215. data/sig/protostar/google/protobuf/field_mask_pb.rbs +170 -0
  216. data/sig/protostar/google/protobuf/source_context_pb.rbs +24 -0
  217. data/sig/protostar/google/protobuf/struct_pb.rbs +135 -0
  218. data/sig/protostar/google/protobuf/timestamp_pb.rbs +102 -0
  219. data/sig/protostar/google/protobuf/type_pb.rbs +304 -0
  220. data/sig/protostar/google/protobuf/wrappers_pb.rbs +169 -0
  221. data/sig/protostar/lint.rbs +216 -0
  222. data/sig/protostar.rbs +326 -0
  223. metadata +366 -0
@@ -0,0 +1,553 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "forwardable"
4
+
5
+ module Google
6
+ module Protobuf
7
+ module Internal
8
+ # What every descriptor wrapper shares: a {Protostar::Schema} descriptor
9
+ # and the DescriptorPool it belongs to. Methods the gem does not have are
10
+ # passed to the schema descriptor, because protostar's runtime reads
11
+ # `klass.descriptor` (here a wrapper) as a {Protostar::Schema::Message}.
12
+ # @api private
13
+ module Wrapper
14
+ def self.included(base)
15
+ base.extend(ClassMethods)
16
+ end
17
+
18
+ module ClassMethods
19
+ def new(*)
20
+ raise "Descriptor objects may not be created from Ruby."
21
+ end
22
+
23
+ # @api private
24
+ def __wrap(schema, pool)
25
+ instance = allocate
26
+ instance.send(:initialize, schema, pool)
27
+ instance
28
+ end
29
+ end
30
+
31
+ # @return [DescriptorPool]
32
+ attr_reader :descriptor_pool
33
+
34
+ # @api private
35
+ attr_reader :__schema
36
+
37
+ def to_s
38
+ inspect
39
+ end
40
+
41
+ def inspect
42
+ "#{self.class.name}: #{name}"
43
+ end
44
+
45
+ private
46
+
47
+ def initialize(schema, pool)
48
+ @__schema = schema
49
+ @descriptor_pool = pool
50
+ end
51
+
52
+ def wrap(schema)
53
+ schema && @descriptor_pool.__wrap(schema)
54
+ end
55
+
56
+ # The descriptor's options as a google.protobuf.*Options message of
57
+ # the generated pool, frozen, without `features` (as the gem gives them)
58
+ def options_message(type)
59
+ options = @__schema.options
60
+ bytes = options.declared? ? options.to_proto.encode : ""
61
+ message = Google::Protobuf.const_get(type).decode(bytes)
62
+ message.clear_features if message.respond_to?(:clear_features)
63
+ message.freeze
64
+ end
65
+
66
+ # The descriptor as a google.protobuf.*Proto message of the generated
67
+ # pool, with json_names only where a .proto would have spelled them
68
+ # out, as upb's to_proto gives them
69
+ def proto_message(type, proto)
70
+ Google::Protobuf.const_get(type).decode(proto.encode)
71
+ end
72
+ end
73
+ end
74
+
75
+ # A message type
76
+ class Descriptor
77
+ include Internal::Wrapper
78
+ include Enumerable
79
+ extend Forwardable
80
+
81
+ # protostar's runtime reads `klass.descriptor` as a Protostar::Schema::Message
82
+ # (JSON, text, Any); these are the methods it calls
83
+ # @api private
84
+ def_delegators :@__schema, :full_name, :file, :fields, :fields_by_name, :fields_by_number,
85
+ :fields_by_json_name, :map_entry?, :message_set_wire_format?, :extension_number?
86
+
87
+ # @return [String] the full name
88
+ def name
89
+ @__schema.full_name
90
+ end
91
+
92
+ def inspect
93
+ "Descriptor - (not the message class) #{name}"
94
+ end
95
+
96
+ # @return [FileDescriptor]
97
+ def file_descriptor
98
+ wrap(@__schema.file)
99
+ end
100
+
101
+ # Yields each field, in declaration order
102
+ # @yieldparam field [FieldDescriptor]
103
+ def each
104
+ return enum_for(:each) unless block_given?
105
+ @__schema.fields.each { |f| yield wrap(f) }
106
+ nil
107
+ end
108
+
109
+ # Yields each oneof, synthetic ones (proto3 `optional`) included
110
+ # @yieldparam oneof [OneofDescriptor]
111
+ def each_oneof
112
+ return enum_for(:each_oneof) unless block_given?
113
+ @__schema.oneofs.each { |o| yield wrap(o) }
114
+ nil
115
+ end
116
+
117
+ # @param name [String]
118
+ # @return [FieldDescriptor, nil]
119
+ def lookup(name)
120
+ wrap(@__schema.fields_by_name[name.to_s])
121
+ end
122
+
123
+ # @param name [String]
124
+ # @return [OneofDescriptor, nil]
125
+ def lookup_oneof(name)
126
+ wrap(@__schema.oneofs.find { |o| o.name == name.to_s })
127
+ end
128
+
129
+ # @return [Class] the message class
130
+ def msgclass
131
+ @msgclass ||= @descriptor_pool.__msgclass(@__schema)
132
+ end
133
+
134
+ # @return [Google::Protobuf::MessageOptions] frozen
135
+ def options
136
+ @options ||= options_message(:MessageOptions)
137
+ end
138
+
139
+ # @return [Google::Protobuf::DescriptorProto]
140
+ def to_proto
141
+ @to_proto ||= proto_message(:DescriptorProto, @__schema.to_proto(default_json_names: false))
142
+ end
143
+
144
+ # @api private
145
+ def __msgclass=(klass)
146
+ @msgclass = klass
147
+ end
148
+
149
+ private
150
+
151
+ WRAPPERS = %w[DoubleValue FloatValue Int64Value UInt64Value Int32Value UInt32Value StringValue BytesValue BoolValue]
152
+ .to_h { |n| ["google.protobuf.#{n}", true] }.freeze
153
+ private_constant :WRAPPERS
154
+
155
+ def wrapper?
156
+ WRAPPERS.key?(name)
157
+ end
158
+ end
159
+
160
+ # A field of a message, or an extension
161
+ class FieldDescriptor
162
+ include Internal::Wrapper
163
+
164
+ # Field types as their C types: what RepeatedField and Map compare
165
+ CTYPES = {
166
+ int32: :int32, sint32: :int32, sfixed32: :int32, int64: :int64, sint64: :int64, sfixed64: :int64,
167
+ uint32: :uint32, fixed32: :uint32, uint64: :uint64, fixed64: :uint64, float: :float, double: :double,
168
+ bool: :bool, string: :string, bytes: :bytes, enum: :enum, message: :message, group: :message
169
+ }.freeze
170
+
171
+ # @return [String]
172
+ def name
173
+ @__schema.name
174
+ end
175
+
176
+ # @return [String]
177
+ def json_name
178
+ @__schema.json_name
179
+ end
180
+
181
+ # @return [Integer]
182
+ def number
183
+ @__schema.number
184
+ end
185
+
186
+ # @return [Symbol] :int32, :string, :message, :group and so on; map fields are :message
187
+ def type
188
+ @__schema.type
189
+ end
190
+
191
+ # @return [Symbol] :optional, :required or :repeated
192
+ def label
193
+ if @__schema.repeated? then :repeated
194
+ elsif @__schema.required? then :required
195
+ else :optional
196
+ end
197
+ end
198
+
199
+ # @return [Object, nil] the default as the field's reader gives it; nil for messages
200
+ def default
201
+ return nil if sub_message?
202
+ if repeated?
203
+ Internal::Convert.zero(type, subtype)
204
+ elsif type == :enum
205
+ d = @__schema.default
206
+ d.is_a?(Symbol) ? subtype.__names.fetch(subtype.__numbers.fetch(d)) : d
207
+ else
208
+ @__schema.default
209
+ end
210
+ end
211
+
212
+ # @return [String, nil] the full name of the message or enum type
213
+ def submsg_name
214
+ sub = @__schema.message_type || @__schema.enum_type
215
+ sub&.full_name
216
+ end
217
+
218
+ # @return [Descriptor, EnumDescriptor, nil] for message and enum fields;
219
+ # a map field's is its entry message
220
+ def subtype
221
+ return @subtype if defined?(@subtype)
222
+ @subtype = wrap(@__schema.message_type || @__schema.enum_type)
223
+ end
224
+
225
+ def has_presence?
226
+ @__schema.presence?
227
+ end
228
+
229
+ def is_packed?
230
+ @__schema.packed?
231
+ end
232
+
233
+ def map?
234
+ @__schema.map?
235
+ end
236
+
237
+ def required?
238
+ @__schema.required?
239
+ end
240
+
241
+ def repeated?
242
+ @__schema.repeated?
243
+ end
244
+
245
+ def sub_message?
246
+ type == :message || type == :group
247
+ end
248
+
249
+ def wrapper?
250
+ sub = subtype
251
+ sub.is_a?(Descriptor) && sub.send(:wrapper?)
252
+ end
253
+
254
+ # @param msg [Message]
255
+ # @return [Object] the field's value on the message
256
+ # @raise [TypeError] when the message is not of the field's message type
257
+ def get(msg)
258
+ check_owner(msg, "get")
259
+ msg.__gget(self)
260
+ end
261
+
262
+ # Sets the field, with the checks its writer makes
263
+ def set(msg, value)
264
+ check_owner(msg, "set")
265
+ msg.__gset(self, value)
266
+ nil
267
+ end
268
+
269
+ # @raise [ArgumentError] when the field does not track presence
270
+ def has?(msg)
271
+ check_owner(msg, "has")
272
+ raise ArgumentError, "does not track presence" unless has_presence?
273
+ msg.__ghas?(self)
274
+ end
275
+
276
+ def clear(msg)
277
+ check_owner(msg, "clear")
278
+ msg.__gclear(self)
279
+ nil
280
+ end
281
+
282
+ # @return [Google::Protobuf::FieldOptions] frozen
283
+ def options
284
+ @options ||= options_message(:FieldOptions)
285
+ end
286
+
287
+ # @return [Google::Protobuf::FieldDescriptorProto]
288
+ def to_proto
289
+ @to_proto ||= proto_message(:FieldDescriptorProto, @__schema.to_proto(default_json_names: false))
290
+ end
291
+
292
+ # @api private
293
+ # @return [Protostar::Message::FieldInfo, nil] nil for extensions
294
+ def __info
295
+ return @__info if defined?(@__info)
296
+ @__info = if @__schema.extension?
297
+ nil
298
+ else
299
+ wrap(@__schema.containing_message).msgclass.__by_number[number]
300
+ end
301
+ end
302
+
303
+ # @api private
304
+ def __ctype
305
+ CTYPES.fetch(type)
306
+ end
307
+
308
+ # @api private
309
+ def __extension?
310
+ @__schema.extension?
311
+ end
312
+
313
+ # @api private
314
+ # @return [Descriptor] the message the field belongs to (an extension's extendee)
315
+ def __owner
316
+ @__owner ||= wrap(@__schema.extension? ? @__schema.extendee : @__schema.containing_message)
317
+ end
318
+
319
+ private
320
+
321
+ def check_owner(msg, verb)
322
+ return if msg.class.respond_to?(:descriptor) && msg.class.descriptor.equal?(__owner)
323
+ raise TypeError, "#{verb} method called on wrong message type"
324
+ end
325
+ end
326
+
327
+ # A oneof of a message
328
+ class OneofDescriptor
329
+ include Internal::Wrapper
330
+ include Enumerable
331
+
332
+ def name
333
+ @__schema.name
334
+ end
335
+
336
+ # @yieldparam field [FieldDescriptor]
337
+ def each
338
+ return enum_for(:each) unless block_given?
339
+ @__schema.fields.each { |f| yield wrap(f) }
340
+ nil
341
+ end
342
+
343
+ # @return [Google::Protobuf::OneofOptions] frozen
344
+ def options
345
+ @options ||= options_message(:OneofOptions)
346
+ end
347
+
348
+ # @return [Google::Protobuf::OneofDescriptorProto]
349
+ def to_proto
350
+ @to_proto ||= proto_message(:OneofDescriptorProto, @__schema.to_proto)
351
+ end
352
+ end
353
+
354
+ # An enum type
355
+ class EnumDescriptor
356
+ include Internal::Wrapper
357
+ include Enumerable
358
+
359
+ # @return [String] the full name
360
+ def name
361
+ @__schema.full_name
362
+ end
363
+
364
+ # @return [FileDescriptor]
365
+ def file_descriptor
366
+ wrap(@__schema.file)
367
+ end
368
+
369
+ # @param name [String, Symbol]
370
+ # @return [Integer, nil]
371
+ def lookup_name(name)
372
+ __numbers[name.to_sym]
373
+ end
374
+
375
+ # @param number [Integer]
376
+ # @return [Symbol, nil] the first name declared for the number
377
+ def lookup_value(number)
378
+ __names[number]
379
+ end
380
+
381
+ # Yields every value, aliases included
382
+ # @yieldparam name [Symbol]
383
+ # @yieldparam number [Integer]
384
+ def each
385
+ return enum_for(:each) unless block_given?
386
+ @__schema.values.each { |v| yield v.name.to_sym, v.number }
387
+ nil
388
+ end
389
+
390
+ # @return [false] the gem treats every enum as open, whatever the .proto says
391
+ def is_closed?
392
+ false
393
+ end
394
+
395
+ # @return [Module] the enum module: a constant per value, `lookup`, `resolve`, `descriptor`
396
+ def enummodule
397
+ @enummodule ||= build_module
398
+ end
399
+
400
+ # @return [Google::Protobuf::EnumOptions] frozen
401
+ def options
402
+ @options ||= options_message(:EnumOptions)
403
+ end
404
+
405
+ # @return [Google::Protobuf::EnumDescriptorProto]
406
+ def to_proto
407
+ @to_proto ||= proto_message(:EnumDescriptorProto, @__schema.to_proto)
408
+ end
409
+
410
+ # @api private
411
+ # @return [Hash{Integer => Symbol}] number to its first name
412
+ def __names
413
+ @__names ||= @__schema.values.each_with_object({}) { |v, h| h[v.number] ||= v.name.to_sym }.freeze
414
+ end
415
+
416
+ # @api private
417
+ # @return [Hash{Symbol => Integer}] every name to its number
418
+ def __numbers
419
+ @__numbers ||= @__schema.values.to_h { |v| [v.name.to_sym, v.number] }.freeze
420
+ end
421
+
422
+ private
423
+
424
+ def build_module
425
+ descriptor = self
426
+ mod = Module.new
427
+ mod.instance_variable_set(:@descriptor, descriptor)
428
+ mod.extend(Internal::EnumModule)
429
+ @__schema.values.each do |v|
430
+ const = v.name
431
+ if const.match?(/\A[a-z]/)
432
+ const = const[0].upcase + const[1..]
433
+ elsif !const.match?(/\A[A-Z]/)
434
+ warn("Enum value '#{v.name}' does not start with an uppercase letter as is required for Ruby constants.")
435
+ next
436
+ end
437
+ mod.const_set(const, v.number) unless mod.const_defined?(const, false)
438
+ end
439
+ mod
440
+ end
441
+ end
442
+
443
+ module Internal
444
+ # Extended by every enum module
445
+ # @api private
446
+ module EnumModule
447
+ # @return [EnumDescriptor]
448
+ attr_reader :descriptor
449
+
450
+ # @return [Symbol, nil]
451
+ def lookup(number)
452
+ @descriptor.lookup_value(number)
453
+ end
454
+
455
+ # @return [Integer, nil]
456
+ def resolve(name)
457
+ @descriptor.lookup_name(name)
458
+ end
459
+ end
460
+ end
461
+
462
+ # A service
463
+ class ServiceDescriptor
464
+ include Internal::Wrapper
465
+ include Enumerable
466
+
467
+ # @return [String] the full name
468
+ def name
469
+ @__schema.full_name
470
+ end
471
+
472
+ # @return [FileDescriptor]
473
+ def file_descriptor
474
+ wrap(@__schema.file)
475
+ end
476
+
477
+ # @yieldparam method [MethodDescriptor]
478
+ def each
479
+ return enum_for(:each) unless block_given?
480
+ @__schema.rpcs.each { |m| yield wrap(m) }
481
+ nil
482
+ end
483
+
484
+ # @return [Google::Protobuf::ServiceOptions] frozen
485
+ def options
486
+ @options ||= options_message(:ServiceOptions)
487
+ end
488
+
489
+ # @return [Google::Protobuf::ServiceDescriptorProto]
490
+ def to_proto
491
+ @to_proto ||= proto_message(:ServiceDescriptorProto, @__schema.to_proto)
492
+ end
493
+ end
494
+
495
+ # A method of a service
496
+ class MethodDescriptor
497
+ include Internal::Wrapper
498
+
499
+ def name
500
+ @__schema.name
501
+ end
502
+
503
+ # @return [Descriptor]
504
+ def input_type
505
+ wrap(@__schema.input_type)
506
+ end
507
+
508
+ # @return [Descriptor]
509
+ def output_type
510
+ wrap(@__schema.output_type)
511
+ end
512
+
513
+ def client_streaming
514
+ @__schema.client_streaming?
515
+ end
516
+
517
+ def server_streaming
518
+ @__schema.server_streaming?
519
+ end
520
+
521
+ # @return [Google::Protobuf::MethodOptions] frozen
522
+ def options
523
+ @options ||= options_message(:MethodOptions)
524
+ end
525
+
526
+ # @return [Google::Protobuf::MethodDescriptorProto]
527
+ def to_proto
528
+ @to_proto ||= proto_message(:MethodDescriptorProto, @__schema.to_proto)
529
+ end
530
+ end
531
+
532
+ # A .proto file
533
+ class FileDescriptor
534
+ include Internal::Wrapper
535
+
536
+ def name
537
+ @__schema.name
538
+ end
539
+
540
+ # @return [Google::Protobuf::FileOptions] frozen
541
+ def options
542
+ @options ||= options_message(:FileOptions)
543
+ end
544
+
545
+ # @return [Google::Protobuf::FileDescriptorProto]
546
+ def to_proto
547
+ @to_proto ||= Google::Protobuf::FileDescriptorProto.decode(
548
+ Protostar::Compiler::Emitters::GoogleRuby.serialized(@__schema)
549
+ )
550
+ end
551
+ end
552
+ end
553
+ end
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+ # Generated by the protocol buffer compiler. DO NOT EDIT!
3
+ # source: google/protobuf/duration.proto
4
+
5
+ require 'google/protobuf'
6
+
7
+
8
+ descriptor_data = "\n\x1egoogle/protobuf/duration.proto\x12\x0fgoogle.protobuf\"*\n\x08\x44uration\x12\x0f\n\x07seconds\x18\x01 \x01(\x03\x12\r\n\x05nanos\x18\x02 \x01(\x05\x42\x83\x01\n\x13\x63om.google.protobufB\rDurationProtoP\x01Z1google.golang.org/protobuf/types/known/durationpb\xf8\x01\x01\xa2\x02\x03GPB\xaa\x02\x1eGoogle.Protobuf.WellKnownTypesb\x06proto3"
9
+
10
+ pool = ::Google::Protobuf::DescriptorPool.generated_pool
11
+ pool.add_serialized_file(descriptor_data)
12
+
13
+ module Google
14
+ module Protobuf
15
+ Duration = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("google.protobuf.Duration").msgclass
16
+ end
17
+ end
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+ # Generated by the protocol buffer compiler. DO NOT EDIT!
3
+ # source: google/protobuf/empty.proto
4
+
5
+ require 'google/protobuf'
6
+
7
+
8
+ descriptor_data = "\n\x1bgoogle/protobuf/empty.proto\x12\x0fgoogle.protobuf\"\x07\n\x05\x45mptyB}\n\x13\x63om.google.protobufB\nEmptyProtoP\x01Z.google.golang.org/protobuf/types/known/emptypb\xf8\x01\x01\xa2\x02\x03GPB\xaa\x02\x1eGoogle.Protobuf.WellKnownTypesb\x06proto3"
9
+
10
+ pool = ::Google::Protobuf::DescriptorPool.generated_pool
11
+ pool.add_serialized_file(descriptor_data)
12
+
13
+ module Google
14
+ module Protobuf
15
+ Empty = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("google.protobuf.Empty").msgclass
16
+ end
17
+ end
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+ # Generated by the protocol buffer compiler. DO NOT EDIT!
3
+ # source: google/protobuf/field_mask.proto
4
+
5
+ require 'google/protobuf'
6
+
7
+
8
+ descriptor_data = "\n google/protobuf/field_mask.proto\x12\x0fgoogle.protobuf\"\x1a\n\tFieldMask\x12\r\n\x05paths\x18\x01 \x03(\tB\x85\x01\n\x13\x63om.google.protobufB\x0e\x46ieldMaskProtoP\x01Z2google.golang.org/protobuf/types/known/fieldmaskpb\xf8\x01\x01\xa2\x02\x03GPB\xaa\x02\x1eGoogle.Protobuf.WellKnownTypesb\x06proto3"
9
+
10
+ pool = ::Google::Protobuf::DescriptorPool.generated_pool
11
+ pool.add_serialized_file(descriptor_data)
12
+
13
+ module Google
14
+ module Protobuf
15
+ FieldMask = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("google.protobuf.FieldMask").msgclass
16
+ end
17
+ end