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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 4a2d88c4a85786eaf517ad597ebfb70b91f1569bbef3e6f84dbae3c133faafb5
4
- data.tar.gz: cf7ff4963a35ce8d0cf3c8f67320aa8cbc05387f04c378d1d28b3dac49126978
3
+ metadata.gz: a0644d2a9a19095bc50b2c0eb970b2037dd85cb339e62507bda428c71ef83940
4
+ data.tar.gz: 7791374dff01001a27eb34d66a7e474344e2d97b5c02b49b69bb37d79aa1569b
5
5
  SHA512:
6
- metadata.gz: 40d09f68f221fc5d8793904dad243dbcfc7396c8c6618f09c5cceada2f1507aa20042f6fb27c7fa0871c4bfffd7ed03f8e01ade0e0cf5fb7af95279b20b526b5
7
- data.tar.gz: 4aa8f7c8cb11ad68333d451fae4b1fd85bd9e62a928159491e868ada2be9a30436747a9842f8dffff799026a5480f1da465b915a9fa9dfd50c33a9513a8e98a5
6
+ metadata.gz: c5d8304f1bd3e709594582d227899044c936d287bf406ff8171345d9ed0574a5f683494668ecc08cd432d6fe8c9b6b509650fef5d8d8006080b98ffa4a3ee188
7
+ data.tar.gz: 7e655f51518aae671afb0b9e2c6436a995ce8027ebd00471956f37a4a374439e871a33ce4c26e47af5bd58ba000f8655948213d6a7f06c8160a51e780c955d41
@@ -4,6 +4,7 @@ AllCops:
4
4
  DisplayCopNames: true
5
5
  Exclude:
6
6
  - 'spec/support/protos/*.pb.rb'
7
+ - 'varint_prof.rb'
7
8
 
8
9
  Lint/EndAlignment:
9
10
  AlignWith: keyword
@@ -11,8 +11,6 @@ before_install:
11
11
  - java -Xmx1g -version
12
12
  - javac -J-Xmx1g -version
13
13
  - export JRUBY_OPTS=-J-Xmx1g
14
- # Required for rainbow installation issue, https://github.com/sickill/rainbow/issues/44
15
- - gem update --system
16
14
  - gem update bundler
17
15
  language: ruby
18
16
  rvm:
@@ -20,10 +18,11 @@ rvm:
20
18
  - 2.0.0
21
19
  - 2.1
22
20
  - 2.2
23
- - 2.2.2
24
21
  - 2.3
25
22
  - 2.4
26
- - jruby-9.1.7.0
23
+ - 2.5
24
+ - jruby-9.1.17.0
25
+ - jruby-9.2.5.0
27
26
  - rbx-2
28
27
  env:
29
28
  - PROTOBUF_VERSION=2.6.1
@@ -9,6 +9,20 @@ require 'active_support/core_ext/object/try'
9
9
  require 'active_support/inflector'
10
10
  require 'active_support/json'
11
11
  require 'active_support/notifications'
12
+ # Under MRI, this optimizes proto decoding by around 15% in tests.
13
+ # When unavailable, we fall to pure Ruby.
14
+ # rubocop:disable Lint/HandleExceptions
15
+ begin
16
+ require 'varint/varint'
17
+ rescue LoadError
18
+ end
19
+ # rubocop:enable Lint/HandleExceptions
20
+ # rubocop:disable Lint/HandleExceptions
21
+ begin
22
+ require 'protobuf_java_helpers'
23
+ rescue LoadError
24
+ end
25
+ # rubocop:enable Lint/HandleExceptions
12
26
 
13
27
  # All top-level run time code requires, ordered by necessity
14
28
  require 'protobuf/wire_type'
@@ -50,6 +50,35 @@ module Protobuf
50
50
  end
51
51
 
52
52
  Protobuf::Field::BaseField.module_eval do
