protobuf 2.4.1 → 2.4.2

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.
@@ -35,7 +35,7 @@ module Protobuf
35
35
  raise TagCollisionError, %!{Field number #{tag} has already been used in "#{self.name}" by field "#{fname}".!
36
36
  end
37
37
 
38
- field_definition = Field.build(self, rule, type, fname, tag, options)
38
+ field_definition = ::Protobuf::Field.build(self, rule, type, fname, tag, options)
39
39
  field_name_hash[fname] = tag
40
40
  field_array[tag] = field_definition
41
41
  end
@@ -160,24 +160,15 @@ module Protobuf
160
160
 
161
161
  def each_field_for_serialization
162
162
  all_fields.each do |field|
163
- next unless has_field?(field.name) || field.required?
163
+ next unless _field_must_be_serialized?(field)
164
164
 
165
165
  value = @values[field.name]
166
166
 
167
- if field.repeated?
168
- if !value.nil?
169
- value.compact!
170
- @values[field.name] = nil if value.empty?
171
- end
172
- end
173
-
174
- if has_field?(field.name) || field.required?
175
- if value.present? || [true, false].include?(value)
176
- yield(field, value)
177
- else
178
- # Only way you can get here is if you are required and not present
179
- raise ::Protobuf::SerializationError, "#{field.name} is required on #{field.message_class}"
180
- end
167
+ if value.present? || [true, false].include?(value)
168
+ yield(field, value)
169
+ else
170
+ # Only way you can get here is if you are required and not present
171
+ raise ::Protobuf::SerializationError, "#{field.name} is required on #{field.message_class}"
181
172
  end
182
173
  end
183
174
  end
@@ -347,6 +338,17 @@ module Protobuf
347
338
  object
348
339
  end
349
340
 
341
+ def _field_must_be_serialized?(field)
342
+ return true if field.required?
343
+
344
+ if field.repeated? && has_field?(field.name)
345
+ @values[field.name].compact!
346
+ @values.delete(field.name) if @values[field.name].empty?
347
+ end
348
+
349
+ return has_field?(field.name)
350
+ end
351
+
350
352
  # Encode key and value, and write to +stream+.
351
353
  def write_pair(stream, field, value)
352
354
  key = (field.tag << 3) | field.wire_type
@@ -1,4 +1,4 @@
1
1
  module Protobuf
2
- VERSION = '2.4.1'
2
+ VERSION = '2.4.2'
3
3
  PROTOC_VERSION = '2.4.1'
4
4
  end
@@ -31,6 +31,18 @@ describe Protobuf::Message do
31
31
  }.to raise_error(Protobuf::SerializationError, /required/i)
32
32
  end
33
33
  end
34
+
35
+ context "repeated fields" do
36
+ let(:message) { ::Test::Resource.new(:name => "something") }
37
+ let(:stream) { StringIO.new }
38
+
39
+ it "does not raise an error when repeated fields are []" do
40
+ expect {
41
+ message.repeated_enum = []
42
+ message.serialize_to(stream)
43
+ }.to_not raise_error
44
+ end
45
+ end
34
46
  end
35
47
 
36
48
  describe "boolean predicate methods" do
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: protobuf
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.4.1
4
+ version: 2.4.2
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -499,7 +499,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
499
499
  version: '0'
500
500
  segments:
501
501
  - 0
502
- hash: -3853015087851664003
502
+ hash: -3586960575258099872
503
503
  required_rubygems_version: !ruby/object:Gem::Requirement
504
504
  none: false
505
505
  requirements:
@@ -508,7 +508,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
508
508
  version: '0'
509
509
  segments:
510
510
  - 0
511
- hash: -3853015087851664003
511
+ hash: -3586960575258099872
512
512
  requirements: []
513
513
  rubyforge_project:
514
514
  rubygems_version: 1.8.24