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.
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
+