53
+ def define_set_method!
54
+ end
55
+
56
+ def set_without_options(message_instance, bytes)
57
+ return message_instance[name] = decode(bytes) unless repeated?
58
+
59
+ if map?
60
+ hash = message_instance[name]
61
+ entry = decode(bytes)
62
+ # decoded value could be nil for an
63
+ # enum value that is not recognized
64
+ hash[entry.key] = entry.value unless entry.value.nil?
65
+ return hash[entry.key]
66
+ end
67
+
68
+ return message_instance[name] << decode(bytes) unless packed?
69
+
70
+ array = message_instance[name]
71
+ stream = StringIO.new(bytes)
72
+
73
+ if wire_type == ::Protobuf::WireType::VARINT
74
+ array << decode(Varint.decode(stream)) until stream.eof?
75
+ elsif wire_type == ::Protobuf::WireType::FIXED64
76
+ array << decode(stream.read(8)) until stream.eof?
77
+ elsif wire_type == ::Protobuf::WireType::FIXED32
78
+ array << decode(stream.read(4)) until stream.eof?
79
+ end
80
+ end
81
+
53
82
  # Sets a MessageField that is known to be an option.
54
83
  # We must allow fields to be set one at a time, as option syntax allows us to
55
84
  # set each field within the option using a separate "option" line.
@@ -72,6 +101,7 @@ module Protobuf
72
101
 
73
102
  set_without_options(message_instance, bytes)
74
103
  end
104
+ alias_method :set, :set_with_options
75
105
 
76
106
  def option_set(message_field, subfield, subvalue)
77
107
  return unless yield
@@ -85,9 +115,6 @@ module Protobuf
85
115
  message_field[subfield.tag] = subvalue
86
116
  end
87
117
  end
88
-
89
- alias_method :set_without_options, :set
90
- alias_method :set, :set_with_options
91
118
  end
92
119
  end
93
120
  end
@@ -2,18 +2,7 @@ module Protobuf
2
2
  class Encoder
3
3
  def self.encode(message, stream)
4
4
  message.each_field_for_serialization do |field, value|
5
- if field.repeated?
6
- if field.packed?
7
- packed_value = value.map { |val| field.encode(val) }.join
8
- stream << "#{field.tag_encoded}#{::Protobuf::Field::VarintField.encode(packed_value.size)}#{packed_value}"
9
- else
10
- value.each do |val|
11
- field.encode_to_stream(val, stream)
12
- end
13
- end
14
- else
15
- field.encode_to_stream(value, stream)
16
- end
5
+ field.encode_to_stream(value, stream)
17
6
  end
18
7
 
19
8
  stream
@@ -58,6 +58,7 @@ module Protobuf
58
58
  # to be incorrect; reset them
59
59
  @mapped_enums = @values = nil
60
60
  const_set(name, enum)
61
+ mapped_enums
61
62
  end
62
63
 
63
64
  # Internal: A mapping of enum number -> enums defined
@@ -132,6 +133,10 @@ module Protobuf
132
133
  tag && (mapped_enums[tag.to_i] || []).first
133
134
  end
134
135
 
136
+ def self.enum_for_tag_integer(tag)
137
+ (@mapped_enums[tag] || []).first
138
+ end
139
+
135
140
  # Public: Get an Enum by a variety of type-checking mechanisms.
136
141
  #
137
142
  # candidate - An Enum, Numeric, String, or Symbol object.
@@ -153,7 +158,7 @@ module Protobuf
153
158
  # Returns an Enum object or nil.
154
159
  #
155
160
  def self.fetch(candidate)
156
- return enum_for_tag(candidate) if candidate.is_a?(::Integer)
161
+ return enum_for_tag_integer(candidate) if candidate.is_a?(::Integer)
157
162
 
158
163
  case candidate
159
164
  when self
@@ -308,10 +313,6 @@ module Protobuf
308
313
  "\#<Protobuf::Enum(#{parent_class})::#{name}=#{tag}>"
309
314
  end
310
315
 
311
- def to_i
312
- tag
313
- end
314
-
315
316
  def to_int
316
317
  tag.to_int
317
318
  end
