protobuffy 3.1.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.
Files changed (192) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +21 -0
  3. data/.travis.yml +12 -0
  4. data/.yardopts +5 -0
  5. data/CHANGES.md +261 -0
  6. data/CONTRIBUTING.md +16 -0
  7. data/Gemfile +3 -0
  8. data/LICENSE.txt +14 -0
  9. data/README.md +58 -0
  10. data/Rakefile +61 -0
  11. data/bin/protoc-gen-ruby +17 -0
  12. data/bin/rpc_server +4 -0
  13. data/examples/bin/reverse-client-http +4 -0
  14. data/examples/bin/reverse-client-socket +4 -0
  15. data/examples/bin/reverse-client-zmq +4 -0
  16. data/examples/config.ru +6 -0
  17. data/examples/definitions/example/reverse.proto +12 -0
  18. data/examples/lib/example/reverse-client.rb +23 -0
  19. data/examples/lib/example/reverse-service.rb +9 -0
  20. data/examples/lib/example/reverse.pb.rb +36 -0
  21. data/lib/protobuf.rb +106 -0
  22. data/lib/protobuf/cli.rb +249 -0
  23. data/lib/protobuf/code_generator.rb +41 -0
  24. data/lib/protobuf/decoder.rb +74 -0
  25. data/lib/protobuf/deprecator.rb +42 -0
  26. data/lib/protobuf/descriptors.rb +3 -0
  27. data/lib/protobuf/descriptors/google/protobuf/compiler/plugin.pb.rb +52 -0
  28. data/lib/protobuf/descriptors/google/protobuf/descriptor.pb.rb +249 -0
  29. data/lib/protobuf/encoder.rb +62 -0
  30. data/lib/protobuf/enum.rb +319 -0
  31. data/lib/protobuf/exceptions.rb +9 -0
  32. data/lib/protobuf/field.rb +74 -0
  33. data/lib/protobuf/field/base_field.rb +280 -0
  34. data/lib/protobuf/field/bool_field.rb +53 -0
  35. data/lib/protobuf/field/bytes_field.rb +81 -0
  36. data/lib/protobuf/field/double_field.rb +26 -0
  37. data/lib/protobuf/field/enum_field.rb +57 -0
  38. data/lib/protobuf/field/field_array.rb +86 -0
  39. data/lib/protobuf/field/fixed32_field.rb +25 -0
  40. data/lib/protobuf/field/fixed64_field.rb +29 -0
  41. data/lib/protobuf/field/float_field.rb +38 -0
  42. data/lib/protobuf/field/int32_field.rb +22 -0
  43. data/lib/protobuf/field/int64_field.rb +22 -0
  44. data/lib/protobuf/field/integer_field.rb +24 -0
  45. data/lib/protobuf/field/message_field.rb +66 -0
  46. data/lib/protobuf/field/sfixed32_field.rb +28 -0
  47. data/lib/protobuf/field/sfixed64_field.rb +29 -0
  48. data/lib/protobuf/field/signed_integer_field.rb +30 -0
  49. data/lib/protobuf/field/sint32_field.rb +22 -0
  50. data/lib/protobuf/field/sint64_field.rb +22 -0
  51. data/lib/protobuf/field/string_field.rb +35 -0
  52. data/lib/protobuf/field/uint32_field.rb +22 -0
  53. data/lib/protobuf/field/uint64_field.rb +22 -0
  54. data/lib/protobuf/field/varint_field.rb +68 -0
  55. data/lib/protobuf/generators/base.rb +71 -0
  56. data/lib/protobuf/generators/enum_generator.rb +42 -0
  57. data/lib/protobuf/generators/extension_generator.rb +28 -0
  58. data/lib/protobuf/generators/field_generator.rb +132 -0
  59. data/lib/protobuf/generators/file_generator.rb +140 -0
  60. data/lib/protobuf/generators/group_generator.rb +113 -0
  61. data/lib/protobuf/generators/message_generator.rb +99 -0
  62. data/lib/protobuf/generators/printable.rb +161 -0
  63. data/lib/protobuf/generators/service_generator.rb +27 -0
  64. data/lib/protobuf/http.rb +20 -0
  65. data/lib/protobuf/lifecycle.rb +46 -0
  66. data/lib/protobuf/logger.rb +86 -0
  67. data/lib/protobuf/message.rb +182 -0
  68. data/lib/protobuf/message/fields.rb +122 -0
  69. data/lib/protobuf/message/serialization.rb +84 -0
  70. data/lib/protobuf/optionable.rb +23 -0
  71. data/lib/protobuf/rpc/buffer.rb +79 -0
  72. data/lib/protobuf/rpc/client.rb +168 -0
  73. data/lib/protobuf/rpc/connector.rb +21 -0
  74. data/lib/protobuf/rpc/connectors/base.rb +54 -0
  75. data/lib/protobuf/rpc/connectors/common.rb +172 -0
  76. data/lib/protobuf/rpc/connectors/http.rb +90 -0
  77. data/lib/protobuf/rpc/connectors/socket.rb +73 -0
  78. data/lib/protobuf/rpc/connectors/zmq.rb +205 -0
  79. data/lib/protobuf/rpc/dynamic_discovery.pb.rb +47 -0
  80. data/lib/protobuf/rpc/env.rb +58 -0
  81. data/lib/protobuf/rpc/error.rb +28 -0
  82. data/lib/protobuf/rpc/error/client_error.rb +31 -0
  83. data/lib/protobuf/rpc/error/server_error.rb +43 -0
  84. data/lib/protobuf/rpc/middleware.rb +25 -0
  85. data/lib/protobuf/rpc/middleware/exception_handler.rb +36 -0
  86. data/lib/protobuf/rpc/middleware/logger.rb +91 -0
  87. data/lib/protobuf/rpc/middleware/request_decoder.rb +83 -0
  88. data/lib/protobuf/rpc/middleware/response_encoder.rb +88 -0
  89. data/lib/protobuf/rpc/middleware/runner.rb +18 -0
  90. data/lib/protobuf/rpc/rpc.pb.rb +53 -0
  91. data/lib/protobuf/rpc/server.rb +39 -0
  92. data/lib/protobuf/rpc/servers/http/server.rb +101 -0
  93. data/lib/protobuf/rpc/servers/http_runner.rb +34 -0
  94. data/lib/protobuf/rpc/servers/socket/server.rb +113 -0
  95. data/lib/protobuf/rpc/servers/socket/worker.rb +56 -0
  96. data/lib/protobuf/rpc/servers/socket_runner.rb +34 -0
  97. data/lib/protobuf/rpc/servers/zmq/broker.rb +155 -0
  98. data/lib/protobuf/rpc/servers/zmq/server.rb +313 -0
  99. data/lib/protobuf/rpc/servers/zmq/util.rb +47 -0
  100. data/lib/protobuf/rpc/servers/zmq/worker.rb +105 -0
  101. data/lib/protobuf/rpc/servers/zmq_runner.rb +51 -0
  102. data/lib/protobuf/rpc/service.rb +179 -0
  103. data/lib/protobuf/rpc/service_directory.rb +245 -0
  104. data/lib/protobuf/rpc/service_dispatcher.rb +46 -0
  105. data/lib/protobuf/rpc/service_filters.rb +273 -0
  106. data/lib/protobuf/rpc/stat.rb +148 -0
  107. data/lib/protobuf/socket.rb +22 -0
  108. data/lib/protobuf/tasks.rb +1 -0
  109. data/lib/protobuf/tasks/compile.rake +61 -0
  110. data/lib/protobuf/version.rb +3 -0
  111. data/lib/protobuf/wire_type.rb +10 -0
  112. data/lib/protobuf/zmq.rb +21 -0
  113. data/proto/dynamic_discovery.proto +44 -0
  114. data/proto/google/protobuf/compiler/plugin.proto +147 -0
  115. data/proto/google/protobuf/descriptor.proto +620 -0
  116. data/proto/rpc.proto +62 -0
  117. data/protobuffy.gemspec +37 -0
  118. data/spec/benchmark/tasks.rb +113 -0
  119. data/spec/bin/protoc-gen-ruby_spec.rb +18 -0
  120. data/spec/data/data.bin +3 -0
  121. data/spec/data/types.bin +0 -0
  122. data/spec/encoding/all_types_spec.rb +91 -0
  123. data/spec/encoding/extreme_values_spec.rb +0 -0
  124. data/spec/functional/socket_server_spec.rb +59 -0
  125. data/spec/functional/zmq_server_spec.rb +103 -0
  126. data/spec/lib/protobuf/cli_spec.rb +267 -0
  127. data/spec/lib/protobuf/code_generator_spec.rb +60 -0
  128. data/spec/lib/protobuf/enum_spec.rb +239 -0
  129. data/spec/lib/protobuf/field/int32_field_spec.rb +7 -0
  130. data/spec/lib/protobuf/field/string_field_spec.rb +46 -0
  131. data/spec/lib/protobuf/field_spec.rb +194 -0
  132. data/spec/lib/protobuf/generators/base_spec.rb +87 -0
  133. data/spec/lib/protobuf/generators/enum_generator_spec.rb +68 -0
  134. data/spec/lib/protobuf/generators/extension_generator_spec.rb +43 -0
  135. data/spec/lib/protobuf/generators/field_generator_spec.rb +99 -0
  136. data/spec/lib/protobuf/generators/file_generator_spec.rb +29 -0
  137. data/spec/lib/protobuf/generators/message_generator_spec.rb +0 -0
  138. data/spec/lib/protobuf/generators/service_generator_spec.rb +43 -0
  139. data/spec/lib/protobuf/lifecycle_spec.rb +89 -0
  140. data/spec/lib/protobuf/logger_spec.rb +136 -0
  141. data/spec/lib/protobuf/message_spec.rb +368 -0
  142. data/spec/lib/protobuf/optionable_spec.rb +46 -0
  143. data/spec/lib/protobuf/rpc/client_spec.rb +66 -0
  144. data/spec/lib/protobuf/rpc/connector_spec.rb +26 -0
  145. data/spec/lib/protobuf/rpc/connectors/base_spec.rb +50 -0
  146. data/spec/lib/protobuf/rpc/connectors/common_spec.rb +170 -0
  147. data/spec/lib/protobuf/rpc/connectors/connector_spec.rb +13 -0
  148. data/spec/lib/protobuf/rpc/connectors/http_spec.rb +61 -0
  149. data/spec/lib/protobuf/rpc/connectors/socket_spec.rb +24 -0
  150. data/spec/lib/protobuf/rpc/connectors/zmq_spec.rb +129 -0
  151. data/spec/lib/protobuf/rpc/middleware/exception_handler_spec.rb +62 -0
  152. data/spec/lib/protobuf/rpc/middleware/logger_spec.rb +49 -0
  153. data/spec/lib/protobuf/rpc/middleware/request_decoder_spec.rb +115 -0
  154. data/spec/lib/protobuf/rpc/middleware/response_encoder_spec.rb +75 -0
  155. data/spec/lib/protobuf/rpc/servers/http/server_spec.rb +104 -0
  156. data/spec/lib/protobuf/rpc/servers/socket_server_spec.rb +38 -0
  157. data/spec/lib/protobuf/rpc/servers/zmq/server_spec.rb +41 -0
  158. data/spec/lib/protobuf/rpc/servers/zmq/util_spec.rb +55 -0
  159. data/spec/lib/protobuf/rpc/servers/zmq/worker_spec.rb +35 -0
  160. data/spec/lib/protobuf/rpc/service_directory_spec.rb +295 -0
  161. data/spec/lib/protobuf/rpc/service_dispatcher_spec.rb +52 -0
  162. data/spec/lib/protobuf/rpc/service_filters_spec.rb +484 -0
  163. data/spec/lib/protobuf/rpc/service_spec.rb +161 -0
  164. data/spec/lib/protobuf/rpc/stat_spec.rb +151 -0
  165. data/spec/lib/protobuf_spec.rb +78 -0
  166. data/spec/spec_helper.rb +57 -0
  167. data/spec/support/all.rb +7 -0
  168. data/spec/support/packed_field.rb +22 -0
  169. data/spec/support/server.rb +94 -0
  170. data/spec/support/test/all_types.data.bin +0 -0
  171. data/spec/support/test/all_types.data.txt +119 -0
  172. data/spec/support/test/defaults.pb.rb +25 -0
  173. data/spec/support/test/defaults.proto +9 -0
  174. data/spec/support/test/enum.pb.rb +59 -0
  175. data/spec/support/test/enum.proto +34 -0
  176. data/spec/support/test/extended.pb.rb +22 -0
  177. data/spec/support/test/extended.proto +10 -0
  178. data/spec/support/test/extreme_values.data.bin +0 -0
  179. data/spec/support/test/google_unittest.pb.rb +543 -0
  180. data/spec/support/test/google_unittest.proto +713 -0
  181. data/spec/support/test/google_unittest_import.pb.rb +37 -0
  182. data/spec/support/test/google_unittest_import.proto +64 -0
  183. data/spec/support/test/google_unittest_import_public.pb.rb +8 -0
  184. data/spec/support/test/google_unittest_import_public.proto +38 -0
  185. data/spec/support/test/multi_field_extensions.pb.rb +56 -0
  186. data/spec/support/test/multi_field_extensions.proto +33 -0
  187. data/spec/support/test/resource.pb.rb +117 -0
  188. data/spec/support/test/resource.proto +94 -0
  189. data/spec/support/test/resource_service.rb +26 -0
  190. data/spec/support/test_app_file.rb +2 -0
  191. data/spec/support/tolerance_matcher.rb +40 -0
  192. metadata +367 -0
