protobuf 2.4.3.rc1 → 2.4.3
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/lib/protobuf/field/base_field.rb +54 -30
- data/lib/protobuf/field/bytes_field.rb +12 -11
- data/lib/protobuf/field/enum_field.rb +4 -0
- data/lib/protobuf/field/field_array.rb +10 -1
- data/lib/protobuf/field/message_field.rb +5 -1
- data/lib/protobuf/field/string_field.rb +7 -1
- data/lib/protobuf/field/varint_field.rb +9 -1
- data/lib/protobuf/message.rb +12 -13
- data/lib/protobuf/rpc/client.rb +1 -1
- data/lib/protobuf/rpc/servers/socket/server.rb +1 -1
- data/lib/protobuf/version.rb +1 -1
- data/spec/lib/protobuf/message_spec.rb +11 -0
- data/spec/lib/protobuf/rpc/client_spec.rb +1 -1
- metadata +9 -6
@@ -4,6 +4,15 @@ require 'protobuf/field/field_array'
|
|
4
4
|
module Protobuf
|
5
5
|
module Field
|
6
6
|
class BaseField
|
7
|
+
##
|
8
|
+
# Constants
|
9
|
+
#
|
10
|
+
PACKED_TYPES = [
|
11
|
+
::Protobuf::WireType::VARINT,
|
12
|
+
::Protobuf::WireType::FIXED32,
|
13
|
+
::Protobuf::WireType::FIXED64
|
14
|
+
].freeze
|
15
|
+
|
7
16
|
##
|
8
17
|
# Attributes
|
9
18
|
#
|
@@ -29,24 +38,11 @@ module Protobuf
|
|
29
38
|
@extension = options.delete(:extension)
|
30
39
|
@packed = repeated? && options.delete(:packed)
|
31
40
|
@deprecated = options.delete(:deprecated)
|
32
|
-
unless options.empty?
|
33
|
-
warn "WARNING: Invalid options: #{options.inspect} (in #{@message_class.name.split('::').last}.#{@name})"
|
34
|
-
end
|
35
|
-
|
36
|
-
if packed? && ! [WireType::VARINT, WireType::FIXED32, WireType::FIXED64].include?(wire_type)
|
37
|
-
raise "Can't use packed encoding for `#{@type}' type"
|
38
|
-
end
|
39
|
-
|
40
|
-
@default_value = \
|
41
|
-
case @rule
|
42
|
-
when :repeated then
|
43
|
-
::Protobuf::Field::FieldArray.new(self).freeze
|
44
|
-
when :required then
|
45
|
-
nil
|
46
|
-
when :optional then
|
47
|
-
typed_default_value
|
48
|
-
end
|
49
41
|
|
42
|
+
set_rule_predicates
|
43
|
+
set_default_value
|
44
|
+
warn_excess_options(options) unless options.empty?
|
45
|
+
validate_packed_field if packed?
|
50
46
|
define_accessor
|
51
47
|
end
|
52
48
|
|
@@ -58,13 +54,11 @@ module Protobuf
|
|
58
54
|
end
|
59
55
|
|
60
56
|
def enum?
|
61
|
-
|
62
|
-
@_enum = (self.class < ::Protobuf::Field::EnumField)
|
57
|
+
false
|
63
58
|
end
|
64
59
|
|
65
60
|
def message?
|
66
|
-
|
67
|
-
@_message = (self.class < ::Protobuf::Field::MessageField)
|
61
|
+
false
|
68
62
|
end
|
69
63
|
|
70
64
|
# Decode +bytes+ and pass to +message_instance+.
|
@@ -103,25 +97,22 @@ module Protobuf
|
|
103
97
|
end
|
104
98
|
|
105
99
|
def extension?
|
106
|
-
|
100
|
+
!! @extension
|
107
101
|
end
|
108
102
|
|
109
103
|
# Is this a repeated field?
|
110
104
|
def repeated?
|
111
|
-
|
112
|
-
@_repeated = (@rule == :repeated)
|
105
|
+
!! @repeated
|
113
106
|
end
|
114
107
|
|
115
108
|
# Is this a required field?
|
116
109
|
def required?
|
117
|
-
|
118
|
-
@_required = (@rule == :required)
|
110
|
+
!! @required
|
119
111
|
end
|
120
112
|
|
121
113
|
# Is this a optional field?
|
122
114
|
def optional?
|
123
|
-
|
124
|
-
@_optional = (@rule == :optional)
|
115
|
+
!! @optional
|
125
116
|
end
|
126
117
|
|
127
118
|
# Is this a deprecated field?
|
@@ -184,8 +175,9 @@ module Protobuf
|
|
184
175
|
@message_class.class_eval do
|
185
176
|
define_method(field.setter_method_name) do |val|
|
186
177
|
field.warn_if_deprecated
|
178
|
+
val.compact! if val.respond_to?(:compact!)
|
187
179
|
|
188
|
-
if val.nil?
|
180
|
+
if val.nil? || (val.respond_to?(:empty?) && val.empty?)
|
189
181
|
@values.delete(field.name)
|
190
182
|
else
|
191
183
|
@values[field.name] ||= ::Protobuf::Field::FieldArray.new(field)
|
@@ -211,7 +203,7 @@ module Protobuf
|
|
211
203
|
define_method(field.setter_method_name) do |val|
|
212
204
|
field.warn_if_deprecated
|
213
205
|
|
214
|
-
if val.nil?
|
206
|
+
if val.nil? || (val.respond_to?(:empty?) && val.empty?)
|
215
207
|
@values.delete(field.name)
|
216
208
|
elsif field.acceptable?(val)
|
217
209
|
@values[field.name] = val
|
@@ -222,6 +214,28 @@ module Protobuf
|
|
222
214
|
end
|
223
215
|
end
|
224
216
|
|
217
|
+
def set_default_value
|
218
|
+
@default_value = case
|
219
|
+
when repeated? then ::Protobuf::Field::FieldArray.new(self).freeze
|
220
|
+
when required? then nil
|
221
|
+
when optional? then typed_default_value
|
222
|
+
end
|
223
|
+
end
|
224
|
+
|
225
|
+
def set_rule_predicates
|
226
|
+
case @rule
|
227
|
+
when :repeated then
|
228
|
+
@required = @optional = false
|
229
|
+
@repeated = true
|
230
|
+
when :required then
|
231
|
+
@repeated = @optional = false
|
232
|
+
@required = true
|
233
|
+
when :optional then
|
234
|
+
@repeated = @required = false
|
235
|
+
@optional = true
|
236
|
+
end
|
237
|
+
end
|
238
|
+
|
225
239
|
def typed_default_value
|
226
240
|
if @default.nil?
|
227
241
|
self.class.default
|
@@ -230,6 +244,16 @@ module Protobuf
|
|
230
244
|
end
|
231
245
|
end
|
232
246
|
|
247
|
+
def validate_packed_field
|
248
|
+
if packed? && ! ::Protobuf::Field::BaseField::PACKED_TYPES.include?(wire_type)
|
249
|
+
raise "Can't use packed encoding for `#{@type}' type"
|
250
|
+
end
|
251
|
+
end
|
252
|
+
|
253
|
+
def warn_excess_options(options)
|
254
|
+
warn "WARNING: Invalid options: #{options.inspect} (in #{@message_class.name.split('::').last}.#{@name})"
|
255
|
+
end
|
256
|
+
|
233
257
|
end
|
234
258
|
end
|
235
259
|
end
|
@@ -1,14 +1,14 @@
|
|
1
|
+
require 'protobuf/wire_type'
|
2
|
+
|
1
3
|
module Protobuf
|
2
4
|
module Field
|
3
5
|
class BytesField < BaseField
|
6
|
+
BYTES_ENCODING = "ASCII-8BIT".freeze
|
7
|
+
|
4
8
|
def self.default
|
5
9
|
''
|
6
10
|
end
|
7
11
|
|
8
|
-
def wire_type
|
9
|
-
WireType::LENGTH_DELIMITED
|
10
|
-
end
|
11
|
-
|
12
12
|
def acceptable?(val)
|
13
13
|
if val.nil? || val.is_a?(::Protobuf::Message) || val.instance_of?(String)
|
14
14
|
return true
|
@@ -18,20 +18,21 @@ module Protobuf
|
|
18
18
|
end
|
19
19
|
|
20
20
|
def decode(bytes)
|
21
|
-
bytes.force_encoding(::Protobuf::
|
21
|
+
bytes.force_encoding(::Protobuf::Field::BytesField::BYTES_ENCODING)
|
22
22
|
bytes
|
23
23
|
end
|
24
24
|
|
25
25
|
def encode(value)
|
26
|
-
if value.is_a?(::Protobuf::Message)
|
27
|
-
|
28
|
-
else
|
29
|
-
value.force_encoding(::Protobuf::Message::STRING_ENCODING) if value.respond_to?(:force_encoding)
|
30
|
-
end
|
26
|
+
value = value.serialize_to_string if value.is_a?(::Protobuf::Message)
|
27
|
+
value.force_encoding(::Protobuf::Field::BytesField::BYTES_ENCODING)
|
31
28
|
|
32
|
-
string_size = VarintField.encode(value.size)
|
29
|
+
string_size = ::Protobuf::Field::VarintField.encode(value.size)
|
33
30
|
string_size << value
|
34
31
|
end
|
32
|
+
|
33
|
+
def wire_type
|
34
|
+
::Protobuf::WireType::LENGTH_DELIMITED
|
35
|
+
end
|
35
36
|
end
|
36
37
|
end
|
37
38
|
end
|
@@ -28,7 +28,7 @@ module Protobuf
|
|
28
28
|
end
|
29
29
|
|
30
30
|
def replace(val)
|
31
|
-
|
31
|
+
raise_type_error(val) unless val.is_a?(Array)
|
32
32
|
val = val.map { |v| normalize(v) }
|
33
33
|
super(val)
|
34
34
|
end
|
@@ -60,6 +60,15 @@ module Protobuf
|
|
60
60
|
value
|
61
61
|
end
|
62
62
|
end
|
63
|
+
|
64
|
+
def raise_type_error(val)
|
65
|
+
error_text = <<-TYPE_ERROR
|
66
|
+
Expected value of type '#{@field.type}'
|
67
|
+
Got '#{val.class}' for protobuf field #{@field.name}
|
68
|
+
TYPE_ERROR
|
69
|
+
|
70
|
+
raise TypeError, error_text
|
71
|
+
end
|
63
72
|
end
|
64
73
|
end
|
65
74
|
end
|
@@ -21,10 +21,14 @@ module Protobuf
|
|
21
21
|
|
22
22
|
def encode(value)
|
23
23
|
bytes = value.serialize_to_string
|
24
|
-
result = VarintField.encode(bytes.size)
|
24
|
+
result = ::Protobuf::Field::VarintField.encode(bytes.size)
|
25
25
|
result << bytes
|
26
26
|
end
|
27
27
|
|
28
|
+
def message?
|
29
|
+
true
|
30
|
+
end
|
31
|
+
|
28
32
|
def wire_type
|
29
33
|
::Protobuf::WireType::LENGTH_DELIMITED
|
30
34
|
end
|
@@ -6,9 +6,15 @@ module Protobuf
|
|
6
6
|
ENCODING = 'UTF-8'.freeze
|
7
7
|
|
8
8
|
def decode(bytes)
|
9
|
-
bytes.force_encoding(::Protobuf::Field::StringField::ENCODING)
|
9
|
+
bytes.force_encoding(::Protobuf::Field::StringField::ENCODING)
|
10
10
|
bytes
|
11
11
|
end
|
12
|
+
|
13
|
+
def encode(value)
|
14
|
+
value.force_encoding(::Protobuf::Field::StringField::ENCODING)
|
15
|
+
string_size = ::Protobuf::Field::VarintField.encode(value.size)
|
16
|
+
string_size << value
|
17
|
+
end
|
12
18
|
end
|
13
19
|
end
|
14
20
|
end
|
@@ -49,7 +49,15 @@ module Protobuf
|
|
49
49
|
end
|
50
50
|
|
51
51
|
def encode(value)
|
52
|
-
|
52
|
+
return [value].pack('C') if value < 128
|
53
|
+
|
54
|
+
bytes = []
|
55
|
+
until value == 0
|
56
|
+
bytes << (0x80 | (value & 0x7f))
|
57
|
+
value >>= 7
|
58
|
+
end
|
59
|
+
bytes[-1] &= 0x7f
|
60
|
+
bytes.pack('C*')
|
53
61
|
end
|
54
62
|
|
55
63
|
def wire_type
|
data/lib/protobuf/message.rb
CHANGED
@@ -6,10 +6,6 @@ require 'protobuf/message/decoder'
|
|
6
6
|
|
7
7
|
module Protobuf
|
8
8
|
class Message
|
9
|
-
##
|
10
|
-
# Constants
|
11
|
-
#
|
12
|
-
STRING_ENCODING = "ASCII-8BIT".freeze
|
13
9
|
|
14
10
|
##
|
15
11
|
# Class Methods
|
@@ -160,7 +156,7 @@ module Protobuf
|
|
160
156
|
|
161
157
|
def each_field_for_serialization
|
162
158
|
all_fields.each do |field|
|
163
|
-
next unless
|
159
|
+
next unless __field_must_be_serialized__?(field)
|
164
160
|
|
165
161
|
value = @values[field.name]
|
166
162
|
|
@@ -269,6 +265,10 @@ module Protobuf
|
|
269
265
|
to_hash.to_json
|
270
266
|
end
|
271
267
|
|
268
|
+
def to_proto
|
269
|
+
self
|
270
|
+
end
|
271
|
+
|
272
272
|
def ==(obj)
|
273
273
|
return false unless obj.is_a?(self.class)
|
274
274
|
each_field do |field, value|
|
@@ -297,6 +297,7 @@ module Protobuf
|
|
297
297
|
# Instance Aliases
|
298
298
|
#
|
299
299
|
alias_method :to_hash_value, :to_hash
|
300
|
+
alias_method :to_proto_hash, :to_hash
|
300
301
|
alias_method :to_s, :serialize_to_string
|
301
302
|
alias_method :bytes, :serialize_to_string
|
302
303
|
alias_method :serialize, :serialize_to_string
|
@@ -334,15 +335,13 @@ module Protobuf
|
|
334
335
|
object
|
335
336
|
end
|
336
337
|
|
337
|
-
def
|
338
|
-
|
339
|
-
|
340
|
-
if field.repeated? && has_field?(field.name)
|
341
|
-
@values[field.name].compact!
|
342
|
-
@values.delete(field.name) if @values[field.name].empty?
|
343
|
-
end
|
338
|
+
def __field_must_be_serialized__?(field)
|
339
|
+
field.required? || __field_value_is_present__?(field)
|
340
|
+
end
|
344
341
|
|
345
|
-
|
342
|
+
def __field_value_is_present__?(field)
|
343
|
+
value = @values[field.name]
|
344
|
+
!value.nil? && (value.present? || [true, false].include?(value))
|
346
345
|
end
|
347
346
|
|
348
347
|
# Encode key and value, and write to +stream+.
|
data/lib/protobuf/rpc/client.rb
CHANGED
@@ -10,7 +10,7 @@ module Protobuf
|
|
10
10
|
extend Forwardable
|
11
11
|
include Protobuf::Logger::LogMethods
|
12
12
|
|
13
|
-
|
13
|
+
def_delegators :@connector, :options, :complete_cb, :success_cb, :failure_cb
|
14
14
|
attr_reader :connector
|
15
15
|
|
16
16
|
# Create a new client with default options (defined in ClientConnection)
|
@@ -9,7 +9,7 @@ module Protobuf
|
|
9
9
|
include ::Protobuf::Rpc::Server
|
10
10
|
include ::Protobuf::Logger::LogMethods
|
11
11
|
|
12
|
-
AUTO_COLLECT_TIMEOUT =
|
12
|
+
AUTO_COLLECT_TIMEOUT = 5 # seconds
|
13
13
|
|
14
14
|
def self.cleanup?
|
15
15
|
# every 10 connections run a cleanup routine after closing the response
|
data/lib/protobuf/version.rb
CHANGED
@@ -40,6 +40,17 @@ describe Protobuf::Message do
|
|
40
40
|
message.serialize_to_string
|
41
41
|
}.to_not raise_error
|
42
42
|
end
|
43
|
+
|
44
|
+
it "sets the value to nil when empty array is passed" do
|
45
|
+
message.repeated_enum = []
|
46
|
+
message.instance_variable_get("@values")[:repeated_enum].should be_nil
|
47
|
+
end
|
48
|
+
|
49
|
+
it "raises TypeError when a non-array replaces it" do
|
50
|
+
expect {
|
51
|
+
message.repeated_enum = 2
|
52
|
+
}.to raise_error(/value of type/)
|
53
|
+
end
|
43
54
|
end
|
44
55
|
end
|
45
56
|
|
@@ -9,7 +9,7 @@ describe Protobuf::Rpc::Client do
|
|
9
9
|
context "when using fiber based calls" do
|
10
10
|
it "waits for response" do
|
11
11
|
EventMachine.fiber_run do
|
12
|
-
StubServer.new(:delay =>
|
12
|
+
StubServer.new(:delay => 1) do |server|
|
13
13
|
client = Test::ResourceService.client
|
14
14
|
start = now
|
15
15
|
|
metadata
CHANGED
@@ -1,8 +1,8 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: protobuf
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.4.3
|
5
|
-
prerelease:
|
4
|
+
version: 2.4.3
|
5
|
+
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
8
|
- BJ Neilsen
|
@@ -10,7 +10,7 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date: 2012-11-
|
13
|
+
date: 2012-11-17 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: activesupport
|
@@ -498,13 +498,16 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
498
498
|
version: '0'
|
499
499
|
segments:
|
500
500
|
- 0
|
501
|
-
hash:
|
501
|
+
hash: 1946796344651768063
|
502
502
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
503
503
|
none: false
|
504
504
|
requirements:
|
505
|
-
- - ! '
|
505
|
+
- - ! '>='
|
506
506
|
- !ruby/object:Gem::Version
|
507
|
-
version:
|
507
|
+
version: '0'
|
508
|
+
segments:
|
509
|
+
- 0
|
510
|
+
hash: 1946796344651768063
|
508
511
|
requirements: []
|
509
512
|
rubyforge_project:
|
510
513
|
rubygems_version: 1.8.24
|