ruby_protobuf 0.1.0 → 0.2.0

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.
@@ -1,4 +1,4 @@
1
- require 'protobuf/message'
1
+ require 'protobuf/message/message'
2
2
 
3
3
  module Protobuf
4
4
  class Extend < Message
@@ -1,55 +1,43 @@
1
- require 'protobuf/wire_type'
1
+ require 'protobuf/common/wire_type'
2
+ require 'protobuf/descriptor/field_descriptor'
2
3
 
3
4
  module Protobuf
4
5
  module Field
5
6
  def self.build(message_class, rule, type, name, tag, opts={})
6
- Base.build message_class, rule, type, name, tag, opts
7
+ field_class =
8
+ if [:double, :float, :int32, :int64, :uint32, :uint64,
9
+ :sint32, :sint64, :fixed32, :fixed64, :sfixed32, :sfixed64,
10
+ :bool, :string, :bytes].include? type
11
+ eval "Protobuf::Field::#{type.to_s.capitalize}Field"
12
+ else
13
+ Protobuf::Field::FieldProxy
14
+ end
15
+ field_class.new message_class, rule, type, name, tag, opts
7
16
  end
8
17
 
9
18
  class InvalidRuleError < StandardError; end
10
19
 
11
- class Base
20
+ class BaseField
12
21
  class <<self
13
- def build(message_class, rule, type, name, tag, opts={})
14
- field_class = nil
15
- begin
16
- field_class = eval "Protobuf::Field::#{type.to_s.capitalize}Field"
17
- rescue NameError
18
- type = typename_to_class message_class, type
19
- field_class =
20
- if type.superclass == Protobuf::Enum
21
- Protobuf::Field::Enum
22
- elsif type.superclass == Protobuf::Message
23
- Protobuf::Field::Message
24
- else
25
- raise $!
26
- end
27
- end
28
- field_class.new message_class, rule, type, name, tag, opts
29
- end
30
-
31
- def typename_to_class(message_class, type)
32
- modules = message_class.to_s.split('::')
33
- while
34
- begin
35
- type = eval((modules | [type.to_s]).join('::'))
36
- break
37
- rescue NameError
38
- modules.empty? ? raise($!) : modules.pop
39
- end
40
- end
41
- type
22
+ def descriptor
23
+ @descriptor ||= Protobuf::Descriptor::FieldDescriptor.new
42
24
  end
43
25
  end
44
26
 
45
27
  attr_accessor :message_class, :rule, :type, :name, :tag, :default
46
28
 
29
+ def descriptor
30
+ @descriptor ||= Protobuf::Descriptor::FieldDescriptor.new self
31
+ end
32
+
47
33
  def initialize(message_class, rule, type, name, tag, opts={})
48
34
  @message_class, @rule, @type, @name, @tag, @default =
49
35
  message_class, rule, type, name, tag, opts[:default]
50
36
  @error_message = 'Type invalid'
51
37
  end
52
38
 
39
+ def ready?; true end
40
+
53
41
  def default_value
54
42
  case rule
55
43
  when :repeated
@@ -150,6 +138,41 @@ module Protobuf
150
138
  end
151
139
  end
152
140
 
141
+ class FieldProxy
142
+ def initialize(message_class, rule, type, name, tag, opts={})
143
+ @message_class, @rule, @type, @name, @tag, @opts =
144
+ message_class, rule, type, name, tag, opts
145
+ end
146
+
147
+ def ready?; false end
148
+
149
+ def setup
150
+ type = typename_to_class @message_class, @type
151
+ field_class =
152
+ if type.superclass == Protobuf::Enum
153
+ Protobuf::Field::EnumField
154
+ elsif type.superclass == Protobuf::Message
155
+ Protobuf::Field::MessageField
156
+ else
157
+ raise $!
158
+ end
159
+ field_class.new @message_class, @rule, type, @name, @tag, @opts
160
+ end
161
+
162
+ def typename_to_class(message_class, type)
163
+ modules = message_class.to_s.split('::')
164
+ while
165
+ begin
166
+ type = eval((modules | [type.to_s]).join('::'))
167
+ break
168
+ rescue NameError
169
+ modules.empty? ? raise($!) : modules.pop
170
+ end
171
+ end
172
+ type
173
+ end
174
+ end
175
+
153
176
  class FieldArray < Array
154
177
  def initialize(field)
155
178
  @field = field
@@ -184,7 +207,7 @@ module Protobuf
184
207
  end
