ruby_protobuf 0.1.0 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- data/History.txt +5 -3
- data/Manifest.txt +20 -11
- data/README.txt +1 -1
- data/lib/protobuf/{wire_type.rb → common/wire_type.rb} +0 -0
- data/lib/protobuf/{compiler.rb → compiler/compiler.rb} +13 -13
- data/lib/protobuf/{parser.y → compiler/parser.y} +0 -0
- data/lib/protobuf/descriptor/descriptor.proto +286 -0
- data/lib/protobuf/descriptor/descriptor.rb +54 -0
- data/lib/protobuf/descriptor/descriptor_builder.rb +144 -0
- data/lib/protobuf/descriptor/descriptor_proto.rb +119 -0
- data/lib/protobuf/descriptor/enum_descriptor.rb +33 -0
- data/lib/protobuf/descriptor/field_descriptor.rb +50 -0
- data/lib/protobuf/descriptor/file_descriptor.rb +38 -0
- data/lib/protobuf/{decoder.rb → message/decoder.rb} +1 -1
- data/lib/protobuf/{encoder.rb → message/encoder.rb} +12 -11
- data/lib/protobuf/message/enum.rb +21 -0
- data/lib/protobuf/{extend.rb → message/extend.rb} +1 -1
- data/lib/protobuf/{field.rb → message/field.rb} +82 -53
- data/lib/protobuf/{message.rb → message/message.rb} +12 -3
- data/lib/protobuf/message/service.rb +9 -0
- data/lib/ruby_protobuf.rb +1 -1
- data/test/addressbook.rb +22 -4
- data/test/check_unbuild.rb +30 -0
- data/test/data/data2.bin +3 -0
- data/test/test_addressbook.rb +2 -2
- data/test/test_compiler.rb +9 -9
- data/test/test_descriptor.rb +122 -0
- data/test/test_message.rb +2 -2
- data/test/types.rb +1 -1
- metadata +23 -14
- data/bin/ruby_protobuf +0 -0
- data/lib/protobuf/enum.rb +0 -13
- data/lib/protobuf/service.rb +0 -7
data/History.txt
CHANGED
@@ -1,6 +1,8 @@
|
|
1
|
-
=== 0.
|
1
|
+
=== 0.2.0 / 2008-08-05
|
2
2
|
|
3
|
-
* 2
|
4
|
-
*
|
3
|
+
* 0.2.0 introduce descriptor (rev.75)
|
4
|
+
* Message structures can be restored from encoded data by means a descriptor object
|
5
|
+
* 0.1.0 fixed a small bug
|
6
|
+
* 0.0.1 major enhancement
|
5
7
|
* Birthday!
|
6
8
|
|
data/Manifest.txt
CHANGED
@@ -3,26 +3,35 @@ Manifest.txt
|
|
3
3
|
README.txt
|
4
4
|
Rakefile
|
5
5
|
bin/rprotoc
|
6
|
-
|
7
|
-
lib/protobuf/compiler.rb
|
8
|
-
lib/protobuf/
|
9
|
-
lib/protobuf/
|
10
|
-
lib/protobuf/
|
11
|
-
lib/protobuf/
|
12
|
-
lib/protobuf/
|
13
|
-
lib/protobuf/
|
14
|
-
lib/protobuf/
|
15
|
-
lib/protobuf/
|
16
|
-
lib/protobuf/
|
6
|
+
lib/protobuf/common/wire_type.rb
|
7
|
+
lib/protobuf/compiler/compiler.rb
|
8
|
+
lib/protobuf/compiler/parser.y
|
9
|
+
lib/protobuf/descriptor/descriptor.proto
|
10
|
+
lib/protobuf/descriptor/descriptor.rb
|
11
|
+
lib/protobuf/descriptor/descriptor_builder.rb
|
12
|
+
lib/protobuf/descriptor/descriptor_proto.rb
|
13
|
+
lib/protobuf/descriptor/enum_descriptor.rb
|
14
|
+
lib/protobuf/descriptor/field_descriptor.rb
|
15
|
+
lib/protobuf/descriptor/file_descriptor.rb
|
16
|
+
lib/protobuf/message/decoder.rb
|
17
|
+
lib/protobuf/message/encoder.rb
|
18
|
+
lib/protobuf/message/enum.rb
|
19
|
+
lib/protobuf/message/extend.rb
|
20
|
+
lib/protobuf/message/field.rb
|
21
|
+
lib/protobuf/message/message.rb
|
22
|
+
lib/protobuf/message/service.rb
|
17
23
|
lib/ruby_protobuf.rb
|
18
24
|
test/addressbook.proto
|
19
25
|
test/addressbook.rb
|
26
|
+
test/check_unbuild.rb
|
20
27
|
test/data/data.bin
|
28
|
+
test/data/data2.bin
|
21
29
|
test/data/data_source.py
|
22
30
|
test/data/types.bin
|
23
31
|
test/data/types_source.py
|
24
32
|
test/test_addressbook.rb
|
25
33
|
test/test_compiler.rb
|
34
|
+
test/test_descriptor.rb
|
26
35
|
test/test_message.rb
|
27
36
|
test/test_parse.rb
|
28
37
|
test/test_ruby_protobuf.rb
|
data/README.txt
CHANGED
File without changes
|
@@ -12,10 +12,10 @@ module Protobuf
|
|
12
12
|
def initialize
|
13
13
|
@indent_level = 0
|
14
14
|
@ret = <<-eos
|
15
|
-
require 'protobuf/message'
|
16
|
-
require 'protobuf/enum'
|
17
|
-
require 'protobuf/service'
|
18
|
-
require 'protobuf/extend'
|
15
|
+
require 'protobuf/message/message'
|
16
|
+
require 'protobuf/message/enum'
|
17
|
+
require 'protobuf/message/service'
|
18
|
+
require 'protobuf/message/extend'
|
19
19
|
|
20
20
|
eos
|
21
21
|
end
|
@@ -33,7 +33,7 @@ require 'protobuf/extend'
|
|
33
33
|
def compile(filename)
|
34
34
|
File.open filename, 'r' do |file|
|
35
35
|
file.each_line do |line|
|
36
|
-
line.sub!
|
36
|
+
line.sub!(/^(.*)\/\/.*/, '\1')
|
37
37
|
line.strip!
|
38
38
|
case line
|
39
39
|
when /^package\s+(\w+(\.\w+)?)\s*;$/
|
@@ -42,7 +42,7 @@ require 'protobuf/extend'
|
|
42
42
|
@indent_level += 1
|
43
43
|
end
|
44
44
|
when /^message\s+(\w+)\s*\{$/
|
45
|
-
putswi "class #{$1} < Protobuf::Message"
|
45
|
+
putswi "class #{$1} < ::Protobuf::Message"
|
46
46
|
@indent_level += 1
|
47
47
|
when /^(required|optional|repeated)\s+(\w+(\.\w+)?)\s+(\w+)\s*=\s*(\d+)\s*(\[\s*default\s*=\s*(\w+)\s*\])?\s*;$/
|
48
48
|
rule, type, name, tag, default = $1, $2, $4, $5, $7
|
@@ -53,26 +53,26 @@ require 'protobuf/extend'
|
|
53
53
|
end
|
54
54
|
putswi "#{rule} :#{type}, :#{name}, #{tag}#{default}"
|
55
55
|
when /^enum\s+(\w+)\s*\{$/
|
56
|
-
putswi "class #{$1} < Protobuf::Enum"
|
56
|
+
putswi "class #{$1} < ::Protobuf::Enum"
|
57
57
|
@indent_level += 1
|
58
58
|
when /^(\w+)\s*=\s*(\w+)\s*;$/
|
59
59
|
putswi "#{$1} = #{$2}"
|
60
60
|
when /^extensions\s+(\w+)\s+to\s+(\w+)\s*;/
|
61
61
|
low, high = $1, $2
|
62
|
-
low = 'Protobuf::Extend.MIN' if low == 'min'
|
63
|
-
high = 'Protobuf::Extend.MAX' if high == 'max'
|
62
|
+
low = '::Protobuf::Extend.MIN' if low == 'min'
|
63
|
+
high = '::Protobuf::Extend.MAX' if high == 'max'
|
64
64
|
putswi "extensions #{min}..#{max}"
|
65
65
|
when /^extend\s+(\w+)\s*\{/
|
66
|
-
putswi "class #{$1} < Protobuf::Extend"
|
66
|
+
putswi "class #{$1} < ::Protobuf::Extend"
|
67
67
|
@indent_level += 1
|
68
68
|
when /^service\s+(\w+)\s*\{/
|
69
|
-
putswi "class #{$1} < Protobuf::Service"
|
69
|
+
putswi "class #{$1} < ::Protobuf::Service"
|
70
70
|
@indent_level += 1
|
71
71
|
when /^rpc\s+(\w+)\s+\(\s*(\w+)\s*\)\s+returns\s+\(\s*(\w+)\s*\)\s*;/
|
72
72
|
putswi "rpc :#{$1} => :#{$2}, :#{$3} => :#{$4}"
|
73
73
|
when /^option\s+(\w+)\s*=\s*(.+)\s*;/
|
74
|
-
putswi "Protobuf::OPTIONS[:#{$1}] = :#{$2}"
|
75
|
-
when /^\}
|
74
|
+
putswi "::Protobuf::OPTIONS[:#{$1}] = :#{$2}"
|
75
|
+
when /^\}\s*;?$/
|
76
76
|
@indent_level -= 1
|
77
77
|
putswi "end"
|
78
78
|
when ''
|
File without changes
|
@@ -0,0 +1,286 @@
|
|
1
|
+
// Protocol Buffers - Google's data interchange format
|
2
|
+
// Copyright 2008 Google Inc.
|
3
|
+
// http://code.google.com/p/protobuf/
|
4
|
+
//
|
5
|
+
// Licensed under the Apache License, Version 2.0 (the "License");
|
6
|
+
// you may not use this file except in compliance with the License.
|
7
|
+
// You may obtain a copy of the License at
|
8
|
+
//
|
9
|
+
// http://www.apache.org/licenses/LICENSE-2.0
|
10
|
+
//
|
11
|
+
// Unless required by applicable law or agreed to in writing, software
|
12
|
+
// distributed under the License is distributed on an "AS IS" BASIS,
|
13
|
+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14
|
+
// See the License for the specific language governing permissions and
|
15
|
+
// limitations under the License.
|
16
|
+
|
17
|
+
// Author: kenton@google.com (Kenton Varda)
|
18
|
+
// Based on original Protocol Buffers design by
|
19
|
+
// Sanjay Ghemawat, Jeff Dean, and others.
|
20
|
+
//
|
21
|
+
// The messages in this file describe the definitions found in .proto files.
|
22
|
+
// A valid .proto file can be translated directly to a FileDescriptorProto
|
23
|
+
// without any other information (e.g. without reading its imports).
|
24
|
+
|
25
|
+
|
26
|
+
|
27
|
+
package google.protobuf;
|
28
|
+
option java_package = "com.google.protobuf";
|
29
|
+
option java_outer_classname = "DescriptorProtos";
|
30
|
+
|
31
|
+
// descriptor.proto must be optimized for speed because reflection-based
|
32
|
+
// algorithms don't work during bootstrapping.
|
33
|
+
option optimize_for = SPEED;
|
34
|
+
|
35
|
+
// Describes a complete .proto file.
|
36
|
+
message FileDescriptorProto {
|
37
|
+
optional string name = 1; // file name, relative to root of source tree
|
38
|
+
optional string package = 2; // e.g. "foo", "foo.bar", etc.
|
39
|
+
|
40
|
+
// Names of files imported by this file.
|
41
|
+
repeated string dependency = 3;
|
42
|
+
|
43
|
+
// All top-level definitions in this file.
|
44
|
+
repeated DescriptorProto message_type = 4;
|
45
|
+
repeated EnumDescriptorProto enum_type = 5;
|
46
|
+
repeated ServiceDescriptorProto service = 6;
|
47
|
+
repeated FieldDescriptorProto extension = 7;
|
48
|
+
|
49
|
+
optional FileOptions options = 8;
|
50
|
+
}
|
51
|
+
|
52
|
+
// Describes a message type.
|
53
|
+
message DescriptorProto {
|
54
|
+
optional string name = 1;
|
55
|
+
|
56
|
+
repeated FieldDescriptorProto field = 2;
|
57
|
+
repeated FieldDescriptorProto extension = 6;
|
58
|
+
|
59
|
+
repeated DescriptorProto nested_type = 3;
|
60
|
+
repeated EnumDescriptorProto enum_type = 4;
|
61
|
+
|
62
|
+
message ExtensionRange {
|
63
|
+
optional int32 start = 1;
|
64
|
+
optional int32 end = 2;
|
65
|
+
}
|
66
|
+
repeated ExtensionRange extension_range = 5;
|
67
|
+
|
68
|
+
optional MessageOptions options = 7;
|
69
|
+
}
|
70
|
+
|
71
|
+
// Describes a field within a message.
|
72
|
+
message FieldDescriptorProto {
|
73
|
+
enum Type {
|
74
|
+
// 0 is reserved for errors.
|
75
|
+
// Order is weird for historical reasons.
|
76
|
+
TYPE_DOUBLE = 1;
|
77
|
+
TYPE_FLOAT = 2;
|
78
|
+
TYPE_INT64 = 3; // Not ZigZag encoded. Negative numbers
|
79
|
+
// take 10 bytes. Use TYPE_SINT64 if negative
|
80
|
+
// values are likely.
|
81
|
+
TYPE_UINT64 = 4;
|
82
|
+
TYPE_INT32 = 5; // Not ZigZag encoded. Negative numbers
|
83
|
+
// take 10 bytes. Use TYPE_SINT32 if negative
|
84
|
+
// values are likely.
|
85
|
+
TYPE_FIXED64 = 6;
|
86
|
+
TYPE_FIXED32 = 7;
|
87
|
+
TYPE_BOOL = 8;
|
88
|
+
TYPE_STRING = 9;
|
89
|
+
TYPE_GROUP = 10; // Tag-delimited aggregate.
|
90
|
+
TYPE_MESSAGE = 11; // Length-delimited aggregate.
|
91
|
+
|
92
|
+
// New in version 2.
|
93
|
+
TYPE_BYTES = 12;
|
94
|
+
TYPE_UINT32 = 13;
|
95
|
+
TYPE_ENUM = 14;
|
96
|
+
TYPE_SFIXED32 = 15;
|
97
|
+
TYPE_SFIXED64 = 16;
|
98
|
+
TYPE_SINT32 = 17; // Uses ZigZag encoding.
|
99
|
+
TYPE_SINT64 = 18; // Uses ZigZag encoding.
|
100
|
+
};
|
101
|
+
|
102
|
+
enum Label {
|
103
|
+
// 0 is reserved for errors
|
104
|
+
LABEL_OPTIONAL = 1;
|
105
|
+
LABEL_REQUIRED = 2;
|
106
|
+
LABEL_REPEATED = 3;
|
107
|
+
// TODO(sanjay): Should we add LABEL_MAP?
|
108
|
+
};
|
109
|
+
|
110
|
+
optional string name = 1;
|
111
|
+
optional int32 number = 3;
|
112
|
+
optional Label label = 4;
|
113
|
+
|
114
|
+
// If type_name is set, this need not be set. If both this and type_name
|
115
|
+
// are set, this must be either TYPE_ENUM or TYPE_MESSAGE.
|
116
|
+
optional Type type = 5;
|
117
|
+
|
118
|
+
// For message and enum types, this is the name of the type. If the name
|
119
|
+
// starts with a '.', it is fully-qualified. Otherwise, C++-like scoping
|
120
|
+
// rules are used to find the type (i.e. first the nested types within this
|
121
|
+
// message are searched, then within the parent, on up to the root
|
122
|
+
// namespace).
|
123
|
+
optional string type_name = 6;
|
124
|
+
|
125
|
+
// For extensions, this is the name of the type being extended. It is
|
126
|
+
// resolved in the same manner as type_name.
|
127
|
+
optional string extendee = 2;
|
128
|
+
|
129
|
+
// For numeric types, contains the original text representation of the value.
|
130
|
+
// For booleans, "true" or "false".
|
131
|
+
// For strings, contains the default text contents (not escaped in any way).
|
132
|
+
// For bytes, contains the C escaped value. All bytes >= 128 are escaped.
|
133
|
+
// TODO(kenton): Base-64 encode?
|
134
|
+
optional string default_value = 7;
|
135
|
+
|
136
|
+
optional FieldOptions options = 8;
|
137
|
+
}
|
138
|
+
|
139
|
+
// Describes an enum type.
|
140
|
+
message EnumDescriptorProto {
|
141
|
+
optional string name = 1;
|
142
|
+
|
143
|
+
repeated EnumValueDescriptorProto value = 2;
|
144
|
+
|
145
|
+
optional EnumOptions options = 3;
|
146
|
+
}
|
147
|
+
|
148
|
+
// Describes a value within an enum.
|
149
|
+
message EnumValueDescriptorProto {
|
150
|
+
optional string name = 1;
|
151
|
+
optional int32 number = 2;
|
152
|
+
|
153
|
+
optional EnumValueOptions options = 3;
|
154
|
+
}
|
155
|
+
|
156
|
+
// Describes a service.
|
157
|
+
message ServiceDescriptorProto {
|
158
|
+
optional string name = 1;
|
159
|
+
repeated MethodDescriptorProto method = 2;
|
160
|
+
|
161
|
+
optional ServiceOptions options = 3;
|
162
|
+
}
|
163
|
+
|
164
|
+
// Describes a method of a service.
|
165
|
+
message MethodDescriptorProto {
|
166
|
+
optional string name = 1;
|
167
|
+
|
168
|
+
// Input and output type names. These are resolved in the same way as
|
169
|
+
// FieldDescriptorProto.type_name, but must refer to a message type.
|
170
|
+
optional string input_type = 2;
|
171
|
+
optional string output_type = 3;
|
172
|
+
|
173
|
+
optional MethodOptions options = 4;
|
174
|
+
}
|
175
|
+
|
176
|
+
// ===================================================================
|
177
|
+
// Options
|
178
|
+
|
179
|
+
// Each of the definitions above may have "options" attached. These are
|
180
|
+
// just annotations which may cause code to be generated slightly differently
|
181
|
+
// or may contain hints for code that manipulates protocol messages.
|
182
|
+
|
183
|
+
// TODO(kenton): Allow extensions to options.
|
184
|
+
|
185
|
+
message FileOptions {
|
186
|
+
|
187
|
+
// Sets the Java package where classes generated from this .proto will be
|
188
|
+
// placed. By default, the proto package is used, but this is often
|
189
|
+
// inappropriate because proto packages do not normally start with backwards
|
190
|
+
// domain names.
|
191
|
+
optional string java_package = 1;
|
192
|
+
|
193
|
+
|
194
|
+
// If set, all the classes from the .proto file are wrapped in a single
|
195
|
+
// outer class with the given name. This applies to both Proto1
|
196
|
+
// (equivalent to the old "--one_java_file" option) and Proto2 (where
|
197
|
+
// a .proto always translates to a single class, but you may want to
|
198
|
+
// explicitly choose the class name).
|
199
|
+
optional string java_outer_classname = 8;
|
200
|
+
|
201
|
+
// If set true, then the Java code generator will generate a separate .java
|
202
|
+
// file for each top-level message, enum, and service defined in the .proto
|
203
|
+
// file. Thus, these types will *not* be nested inside the outer class
|
204
|
+
// named by java_outer_classname. However, the outer class will still be
|
205
|
+
// generated to contain the file's getDescriptor() method as well as any
|
206
|
+
// top-level extensions defined in the file.
|
207
|
+
optional bool java_multiple_files = 10 [default=false];
|
208
|
+
|
209
|
+
// Generated classes can be optimized for speed or code size.
|
210
|
+
enum OptimizeMode {
|
211
|
+
SPEED = 1; // Generate complete code for parsing, serialization, etc.
|
212
|
+
CODE_SIZE = 2; // Use ReflectionOps to implement these methods.
|
213
|
+
}
|
214
|
+
optional OptimizeMode optimize_for = 9 [default=CODE_SIZE];
|
215
|
+
}
|
216
|
+
|
217
|
+
message MessageOptions {
|
218
|
+
// Set true to use the old proto1 MessageSet wire format for extensions.
|
219
|
+
// This is provided for backwards-compatibility with the MessageSet wire
|
220
|
+
// format. You should not use this for any other reason: It's less
|
221
|
+
// efficient, has fewer features, and is more complicated.
|
222
|
+
//
|
223
|
+
// The message must be defined exactly as follows:
|
224
|
+
// message Foo {
|
225
|
+
// option message_set_wire_format = true;
|
226
|
+
// extensions 4 to max;
|
227
|
+
// }
|
228
|
+
// Note that the message cannot have any defined fields; MessageSets only
|
229
|
+
// have extensions.
|
230
|
+
//
|
231
|
+
// All extensions of your type must be singular messages; e.g. they cannot
|
232
|
+
// be int32s, enums, or repeated messages.
|
233
|
+
//
|
234
|
+
// Because this is an option, the above two restrictions are not enforced by
|
235
|
+
// the protocol compiler.
|
236
|
+
optional bool message_set_wire_format = 1 [default=false];
|
237
|
+
}
|
238
|
+
|
239
|
+
message FieldOptions {
|
240
|
+
// The ctype option instructs the C++ code generator to use a different
|
241
|
+
// representation of the field than it normally would. See the specific
|
242
|
+
// options below. This option is not yet implemented in the open source
|
243
|
+
// release -- sorry, we'll try to include it in a future version!
|
244
|
+
optional CType ctype = 1;
|
245
|
+
enum CType {
|
246
|
+
CORD = 1;
|
247
|
+
|
248
|
+
STRING_PIECE = 2;
|
249
|
+
}
|
250
|
+
|
251
|
+
// EXPERIMENTAL. DO NOT USE.
|
252
|
+
// For "map" fields, the name of the field in the enclosed type that
|
253
|
+
// is the key for this map. For example, suppose we have:
|
254
|
+
// message Item {
|
255
|
+
// required string name = 1;
|
256
|
+
// required string value = 2;
|
257
|
+
// }
|
258
|
+
// message Config {
|
259
|
+
// repeated Item items = 1 [experimental_map_key="name"];
|
260
|
+
// }
|
261
|
+
// In this situation, the map key for Item will be set to "name".
|
262
|
+
// TODO: Fully-implement this, then remove the "experimental_" prefix.
|
263
|
+
optional string experimental_map_key = 9;
|
264
|
+
}
|
265
|
+
|
266
|
+
message EnumOptions {
|
267
|
+
}
|
268
|
+
|
269
|
+
message EnumValueOptions {
|
270
|
+
}
|
271
|
+
|
272
|
+
message ServiceOptions {
|
273
|
+
|
274
|
+
// Note: Field numbers 1 through 32 are reserved for Google's internal RPC
|
275
|
+
// framework. We apologize for hoarding these numbers to ourselves, but
|
276
|
+
// we were already using them long before we decided to release Protocol
|
277
|
+
// Buffers.
|
278
|
+
}
|
279
|
+
|
280
|
+
message MethodOptions {
|
281
|
+
|
282
|
+
// Note: Field numbers 1 through 32 are reserved for Google's internal RPC
|
283
|
+
// framework. We apologize for hoarding these numbers to ourselves, but
|
284
|
+
// we were already using them long before we decided to release Protocol
|
285
|
+
// Buffers.
|
286
|
+
}
|
@@ -0,0 +1,54 @@
|
|
1
|
+
module Protobuf
|
2
|
+
module Descriptor
|
3
|
+
class Descriptor
|
4
|
+
def initialize(message_class)
|
5
|
+
@message_class = message_class
|
6
|
+
end
|
7
|
+
|
8
|
+
def proto_type
|
9
|
+
'Google::Protobuf::DescriptorProto'
|
10
|
+
end
|
11
|
+
|
12
|
+
def build(proto, opt={})
|
13
|
+
mod = opt[:module]
|
14
|
+
cls = mod.const_set proto.name, Class.new(@message_class)
|
15
|
+
proto.nested_type.each do |message_proto|
|
16
|
+
Protobuf::Message.descriptor.build message_proto, :module => cls
|
17
|
+
end
|
18
|
+
proto.enum_type.each do |enum_proto|
|
19
|
+
Protobuf::Enum.descriptor.build enum_proto, :module => cls
|
20
|
+
end
|
21
|
+
proto.field.each do |field_proto|
|
22
|
+
Protobuf::Field::BaseField.descriptor.build field_proto, :class => cls
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
def unbuild(parent_proto)
|
27
|
+
message_proto = Google::Protobuf::DescriptorProto.new
|
28
|
+
message_proto.name = @message_class.to_s.split('::').last
|
29
|
+
@message_class.fields.each do |tag, field|
|
30
|
+
field.descriptor.unbuild message_proto
|
31
|
+
end
|
32
|
+
ObjectSpace.each_object(Class) do |cls|
|
33
|
+
if innerclass? @message_class, cls
|
34
|
+
cls.descriptor.unbuild message_proto
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
case parent_proto
|
39
|
+
when Google::Protobuf::FileDescriptorProto
|
40
|
+
parent_proto.message_type << message_proto
|
41
|
+
when Google::Protobuf::DescriptorProto
|
42
|
+
parent_proto.nested_type << message_proto
|
43
|
+
else
|
44
|
+
raise TypeError.new(parent_proto.class.name)
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
def innerclass?(parent, child)
|
49
|
+
child.name =~ /::/ and child.name.split('::')[0..-2].join('::') == parent.name
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|