ruby_protobuf 0.4.5 → 0.4.6
Sign up to get free protection for your applications and to get access to all the features.
- data/History.txt +9 -2
- data/VERSION +1 -1
- data/lib/protobuf/common/wire_type.rb +2 -0
- data/lib/protobuf/compiler/nodes.rb +6 -0
- data/lib/protobuf/compiler/proto.y +5 -2
- data/lib/protobuf/compiler/proto_parser.rb +385 -366
- data/lib/protobuf/message/decoder.rb +31 -16
- data/lib/protobuf/message/encoder.rb +1 -0
- data/lib/protobuf/message/field.rb +12 -37
- data/lib/protobuf/message/message.rb +37 -97
- data/test/proto/merge.pb.rb +6 -6
- data/test/proto/merge.proto +3 -3
- data/test/test_enum_value.rb +3 -2
- data/test/test_extension.rb +1 -1
- data/test/test_message.rb +30 -24
- data/test/test_packed_field.rb +5 -0
- metadata +24 -29
- data/test/proto/address_book_service.rb +0 -31
- data/test/proto/client_add.rb +0 -18
- data/test/proto/client_search.rb +0 -18
- data/test/proto/float_default.pb.rb +0 -28
- data/test/proto/rpc.pb.rb +0 -16
@@ -7,28 +7,43 @@ module Protobuf
|
|
7
7
|
|
8
8
|
module_function
|
9
9
|
|
10
|
+
READ_METHODS = [
|
11
|
+
:read_varint, # 0: Varint
|
12
|
+
:read_fixed64, # 1: 64 bit
|
13
|
+
:read_length_delimited, # 2: Length-delimited
|
14
|
+
:read_start_group, # 3: Start group
|
15
|
+
:read_end_group, # 4: End group
|
16
|
+
:read_fixed32, # 5: 32 bit
|
17
|
+
]
|
18
|
+
|
10
19
|
# Read bytes from +stream+ and pass to +message+ object.
|
11
20
|
def decode(stream, message)
|
12
21
|
until stream.eof?
|
13
22
|
tag, wire_type = read_key(stream)
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
23
|
+
field = message.get_field_by_tag(tag)
|
24
|
+
|
25
|
+
method = READ_METHODS[wire_type]
|
26
|
+
raise InvalidWireType, "Unknown wire type: #{wire_type}" unless method
|
27
|
+
value = send(method, stream)
|
28
|
+
|
29
|
+
if field.nil?
|
30
|
+
# ignore unknown field
|
31
|
+
elsif field.repeated?
|
32
|
+
array = message.__send__(field.name)
|
33
|
+
if wire_type == WireType::LENGTH_DELIMITED && WireType::PACKABLE_TYPES.include?(field.wire_type)
|
34
|
+
# packed
|
35
|
+
s = StringIO.new(value)
|
36
|
+
m = READ_METHODS[field.wire_type]
|
37
|
+
until s.eof?
|
38
|
+
array << field.decode(send(m, s))
|
39
|
+
end
|
28
40
|
else
|
29
|
-
|
41
|
+
# non-packed
|
42
|
+
array << field.decode(value)
|
30
43
|
end
|
31
|
-
|
44
|
+
else
|
45
|
+
message.__send__("#{field.name}=", field.decode(value))
|
46
|
+
end
|
32
47
|
end
|
33
48
|
message
|
34
49
|
end
|
@@ -36,7 +36,7 @@ module Protobuf
|
|
36
36
|
nil
|
37
37
|
end
|
38
38
|
|
39
|
-
attr_reader :message_class, :rule, :type, :name, :tag, :default
|
39
|
+
attr_reader :message_class, :rule, :type, :name, :tag, :default, :extension
|
40
40
|
attr_reader :default_value
|
41
41
|
|
42
42
|
def descriptor
|
@@ -53,7 +53,7 @@ module Protobuf
|
|
53
53
|
unless options.empty?
|
54
54
|
warn "WARNING: Invalid options: #{options.inspect} (in #{@message_class.name.split('::').last}.#{@name})"
|
55
55
|
end
|
56
|
-
if packed? && !
|
56
|
+
if packed? && ! WireType::PACKABLE_TYPES.include?(wire_type)
|
57
57
|
raise "Can't use packed encoding for `#{@type}' type"
|
58
58
|
end
|
59
59
|
|
@@ -70,7 +70,7 @@ module Protobuf
|
|
70
70
|
define_accessor
|
71
71
|
end
|
72
72
|
|
73
|
-
def ready?
|
73
|
+
def ready? # :nodoc:
|
74
74
|
true
|
75
75
|
end
|
76
76
|
|
@@ -86,30 +86,6 @@ module Protobuf
|
|
86
86
|
end
|
87
87
|
end
|
88
88
|
|
89
|
-
# Decode +bytes+ and pass to +message_instance+.
|
90
|
-
def set(message_instance, bytes)
|
91
|
-
if packed?
|
92
|
-
array = message_instance.__send__(@name)
|
93
|
-
method = \
|
94
|
-
case wire_type
|
95
|
-
when WireType::FIXED32 then :read_fixed32
|
96
|
-
when WireType::FIXED64 then :read_fixed64
|
97
|
-
when WireType::VARINT then :read_varint
|
98
|
-
end
|
99
|
-
stream = StringIO.new(bytes)
|
100
|
-
until stream.eof?
|
101
|
-
array << decode(Decoder.__send__(method, stream))
|
102
|
-
end
|
103
|
-
else
|
104
|
-
value = decode(bytes)
|
105
|
-
if repeated?
|
106
|
-
message_instance.__send__(@name) << value
|
107
|
-
else
|
108
|
-
message_instance.__send__("#{@name}=", value)
|
109
|
-
end
|
110
|
-
end
|
111
|
-
end
|
112
|
-
|
113
89
|
# Decode +bytes+ and return a field value.
|
114
90
|
def decode(bytes)
|
115
91
|
raise NotImplementedError, "#{self.class.name}\#decode"
|
@@ -146,7 +122,7 @@ module Protobuf
|
|
146
122
|
|
147
123
|
# Is this a packed repeated field?
|
148
124
|
def packed?
|
149
|
-
|
125
|
+
@packed
|
150
126
|
end
|
151
127
|
|
152
128
|
# Upper limit for this field.
|
@@ -240,7 +216,7 @@ module Protobuf
|
|
240
216
|
message_class, rule, type, name, tag, options
|
241
217
|
end
|
242
218
|
|
243
|
-
def ready?
|
219
|
+
def ready? # :nodoc:
|
244
220
|
false
|
245
221
|
end
|
246
222
|
|
@@ -338,7 +314,6 @@ module Protobuf
|
|
338
314
|
end
|
339
315
|
|
340
316
|
def decode(bytes)
|
341
|
-
bytes.force_encoding(Encoding::ASCII_8BIT) if bytes.respond_to?(:force_encoding)
|
342
317
|
bytes
|
343
318
|
end
|
344
319
|
|
@@ -346,7 +321,7 @@ module Protobuf
|
|
346
321
|
if value.respond_to?(:force_encoding)
|
347
322
|
# Ruby 1.9
|
348
323
|
result = VarintField.encode(value.bytesize)
|
349
|
-
result << value.dup.force_encoding(Encoding::
|
324
|
+
result << value.dup.force_encoding(Encoding::BINARY)
|
350
325
|
else
|
351
326
|
# Ruby 1.8
|
352
327
|
result = VarintField.encode(value.size)
|
@@ -592,7 +567,7 @@ module Protobuf
|
|
592
567
|
end
|
593
568
|
|
594
569
|
def decode(value)
|
595
|
-
value
|
570
|
+
value != 0
|
596
571
|
end
|
597
572
|
|
598
573
|
def encode(value)
|
@@ -652,7 +627,7 @@ module Protobuf
|
|
652
627
|
class EnumField < VarintField
|
653
628
|
def acceptable?(val)
|
654
629
|
case val
|
655
|
-
when Symbol
|
630
|
+
when Symbol, String
|
656
631
|
raise TypeError unless @type.const_defined?(val)
|
657
632
|
when EnumValue
|
658
633
|
raise TypeError if val.parent_class != @type
|
@@ -683,9 +658,9 @@ module Protobuf
|
|
683
658
|
if val.nil?
|
684
659
|
@values.delete(field.name)
|
685
660
|
else
|
686
|
-
|
661
|
+
enum_value = \
|
687
662
|
case val
|
688
|
-
when Symbol
|
663
|
+
when Symbol, String
|
689
664
|
field.type.const_get(val) rescue nil
|
690
665
|
when Integer
|
691
666
|
field.type.const_get(field.type.name_by_value(val)) rescue nil
|
@@ -693,9 +668,9 @@ module Protobuf
|
|
693
668
|
raise TypeError, "Invalid value: #{val.inspect}" if val.parent_class != field.type
|
694
669
|
val
|
695
670
|
end
|
696
|
-
raise TypeError, "Invalid value: #{val.inspect}" unless
|
671
|
+
raise TypeError, "Invalid value: #{val.inspect}" unless enum_value
|
697
672
|
|
698
|
-
@values[field.name] =
|
673
|
+
@values[field.name] = enum_value
|
699
674
|
end
|
700
675
|
end
|
701
676
|
end
|
@@ -1,4 +1,3 @@
|
|
1
|
-
require 'pp'
|
2
1
|
require 'stringio'
|
3
2
|
require 'protobuf/descriptor/descriptor'
|
4
3
|
require 'protobuf/message/decoder'
|
@@ -11,27 +10,12 @@ module Protobuf
|
|
11
10
|
|
12
11
|
class Message
|
13
12
|
|
14
|
-
class ExtensionFields < Hash
|
15
|
-
def initialize(key_range=0..-1)
|
16
|
-
@key_range = key_range
|
17
|
-
end
|
18
|
-
|
19
|
-
def []=(key, value)
|
20
|
-
raise RangeError, "#{key} is not in #{@key_range}" unless @key_range.include?(key)
|
21
|
-
super
|
22
|
-
end
|
23
|
-
|
24
|
-
def include_tag?(tag)
|
25
|
-
@key_range.include?(tag)
|
26
|
-
end
|
27
|
-
end
|
28
|
-
|
29
13
|
class <<self
|
30
14
|
include Protoable
|
31
15
|
|
32
16
|
# Reserve field numbers for extensions. Don't use this method directly.
|
33
17
|
def extensions(range)
|
34
|
-
@
|
18
|
+
@extension_tag = range
|
35
19
|
end
|
36
20
|
|
37
21
|
# Define a required field. Don't use this method directly.
|
@@ -51,15 +35,18 @@ module Protobuf
|
|
51
35
|
|
52
36
|
# Define a field. Don't use this method directly.
|
53
37
|
def define_field(rule, type, fname, tag, options)
|
54
|
-
|
55
|
-
|
56
|
-
|
38
|
+
if options[:extension] && ! extension_tag?(tag)
|
39
|
+
raise RangeError, "#{tag} is not in #{@extension_tag}"
|
40
|
+
end
|
41
|
+
|
42
|
+
if fields.include?(tag)
|
43
|
+
raise TagCollisionError, "Field tag #{tag} has already been used."
|
57
44
|
end
|
58
|
-
|
45
|
+
fields[tag] = Field.build(self, rule, type, fname, tag, options)
|
59
46
|
end
|
60
47
|
|
61
48
|
def extension_tag?(tag)
|
62
|
-
|
49
|
+
@extension_tag.include?(tag)
|
63
50
|
end
|
64
51
|
|
65
52
|
# A collection of field object.
|
@@ -67,11 +54,6 @@ module Protobuf
|
|
67
54
|
@fields ||= {}
|
68
55
|
end
|
69
56
|
|
70
|
-
# An extension field object.
|
71
|
-
def extension_fields
|
72
|
-
@extension_fields ||= ExtensionFields.new
|
73
|
-
end
|
74
|
-
|
75
57
|
# Find a field object by +name+.
|
76
58
|
def get_field_by_name(name)
|
77
59
|
name = name.to_sym
|
@@ -92,26 +74,6 @@ module Protobuf
|
|
92
74
|
end
|
93
75
|
end
|
94
76
|
|
95
|
-
#TODO merge to get_field_by_name
|
96
|
-
def get_ext_field_by_name(name)
|
97
|
-
name = name.to_sym
|
98
|
-
extension_fields.values.find {|field| field.name == name}
|
99
|
-
end
|
100
|
-
|
101
|
-
#TODO merge to get_field_by_tag
|
102
|
-
def get_ext_field_by_tag(tag)
|
103
|
-
extension_fields[tag]
|
104
|
-
end
|
105
|
-
|
106
|
-
#TODO merge to get_field
|
107
|
-
def get_ext_field(tag_or_name)
|
108
|
-
case tag_or_name
|
109
|
-
when Integer then get_ext_field_by_tag(tag_or_name)
|
110
|
-
when String, Symbol then get_ext_field_by_name(tag_or_name)
|
111
|
-
else raise TypeError, tag_or_name.class
|
112
|
-
end
|
113
|
-
end
|
114
|
-
|
115
77
|
def descriptor
|
116
78
|
@descriptor ||= Descriptor::Descriptor.new(self)
|
117
79
|
end
|
@@ -120,7 +82,7 @@ module Protobuf
|
|
120
82
|
def initialize(values={})
|
121
83
|
@values = {}
|
122
84
|
|
123
|
-
self.class.fields.
|
85
|
+
self.class.fields.dup.each do |tag, field|
|
124
86
|
unless field.ready?
|
125
87
|
field = field.setup
|
126
88
|
self.class.fields[tag] = field
|
@@ -130,27 +92,15 @@ module Protobuf
|
|
130
92
|
end
|
131
93
|
end
|
132
94
|
|
133
|
-
#
|
134
|
-
self.class.extension_fields.to_a.each do |tag, field|
|
135
|
-
unless field.ready?
|
136
|
-
field = field.setup
|
137
|
-
self.class.extension_fields[tag] = field
|
138
|
-
end
|
139
|
-
if field.repeated?
|
140
|
-
@values[field.name] = Field::FieldArray.new(field)
|
141
|
-
end
|
142
|
-
end
|
143
|
-
|
144
|
-
values.each {|tag, val| self[tag] = val}
|
95
|
+
values.each {|name, val| self.__send__("#{name}=", val)}
|
145
96
|
end
|
146
97
|
|
147
98
|
def initialized?
|
148
|
-
fields.all? {|tag, field| field.initialized?(self) }
|
149
|
-
extension_fields.all? {|tag, field| field.initialized?(self) }
|
99
|
+
fields.all? {|tag, field| field.initialized?(self) }
|
150
100
|
end
|
151
101
|
|
152
102
|
def has_field?(tag_or_name)
|
153
|
-
field = get_field(tag_or_name)
|
103
|
+
field = get_field(tag_or_name)
|
154
104
|
raise ArgumentError, "unknown field: #{tag_or_name.inspect}" unless field
|
155
105
|
@values.has_key?(field.name)
|
156
106
|
end
|
@@ -263,7 +213,7 @@ module Protobuf
|
|
263
213
|
io = StringIO.new(string)
|
264
214
|
serialize_to(io)
|
265
215
|
result = io.string
|
266
|
-
result.force_encoding(Encoding::
|
216
|
+
result.force_encoding(Encoding::BINARY) if result.respond_to?(:force_encoding)
|
267
217
|
result
|
268
218
|
end
|
269
219
|
alias to_s serialize_to_string
|
@@ -283,23 +233,11 @@ module Protobuf
|
|
283
233
|
end
|
284
234
|
|
285
235
|
def merge_from(message)
|
286
|
-
|
287
|
-
fields.each {|tag, field| merge_field(tag, message.__send__(field.name))}
|
288
|
-
extension_fields.each {|tag, field| merge_field(tag, message.__send__(field.name))}
|
289
|
-
end
|
290
|
-
|
291
|
-
def set_field(tag, bytes)
|
292
|
-
field = (get_field_by_tag(tag) || get_ext_field_by_tag(tag))
|
293
|
-
field.set(self, bytes) if field
|
294
|
-
end
|
295
|
-
|
296
|
-
def merge_field(tag, value)
|
297
|
-
#get_field_by_tag(tag).merge self, bytes #TODO
|
298
|
-
(get_field_by_tag(tag) || get_ext_field_by_tag(tag)).merge(self, value)
|
236
|
+
fields.each {|tag, field| field.merge(self, message.__send__(field.name))}
|
299
237
|
end
|
300
238
|
|
301
239
|
def [](tag_or_name)
|
302
|
-
if field = get_field(tag_or_name)
|
240
|
+
if field = get_field(tag_or_name)
|
303
241
|
__send__(field.name)
|
304
242
|
else
|
305
243
|
raise NoMethodError, "No such field: #{tag_or_name.inspect}"
|
@@ -307,7 +245,7 @@ module Protobuf
|
|
307
245
|
end
|
308
246
|
|
309
247
|
def []=(tag_or_name, value)
|
310
|
-
if field = get_field(tag_or_name)
|
248
|
+
if field = get_field(tag_or_name)
|
311
249
|
__send__("#{field.name}=", value)
|
312
250
|
else
|
313
251
|
raise NoMethodError, "No such field: #{tag_or_name.inspect}"
|
@@ -334,32 +272,34 @@ module Protobuf
|
|
334
272
|
self.class.get_field(tag_or_name)
|
335
273
|
end
|
336
274
|
|
337
|
-
# Returns extension fields. See Message#fields method.
|
338
|
-
def extension_fields
|
339
|
-
self.class.extension_fields
|
340
|
-
end
|
341
|
-
|
342
|
-
def get_ext_field_by_name(name) # :nodoc:
|
343
|
-
self.class.get_ext_field_by_name(name)
|
344
|
-
end
|
345
|
-
|
346
|
-
def get_ext_field_by_tag(tag) # :nodoc:
|
347
|
-
self.class.get_ext_field_by_tag(tag)
|
348
|
-
end
|
349
|
-
|
350
|
-
def get_ext_field(tag_or_name) # :nodoc:
|
351
|
-
self.class.get_ext_field(tag_or_name)
|
352
|
-
end
|
353
|
-
|
354
275
|
# Iterate over a field collection.
|
355
276
|
# message.each_field do |field_object, value|
|
356
277
|
# # do something
|
357
278
|
# end
|
358
279
|
def each_field
|
359
|
-
fields.
|
280
|
+
@sorted_fields ||= fields.sort_by {|tag, _| tag}
|
281
|
+
@sorted_fields.each do |_, field|
|
360
282
|
value = __send__(field.name)
|
361
283
|
yield(field, value)
|
362
284
|
end
|
363
285
|
end
|
286
|
+
|
287
|
+
def to_hash
|
288
|
+
hash = {}
|
289
|
+
each_field do |field, value|
|
290
|
+
next unless has_field?(field.tag)
|
291
|
+
case value
|
292
|
+
when Array
|
293
|
+
next if value.empty?
|
294
|
+
hash[field.name] = value.map {|val| val.is_a?(Message) ? val.to_hash : val}
|
295
|
+
when Message
|
296
|
+
hash[field.name] = value.to_hash
|
297
|
+
else
|
298
|
+
hash[field.name] = value
|
299
|
+
end
|
300
|
+
end
|
301
|
+
hash
|
302
|
+
end
|
303
|
+
|
364
304
|
end
|
365
305
|
end
|
data/test/proto/merge.pb.rb
CHANGED
@@ -8,12 +8,12 @@
|
|
8
8
|
# }
|
9
9
|
# message InnerMessage2 {
|
10
10
|
# required string name = 1;
|
11
|
-
# repeated InnerMessage1
|
11
|
+
# repeated InnerMessage1 repeated_message = 2;
|
12
12
|
# }
|
13
13
|
#
|
14
14
|
# required string name = 1;
|
15
|
-
# repeated InnerMessage1
|
16
|
-
# required InnerMessage2
|
15
|
+
# repeated InnerMessage1 repeated_message = 2;
|
16
|
+
# required InnerMessage2 required_message = 3;
|
17
17
|
# }
|
18
18
|
|
19
19
|
require 'protobuf/message/message'
|
@@ -31,10 +31,10 @@ module Test
|
|
31
31
|
class InnerMessage2 < ::Protobuf::Message
|
32
32
|
defined_in __FILE__
|
33
33
|
required :string, :name, 1
|
34
|
-
repeated :InnerMessage1, :
|
34
|
+
repeated :InnerMessage1, :repeated_message, 2
|
35
35
|
end
|
36
36
|
required :string, :name, 1
|
37
|
-
repeated :InnerMessage1, :
|
38
|
-
required :InnerMessage2, :
|
37
|
+
repeated :InnerMessage1, :repeated_message, 2
|
38
|
+
required :InnerMessage2, :required_message, 3
|
39
39
|
end
|
40
40
|
end
|
data/test/proto/merge.proto
CHANGED
@@ -6,10 +6,10 @@ message MergeMessage {
|
|
6
6
|
}
|
7
7
|
message InnerMessage2 {
|
8
8
|
required string name = 1;
|
9
|
-
repeated InnerMessage1
|
9
|
+
repeated InnerMessage1 repeated_message = 2;
|
10
10
|
}
|
11
11
|
|
12
12
|
required string name = 1;
|
13
|
-
repeated InnerMessage1
|
14
|
-
required InnerMessage2
|
13
|
+
repeated InnerMessage1 repeated_message = 2;
|
14
|
+
required InnerMessage2 required_message = 3;
|
15
15
|
}
|
data/test/test_enum_value.rb
CHANGED
@@ -30,9 +30,10 @@ class EnumValueTest < Test::Unit::TestCase
|
|
30
30
|
assert_equal(1, phone_number.type)
|
31
31
|
|
32
32
|
phone_number.type = :HOME
|
33
|
-
assert_kind_of(Protobuf::EnumValue, phone_number.type)
|
34
33
|
assert_equal(Tutorial::Person::PhoneType::HOME, phone_number.type)
|
35
|
-
|
34
|
+
|
35
|
+
phone_number.type = 'HOME'
|
36
|
+
assert_equal(Tutorial::Person::PhoneType::HOME, phone_number.type)
|
36
37
|
|
37
38
|
assert_raise(TypeError) do
|
38
39
|
phone_number.type = TutorialExt::Person::PhoneType::HOME
|
data/test/test_extension.rb
CHANGED
@@ -3,8 +3,8 @@ require 'test/proto/addressbook_ext.pb'
|
|
3
3
|
|
4
4
|
class ExtensionTest < Test::Unit::TestCase
|
5
5
|
def test_accessor
|
6
|
-
assert(TutorialExt::Person.extension_fields.to_a.map{|t, f| f.name}.include?(:age))
|
7
6
|
person = TutorialExt::Person.new
|
7
|
+
assert(TutorialExt::Person.get_field(:age).extension)
|
8
8
|
assert_nothing_raised {person.age = 100}
|
9
9
|
assert_equal(100, person.age)
|
10
10
|
end
|
data/test/test_message.rb
CHANGED
@@ -32,26 +32,32 @@ class MessageTest < Test::Unit::TestCase
|
|
32
32
|
end
|
33
33
|
|
34
34
|
def test_initialize_with_hash
|
35
|
-
|
35
|
+
hash = { :name => 'Jiro', :id => 300, :email => 'jiro@ema.il' }
|
36
|
+
person = Tutorial::Person.new(hash)
|
36
37
|
assert_equal('Jiro', person.name)
|
37
38
|
assert_equal(300, person.id)
|
38
39
|
assert_equal('jiro@ema.il', person.email)
|
40
|
+
assert_equal(hash, person.to_hash)
|
39
41
|
|
40
42
|
# initialize with array of hash
|
41
|
-
|
43
|
+
hash = { :phone => [{:number => 'phone1'}, {:number => 'phone2'}] }
|
44
|
+
person = Tutorial::Person.new(hash)
|
42
45
|
assert_equal('phone1', person.phone[0].number)
|
43
46
|
assert_equal('phone2', person.phone[1].number)
|
47
|
+
assert_equal(hash, person.to_hash)
|
44
48
|
|
45
49
|
# initalize with hash in hash
|
46
|
-
|
47
|
-
|
48
|
-
assert_equal('
|
49
|
-
|
50
|
-
message.
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
assert_equal(
|
50
|
+
hash = { :required_message => { :name => 'name1', :repeated_message => [{:name => 'name2'}] } }
|
51
|
+
message = Test::MergeMessage.new(hash)
|
52
|
+
assert_equal('name1', message.required_message.name)
|
53
|
+
assert_equal('name2', message.required_message.repeated_message[0].name)
|
54
|
+
assert_equal(hash, message.to_hash)
|
55
|
+
|
56
|
+
message.required_message = { :name => 'name21' }
|
57
|
+
message.required_message.repeated_message = [ {:name => 'name22'} ]
|
58
|
+
assert_equal('name21', message.required_message.name)
|
59
|
+
assert_equal('name22', message.required_message.repeated_message[0].name)
|
60
|
+
assert_equal(1, message.required_message.repeated_message.size)
|
55
61
|
end
|
56
62
|
|
57
63
|
def test_defined_filenames
|
@@ -106,23 +112,23 @@ message AddressBook {
|
|
106
112
|
|
107
113
|
def test_merge_field
|
108
114
|
inner_message1_2 = Test::MergeMessage::InnerMessage2.new(:name => 'name12')
|
109
|
-
inner_message1_2.
|
110
|
-
message1 = Test::MergeMessage.new(:name => 'name1', :
|
111
|
-
message1.
|
115
|
+
inner_message1_2.repeated_message << Test::MergeMessage::InnerMessage1.new(:name => 'name121')
|
116
|
+
message1 = Test::MergeMessage.new(:name => 'name1', :required_message => inner_message1_2)
|
117
|
+
message1.repeated_message << Test::MergeMessage::InnerMessage1.new(:name => 'name11')
|
112
118
|
|
113
119
|
inner_message2_2 = Test::MergeMessage::InnerMessage2.new(:name => 'name22')
|
114
|
-
inner_message2_2.
|
115
|
-
message2 = Test::MergeMessage.new(:name => 'name2', :
|
116
|
-
message2.
|
120
|
+
inner_message2_2.repeated_message << Test::MergeMessage::InnerMessage1.new(:name => 'name221')
|
121
|
+
message2 = Test::MergeMessage.new(:name => 'name2', :required_message => inner_message2_2)
|
122
|
+
message2.repeated_message << Test::MergeMessage::InnerMessage1.new(:name => 'name21')
|
117
123
|
|
118
124
|
message1.merge_from(message2)
|
119
125
|
assert_equal('name2', message1.name)
|
120
|
-
assert_equal(2, message1.
|
121
|
-
assert_equal('name11', message1.
|
122
|
-
assert_equal('name21', message1.
|
123
|
-
assert_equal('name22', message1.
|
124
|
-
assert_equal(2, message1.
|
125
|
-
assert_equal('name121', message1.
|
126
|
-
assert_equal('name221', message1.
|
126
|
+
assert_equal(2, message1.repeated_message.size)
|
127
|
+
assert_equal('name11', message1.repeated_message[0].name)
|
128
|
+
assert_equal('name21', message1.repeated_message[1].name)
|
129
|
+
assert_equal('name22', message1.required_message.name)
|
130
|
+
assert_equal(2, message1.required_message.repeated_message.size)
|
131
|
+
assert_equal('name121', message1.required_message.repeated_message[0].name)
|
132
|
+
assert_equal('name221', message1.required_message.repeated_message[1].name)
|
127
133
|
end
|
128
134
|
end
|
data/test/test_packed_field.rb
CHANGED
metadata
CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
|
|
5
5
|
segments:
|
6
6
|
- 0
|
7
7
|
- 4
|
8
|
-
-
|
9
|
-
version: 0.4.
|
8
|
+
- 6
|
9
|
+
version: 0.4.6
|
10
10
|
platform: ruby
|
11
11
|
authors:
|
12
12
|
- MATSUYAMA Kengo
|
@@ -14,7 +14,7 @@ autorequire:
|
|
14
14
|
bindir: bin
|
15
15
|
cert_chain: []
|
16
16
|
|
17
|
-
date: 2010-
|
17
|
+
date: 2010-09-12 00:00:00 +09:00
|
18
18
|
default_executable: rprotoc
|
19
19
|
dependencies: []
|
20
20
|
|
@@ -147,38 +147,33 @@ signing_key:
|
|
147
147
|
specification_version: 3
|
148
148
|
summary: Protocol Buffers for Ruby
|
149
149
|
test_files:
|
150
|
+
- test/check_unbuild.rb
|
151
|
+
- test/test_descriptor.rb
|
152
|
+
- test/test_optional_field.rb
|
153
|
+
- test/proto/merge.pb.rb
|
154
|
+
- test/proto/ext_collision.pb.rb
|
155
|
+
- test/proto/lowercase.pb.rb
|
156
|
+
- test/proto/addressbook_base.pb.rb
|
150
157
|
- test/proto/packed.pb.rb
|
151
|
-
- test/proto/
|
158
|
+
- test/proto/optional_field.pb.rb
|
152
159
|
- test/proto/addressbook.pb.rb
|
153
|
-
- test/proto/
|
160
|
+
- test/proto/addressbook_ext.pb.rb
|
154
161
|
- test/proto/nested.pb.rb
|
155
|
-
- test/proto/
|
156
|
-
- test/proto/
|
157
|
-
- test/proto/rpc.pb.rb
|
158
|
-
- test/proto/address_book_service.rb
|
162
|
+
- test/proto/ext_range.pb.rb
|
163
|
+
- test/proto/types.pb.rb
|
159
164
|
- test/proto/collision.pb.rb
|
160
|
-
- test/proto/optional_field.pb.rb
|
161
|
-
- test/proto/merge.pb.rb
|
162
|
-
- test/proto/addressbook_ext.pb.rb
|
163
|
-
- test/proto/client_add.rb
|
164
|
-
- test/proto/float_default.pb.rb
|
165
|
-
- test/proto/lowercase.pb.rb
|
166
|
-
- test/proto/ext_collision.pb.rb
|
167
|
-
- test/test_compiler.rb
|
168
|
-
- test/test_parse.rb
|
169
|
-
- test/test_addressbook.rb
|
170
|
-
- test/test_extension.rb
|
171
|
-
- test/test_lowercase.rb
|
172
|
-
- test/test_standard_message.rb
|
173
165
|
- test/test_enum_value.rb
|
174
|
-
- test/test_message.rb
|
175
|
-
- test/test_types.rb
|
176
166
|
- test/test_repeated_types.rb
|
177
|
-
- test/
|
178
|
-
- test/
|
179
|
-
- test/test_packed_field.rb
|
167
|
+
- test/test_types.rb
|
168
|
+
- test/test_extension.rb
|
180
169
|
- test/test_serialize.rb
|
181
|
-
- test/
|
182
|
-
-
|
170
|
+
- test/test_standard_message.rb
|
171
|
+
- test/test_packed_field.rb
|
172
|
+
- test/test_lowercase.rb
|
173
|
+
- test/test_compiler.rb
|
174
|
+
- test/test_message.rb
|
175
|
+
- test/test_parse.rb
|
176
|
+
- test/test_addressbook.rb
|
183
177
|
- examples/writing_a_message.rb
|
184
178
|
- examples/reading_a_message.rb
|
179
|
+
- examples/addressbook.pb.rb
|