protobuf 3.8.5 → 3.9.0.pre
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/.rubocop.yml +1 -0
- data/.travis.yml +3 -4
- data/lib/protobuf.rb +14 -0
- data/lib/protobuf/code_generator.rb +30 -3
- data/lib/protobuf/encoder.rb +1 -12
- data/lib/protobuf/enum.rb +11 -9
- data/lib/protobuf/field/base_field.rb +177 -34
- data/lib/protobuf/field/base_field_object_definitions.rb +504 -0
- data/lib/protobuf/field/bool_field.rb +13 -8
- data/lib/protobuf/field/bytes_field.rb +8 -19
- data/lib/protobuf/field/enum_field.rb +9 -11
- data/lib/protobuf/field/int64_field.rb +13 -0
- data/lib/protobuf/field/message_field.rb +1 -1
- data/lib/protobuf/field/string_field.rb +20 -15
- data/lib/protobuf/field/varint_field.rb +13 -26
- data/lib/protobuf/message.rb +44 -99
- data/lib/protobuf/message/fields.rb +16 -0
- data/lib/protobuf/message/serialization.rb +1 -1
- data/lib/protobuf/varint.rb +11 -0
- data/lib/protobuf/varint_pure.rb +18 -0
- data/lib/protobuf/version.rb +1 -1
- data/profile.html +5103 -0
- data/protobuf.gemspec +3 -1
- data/varint_prof.rb +82 -0
- metadata +52 -151
@@ -0,0 +1,504 @@
|
|
1
|
+
module Protobuf
|
2
|
+
module Field
|
3
|
+
module BaseFieldObjectDefinitions
|
4
|
+
|
5
|
+
class ToHashValueToMessageHashWithStringKey
|
6
|
+
def initialize(selph)
|
7
|
+
@selph = selph
|
8
|
+
@name = selph.name.to_s
|
9
|
+
end
|
10
|
+
|
11
|
+
def call(values, result)
|
12
|
+
result[@name] = @selph.value_from_values(values).to_hash_value
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
class BaseToMessageHashWithStringKey
|
17
|
+
def initialize(selph)
|
18
|
+
@selph = selph
|
19
|
+
@name = selph.name.to_s
|
20
|
+
end
|
21
|
+
|
22
|
+
def call(values, result)
|
23
|
+
result[@name] = @selph.value_from_values(values)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
class ToHashValueToMessageHash
|
28
|
+
def initialize(selph)
|
29
|
+
@selph = selph
|
30
|
+
@name = selph.name.to_sym
|
31
|
+
end
|
32
|
+
|
33
|
+
def call(values, result)
|
34
|
+
result[@name] = @selph.value_from_values(values).to_hash_value
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
class BaseToMessageHash
|
39
|
+
def initialize(selph)
|
40
|
+
@selph = selph
|
41
|
+
@name = selph.name.to_sym
|
42
|
+
end
|
43
|
+
|
44
|
+
def call(values, result)
|
45
|
+
result[@name] = @selph.value_from_values(values)
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
class RepeatedPackedEncodeToStream
|
50
|
+
def initialize(selph)
|
51
|
+
@selph = selph
|
52
|
+
@tag_encoded = selph.tag_encoded
|
53
|
+
end
|
54
|
+
|
55
|
+
def call(value, stream)
|
56
|
+
packed_value = value.map { |val| @selph.encode(val) }.join
|
57
|
+
stream << @tag_encoded << "#{::Protobuf::Field::VarintField.encode(packed_value.size)}#{packed_value}"
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
class BytesEncodeToStream
|
62
|
+
def initialize(selph)
|
63
|
+
@selph = selph
|
64
|
+
@tag_encoded = selph.tag_encoded
|
65
|
+
end
|
66
|
+
|
67
|
+
def call(value, stream)
|
68
|
+
value = value.encode if value.is_a?(::Protobuf::Message)
|
69
|
+
byte_size = ::Protobuf::Field::VarintField.encode(value.bytesize)
|
70
|
+
|
71
|
+
stream << @tag_encoded << byte_size << value
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
class StringEncodeToStream
|
76
|
+
def initialize(selph)
|
77
|
+
@selph = selph
|
78
|
+
@tag_encoded = selph.tag_encoded
|
79
|
+
end
|
80
|
+
|
81
|
+
def call(value, stream)
|
82
|
+
new_value = "" + value
|
83
|
+
if new_value.encoding != ::Protobuf::Field::StringField::ENCODING
|
84
|
+
new_value.encode!(::Protobuf::Field::StringField::ENCODING, :invalid => :replace, :undef => :replace, :replace => "")
|
85
|
+
end
|
86
|
+
|
87
|
+
stream << @tag_encoded << ::Protobuf::Field::VarintField.encode(new_value.bytesize) << new_value
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
class BaseEncodeToStream
|
92
|
+
def initialize(selph)
|
93
|
+
@selph = selph
|
94
|
+
@tag_encoded = selph.tag_encoded
|
95
|
+
end
|
96
|
+
|
97
|
+
def call(value, stream)
|
98
|
+
stream << @tag_encoded << @selph.encode(value)
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
102
|
+
class RepeatedNotPackedEncodeToStream
|
103
|
+
def initialize(selph)
|
104
|
+
@selph = selph
|
105
|
+
@tag_encoded = selph.tag_encoded
|
106
|
+
end
|
107
|
+
|
108
|
+
def call(value, stream)
|
109
|
+
value.each do |val|
|
110
|
+
stream << @tag_encoded << @selph.encode(val)
|
111
|
+
end
|
112
|
+
end
|
113
|
+
end
|
114
|
+
|
115
|
+
class BaseSetMethod
|
116
|
+
def initialize(selph)
|
117
|
+
@selph = selph
|
118
|
+
@name = selph.name
|
119
|
+
end
|
120
|
+
|
121
|
+
def call(message_instance, bytes)
|
122
|
+
message_instance.set_field(@name, @selph.decode(bytes), true, @selph)
|
123
|
+
end
|
124
|
+
end
|
125
|
+
|
126
|
+
class MapSetMethod
|
127
|
+
def initialize(selph)
|
128
|
+
@selph = selph
|
129
|
+
@name = selph.name
|
130
|
+
end
|
131
|
+
|
132
|
+
def call(message_instance, bytes)
|
133
|
+
hash = message_instance[@name]
|
134
|
+
entry = @selph.decode(bytes)
|
135
|
+
# decoded value could be nil for an
|
136
|
+
# enum value that is not recognized
|
137
|
+
hash[entry.key] = entry.value unless entry.value.nil?
|
138
|
+
hash[entry.key]
|
139
|
+
end
|
140
|
+
end
|
141
|
+
|
142
|
+
class RepeatedNotPackedSetMethod
|
143
|
+
def initialize(selph)
|
144
|
+
@selph = selph
|
145
|
+
@name = selph.name
|
146
|
+
end
|
147
|
+
|
148
|
+
def call(message_instance, bytes)
|
149
|
+
message_instance[@name] << @selph.decode(bytes)
|
150
|
+
end
|
151
|
+
end
|
152
|
+
|
153
|
+
class RepeatedPackedSetMethod
|
154
|
+
def initialize(selph)
|
155
|
+
@selph = selph
|
156
|
+
@name = selph.name
|
157
|
+
@wire_type = selph.wire_type
|
158
|
+
end
|
159
|
+
|
160
|
+
def call(message_instance, bytes)
|
161
|
+
array = message_instance[@name]
|
162
|
+
stream = ::StringIO.new(bytes)
|
163
|
+
|
164
|
+
if @wire_type == ::Protobuf::WireType::VARINT
|
165
|
+
array << @selph.decode(Varint.decode(stream)) until stream.eof?
|
166
|
+
elsif @wire_type == ::Protobuf::WireType::FIXED64
|
167
|
+
array << @selph.decode(stream.read(8)) until stream.eof?
|
168
|
+
elsif @wire_type == ::Protobuf::WireType::FIXED32
|
169
|
+
array << @selph.decode(stream.read(4)) until stream.eof?
|
170
|
+
end
|
171
|
+
end
|
172
|
+
end
|
173
|
+
|
174
|
+
class RequiredMapSetField
|
175
|
+
def initialize(selph)
|
176
|
+
@selph = selph
|
177
|
+
@tag = selph.tag
|
178
|
+
@fully_qualified_name = selph.fully_qualified_name
|
179
|
+
end
|
180
|
+
|
181
|
+
def call(values, value, _ignore_nil_for_repeated, message_instance)
|
182
|
+
unless value.is_a?(Hash)
|
183
|
+
fail TypeError, <<-TYPE_ERROR
|
184
|
+
Expected map value
|
185
|
+
Got '#{value.class}' for map protobuf field #{@selph.name}
|
186
|
+
TYPE_ERROR
|
187
|
+
end
|
188
|
+
|
189
|
+
if value.empty?
|
190
|
+
values.delete(@fully_qualified_name)
|
191
|
+
message_instance._protobuf_message_unset_required_field_tags << @tag
|
192
|
+
else
|
193
|
+
message_instance._protobuf_message_unset_required_field_tags.delete(@tag)
|
194
|
+
values[@fully_qualified_name] ||= ::Protobuf::Field::FieldHash.new(@selph)
|
195
|
+
values[@fully_qualified_name].replace(value)
|
196
|
+
end
|
197
|
+
end
|
198
|
+
end
|
199
|
+
|
200
|
+
class MapSetField
|
201
|
+
def initialize(selph)
|
202
|
+
@selph = selph
|
203
|
+
@tag = selph.tag
|
204
|
+
@fully_qualified_name = selph.fully_qualified_name
|
205
|
+
end
|
206
|
+
|
207
|
+
def call(values, value, _ignore_nil_for_repeated, _message_instance)
|
208
|
+
unless value.is_a?(Hash)
|
209
|
+
fail TypeError, <<-TYPE_ERROR
|
210
|
+
Expected map value
|
211
|
+
Got '#{value.class}' for map protobuf field #{@selph.name}
|
212
|
+
TYPE_ERROR
|
213
|
+
end
|
214
|
+
|
215
|
+
if value.empty?
|
216
|
+
values.delete(@fully_qualified_name)
|
217
|
+
else
|
218
|
+
values[@fully_qualified_name] ||= ::Protobuf::Field::FieldHash.new(@selph)
|
219
|
+
values[@fully_qualified_name].replace(value)
|
220
|
+
end
|
221
|
+
end
|
222
|
+
end
|
223
|
+
|
224
|
+
class RequiredRepeatedSetField
|
225
|
+
def initialize(selph)
|
226
|
+
@selph = selph
|
227
|
+
@tag = selph.tag
|
228
|
+
@fully_qualified_name = selph.fully_qualified_name
|
229
|
+
end
|
230
|
+
|
231
|
+
def call(values, value, ignore_nil_for_repeated, message_instance)
|
232
|
+
if value.nil? && ignore_nil_for_repeated
|
233
|
+
::Protobuf.deprecator.deprecation_warning("['#{@fully_qualified_name}']=nil", "use an empty array instead of nil")
|
234
|
+
return
|
235
|
+
end
|
236
|
+
|
237
|
+
unless value.is_a?(Array)
|
238
|
+
fail TypeError, <<-TYPE_ERROR
|
239
|
+
Expected repeated value of type '#{@selph.type_class}'
|
240
|
+
Got '#{value.class}' for repeated protobuf field #{@selph.name}
|
241
|
+
TYPE_ERROR
|
242
|
+
end
|
243
|
+
|
244
|
+
value = value.compact
|
245
|
+
|
246
|
+
if value.empty?
|
247
|
+
values.delete(@fully_qualified_name)
|
248
|
+
message_instance._protobuf_message_unset_required_field_tags << @tag
|
249
|
+
else
|
250
|
+
message_instance._protobuf_message_unset_required_field_tags.delete(@tag)
|
251
|
+
values[@fully_qualified_name] ||= ::Protobuf::Field::FieldArray.new(@selph)
|
252
|
+
values[@fully_qualified_name].replace(value)
|
253
|
+
end
|
254
|
+
end
|
255
|
+
end
|
256
|
+
|
257
|
+
class RepeatedSetField
|
258
|
+
def initialize(selph)
|
259
|
+
@selph = selph
|
260
|
+
@tag = selph.tag
|
261
|
+
@fully_qualified_name = selph.fully_qualified_name
|
262
|
+
end
|
263
|
+
|
264
|
+
def call(values, value, ignore_nil_for_repeated, _message_instance)
|
265
|
+
if value.nil? && ignore_nil_for_repeated
|
266
|
+
::Protobuf.deprecator.deprecation_warning("['#{@fully_qualified_name}']=nil", "use an empty array instead of nil")
|
267
|
+
return
|
268
|
+
end
|
269
|
+
|
270
|
+
unless value.is_a?(Array)
|
271
|
+
fail TypeError, <<-TYPE_ERROR
|
272
|
+
Expected repeated value of type '#{@selph.type_class}'
|
273
|
+
Got '#{value.class}' for repeated protobuf field #{@selph.name}
|
274
|
+
TYPE_ERROR
|
275
|
+
end
|
276
|
+
|
277
|
+
value = value.compact
|
278
|
+
|
279
|
+
if value.empty?
|
280
|
+
values.delete(@fully_qualified_name)
|
281
|
+
else
|
282
|
+
values[@fully_qualified_name] ||= ::Protobuf::Field::FieldArray.new(@selph)
|
283
|
+
values[@fully_qualified_name].replace(value)
|
284
|
+
end
|
285
|
+
end
|
286
|
+
end
|
287
|
+
|
288
|
+
class RequiredStringSetField
|
289
|
+
def initialize(selph)
|
290
|
+
@selph = selph
|
291
|
+
@tag = selph.tag
|
292
|
+
@fully_qualified_name = selph.fully_qualified_name
|
293
|
+
end
|
294
|
+
|
295
|
+
def call(values, value, _ignore_nil_for_repeated, message_instance)
|
296
|
+
if value
|
297
|
+
message_instance._protobuf_message_unset_required_field_tags.delete(@tag)
|
298
|
+
values[@fully_qualified_name] = if value.is_a?(String)
|
299
|
+
value
|
300
|
+
else
|
301
|
+
@selph.coerce!(value)
|
302
|
+
end
|
303
|
+
else
|
304
|
+
values.delete(@fully_qualified_name)
|
305
|
+
message_instance._protobuf_message_unset_required_field_tags << @tag
|
306
|
+
end
|
307
|
+
end
|
308
|
+
end
|
309
|
+
|
310
|
+
class StringSetField
|
311
|
+
def initialize(selph)
|
312
|
+
@selph = selph
|
313
|
+
@tag = selph.tag
|
314
|
+
@fully_qualified_name = selph.fully_qualified_name
|
315
|
+
end
|
316
|
+
|
317
|
+
def call(values, value, _ignore_nil_for_repeated, _message_instance)
|
318
|
+
if value
|
319
|
+
values[@fully_qualified_name] = if value.is_a?(String)
|
320
|
+
value
|
321
|
+
else
|
322
|
+
@selph.coerce!(value)
|
323
|
+
end
|
324
|
+
else
|
325
|
+
values.delete(@fully_qualified_name)
|
326
|
+
end
|
327
|
+
end
|
328
|
+
end
|
329
|
+
|
330
|
+
class RequiredBaseSetField
|
331
|
+
def initialize(selph)
|
332
|
+
@selph = selph
|
333
|
+
@tag = selph.tag
|
334
|
+
@fully_qualified_name = selph.fully_qualified_name
|
335
|
+
end
|
336
|
+
|
337
|
+
def call(values, value, _ignore_nil_for_repeated, message_instance)
|
338
|
+
if value.nil?
|
339
|
+
values.delete(@fully_qualified_name)
|
340
|
+
message_instance._protobuf_message_unset_required_field_tags << @tag
|
341
|
+
else
|
342
|
+
message_instance._protobuf_message_unset_required_field_tags.delete(@tag)
|
343
|
+
values[@fully_qualified_name] = @selph.coerce!(value)
|
344
|
+
end
|
345
|
+
end
|
346
|
+
end
|
347
|
+
|
348
|
+
class BaseSetField
|
349
|
+
def initialize(selph)
|
350
|
+
@selph = selph
|
351
|
+
@tag = selph.tag
|
352
|
+
@fully_qualified_name = selph.fully_qualified_name
|
353
|
+
end
|
354
|
+
|
355
|
+
def call(values, value, _ignore_nil_for_repeated, _message_instance)
|
356
|
+
if value.nil?
|
357
|
+
values.delete(@fully_qualified_name)
|
358
|
+
else
|
359
|
+
values[@fully_qualified_name] = @selph.coerce!(value)
|
360
|
+
end
|
361
|
+
end
|
362
|
+
end
|
363
|
+
|
364
|
+
class BaseFieldAndPresentPredicate
|
365
|
+
def initialize(selph)
|
366
|
+
@fully_qualified_name = selph.fully_qualified_name
|
367
|
+
end
|
368
|
+
|
369
|
+
def call(values)
|
370
|
+
values[@fully_qualified_name].present?
|
371
|
+
end
|
372
|
+
end
|
373
|
+
|
374
|
+
class BoolFieldAndPresentPredicate
|
375
|
+
BOOL_VALUES = [true, false].freeze
|
376
|
+
|
377
|
+
def initialize(selph)
|
378
|
+
@fully_qualified_name = selph.fully_qualified_name
|
379
|
+
end
|
380
|
+
|
381
|
+
def call(values)
|
382
|
+
BOOL_VALUES.include?(values[@fully_qualified_name])
|
383
|
+
end
|
384
|
+
end
|
385
|
+
|
386
|
+
class BaseFieldPredicate
|
387
|
+
def initialize(selph)
|
388
|
+
@fully_qualified_name = selph.fully_qualified_name
|
389
|
+
end
|
390
|
+
|
391
|
+
def call(values)
|
392
|
+
values.key?(@fully_qualified_name)
|
393
|
+
end
|
394
|
+
end
|
395
|
+
|
396
|
+
class RepeatedFieldPredicate
|
397
|
+
def initialize(selph)
|
398
|
+
@fully_qualified_name = selph.fully_qualified_name
|
399
|
+
end
|
400
|
+
|
401
|
+
def call(values)
|
402
|
+
values.key?(@fully_qualified_name) &&
|
403
|
+
values[@fully_qualified_name].present?
|
404
|
+
end
|
405
|
+
end
|
406
|
+
|
407
|
+
class BoolFieldValueFromValues
|
408
|
+
def initialize(selph)
|
409
|
+
@selph = selph
|
410
|
+
@fully_qualified_name = selph.fully_qualified_name
|
411
|
+
end
|
412
|
+
|
413
|
+
def call(values)
|
414
|
+
values.fetch(@fully_qualified_name) { @selph.default_value }
|
415
|
+
end
|
416
|
+
end
|
417
|
+
|
418
|
+
class BoolFieldValueFromValuesForSerialization
|
419
|
+
def initialize(selph)
|
420
|
+
@selph = selph
|
421
|
+
@fully_qualified_name = selph.fully_qualified_name
|
422
|
+
end
|
423
|
+
|
424
|
+
def call(values)
|
425
|
+
values.fetch(@fully_qualified_name) { @selph.default_value }
|
426
|
+
end
|
427
|
+
end
|
428
|
+
|
429
|
+
class BaseFieldValueFromValues
|
430
|
+
def initialize(selph)
|
431
|
+
@selph = selph
|
432
|
+
@fully_qualified_name = selph.fully_qualified_name
|
433
|
+
end
|
434
|
+
|
435
|
+
def call(values)
|
436
|
+
values[@fully_qualified_name] || @selph.default_value
|
437
|
+
end
|
438
|
+
end
|
439
|
+
|
440
|
+
class BaseFieldValueFromValuesForSerialization
|
441
|
+
def initialize(selph)
|
442
|
+
@selph = selph
|
443
|
+
@fully_qualified_name = selph.fully_qualified_name
|
444
|
+
end
|
445
|
+
|
446
|
+
def call(values)
|
447
|
+
values[@fully_qualified_name] || @selph.default_value
|
448
|
+
end
|
449
|
+
end
|
450
|
+
|
451
|
+
class MapValueFromValues
|
452
|
+
def initialize(selph)
|
453
|
+
@selph = selph
|
454
|
+
@fully_qualified_name = selph.fully_qualified_name
|
455
|
+
end
|
456
|
+
|
457
|
+
def call(values)
|
458
|
+
values[@fully_qualified_name] ||= ::Protobuf::Field::FieldHash.new(@selph)
|
459
|
+
end
|
460
|
+
end
|
461
|
+
|
462
|
+
class MapValueFromValuesForSerialization
|
463
|
+
def initialize(selph)
|
464
|
+
@selph = selph
|
465
|
+
@fully_qualified_name = selph.fully_qualified_name
|
466
|
+
@type_class = selph.type_class
|
467
|
+
end
|
468
|
+
|
469
|
+
def call(values)
|
470
|
+
value = values[@fully_qualified_name] ||= ::Protobuf::Field::FieldHash.new(@selph)
|
471
|
+
|
472
|
+
array = []
|
473
|
+
value.each do |k, v|
|
474
|
+
array << @type_class.new(:key => k, :value => v)
|
475
|
+
end
|
476
|
+
|
477
|
+
array
|
478
|
+
end
|
479
|
+
end
|
480
|
+
|
481
|
+
class RepeatedFieldValueFromValues
|
482
|
+
def initialize(selph)
|
483
|
+
@selph = selph
|
484
|
+
@fully_qualified_name = selph.fully_qualified_name
|
485
|
+
end
|
486
|
+
|
487
|
+
def call(values)
|
488
|
+
values[@fully_qualified_name] ||= ::Protobuf::Field::FieldArray.new(@selph)
|
489
|
+
end
|
490
|
+
end
|
491
|
+
|
492
|
+
class RepeatedFieldValueFromValuesForSerialization
|
493
|
+
def initialize(selph)
|
494
|
+
@selph = selph
|
495
|
+
@fully_qualified_name = selph.fully_qualified_name
|
496
|
+
end
|
497
|
+
|
498
|
+
def call(values)
|
499
|
+
values[@fully_qualified_name] ||= ::Protobuf::Field::FieldArray.new(@selph)
|
500
|
+
end
|
501
|
+
end
|
502
|
+
end
|
503
|
+
end
|
504
|
+
end
|