macks-ruby_protobuf 0.3.2.1 → 0.3.2.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.
data/Manifest.txt CHANGED
@@ -2,7 +2,6 @@ History.txt
2
2
  Manifest.txt
3
3
  README.txt
4
4
  Rakefile
5
- bin/mk_parser
6
5
  bin/rprotoc
7
6
  examples/addressbook.proto
8
7
  examples/addressbook.pb.rb
@@ -37,6 +36,7 @@ lib/protobuf/rpc/client.rb
37
36
  lib/protobuf/rpc/handler.rb
38
37
  lib/protobuf/rpc/server.rb
39
38
  lib/ruby_protobuf.rb
39
+ script/mk_parser
40
40
  test/addressbook.rb
41
41
  test/addressbook_base.rb
42
42
  test/addressbook_ext.rb
data/README.txt CHANGED
@@ -1,7 +1,6 @@
1
1
  = RubyProtobuf
2
2
 
3
3
  * http://github.com/macks/ruby-protobuf
4
- * http://code.google.com/p/ruby-protobuf
5
4
 
6
5
  == DESCRIPTION:
7
6
 
@@ -23,7 +22,8 @@ Protocol Buffers for Ruby.
23
22
 
24
23
  == INSTALL:
25
24
 
26
- * rake gem; sudo gem install pkg/ruby_protobuf-*.gem
25
+ * gem source -a http://gems.github.com
26
+ * sudo gem install macks-ruby_protobuf
27
27
 
28
28
  == AUTHOR:
29
29
 
@@ -31,6 +31,7 @@ MATSUYAMA Kengo <macksx@gmail.com>
31
31
 
32
32
  Original Author:
33
33
  ANDO Yasushi <andyjpn@gmail.com>
34
+ http://code.google.com/p/ruby-protobuf
34
35
 
35
36
  == LICENSE:
36
37
 
data/Rakefile CHANGED
@@ -11,7 +11,7 @@ Hoe.new('ruby_protobuf', RubyProtobuf::VERSION) do |p|
11
11
  p.email = 'macksx@gmail.com'
12
12
  p.summary = 'Protocol Buffers for Ruby'
13
13
  p.description = p.paragraphs_of('README.txt', 2..5).join("\n\n")
14
- p.url = p.paragraphs_of('README.txt', 0).first.split(/\n/)[1..-1]
14
+ p.url = 'http://github.com/macks/ruby-protobuf'
15
15
  p.changes = p.paragraphs_of('History.txt', 0..1).join("\n\n")
16
16
  end
17
17
 
@@ -24,7 +24,7 @@ module Protobuf
24
24
  FileUtils.mkpath File.dirname(filename)
25
25
  file.write contents
26
26
  end
27
- FileUtils.chmod 0755, filename if executable
27
+ FileUtils.chmod 0755, filename if executable
28
28
  end
29
29
 
30
30
  def log_writing(filename, message="writing...")
@@ -42,14 +42,9 @@ module Protobuf
42
42
  protected
43
43
 
44
44
  def read_key(stream)
45
- # TODO is there more clear way to do this?
46
- bits = 0
47
45
  bytes = read_varint stream
48
- bytes.each_with_index do |byte, index|
49
- byte &= 0b01111111
50
- bits |= byte << (7 * index)
51
- end
52
- wire_type = bits & 0b00000111
46
+ bits = Protobuf::Field::VarintField.decode bytes
47
+ wire_type = bits & 0x07
53
48
  tag = bits >> 3
54
49
  [tag, wire_type]
55
50
  end
@@ -59,21 +54,22 @@ module Protobuf
59
54
  bytes = []
60
55
  begin
61
56
  byte = stream.send(read_method)
62
- bytes << (byte & 0b01111111)
63
- end while byte >> 7 == 1
57
+ bytes << (byte & 0x7f)
58
+ end while (byte & 0x80).nonzero?
64
59
  bytes
65
60
  end
66
61
 
62
+ def read_fixed32(stream)
63
+ stream.read(4)
64
+ end
65
+
67
66
  def read_fixed64(stream)
68
67
  stream.read(8)
69
68
  end
70
69
 
71
70
  def read_length_delimited(stream)
72
71
  bytes = read_varint stream
73
- value_length = 0
74
- bytes.each_with_index do |byte, index|
75
- value_length |= byte << (7 * index)
76
- end
72
+ value_length = Protobuf::Field::VarintField.decode bytes
77
73
  value = stream.read value_length
78
74
  value.unpack('C*')
79
75
  end
@@ -81,13 +77,9 @@ module Protobuf
81
77
  def read_start_group(stream)
82
78
  raise NotImplementedError.new('Group is duplecated.')
83
79
  end
84
-
80
+
85
81
  def read_end_group(stream)
86
82
  raise NotImplementedError.new('Group is duplecated.')
87
83
  end
88
-
89
- def read_fixed32(stream)
90
- stream.read(4)
91
- end
92
84
  end
93
85
  end
@@ -1,6 +1,8 @@
1
1
  require 'protobuf/common/wire_type'
2
2
 
