ruby_protobuf 0.4.5 → 0.4.6
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/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
|