macks-ruby_protobuf 0.3.2.3 → 0.3.3

Sign up to get free protection for your applications and to get access to all the features.
data/History.txt CHANGED
@@ -1,5 +1,11 @@
1
- === 0.3.1 / 2008-08-22
1
+ === 0.3.3 / 2009-07-10
2
2
 
3
+ * 0.3.3 (rev.218)
4
+ * Support C-like comment.
5
+ * Optimize for speed.
6
+ * Bug fixes.
7
+ * 0.3.2 (rev.185)
8
+ * Bug fixes.
3
9
  * 0.3.1 fixed bugs concerning RPC (rev.146)
4
10
  * 0.3.0 RPC is available (rev.124)
5
11
  * RPC is available
data/Manifest.txt CHANGED
@@ -2,6 +2,7 @@ History.txt
2
2
  Manifest.txt
3
3
  README.txt
4
4
  Rakefile
5
+ script/mk_parser
5
6
  bin/rprotoc
6
7
  examples/addressbook.proto
7
8
  examples/addressbook.pb.rb
@@ -36,7 +37,6 @@ lib/protobuf/rpc/client.rb
36
37
  lib/protobuf/rpc/handler.rb
37
38
  lib/protobuf/rpc/server.rb
38
39
  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/Rakefile CHANGED
@@ -5,13 +5,13 @@ require 'rubygems'
5
5
  require 'hoe'
6
6
  require 'ruby_protobuf'
7
7
 