3
3
  module Protobuf
4
+ class NotInitializedError < StandardError; end
5
+
4
6
  class Encoder
5
7
  class <<self
6
8
  def encode(stream, message)
@@ -13,6 +15,7 @@ module Protobuf
13
15
  end
14
16
 
15
17
  def encode(stream=@stream, message=@message)
18
+ raise NotInitializedError unless message.initialized?
16
19
  message.each_field do |field, value|
17
20
  next unless message.has_field?(field.name)
18
21
 
@@ -28,7 +31,7 @@ module Protobuf
28
31
 
29
32
  def write_pair(field, value, stream)
30
33
  key = (field.tag << 3) | field.wire_type
31
- key_bytes = Protobuf::Field::VarintField.get_bytes key
34
+ key_bytes = Protobuf::Field::VarintField.encode key
32
35
  stream.write key_bytes
33
36
  bytes = field.get value
34
37
  stream.write bytes
@@ -4,9 +4,9 @@ require 'protobuf/descriptor/field_descriptor'
4
4
  module Protobuf
5
5
  module Field
6
6
  def self.build(message_class, rule, type, name, tag, opts={})
7
- field_class =
8
- if [:double, :float, :int32, :int64, :uint32, :uint64,
9
- :sint32, :sint64, :fixed32, :fixed64, :sfixed32, :sfixed64,
7
+ field_class =
8
+ if [:double, :float, :int32, :int64, :uint32, :uint64,
9
+ :sint32, :sint64, :fixed32, :fixed64, :sfixed32, :sfixed64,
10
10
  :bool, :string, :bytes].include? type
11
11
  eval "Protobuf::Field::#{type.to_s.capitalize}Field"
12
12
  else
@@ -33,7 +33,7 @@ module Protobuf
33
33
  end
34
34
 
35
35
  def initialize(message_class, rule, type, name, tag, opts={})
36
- @message_class, @rule, @type, @name, @tag, @default, @extension =
36
+ @message_class, @rule, @type, @name, @tag, @default, @extension =
37
37
  message_class, rule, type, name, tag, opts[:default], opts[:extension]
38
38
  @error_message = 'Type invalid'
39
39
  end
@@ -46,9 +46,9 @@ module Protobuf
46
46
  return false if message[name].nil?
47
47
  return false if is_a?(Protobuf::Field::MessageField) and not message[name].initialized?
48
48
  when :repeated
49
- return message[name].inject(true) do |result, msg|
50
- result and msg.initialized?
51
- end
49
+ return message[name].all? {|msg|
50
+ (not is_a?(Protobuf::Field::MessageField)) or msg.initialized?
51
+ }
52
52
  when :optional
53
53
  return false if message[name] and is_a?(Protobuf::Field::MessageField) and not message[name].initialized?
54
54
  end
@@ -91,7 +91,11 @@ module Protobuf
91
91
  metaclass = (class << message_instance; self; end)
92
92
  metaclass.class_eval do
93
93
  define_method(field.name) do
94
- @values[field.name] or field.default_value
94
+ if @values.has_key?(field.name)
95
+ @values[field.name]
96
+ else
97
+ field.default_value
98
+ end
95
99
  end
96
100
  end
97
101
  end
@@ -110,29 +114,30 @@ module Protobuf
110
114
  end
111
115
  end
112
116
 
117
+ # encoder/decoder related methods
118
+
113
119
  def set(message_instance, bytes)
120
+ value = decode(bytes)
114
121
  if repeated?
115
- set_array message_instance, bytes
122
+ message_instance.send(name) << value
116
123
  else
117
- set_bytes message_instance, bytes
124
+ message_instance.send("#{name}=", value)
118
125
  end
119
126
  end
120
127
 
121
- def set_array(message_instance, bytes)
122
- raise NotImplementedError
123
- end
124
-
125
- def set_bytes(message_instance, bytes)
126
- raise NotImplementedError
128
+ def get(value)
129
+ encode(value)
127
130
  end
128
131
 
129
- def get(value)
130
- get_bytes value
132
+ def decode(bytes)
133
+ raise NotImplementedError.new("#{self.class.name}\#decode")
131
134
  end
135
+ private :decode
132
136
 
133
- def get_bytes(value)
134
- raise NotImplementedError
137
+ def encode(value)
138
+ raise NotImplementedError.new("#{self.class.name}\#encode")
135
139
  end
140
+ private :encode
136
141
 
137
142
  def merge(message_instance, value)
138
143
  if repeated?
@@ -143,13 +148,15 @@ module Protobuf
143
148
  end
144
149
 
145
150
  def merge_array(message_instance, value)
146
- message_instance[tag].concat value
151
+ message_instance[tag].concat value
147
152
  end
148
153
 
149
154
  def merge_value(message_instance, value)
150
155
  message_instance[tag] = value
151
156
  end
152
157
 
158
+ # utility methods
159
+
153
160
  def repeated?; rule == :repeated end
154
161
  def required?; rule == :required end
155
162
  def optional?; rule == :optional end
@@ -186,44 +193,27 @@ module Protobuf
186
193
  elsif type.superclass == Protobuf::Message
187
194
  Protobuf::Field::MessageField
188
195
  else
189
- raise $!
196
+ raise TypeError.new(type.inspect)
190
197
  end
191
198
  field_class.new @message_class, @rule, type, @name, @tag, @opts
192
199
  end
193
200
 
194
- def typename_to_class(message_class, type)
195
- modules = message_class.to_s.split('::')
196
- while
197
- begin
198
- type = eval((modules | [type.to_s]).join('::'))
199
- break
200
- rescue NameError
201
- modules.empty? ? raise($!) : modules.pop
202
- end
203
- end
204
- type
205
- end
206
- =begin
207
201
  def typename_to_class(message_class, type)
208
202
  suffix = type.to_s.split('::')
209
203
  modules = message_class.to_s.split('::')
204
+ args = (Object.method(:const_defined?).arity == 1) ? [] : [nil, false]
210
205
  while
211
206
  mod = modules.empty? ? Object : eval(modules.join('::'))
212
- suffix.each do |s|
213
- if mod.const_defined?(s)
214
- mod = mod.const_get(s)
215
- else
216
- mod = nil
217
- break
218
- end
219
- end
207
+ mod = suffix.inject(mod) {|m, s|
208
+ args[0] = s
209
+ m and m.const_defined?(*args) and m.const_get(s)
210
+ }
220
211
  break if mod
221
212
  raise NameError.new("type not found: #{type}", type) if modules.empty?
222
213
  modules.pop
223
214
  end
224
215
  mod
225
216
  end
226
- =end
227
217
  end
228
218
 
229
219
  class FieldArray < Array
@@ -260,7 +250,7 @@ module Protobuf
260
250
  end
261
251
  end
262
252
 
263
- class StringField < BaseField
253
+ class BytesField < BaseField
264
254
  class <<self
265
255
  def default; '' end
266
256
  end
@@ -274,96 +264,68 @@ module Protobuf
274
264
  true
275
265
  end
276
266
 
277
- def set_bytes(message_instance, bytes)
278
- message = bytes.pack('C*')
279
- message.force_encoding('UTF-8') if message.respond_to?(:force_encoding)
280
- message_instance.send("#{name}=", message)
281
- end
282
-
283
- def set_array(message_instance, bytes)
284
- message = bytes.pack('C*')
285
- message.force_encoding('UTF-8') if message.respond_to?(:force_encoding)
286
- arr = message_instance.send name
287
- arr << message
267
+ def decode(bytes)
268
+ bytes.pack('C*')
288
269
  end
289
270
 
290
- def get_bytes(value)
291
- bytes = value.unpack('C*')
292
- string_size = VarintField.get_bytes bytes.size
293
- string_size + bytes.pack('C*')
271
+ def encode(value)
272
+ value = value.dup
273
+ value.force_encoding('ASCII-8BIT') if value.respond_to?(:force_encoding)
274
+ string_size = VarintField.encode(value.size)
275
+ string_size << value
294
276
  end
295
277
  end
296
-
297
- class BytesField < BaseField
298
- class <<self
299
- def default; '' end
300
- end
301
-
302
- def wire_type
303
- Protobuf::WireType::LENGTH_DELIMITED
304
- end
305
-
306
- def acceptable?(val)
307
- raise TypeError unless val.instance_of? String
308
- true
309
- end
310
278
 
311
- def set_bytes(message_instance, bytes)
312
- message_instance.send("#{name}=", bytes.pack('C*'))
313
- end
314
-
315
- def set_array(message_instance, bytes)
279
+ class StringField < BytesField
280
+ def decode(bytes)
316
281
  message = bytes.pack('C*')
317
- arr = message_instance.send name
318
- arr << message
319
- end
320
-
321
- def get_bytes(value)
322
- string_size = VarintField.get_bytes value.unpack('C*').size
323
- string_size + value
282
+ message.force_encoding('UTF-8') if message.respond_to?(:force_encoding)
283
+ message
324
284
  end
325
285
  end
326
286
 
327
287
  class VarintField < BaseField
288
+ INT32_MAX = 2**31 - 1
289
+ INT32_MIN = -2**31
290
+ INT64_MAX = 2**63 - 1
291
+ INT64_MIN = -2**63
292
+ UINT32_MAX = 2**32 - 1
293
+ UINT64_MAX = 2**64 - 1
294
+
328
295
  class <<self
329
296
  def default; 0 end
297
+
298
+ def decode(bytes)
299
+ value = 0
300
+ bytes.each_with_index do |byte, index|
301
+ value |= byte << (7 * index)
302
+ end
303
+ value
304
+ end
305
+
306
+ def encode(value)
307
+ raise RangeError.new(value) if value < 0
308
+ return [value].pack('C') if value < 128
309
+ bytes = []
310
+ until value == 0
311
+ bytes << (0x80 | (value & 0x7f))
312
+ value >>= 7
313
+ end
314
+ bytes[-1] &= 0x7f
315
+ bytes.pack('C*')
316
+ end
330
317
  end
331
318
 
332
319
  def wire_type
333
320
  Protobuf::WireType::VARINT
334
321
  end
335
-
336
- def set_bytes(message_instance, bytes)
337
- # TODO should refactor using pack('w*')
338
- value = 0
339
- bytes.each_with_index do |byte, index|
340
- value |= byte << (7 * index)
341
- end
342
- message_instance.send("#{name}=", value)
343
- end
344
-
345
- def self.get_bytes(value)
346
- # TODO should refactor using unpack('w*')
347
- #return [value].pack('w*').unpack('C*')
348
- return [0].pack('C') if value == 0
349
- bytes = []
350
- until value == 0
351
- byte = 0
352
- 7.times do |i|
353
- byte |= (value & 1) << i
354
- value >>= 1
355
- end
356
- byte |= 0b10000000
357
- bytes << byte
358
- end
359
- #bytes[0] &= 0b01111111
360
- #bytes
361
- bytes[bytes.size - 1] &= 0b01111111
362
- bytes.pack('C*')
322
+
323
+ def decode(bytes)
324
+ self.class.decode(bytes)
363
325
  end
364
326
 
365
- def get_bytes(value)
366
- self.class.get_bytes value
327
+ def encode(value)
328
+ self.class.encode(value)
367
329
  end
368
330
 
369
331
  def acceptable?(val)
@@ -372,92 +334,86 @@ module Protobuf
372
334
  true
373
335
  end
374
336
  end
375
-
376
- class Int32Field < VarintField
377
- def self.max; 1.0/0.0 end
378
- def self.min; -1.0/0.0 end
337
+
338
+ # Base class for int32 and int64
339
+ class IntegerField < VarintField
340
+ def encode(value)
341
+ # original Google's library uses 64bits integer for negative value
342
+ VarintField.encode(value & 0xffff_ffff_ffff_ffff)
343
+ end
344
+
345
+ def decode(bytes)
346
+ value = VarintField.decode(bytes)
347
+ value -= 0x1_0000_0000_0000_0000 if (value & 0x8000_0000_0000_0000).nonzero?
348
+ value
349
+ end
379
350
  end
380
-
381
- class Int64Field < VarintField
382
- def self.max; 1.0/0.0 end
383
- def self.min; -1.0/0.0 end
351
+
352
+ class Int32Field < IntegerField
353
+ def self.max; INT32_MAX; end
354
+ def self.min; INT32_MIN; end
384
355
  end
385
-
356
+
357
+ class Int64Field < IntegerField
358
+ def self.max; INT64_MAX; end
359
+ def self.min; INT64_MIN; end
360
+ end
361
+
386
362
  class Uint32Field < VarintField
387
- def self.max; 1.0/0.0 end
388
- def self.min; 0 end
363
+ def self.max; UINT32_MAX; end
364
+ def self.min; 0; end
389
365
  end
390
-
366
+
391
367
  class Uint64Field < VarintField
392
- def self.max; 1.0/0.0 end
393
- def self.min; 0 end
368
+ def self.max; UINT64_MAX; end
369
+ def self.min; 0; end
394
370
  end
395
-
396
- class Sint32Field < VarintField
397
- def self.max; 1.0/0.0 end
398
- def self.min; -1.0/0.0 end
399
-
400
- def set_bytes(message_instance, bytes)
401
- # TODO use only bit-operations
402
- byte = bytes.first
403
- value =
404
- if byte % 2 == 0
405
- byte / 2
406
- else
407
- -(byte + 1) / 2
408
- end
409
- message_instance.send("#{name}=", value)
371
+
372
+ # Base class for sint32 and sint64
373
+ class SignedIntegerField < VarintField
374
+ def decode(bytes)
375
+ value = VarintField.decode(bytes)
376
+ if (value & 1).zero?
377
+ value >> 1 # positive value
378
+ else
379
+ ~value >> 1 # negative value
380
+ end
410
381
  end
411
382
 
412
- def get_bytes(value)
413
- #(value << 1) ^ (value >> 31)
414
- [(value << 1) ^ (value >> 31)].pack('C*')
383
+ def encode(value)
384
+ if value >= 0
385
+ VarintField.encode(value << 1)
386
+ else
387
+ VarintField.encode(~(value << 1))
388
+ end
415
389
  end
416
390
  end
417
-
418
- class Sint64Field < VarintField
419
- def self.max; 1.0/0.0 end
420
- def self.min; -1.0/0.0 end
421
-
422
- def set_bytes(message_instance, bytes)
423
- # TODO use only bit-operations
424
- byte = bytes.first
425
- value =
426
- if byte % 2 == 0
427
- byte / 2
428
- else
429
- -(byte + 1) / 2
430
- end
431
- message_instance.send("#{name}=", value)
432
- end
433
391
 
434
- def get_bytes(value)
435
- #(value << 1) ^ (value >> 63)
436
- [(value << 1) ^ (value >> 63)].pack('C*')
437
- end
392
+ class Sint32Field < SignedIntegerField
393
+ def self.max; INT32_MAX; end
394
+ def self.min; INT32_MIN; end
438
395
  end
439
-
440
- class DoubleField < VarintField
396
+
397
+ class Sint64Field < SignedIntegerField
398
+ def self.max; INT64_MAX; end
399
+ def self.min; INT64_MIN; end
400
+ end
401
+
402
+ class FloatField < BaseField
403
+ def self.default; 0.0; end
404
+ def self.max; 1.0/0; end
405
+ def self.min; -1.0/0; end
406
+
441
407
  def wire_type
442
- Protobuf::WireType::FIXED64
443
- end
444
-
445
- #TODO
446
- def self.max
447
- '0x7fefffffffffffff'.unpack('d').first
408
+ Protobuf::WireType::FIXED32
448
409
  end
449
410
 
450
- #TODO
451
- def self.min
452
- -(2**(64/2) - 1)
453
- end
454
-
455
- def set_bytes(message_instance, bytes)
456
- message_instance.send("#{name}=", bytes.unpack('E').first)
411
+ def decode(bytes)
412
+ bytes.unpack('e').first
457
413
  end
458
414
 
459
- def get_bytes(value)
460
- [value].pack('E')
415
+ def encode(value)
416
+ [value].pack('e')
461
417
  end
462
418
 
463
419
  def acceptable?(val)
@@ -466,109 +422,87 @@ module Protobuf
466
422
  true
467
423
  end
468
424
  end
469
-
470
- class FloatField < VarintField
425
+
426
+ class DoubleField < FloatField
471
427
  def wire_type
472
- Protobuf::WireType::FIXED32
473
- end
474
-
475
- #TODO
476
- def self.max
477
- '0x7fefffffffffffff'.unpack('e').first
428
+ Protobuf::WireType::FIXED64
478
429
  end
479
430
 
480
- #TODO
481
- def self.min
482
- -(2**(32/2) - 1)
483
- end
484
-
485
- def set_bytes(message_instance, bytes)
486
- message_instance.send("#{name}=", bytes.unpack('e').first)
431
+ def decode(bytes)
432
+ bytes.unpack('E').first
487
433
  end
488
434
 
489
- def get_bytes(value)
490
- [value].pack('e')
491
- end
492
-
493
- def acceptable?(val)
494
- raise TypeError unless val.is_a? Numeric
495
- raise RangeError if val < min or max < val
496
- true
435
+ def encode(value)
436
+ [value].pack('E')
497
437
  end
498
- end
499
-
500
- class Fixed32Field < VarintField
438
+ end
439
+
440
+ class Fixed32Field < Uint32Field
501
441
  def wire_type
502
442
  Protobuf::WireType::FIXED32
503
443
  end
504
444
 
505
- def self.max
506
- 2**32
445
+ def decode(bytes)
446
+ bytes.unpack('V').first
507
447
  end
508
448
 
509
- def self.min
510
- 0
511
- end
512
-
513
- def set_bytes(message_instance, bytes)
514
- message_instance.send("#{name}=", bytes.unpack('L').first)
515
- end
516
-
517
- def get_bytes(value)
518
- [value].pack('L')
449
+ def encode(value)
450
+ [value].pack('V')
519
451
  end
520
452
  end
521
-
522
- class Fixed64Field < VarintField
453
+
454
+ class Fixed64Field < Uint64Field
523
455
  def wire_type
524
456
  Protobuf::WireType::FIXED64
525
457
  end
526
458
 
527
- def self.max
528
- 2**64
459
+ def decode(bytes)
460
+ # we don't use 'Q' for pack/unpack. 'Q' is machine-dependent.
461
+ values = bytes.unpack('VV')
462
+ values[0] + (values[1] << 32)
529
463
  end
530
464
 
531
- def self.min
532
- 0
533
- end
534
-
535
- def set_bytes(message_instance, bytes)
536
- message_instance.send("#{name}=", bytes.unpack('l').first)
537
- end
538
-
539
- def get_bytes(value)
540
- [value].pack('Q')
465
+ def encode(value)
466
+ # we don't use 'Q' for pack/unpack. 'Q' is machine-dependent.
467
+ [value & 0xffff_ffff, value >> 32].pack('VV')
541
468
  end
542
469
  end
543
-
544
- class Sfinxed32Field < VarintField
470
+
471
+ class Sfixed32Field < Int32Field
545
472
  def wire_type
546
473
  Protobuf::WireType::FIXED32
547
474
  end
548
475
 
549
- def self.max
550
- 2**(32/2)
476
+ def decode(bytes)
477
+ value = bytes.unpack('V').first
478
+ value -= 0x1_0000_0000 if (value & 0x8000_0000).nonzero?
479
+ value
551
480
  end
552
481
 
553
- def self.min
554
- -(2**(32/2) - 1)
482
+ def encode(value)
483
+ [value].pack('V')
555
484
  end
556
485
  end
557
-
558
- class Sfixed64Field < VarintField
486
+
487
+ class Sfixed64Field < Int64Field
559
488
  def wire_type
560
489
  Protobuf::WireType::FIXED64
561
490
  end
562
491
 
563
- def self.max
564
- 2**(64/2)
492
+ def decode(bytes)
493
+ # we don't use 'Q' for pack/unpack. 'Q' is machine-dependent.
494
+ values = bytes.unpack('VV')
495
+ value = values[0] + (values[1] << 32)
496
+ value -= 0x1_0000_0000_0000_0000 if (value & 0x8000_0000_0000_0000).nonzero?
497
+ value
565
498
  end
566
499
 
567
- def self.min
568
- -(2**(64/2) - 1)
500
+ def encode(value)
501
+ # we don't use 'Q' for pack/unpack. 'Q' is machine-dependent.
502
+ [value & 0xffff_ffff, value >> 32].pack('VV')
569
503
  end
570
504
  end
571
-
505
+
572
506
  class BoolField < VarintField
573
507
  class <<self
574
508
  def default; false end
@@ -578,16 +512,16 @@ module Protobuf
578
512
  raise TypeError unless [TrueClass, FalseClass].include? val.class
579
513
  true
580
514
  end
581
-
582
- def set_bytes(message_instance, bytes)
583
- message_instance.send("#{name}=", bytes.first == 1)
515
+
516
+ def decode(bytes)
517
+ bytes.first == 1
584
518
  end
585
519
 
586
- def get_bytes(value)
520
+ def encode(value)
587
521
  [value ? 1 : 0].pack('C')
588
522
  end
589
523
  end
590
-
524
+
591
525
  class MessageField < BaseField
592
526
  class <<self
593
527
  def default; nil end
@@ -609,26 +543,17 @@ module Protobuf
609
543
  raise TypeError unless val.instance_of? type
610
544
  true
611
545
  end
612
-
613
- def set_bytes(message_instance, bytes)
546
+
547
+ def decode(bytes)
614
548
  message = type.new
615
549
  message.parse_from_string bytes.pack('C*') # TODO
616
- message_instance.send("#{name}=", message)
617
- end
618
-
619
- def set_array(message_instance, bytes)
620
- message = type.new
621
- message.parse_from_string bytes.pack('C*')
622
- arr = message_instance.send name
623
- arr << message
550
+ message
624
551
  end
625
552
 
626
- def get_bytes(value)
627
- stringio = StringIO.new ''
628
- value.serialize_to stringio
629
- bytes = stringio.string.unpack 'C*'
630
- string_size = VarintField.get_bytes bytes.size
631
- string_size + bytes.pack('C*')
553
+ def encode(value)
554
+ bytes = value.serialize_to_string
555
+ string_size = VarintField.encode bytes.size
556
+ string_size << bytes
632
557
  end
633
558
 
634
559
  def merge_value(message_instance, value)
@@ -127,12 +127,8 @@ module Protobuf
127
127
  end
128
128
 
129
129
  def initialized?
130
- fields.to_a.inject(true) do |result, (tag, field)|
131
- result and field.initialized?(self)
132
- end and
133
- extension_fields.to_a.inject(true) do |result, (tag, field)|
134
- result and field.initialized?(self)
135
- end
130
+ fields.all? {|tag, field| field.initialized?(self) } && \
131
+ extension_fields.all? {|tag, field| field.initialized?(self) }
136
132
  end
137
133
 
138
134
  def has_field?(tag_or_name)
@@ -185,9 +181,9 @@ module Protobuf
185
181
  "#{i}#{field.name} {\n#{value.inspect(indent + 1)}#{i}}\n"
186
182
  end
187
183
  elsif field.is_a? Protobuf::Field::EnumField
188
- if field.optional? and not has_field?(field.name)
189
- ''
190
- else
184
+ if field.optional? and not has_field?(field.name)
185
+ ''
186
+ else
191
187
  "#{i}#{field.name}: #{field.type.name_by_value(value)}\n"
192
188
  end
193
189
  else
@@ -204,10 +200,10 @@ module Protobuf
204
200
  end
205
201
  each_field do |field, value|
206
202
  if field.repeated?
207
- value.each do |v|
203
+ value.each do |v|
208
204
  field_value_to_string.call field, v
209
205
  end
210
- else
206
+ else
211
207
  field_value_to_string.call field, value
212
208
  end
213
209
  end
@@ -263,12 +259,12 @@ module Protobuf
263
259
  #get_field_by_tag(tag).set self, bytes # TODO
264
260
  (get_field_by_tag(tag) or get_ext_field_by_tag(tag)).set self, bytes
265
261
  end
266
-
262
+
267
263
  def merge_field(tag, value)
268
264
  #get_field_by_tag(tag).merge self, bytes #TODO
269
265
  (get_field_by_tag(tag) or get_ext_field_by_tag(tag)).merge self, value
270
266
  end
271
-
267
+
272
268
  def [](tag_or_name)
273
269
  if field = get_field(tag_or_name)
274
270
  send field.name
data/lib/ruby_protobuf.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  class RubyProtobuf
2
- VERSION = '0.3.2.1'
2
+ VERSION = '0.3.2.2'
3
3
  end
File without changes
@@ -14,4 +14,24 @@ message TestTypes {
14
14
  required bool type11 = 11;
15
15
  required string type12 = 12;
16
16
  required bytes type13 = 13;
17
+ required sfixed32 type14 = 14;
18
+ required sfixed64 type15 = 15;
19
+ }
20
+
21
+ message RepeatedTypes {
22
+ repeated double type1 = 1;
23
+ repeated float type2 = 2;
24
+ repeated int32 type3 = 3;
25
+ repeated int64 type4 = 4;
26
+ repeated uint32 type5 = 5;
27
+ repeated uint64 type6 = 6;
28
+ repeated sint32 type7 = 7;
29
+ repeated sint64 type8 = 8;
30
+ repeated fixed32 type9 = 9;
31
+ repeated fixed64 type10 = 10;
32
+ repeated bool type11 = 11;
33
+ repeated string type12 = 12;
34
+ repeated bytes type13 = 13;
35
+ repeated sfixed32 type14 = 14;
36
+ repeated sfixed64 type15 = 15;
17
37
  }
@@ -136,7 +136,7 @@ end
136
136
  def test_nested_message
137
137
  Protobuf::Visitor::CreateMessageVisitor.instance_eval {remove_const :Baaz}
138
138
  file_contents = Protobuf::Compiler.new.create_message('test/proto/nested.proto', '.', '.', false)
139
- assert_nothing_raised {eval file_contents}
139
+ assert_nothing_raised {Object.class_eval file_contents}
140
140
  assert_raise(TypeError) {Baaz.new.x = 1}
141
141
  assert_nothing_raised {Baaz.new.x = Foo::Bar.new}
142
142
  end
data/test/test_message.rb CHANGED
@@ -3,6 +3,9 @@ require 'test/addressbook'
3
3
  require 'test/merge'
4
4
  require 'test/unit'
5
5
 
6
+ # It should not conflict with Test::InnerMessage1 which is included in merge.proto
7
+ class InnerMessage1; end
8
+
6
9
  class MessageTest < Test::Unit::TestCase
7
10
  def test_equality
8
11
  person1 = Tutorial::Person.new :name => 'ando'
data/test/test_types.rb CHANGED
@@ -18,6 +18,8 @@ class TypesTest < Test::Unit::TestCase
18
18
  types.type12 = 'hello all types'
19
19
  image_bin = File.open('test/data/unk.png', 'r+b'){|f| f.read}
20
20
  types.type13 = image_bin
21
+ types.type14 = -100
22
+ types.type15 = -1000
21
23
 
22
24
  serialized_string = types.serialize_to_string
23
25
 
@@ -37,6 +39,49 @@ class TypesTest < Test::Unit::TestCase
37
39
  assert_equal 'hello all types', types2.type12
38
40
  assert_equal 10938, types2.type13.size
39
41
  assert_equal image_bin, types2.type13
42
+ assert_equal(-100, types2.type14)
43
+ assert_equal(-1000, types2.type15)
44
+ end
45
+
46
+ def test_serialize2
47
+ types = Test::Types::TestTypes.new
48
+ types.type1 = 1.0/0 # double (Inf)
49
+ types.type2 = -1.0/0 # float (-Inf)
50
+ types.type3 = -1 # int32
51
+ types.type4 = -10 # int64
52
+ types.type5 = 100 # uint32
53
+ types.type6 = 1000 # uint64
54
+ types.type7 = -1000 # sint32
55
+ types.type8 = -10000 # sint64
56
+ types.type9 = 10000 # fixed32
57
+ types.type10 = 100000 # fixed64
58
+ types.type11 = true
59
+ types.type12 = 'hello all types'
60
+ image_bin = File.open('test/data/unk.png', 'r+b'){|f| f.read}
61
+ types.type13 = image_bin
62
+ types.type14 = -2_000_000_000 # sfixed32
63
+ types.type15 = -8_000_000_000_000_000_000 # sfixed64
64
+
65
+ serialized_string = types.serialize_to_string
66
+
67
+ types2 = Test::Types::TestTypes.new
68
+ types2.parse_from_string serialized_string
69
+ assert_equal(1.0/0.0, types2.type1)
70
+ assert_equal(-1.0/0.0, types2.type2)
71
+ assert_equal(-1, types2.type3)
72
+ assert_equal(-10, types2.type4)
73
+ assert_equal(100, types2.type5)
74
+ assert_equal(1000, types2.type6)
75
+ assert_equal(-1000, types2.type7)
76
+ assert_equal(-10000, types2.type8)
77
+ assert_equal(10000, types2.type9)
78
+ assert_equal(100000, types2.type10)
79
+ assert types2.type11
80
+ assert_equal('hello all types', types2.type12)
81
+ assert_equal(10938, types2.type13.size)
82
+ assert_equal(image_bin, types2.type13)
83
+ assert_equal(-2_000_000_000, types2.type14)
84
+ assert_equal(-8_000_000_000_000_000_000, types2.type15)
40
85
  end
41
86
 
42
87
  def test_parse
@@ -64,9 +109,7 @@ class TypesTest < Test::Unit::TestCase
64
109
  assert_nothing_raised do types.type1 = 1.0 end
65
110
  assert_raise TypeError do types.type1 = '' end
66
111
  assert_nothing_raised do types.type1 = Protobuf::Field::DoubleField.max end
67
- assert_raise RangeError do types.type1 = Protobuf::Field::DoubleField.max * 2 end
68
112
  assert_nothing_raised do types.type1 = Protobuf::Field::DoubleField.min end
69
- assert_raise RangeError do types.type1 = Protobuf::Field::DoubleField.min * 2 end
70
113
  end
71
114
 
72
115
  def test_float
@@ -76,9 +119,7 @@ class TypesTest < Test::Unit::TestCase
76
119
  assert_nothing_raised do types.type2 = 1.0 end
77
120
  assert_raise TypeError do types.type2 = '' end
78
121
  assert_nothing_raised do types.type2 = Protobuf::Field::FloatField.max end
79
- assert_raise RangeError do types.type2 = Protobuf::Field::FloatField.max * 2 end
80
122
  assert_nothing_raised do types.type2 = Protobuf::Field::FloatField.min end
81
- assert_raise RangeError do types.type2 = Protobuf::Field::FloatField.min * 2 end
82
123
  end
83
124
 
84
125
  def test_int32
@@ -178,4 +219,8 @@ class TypesTest < Test::Unit::TestCase
178
219
  assert_raise TypeError do types.type13 = true end
179
220
  assert_raise TypeError do types.type13 = [] end
180
221
  end
222
+
223
+ def test_varint_getbytes
224
+ assert_equal "\xac\x02", Protobuf::Field::VarintField.encode(300)
225
+ end
181
226
  end
data/test/types.rb CHANGED
@@ -1,9 +1,10 @@
1
1
  require 'protobuf/message/message'
2
+ require 'protobuf/message/enum'
2
3
 
3
4
  module Test
4
5
  module Types
5
-
6
- class TestTypes < Protobuf::Message
6
+ class TestTypes < ::Protobuf::Message
7
+ defined_in __FILE__
7
8
  required :double, :type1, 1
8
9
  required :float, :type2, 2
9
10
  required :int32, :type3, 3
@@ -17,6 +18,26 @@ module Test
17
18
  required :bool, :type11, 11
18
19
  required :string, :type12, 12
19
20
  required :bytes, :type13, 13
21
+ required :sfixed32, :type14, 14
22
+ required :sfixed64, :type15, 15
23
+ end
24
+ class RepeatedTypes < ::Protobuf::Message
25
+ defined_in __FILE__
26
+ repeated :double, :type1, 1
27
+ repeated :float, :type2, 2
28
+ repeated :int32, :type3, 3
29
+ repeated :int64, :type4, 4
30
+ repeated :uint32, :type5, 5
31
+ repeated :uint64, :type6, 6
32
+ repeated :sint32, :type7, 7
33
+ repeated :sint64, :type8, 8
34
+ repeated :fixed32, :type9, 9
35
+ repeated :fixed64, :type10, 10
36
+ repeated :bool, :type11, 11
37
+ repeated :string, :type12, 12
38
+ repeated :bytes, :type13, 13
39
+ repeated :sfixed32, :type14, 14
40
+ repeated :sfixed64, :type15, 15
20
41
  end
21
42
  end
22
43
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: macks-ruby_protobuf
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.2.1
4
+ version: 0.3.2.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - MATSUYAMA Kengo
@@ -9,8 +9,8 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2009-04-21 00:00:00 -07:00
13
- default_executable:
12
+ date: 2009-04-22 00:00:00 -07:00
13
+ default_executable: rprotoc
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: hoe
@@ -25,7 +25,6 @@ dependencies:
25
25
  description: "== DESCRIPTION: Protocol Buffers for Ruby. == FEATURES/PROBLEMS: * Compile .proto file to ruby script * Parse the binary wire format for protocol buffer * Serialize data to the binary wire format for protocol buffer"
26
26
  email: macksx@gmail.com
27
27
  executables:
28
- - mk_parser
29
28
  - rprotoc
30
29
  extensions: []
31
30
 
@@ -38,7 +37,6 @@ files:
38
37
  - Manifest.txt
39
38
  - README.txt
40
39
  - Rakefile
41
- - bin/mk_parser
42
40
  - bin/rprotoc
43
41
  - examples/addressbook.proto
44
42
  - examples/addressbook.pb.rb
@@ -73,6 +71,7 @@ files:
73
71
  - lib/protobuf/rpc/handler.rb
74
72
  - lib/protobuf/rpc/server.rb
75
73
  - lib/ruby_protobuf.rb
74
+ - script/mk_parser
76
75
  - test/addressbook.rb
77
76
  - test/addressbook_base.rb
78
77
  - test/addressbook_ext.rb
@@ -110,7 +109,7 @@ files:
110
109
  - test/types.rb
111
110
  - test/test_optional_field.rb
112
111
  has_rdoc: true
113
- homepage:
112
+ homepage: http://github.com/macks/ruby-protobuf
114
113
  post_install_message:
115
114
  rdoc_options:
116
115
  - --main