protobuf 2.3.2 → 2.4.0

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.
@@ -1,11 +1,8 @@
1
1
  module Protobuf
2
-
3
2
  class Error < StandardError; end
4
-
5
3
  class InvalidWireType < Error; end
6
-
7
4
  class NotInitializedError < Error; end
8
-
9
5
  class TagCollisionError < Error; end
10
-
6
+ class SerializationError < StandardError; end
7
+ class FieldNotDefinedError < StandardError; end
11
8
  end
@@ -40,7 +40,7 @@ module Protobuf
40
40
  @default_value = \
41
41
  case @rule
42
42
  when :repeated then
43
- FieldArray.new(self).freeze
43
+ ::Protobuf::Field::FieldArray.new(self).freeze
44
44
  when :required then
45
45
  nil
46
46
  when :optional then
@@ -67,31 +67,20 @@ module Protobuf
67
67
  @_message = (self.class < ::Protobuf::Field::MessageField)
68
68
  end
69
69
 
70
- def initialized?(message_instance)
71
- value = message_instance.__send__(getter_method_name)
72
- case @rule
73
- when :required then
74
- ! value.nil? && (! kind_of?(MessageField) || value.initialized?)
75
- when :repeated then
76
- value.all? {|msg| ! kind_of?(MessageField) || msg.initialized? }
77
- when :optional then
78
- value.nil? || ! kind_of?(MessageField) || value.initialized?
79
- end
80
- end
81
-
82
70
  # Decode +bytes+ and pass to +message_instance+.
83
71
  def set(message_instance, bytes)
84
72
  if packed?
85
73
  array = message_instance.__send__(getter_method_name)
86
74
  method = \
87
75
  case wire_type
88
- when WireType::FIXED32 then :read_fixed32
89
- when WireType::FIXED64 then :read_fixed64
90
- when WireType::VARINT then :read_varint
76
+ when ::Protobuf::WireType::FIXED32 then :read_fixed32
77
+ when ::Protobuf::WireType::FIXED64 then :read_fixed64
78
+ when ::Protobuf::WireType::VARINT then :read_varint
91
79
  end
92
80
  stream = StringIO.new(bytes)
81
+
93
82
  until stream.eof?
94
- array << decode(Decoder.__send__(method, stream))
83
+ array << decode(::Protobuf::Decoder.__send__(method, stream))
95
84
  end
96
85
  else
97
86
  value = decode(bytes)
@@ -195,8 +184,13 @@ module Protobuf
195
184
  @message_class.class_eval do
196
185
  define_method(field.setter_method_name) do |val|
197
186
  field.warn_if_deprecated
198
- @values[field.name] ||= ::Protobuf::Field::FieldArray.new(field)
199
- @values[field.name].replace(val)
187
+
188
+ if val.nil?
189
+ @values.delete(field.name)
190
+ else
191
+ @values[field.name] ||= ::Protobuf::Field::FieldArray.new(field)
192
+ @values[field.name].replace(val)
193
+ end
200
194
  end
201
195
  end
202
196
  end
@@ -216,6 +210,7 @@ module Protobuf
216
210
  @message_class.class_eval do
217
211
  define_method(field.setter_method_name) do |val|
218
212
  field.warn_if_deprecated
213
+
219
214
  if val.nil?
220
215
  @values.delete(field.name)
221
216
  elsif field.acceptable?(val)
@@ -8,8 +8,7 @@ module Protobuf
8
8
  end
9
9
 
10
10
  def acceptable?(val)
11
- raise TypeError unless [true, false].include?(val)
12
- true
11
+ [true, false].include?(val)
13
12
  end
14
13
 
15
14
  def decode(value)
@@ -12,9 +12,9 @@ module Protobuf
12
12
  def acceptable?(val)
13
13
  if val.nil? || val.is_a?(::Protobuf::Message) || val.instance_of?(String)
14
14
  return true
15
+ else
16
+ raise TypeError, "Cannot set field : #{name} to value : #{val}"
15
17
  end