@@ -352,12 +353,13 @@ module Protobuf
352
353
  end
353
354
  end
354
355
 
355
- ::Protobuf.deprecator.define_deprecated_methods(self, :value => :to_i)
356
-
357
356
  ##
358
357
  # Instance Aliases
359
358
  #
360
- alias :to_hash_value to_i
361
- alias :to_json_hash_value to_i
359
+ alias :to_i tag
360
+ alias :to_hash_value tag
361
+ alias :to_json_hash_value tag
362
+
363
+ ::Protobuf.deprecator.define_deprecated_methods(self, :value => :to_i)
362
364
  end
363
365
  end
@@ -1,6 +1,7 @@
1
1
  require 'active_support/core_ext/hash/slice'
2
2
  require 'protobuf/field/field_array'
3
3
  require 'protobuf/field/field_hash'
4
+ require 'protobuf/field/base_field_object_definitions'
4
5
 
5
6
  module Protobuf
6
7
  module Field
@@ -11,7 +12,7 @@ module Protobuf
11
12
  ##
12
13
  # Constants
13
14
  #
14
-
15
+ OBJECT_MODULE = ::Protobuf::Field::BaseFieldObjectDefinitions
15
16
  PACKED_TYPES = [
16
17
  ::Protobuf::WireType::VARINT,
17
18
  ::Protobuf::WireType::FIXED32,
@@ -21,7 +22,7 @@ module Protobuf
21
22
  ##
22
23
  # Attributes
23
24
  #
24
- attr_reader :message_class, :name, :fully_qualified_name, :options, :rule, :tag, :type_class
25
+ attr_reader :default_value, :message_class, :name, :fully_qualified_name, :options, :rule, :tag, :type_class
25
26
 
26
27
  ##
27
28
  # Class Methods
@@ -58,7 +59,27 @@ module Protobuf
58
59
 
59
60
  validate_packed_field if packed?
60
61
  define_accessor(simple_name, fully_qualified_name) if simple_name
61
- tag_encoded
62
+ set_repeated_message!
63
+ set_map!
64
+ @value_from_values = nil
65
+ @value_from_values_for_serialization = nil
66
+ @field_predicate = nil
67
+ @field_and_present_predicate = nil
68
+ @set_field = nil
69
+ @set_method = nil
70
+ @to_message_hash = nil
71
+ @to_message_hash_string_keys = nil
72
+ @encode_to_stream = nil
73
+
74
+ define_value_from_values!
75
+ define_value_from_values_for_serialization!
76
+ define_field_predicate!
77
+ define_field_and_present_predicate!
78
+ define_set_field!
79
+ define_set_method!
80
+ define_to_message_hash!
81
+ define_encode_to_stream!
82
+ set_default_value!
62
83
  end
63
84
 
64
85
  ##
@@ -81,7 +102,7 @@ module Protobuf
81
102
  options[:default]
82
103
  end
83
104
 
84
- def default_value
105
+ def set_default_value!
85
106
  @default_value ||= if optional? || required?
86
107
  typed_default_value
87
108
  elsif map?
@@ -93,6 +114,122 @@ module Protobuf
93
114
  end
94
115
  end
95
116
 
117
+ def define_encode_to_stream!
118
+ @encode_to_stream = if repeated? && packed?
119
+ OBJECT_MODULE::RepeatedPackedEncodeToStream.new(self)
120
+ elsif repeated?
121
+ OBJECT_MODULE::RepeatedNotPackedEncodeToStream.new(self)
122
+ elsif message? || type_class == ::Protobuf::Field::BytesField
123
+ OBJECT_MODULE::BytesEncodeToStream.new(self)
124
+ elsif type_class == ::Protobuf::Field::StringField
125
+ OBJECT_MODULE::StringEncodeToStream.new(self)
126
+ else
127
+ OBJECT_MODULE::BaseEncodeToStream.new(self)
128
+ end
129
+ end
130
+
131
+ def encode_to_stream(value, stream)
132
+ @encode_to_stream.call(value, stream)
133
+ end
134
+
135
+ def define_field_predicate!
136
+ @field_predicate = if repeated?
137
+ OBJECT_MODULE::RepeatedFieldPredicate.new(self)
138
+ else
139
+ OBJECT_MODULE::BaseFieldPredicate.new(self)
140
+ end
141
+ end
142
+
143
+ def field?(values)
144
+ @field_predicate.call(values)
145
+ end
146
+
147
+ def define_field_and_present_predicate!
148
+ @field_and_present_predicate = if type_class == ::Protobuf::Field::BoolField # boolean present check
149
+ OBJECT_MODULE::BoolFieldAndPresentPredicate.new(self)
150
+ else
151
+ OBJECT_MODULE::BaseFieldAndPresentPredicate.new(self)
152
+ end
153
+ end
154
+
155
+ def field_and_present?(values)
156
+ @field_and_present_predicate.call(values)
157
+ end
158
+
159
+ def define_value_from_values!
160
+ @value_from_values = if map?
161
+ OBJECT_MODULE::MapValueFromValues.new(self)
162
+ elsif repeated?
163
+ OBJECT_MODULE::RepeatedFieldValueFromValues.new(self)
164
+ elsif type_class == ::Protobuf::Field::BoolField # boolean present check
165
+ OBJECT_MODULE::BoolFieldValueFromValues.new(self)
166
+ else
167
+ OBJECT_MODULE::BaseFieldValueFromValues.new(self)
168
+ end
169
+ end
170
+
171
+ def value_from_values(values)
172
+ @value_from_values.call(values)
173
+ end
174
+
175
+ def define_value_from_values_for_serialization!
176
+ @value_from_values_for_serialization = if map?
177
+ OBJECT_MODULE::MapValueFromValuesForSerialization.new(self)
178
+ elsif repeated?
179
+ OBJECT_MODULE::RepeatedFieldValueFromValuesForSerialization.new(self)
180
+ elsif type_class == ::Protobuf::Field::BoolField # boolean present check
181
+ OBJECT_MODULE::BoolFieldValueFromValuesForSerialization.new(self)
182
+ else
183
+ OBJECT_MODULE::BaseFieldValueFromValuesForSerialization.new(self)
184
+ end
185
+ end
186
+
187
+ def value_from_values_for_serialization(values)
188
+ @value_from_values_for_serialization.call(values)
189
+ end
190
+
191
+ def define_set_field!
192
+ @set_field = if map? && required?
193
+ OBJECT_MODULE::RequiredMapSetField.new(self)
194
+ elsif repeated? && required?
195
+ OBJECT_MODULE::RequiredRepeatedSetField.new(self)
196
+ elsif type_class == ::Protobuf::Field::StringField && required?
197
+ OBJECT_MODULE::RequiredStringSetField.new(self)
198
+ elsif required?
199
+ OBJECT_MODULE::RequiredBaseSetField.new(self)
200
+ elsif map?
201
+ OBJECT_MODULE::MapSetField.new(self)
202
+ elsif repeated?
203
+ OBJECT_MODULE::RepeatedSetField.new(self)
204
+ elsif type_class == ::Protobuf::Field::StringField
205
+ OBJECT_MODULE::StringSetField.new(self)
206
+ else
207
+ OBJECT_MODULE::BaseSetField.new(self)
208
+ end
209
+ end
210
+
211
+ def set_field(values, value, ignore_nil_for_repeated, message_instance)
212
+ @set_field.call(values, value, ignore_nil_for_repeated, message_instance)
213
+ end
214
+
215
+ def define_to_message_hash!
216
+ if message? || enum? || repeated? || map?
217
+ @to_message_hash = OBJECT_MODULE::ToHashValueToMessageHash.new(self)
218
+ @to_message_hash_string_keys = OBJECT_MODULE::ToHashValueToMessageHashWithStringKey.new(self)
219
+ else
220
+ @to_message_hash = OBJECT_MODULE::BaseToMessageHash.new(self)
221
+ @to_message_hash_string_keys = OBJECT_MODULE::BaseToMessageHashWithStringKey.new(self)
222
+ end
223
+ end
224
+
225
+ def to_message_hash(values, result)
226
+ @to_message_hash.call(values, result)
227
+ end
228
+
229
+ def to_message_hash_with_string_key(values, result)
230
+ @to_message_hash_string_keys.call(values, result)
231
+ end
232
+
96
233
  def deprecated?
97
234
  @deprecated
98
235
  end
@@ -101,10 +238,6 @@ module Protobuf
101
238
  fail NotImplementedError, "#{self.class.name}##{__method__}"
102
239
  end
103
240
 
104
- def encode_to_stream(value, stream)
105
- stream << tag_encoded << encode(value)
106
- end
107
-
108
241
  def extension?
109
242
  @extension
110
243
  end
@@ -117,8 +250,13 @@ module Protobuf
117
250
  false
118
251
  end
119
252
 
253
+ def set_map!
254
+ set_repeated_message!
255
+ @is_map = repeated_message? && type_class.get_option!(:map_entry)
256
+ end
257
+
120
258
  def map?
121
- @is_map ||= repeated_message? && type_class.get_option(:map_entry)
259
+ @is_map
122
260
  end
123
261
 
124
262
  def optional?
@@ -133,39 +271,32 @@ module Protobuf
133
271
  @repeated
134
272
  end
135
273
 
274
+ def set_repeated_message!
275
+ @repeated_message = repeated? && message?
276
+ end
277
+
136
278
  def repeated_message?
137
- repeated? && message?
279
+ @repeated_message
138
280
  end
139
281
 
140
282
  def required?
141
283
  @required
142
284
  end
143
285
 
144
- # FIXME: need to cleanup (rename) this warthog of a method.
145
- def set(message_instance, bytes)
146
- return message_instance[name] = decode(bytes) unless repeated?
147
-
148
- if map?
149
- hash = message_instance[name]
150
- entry = decode(bytes)
151
- # decoded value could be nil for an
152
- # enum value that is not recognized
153
- hash[entry.key] = entry.value unless entry.value.nil?
154
- return hash[entry.key]
155
- end
156
-
157
- return message_instance[name] << decode(bytes) unless packed?
158
-
159
- array = message_instance[name]
160
- stream = StringIO.new(bytes)
286
+ def define_set_method!
287
+ @set_method = if map?
288
+ OBJECT_MODULE::MapSetMethod.new(self)
289
+ elsif repeated? && packed?
290
+ OBJECT_MODULE::RepeatedPackedSetMethod.new(self)
291
+ elsif repeated?
292
+ OBJECT_MODULE::RepeatedNotPackedSetMethod.new(self)
293
+ else
294
+ OBJECT_MODULE::BaseSetMethod.new(self)
295
+ end
296
+ end
161
297
 
162
- if wire_type == ::Protobuf::WireType::VARINT
163
- array << decode(Varint.decode(stream)) until stream.eof?
164
- elsif wire_type == ::Protobuf::WireType::FIXED64
165
- array << decode(stream.read(8)) until stream.eof?
166
- elsif wire_type == ::Protobuf::WireType::FIXED32
167
- array << decode(stream.read(4)) until stream.eof?
168
- end
298
+ def set(message_instance, bytes)
299
+ @set_method.call(message_instance, bytes)
169
300
  end
170
301
 
171
302
  def tag_encoded
@@ -192,6 +323,18 @@ module Protobuf
192
323
 
193
324
  def fully_qualified_name_only!
194
325
  @name = @fully_qualified_name
326
+
327
+ ##
328
+ # Recreate all of the meta methods as they may have used the original `name` value
329
+ #
330
+ define_value_from_values!
331
+ define_value_from_values_for_serialization!
332
+ define_field_predicate!
333
+ define_field_and_present_predicate!
334
+ define_set_field!
335
+ define_set_method!
336
+ define_to_message_hash!
337
+ define_encode_to_stream!
195
338
  end
196
339
 
197
340
  private