protobuf 2.8.13 → 3.0.0.rc1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (116) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGES.md +84 -5
  3. data/CONTRIBUTING.md +3 -3
  4. data/Rakefile +46 -7
  5. data/lib/protobuf/cli.rb +2 -20
  6. data/lib/protobuf/decoder.rb +74 -0
  7. data/lib/protobuf/deprecator.rb +42 -0
  8. data/lib/protobuf/descriptors/google/protobuf/compiler/plugin.pb.rb +17 -16
  9. data/lib/protobuf/descriptors/google/protobuf/descriptor.pb.rb +86 -85
  10. data/lib/protobuf/encoder.rb +62 -0
  11. data/lib/protobuf/enum.rb +298 -37
  12. data/lib/protobuf/field/base_field.rb +41 -27
  13. data/lib/protobuf/field/bool_field.rb +22 -4
  14. data/lib/protobuf/field/bytes_field.rb +36 -15
  15. data/lib/protobuf/field/double_field.rb +10 -3
  16. data/lib/protobuf/field/enum_field.rb +21 -18
  17. data/lib/protobuf/field/field_array.rb +26 -16
  18. data/lib/protobuf/field/fixed32_field.rb +10 -4
  19. data/lib/protobuf/field/fixed64_field.rb +10 -3
  20. data/lib/protobuf/field/float_field.rb +18 -5
  21. data/lib/protobuf/field/int32_field.rb +14 -4
  22. data/lib/protobuf/field/int64_field.rb +14 -4
  23. data/lib/protobuf/field/integer_field.rb +9 -4
  24. data/lib/protobuf/field/message_field.rb +16 -7
  25. data/lib/protobuf/field/sfixed32_field.rb +10 -3
  26. data/lib/protobuf/field/sfixed64_field.rb +12 -7
  27. data/lib/protobuf/field/signed_integer_field.rb +7 -0
  28. data/lib/protobuf/field/sint32_field.rb +14 -4
  29. data/lib/protobuf/field/sint64_field.rb +14 -4
  30. data/lib/protobuf/field/string_field.rb +11 -1
  31. data/lib/protobuf/field/uint32_field.rb +14 -4
  32. data/lib/protobuf/field/uint64_field.rb +14 -4
  33. data/lib/protobuf/field/varint_field.rb +11 -9
  34. data/lib/protobuf/field.rb +42 -25
  35. data/lib/protobuf/generators/enum_generator.rb +12 -1
  36. data/lib/protobuf/generators/field_generator.rb +1 -1
  37. data/lib/protobuf/lifecycle.rb +3 -4
  38. data/lib/protobuf/message/fields.rb +122 -0
  39. data/lib/protobuf/message/serialization.rb +84 -0
  40. data/lib/protobuf/message.rb +21 -221
  41. data/lib/protobuf/optionable.rb +23 -0
  42. data/lib/protobuf/rpc/client.rb +2 -4
  43. data/lib/protobuf/rpc/connector.rb +0 -2
  44. data/lib/protobuf/rpc/connectors/common.rb +2 -2
  45. data/lib/protobuf/rpc/dynamic_discovery.pb.rb +14 -16
  46. data/lib/protobuf/rpc/env.rb +58 -0
  47. data/lib/protobuf/rpc/error.rb +8 -5
  48. data/lib/protobuf/rpc/middleware/exception_handler.rb +36 -0
  49. data/lib/protobuf/rpc/middleware/logger.rb +91 -0
  50. data/lib/protobuf/rpc/middleware/request_decoder.rb +83 -0
  51. data/lib/protobuf/rpc/middleware/response_encoder.rb +88 -0
  52. data/lib/protobuf/rpc/middleware/runner.rb +18 -0
  53. data/lib/protobuf/rpc/middleware.rb +25 -0
  54. data/lib/protobuf/rpc/rpc.pb.rb +15 -16
  55. data/lib/protobuf/rpc/server.rb +14 -64
  56. data/lib/protobuf/rpc/servers/socket/server.rb +0 -2
  57. data/lib/protobuf/rpc/servers/socket/worker.rb +11 -15
  58. data/lib/protobuf/rpc/servers/zmq/util.rb +4 -1
  59. data/lib/protobuf/rpc/servers/zmq/worker.rb +5 -13
  60. data/lib/protobuf/rpc/servers/zmq_runner.rb +1 -1
  61. data/lib/protobuf/rpc/service.rb +38 -72
  62. data/lib/protobuf/rpc/service_dispatcher.rb +20 -108
  63. data/lib/protobuf/version.rb +1 -2
  64. data/lib/protobuf.rb +5 -13
  65. data/protobuf.gemspec +5 -5
  66. data/spec/benchmark/tasks.rb +2 -77
  67. data/spec/functional/zmq_server_spec.rb +13 -21
  68. data/spec/lib/protobuf/cli_spec.rb +5 -43
  69. data/spec/lib/protobuf/enum_spec.rb +194 -61
  70. data/spec/lib/protobuf/field_spec.rb +194 -0
  71. data/spec/lib/protobuf/generators/enum_generator_spec.rb +24 -1
  72. data/spec/lib/protobuf/generators/field_generator_spec.rb +6 -6
  73. data/spec/lib/protobuf/message_spec.rb +52 -70
  74. data/spec/lib/protobuf/optionable_spec.rb +46 -0
  75. data/spec/lib/protobuf/rpc/client_spec.rb +1 -93
  76. data/spec/lib/protobuf/rpc/connector_spec.rb +1 -7
  77. data/spec/lib/protobuf/rpc/connectors/zmq_spec.rb +8 -0
  78. data/spec/lib/protobuf/rpc/middleware/exception_handler_spec.rb +62 -0
  79. data/spec/lib/protobuf/rpc/middleware/logger_spec.rb +49 -0
  80. data/spec/lib/protobuf/rpc/middleware/request_decoder_spec.rb +115 -0
  81. data/spec/lib/protobuf/rpc/middleware/response_encoder_spec.rb +75 -0
  82. data/spec/lib/protobuf/rpc/servers/socket_server_spec.rb +0 -6
  83. data/spec/lib/protobuf/rpc/servers/zmq/util_spec.rb +10 -0
  84. data/spec/lib/protobuf/rpc/service_dispatcher_spec.rb +30 -105
  85. data/spec/lib/protobuf/rpc/service_filters_spec.rb +4 -4
  86. data/spec/lib/protobuf/rpc/service_spec.rb +20 -24
  87. data/spec/lib/protobuf_spec.rb +3 -3
  88. data/spec/spec_helper.rb +5 -4
  89. data/spec/support/packed_field.rb +15 -14
  90. data/spec/support/server.rb +4 -21
  91. data/spec/support/test/defaults.pb.rb +4 -4
  92. data/spec/support/test/enum.pb.rb +13 -1
  93. data/spec/support/test/enum.proto +15 -0
  94. data/spec/support/test/extended.pb.rb +1 -1
  95. data/spec/support/test/google_unittest.pb.rb +239 -241
  96. data/spec/support/test/google_unittest_import.pb.rb +2 -2
  97. data/spec/support/test/multi_field_extensions.pb.rb +2 -2
  98. data/spec/support/test/resource.pb.rb +19 -18
  99. data/spec/support/test/resource.proto +1 -0
  100. data/spec/support/test/resource_service.rb +5 -0
  101. metadata +78 -57
  102. data/bin/rprotoc +0 -8
  103. data/lib/protobuf/enum_value.rb +0 -85
  104. data/lib/protobuf/evented.rb +0 -37
  105. data/lib/protobuf/ext/eventmachine.rb +0 -14
  106. data/lib/protobuf/field/extension_fields.rb +0 -32
  107. data/lib/protobuf/message/decoder.rb +0 -72
  108. data/lib/protobuf/message/message.rb +0 -1
  109. data/lib/protobuf/rpc/connectors/em_client.rb +0 -84
  110. data/lib/protobuf/rpc/connectors/eventmachine.rb +0 -87
  111. data/lib/protobuf/rpc/servers/evented/server.rb +0 -36
  112. data/lib/protobuf/rpc/servers/evented_runner.rb +0 -31
  113. data/spec/functional/embedded_service_spec.rb +0 -7
  114. data/spec/functional/evented_server_spec.rb +0 -64
  115. data/spec/lib/protobuf/enum_value_spec.rb +0 -29
  116. data/spec/lib/protobuf/rpc/servers/evented_server_spec.rb +0 -19