16
-
17
- raise TypeError, "Cannot set field : #{name} to value : #{val}"
18
18
  end
19
19
 
20
20
  def decode(bytes)
@@ -26,7 +26,6 @@ module Protobuf
26
26
  if value.is_a?(::Protobuf::Message)
27
27
  value = value.serialize_to_string
28
28
  else
29
- value = value.dup
30
29
  value.force_encoding(::Protobuf::Message::STRING_ENCODING) if value.respond_to?(:force_encoding)
31
30
  end
32
31
 
@@ -12,24 +12,24 @@ module Protobuf
12
12
  # Public Instance Methods
13
13
  #
14
14
  def []=(nth, val)
15
- super(nth, normalize(val))
15
+ super(nth, normalize(val)) unless val.nil?
16
16
  end
17
17
 
18
18
  def <<(val)
19
- super(normalize(val))
19
+ super(normalize(val)) unless val.nil?
20
20
  end
21
21
 
22
22
  def push(val)
23
- super(normalize(val))
23
+ super(normalize(val)) unless val.nil?
24
24
  end
25
25
 
26
26
  def unshift(val)
27
- super(normalize(val))
27
+ super(normalize(val)) unless val.nil?
28
28
  end
29
29
 
30
30
  def replace(val)
31
31
  raise TypeError unless val.is_a?(Array)
32
- val = val.map { |v| normalize(v)}
32
+ val = val.map { |v| normalize(v) }
33
33
  super(val)
34
34
  end
35
35
 
@@ -22,9 +22,7 @@ module Protobuf
22
22
  end
23
23
 
24
24
  def acceptable?(val)
25
- raise TypeError, val.class.name unless val.is_a?(Numeric)
26
- raise RangeError if val < min || max < val
27
- true
25
+ (val > min || val < max) rescue false
28
26
  end
29
27
  end
30
28
  end
@@ -1,16 +1,11 @@
1
1
  require 'set'
2
2
  require 'protobuf/field'
3
3
  require 'protobuf/enum'
4
+ require 'protobuf/exceptions'
4
5
  require 'protobuf/message/decoder'
5
- require 'protobuf/message/encoder'
6
6
 
7
7
  module Protobuf
8
8
  class Message
9
- ##
10
- # Error Classes
11
- #
12
- class FieldNotDefinedError < StandardError; end
13
-
14
9
  ##
15
10
  # Constants
16
11
  #
@@ -165,14 +160,16 @@ module Protobuf
165
160
 
166
161
  def each_field_for_serialization
167
162
  all_fields.each do |field|
168
- next unless has_field?(field.name)
163
+ next unless has_field_or_required_field?(field)
169
164
 
170
165
  value = __send__(field.name)
166
+ value.compact! if field.repeated?
171
167
 
172
168
  if value.present? || [true, false].include?(value)
173
169
  yield(field, value)
174
170
  else
175
- raise "#{field.name} is required on #{field.message_class}" if field.required?
171
+ # Only way you can get here is if you are required and not present
172
+ raise ::Protobuf::SerializationError, "#{field.name} is required on #{field.message_class}"
176
173
  end
177
174
  end
178
175
  end
@@ -208,22 +205,18 @@ module Protobuf
208
205
  @values.has_key?(name)
209
206
  end
210
207
 
211
- def initialized?
212
- all_fields.all? { |field| field.initialized?(self) }
213
- end
214
-
215
208
  def inspect
216
209
  to_hash.inspect
217
210
  end
218
211
 
219
- def parse_from_string(string)
220
- parse_from(StringIO.new(string))
221
- end
222
-
223
212
  def parse_from(stream)
224
213
  Decoder.decode(stream, self)
225
214
  end
226
215
 
216
+ def parse_from_string(string)
217
+ parse_from(StringIO.new(string))
218
+ end
219
+
227
220
  def respond_to_has?(key)
228
221
  self.respond_to?(key) && self.has_field?(key)
229
222
  end
@@ -234,10 +227,24 @@ module Protobuf
234
227
  end
235
228
 