8
- Hoe.new('ruby_protobuf', RubyProtobuf::VERSION) do |p|
9
- p.rubyforge_name = nil
10
- p.author = 'MATSUYAMA Kengo'
11
- p.email = 'macksx@gmail.com'
8
+ Hoe.spec('ruby_protobuf') do |p|
9
+ p.version = RubyProtobuf::VERSION
10
+ p.rubyforge_name = 'ruby-protobuf'
11
+ p.developer('MATSUYAMA Kengo', '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 = 'http://github.com/macks/ruby-protobuf'
14
+ p.url = 'http://code.google.com/p/ruby-protobuf'
15
15
  p.changes = p.paragraphs_of('History.txt', 0..1).join("\n\n")
16
16
  end
17
17
 
data/bin/rprotoc CHANGED
@@ -10,10 +10,10 @@ require 'ruby_protobuf'
10
10
  require 'protobuf/compiler/compiler'
11
11
 
12
12
 
13
- OPT = {}
13
+ options = {}
14
14
  opts = OptionParser.new("#{$0} [OPTIONS] PROTO_FILE")
15
- opts.on('-p', '--proto_path <PATH>', 'Specify the directory in which to search for imports. The current directory is default.'){|v| OPT[:proto_path] = v}
16
- opts.on('-o', '--out <OUT_DIR>', 'Specify the directory in which Ruby source file is generated. The current directory is default.'){|v| OPT[:out] = v}
15
+ opts.on('-p', '--proto_path <PATH>', 'Specify the directory in which to search for imports. The current directory is default.'){|v| options[:proto_path] = v}
16
+ opts.on('-o', '--out <OUT_DIR>', 'Specify the directory in which Ruby source file is generated. The current directory is default.'){|v| options[:out] = v}
17
17
  opts.on_tail('-v', '--version', 'Show version.'){puts(opts.ver); exit}
18
18
  opts.on_tail('-h', '--help', 'Show this message.'){puts(opts.help); exit}
19
19
 
@@ -26,11 +26,11 @@ rescue OptionParser::ParseError
26
26
  exit 1
27
27
  end
28
28
 
29
- PROTO_FILE = ARGV.shift
29
+ proto_file = ARGV.shift
30
30
 
31
- unless PROTO_FILE
31
+ unless proto_file
32
32
  puts opts
33
33
  exit
34
34
  end
35
35
 
36
- Protobuf::Compiler.compile(PROTO_FILE, (OPT[:proto_path] or '.'), (OPT[:out] or '.'))
36
+ Protobuf::Compiler.compile(proto_file, (options[:proto_path] or '.'), (options[:out] or '.'))
@@ -15,12 +15,7 @@ module Protobuf
15
15
  end
16
16
 
17
17
  def create_message(proto_file, proto_dir='.', out_dir='.', file_create=true)
18
- out_dir.sub! %r{/$}, ''
19
- proto_dir.sub! %r{/$}, ''
20
- rb_file =
21
- if proto_file =~ %r{^/}
22
- then "#{out_dir}/#{proto_file.split('/').last.sub(/\.proto$/, '')}.pb.rb"
23
- else "#{out_dir}/#{proto_file.sub(/\.proto$/, '')}.pb.rb" end
18
+ rb_file = File.join(out_dir, File.basename(proto_file).sub(/\.[^\0]*\z/, '') + '.pb.rb')
24
19
  proto_path = validate_existence proto_file, proto_dir
25
20
 
26
21
  message_visitor = Protobuf::Visitor::CreateMessageVisitor.new proto_file, proto_dir, out_dir
@@ -31,8 +26,7 @@ module Protobuf
31
26
  end
32
27
 
33
28
  def create_rpc(proto_file, proto_dir='.', out_dir='.', file_create=true)
34
- message_file = "#{out_dir}/#{proto_file.sub(/\.proto$/, '')}.pb.rb"
35
- out_dir = "#{out_dir}/#{File.dirname proto_file}"
29
+ message_file = File.join(out_dir, File.basename(proto_file).sub(/\.[^\0]*\z/, '') + '.pb.rb')
36
30
  proto_path = validate_existence proto_file, proto_dir
37
31
 
38
32
  rpc_visitor = Protobuf::Visitor::CreateRpcVisitor.new
@@ -44,11 +38,15 @@ module Protobuf
44
38
 
45
39
  def validate_existence(path, base_dir)
46
40
  if File.exist? path
47
- elsif File.exist?(path = "#{base_dir or '.'}/#{path}")
41
+ path
48
42
  else
49
- raise ArgumentError.new("File does not exist: #{path}")
43
+ newpath = File.join(base_dir, path)
44
+ if File.exist? newpath
45
+ newpath
46
+ else
47
+ raise ArgumentError.new("File does not exist: #{path}")
48
+ end
50
49
  end
51
- path
52
50
  end
53
51
  end
54
52
  end
@@ -106,7 +106,9 @@ require 'protobuf/message/extend'
106
106
  end
107
107
 
108
108
  def accept_message_visitor(visitor)
109
- visitor.write "class #{@name} < ::Protobuf::Message"
109
+ class_name = @name.to_s
110
+ class_name.gsub!(/\A[a-z]/) {|c| c.upcase}
111
+ visitor.write "class #{class_name} < ::Protobuf::Message"
110
112
  visitor.in_context self.class do
111
113
  define_in_the_file visitor
112
114
  #@children.each {|child| child.accept_message_visitor visitor}
@@ -185,14 +185,14 @@ end
185
185
  raise 'EOF inside block comment' until @scanner.scan_until(/\*\//)
186
186
  when match(/(?:required|optional|repeated|import|package|option|message|extend|enum|service|rpc|returns|group|default|extensions|to|max|double|float|int32|int64|uint32|uint64|sint32|sint64|fixed32|fixed64|sfixed32|sfixed64|bool|string|bytes)\b/)
187
187
  yield [@token, @token.to_sym]
188
- when match(/[1-9]\d*(?!\.)/, /0(?![.xX0-9])/)
188
+ when match(/[+-]?\d*\.\d+([Ee][\+-]?\d+)?/)
189
+ yield [:FLOAT_LITERAL, @token.to_f]
190
+ when match(/[+-]?[1-9]\d*(?!\.)/, /0(?![.xX0-9])/)
189
191
  yield [:DEC_INTEGER, @token.to_i]
190
192
  when match(/0[xX]([A-Fa-f0-9])+/)
191
193
  yield [:HEX_INTEGER, @token.to_i(0)]
192
194
  when match(/0[0-7]+/)
193
195
  yield [:OCT_INTEGER, @token.to_i(0)]
194
- when match(/\d+(\.\d+)?([Ee][\+-]?\d+)?/)
195
- yield [:FLOAT_LITERAL, @token.to_f]
196
196
  when match(/(true|false)\b/)
197
197
  yield [:BOOLEAN_LITERAL, @token == 'true']
198
198
  when match(/"(?:[^"\\]+|\\.)*"/, /'(?:[^'\\]+|\\.)*'/)
@@ -10,7 +10,7 @@
10
10
  unless $".index 'racc/parser.rb'
11
11
  $".push 'racc/parser.rb'
12
12
 
13
- self.class.module_eval <<'..end racc/parser.rb modeval..id9f4fc093ed', 'racc/parser.rb', 1
13
+ self.class.module_eval <<'..end racc/parser.rb modeval..id521073ac1f', 'racc/parser.rb', 1
14
14
  #
15
15
  # $Id: parser.rb,v 1.7 2005/11/20 17:31:32 aamine Exp $
16
16
  #
@@ -453,7 +453,7 @@ module Racc
453
453
  end
454
454
 
455
455
  end
456
- ..end racc/parser.rb modeval..id9f4fc093ed
456
+ ..end racc/parser.rb modeval..id521073ac1f
457
457
  end
458
458
  ###### racc/parser.rb end
459
459
 
@@ -462,7 +462,7 @@ module Protobuf
462
462
 
463
463
  class ProtoParser < Racc::Parser
464
464
 
465
- module_eval <<'..end lib/protobuf/compiler/proto.y modeval..idbff1afc93c', 'lib/protobuf/compiler/proto.y', 163
465
+ module_eval <<'..end lib/protobuf/compiler/proto.y modeval..id7865f341f1', 'lib/protobuf/compiler/proto.y', 163
466
466
 
467
467
  require 'strscan'
468
468
 
@@ -488,14 +488,14 @@ module_eval <<'..end lib/protobuf/compiler/proto.y modeval..idbff1afc93c', 'lib/
488
488
  raise 'EOF inside block comment' until @scanner.scan_until(/\*\//)
489
489
  when match(/(?:required|optional|repeated|import|package|option|message|extend|enum|service|rpc|returns|group|default|extensions|to|max|double|float|int32|int64|uint32|uint64|sint32|sint64|fixed32|fixed64|sfixed32|sfixed64|bool|string|bytes)\b/)
490
490
  yield [@token, @token.to_sym]
491
- when match(/[1-9]\d*(?!\.)/, /0(?![.xX0-9])/)
491
+ when match(/[+-]?\d*\.\d+([Ee][\+-]?\d+)?/)
492
+ yield [:FLOAT_LITERAL, @token.to_f]
493
+ when match(/[+-]?[1-9]\d*(?!\.)/, /0(?![.xX0-9])/)
492
494
  yield [:DEC_INTEGER, @token.to_i]
493
495
  when match(/0[xX]([A-Fa-f0-9])+/)
494
496
  yield [:HEX_INTEGER, @token.to_i(0)]
495
497
  when match(/0[0-7]+/)
496
498
  yield [:OCT_INTEGER, @token.to_i(0)]
497
- when match(/\d+(\.\d+)?([Ee][\+-]?\d+)?/)
498
- yield [:FLOAT_LITERAL, @token.to_f]
499
499
  when match(/(true|false)\b/)
500
500
  yield [:BOOLEAN_LITERAL, @token == 'true']
501
501
  when match(/"(?:[^"\\]+|\\.)*"/, /'(?:[^'\\]+|\\.)*'/)
@@ -522,7 +522,7 @@ module_eval <<'..end lib/protobuf/compiler/proto.y modeval..idbff1afc93c', 'lib/
522
522
  end
523
523
  false
524
524
  end
525
- ..end lib/protobuf/compiler/proto.y modeval..idbff1afc93c
525
+ ..end lib/protobuf/compiler/proto.y modeval..id7865f341f1
526
526
 
527
527
  ##### racc 1.4.5 generates ###
528
528
 
@@ -85,7 +85,11 @@ module Protobuf
85
85
 
86
86
  def define_accessor
87
87
  define_getter
88
- define_setter unless rule == :repeated
88
+ if rule == :repeated
89
+ define_array_setter
90
+ else
91
+ define_setter
92
+ end
89
93
  end
90
94
 
91
95
  def define_getter
@@ -114,6 +118,15 @@ module Protobuf
114
118
  end
115
119
  end
116
120
 
121
+ def define_array_setter
122
+ field = self
123
+ @message_class.class_eval do
124
+ define_method("#{field.name}=") do |val|
125
+ @values[field.name].replace(val)
126
+ end
127
+ end
128
+ end
129
+
117
130
  public
118
131
 
119
132
  # encoder/decoder related methods
@@ -224,32 +237,41 @@ module Protobuf
224
237
  end
225
238
 
226
239
  def []=(nth, val)
227
- if @field.acceptable? val
228
- super
229
- end
240
+ super(normalize(val))
230
241
  end
231
242
 
232
243
  def <<(val)
233
- if @field.acceptable? val
234
- super
235
- end
244
+ super(normalize(val))
236
245
  end
237
246
 
238
247
  def push(val)
239
- if @field.acceptable? val
240
- super
241
- end
248
+ super(normalize(val))
242
249
  end
243
250
 
244
251
  def unshift(val)
245
- if @field.acceptable? val
246
- super
247
- end
252
+ super(normalize(val))
253
+ end
254
+
255
+ def replace(val)
256
+ raise TypeError unless val.is_a?(Array)
257
+ val = val.map {|v| normalize(v)}
258
+ super(val)
248
259
  end
249
260
 
250
261
  def to_s
251
262
  "[#{@field.name}]"
252
263
  end
264
+
265
+ private
266
+
267
+ def normalize(val)
268
+ raise TypeError unless @field.acceptable?(val)
269
+ if @field.is_a?(MessageField) && val.is_a?(Hash)
270
+ @field.type.new(val)
271
+ else
272
+ val
273
+ end
274
+ end
253
275
  end
254
276
 
255
277
  class BytesField < BaseField
@@ -529,6 +551,24 @@ module Protobuf
529
551
  def default; nil end
530
552
  end
531
553
 
554
+ def define_setter
555
+ field = self
556
+ @message_class.class_eval do
557
+ define_method("#{field.name}=") do |val|
558
+ case val
559
+ when nil
560
+ @values.delete(field.name)
561
+ when Hash
562
+ @values[field.name] = field.type.new(val)
563
+ when field.type
564
+ @values[field.name] = val
565
+ else
566
+ raise TypeError
567
+ end
568
+ end
569
+ end
570
+ end
571
+
532
572
  def wire_type
533
573
  Protobuf::WireType::LENGTH_DELIMITED
534
574
  end
@@ -542,7 +582,7 @@ module Protobuf
542
582
  end
543
583
 
544
584
  def acceptable?(val)
545
- raise TypeError unless val.instance_of? type
585
+ raise TypeError unless val.instance_of?(type) or val.instance_of?(Hash)
546
586
  true
547
587
  end
548
588
 
@@ -188,9 +188,9 @@ module Protobuf
188
188
  "#{i}#{field.name} {\n#{value.inspect(indent + 1)}#{i}}\n"
189
189
  end
190
190
  elsif field.is_a? Protobuf::Field::EnumField
191
- if field.optional? and not has_field?(field.name)
192
- ''
193
- else
191
+ if field.optional? and not has_field?(field.name)
192
+ ''
193
+ else
194
194
  "#{i}#{field.name}: #{field.type.name_by_value(value)}\n"
195
195
  end
196
196
  else
@@ -225,7 +225,7 @@ module Protobuf
225
225
  if filename.is_a? File
226
226
  parse_from filename
227
227
  else
228
- File.open(filename, 'r') do |f|
228
+ File.open(filename, 'rb') do |f|
229
229
  parse_from f
230
230
  end
231
231
  end
@@ -238,7 +238,9 @@ module Protobuf
238
238
  def serialize_to_string(string='')
239
239
  io = StringIO.new string
240
240
  serialize_to io
241
- io.string
241
+ result = io.string
242
+ result.force_encoding('ASCII-8BIT') if result.respond_to?(:force_encoding)
243
+ result
242
244
  end
243
245
  alias to_s serialize_to_string
244
246
 
@@ -246,7 +248,7 @@ module Protobuf
246
248
  if filename.is_a? File
247
249
  serialize_to filename
248
250
  else
249
- File.open(filename, 'w') do |f|
251
+ File.open(filename, 'wb') do |f|
250
252
  serialize_to f
251
253
  end
252
254
  end
@@ -263,8 +265,8 @@ module Protobuf
263
265
  end
264
266
 
265
267
  def set_field(tag, bytes)
266
- #get_field_by_tag(tag).set self, bytes # TODO
267
- (get_field_by_tag(tag) or get_ext_field_by_tag(tag)).set self, bytes
268
+ field = (get_field_by_tag(tag) or get_ext_field_by_tag(tag))
269
+ field.set self, bytes if field
268
270
  end
269
271
 
270
272
  def merge_field(tag, value)
@@ -273,22 +275,18 @@ module Protobuf
273
275
  end
274
276
 
275
277
  def [](tag_or_name)
276
- if field = get_field(tag_or_name)
277
- send field.name
278
- elsif field = get_ext_field(tag_or_name)
278
+ if field = get_field(tag_or_name) || get_ext_field(tag_or_name)
279
279
  send field.name
280
280
  else
281
- raise NoMethodError.new("No such method: #{tag_or_name.inspect}")
281
+ raise NoMethodError.new("No such field: #{tag_or_name.inspect}")
282
282
  end
283
283
  end
284
284
 
285
285
  def []=(tag_or_name, value)
286
- if field = get_field(tag_or_name) and not field.repeated?
287
- send "#{field.name}=", value
288
- elsif field = get_ext_field(tag_or_name) and not field.repeated?
286
+ if field = get_field(tag_or_name) || get_ext_field(tag_or_name)
289
287
  send "#{field.name}=", value
290
288
  else
291
- raise NoMethodError.new("No such method: #{tag_or_name.inspect}")
289
+ raise NoMethodError.new("No such field: #{tag_or_name.inspect}")
292
290
  end
293
291
  end
294
292
 
data/lib/ruby_protobuf.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  class RubyProtobuf
2
- VERSION = '0.3.2.3'
2
+ VERSION = '0.3.3'
3
3
  end
@@ -8,7 +8,15 @@ class CompilerTest < Test::Unit::TestCase
8
8
  assert_compile_proto <<-eos, 'test/proto/float_default.proto'
9
9
  ### Generated by rprotoc. DO NOT EDIT!
10
10
  ### <proto file: test/proto/float_default.proto>
11
- # message M { optional float f = 1 [default = 4.2]; }
11
+ # message M {
12
+ # optional float f = 1 [default = 4.2];
13
+ # optional float g = 2 [default = -4.2];
14
+ # optional float h = 3 [default = 4352];
15
+ # optional float i = 4 [default = 23145.2 ];
16
+ # optional float j = 5 [default = -5 ];
17
+ # optional float k = 6 [default = +23 ];
18
+ # optional float l = 7 [default = +23.42 ];
19
+ # }
12
20
  #
13
21
 
14
22
  require 'protobuf/message/message'
@@ -19,6 +27,12 @@ require 'protobuf/message/extend'
19
27
  class M < ::Protobuf::Message
20
28
  defined_in __FILE__
21
29
  optional :float, :f, 1, :default => 4.2
30
+ optional :float, :g, 2, :default => -4.2
31
+ optional :float, :h, 3, :default => 4352
32
+ optional :float, :i, 4, :default => 23145.2
33
+ optional :float, :j, 5, :default => -5
34
+ optional :float, :k, 6, :default => 23
35
+ optional :float, :l, 7, :default => 23.42
22
36
  end
23
37
  eos
24
38
  end
@@ -142,9 +156,9 @@ end
142
156
  end
143
157
 
144
158
  def test_create_rpc
145
- file_contents = Protobuf::Compiler.new.create_rpc('test/proto/rpc.proto', '.', '.', false)
159
+ file_contents = Protobuf::Compiler.new.create_rpc('test/proto/rpc.proto', '.', 'test/proto', false)
146
160
 
147
- assert_source <<-eos, file_contents['./test/proto/address_book_service.rb']
161
+ assert_source <<-eos, file_contents['test/proto/address_book_service.rb']
148
162
  require 'protobuf/rpc/server'
149
163
  require 'protobuf/rpc/handler'
150
164
  require 'test/proto/rpc.pb'
@@ -177,14 +191,14 @@ class Tutorial::AddressBookService < Protobuf::Rpc::Server
177
191
  end
178
192
  eos
179
193
 
180
- assert_source <<-eos, file_contents['./test/proto/start_address_book_service']
194
+ assert_source <<-eos, file_contents['test/proto/start_address_book_service']
181
195
  #!/usr/bin/env ruby
182
196
  require 'address_book_service'
183
197
 
184
198
  Tutorial::AddressBookService.new(:port => 9999).start
185
199
  eos
186
200
 
187
- assert_source <<-eos, file_contents['./test/proto/client_search.rb']
201
+ assert_source <<-eos, file_contents['test/proto/client_search.rb']
188
202
  #!/usr/bin/env ruby
189
203
  require 'protobuf/rpc/client'
190
204
  require 'test/proto/rpc.pb'
@@ -204,7 +218,7 @@ Protobuf::Rpc::Client.new('localhost', 9999).call :search, request, response
204
218
  puts response
205
219
  eos
206
220
 
207
- assert_source <<-eos, file_contents['./test/proto/client_add.rb']
221
+ assert_source <<-eos, file_contents['test/proto/client_add.rb']
208
222
  #!/usr/bin/env ruby
209
223
  require 'protobuf/rpc/client'
210
224
  require 'test/proto/rpc.pb'
data/test/test_message.rb CHANGED
@@ -36,6 +36,22 @@ class MessageTest < Test::Unit::TestCase
36
36
  assert_equal 'Jiro', person.name
37
37
  assert_equal 300, person.id
38
38
  assert_equal 'jiro@ema.il', person.email
39
+
40
+ # initialize with array of hash
41
+ person = Tutorial::Person.new(:phone => [{:number => 'phone1'}, {:number => 'phone2'}])
42
+ assert_equal 'phone1', person.phone[0].number
43
+ assert_equal 'phone2', person.phone[1].number
44
+
45
+ # initalize with hash in hash
46
+ message = Test::MergeMessage.new(:require_message => { :name => 'name1', :repeate_message => [{:name => 'name2'}] })
47
+ assert_equal 'name1', message.require_message.name
48
+ assert_equal 'name2', message.require_message.repeate_message[0].name
49
+
50
+ message.require_message = { :name => 'name21' }
51
+ message.require_message.repeate_message = [ {:name => 'name22'} ]
52
+ assert_equal 'name21', message.require_message.name
53
+ assert_equal 'name22', message.require_message.repeate_message[0].name
54
+ assert_equal 1, message.require_message.repeate_message.size
39
55
  end
40
56
 
41
57
  def test_defined_filenames
@@ -15,6 +15,9 @@ class OptionalFieldTest < Test::Unit::TestCase
15
15
  assert !message.has_field?(:enum)
16
16
  assert_equal 2, message.enum
17
17
 
18
+ assert !message.has_field?(:signed)
19
+ assert_equal(-100, message.signed)
20
+
18
21
  # assign values
19
22
  assert_nothing_raised { message.number = 100 }
20
23
  assert message.has_field?(:number)
@@ -27,6 +30,10 @@ class OptionalFieldTest < Test::Unit::TestCase
27
30
  assert_nothing_raised { message.enum = Test::Optional_field::Message::Enum::A }
28
31
  assert message.has_field?(:enum)
29
32
  assert_equal 1, message.enum
33
+
34
+ assert_nothing_raised { message.signed = -20 }
35
+ assert message.has_field?(:signed)
36
+ assert_equal(-20, message.signed)
30
37
  end
31
38
 
32
39
  def test_serialize
@@ -40,15 +47,18 @@ class OptionalFieldTest < Test::Unit::TestCase
40
47
  assert_equal message1.number, message2.number
41
48
  assert_equal message1.text, message2.text
42
49
  assert_equal message1.enum, message2.enum
50
+ assert_equal message1.signed, message2.signed
43
51
  assert !message2.has_field?(:number)
44
52
  assert !message2.has_field?(:text)
45
53
  assert !message2.has_field?(:enum)
54
+ assert !message2.has_field?(:signed)
46
55
 
47
56
  # assign the value whith is equal to default value
48
57
  message1 = Test::Optional_field::Message.new
49
58
  message1.number = message1.number
50
59
  message1.text = message1.text
51
60
  message1.enum = message1.enum
61
+ message1.signed = message1.signed
52
62
  serialized_string = message1.to_s
53
63
  assert !serialized_string.empty?
54
64
 
@@ -61,8 +71,10 @@ class OptionalFieldTest < Test::Unit::TestCase
61
71
  assert_equal message1.number, message2.number
62
72
  assert_equal message1.text, message2.text
63
73
  assert_equal message1.enum, message2.enum
74
+ assert_equal message1.signed, message2.signed
64
75
  assert message2.has_field?(:number)
65
76
  assert message2.has_field?(:text)
66
77
  assert !message2.has_field?(:enum)
78
+ assert !message2.has_field?(:signed)
67
79
  end
68
80
  end
@@ -0,0 +1,106 @@
1
+ require 'test/unit'
2
+ require 'test/types'
3
+
4
+ class RepeatedTypesTest < Test::Unit::TestCase
5
+ def test_serialize
6
+ # empty set
7
+ types = Test::Types::RepeatedTypes.new
8
+ assert_equal('', types.to_s)
9
+
10
+ # has 1 member
11
+ types = Test::Types::RepeatedTypes.new
12
+ types.type1 << 0.01
13
+ types.type2 << 0.1
14
+ types.type3 << 1
15
+ types.type4 << 10
16
+ types.type5 << 100
17
+ types.type6 << 1000
18
+ types.type7 << -1
19
+ types.type8 << -10
20
+ types.type9 << 10000
21
+ types.type10 << 100000
22
+ types.type11 << false
23
+ types.type12 << 'hello all types'
24
+ image_bin = File.open('test/data/unk.png', 'r+b'){|f| f.read}
25
+ types.type13 << image_bin
26
+ types.type14 << -100
27
+ types.type15 << -1000
28
+
29
+ serialized_string = types.serialize_to_string
30
+
31
+ types2 = Test::Types::RepeatedTypes.new
32
+ types2.parse_from_string serialized_string
33
+ assert_in_delta(0.01, types2.type1[0], 0.00001)
34
+ assert_in_delta(0.1, types2.type2[0], 0.00001)
35
+ assert_equal(1, types2.type3[0])
36
+ assert_equal(10, types2.type4[0])
37
+ assert_equal(100, types2.type5[0])
38
+ assert_equal(1000, types2.type6[0])
39
+ assert_equal(-1, types2.type7[0])
40
+ assert_equal(-10, types2.type8[0])
41
+ assert_equal(10000, types2.type9[0])
42
+ assert_equal(100000, types2.type10[0])
43
+ assert(!types2.type11[0])
44
+ assert_equal('hello all types', types2.type12[0])
45
+ assert_equal(10938, types2.type13[0].size)
46
+ assert_equal(image_bin, types2.type13[0])
47
+ assert_equal(-100, types2.type14[0])
48
+ assert_equal(-1000, types2.type15[0])
49
+
50
+ # has 2 members
51
+ types.type1 << 1.0/0 # double (Inf)
52
+ types.type2 << -1.0/0 # float (-Inf)
53
+ types.type3 << -1 # int32
54
+ types.type4 << -10 # int64
55
+ types.type5 << 100 # uint32
56
+ types.type6 << 1000 # uint64
57
+ types.type7 << -1000 # sint32
58
+ types.type8 << -10000 # sint64
59
+ types.type9 << 10000 # fixed32
60
+ types.type10 << 100000 # fixed64
61
+ types.type11 << true
62
+ types.type12 << 'hello all types'
63
+ image_bin = File.open('test/data/unk.png', 'r+b'){|f| f.read}
64
+ types.type13 << image_bin
65
+ types.type14 << -2_000_000_000 # sfixed32
66
+ types.type15 << -8_000_000_000_000_000_000 # sfixed64
67
+
68
+ serialized_string = types.serialize_to_string
69
+
70
+ types2 = Test::Types::RepeatedTypes.new
71
+ types2.parse_from_string serialized_string
72
+ assert_in_delta(0.01, types2.type1[0], 0.00001)
73
+ assert_in_delta(0.1, types2.type2[0], 0.00001)
74
+ assert_equal(1, types2.type3[0])
75
+ assert_equal(10, types2.type4[0])
76
+ assert_equal(100, types2.type5[0])
77
+ assert_equal(1000, types2.type6[0])
78
+ assert_equal(-1, types2.type7[0])
79
+ assert_equal(-10, types2.type8[0])
80
+ assert_equal(10000, types2.type9[0])
81
+ assert_equal(100000, types2.type10[0])
82
+ assert(!types2.type11[0])
83
+ assert_equal('hello all types', types2.type12[0])
84
+ assert_equal(10938, types2.type13[0].size)
85
+ assert_equal(image_bin, types2.type13[0])
86
+ assert_equal(-100, types2.type14[0])
87
+ assert_equal(-1000, types2.type15[0])
88
+
89
+ assert_equal(1.0/0.0, types2.type1[1])
90
+ assert_equal(-1.0/0.0, types2.type2[1])
91
+ assert_equal(-1, types2.type3[1])
92
+ assert_equal(-10, types2.type4[1])
93
+ assert_equal(100, types2.type5[1])
94
+ assert_equal(1000, types2.type6[1])
95
+ assert_equal(-1000, types2.type7[1])
96
+ assert_equal(-10000, types2.type8[1])
97
+ assert_equal(10000, types2.type9[1])
98
+ assert_equal(100000, types2.type10[1])
99
+ assert types2.type11[1]
100
+ assert_equal('hello all types', types2.type12[1])
101
+ assert_equal(10938, types2.type13[1].size)
102
+ assert_equal(image_bin, types2.type13[1])
103
+ assert_equal(-2_000_000_000, types2.type14[1])
104
+ assert_equal(-8_000_000_000_000_000_000, types2.type15[1])
105
+ end
106
+ end
@@ -39,4 +39,23 @@ class SerializeTest < Test::Unit::TestCase
39
39
  assert_equal 1234, person2.id
40
40
  assert_equal '山田 太郎', person2.name
41
41
  end
42
+
43
+ def test_unknown_field
44
+ person = Tutorial::Person.new
45
+ person.id = 1234
46
+ person.name = 'a b c'
47
+ serialized_string = person.serialize_to_string
48
+
49
+ # add invalid field
50
+ tag = 1000
51
+ wire_type = Protobuf::WireType::VARINT
52
+ serialized_string << Protobuf::Field::VarintField.encode((tag << 3) | wire_type)
53
+ serialized_string << Protobuf::Field::VarintField.encode(100)
54
+
55
+ # decode
56
+ person2 = Tutorial::Person.new
57
+ person2.parse_from_string serialized_string
58
+
59
+ assert_equal(person, person2)
60
+ end
42
61
  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.3
4
+ version: 0.3.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - MATSUYAMA Kengo
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2009-04-22 00:00:00 -07:00
12
+ date: 2009-07-16 00:00:00 -07:00
13
13
  default_executable: rprotoc
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
@@ -20,10 +20,11 @@ dependencies:
20
20
  requirements:
21
21
  - - ">="
22
22
  - !ruby/object:Gem::Version
23
- version: 1.12.1
23
+ version: 2.3.2
24
24
  version:
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
- email: macksx@gmail.com
26
+ email:
27
+ - macksx@gmail.com
27
28
  executables:
28
29
  - rprotoc
29
30
  extensions: []
@@ -37,6 +38,7 @@ files:
37
38
  - Manifest.txt
38
39
  - README.txt
39
40
  - Rakefile
41
+ - script/mk_parser
40
42
  - bin/rprotoc
41
43
  - examples/addressbook.proto
42
44
  - examples/addressbook.pb.rb
@@ -71,7 +73,6 @@ files:
71
73
  - lib/protobuf/rpc/handler.rb
72
74
  - lib/protobuf/rpc/server.rb
73
75
  - lib/ruby_protobuf.rb
74
- - script/mk_parser
75
76
  - test/addressbook.rb
76
77
  - test/addressbook_base.rb
77
78
  - test/addressbook_ext.rb
@@ -108,8 +109,9 @@ files:
108
109
  - test/test_types.rb
109
110
  - test/types.rb
110
111
  - test/test_optional_field.rb
112
+ - test/test_repeated_types.rb
111
113
  has_rdoc: true
112
- homepage: http://github.com/macks/ruby-protobuf
114
+ homepage: http://code.google.com/p/ruby-protobuf
113
115
  post_install_message:
114
116
  rdoc_options:
115
117
  - --main
@@ -130,7 +132,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
130
132
  version:
131
133
  requirements: []
132
134
 
133
- rubyforge_project:
135
+ rubyforge_project: ruby-protobuf
134
136
  rubygems_version: 1.2.0
135
137
  signing_key:
136
138
  specification_version: 2
@@ -140,6 +142,7 @@ test_files:
140
142
  - test/test_ruby_protobuf.rb
141
143
  - test/test_message.rb
142
144
  - test/test_optional_field.rb
145
+ - test/test_repeated_types.rb
143
146
  - test/test_extension.rb
144
147
  - test/test_addressbook.rb
145
148
  - test/test_types.rb