data/lib/protobuf/enum.rb CHANGED
@@ -1,58 +1,319 @@
1
- require 'protobuf/enum_value'
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
- def self.define(name, value)
7
- enum_value = ::Protobuf::EnumValue.new(self, name, value)
8
- const_set(name, enum_value)
9
- @values ||= {}
10
- @names ||= {}
11
- @values[name] = enum_value
12
- @names[value] = name
13
- end
14
-
15
- # Fetch the given enum by a variety of type-checking
16
- # mechanisms. This is useful for the enum field setters
17
- # as well as repeated enum field construction.
18
- def self.fetch(value)
19
- case value
20
- when ::Protobuf::EnumValue then
21
- value
22
- when Numeric then
23
- enum_by_value(value.to_i)
24
- when String, Symbol then
25
- value_by_name(value.to_sym)
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
- def self.enum_by_value(value)
32
- value_by_name(name_by_value(value))
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
- def self.name_by_value(value)
36
- (!value.nil? && value.respond_to?(:to_i)) ? @names[value.to_i] : nil
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
- def self.valid_tag?(tag)
40
- !! name_by_value(tag)
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
- def self.value_by_name(name)
44
- @values[name]
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 self.values
48
- @values
269
+ def inspect
270
+ "\#<Protobuf::Enum(#{parent_class})::#{name}=#{tag}>"
49
271
  end
50
272
 
51
- ##
52
- # Class Aliases
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
- class << self
55
- alias_method :get_name_by_tag, :name_by_value
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
- attr_reader :message_class, :rule, :type, :name, :tag, :default, :default_value, :setter_method_name, :getter_method_name
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
- def initialize(message_class, rule, type, name, tag, options)
32
- @message_class, @rule, @type, @name, @tag = \
33
- message_class, rule, type, name, tag
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}=".to_sym
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
- !! @extension
110
+ !! extension
102
111
  end
103
112
 
104
113
  # Is this a repeated field?
105
114
  def repeated?
106
- !! @repeated
115
+ !! repeated
107
116
  end
108
117
 
109
118
  # Is this a required field?
110
119
  def required?
111
- !! @required
120
+ !! required
112
121
  end
113
122
 
114
123
  # Is this a optional field?
115
124
  def optional?
116
- !! @optional
125
+ !! optional
117
126
  end
118
127
 
119
128
  # Is this a deprecated field?
120
129
  def deprecated?
121
- !! @deprecated
130
+ !! deprecated
122
131
  end
123
132
 
124
133
  # Is this a packed repeated field?
125
134
  def packed?
126
- !! @packed
135
+ !! packed
127
136
  end
128
137
 
129
138
  def to_s
130
- "#{@rule} #{@type} #{@name} = #{@tag} #{@default ? "[default=#{@default.inspect}]" : ''}"
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] #{@message_class.name}##{@name} field usage is deprecated.")
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
- @message_class.class_eval do
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
- @message_class.class_eval do
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
- error_text = <<-TYPE_ERROR
175
- Expected repeated value of type '#{field.type}'
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
- @message_class.class_eval do
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
- @message_class.class_eval do
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.type}"
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 @rule
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 @default.nil?
255
+ if default.nil?
243
256
  self.class.default
244
257
  else
245
- @default
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 `#{@type}' type"
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 #{@message_class.name.split('::').last}.#{@name})"
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
- @message_class.class_eval do
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
- @message_class.class_eval do
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.type}"
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.type}: #{ex.message}"
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
+