185
208
  end
186
209
 
187
- class StringField < Base
210
+ class StringField < BaseField
188
211
  def wire_type
189
212
  Protobuf::WireType::LENGTH_DELIMITED
190
213
  end
@@ -201,16 +224,22 @@ module Protobuf
201
224
  def set_bytes(method_instance, bytes)
202
225
  method_instance.send("#{name}=", bytes.pack('U*'))
203
226
  end
227
+
228
+ def set_array(method_instance, bytes)
229
+ message = bytes.pack('U*')
230
+ arr = method_instance.send name
231
+ arr << message
232
+ end
204
233
 
205
234
  def get_bytes(value)
206
235
  bytes = value.unpack('U*')
207
- string_size = Int.get_bytes bytes.size
236
+ string_size = VarintField.get_bytes bytes.size
208
237
  #(string_size + bytes).pack('C*')
209
238
  string_size + bytes.pack('C*')
210
239
  end
211
240
  end
212
241
 
213
- class BytesField < Base
242
+ class BytesField < BaseField
214
243
  def wire_type
215
244
  Protobuf::WireType::VARINT
216
245
  end
@@ -224,12 +253,12 @@ module Protobuf
224
253
  end
225
254
 
226
255
  def get_bytes(value)
227
- string_size = Int.get_bytes value.size
256
+ string_size = VarintField.get_bytes value.size
228
257
  string_size + value.pack('C*')
229
258
  end
230
259
  end
231
260
 
232
- class Int < Base
261
+ class VarintField < BaseField
233
262
  def wire_type
234
263
  Protobuf::WireType::VARINT
235
264
  end
@@ -278,27 +307,27 @@ module Protobuf
278
307
  end
279
308
  end
280
309
 
281
- class Int32Field < Int
310
+ class Int32Field < VarintField
282
311
  def self.max; 1.0/0.0 end
283
312
  def self.min; -1.0/0.0 end
284
313
  end
285
314
 
286
- class Int64Field < Int
315
+ class Int64Field < VarintField
287
316
  def self.max; 1.0/0.0 end
288
317
  def self.min; -1.0/0.0 end
289
318
  end
290
319
 
291
- class Uint32Field < Int
320
+ class Uint32Field < VarintField
292
321
  def self.max; 1.0/0.0 end
293
322
  def self.min; 0 end
294
323
  end
295
324
 
296
- class Uint64Field < Int
325
+ class Uint64Field < VarintField
297
326
  def self.max; 1.0/0.0 end
298
327
  def self.min; 0 end
299
328
  end
300
329
 
301
- class Sint32Field < Int
330
+ class Sint32Field < VarintField
302
331
  def self.max; 1.0/0.0 end
303
332
  def self.min; -1.0/0.0 end
304
333
 
@@ -320,7 +349,7 @@ module Protobuf
320
349
  end
321
350
  end
322
351
 
323
- class Sint64Field < Int
352
+ class Sint64Field < VarintField
324
353
  def self.max; 1.0/0.0 end
325
354
  def self.min; -1.0/0.0 end
326
355
 
@@ -342,7 +371,7 @@ module Protobuf
342
371
  end
343
372
  end
344
373
 
345
- class DoubleField < Int
374
+ class DoubleField < VarintField
346
375
  def wire_type
347
376
  Protobuf::WireType::FIXED64
348
377
  end
@@ -372,7 +401,7 @@ module Protobuf
372
401
  end
373
402
  end
374
403
 
375
- class FloatField < Int
404
+ class FloatField < VarintField
376
405
  def wire_type
377
406
  Protobuf::WireType::FIXED32
378
407
  end
@@ -402,7 +431,7 @@ module Protobuf
402
431
  end
403
432
  end
404
433
 
405
- class Fixed32Field < Int
434
+ class Fixed32Field < VarintField
406
435
  def wire_type
407
436
  Protobuf::WireType::FIXED32
408
437
  end
@@ -424,7 +453,7 @@ module Protobuf
424
453
  end
425
454
  end
426
455
 
427
- class Fixed64Field < Int
456
+ class Fixed64Field < VarintField
428
457
  def wire_type
429
458
  Protobuf::WireType::FIXED64
430
459
  end
@@ -446,7 +475,7 @@ module Protobuf
446
475
  end
447
476
  end
448
477
 
449
- class Sfinxed32Field < Int
478
+ class Sfinxed32Field < VarintField
450
479
  def wire_type
