protobuf 2.7.5 → 2.7.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.
@@ -18,6 +18,7 @@ bool RubyGenerator::Generate(const FileDescriptor* file,
18
18
 
19
19
  filename = CreateRubyFileName(file_->name());
20
20
  ns_vector.clear();
21
+ extended_messages.clear();
21
22
  SplitStringUsing(file_->package(), ".", &ns_vector);
22
23
 
23
24
  // Get a ZeroCopyOutputStream object of the data.
@@ -41,9 +42,10 @@ bool RubyGenerator::Generate(const FileDescriptor* file,
41
42
  PrintMessagesForFileDescriptor(file_, false);
42
43
  PrintNewLine();
43
44
 
44
- PrintEnumsForFileDescriptor(file_, true);
45
45
  PrintMessagesForFileDescriptor(file_, true);
46
46
 
47
+ PrintDanglingExtendedMessages();
48
+
47
49
  PrintServices();
48
50
 
49
51
  PrintEnclosingNamespaceModuleEnds();
@@ -88,6 +90,9 @@ void RubyGenerator::PrintEnclosingNamespaceModuleEnds() const {
88
90
  ///////////////////////////////////////////////// [ messages ] ////////////////
89
91
  //
90
92
 
93
+ // Print a comment and then iteratively PrintMessage for each message
94
+ // type defined by in this FileDescriptor scope.
95
+ //
91
96
  void RubyGenerator::PrintMessagesForFileDescriptor(const FileDescriptor* descriptor, bool print_fields) const {
92
97
  if (descriptor->message_type_count() > 0) {
93
98
  if (print_fields) {
@@ -95,6 +100,7 @@ void RubyGenerator::PrintMessagesForFileDescriptor(const FileDescriptor* descrip
95
100
  }
96
101
  else {
97
102
  PrintComment("Message Classes", true);
103
+ StoreExtensionFields(descriptor);
98
104
  }
99
105
 
100
106
  for (int i = 0; i < descriptor->message_type_count(); i++) {
@@ -103,76 +109,102 @@ void RubyGenerator::PrintMessagesForFileDescriptor(const FileDescriptor* descrip
103
109
  }
104
110
  }
105
111
 
112
+ // Iterates the nested types of a message descriptor and calls PrintMessage for each.
113
+ //
106
114
  void RubyGenerator::PrintMessagesForDescriptor(const Descriptor* descriptor, bool print_fields) const {
107
115
  for (int i = 0; i < descriptor->nested_type_count(); i++) {
108
116
  PrintMessage(descriptor->nested_type(i), print_fields);
109
117
  }
110
118
  }
111
- //
119
+
112
120
  // Print out the given descriptor message as a Ruby class.
121
+ //
113
122
  void RubyGenerator::PrintMessage(const Descriptor* descriptor, bool print_fields) const {
114
123
  map<string,string> data;
115
124
  data["class_name"] = descriptor->name();
116
125
 
117
- if (print_fields && (descriptor->field_count() > 0 || descriptor->extension_count() > 0)) {
118
- printer_->Print(data, "class $class_name$");
119
- PrintNewLine();
120
- printer_->Indent();
126
+ switch (print_fields) {
127
+ case false:
121
128
 
122
- if (descriptor->enum_type_count() > 0) {
123
- PrintEnumsForDescriptor(descriptor, true);
124
- }
129
+ if (DescriptorHasNestedTypes(descriptor)) {
130
+ printer_->Print(data, "class $class_name$ < ::Protobuf::Message");
131
+ PrintNewLine();
132
+ printer_->Indent();
125
133
 
126
- if (descriptor->nested_type_count() > 0) {
127
- PrintMessagesForDescriptor(descriptor, true);
128
- }
134
+ if (descriptor->enum_type_count() > 0) {
135
+ PrintEnumsForDescriptor(descriptor, true);
136
+ }
129
137
 
130
- PrintExtensionRangesForDescriptor(descriptor);
138
+ if (descriptor->nested_type_count() > 0) {
139
+ PrintMessagesForDescriptor(descriptor, false);
140
+ }
131
141
 
132
- // Print Fields
133
- if (descriptor->field_count() > 0) {
134
- for (int i = 0; i < descriptor->field_count(); i++) {
135
- PrintMessageField(descriptor->field(i));
142
+ printer_->Outdent();
143
+ printer_->Print(data, "end");
136
144
  }
137
- }
138
-
139
- // Print Extension Fields
140
- if (descriptor->extension_count() > 0) {
141
- for (int i = 0; i < descriptor->extension_count(); i++) {
142
- PrintMessageField(descriptor->extension(i));
145
+ else {
146
+ printer_->Print(data, "class $class_name$ < ::Protobuf::Message; end");
143
147
  }
144
- }
145
148
 
146
- printer_->Outdent();
147
- printer_->Print(data, "end");
148
- PrintNewLine();
149
- }
150
- else if (DescriptorHasNestedTypes(descriptor)) {
151
- printer_->Print(data, "class $class_name$ < ::Protobuf::Message");
152
- PrintNewLine();
153
- printer_->Indent();
149
+ PrintNewLine();
150
+ StoreExtensionFields(descriptor);
154
151
 
155
- if (descriptor->enum_type_count() > 0) {
156
- PrintEnumsForDescriptor(descriptor, false);
157
- }
152
+ break;
158
153
 
159
- if (descriptor->nested_type_count() > 0) {
160
- PrintMessagesForDescriptor(descriptor, false);
161
- }
154
+ case true:
162
155
 
163
- printer_->Outdent();
164
- printer_->Print(data, "end");
165
- PrintNewLine();
166
- }
167
- else {
168
- printer_->Print(data, "class $class_name$ < ::Protobuf::Message; end");
169
- }
156
+ if (descriptor->field_count() > 0 || DescriptorHasExtensions(descriptor)) {
157
+ printer_->Print(data, "class $class_name$");
158
+ PrintNewLine();
159
+ printer_->Indent();
170
160
 
171
- PrintNewLine();
161
+ if (descriptor->nested_type_count() > 0) {
162
+ PrintMessagesForDescriptor(descriptor, true);
163
+ }
164
+
165
+ // Print Fields
166
+ if (descriptor->field_count() > 0) {
167
+ for (int i = 0; i < descriptor->field_count(); i++) {
168
+ PrintMessageField(descriptor->field(i));
169
+ }
170
+ }
171
+
172
+ PrintExtensionRangesForDescriptor(descriptor);
173
+
174
+ // Print Extension Fields
175
+ if (DescriptorHasExtensions(descriptor)) {
176
+ PrintMessageExtensionFields(descriptor->full_name());
177
+ }
178
+
179
+ printer_->Outdent();
180
+ printer_->Print(data, "end");
181
+ PrintNewLine();
182
+ PrintNewLine();
183
+ }
184
+ else if (descriptor->nested_type_count() > 0) {
185
+ printer_->Print(data, "class $class_name$");
186
+ PrintNewLine();
187
+ printer_->Indent();
188
+
189
+ if (descriptor->nested_type_count() > 0) {
190
+ PrintMessagesForDescriptor(descriptor, true);
191
+ }
192
+
193
+ printer_->Outdent();
194
+ printer_->Print(data, "end");
195
+ PrintNewLine();
196
+ PrintNewLine();
197
+ }
198
+
199
+ break;
200
+ }
172
201
  }
173
202
 
174
203
  void RubyGenerator::PrintExtensionRangesForDescriptor(const Descriptor* descriptor) const {
175
204
  if (descriptor->extension_range_count() > 0) {
205
+ PrintNewLine();
206
+ PrintComment("Extension Fields", false);
207
+
176
208
  for (int i = 0; i < descriptor->extension_range_count(); i++) {
177
209
  const Descriptor::ExtensionRange* range = descriptor->extension_range(i);
178
210
  map<string,string> data;
@@ -281,6 +313,20 @@ void RubyGenerator::PrintMessageField(const FieldDescriptor* descriptor) const {
281
313
  PrintNewLine();
282
314
  }
283
315
 
316
+ // Print out each extension field previously mapped to the full name of
317
+ // the descriptor message.
318
+ //
319
+ // After printign the fields, erase the fields from the map so that we know
320
+ // which fields are dangling and to print wrapped in a re-opened class block.
321
+ //
322
+ void RubyGenerator::PrintMessageExtensionFields(const string full_name) const {
323
+ vector<const FieldDescriptor*> message_extensions = extended_messages[full_name];
324
+ vector<const FieldDescriptor*>::iterator it;
325
+ for (it = message_extensions.begin(); it != message_extensions.end(); ++it) {
326
+ PrintMessageField(*it);
327
+ }
328
+ extended_messages.erase(full_name);
329
+ }
284
330
 
285
331
  //
286
332
  ///////////////////////////////////////////////// [ enums ] ///////////////////
@@ -288,7 +334,7 @@ void RubyGenerator::PrintMessageField(const FieldDescriptor* descriptor) const {
288
334
 
289
335
  void RubyGenerator::PrintEnumsForDescriptor(const Descriptor* descriptor, bool print_values) const {
290
336
  for (int i = 0; i < descriptor->enum_type_count(); i++) {
291
- PrintEnum(descriptor->enum_type(i), print_values);
337
+ PrintEnum(descriptor->enum_type(i));
292
338
  }
293
339
  }
294
340
 
@@ -302,33 +348,28 @@ void RubyGenerator::PrintEnumsForFileDescriptor(const FileDescriptor* descriptor
302
348
  }
303
349
 
304
350
  for (int i = 0; i < descriptor->enum_type_count(); i++) {
305
- PrintEnum(descriptor->enum_type(i), print_values);
351
+ PrintEnum(descriptor->enum_type(i));
306
352
  }
307
353
  }
308
354
  }
309
355
 
310
356
  // Print the given enum descriptor as a Ruby class.
311
- void RubyGenerator::PrintEnum(const EnumDescriptor* descriptor, bool print_values) const {
357
+ void RubyGenerator::PrintEnum(const EnumDescriptor* descriptor) const {
312
358
  map<string,string> data;
313
359
  data["class_name"] = descriptor->name();
314
360
 
315
- if (print_values) {
316
- printer_->Print(data, "class $class_name$");
317
- printer_->Indent();
318
- PrintNewLine();
319
-
320
- for (int i = 0; i < descriptor->value_count(); i++) {
321
- PrintEnumValue(descriptor->value(i));
322
- }
361
+ printer_->Print(data, "class $class_name$ < ::Protobuf::Enum");
362
+ printer_->Indent();
363
+ PrintNewLine();
323
364
 
324
- printer_->Outdent();
325
- printer_->Print(data, "end");
326
- PrintNewLine();
327
- }
328
- else {
329
- printer_->Print(data, "class $class_name$ < ::Protobuf::Enum; end");
365
+ for (int i = 0; i < descriptor->value_count(); i++) {
366
+ PrintEnumValue(descriptor->value(i));
330
367
  }
331
368
 
369
+ printer_->Outdent();
370
+ printer_->Print(data, "end");
371
+ PrintNewLine();
372
+
332
373
  PrintNewLine();
333
374
  }
334
375
 
@@ -387,6 +428,42 @@ void RubyGenerator::PrintServiceMethod(const MethodDescriptor* descriptor) const
387
428
  ///////////////////////////////////////////////// [ general ] ////////////////
388
429
  //
389
430
 
431
+ void RubyGenerator::PrintDanglingExtendedMessages() const {
432
+ if (extended_messages.size() > 0) {
433
+ PrintComment("Extended Messages", true);
434
+
435
+ tr1::unordered_map<string, vector<const FieldDescriptor*> >::iterator it;
436
+ for (it = extended_messages.begin(); it != extended_messages.end(); ++it ) {
437
+ map<string,string> data;
438
+ data["class_name"] = Constantize(it->first);
439
+
440
+ printer_->Print(data, "class $class_name$");
441
+ printer_->Indent();
442
+ PrintNewLine();
443
+
444
+ PrintMessageExtensionFields(it->first);
445
+
446
+ printer_->Outdent();
447
+ printer_->Print(data, "end");
448
+ PrintNewLine();
449
+ PrintNewLine();
450
+ }
451
+ }
452
+ }
453
+
454
+ // Explicitly check for the key with `count` so that we don't create
455
+ // empty vectors for classes simply using bracket access.
456
+ //
457
+ bool RubyGenerator::DescriptorHasExtensions(const Descriptor* descriptor) const {
458
+ const string full_name = descriptor->full_name();
459
+ if (extended_messages.count(full_name) > 0) {
460
+ return (extended_messages[full_name].size());
461
+ }
462
+ else {
463
+ return 0;
464
+ }
465
+ }
466
+
390
467
  // Print a header or one-line comment (as indicated by the as_header bool).
391
468
  void RubyGenerator::PrintComment(string comment, bool as_header) const {
392
469
  char format[] = "# $comment$\n";
@@ -444,6 +521,25 @@ void RubyGenerator::PrintNewLine() const {
444
521
  printer_->Print("\n");
445
522
  }
446
523
 
524
+ // We need to store any extension fields defined in the scope of this
525
+ // descriptor message by the field's containing type.
526
+ void RubyGenerator::StoreExtensionFields(const FileDescriptor* descriptor) const {
527
+ for (int i = 0; i < descriptor->extension_count(); i++) {
528
+ const FieldDescriptor* extension_field = descriptor->extension(i);
529
+ const Descriptor* containing = extension_field->containing_type();
530
+ extended_messages[containing->full_name()].push_back(extension_field);
531
+ }
532
+ }
533
+
534
+ // Same as above, only accept the Descriptor type instead of FileDescriptor.
535
+ void RubyGenerator::StoreExtensionFields(const Descriptor* descriptor) const {
536
+ for (int i = 0; i < descriptor->extension_count(); i++) {
537
+ const FieldDescriptor* extension_field = descriptor->extension(i);
538
+ const Descriptor* containing = extension_field->containing_type();
539
+ extended_messages[containing->full_name()].push_back(extension_field);
540
+ }
541
+ }
542
+
447
543
  } // namespace ruby
448
544
  } // namespace compiler
449
545
  } // namespace protobuf
@@ -5,6 +5,7 @@
5
5
  #include <iostream>
6
6
  #include <sstream>
7
7
  #include <vector>
8
+ #include <tr1/unordered_map>
8
9
 
9
10
  #include <google/protobuf/compiler/command_line_interface.h>
10
11
  #include <google/protobuf/compiler/code_generator.h>
@@ -31,28 +32,32 @@ class LIBPROTOC_EXPORT RubyGenerator : public CodeGenerator {
31
32
  GeneratorContext* context,
32
33
  string* error) const;
33
34
 
34
-
35
35
  private:
36
36
  mutable GeneratorContext* context_;
37
37
  mutable io::Printer* printer_;
38
38
  mutable const FileDescriptor* file_;
39
39
  mutable string filename;
40
40
  mutable vector<string> ns_vector;
41
+ mutable tr1::unordered_map<string, vector<const FieldDescriptor*> > extended_messages;
41
42
 
42
43
  GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(RubyGenerator);
43
44
 
45
+ bool DescriptorHasExtensions(const Descriptor* descriptor) const;
46
+ void PrintDanglingExtendedMessages() const;
47
+ void PrintExtensionRangesForDescriptor(const Descriptor* descriptor) const;
48
+
44
49
  void PrintEnclosingNamespaceModules() const;
45
50
  void PrintEnclosingNamespaceModuleEnds() const;
46
51
 
47
52
  void PrintMessagesForDescriptor(const Descriptor* descriptor, bool print_fields) const;
48
53
  void PrintMessagesForFileDescriptor(const FileDescriptor* descriptor, bool print_fields) const;
49
54
  void PrintMessage(const Descriptor* descriptor, bool print_fields) const;
50
- void PrintExtensionRangesForDescriptor(const Descriptor* descriptor) const;
51
55
  void PrintMessageField(const FieldDescriptor* descriptor) const;
56
+ void PrintMessageExtensionFields(const string full_name) const;
52
57
 
53
58
  void PrintEnumsForDescriptor(const Descriptor* descriptor, bool print_values) const;
54
59
  void PrintEnumsForFileDescriptor(const FileDescriptor* descriptor, bool print_values) const;
55
- void PrintEnum(const EnumDescriptor* descriptor, bool print_values) const;
60
+ void PrintEnum(const EnumDescriptor* descriptor) const;
56
61
  void PrintEnumValue(const EnumValueDescriptor* descriptor) const;
57
62
 
58
63
  void PrintServices() const;
@@ -67,6 +72,9 @@ class LIBPROTOC_EXPORT RubyGenerator : public CodeGenerator {
67
72
  void PrintRequire(string lib_name) const;
68
73
  void PrintNewLine() const;
69
74
 
75
+ void StoreExtensionFields(const FileDescriptor* descriptor) const;
76
+ void StoreExtensionFields(const Descriptor* descriptor) const;
77
+
70
78
  // Take the proto file name, strip ".proto"
71
79
  // from the end and add ".pb.rb"
72
80
  static string CreateRubyFileName(const string proto_filename) {
@@ -68,11 +68,8 @@ module Protobuf
68
68
  end
69
69
 
70
70
  def self.get_ext_field_by_name(name)
71
- # Check if the name has been used before, if not then set it to the sym value
72
- extension_fields[extension_field_name_to_tag[name.to_sym]]
73
- rescue TypeError, NoMethodError => e
74
- name = 'nil' if name.nil?
75
- raise FieldNotDefinedError.new("Field '#{name}' is not defined on message '#{self.name}'")
71
+ tag = extension_field_name_to_tag[name.to_sym]
72
+ extension_fields[tag] unless tag.nil?
76
73
  end
77
74
 
78
75
  def self.get_ext_field_by_tag(tag)
@@ -81,11 +78,8 @@ module Protobuf
81
78
 
82
79
  # Find a field object by +name+.
83
80
  def self.get_field_by_name(name)
84
- # Check if the name has been used before, if not then set it to the sym value
85
- fields[field_name_to_tag[name.to_sym]]
86
- rescue TypeError, NoMethodError => e
87
- name = 'nil' if name.nil?
88
- raise FieldNotDefinedError.new("Field '#{name}' is not defined on message '#{self.name}'")
81
+ tag = field_name_to_tag[name.to_sym]
82
+ fields[tag] unless tag.nil?
89
83
  end
90
84
 
91
85
  # Find a field object by +tag+ number.
@@ -93,6 +87,7 @@ module Protobuf
93
87
  fields[tag]
94
88
  rescue TypeError => e
95
89
  tag = tag.nil? ? 'nil' : tag.to_s
90
+ raise
96
91
  raise FieldNotDefinedError.new("Tag '#{tag}' does not reference a message field for '#{self.name}'")
97
92
  end
98
93
 
@@ -284,16 +279,12 @@ module Protobuf
284
279
  def [](name)
285
280
  if field = get_field_by_name(name) || get_ext_field_by_name(name)
286
281
  __send__(field.name)
287
- else
288
- raise NoMethodError, "No such field: #{name.inspect}"
289
282
  end
290
283
  end
291
284
 
292
285
  def []=(name, value)
293
286
  if field = get_field_by_name(name) || get_ext_field_by_name(name)
294
287
  __send__(field.setter_method_name, value)
295
- else
296
- raise NoMethodError, "No such field: #{name.inspect}"
297
288
  end
298
289
  end
299
290
 
@@ -1,4 +1,4 @@
1
1
  module Protobuf
2
- VERSION = '2.7.5'
2
+ VERSION = '2.7.6'
3
3
  PROTOC_VERSION = '2.4.1'
4
4
  end
@@ -7,6 +7,7 @@ Bundler.setup :default, :development, :test
7
7
  require 'pry'
8
8
 
9
9
  $: << ::File.expand_path('..', File.dirname(__FILE__))
10
+ $: << ::File.expand_path('../spec/support', File.dirname(__FILE__))
10
11
  #$: << ::File.expand_path('../lib', File.dirname(__FILE__))
11
12
 
12
13
  require 'protobuf'
@@ -3,25 +3,26 @@
3
3
  #
4
4
  require 'protobuf/message'
5
5
 
6
+ ##
7
+ # Imports
8
+ #
9
+ require 'test/resource.pb'
10
+
6
11
  module Test
7
12
  ##
8
13
  # Enum Classes
9
14
  #
10
- class EnumTestType < ::Protobuf::Enum; end
15
+ class EnumTestType < ::Protobuf::Enum
16
+ define :ONE, 1
17
+ define :TWO, 2
18
+ end
19
+
11
20
 
12
21
  ##
13
22
  # Message Classes
14
23
  #
15
24
  class EnumTestMessage < ::Protobuf::Message; end
16
25
 
17
- ##
18
- # Enum Values
19
- #
20
- class EnumTestType
21
- define :ONE, 1
22
- define :TWO, 2
23
- end
24
-
25
26
  ##
26
27
  # Message Fields
27
28
  #
@@ -31,4 +32,11 @@ module Test
31
32
  repeated ::Test::EnumTestType, :repeated_enums, 3
32
33
  end
33
34
 
35
+ ##
36
+ # Extended Messages
37
+ #
38
+ class ::Test::Resource
39
+ optional ::Protobuf::Field::Int32Field, :ext_other_file_defined_field, 200, :extension => true
40
+ end
41
+
34
42
  end
@@ -1,4 +1,5 @@
1
1
  package test;
2
+ import 'test/resource.proto';
2
3
 
3
4
  enum EnumTestType {
4
5
  ONE = 1;
@@ -10,3 +11,7 @@ message EnumTestMessage {
10
11
  optional EnumTestType default_enum = 2 [default=ONE];
11
12
  repeated EnumTestType repeated_enums = 3;
12
13
  }
14
+
15
+ extend test.Resource {
16
+ optional int32 ext_other_file_defined_field = 200;
17
+ }
@@ -8,23 +8,31 @@ module Test
8
8
  ##
9
9
  # Enum Classes
10
10
  #
11
- class StatusType < ::Protobuf::Enum; end
11
+ class StatusType < ::Protobuf::Enum
12
+ define :PENDING, 0
13
+ define :ENABLED, 1
14
+ define :DISABLED, 2
15
+ define :DELETED, 3
16
+ end
17
+
12
18
 
13
19
  ##
14
20
  # Message Classes
15
21
  #
16
22
  class ResourceFindRequest < ::Protobuf::Message; end
17
23
  class Resource < ::Protobuf::Message; end
18
- class Nested < ::Protobuf::Message; end
19
-
20
- ##
21
- # Enum Values
22
- #
23
- class StatusType
24
- define :PENDING, 0
25
- define :ENABLED, 1
26
- define :DISABLED, 2
27
- define :DELETED, 3
24
+ class Searchable < ::Protobuf::Message
25
+ class SearchType < ::Protobuf::Enum
26
+ define :FLAT, 1
27
+ define :NESTED, 2
28
+ end
29
+
30
+ end
31
+ class MessageParent < ::Protobuf::Message
32
+ class MessageChild < ::Protobuf::Message; end
33
+ end
34
+ class Nested < ::Protobuf::Message
35
+ class NestedLevelOne < ::Protobuf::Message; end
28
36
  end
29
37
 
30
38
  ##
@@ -40,13 +48,41 @@ module Test
40
48
  optional ::Protobuf::Field::Int64Field, :date_created, 2
41
49
  optional ::Test::StatusType, :status, 3
42
50
  repeated ::Test::StatusType, :repeated_enum, 4
51
+
52
+ # Extension Fields
53
+ extensions 100...536870912
54
+ optional ::Protobuf::Field::BoolField, :ext_is_searchable, 100, :extension => true
55
+ optional ::Protobuf::Field::BoolField, :ext_is_hidden, 101, :extension => true
56
+ optional ::Test::Searchable::SearchType, :ext_search_type, 102, :default => ::Test::Searchable::SearchType::FLAT, :extension => true
57
+ optional ::Protobuf::Field::BoolField, :ext_nested_in_level_one, 105, :extension => true
58
+ end
59
+
60
+ class MessageParent
61
+ class MessageChild
62
+ optional ::Protobuf::Field::StringField, :child1, 1
63
+ end
64
+
43
65
  end
44
66
 
45
67
  class Nested
68
+ class NestedLevelOne
69
+ optional ::Protobuf::Field::BoolField, :level_one, 1, :default => true
70
+
71
+ # Extension Fields
72
+ extensions 100...102
73
+ optional ::Protobuf::Field::BoolField, :ext_nested_level_one_outer, 101, :extension => true
74
+ optional ::Protobuf::Field::BoolField, :ext_nested_level_one, 100, :extension => true
75
+ end
76
+
46
77
  optional ::Protobuf::Field::StringField, :name, 1
47
78
  optional ::Test::Resource, :resource, 2
48
79
  repeated ::Test::Resource, :multiple_resources, 3
49
80
  optional ::Test::StatusType, :status, 4
81
+
82
+ # Extension Fields
83
+ extensions 100...111
84
+ optional ::Protobuf::Field::StringField, :foo, 100, :extension => true
85
+ optional ::Protobuf::Field::Int64Field, :bar, 101, :extension => true
50
86
  end
51
87
 
52
88
  ##
@@ -13,17 +13,62 @@ message ResourceFindRequest {
13
13
  }
14
14
 
15
15
  message Resource {
16
+ extensions 100 to max;
17
+
16
18
  required string name = 1;
17
19
  optional int64 date_created = 2;
18
20
  optional StatusType status = 3;
19
21
  repeated StatusType repeated_enum = 4;
20
22
  }
21
23
 
24
+ message Searchable {
25
+ enum SearchType {
26
+ FLAT = 1;
27
+ NESTED = 2;
28
+ }
29
+
30
+ extend test.Resource {
31
+ optional bool ext_is_searchable = 100;
32
+ optional bool ext_is_hidden = 101;
33
+ optional Searchable.SearchType ext_search_type = 102 [default=FLAT];
34
+ }
35
+ }
36
+
37
+ message MessageParent {
38
+ message MessageChild {
39
+ optional string child1 = 1;
40
+ }
41
+ }
42
+
22
43
  message Nested {
44
+ extensions 100 to 110;
45
+
23
46
  optional string name = 1;
24
47
  optional Resource resource = 2;
25
48
  repeated Resource multiple_resources = 3;
26
49
  optional StatusType status = 4;
50
+
51
+ message NestedLevelOne {
52
+ extensions 100 to 101;
53
+ optional bool level_one = 1 [default=true];
54
+
55
+ extend Resource {
56
+ optional bool ext_nested_in_level_one = 105;
57
+ }
58
+ }
59
+
60
+ extend NestedLevelOne {
61
+ optional bool ext_nested_level_one = 100;
62
+ }
63
+ }
64
+
65
+ extend Nested {
66
+ optional string foo = 100;
67
+ optional int64 bar = 101;
68
+ }
69
+
70
+ extend Nested.NestedLevelOne {
71
+ optional bool ext_nested_level_one_outer = 101;
27
72
  }
28
73
 
29
74
  service ResourceService {
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: protobuf
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.7.5
4
+ version: 2.7.6
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -10,11 +10,11 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2013-03-13 00:00:00.000000000 Z
13
+ date: 2013-03-17 00:00:00.000000000Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: activesupport
17
- requirement: !ruby/object:Gem::Requirement
17
+ requirement: &2157307340 !ruby/object:Gem::Requirement
18
18
  none: false
19
19
  requirements:
20
20
  - - ! '>='
@@ -22,15 +22,10 @@ dependencies:
22
22
  version: '0'
23
23
  type: :runtime
24
24
  prerelease: false
25
- version_requirements: !ruby/object:Gem::Requirement
26
- none: false
27
- requirements:
28
- - - ! '>='
29
- - !ruby/object:Gem::Version
30
- version: '0'
25
+ version_requirements: *2157307340
31
26
  - !ruby/object:Gem::Dependency
32
27
  name: ffi
33
- requirement: !ruby/object:Gem::Requirement
28
+ requirement: &2157306300 !ruby/object:Gem::Requirement
34
29
  none: false
35
30
  requirements:
36
31
  - - ! '>='
@@ -38,15 +33,10 @@ dependencies:
38
33
  version: '0'
39
34
  type: :runtime
40
35
  prerelease: false
41
- version_requirements: !ruby/object:Gem::Requirement
42
- none: false
43
- requirements:
44
- - - ! '>='
45
- - !ruby/object:Gem::Version
46
- version: '0'
36
+ version_requirements: *2157306300
47
37
  - !ruby/object:Gem::Dependency
48
38
  name: multi_json
49
- requirement: !ruby/object:Gem::Requirement
39
+ requirement: &2157305140 !ruby/object:Gem::Requirement
50
40
  none: false
51
41
  requirements:
52
42
  - - ! '>='
@@ -54,15 +44,10 @@ dependencies:
54
44
  version: '0'
55
45
  type: :runtime
56
46
  prerelease: false
57
- version_requirements: !ruby/object:Gem::Requirement
58
- none: false
59
- requirements:
60
- - - ! '>='
61
- - !ruby/object:Gem::Version
62
- version: '0'
47
+ version_requirements: *2157305140
63
48
  - !ruby/object:Gem::Dependency
64
49
  name: thor
65
- requirement: !ruby/object:Gem::Requirement
50
+ requirement: &2157303820 !ruby/object:Gem::Requirement
66
51
  none: false
67
52
  requirements:
68
53
  - - ! '>='
@@ -70,15 +55,10 @@ dependencies:
70
55
  version: '0'
71
56
  type: :runtime
72
57
  prerelease: false
73
- version_requirements: !ruby/object:Gem::Requirement
74
- none: false
75
- requirements:
76
- - - ! '>='
77
- - !ruby/object:Gem::Version
78
- version: '0'
58
+ version_requirements: *2157303820
79
59
  - !ruby/object:Gem::Dependency
80
60
  name: eventmachine
81
- requirement: !ruby/object:Gem::Requirement
61
+ requirement: &2157301680 !ruby/object:Gem::Requirement
82
62
  none: false
83
63
  requirements:
84
64
  - - ! '>='
@@ -86,15 +66,10 @@ dependencies:
86
66
  version: '0'
87
67
  type: :development
88
68
  prerelease: false
89
- version_requirements: !ruby/object:Gem::Requirement
90
- none: false
91
- requirements:
92
- - - ! '>='
93
- - !ruby/object:Gem::Version
94
- version: '0'
69
+ version_requirements: *2157301680
95
70
  - !ruby/object:Gem::Dependency
96
71
  name: ffi-rzmq
97
- requirement: !ruby/object:Gem::Requirement
72
+ requirement: &2157300180 !ruby/object:Gem::Requirement
98
73
  none: false
99
74
  requirements:
100
75
  - - ! '>='
@@ -102,15 +77,10 @@ dependencies:
102
77
  version: '0'
103
78
  type: :development
104
79
  prerelease: false
105
- version_requirements: !ruby/object:Gem::Requirement
106
- none: false
107
- requirements:
108
- - - ! '>='
109
- - !ruby/object:Gem::Version
110
- version: '0'
80
+ version_requirements: *2157300180
111
81
  - !ruby/object:Gem::Dependency
112
82
  name: pry
113
- requirement: !ruby/object:Gem::Requirement
83
+ requirement: &2157276640 !ruby/object:Gem::Requirement
114
84
  none: false
115
85
  requirements:
116
86
  - - ! '>='
@@ -118,15 +88,10 @@ dependencies:
118
88
  version: '0'
119
89
  type: :development
120
90
  prerelease: false
121
- version_requirements: !ruby/object:Gem::Requirement
122
- none: false
123
- requirements:
124
- - - ! '>='
125
- - !ruby/object:Gem::Version
126
- version: '0'
91
+ version_requirements: *2157276640
127
92
  - !ruby/object:Gem::Dependency
128
93
  name: pry-nav
129
- requirement: !ruby/object:Gem::Requirement
94
+ requirement: &2157275600 !ruby/object:Gem::Requirement
130
95
  none: false
131
96
  requirements:
132
97
  - - ! '>='
@@ -134,15 +99,10 @@ dependencies:
134
99
  version: '0'
135
100
  type: :development
136
101
  prerelease: false
137
- version_requirements: !ruby/object:Gem::Requirement
138
- none: false
139
- requirements:
140
- - - ! '>='
141
- - !ruby/object:Gem::Version
142
- version: '0'
102
+ version_requirements: *2157275600
143
103
  - !ruby/object:Gem::Dependency
144
104
  name: rake
145
- requirement: !ruby/object:Gem::Requirement
105
+ requirement: &2157274080 !ruby/object:Gem::Requirement
146
106
  none: false
147
107
  requirements:
148
108
  - - ! '>='
@@ -150,15 +110,10 @@ dependencies:
150
110
  version: '0'
151
111
  type: :development
152
112
  prerelease: false
153
- version_requirements: !ruby/object:Gem::Requirement
154
- none: false
155
- requirements:
156
- - - ! '>='
157
- - !ruby/object:Gem::Version
158
- version: '0'
113
+ version_requirements: *2157274080
159
114
  - !ruby/object:Gem::Dependency
160
115
  name: rake-compiler
161
- requirement: !ruby/object:Gem::Requirement
116
+ requirement: &2157272780 !ruby/object:Gem::Requirement
162
117
  none: false
163
118
  requirements:
164
119
  - - ! '>='
@@ -166,15 +121,10 @@ dependencies:
166
121
  version: '0'
167
122
  type: :development
168
123
  prerelease: false
169
- version_requirements: !ruby/object:Gem::Requirement
170
- none: false
171
- requirements:
172
- - - ! '>='
173
- - !ruby/object:Gem::Version
174
- version: '0'
124
+ version_requirements: *2157272780
175
125
  - !ruby/object:Gem::Dependency
176
126
  name: rspec
177
- requirement: !ruby/object:Gem::Requirement
127
+ requirement: &2157271400 !ruby/object:Gem::Requirement
178
128
  none: false
179
129
  requirements:
180
130
  - - ! '>='
@@ -182,15 +132,10 @@ dependencies:
182
132
  version: '0'
183
133
  type: :development
184
134
  prerelease: false
185
- version_requirements: !ruby/object:Gem::Requirement
186
- none: false
187
- requirements:
188
- - - ! '>='
189
- - !ruby/object:Gem::Version
190
- version: '0'
135
+ version_requirements: *2157271400
191
136
  - !ruby/object:Gem::Dependency
192
137
  name: simplecov
193
- requirement: !ruby/object:Gem::Requirement
138
+ requirement: &2157269940 !ruby/object:Gem::Requirement
194
139
  none: false
195
140
  requirements:
196
141
  - - ! '>='
@@ -198,15 +143,10 @@ dependencies:
198
143
  version: '0'
199
144
  type: :development
200
145
  prerelease: false
201
- version_requirements: !ruby/object:Gem::Requirement
202
- none: false
203
- requirements:
204
- - - ! '>='
205
- - !ruby/object:Gem::Version
206
- version: '0'
146
+ version_requirements: *2157269940
207
147
  - !ruby/object:Gem::Dependency
208
148
  name: yard
209
- requirement: !ruby/object:Gem::Requirement
149
+ requirement: &2157262520 !ruby/object:Gem::Requirement
210
150
  none: false
211
151
  requirements:
212
152
  - - ! '>='
@@ -214,12 +154,7 @@ dependencies:
214
154
  version: '0'
215
155
  type: :development
216
156
  prerelease: false
217
- version_requirements: !ruby/object:Gem::Requirement
218
- none: false
219
- requirements:
220
- - - ! '>='
221
- - !ruby/object:Gem::Version
222
- version: '0'
157
+ version_requirements: *2157262520
223
158
  description: Google Protocol Buffers v2.4.1 Serialization and RPC implementation for
224
159
  Ruby.
225
160
  email:
@@ -499,7 +434,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
499
434
  version: '0'
500
435
  segments:
501
436
  - 0
502
- hash: -673423541748096297
437
+ hash: 3471971935488501611
503
438
  required_rubygems_version: !ruby/object:Gem::Requirement
504
439
  none: false
505
440
  requirements:
@@ -508,12 +443,93 @@ required_rubygems_version: !ruby/object:Gem::Requirement
508
443
  version: '0'
509
444
  segments:
510
445
  - 0
511
- hash: -673423541748096297
446
+ hash: 3471971935488501611
512
447
  requirements: []
513
448
  rubyforge_project:
514
- rubygems_version: 1.8.25
449
+ rubygems_version: 1.8.15
515
450
  signing_key:
516
451
  specification_version: 3
517
452
  summary: Google Protocol Buffers v2.4.1 Serialization and RPC implementation for Ruby.
518
- test_files: []
453
+ test_files:
454
+ - spec/benchmark/tasks.rb
455
+ - spec/functional/embedded_service_spec.rb
456
+ - spec/functional/evented_server_spec.rb
457
+ - spec/functional/socket_server_spec.rb
458
+ - spec/functional/zmq_server_spec.rb
459
+ - spec/lib/protobuf/cli_spec.rb
460
+ - spec/lib/protobuf/enum_spec.rb
461
+ - spec/lib/protobuf/enum_value_spec.rb
462
+ - spec/lib/protobuf/field/int32_field_spec.rb
463
+ - spec/lib/protobuf/logger_spec.rb
464
+ - spec/lib/protobuf/message_spec.rb
465
+ - spec/lib/protobuf/rpc/client_spec.rb
466
+ - spec/lib/protobuf/rpc/connector_spec.rb
467
+ - spec/lib/protobuf/rpc/connectors/base_spec.rb
468
+ - spec/lib/protobuf/rpc/connectors/common_spec.rb
469
+ - spec/lib/protobuf/rpc/connectors/socket_spec.rb
470
+ - spec/lib/protobuf/rpc/connectors/zmq_spec.rb
471
+ - spec/lib/protobuf/rpc/servers/evented_server_spec.rb
472
+ - spec/lib/protobuf/rpc/servers/socket_server_spec.rb
473
+ - spec/lib/protobuf/rpc/servers/zmq/broker_spec.rb
474
+ - spec/lib/protobuf/rpc/servers/zmq/server_spec.rb
475
+ - spec/lib/protobuf/rpc/servers/zmq/util_spec.rb
476
+ - spec/lib/protobuf/rpc/servers/zmq/worker_spec.rb
477
+ - spec/lib/protobuf/rpc/service_dispatcher_spec.rb
478
+ - spec/lib/protobuf/rpc/service_filters_spec.rb
479
+ - spec/lib/protobuf/rpc/service_spec.rb
480
+ - spec/lib/protobuf_spec.rb
481
+ - spec/spec_helper.rb
482
+ - spec/support/all.rb
483
+ - spec/support/packed_field.rb
484
+ - spec/support/server.rb
485
+ - spec/support/test/enum.pb.rb
486
+ - spec/support/test/enum.proto
487
+ - spec/support/test/resource.pb.rb
488
+ - spec/support/test/resource.proto
489
+ - spec/support/test/resource_service.rb
490
+ - spec/support/test_app_file.rb
491
+ - spec/support/tolerance_matcher.rb
492
+ - test/data/data.bin
493
+ - test/data/data_source.py
494
+ - test/data/types.bin
495
+ - test/data/types_source.py
496
+ - test/data/unk.png
497
+ - test/proto/addressbook.pb.rb
498
+ - test/proto/addressbook.proto
499
+ - test/proto/addressbook_base.pb.rb
500
+ - test/proto/addressbook_base.proto
501
+ - test/proto/addressbook_ext.pb.rb
502
+ - test/proto/addressbook_ext.proto
503
+ - test/proto/collision.pb.rb
504
+ - test/proto/collision.proto
505
+ - test/proto/ext_collision.pb.rb
506
+ - test/proto/ext_collision.proto
507
+ - test/proto/ext_range.pb.rb
508
+ - test/proto/ext_range.proto
509
+ - test/proto/float_default.proto
510
+ - test/proto/lowercase.pb.rb
511
+ - test/proto/lowercase.proto
512
+ - test/proto/merge.pb.rb
513
+ - test/proto/merge.proto
514
+ - test/proto/nested.pb.rb
515
+ - test/proto/nested.proto
516
+ - test/proto/optional_field.pb.rb
517
+ - test/proto/optional_field.proto
518
+ - test/proto/packed.pb.rb
519
+ - test/proto/packed.proto
520
+ - test/proto/rpc.proto
521
+ - test/proto/types.pb.rb
522
+ - test/proto/types.proto
523
+ - test/test_addressbook.rb
524
+ - test/test_enum_value.rb
525
+ - test/test_extension.rb
526
+ - test/test_lowercase.rb
527
+ - test/test_message.rb
528
+ - test/test_optional_field.rb
529
+ - test/test_packed_field.rb
530
+ - test/test_parse.rb
531
+ - test/test_repeated_types.rb
532
+ - test/test_serialize.rb
533
+ - test/test_standard_message.rb
534
+ - test/test_types.rb
519
535
  has_rdoc: