protobuf 2.8.13 → 3.0.0.rc1
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.
- checksums.yaml +4 -4
- data/CHANGES.md +84 -5
- data/CONTRIBUTING.md +3 -3
- data/Rakefile +46 -7
- data/lib/protobuf/cli.rb +2 -20
- data/lib/protobuf/decoder.rb +74 -0
- data/lib/protobuf/deprecator.rb +42 -0
- data/lib/protobuf/descriptors/google/protobuf/compiler/plugin.pb.rb +17 -16
- data/lib/protobuf/descriptors/google/protobuf/descriptor.pb.rb +86 -85
- data/lib/protobuf/encoder.rb +62 -0
- data/lib/protobuf/enum.rb +298 -37
- data/lib/protobuf/field/base_field.rb +41 -27
- data/lib/protobuf/field/bool_field.rb +22 -4
- data/lib/protobuf/field/bytes_field.rb +36 -15
- data/lib/protobuf/field/double_field.rb +10 -3
- data/lib/protobuf/field/enum_field.rb +21 -18
- data/lib/protobuf/field/field_array.rb +26 -16
- data/lib/protobuf/field/fixed32_field.rb +10 -4
- data/lib/protobuf/field/fixed64_field.rb +10 -3
- data/lib/protobuf/field/float_field.rb +18 -5
- data/lib/protobuf/field/int32_field.rb +14 -4
- data/lib/protobuf/field/int64_field.rb +14 -4
- data/lib/protobuf/field/integer_field.rb +9 -4
- data/lib/protobuf/field/message_field.rb +16 -7
- data/lib/protobuf/field/sfixed32_field.rb +10 -3
- data/lib/protobuf/field/sfixed64_field.rb +12 -7
- data/lib/protobuf/field/signed_integer_field.rb +7 -0
- data/lib/protobuf/field/sint32_field.rb +14 -4
- data/lib/protobuf/field/sint64_field.rb +14 -4
- data/lib/protobuf/field/string_field.rb +11 -1
- data/lib/protobuf/field/uint32_field.rb +14 -4
- data/lib/protobuf/field/uint64_field.rb +14 -4
- data/lib/protobuf/field/varint_field.rb +11 -9
- data/lib/protobuf/field.rb +42 -25
- data/lib/protobuf/generators/enum_generator.rb +12 -1
- data/lib/protobuf/generators/field_generator.rb +1 -1
- data/lib/protobuf/lifecycle.rb +3 -4
- data/lib/protobuf/message/fields.rb +122 -0
- data/lib/protobuf/message/serialization.rb +84 -0
- data/lib/protobuf/message.rb +21 -221
- data/lib/protobuf/optionable.rb +23 -0
- data/lib/protobuf/rpc/client.rb +2 -4
- data/lib/protobuf/rpc/connector.rb +0 -2
- data/lib/protobuf/rpc/connectors/common.rb +2 -2
- data/lib/protobuf/rpc/dynamic_discovery.pb.rb +14 -16
- data/lib/protobuf/rpc/env.rb +58 -0
- data/lib/protobuf/rpc/error.rb +8 -5
- data/lib/protobuf/rpc/middleware/exception_handler.rb +36 -0
- data/lib/protobuf/rpc/middleware/logger.rb +91 -0
- data/lib/protobuf/rpc/middleware/request_decoder.rb +83 -0
- data/lib/protobuf/rpc/middleware/response_encoder.rb +88 -0
- data/lib/protobuf/rpc/middleware/runner.rb +18 -0
- data/lib/protobuf/rpc/middleware.rb +25 -0
- data/lib/protobuf/rpc/rpc.pb.rb +15 -16
- data/lib/protobuf/rpc/server.rb +14 -64
- data/lib/protobuf/rpc/servers/socket/server.rb +0 -2
- data/lib/protobuf/rpc/servers/socket/worker.rb +11 -15
- data/lib/protobuf/rpc/servers/zmq/util.rb +4 -1
- data/lib/protobuf/rpc/servers/zmq/worker.rb +5 -13
- data/lib/protobuf/rpc/servers/zmq_runner.rb +1 -1
- data/lib/protobuf/rpc/service.rb +38 -72
- data/lib/protobuf/rpc/service_dispatcher.rb +20 -108
- data/lib/protobuf/version.rb +1 -2
- data/lib/protobuf.rb +5 -13
- data/protobuf.gemspec +5 -5
- data/spec/benchmark/tasks.rb +2 -77
- data/spec/functional/zmq_server_spec.rb +13 -21
- data/spec/lib/protobuf/cli_spec.rb +5 -43
- data/spec/lib/protobuf/enum_spec.rb +194 -61
- data/spec/lib/protobuf/field_spec.rb +194 -0
- data/spec/lib/protobuf/generators/enum_generator_spec.rb +24 -1
- data/spec/lib/protobuf/generators/field_generator_spec.rb +6 -6
- data/spec/lib/protobuf/message_spec.rb +52 -70
- data/spec/lib/protobuf/optionable_spec.rb +46 -0
- data/spec/lib/protobuf/rpc/client_spec.rb +1 -93
- data/spec/lib/protobuf/rpc/connector_spec.rb +1 -7
- data/spec/lib/protobuf/rpc/connectors/zmq_spec.rb +8 -0
- data/spec/lib/protobuf/rpc/middleware/exception_handler_spec.rb +62 -0
- data/spec/lib/protobuf/rpc/middleware/logger_spec.rb +49 -0
- data/spec/lib/protobuf/rpc/middleware/request_decoder_spec.rb +115 -0
- data/spec/lib/protobuf/rpc/middleware/response_encoder_spec.rb +75 -0
- data/spec/lib/protobuf/rpc/servers/socket_server_spec.rb +0 -6
- data/spec/lib/protobuf/rpc/servers/zmq/util_spec.rb +10 -0
- data/spec/lib/protobuf/rpc/service_dispatcher_spec.rb +30 -105
- data/spec/lib/protobuf/rpc/service_filters_spec.rb +4 -4
- data/spec/lib/protobuf/rpc/service_spec.rb +20 -24
- data/spec/lib/protobuf_spec.rb +3 -3
- data/spec/spec_helper.rb +5 -4
- data/spec/support/packed_field.rb +15 -14
- data/spec/support/server.rb +4 -21
- data/spec/support/test/defaults.pb.rb +4 -4
- data/spec/support/test/enum.pb.rb +13 -1
- data/spec/support/test/enum.proto +15 -0
- data/spec/support/test/extended.pb.rb +1 -1
- data/spec/support/test/google_unittest.pb.rb +239 -241
- data/spec/support/test/google_unittest_import.pb.rb +2 -2
- data/spec/support/test/multi_field_extensions.pb.rb +2 -2
- data/spec/support/test/resource.pb.rb +19 -18
- data/spec/support/test/resource.proto +1 -0
- data/spec/support/test/resource_service.rb +5 -0
- metadata +78 -57
- data/bin/rprotoc +0 -8
- data/lib/protobuf/enum_value.rb +0 -85
- data/lib/protobuf/evented.rb +0 -37
- data/lib/protobuf/ext/eventmachine.rb +0 -14
- data/lib/protobuf/field/extension_fields.rb +0 -32
- data/lib/protobuf/message/decoder.rb +0 -72
- data/lib/protobuf/message/message.rb +0 -1
- data/lib/protobuf/rpc/connectors/em_client.rb +0 -84
- data/lib/protobuf/rpc/connectors/eventmachine.rb +0 -87
- data/lib/protobuf/rpc/servers/evented/server.rb +0 -36
- data/lib/protobuf/rpc/servers/evented_runner.rb +0 -31
- data/spec/functional/embedded_service_spec.rb +0 -7
- data/spec/functional/evented_server_spec.rb +0 -64
- data/spec/lib/protobuf/enum_value_spec.rb +0 -29
- data/spec/lib/protobuf/rpc/servers/evented_server_spec.rb +0 -19
data/lib/protobuf/enum.rb
CHANGED
@@ -1,58 +1,319 @@
|
|
1
|
-
require '
|
1
|
+
require 'delegate'
|
2
|
+
require 'protobuf/optionable'
|
3
|
+
require 'protobuf/deprecator'
|
4
|
+
|
5
|
+
##
|
6
|
+
# Adding extension to Numeric until
|
7
|
+
# we can get people to stop calling #value
|
8
|
+
# on Enum instances.
|
9
|
+
#
|
10
|
+
class Numeric
|
11
|
+
unless method_defined?(:value)
|
12
|
+
def value
|
13
|
+
$stderr.puts <<-DEPRECATION
|
14
|
+
[DEPRECATED] Enum#value is deprecated and will be removed in the next release.
|
15
|
+
Use Enum#to_i instead.
|
16
|
+
DEPRECATION
|
17
|
+
self
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
2
21
|
|
3
22
|
module Protobuf
|
4
|
-
class Enum
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
23
|
+
class Enum < SimpleDelegator
|
24
|
+
|
25
|
+
##
|
26
|
+
# Deprecations
|
27
|
+
#
|
28
|
+
|
29
|
+
extend ::Protobuf::Deprecator
|
30
|
+
|
31
|
+
# Public: Allows setting Options on the Enum class.
|
32
|
+
include ::Protobuf::Optionable
|
33
|
+
|
34
|
+
def self.aliases_allowed?
|
35
|
+
self.get_option(:allow_alias)
|
36
|
+
end
|
37
|
+
|
38
|
+
# Public: Get all integer tags defined by this enum.
|
39
|
+
#
|
40
|
+
# Examples
|
41
|
+
#
|
42
|
+
# class StateMachine < ::Protobuf::Enum
|
43
|
+
# set_option :allow_alias
|
44
|
+
# define :ON, 1
|
45
|
+
# define :STARTED, 1
|
46
|
+
# define :OFF, 2
|
47
|
+
# end
|
48
|
+
#
|
49
|
+
# StateMachine.all_tags #=> [ 1, 2 ]
|
50
|
+
#
|
51
|
+
# Returns an array of unique integers.
|
52
|
+
#
|
53
|
+
def self.all_tags
|
54
|
+
@all_tags ||= self.enums.map(&:to_i).uniq
|
55
|
+
end
|
56
|
+
|
57
|
+
# Internal: DSL method to create a new Enum. The given name will
|
58
|
+
# become a constant for this Enum pointing to the new instance.
|
59
|
+
#
|
60
|
+
# Examples
|
61
|
+
#
|
62
|
+
# class StateMachine < ::Protobuf::Enum
|
63
|
+
# define :ON, 1
|
64
|
+
# define :OFF, 2
|
65
|
+
# end
|
66
|
+
#
|
67
|
+
# StateMachine::ON #=> #<StateMachine::ON=1>
|
68
|
+
# StateMachine::OFF #=> #<StateMachine::OFF=2>
|
69
|
+
#
|
70
|
+
# Returns nothing.
|
71
|
+
#
|
72
|
+
def self.define(name, tag)
|
73
|
+
enum = self.new(self, name, tag)
|
74
|
+
@enums ||= []
|
75
|
+
@enums << enum
|
76
|
+
const_set(name, enum)
|
77
|
+
end
|
78
|
+
|
79
|
+
# Public: All defined enums.
|
80
|
+
#
|
81
|
+
def self.enums
|
82
|
+
@enums
|
83
|
+
end
|
84
|
+
|
85
|
+
# Public: Get an array of Enum objects with the given tag.
|
86
|
+
#
|
87
|
+
# tag - An object that responds to to_i.
|
88
|
+
#
|
89
|
+
# Examples
|
90
|
+
#
|
91
|
+
# class StateMachine < ::Protobuf::Enum
|
92
|
+
# set_option :allow_alias
|
93
|
+
# define :ON, 1
|
94
|
+
# define :STARTED, 1
|
95
|
+
# define :OFF, 2
|
96
|
+
# end
|
97
|
+
#
|
98
|
+
# StateMachine.enums_for_tag(1) #=> [ #<StateMachine::ON=1>, #<StateMachine::STARTED=1> ]
|
99
|
+
# StateMachine.enums_for_tag(2) #=> [ #<StateMachine::OFF=2> ]
|
100
|
+
#
|
101
|
+
# Returns an array with zero or more Enum objects or nil.
|
102
|
+
#
|
103
|
+
def self.enums_for_tag(tag)
|
104
|
+
self.enums.select { |enum|
|
105
|
+
enum.to_i == tag.to_i
|
106
|
+
}
|
107
|
+
end
|
108
|
+
|
109
|
+
# Public: Get the Enum associated with the given name.
|
110
|
+
#
|
111
|
+
# name - A string-like object. Case-sensitive.
|
112
|
+
#
|
113
|
+
# Example
|
114
|
+
#
|
115
|
+
# class StateMachine < ::Protobuf::Enum
|
116
|
+
# define :ON, 1
|
117
|
+
# define :OFF, 2
|
118
|
+
# end
|
119
|
+
#
|
120
|
+
# StateMachine.enum_for_name(:ON) # => #<StateMachine::ON=1>
|
121
|
+
# StateMachine.enum_for_name("ON") # => #<StateMachine::ON=1>
|
122
|
+
# StateMachine.enum_for_name(:on) # => nil
|
123
|
+
# StateMachine.enum_for_name(:FOO) # => nil
|
124
|
+
#
|
125
|
+
# Returns the Enum object with the given name or nil.
|
126
|
+
#
|
127
|
+
def self.enum_for_name(name)
|
128
|
+
self.const_get(name)
|
129
|
+
rescue ::NameError
|
130
|
+
nil
|
131
|
+
end
|
132
|
+
|
133
|
+
# Public: Get the Enum object corresponding to the given tag.
|
134
|
+
#
|
135
|
+
# tag - An object that responds to to_i.
|
136
|
+
#
|
137
|
+
# Returns an Enum object or nil. If the tag corresponds to multiple
|
138
|
+
# Enums, the first enum defined will be returned.
|
139
|
+
#
|
140
|
+
def self.enum_for_tag(tag)
|
141
|
+
self.enums_for_tag(tag).first
|
142
|
+
end
|
143
|
+
|
144
|
+
# Public: Get an Enum by a variety of type-checking mechanisms.
|
145
|
+
#
|
146
|
+
# candidate - An Enum, Numeric, String, or Symbol object.
|
147
|
+
#
|
148
|
+
# Example
|
149
|
+
#
|
150
|
+
# class StateMachine < ::Protobuf::Enum
|
151
|
+
# set_option :allow_alias
|
152
|
+
# define :ON, 1
|
153
|
+
# define :STARTED, 1
|
154
|
+
# define :OFF, 2
|
155
|
+
# end
|
156
|
+
#
|
157
|
+
# StateMachine.fetch(StateMachine::ON) # => #<StateMachine::ON=1>
|
158
|
+
# StateMachine.fetch(:ON) # => #<StateMachine::ON=1>
|
159
|
+
# StateMachine.fetch("STARTED") # => #<StateMachine::STARTED=1>
|
160
|
+
# StateMachine.fetch(1) # => [ #<StateMachine::ON=1>, #<StateMachine::STARTED=1> ]
|
161
|
+
#
|
162
|
+
# Returns an Enum object or nil.
|
163
|
+
#
|
164
|
+
def self.fetch(candidate)
|
165
|
+
case candidate
|
166
|
+
when self then
|
167
|
+
candidate
|
168
|
+
when ::Numeric then
|
169
|
+
enum_for_tag(candidate.to_i)
|
170
|
+
when ::String, ::Symbol then
|
171
|
+
enum_for_name(candidate)
|
26
172
|
else
|
27
173
|
nil
|
28
174
|
end
|
29
175
|
end
|
30
176
|
|
31
|
-
|
32
|
-
|
177
|
+
# Public: Get the Symbol name associated with the given number.
|
178
|
+
#
|
179
|
+
# number - An object that responds to to_i.
|
180
|
+
#
|
181
|
+
# Examples
|
182
|
+
#
|
183
|
+
# # Without aliases
|
184
|
+
# class StateMachine < ::Protobuf::Enum
|
185
|
+
# define :ON, 1
|
186
|
+
# define :OFF, 2
|
187
|
+
# end
|
188
|
+
#
|
189
|
+
# StateMachine.name_for_tag(1) # => :ON
|
190
|
+
# StateMachine.name_for_tag(2) # => :OFF
|
191
|
+
# StateMachine.name_for_tag(3) # => nil
|
192
|
+
#
|
193
|
+
# # With aliases
|
194
|
+
# class StateMachine < ::Protobuf::Enum
|
195
|
+
# set_option :allow_alias
|
196
|
+
# define :STARTED, 1
|
197
|
+
# define :ON, 1
|
198
|
+
# define :OFF, 2
|
199
|
+
# end
|
200
|
+
#
|
201
|
+
# StateMachine.name_for_tag(1) # => :STARTED
|
202
|
+
# StateMachine.name_for_tag(2) # => :OFF
|
203
|
+
#
|
204
|
+
# Returns the symbol name of the enum constant given it's associated tag or nil.
|
205
|
+
# If the given tag has multiple names associated (due to allow_alias)
|
206
|
+
# the first defined name will be returned.
|
207
|
+
#
|
208
|
+
def self.name_for_tag(tag)
|
209
|
+
self.enum_for_tag(tag).try(:name)
|
210
|
+
end
|
211
|
+
|
212
|
+
# Public: Check if the given tag is defined by this Enum.
|
213
|
+
#
|
214
|
+
# number - An object that responds to to_i.
|
215
|
+
#
|
216
|
+
# Returns a boolean.
|
217
|
+
#
|
218
|
+
def self.valid_tag?(tag)
|
219
|
+
tag.respond_to?(:to_i) && self.all_tags.include?(tag.to_i)
|
33
220
|
end
|
34
221
|
|
35
|
-
|
36
|
-
|
222
|
+
# Public: [DEPRECATED] Return a hash of Enum objects keyed
|
223
|
+
# by their :name.
|
224
|
+
#
|
225
|
+
def self.values
|
226
|
+
self.warn_deprecated(:values, :enums)
|
227
|
+
|
228
|
+
@values ||= begin
|
229
|
+
self.enums.inject({}) do |hash, enum|
|
230
|
+
hash[enum.name] = enum
|
231
|
+
hash
|
232
|
+
end
|
233
|
+
end
|
37
234
|
end
|
38
235
|
|
39
|
-
|
40
|
-
|
236
|
+
##
|
237
|
+
# Class Deprecations
|
238
|
+
#
|
239
|
+
|
240
|
+
deprecate_class_method :enum_by_value, :enum_for_tag
|
241
|
+
deprecate_class_method :name_by_value, :name_for_tag
|
242
|
+
deprecate_class_method :get_name_by_tag, :name_for_tag
|
243
|
+
deprecate_class_method :value_by_name, :enum_for_name
|
244
|
+
|
245
|
+
|
246
|
+
##
|
247
|
+
# Attributes
|
248
|
+
#
|
249
|
+
|
250
|
+
attr_reader :parent_class, :name, :tag
|
251
|
+
|
252
|
+
##
|
253
|
+
# Instance Methods
|
254
|
+
#
|
255
|
+
|
256
|
+
def initialize(parent_class, name, tag)
|
257
|
+
@parent_class = parent_class
|
258
|
+
@name = name
|
259
|
+
@tag = tag
|
260
|
+
super(@tag)
|
41
261
|
end
|
42
262
|
|
43
|
-
|
44
|
-
|
263
|
+
# Overriding the class so ActiveRecord/Arel visitor will visit the enum as a Fixnum
|
264
|
+
#
|
265
|
+
def class
|
266
|
+
Fixnum
|
45
267
|
end
|
46
268
|
|
47
|
-
def
|
48
|
-
|
269
|
+
def inspect
|
270
|
+
"\#<Protobuf::Enum(#{parent_class})::#{name}=#{tag}>"
|
49
271
|
end
|
50
272
|
|
51
|
-
|
52
|
-
|
273
|
+
def to_i
|
274
|
+
tag
|
275
|
+
end
|
276
|
+
|
277
|
+
def to_int
|
278
|
+
tag.to_int
|
279
|
+
end
|
280
|
+
|
281
|
+
def to_s(format = :tag)
|
282
|
+
case format
|
283
|
+
when :tag then
|
284
|
+
self.to_i.to_s
|
285
|
+
when :name then
|
286
|
+
name.to_s
|
287
|
+
else
|
288
|
+
self.to_i.to_s
|
289
|
+
end
|
290
|
+
end
|
291
|
+
|
292
|
+
# Re-implement `try` in order to fix the problem where
|
293
|
+
# the underlying fixnum doesn't respond to all methods (e.g. name or tag).
|
294
|
+
# If we respond to the first argument, `__send__` the args. Otherwise,
|
295
|
+
# delegate the `try` call to the underlying vlaue fixnum.
|
53
296
|
#
|
54
|
-
|
55
|
-
|
297
|
+
def try(*args, &block)
|
298
|
+
case
|
299
|
+
when args.empty? && block_given?
|
300
|
+
yield self
|
301
|
+
when respond_to?(args.first)
|
302
|
+
__send__(*args, &block)
|
303
|
+
else
|
304
|
+
@tag.try(*args, &block)
|
305
|
+
end
|
56
306
|
end
|
307
|
+
|
308
|
+
def value
|
309
|
+
parent_class.warn_deprecated(:value, :to_i)
|
310
|
+
to_i
|
311
|
+
end
|
312
|
+
|
313
|
+
##
|
314
|
+
# Instance Aliases
|
315
|
+
#
|
316
|
+
alias_method :to_hash_value, :to_i
|
57
317
|
end
|
58
318
|
end
|
319
|
+
|
@@ -4,9 +4,11 @@ require 'protobuf/field/field_array'
|
|
4
4
|
module Protobuf
|
5
5
|
module Field
|
6
6
|
class BaseField
|
7
|
+
|
7
8
|
##
|
8
9
|
# Constants
|
9
10
|
#
|
11
|
+
|
10
12
|
PACKED_TYPES = [
|
11
13
|
::Protobuf::WireType::VARINT,
|
12
14
|
::Protobuf::WireType::FIXED32,
|
@@ -16,11 +18,16 @@ module Protobuf
|
|
16
18
|
##
|
17
19
|
# Attributes
|
18
20
|
#
|
19
|
-
|
21
|
+
|
22
|
+
attr_reader :default, :default_value, :deprecated, :extension,
|
23
|
+
:getter_method_name, :message_class, :name, :optional,
|
24
|
+
:packed, :repeated, :required, :rule, :setter_method_name,
|
25
|
+
:tag, :type_class
|
20
26
|
|
21
27
|
##
|
22
28
|
# Class Methods
|
23
29
|
#
|
30
|
+
|
24
31
|
def self.default
|
25
32
|
nil
|
26
33
|
end
|
@@ -28,14 +35,15 @@ module Protobuf
|
|
28
35
|
##
|
29
36
|
# Constructor
|
30
37
|
#
|
31
|
-
|
32
|
-
|
33
|
-
|
38
|
+
|
39
|
+
def initialize(message_class, rule, type_class, name, tag, options)
|
40
|
+
@message_class, @rule, @type_class, @name, @tag = \
|
41
|
+
message_class, rule, type_class, name, tag
|
34
42
|
|
35
43
|
set_rule_predicates
|
36
44
|
|
37
45
|
@getter_method_name = name
|
38
|
-
@setter_method_name = "#{name}="
|
46
|
+
@setter_method_name = "#{name}="
|
39
47
|
@default = options.delete(:default)
|
40
48
|
@extension = options.delete(:extension)
|
41
49
|
@packed = repeated? && options.delete(:packed)
|
@@ -50,6 +58,7 @@ module Protobuf
|
|
50
58
|
##
|
51
59
|
# Public Instance Methods
|
52
60
|
#
|
61
|
+
|
53
62
|
def acceptable?(value)
|
54
63
|
true
|
55
64
|
end
|
@@ -98,41 +107,46 @@ module Protobuf
|
|
98
107
|
end
|
99
108
|
|
100
109
|
def extension?
|
101
|
-
!!
|
110
|
+
!! extension
|
102
111
|
end
|
103
112
|
|
104
113
|
# Is this a repeated field?
|
105
114
|
def repeated?
|
106
|
-
!!
|
115
|
+
!! repeated
|
107
116
|
end
|
108
117
|
|
109
118
|
# Is this a required field?
|
110
119
|
def required?
|
111
|
-
!!
|
120
|
+
!! required
|
112
121
|
end
|
113
122
|
|
114
123
|
# Is this a optional field?
|
115
124
|
def optional?
|
116
|
-
!!
|
125
|
+
!! optional
|
117
126
|
end
|
118
127
|
|
119
128
|
# Is this a deprecated field?
|
120
129
|
def deprecated?
|
121
|
-
!!
|
130
|
+
!! deprecated
|
122
131
|
end
|
123
132
|
|
124
133
|
# Is this a packed repeated field?
|
125
134
|
def packed?
|
126
|
-
!!
|
135
|
+
!! packed
|
127
136
|
end
|
128
137
|
|
129
138
|
def to_s
|
130
|
-
"#{
|
139
|
+
"#{rule} #{type_class} #{name} = #{tag} #{default ? "[default=#{default.inspect}]" : ''}"
|
140
|
+
end
|
141
|
+
|
142
|
+
def type
|
143
|
+
$stderr.puts("[DEPRECATED] #{self.class.name}#type usage is deprecated.\nPlease use #type_class instead.")
|
144
|
+
type_class
|
131
145
|
end
|
132
146
|
|
133
147
|
def warn_if_deprecated
|
134
148
|
if ::Protobuf.print_deprecation_warnings? && deprecated?
|
135
|
-
$stderr.puts("[WARNING] #{
|
149
|
+
$stderr.puts("[WARNING] #{message_class.name}##{name} field usage is deprecated.")
|
136
150
|
end
|
137
151
|
end
|
138
152
|
|
@@ -141,6 +155,7 @@ module Protobuf
|
|
141
155
|
##
|
142
156
|
# Private Instance Methods
|
143
157
|
#
|
158
|
+
|
144
159
|
def define_accessor
|
145
160
|
if repeated?
|
146
161
|
define_array_getter
|
@@ -153,7 +168,7 @@ module Protobuf
|
|
153
168
|
|
154
169
|
def define_array_getter
|
155
170
|
field = self
|
156
|
-
|
171
|
+
message_class.class_eval do
|
157
172
|
define_method(field.getter_method_name) do
|
158
173
|
field.warn_if_deprecated
|
159
174
|
@values[field.name] ||= ::Protobuf::Field::FieldArray.new(field)
|
@@ -163,7 +178,7 @@ module Protobuf
|
|
163
178
|
|
164
179
|
def define_array_setter
|
165
180
|
field = self
|
166
|
-
|
181
|
+
message_class.class_eval do
|
167
182
|
define_method(field.setter_method_name) do |val|
|
168
183
|
field.warn_if_deprecated
|
169
184
|
|
@@ -171,12 +186,10 @@ module Protobuf
|
|
171
186
|
val = val.dup
|
172
187
|
val.compact!
|
173
188
|
else
|
174
|
-
|
175
|
-
Expected repeated value of type '#{field.
|
189
|
+
raise TypeError, <<-TYPE_ERROR
|
190
|
+
Expected repeated value of type '#{field.type_class}'
|
176
191
|
Got '#{val.class}' for repeated protobuf field #{field.name}
|
177
192
|
TYPE_ERROR
|
178
|
-
|
179
|
-
raise TypeError, error_text
|
180
193
|
end
|
181
194
|
|
182
195
|
if val.nil? || (val.respond_to?(:empty?) && val.empty?)
|
@@ -191,7 +204,7 @@ module Protobuf
|
|
191
204
|
|
192
205
|
def define_getter
|
193
206
|
field = self
|
194
|
-
|
207
|
+
message_class.class_eval do
|
195
208
|
define_method(field.getter_method_name) do
|
196
209
|
field.warn_if_deprecated
|
197
210
|
@values.fetch(field.name, field.default_value)
|
@@ -201,7 +214,7 @@ module Protobuf
|
|
201
214
|
|
202
215
|
def define_setter
|
203
216
|
field = self
|
204
|
-
|
217
|
+
message_class.class_eval do
|
205
218
|
define_method(field.setter_method_name) do |val|
|
206
219
|
field.warn_if_deprecated
|
207
220
|
|
@@ -210,7 +223,7 @@ module Protobuf
|
|
210
223
|
elsif field.acceptable?(val)
|
211
224
|
@values[field.name] = val
|
212
225
|
else
|
213
|
-
raise TypeError, "Unacceptable value #{val} for field #{field.name} of type #{field.
|
226
|
+
raise TypeError, "Unacceptable value #{val} for field #{field.name} of type #{field.type_class}"
|
214
227
|
end
|
215
228
|
end
|
216
229
|
end
|
@@ -225,7 +238,7 @@ module Protobuf
|
|
225
238
|
end
|
226
239
|
|
227
240
|
def set_rule_predicates
|
228
|
-
case
|
241
|
+
case rule
|
229
242
|
when :repeated then
|
230
243
|
@required = @optional = false
|
231
244
|
@repeated = true
|
@@ -239,23 +252,24 @@ module Protobuf
|
|
239
252
|
end
|
240
253
|
|
241
254
|
def typed_default_value
|
242
|
-
if
|
255
|
+
if default.nil?
|
243
256
|
self.class.default
|
244
257
|
else
|
245
|
-
|
258
|
+
default
|
246
259
|
end
|
247
260
|
end
|
248
261
|
|
249
262
|
def validate_packed_field
|
250
263
|
if packed? && ! ::Protobuf::Field::BaseField::PACKED_TYPES.include?(wire_type)
|
251
|
-
raise "Can't use packed encoding for
|
264
|
+
raise "Can't use packed encoding for '#{type_class}' type"
|
252
265
|
end
|
253
266
|
end
|
254
267
|
|
255
268
|
def warn_excess_options(options)
|
256
|
-
warn "WARNING: Invalid options: #{options.inspect} (in #{
|
269
|
+
warn "WARNING: Invalid options: #{options.inspect} (in #{message_class.name}##{name})"
|
257
270
|
end
|
258
271
|
|
259
272
|
end
|
260
273
|
end
|
261
274
|
end
|
275
|
+
|
@@ -3,10 +3,20 @@ require 'protobuf/field/varint_field'
|
|
3
3
|
module Protobuf
|
4
4
|
module Field
|
5
5
|
class BoolField < VarintField
|
6
|
+
|
7
|
+
##
|
8
|
+
# Class Methods
|
9
|
+
#
|
10
|
+
|
6
11
|
def self.default
|
7
12
|
false
|
8
13
|
end
|
9
14
|
|
15
|
+
|
16
|
+
##
|
17
|
+
# Public Instance Methods
|
18
|
+
# #
|
19
|
+
|
10
20
|
def acceptable?(val)
|
11
21
|
[true, false].include?(val)
|
12
22
|
end
|
@@ -15,11 +25,21 @@ module Protobuf
|
|
15
25
|
value == 1
|
16
26
|
end
|
17
27
|
|
28
|
+
def encode(value)
|
29
|
+
[value ? 1 : 0].pack('C')
|
30
|
+
end
|
31
|
+
|
32
|
+
private
|
33
|
+
|
34
|
+
##
|
35
|
+
# Private Instance Methods
|
36
|
+
#
|
37
|
+
|
18
38
|
def define_getter
|
19
39
|
super
|
20
40
|
|
21
41
|
field = self
|
22
|
-
|
42
|
+
message_class.class_eval do
|
23
43
|
define_method("#{field.getter_method_name}?") do
|
24
44
|
field.warn_if_deprecated
|
25
45
|
@values.fetch(field.name, field.default_value)
|
@@ -27,9 +47,7 @@ module Protobuf
|
|
27
47
|
end
|
28
48
|
end
|
29
49
|
|
30
|
-
def encode(value)
|
31
|
-
[value ? 1 : 0].pack('C')
|
32
|
-
end
|
33
50
|
end
|
34
51
|
end
|
35
52
|
end
|
53
|
+
|
@@ -3,12 +3,25 @@ require 'protobuf/wire_type'
|
|
3
3
|
module Protobuf
|
4
4
|
module Field
|
5
5
|
class BytesField < BaseField
|
6
|
+
|
7
|
+
##
|
8
|
+
# Constants
|
9
|
+
#
|
10
|
+
|
6
11
|
BYTES_ENCODING = "ASCII-8BIT".freeze
|
7
12
|
|
13
|
+
##
|
14
|
+
# Class Methods
|
15
|
+
#
|
16
|
+
|
8
17
|
def self.default
|
9
18
|
''
|
10
19
|
end
|
11
20
|
|
21
|
+
##
|
22
|
+
# Public Instance Methods
|
23
|
+
#
|
24
|
+
|
12
25
|
def acceptable?(val)
|
13
26
|
if val.nil? || val.is_a?(::Protobuf::Message) || val.instance_of?(String)
|
14
27
|
return true
|
@@ -23,9 +36,28 @@ module Protobuf
|
|
23
36
|
bytes_to_decode
|
24
37
|
end
|
25
38
|
|
39
|
+
def encode(value)
|
40
|
+
value_to_encode = value.dup
|
41
|
+
value_to_encode = value.encode if value.is_a?(::Protobuf::Message)
|
42
|
+
value_to_encode.force_encoding(::Protobuf::Field::BytesField::BYTES_ENCODING)
|
43
|
+
|
44
|
+
string_size = ::Protobuf::Field::VarintField.encode(value_to_encode.size)
|
45
|
+
string_size << value_to_encode
|
46
|
+
end
|
47
|
+
|
48
|
+
def wire_type
|
49
|
+
::Protobuf::WireType::LENGTH_DELIMITED
|
50
|
+
end
|
51
|
+
|
52
|
+
private
|
53
|
+
|
54
|
+
##
|
55
|
+
# Private Instance Methods
|
56
|
+
#
|
57
|
+
|
26
58
|
def define_setter
|
27
59
|
field = self
|
28
|
-
|
60
|
+
message_class.class_eval do
|
29
61
|
define_method(field.setter_method_name) do |val|
|
30
62
|
begin
|
31
63
|
field.warn_if_deprecated
|
@@ -35,29 +67,18 @@ module Protobuf
|
|
35
67
|
elsif field.acceptable?(val)
|
36
68
|
@values[field.name] = val.dup
|
37
69
|
else
|
38
|
-
raise TypeError, "Unacceptable value #{val} for field #{field.name} of type #{field.
|
70
|
+
raise TypeError, "Unacceptable value #{val} for field #{field.name} of type #{field.type_class}"
|
39
71
|
end
|
40
72
|
rescue NoMethodError => ex
|
41
73
|
::Protobuf::Logger.error { ex.message }
|
42
74
|
::Protobuf::Logger.error { ex.backtrace.join("\n") }
|
43
|
-
raise TypeError, "Got NoMethodError attempting to set #{val} for field #{field.name} of type #{field.
|
75
|
+
raise TypeError, "Got NoMethodError attempting to set #{val} for field #{field.name} of type #{field.type_class}: #{ex.message}"
|
44
76
|
end
|
45
77
|
end
|
46
78
|
end
|
47
79
|
end
|
48
80
|
|
49
|
-
def encode(value)
|
50
|
-
value_to_encode = value.dup
|
51
|
-
value_to_encode = value.encode if value.is_a?(::Protobuf::Message)
|
52
|
-
value_to_encode.force_encoding(::Protobuf::Field::BytesField::BYTES_ENCODING)
|
53
|
-
|
54
|
-
string_size = ::Protobuf::Field::VarintField.encode(value_to_encode.size)
|
55
|
-
string_size << value_to_encode
|
56
|
-
end
|
57
|
-
|
58
|
-
def wire_type
|
59
|
-
::Protobuf::WireType::LENGTH_DELIMITED
|
60
|
-
end
|
61
81
|
end
|
62
82
|
end
|
63
83
|
end
|
84
|
+
|