236
229
  def serialize_to(stream)
237
- Encoder.encode(stream, self)
230
+ each_field_for_serialization do |field, value|
231
+ if field.repeated?
232
+ if field.packed?
233
+ key = (field.tag << 3) | ::Protobuf::WireType::LENGTH_DELIMITED
234
+ packed_value = value.map { |val| field.encode(val) }.join
235
+ stream.write(::Protobuf::Field::VarintField.encode(key))
236
+ stream.write(::Protobuf::Field::VarintField.encode(packed_value.size))
237
+ stream.write(packed_value)
238
+ else
239
+ value.each { |val| write_pair(stream, field, val) }
240
+ end
241
+ else
242
+ write_pair(stream, field, value)
243
+ end
244
+ end
238
245
  end
239
246
 
240
- def serialize_to_string(string='')
247
+ def serialize_to_string(string = '')
241
248
  io = StringIO.new(string)
242
249
  serialize_to(io)
243
250
  result = io.string
@@ -296,6 +303,8 @@ module Protobuf
296
303
  #
297
304
  alias_method :to_hash_value, :to_hash
298
305
  alias_method :to_s, :serialize_to_string
306
+ alias_method :bytes, :serialize_to_string
307
+ alias_method :serialize, :serialize_to_string
299
308
  alias_method :responds_to_has?, :respond_to_has?
300
309
  alias_method :respond_to_and_has?, :respond_to_has?
301
310
  alias_method :responds_to_and_has?, :respond_to_has?
@@ -330,5 +339,18 @@ module Protobuf
330
339
  object
331
340
  end
332
341
 
342
+ def has_field_or_required_field?(field)
343
+ has_field?(field.name) || field.required?
344
+ end
345
+
346
+ # Encode key and value, and write to +stream+.
347
+ def write_pair(stream, field, value)
348
+ key = (field.tag << 3) | field.wire_type
349
+ key_bytes = ::Protobuf::Field::VarintField.encode(key)
350
+ stream.write(key_bytes)
351
+ bytes = field.encode(value)
352
+ stream.write(bytes)
353
+ end
354
+
333
355
  end
334
356
  end
@@ -13,18 +13,18 @@ module Protobuf
13
13
  tag, wire_type = read_key(stream)
14
14
  bytes =
15
15
  case wire_type
16
- when WireType::VARINT then
16
+ when ::Protobuf::WireType::VARINT then
17
17
  read_varint(stream)
18
- when WireType::FIXED64 then
18
+ when ::Protobuf::WireType::FIXED64 then
19
19
  read_fixed64(stream)
20
- when WireType::LENGTH_DELIMITED then
20
+ when ::Protobuf::WireType::LENGTH_DELIMITED then
21
21
  read_length_delimited(stream)
22
- when WireType::START_GROUP then
23
- read_start_group(stream)
24
- when WireType::END_GROUP then
25
- read_end_group(stream)
26
- when WireType::FIXED32 then
22
+ when ::Protobuf::WireType::FIXED32 then
27
23
  read_fixed32(stream)
24
+ when ::Protobuf::WireType::START_GROUP then
25
+ raise NotImplementedError, 'Group is deprecated.'
26
+ when ::Protobuf::WireType::END_GROUP then
27
+ raise NotImplementedError, 'Group is deprecated.'
28
28
  else
29
29
  raise InvalidWireType, wire_type
30
30
  end
@@ -69,15 +69,5 @@ module Protobuf
69
69
  stream.read(value_length)
70
70
  end
71
71
 
72
- # Not implemented.
73
- def read_start_group(stream)
74
- raise NotImplementedError, 'Group is deprecated.'
75
- end
76
-
77
- # Not implemented.
78
- def read_end_group(stream)
79
- raise NotImplementedError, 'Group is deprecated.'
80
- end
81
-
82
72
  end
83
73
  end
@@ -1,4 +1,4 @@
1
1
  module Protobuf
2
- VERSION = '2.3.2'
2
+ VERSION = '2.4.0'
3
3
  PROTOC_VERSION = '2.4.1'