451
480
  Protobuf::WireType::FIXED32
452
481
  end
@@ -460,7 +489,7 @@ module Protobuf
460
489
  end
461
490
  end
462
491
 
463
- class Sfixed64Field < Int
492
+ class Sfixed64Field < VarintField
464
493
  def wire_type
465
494
  Protobuf::WireType::FIXED64
466
495
  end
@@ -474,7 +503,7 @@ module Protobuf
474
503
  end
475
504
  end
476
505
 
477
- class BoolField < Int
506
+ class BoolField < VarintField
478
507
  def typed_default_value(default=nil)
479
508
  default or false
480
509
  end
@@ -493,7 +522,7 @@ module Protobuf
493
522
  end
494
523
  end
495
524
 
496
- class Message < Base
525
+ class MessageField < BaseField
497
526
  def wire_type
498
527
  Protobuf::WireType::LENGTH_DELIMITED
499
528
  end
@@ -530,14 +559,14 @@ module Protobuf
530
559
  stringio = StringIO.new ''
531
560
  value.serialize_to stringio
532
561
  bytes = stringio.string.unpack 'C*'
533
- string_size = Int.get_bytes bytes.size
562
+ string_size = VarintField.get_bytes bytes.size
534
563
  #(string_size + bytes).pack('C*')
535
564
  #bytes + string_size
536
565
  string_size + bytes.pack('C*')
537
566
  end
538
567
  end
539
568
 
540
- class Enum < Int
569
+ class EnumField < VarintField
541
570
  def acceptable?(val)
542
571
  raise TypeError unless type.valid_tag? val
543
572
  true
@@ -1,7 +1,8 @@
1
1
  require 'stringio'
2
- require 'protobuf/decoder'
3
- require 'protobuf/encoder'
4
- require 'protobuf/field'
2
+ require 'protobuf/message/decoder'
3
+ require 'protobuf/message/encoder'
4
+ require 'protobuf/message/field'
5
+ require 'protobuf/descriptor/descriptor'
5
6
 
6
7
  module Protobuf
7
8
  OPTIONS = {}
@@ -48,10 +49,18 @@ module Protobuf
48
49
  raise TypeError
49
50
  end
50
51
  end
52
+
53
+ def descriptor
54
+ @descriptor ||= Protobuf::Descriptor::Descriptor.new(self)
55
+ end
51
56
  end
52
57
 
53
58
  def initialize
54
59
  fields.each do |tag, field|
60
+ unless field.ready?
61
+ field = field.setup
62
+ self.class.class_eval {@fields[tag] = field}
63
+ end
55
64
  field.define_accessor self
56
65
  end
57
66
  end
@@ -0,0 +1,9 @@
1
+ module Protobuf
2
+ class Service
3
+ class <<self
4
+ def rpc(hash)
5
+ raise NotImplementedError('TODO')
6
+ end
7
+ end
8
+ end
9
+ end
@@ -1,7 +1,7 @@
1
1
  require 'protobuf/compiler'
2
2
 
3
3
  class RubyProtobuf
4
- VERSION = '0.1.0'
4
+ VERSION = '0.2.0'
5
5
 
6
6
  def start(proto_file, options)
7
7
  unless File.exist?(proto_file)
@@ -1,7 +1,7 @@
1
- require 'protobuf/message'
2
- require 'protobuf/enum'
3
- require 'protobuf/service'
4
- require 'protobuf/extend'
1
+ require 'protobuf/message/message'
2
+ require 'protobuf/message/enum'
3
+ require 'protobuf/message/service'
4
+ require 'protobuf/message/extend'
5
5
 
6
6
  module Tutorial
7
7
  class Person < Protobuf::Message
@@ -39,3 +39,21 @@ module Tutorial
39
39
  #Protobuf::OPTIONS[:optimize_for] = :SPEED
40
40
  #Protobuf::OPTIONS[:java_package] = :'com.example.foo'
41
41
  end