@@ -0,0 +1,280 @@
1
+ require 'protobuf/wire_type'
2
+ require 'protobuf/field/field_array'
3
+
4
+ module Protobuf
5
+ module Field
6
+ class BaseField
7
+
8
+ ##
9
+ # Constants
10
+ #
11
+
12
+ PACKED_TYPES = [
13
+ ::Protobuf::WireType::VARINT,
14
+ ::Protobuf::WireType::FIXED32,
15
+ ::Protobuf::WireType::FIXED64
16
+ ].freeze
17
+
18
+ ##
19
+ # Attributes
20
+ #
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
26
+
27
+ ##
28
+ # Class Methods
29
+ #
30
+
31
+ def self.default
32
+ nil
33
+ end
34
+
35
+ ##
36
+ # Constructor
37
+ #
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
42
+
43
+ set_rule_predicates
44
+
45
+ @getter_method_name = name
46
+ @setter_method_name = "#{name}="
47
+ @default = options.delete(:default)
48
+ @extension = options.delete(:extension)
49
+ @packed = repeated? && options.delete(:packed)
50
+ @deprecated = options.delete(:deprecated)
51
+
52
+ set_default_value
53
+ warn_excess_options(options) unless options.empty?
54
+ validate_packed_field if packed?
55
+ define_accessor
56
+ end
57
+
58
+ ##
59
+ # Public Instance Methods
60
+ #
61
+
62
+ def acceptable?(value)
63
+ true
64
+ end
65
+
66
+ def enum?
67
+ false
68
+ end
69
+
70
+ def message?
71
+ false
72
+ end
73
+
74
+ # Decode +bytes+ and pass to +message_instance+.
75
+ def set(message_instance, bytes)
76
+ if packed?
77
+ array = message_instance.__send__(getter_method_name)
78
+ method = \
79
+ case wire_type
80
+ when ::Protobuf::WireType::FIXED32 then :read_fixed32
81
+ when ::Protobuf::WireType::FIXED64 then :read_fixed64
82
+ when ::Protobuf::WireType::VARINT then :read_varint
83
+ end
84
+ stream = StringIO.new(bytes)
85
+
86
+ until stream.eof?
87
+ array << decode(::Protobuf::Decoder.__send__(method, stream))
88
+ end
89
+ else
90
+ value = decode(bytes)
91
+ if repeated?
92
+ message_instance.__send__(getter_method_name) << value
93
+ else
94
+ message_instance.__send__(setter_method_name, value)
95
+ end
96
+ end
97
+ end
98
+
99
+ # Decode +bytes+ and return a field value.
100
+ def decode(bytes)
101
+ raise NotImplementedError, "#{self.class.name}\#decode"
102
+ end
103
+
104
+ # Encode +value+ and return a byte string.
105
+ def encode(value)
106
+ raise NotImplementedError, "#{self.class.name}\#encode"
107
+ end
108
+
109
+ def extension?
110
+ !! extension
111
+ end
112
+
113
+ # Is this a repeated field?
114
+ def repeated?
115
+ !! repeated
116
+ end
117
+
118
+ # Is this a repeated message field?
119
+ def repeated_message?
120
+ repeated? && message?
121
+ end
122
+
123
+ # Is this a required field?
124
+ def required?
125
+ !! required
126
+ end
127
+
128
+ # Is this a optional field?
129
+ def optional?
130
+ !! optional
131
+ end
132
+
133
+ # Is this a deprecated field?
134
+ def deprecated?
135
+ !! deprecated
136
+ end
137
+
138
+ # Is this a packed repeated field?
139
+ def packed?
140
+ !! packed
141
+ end
142
+
143
+ def to_s
144
+ "#{rule} #{type_class} #{name} = #{tag} #{default ? "[default=#{default.inspect}]" : ''}"
145
+ end
146
+
147
+ def type
148
+ $stderr.puts("[DEPRECATED] #{self.class.name}#type usage is deprecated.\nPlease use #type_class instead.")
149
+ type_class
150
+ end
151
+
152
+ def warn_if_deprecated
153
+ if ::Protobuf.print_deprecation_warnings? && deprecated?
154
+ $stderr.puts("[WARNING] #{message_class.name}##{name} field usage is deprecated.")
155
+ end
156
+ end
157
+
158
+ private
159
+
160
+ ##
161
+ # Private Instance Methods
162
+ #
163
+
164
+ def define_accessor
165
+ if repeated?
166
+ define_array_getter
167
+ define_array_setter
168
+ else
169
+ define_getter
170
+ define_setter
171
+ end
172
+ end
173
+
174
+ def define_array_getter
175
+ field = self
176
+ message_class.class_eval do
177
+ define_method(field.getter_method_name) do
178
+ field.warn_if_deprecated
179
+ @values[field.name] ||= ::Protobuf::Field::FieldArray.new(field)
180
+ end
181
+ end
182
+ end
183
+
184
+ def define_array_setter
185
+ field = self
186
+ message_class.class_eval do
187
+ define_method(field.setter_method_name) do |val|
188
+ field.warn_if_deprecated
189
+
190
+ if val.is_a?(Array)
191
+ val = val.dup
192
+ val.compact!
193
+ else
194
+ raise TypeError, <<-TYPE_ERROR
195
+ Expected repeated value of type '#{field.type_class}'
196
+ Got '#{val.class}' for repeated protobuf field #{field.name}
197
+ TYPE_ERROR
198
+ end
199
+
200
+ if val.nil? || (val.respond_to?(:empty?) && val.empty?)
201
+ @values.delete(field.name)
202
+ else
203
+ @values[field.name] ||= ::Protobuf::Field::FieldArray.new(field)
204
+ @values[field.name].replace(val)
205
+ end
206
+ end
207
+ end
208
+ end
209
+
210
+ def define_getter
211
+ field = self
212
+ message_class.class_eval do
213
+ define_method(field.getter_method_name) do
214
+ field.warn_if_deprecated
215
+ @values.fetch(field.name, field.default_value)
216
+ end
217
+ end
218
+ end
219
+
220
+ def define_setter
221
+ field = self
222
+ message_class.class_eval do
223
+ define_method(field.setter_method_name) do |val|
224
+ field.warn_if_deprecated
225
+
226
+ if val.nil? || (val.respond_to?(:empty?) && val.empty?)
227
+ @values.delete(field.name)
228
+ elsif field.acceptable?(val)
229
+ @values[field.name] = val
230
+ else
231
+ raise TypeError, "Unacceptable value #{val} for field #{field.name} of type #{field.type_class}"
232
+ end
233
+ end
234
+ end
235
+ end
236
+
237
+ def set_default_value
238
+ @default_value = case
239
+ when repeated? then ::Protobuf::Field::FieldArray.new(self).freeze
240
+ when required? then nil
241
+ when optional? then typed_default_value
242
+ end
243
+ end
244
+
245
+ def set_rule_predicates
246
+ case rule
247
+ when :repeated then
248
+ @required = @optional = false
249
+ @repeated = true
250
+ when :required then
251
+ @repeated = @optional = false
252
+ @required = true
253
+ when :optional then
254
+ @repeated = @required = false
255
+ @optional = true
256
+ end
257
+ end
258
+
259
+ def typed_default_value
260
+ if default.nil?
261
+ self.class.default
262
+ else
263
+ default
264
+ end
265
+ end
266
+
267
+ def validate_packed_field
268
+ if packed? && ! ::Protobuf::Field::BaseField::PACKED_TYPES.include?(wire_type)
269
+ raise "Can't use packed encoding for '#{type_class}' type"
270
+ end
271
+ end
272
+
273
+ def warn_excess_options(options)
274
+ warn "WARNING: Invalid options: #{options.inspect} (in #{message_class.name}##{name})"
275
+ end
276
+
277
+ end
278
+ end
279
+ end
280
+
@@ -0,0 +1,53 @@
1
+ require 'protobuf/field/varint_field'
2
+
3
+ module Protobuf
4
+ module Field
5
+ class BoolField < VarintField
6
+
7
+ ##
8
+ # Class Methods
9
+ #
10
+
11
+ def self.default
12
+ false
13
+ end
14
+
15
+
16
+ ##
17
+ # Public Instance Methods
18
+ # #
19
+
20
+ def acceptable?(val)
21
+ [true, false].include?(val)
22
+ end
23
+
24
+ def decode(value)
25
+ value == 1
26
+ end
27
+
28
+ def encode(value)
29
+ [value ? 1 : 0].pack('C')
30
+ end
31
+
32
+ private
33
+
34
+ ##
35
+ # Private Instance Methods
36
+ #
37
+
38
+ def define_getter
39
+ super
40
+
41
+ field = self
42
+ message_class.class_eval do
43
+ define_method("#{field.getter_method_name}?") do
44
+ field.warn_if_deprecated
45
+ @values.fetch(field.name, field.default_value)
46
+ end
47
+ end
48
+ end
49
+
50
+ end
51
+ end
52
+ end
53
+
@@ -0,0 +1,81 @@
1
+ require 'protobuf/wire_type'
2
+
3
+ module Protobuf
4
+ module Field
5
+ class BytesField < BaseField
6
+
7
+ ##
8
+ # Constants
9
+ #
10
+
11
+ BYTES_ENCODING = "ASCII-8BIT".freeze
12
+
13
+ ##
14
+ # Class Methods
15
+ #
16
+
17
+ def self.default
18
+ ''
19
+ end
20
+
21
+ ##
22
+ # Public Instance Methods
23
+ #
24
+
25
+ def acceptable?(val)
26
+ val.nil? || val.is_a?(String) || val.is_a?(Symbol) || val.is_a?(::Protobuf::Message)
27
+ end
28
+
29
+ def decode(bytes)
30
+ bytes_to_decode = bytes.dup
31
+ bytes_to_decode.force_encoding(::Protobuf::Field::BytesField::BYTES_ENCODING)
32
+ bytes_to_decode
33
+ end
34
+
35
+ def encode(value)
36
+ value_to_encode = value.dup
37
+ value_to_encode = value.encode if value.is_a?(::Protobuf::Message)
38
+ value_to_encode.force_encoding(::Protobuf::Field::BytesField::BYTES_ENCODING)
39
+
40
+ string_size = ::Protobuf::Field::VarintField.encode(value_to_encode.size)
41
+ string_size << value_to_encode
42
+ end
43
+
44
+ def wire_type
45
+ ::Protobuf::WireType::LENGTH_DELIMITED
46
+ end
47
+
48
+ private
49
+
50
+ ##
51
+ # Private Instance Methods
52
+ #
53
+
54
+ def define_setter
55
+ field = self
56
+ message_class.class_eval do
57
+ define_method(field.setter_method_name) do |val|
58
+ begin
59
+ field.warn_if_deprecated
60
+ val = "#{val}" if val.is_a?(Symbol)
61
+
62
+ if val.nil?
63
+ @values.delete(field.name)
64
+ elsif field.acceptable?(val)
65
+ @values[field.name] = val.dup
66
+ else
67
+ raise TypeError, "Unacceptable value #{val} for field #{field.name} of type #{field.type_class}"
68
+ end
69
+ rescue NoMethodError => ex
70
+ ::Protobuf::Logger.error { ex.message }
71
+ ::Protobuf::Logger.error { ex.backtrace.join("\n") }
72
+ raise TypeError, "Got NoMethodError attempting to set #{val} for field #{field.name} of type #{field.type_class}: #{ex.message}"
73
+ end
74
+ end
75
+ end
76
+ end
77
+
78
+ end
79
+ end
80
+ end
81
+
@@ -0,0 +1,26 @@
1
+ require 'protobuf/field/float_field'
2
+
3
+ module Protobuf
4
+ module Field
5
+ class DoubleField < FloatField
6
+
7
+ ##
8
+ # Public Instance Methods
9
+ #
10
+
11
+ def decode(bytes)
12
+ bytes.unpack('E').first
13
+ end
14
+
15
+ def encode(value)
16
+ [value].pack('E')
17
+ end
18
+
19
+ def wire_type
20
+ WireType::FIXED64
21
+ end
22
+
23
+ end
24
+ end
25
+ end
26
+
@@ -0,0 +1,57 @@
1
+ require 'protobuf/field/varint_field'
2
+
3
+ module Protobuf
4
+ module Field
5
+ class EnumField < VarintField
6
+
7
+ ##
8
+ # Public Instance Methods
9
+ #
10
+
11
+ def acceptable?(val)
12
+ ! type_class.fetch(val).nil?
13
+ end
14
+
15
+ def encode(value)
16
+ super(value.to_i)
17
+ end
18
+
19
+ def enum?
20
+ true
21
+ end
22
+
23
+ private
24
+
25
+ ##
26
+ # Private Instance Methods
27
+ #
28
+
29
+ def define_setter
30
+ field = self
31
+ message_class.class_eval do
32
+ define_method("#{field.name}=") do |value|
33
+ orig_value = value
34
+ if value.nil?
35
+ @values.delete(field.name)
36
+ else
37
+ value = field.type_class.fetch(value)
38
+ raise TypeError, "Invalid Enum value: #{orig_value.inspect} for #{field.name}" unless value
39
+
40
+ @values[field.name] = value
41
+ end
42
+ end
43
+ end
44
+ end
45
+
46
+ def typed_default_value
47
+ if default.is_a?(Symbol)
48
+ type_class.const_get(default)
49
+ else
50
+ self.class.default
51
+ end
52
+ end
53
+
54
+ end
55
+ end
56
+ end
57
+