4
4
  end
@@ -42,7 +42,7 @@ describe 'Functional EventMachine Client' do
42
42
  end
43
43
  EM.stop
44
44
  end
45
- error.message.should =~ /ResourceFindRequest.*fields.*improperly set/
45
+ error.message.should =~ /name.*required/
46
46
  end
47
47
 
48
48
  it 'calls the on_failure callback when the request type is wrong' do
@@ -41,7 +41,7 @@ describe 'Functional Socket Client' do
41
41
  c.on_success { raise "shouldn't pass"}
42
42
  c.on_failure {|e| error = e}
43
43
  end
44
- error.message.should =~ /ResourceFindRequest.*fields.*improperly set/
44
+ error.message.should =~ /name.*required/
45
45
  end
46
46
 
47
47
  it 'calls the on_failure callback when the request type is wrong' do
@@ -41,7 +41,7 @@ describe 'Functional ZMQ Client' do
41
41
  c.on_success { raise "shouldn't pass"}
42
42
  c.on_failure {|e| error = e}
43
43
  end
44
- error.message.should =~ /ResourceFindRequest.*fields.*improperly set/
44
+ error.message.should =~ /name.*required/
45
45
  end
46
46
 
47
47
  it 'calls the on_failure callback when the request type is wrong' do
@@ -20,6 +20,19 @@ describe Protobuf::Message do
20
20
  end
21
21
  end
22
22
 
23
+ describe '#encode' do
24
+ context "when there's no value for a required field" do
25
+ let(:message) { ::Test::Resource.new }
26
+ let(:stream) { StringIO.new }
27
+
28
+ it "raises a 'message not initialized' error" do
29
+ expect {
30
+ message.serialize_to(stream)
31
+ }.to raise_error(Protobuf::SerializationError, /required/i)
32
+ end
33
+ end
34
+ end
35
+
23
36
  describe "boolean predicate methods" do
24
37
  subject { Test::ResourceFindRequest.new(:name => "resource") }
25
38
 
@@ -152,19 +165,19 @@ describe Protobuf::Message do
152
165
  specify do