42
+
43
+ =begin
44
+ tutorial = Object.const_set :Tutorial, Module.new
45
+ person = tutorial.const_set :Person, Class.new(Protobuf::Message)
46
+ person.required :string, :name, 1
47
+ person.required :int32, :id, 2
48
+ person.optional :string, :email, 3
49
+ phone_type = person.const_set :PhoneType, Class.new(Protobuf::Enum)
50
+ phone_type.const_set :MOBILE, 0
51
+ phone_type.const_set :HOME, 1
52
+ phone_type.const_set :WORK, 2
53
+ phone_number = person.const_set :PhoneNumber, Class.new(Protobuf::Message)
54
+ phone_number.required :string, :number, 1
55
+ phone_number.optional :PhoneType, :type, 2, {:default => :HOME}
56
+ person.repeated :PhoneNumber, :phone, 4
57
+ address_book = tutorial.const_set :AddressBook, Class.new(Protobuf::Message)
58
+ address_book.repeated :Person, :person, 1
59
+ =end
@@ -0,0 +1,30 @@
1
+ #!/usr/local/bin/ruby
2
+
3
+ $:.push "#{File.dirname(__FILE__)}/../lib"
4
+
5
+ require 'test/unit'
6
+ require 'protobuf/descriptor/descriptor_builder'
7
+ require 'protobuf/descriptor/descriptor_proto'
8
+
9
+ class DescriptorTest < Test::Unit::TestCase
10
+ def test_unbuild
11
+ tutorial_proto = Google::Protobuf::FileDescriptorProto.new
12
+ tutorial_proto.parse_from_file 'person.bin'
13
+ Protobuf::Descriptor::DescriptorBuilder.build tutorial_proto
14
+
15
+ assert_nothing_raised {Tutorial::Person}
16
+ assert_nothing_raised {Tutorial::Person.new}
17
+ assert_equal ['email', 'id', 'name', 'phone'],
18
+ Tutorial::Person.fields.map{|tag, field| field.name}.sort
19
+
20
+ assert_nothing_raised {Tutorial::Person::PhoneNumber}
21
+ assert_nothing_raised {Tutorial::Person::PhoneNumber.new}
22
+ assert_equal ['number', 'type'],
23
+ Tutorial::Person::PhoneNumber.fields.map{|tag, field| field.name}.sort
24
+
25
+ assert_nothing_raised {Tutorial::Person::PhoneType}
26
+ assert_equal 0, Tutorial::Person::PhoneType::MOBILE
27
+ assert_equal 1, Tutorial::Person::PhoneType::HOME
28
+ assert_equal 2, Tutorial::Person::PhoneType::WORK
29
+ end
30
+ end
@@ -0,0 +1,3 @@
1
+
2
+ John Doe� jdoe@example.com"
3
+ 555-4321
@@ -1,6 +1,6 @@
1
1
  require 'test/unit'
2
- require 'protobuf/message'
3
- require 'protobuf/enum'
2
+ require 'protobuf/message/message'
3
+ require 'protobuf/message/enum'
4
4
  require 'test/addressbook'
5
5
 
6
6
  class AddressbookTest < Test::Unit::TestCase
@@ -1,28 +1,28 @@
1
1
  require 'test/unit'
2
- require 'protobuf/compiler'
2
+ require 'protobuf/compiler/compiler'
3
3
 
4
4
  class CompilerTest < Test::Unit::TestCase
5
5
  def test_compile
6
6
  assert_equal <<-eos.strip, Protobuf::Compiler.compile('test/addressbook.proto').strip
7
- require 'protobuf/message'
8
- require 'protobuf/enum'
9
- require 'protobuf/service'
10
- require 'protobuf/extend'
7
+ require 'protobuf/message/message'
8
+ require 'protobuf/message/enum'
9
+ require 'protobuf/message/service'
10
+ require 'protobuf/message/extend'
11
11
 
12
12
  module Tutorial
13
13
 
14
- class Person < Protobuf::Message
14
+ class Person < ::Protobuf::Message
15
15
  required :string, :name, 1
16
16
  required :int32, :id, 2
17
17
  optional :string, :email, 3
18
18
 
19
- class PhoneType < Protobuf::Enum
19
+ class PhoneType < ::Protobuf::Enum
20
20
  MOBILE = 0
21
21
  HOME = 1
22
22
  WORK = 2
23
23
  end
24
24
 
25
- class PhoneNumber < Protobuf::Message
25
+ class PhoneNumber < ::Protobuf::Message
26
26
  required :string, :number, 1
27
27
  optional :PhoneType, :type, 2, {:default => :HOME}
28
28
  end
@@ -30,7 +30,7 @@ module Tutorial
30
30
  repeated :PhoneNumber, :phone, 4
31
31
  end
32
32
 
33
- class AddressBook < Protobuf::Message
33
+ class AddressBook < ::Protobuf::Message
34
34
  repeated :Person, :person, 1
35
35
  end
36
36
  end