153
166
  expect {
154
167
  subject.get_field_by_name(1)
155
- }.to raise_error(::Protobuf::Message::FieldNotDefinedError, /.*1.*#{subject.class.name}/)
168
+ }.to raise_error(::Protobuf::FieldNotDefinedError, /.*1.*#{subject.class.name}/)
156
169
  end
157
170
 
158
171
  specify do
159
172
  expect {
160
173
  subject.get_field_by_name(:nothere)
161
- }.to raise_error(::Protobuf::Message::FieldNotDefinedError, /.*nothere.*#{subject.class.name}/)
174
+ }.to raise_error(::Protobuf::FieldNotDefinedError, /.*nothere.*#{subject.class.name}/)
162
175
  end
163
176
 
164
177
  specify do
165
178
  expect {
166
179
  subject.get_field_by_name(nil)
167
- }.to raise_error(::Protobuf::Message::FieldNotDefinedError, /.*nil.*#{subject.class.name}/)
180
+ }.to raise_error(::Protobuf::FieldNotDefinedError, /.*nil.*#{subject.class.name}/)
168
181
  end
169
182
  end
170
183
  end
@@ -206,13 +219,13 @@ describe Protobuf::Message do
206
219
  specify do
207
220
  expect {
208
221
  subject.get_field_by_tag("not a number")
209
- }.to raise_error(::Protobuf::Message::FieldNotDefinedError, /.*not a number.*#{subject.class.name}/)
222
+ }.to raise_error(::Protobuf::FieldNotDefinedError, /.*not a number.*#{subject.class.name}/)
210
223
  end
211
224
 
212
225
  specify do
213
226
  expect {
214
227
  subject.get_field_by_tag(nil)
215
- }.to raise_error(::Protobuf::Message::FieldNotDefinedError, /.*nil.*#{subject.class.name}/)
228
+ }.to raise_error(::Protobuf::FieldNotDefinedError, /.*nil.*#{subject.class.name}/)
216
229
  end
217
230
  end
218
231
  end
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.3.2
4
+ version: 2.4.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2012-11-15 00:00:00.000000000 Z
13
+ date: 2012-11-16 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: activesupport
@@ -369,7 +369,6 @@ files:
369
369
  - lib/protobuf/logger.rb
370
370
  - lib/protobuf/message.rb
371
371
  - lib/protobuf/message/decoder.rb
372
- - lib/protobuf/message/encoder.rb
373
372
  - lib/protobuf/message/extend.rb
374
373
  - lib/protobuf/message/message.rb
375
374
  - lib/protobuf/rpc/buffer.rb
@@ -416,7 +415,6 @@ files:
416
415
  - spec/lib/protobuf/enum_spec.rb
417
416
  - spec/lib/protobuf/enum_value_spec.rb
418
417
  - spec/lib/protobuf/logger_spec.rb
419
- - spec/lib/protobuf/message/encoder_spec.rb
420
418
  - spec/lib/protobuf/message_spec.rb
421
419
  - spec/lib/protobuf/rpc/client_spec.rb
422
420
  - spec/lib/protobuf/rpc/connector_spec.rb
@@ -501,7 +499,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
501
499
  version: '0'
502
500
  segments:
503
501
  - 0
504
- hash: 2306560722844978679
502
+ hash: 1889105763094487003
505
503
  required_rubygems_version: !ruby/object:Gem::Requirement
506
504
  none: false
507
505
  requirements:
@@ -510,7 +508,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
510
508
  version: '0'
511
509
  segments:
512
510
  - 0
513
- hash: 2306560722844978679
511
+ hash: 1889105763094487003
514
512
  requirements: []
515
513
  rubyforge_project:
516
514
  rubygems_version: 1.8.24
@@ -1,46 +0,0 @@
1
- require 'protobuf/wire_type'
2
- require 'protobuf/exceptions'
3
-
4
- module Protobuf
5
-
6
- module Encoder
7
-
8
- module_function
9
-
10
- # Encode +message+ and write to +stream+.
11
- def encode(stream, message)
12
- # FIXME make this not as ghetto
13
- unless message.initialized?
14
- raise NotInitializedError, "Message #{message.class.name} is not initialized (one or more fields is improperly set): #{JSON.parse(message.to_json)}"
15
- end
16
-
17
- message.each_field_for_serialization do |field, value|
18
- if field.repeated?
19
- if field.packed?
20
- key = (field.tag << 3) | WireType::LENGTH_DELIMITED
21
- packed_value = value.map {|val| field.encode(val) }.join
22
- stream.write(Field::VarintField.encode(key))
23
- stream.write(Field::VarintField.encode(packed_value.size))
24
- stream.write(packed_value)
25
- else
26
- value.each do |val|
27
- write_pair(stream, field, val)
28
- end
29
- end
30
- else
31
- write_pair(stream, field, value)
32
- end
33
- end
34
- end
35
-
36
- # Encode key and value, and write to +stream+.
37
- def write_pair(stream, field, value)
38
- key = (field.tag << 3) | field.wire_type
39
- key_bytes = Field::VarintField.encode(key)
40
- stream.write(key_bytes)
41
- bytes = field.encode(value)
42
- stream.write(bytes)
43
- end
44
-
45
- end
46
- end
@@ -1,19 +0,0 @@
1
- require 'spec_helper'
2
-
3
- class EncoderTest
4
- extend ::Protobuf::Encoder
5
- end
6
-
7
- describe Protobuf::Encoder do
8
- describe '#encode' do
9
- context "when there's no value for a required field" do
10
- let(:message) { ::Test::Resource.new }
11
- let(:stream) { StringIO.new }
12
- it "raises a 'message not initialized' error" do
13
- expect {
14
- EncoderTest.__send__(:encode, stream, message)
15
- }.to raise_error(Protobuf::NotInitializedError, /message.*not initialized/i)
16
- end
17
- end
18
- end
19
- end