protobuffy 3.6.0 → 4.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (209) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +1 -0
  3. data/.rubocop.yml +67 -0
  4. data/.rubocop_todo.yml +145 -0
  5. data/.travis.yml +25 -5
  6. data/CHANGES.md +55 -0
  7. data/CONTRIBUTING.md +1 -1
  8. data/LICENSE.txt +17 -9
  9. data/README.md +13 -12
  10. data/Rakefile +15 -11
  11. data/bin/protoc-gen-ruby +8 -3
  12. data/bin/rpc_server +1 -0
  13. data/examples/lib/example/reverse-client.rb +2 -2
  14. data/install-protobuf.sh +28 -0
  15. data/lib/protobuf.rb +57 -53
  16. data/lib/protobuf/cli.rb +94 -74
  17. data/lib/protobuf/code_generator.rb +60 -9
  18. data/lib/protobuf/decoder.rb +19 -65
  19. data/lib/protobuf/deprecation.rb +117 -0
  20. data/lib/protobuf/descriptors/google/protobuf/compiler/plugin.pb.rb +11 -1
  21. data/lib/protobuf/descriptors/google/protobuf/descriptor.pb.rb +55 -3
  22. data/lib/protobuf/encoder.rb +13 -53
  23. data/lib/protobuf/enum.rb +58 -63
  24. data/lib/protobuf/field.rb +4 -4
  25. data/lib/protobuf/field/base_field.rb +101 -173
  26. data/lib/protobuf/field/bool_field.rb +17 -11
  27. data/lib/protobuf/field/bytes_field.rb +21 -35
  28. data/lib/protobuf/field/double_field.rb +0 -1
  29. data/lib/protobuf/field/enum_field.rb +23 -22
  30. data/lib/protobuf/field/field_array.rb +5 -4
  31. data/lib/protobuf/field/fixed32_field.rb +1 -1
  32. data/lib/protobuf/field/fixed64_field.rb +0 -1
  33. data/lib/protobuf/field/float_field.rb +4 -1
  34. data/lib/protobuf/field/int32_field.rb +0 -1
  35. data/lib/protobuf/field/int64_field.rb +0 -1
  36. data/lib/protobuf/field/integer_field.rb +0 -1
  37. data/lib/protobuf/field/message_field.rb +13 -28
  38. data/lib/protobuf/field/sfixed32_field.rb +0 -1
  39. data/lib/protobuf/field/sfixed64_field.rb +0 -1
  40. data/lib/protobuf/field/signed_integer_field.rb +0 -1
  41. data/lib/protobuf/field/sint32_field.rb +0 -1
  42. data/lib/protobuf/field/sint64_field.rb +0 -1
  43. data/lib/protobuf/field/string_field.rb +2 -4
  44. data/lib/protobuf/field/uint32_field.rb +0 -1
  45. data/lib/protobuf/field/uint64_field.rb +0 -1
  46. data/lib/protobuf/field/varint_field.rb +30 -13
  47. data/lib/protobuf/generators/base.rb +30 -16
  48. data/lib/protobuf/generators/enum_generator.rb +6 -9
  49. data/lib/protobuf/generators/extension_generator.rb +1 -2
  50. data/lib/protobuf/generators/field_generator.rb +25 -13
  51. data/lib/protobuf/generators/file_generator.rb +157 -35
  52. data/lib/protobuf/generators/group_generator.rb +22 -17
  53. data/lib/protobuf/generators/message_generator.rb +13 -14
  54. data/lib/protobuf/generators/option_generator.rb +17 -0
  55. data/lib/protobuf/generators/printable.rb +12 -13
  56. data/lib/protobuf/generators/service_generator.rb +2 -3
  57. data/lib/protobuf/http.rb +2 -2
  58. data/lib/protobuf/lifecycle.rb +20 -33
  59. data/lib/protobuf/logging.rb +39 -0
  60. data/lib/protobuf/message.rb +114 -47
  61. data/lib/protobuf/message/fields.rb +170 -88
  62. data/lib/protobuf/message/serialization.rb +19 -18
  63. data/lib/protobuf/optionable.rb +53 -6
  64. data/lib/protobuf/rpc/buffer.rb +18 -19
  65. data/lib/protobuf/rpc/client.rb +22 -50
  66. data/lib/protobuf/rpc/connectors/base.rb +177 -12
  67. data/lib/protobuf/rpc/connectors/http.rb +14 -9
  68. data/lib/protobuf/rpc/connectors/ping.rb +89 -0
  69. data/lib/protobuf/rpc/connectors/socket.rb +13 -8
  70. data/lib/protobuf/rpc/connectors/zmq.rb +178 -73
  71. data/lib/protobuf/rpc/dynamic_discovery.pb.rb +4 -1
  72. data/lib/protobuf/rpc/env.rb +12 -12
  73. data/lib/protobuf/rpc/error.rb +3 -3
  74. data/lib/protobuf/rpc/error/client_error.rb +4 -4
  75. data/lib/protobuf/rpc/error/server_error.rb +9 -9
  76. data/lib/protobuf/rpc/middleware/exception_handler.rb +6 -2
  77. data/lib/protobuf/rpc/middleware/logger.rb +8 -4
  78. data/lib/protobuf/rpc/middleware/request_decoder.rb +17 -21
  79. data/lib/protobuf/rpc/middleware/response_encoder.rb +22 -27
  80. data/lib/protobuf/rpc/middleware/statsd.rb +3 -3
  81. data/lib/protobuf/rpc/rpc.pb.rb +4 -1
  82. data/lib/protobuf/rpc/server.rb +1 -1
  83. data/lib/protobuf/rpc/servers/http/server.rb +19 -17
  84. data/lib/protobuf/rpc/servers/socket/server.rb +78 -70
  85. data/lib/protobuf/rpc/servers/socket/worker.rb +4 -4
  86. data/lib/protobuf/rpc/servers/socket_runner.rb +27 -15
  87. data/lib/protobuf/rpc/servers/zmq/broker.rb +70 -31
  88. data/lib/protobuf/rpc/servers/zmq/server.rb +55 -47
  89. data/lib/protobuf/rpc/servers/zmq/util.rb +14 -13
  90. data/lib/protobuf/rpc/servers/zmq/worker.rb +16 -16
  91. data/lib/protobuf/rpc/servers/zmq_runner.rb +26 -7
  92. data/lib/protobuf/rpc/service.rb +21 -27
  93. data/lib/protobuf/rpc/service_directory.rb +43 -27
  94. data/lib/protobuf/rpc/service_dispatcher.rb +9 -10
  95. data/lib/protobuf/rpc/service_filters.rb +32 -55
  96. data/lib/protobuf/rpc/stat.rb +4 -8
  97. data/lib/protobuf/socket.rb +1 -2
  98. data/lib/protobuf/tasks/compile.rake +3 -4
  99. data/lib/protobuf/varint.rb +9 -0
  100. data/lib/protobuf/varint_pure.rb +13 -0
  101. data/lib/protobuf/version.rb +1 -1
  102. data/lib/protobuf/zmq.rb +2 -2
  103. data/proto/google/protobuf/descriptor.proto +190 -31
  104. data/protobuffy.gemspec +30 -17
  105. data/spec/benchmark/tasks.rb +27 -19
  106. data/spec/bin/protoc-gen-ruby_spec.rb +11 -6
  107. data/spec/encoding/all_types_spec.rb +96 -84
  108. data/spec/encoding/extreme_values_spec.rb +0 -0
  109. data/spec/functional/class_inheritance_spec.rb +52 -0
  110. data/spec/functional/code_generator_spec.rb +38 -0
  111. data/spec/functional/socket_server_spec.rb +15 -15
  112. data/spec/functional/zmq_server_spec.rb +29 -27
  113. data/spec/lib/protobuf/cli_spec.rb +82 -67
  114. data/spec/lib/protobuf/code_generator_spec.rb +37 -10
  115. data/spec/lib/protobuf/enum_spec.rb +77 -46
  116. data/spec/lib/protobuf/field/bool_field_spec.rb +91 -0
  117. data/spec/lib/protobuf/field/double_field_spec.rb +9 -0
  118. data/spec/lib/protobuf/field/enum_field_spec.rb +26 -0
  119. data/spec/lib/protobuf/field/field_array_spec.rb +69 -0
  120. data/spec/lib/protobuf/field/fixed32_field_spec.rb +7 -0
  121. data/spec/lib/protobuf/field/fixed64_field_spec.rb +7 -0
  122. data/spec/lib/protobuf/field/float_field_spec.rb +90 -0
  123. data/spec/lib/protobuf/field/int32_field_spec.rb +114 -1
  124. data/spec/lib/protobuf/field/int64_field_spec.rb +7 -0
  125. data/spec/lib/protobuf/field/message_field_spec.rb +132 -0
  126. data/spec/lib/protobuf/field/sfixed32_field_spec.rb +9 -0
  127. data/spec/lib/protobuf/field/sfixed64_field_spec.rb +9 -0
  128. data/spec/lib/protobuf/field/sint32_field_spec.rb +9 -0
  129. data/spec/lib/protobuf/field/sint64_field_spec.rb +9 -0
  130. data/spec/lib/protobuf/field/string_field_spec.rb +44 -11
  131. data/spec/lib/protobuf/field/uint32_field_spec.rb +7 -0
  132. data/spec/lib/protobuf/field/uint64_field_spec.rb +7 -0
  133. data/spec/lib/protobuf/field_spec.rb +4 -6
  134. data/spec/lib/protobuf/generators/base_spec.rb +80 -13
  135. data/spec/lib/protobuf/generators/enum_generator_spec.rb +35 -21
  136. data/spec/lib/protobuf/generators/extension_generator_spec.rb +12 -13
  137. data/spec/lib/protobuf/generators/field_generator_spec.rb +73 -21
  138. data/spec/lib/protobuf/generators/file_generator_spec.rb +89 -6
  139. data/spec/lib/protobuf/generators/service_generator_spec.rb +25 -13
  140. data/spec/lib/protobuf/lifecycle_spec.rb +25 -20
  141. data/spec/lib/protobuf/message_spec.rb +578 -79
  142. data/spec/lib/protobuf/optionable_spec.rb +202 -26
  143. data/spec/lib/protobuf/rpc/client_spec.rb +16 -16
  144. data/spec/lib/protobuf/rpc/connectors/base_spec.rb +167 -13
  145. data/spec/lib/protobuf/rpc/connectors/connector_spec.rb +4 -5
  146. data/spec/lib/protobuf/rpc/connectors/http_spec.rb +13 -11
  147. data/spec/lib/protobuf/rpc/connectors/ping_spec.rb +69 -0
  148. data/spec/lib/protobuf/rpc/connectors/socket_spec.rb +6 -7
  149. data/spec/lib/protobuf/rpc/connectors/zmq_spec.rb +35 -52
  150. data/spec/lib/protobuf/rpc/middleware/exception_handler_spec.rb +10 -10
  151. data/spec/lib/protobuf/rpc/middleware/logger_spec.rb +11 -11
  152. data/spec/lib/protobuf/rpc/middleware/request_decoder_spec.rb +23 -23
  153. data/spec/lib/protobuf/rpc/middleware/response_encoder_spec.rb +11 -11
  154. data/spec/lib/protobuf/rpc/middleware/statsd_spec.rb +6 -6
  155. data/spec/lib/protobuf/rpc/servers/http/server_spec.rb +47 -44
  156. data/spec/lib/protobuf/rpc/servers/socket_server_spec.rb +6 -6
  157. data/spec/lib/protobuf/rpc/servers/zmq/server_spec.rb +12 -10
  158. data/spec/lib/protobuf/rpc/servers/zmq/util_spec.rb +11 -11
  159. data/spec/lib/protobuf/rpc/servers/zmq/worker_spec.rb +7 -7
  160. data/spec/lib/protobuf/rpc/service_directory_spec.rb +47 -49
  161. data/spec/lib/protobuf/rpc/service_dispatcher_spec.rb +8 -25
  162. data/spec/lib/protobuf/rpc/service_filters_spec.rb +102 -69
  163. data/spec/lib/protobuf/rpc/service_spec.rb +37 -36
  164. data/spec/lib/protobuf/rpc/stat_spec.rb +7 -9
  165. data/spec/lib/protobuf/varint_spec.rb +29 -0
  166. data/spec/lib/protobuf_spec.rb +55 -28
  167. data/spec/spec_helper.rb +12 -27
  168. data/spec/support/all.rb +0 -1
  169. data/spec/support/packed_field.rb +4 -3
  170. data/spec/support/{test → protos}/all_types.data.bin +0 -0
  171. data/spec/support/{test → protos}/all_types.data.txt +0 -0
  172. data/spec/support/{test → protos}/enum.pb.rb +8 -4
  173. data/spec/support/{test → protos}/enum.proto +4 -1
  174. data/spec/support/{test → protos}/extreme_values.data.bin +0 -0
  175. data/spec/support/protos/google_unittest.bin +0 -0
  176. data/spec/support/protos/google_unittest.pb.rb +798 -0
  177. data/spec/support/{test → protos}/google_unittest.proto +237 -66
  178. data/spec/support/protos/google_unittest_custom_options.bin +0 -0
  179. data/spec/support/protos/google_unittest_custom_options.pb.rb +268 -0
  180. data/spec/support/protos/google_unittest_custom_options.proto +424 -0
  181. data/spec/support/protos/google_unittest_import.pb.rb +55 -0
  182. data/spec/support/{test → protos}/google_unittest_import.proto +19 -10
  183. data/spec/support/protos/google_unittest_import_public.pb.rb +31 -0
  184. data/spec/support/{test → protos}/google_unittest_import_public.proto +8 -5
  185. data/spec/support/{test → protos}/multi_field_extensions.pb.rb +5 -2
  186. data/spec/support/{test → protos}/multi_field_extensions.proto +2 -0
  187. data/spec/support/{test → protos}/resource.pb.rb +47 -11
  188. data/spec/support/{test → protos}/resource.proto +24 -1
  189. data/spec/support/resource_service.rb +23 -0
  190. data/spec/support/server.rb +32 -61
  191. metadata +119 -59
  192. data/lib/protobuf/deprecator.rb +0 -42
  193. data/lib/protobuf/logger.rb +0 -93
  194. data/lib/protobuf/rpc/connector.rb +0 -21
  195. data/lib/protobuf/rpc/connectors/common.rb +0 -172
  196. data/spec/data/data.bin +0 -3
  197. data/spec/data/types.bin +0 -0
  198. data/spec/lib/protobuf/logger_spec.rb +0 -145
  199. data/spec/lib/protobuf/rpc/connector_spec.rb +0 -26
  200. data/spec/lib/protobuf/rpc/connectors/common_spec.rb +0 -170
  201. data/spec/support/test/defaults.pb.rb +0 -25
  202. data/spec/support/test/defaults.proto +0 -9
  203. data/spec/support/test/extended.pb.rb +0 -22
  204. data/spec/support/test/extended.proto +0 -10
  205. data/spec/support/test/google_unittest.pb.rb +0 -543
  206. data/spec/support/test/google_unittest_import.pb.rb +0 -37
  207. data/spec/support/test/google_unittest_import_public.pb.rb +0 -8
  208. data/spec/support/test/resource_service.rb +0 -26
  209. data/spec/support/tolerance_matcher.rb +0 -40
@@ -3,6 +3,10 @@ require 'protobuf/field/varint_field'
3
3
  module Protobuf
4
4
  module Field
5
5
  class BoolField < VarintField
6
+ FALSE_ENCODE = [0].pack('C')
7
+ FALSE_STRING = "false".freeze
8
+ TRUE_ENCODE = [1].pack('C')
9
+ TRUE_STRING = "true".freeze
6
10
 
7
11
  ##
8
12
  # Class Methods
@@ -12,13 +16,21 @@ module Protobuf
12
16
  false
13
17
  end
14
18
 
15
-
16
19
  ##
17
20
  # Public Instance Methods
18
21
  # #
19
22
 
20
23
  def acceptable?(val)
21
- [true, false].include?(val)
24
+ val == true || val == false || val == TRUE_STRING || val == FALSE_STRING
25
+ end
26
+
27
+ def coerce!(val)
28
+ return true if val == true
29
+ return false if val == false
30
+ return true if val == TRUE_STRING
31
+ return false if val == FALSE_STRING
32
+
33
+ val
22
34
  end
23
35
 
24
36
  def decode(value)
@@ -26,7 +38,7 @@ module Protobuf
26
38
  end
27
39
 
28
40
  def encode(value)
29
- [value ? 1 : 0].pack('C')
41
+ value ? TRUE_ENCODE : FALSE_ENCODE
30
42
  end
31
43
 
32
44
  private
@@ -35,19 +47,13 @@ module Protobuf
35
47
  # Private Instance Methods
36
48
  #
37
49
 
38
- def define_getter
50
+ def define_accessor(simple_field_name, _fully_qualified_field_name)
39
51
  super
40
-
41
- field = self
42
52
  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
53
+ alias_method "#{simple_field_name}?", simple_field_name
47
54
  end
48
55
  end
49
56
 
50
57
  end
51
58
  end
52
59
  end
53
-
@@ -8,7 +8,7 @@ module Protobuf
8
8
  # Constants
9
9
  #
10
10
 
11
- BYTES_ENCODING = "ASCII-8BIT".freeze
11
+ BYTES_ENCODING = Encoding::BINARY
12
12
 
13
13
  ##
14
14
  # Class Methods
@@ -23,7 +23,7 @@ module Protobuf
23
23
  #
24
24
 
25
25
  def acceptable?(val)
26
- val.nil? || val.is_a?(String) || val.is_a?(Symbol) || val.is_a?(::Protobuf::Message)
26
+ val.is_a?(String) || val.nil? || val.is_a?(Symbol) || val.is_a?(::Protobuf::Message)
27
27
  end
28
28
 
29
29
  def decode(bytes)
@@ -33,49 +33,35 @@ module Protobuf
33
33
  end
34
34
 
35
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)
36
+ value_to_encode =
37
+ if value.is_a?(::Protobuf::Message)
38
+ value.encode
39
+ else
40
+ value.dup
41
+ end
39
42
 
43
+ value_to_encode.force_encoding(::Protobuf::Field::BytesField::BYTES_ENCODING)
40
44
  string_size = ::Protobuf::Field::VarintField.encode(value_to_encode.size)
41
- string_size << value_to_encode
45
+
46
+ "#{string_size}#{value_to_encode}"
42
47
  end
43
48
 
44
49
  def wire_type
45
50
  ::Protobuf::WireType::LENGTH_DELIMITED
46
51
  end
47
52
 
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
53
+ def coerce!(value)
54
+ case value
55
+ when String, Symbol
56
+ value.to_s
57
+ when NilClass
58
+ nil
59
+ when ::Protobuf::Message
60
+ value.dup
61
+ else
62
+ fail TypeError, "Unacceptable value #{value} for field #{name} of type #{type_class}"
75
63
  end
76
64
  end
77
-
78
65
  end
79
66
  end
80
67
  end
81
-
@@ -23,4 +23,3 @@ module Protobuf
23
23
  end
24
24
  end
25
25
  end
26
-
@@ -1,57 +1,58 @@
1
- require 'protobuf/field/varint_field'
1
+ require 'protobuf/field/integer_field'
2
2
 
3
3
  module Protobuf
4
4
  module Field
5
- class EnumField < VarintField
5
+ class EnumField < IntegerField
6
+
7
+ ##
8
+ # Class Methods
9
+ #
10
+
11
+ def self.default
12
+ fail NoMethodError, "#{self}.#{__method__} must be called on an instance"
13
+ end
6
14
 
7
15
  ##
8
16
  # Public Instance Methods
9
17
  #
10
18
 
11
19
  def acceptable?(val)
12
- ! type_class.fetch(val).nil?
20
+ !type_class.fetch(val).nil?
13
21
  end
14
22
 
15
23
  def encode(value)
16
24
  super(value.to_i)
17
25
  end
18
26
 
27
+ def decode(value)
28
+ decoded = super(value)
29
+ decoded if acceptable?(decoded)
30
+ end
31
+
19
32
  def enum?
20
33
  true
21
34
  end
22
35
 
36
+ def coerce!(value)
37
+ enum_value = type_class.fetch(value)
38
+ fail TypeError, "Invalid Enum value: #{value.inspect} for #{name}" unless enum_value
39
+ enum_value
40
+ end
41
+
23
42
  private
24
43
 
25
44
  ##
26
45
  # Private Instance Methods
27
46
  #
28
47
 
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
48
  def typed_default_value
47
49
  if default.is_a?(Symbol)
48
50
  type_class.const_get(default)
49
51
  else
50
- self.class.default
52
+ type_class.fetch(default) || type_class.enums.first
51
53
  end
52
54
  end
53
55
 
54
56
  end
55
57
  end
56
58
  end
57
-
@@ -41,7 +41,7 @@ module Protobuf
41
41
  # Return a hash-representation of the given values for this field type.
42
42
  # The value in this case would be an array.
43
43
  def to_hash_value
44
- self.map do |value|
44
+ map do |value|
45
45
  value.respond_to?(:to_hash_value) ? value.to_hash_value : value
46
46
  end
47
47
  end
@@ -62,10 +62,12 @@ module Protobuf
62
62
 
63
63
  def normalize(value)
64
64
  value = value.to_proto if value.respond_to?(:to_proto)
65
- raise TypeError, "Unacceptable value #{value} for field #{field.name} of type #{field.type_class}" unless field.acceptable?(value)
65
+ fail TypeError, "Unacceptable value #{value} for field #{field.name} of type #{field.type_class}" unless field.acceptable?(value)
66
66
 
67
67
  if field.is_a?(::Protobuf::Field::EnumField)
68
68
  field.type_class.fetch(value)
69
+ elsif field.is_a?(::Protobuf::Field::MessageField) && value.is_a?(field.type_class)
70
+ value
69
71
  elsif field.is_a?(::Protobuf::Field::MessageField) && value.respond_to?(:to_hash)
70
72
  field.type_class.new(value.to_hash)
71
73
  else
@@ -74,7 +76,7 @@ module Protobuf
74
76
  end
75
77
 
76
78
  def raise_type_error(val)
77
- raise TypeError, <<-TYPE_ERROR
79
+ fail TypeError, <<-TYPE_ERROR
78
80
  Expected repeated value of type '#{field.type_class}'
79
81
  Got '#{val.class}' for repeated protobuf field #{field.name}
80
82
  TYPE_ERROR
@@ -83,4 +85,3 @@ module Protobuf
83
85
  end
84
86
  end
85
87
  end
86
-
@@ -17,7 +17,7 @@ module Protobuf
17
17
  end
18
18
 
19
19
  def wire_type
20
- ::Protobuf::WireType::FIXED32
20
+ ::Protobuf::WireType::FIXED32
21
21
  end
22
22
 
23
23
  end
@@ -26,4 +26,3 @@ module Protobuf
26
26
  end
27
27
  end
28
28
  end
29
-
@@ -20,6 +20,10 @@ module Protobuf
20
20
  val.respond_to?(:to_f)
21
21
  end
22
22
 
23
+ def coerce!(val)
24
+ Float(val)
25
+ end
26
+
23
27
  def decode(bytes)
24
28
  bytes.unpack('e').first
25
29
  end
@@ -35,4 +39,3 @@ module Protobuf
35
39
  end
36
40
  end
37
41
  end
38
-
@@ -19,4 +19,3 @@ module Protobuf
19
19
  end
20
20
  end
21
21
  end
22
-
@@ -19,4 +19,3 @@ module Protobuf
19
19
  end
20
20
  end
21
21
  end
22
-
@@ -21,4 +21,3 @@ module Protobuf
21
21
  end
22
22
  end
23
23
  end
24
-
@@ -9,11 +9,7 @@ module Protobuf
9
9
  #
10
10
 
11
11
  def acceptable?(val)
12
- unless val.instance_of?(type_class) || val.respond_to?(:to_hash)
13
- raise TypeError, "Expected value of type '#{type_class}' for field #{name}, but got '#{val.class}'"
14
- end
15
-
16
- true
12
+ val.is_a?(type_class) || val.respond_to?(:to_hash) || val.respond_to?(:to_proto)
17
13
  end
18
14
 
19
15
  def decode(bytes)
@@ -34,33 +30,22 @@ module Protobuf
34
30
  ::Protobuf::WireType::LENGTH_DELIMITED
35
31
  end
36
32
 
37
- private
33
+ def coerce!(value)
34
+ return nil if value.nil?
38
35
 
39
- ##
40
- # Private Instance Methods
41
- #
36
+ coerced_value = if value.respond_to?(:to_proto)
37
+ value.to_proto
38
+ elsif value.respond_to?(:to_hash)
39
+ type_class.new(value.to_hash)
40
+ else
41
+ value
42
+ end
43
+
44
+ return coerced_value if coerced_value.is_a?(type_class)
42
45
 
43
- def define_setter
44
- field = self
45
- message_class.class_eval do
46
- define_method("#{field.name}=") do |val|
47
- case
48
- when val.nil? then
49
- @values.delete(field.name)
50
- when val.is_a?(field.type_class) then
51
- @values[field.name] = val
52
- when val.respond_to?(:to_proto) then
53
- @values[field.name] = val.to_proto
54
- when val.respond_to?(:to_hash) then
55
- @values[field.name] = field.type_class.new(val.to_hash)
56
- else
57
- raise TypeError, "Expected value of type '#{field.type_class}' for field #{field.name}, but got '#{val.class}'"
58
- end
59
- end
60
- end
46
+ fail TypeError, "Expected value of type '#{type_class}' for field #{name}, but got '#{value.class}'"
61
47
  end
62
48
 
63
49
  end
64
50
  end
65
51
  end
66
-
@@ -25,4 +25,3 @@ module Protobuf
25
25
  end
26
26
  end
27
27
  end
28
-
@@ -26,4 +26,3 @@ module Protobuf
26
26
  end
27
27
  end
28
28
  end
29
-
@@ -27,4 +27,3 @@ module Protobuf
27
27
  end
28
28
  end
29
29
  end
30
-
@@ -19,4 +19,3 @@ module Protobuf
19
19
  end
20
20
  end
21
21
  end
22
-
@@ -19,4 +19,3 @@ module Protobuf
19
19
  end
20
20
  end
21
21
  end
22
-
@@ -8,7 +8,7 @@ module Protobuf
8
8
  # Constants
9
9
  #
10
10
 
11
- ENCODING = 'UTF-8'.freeze
11
+ ENCODING = Encoding::UTF_8
12
12
 
13
13
  ##
14
14
  # Public Instance Methods
@@ -25,11 +25,9 @@ module Protobuf
25
25
  value_to_encode.encode!(::Protobuf::Field::StringField::ENCODING, :invalid => :replace, :undef => :replace, :replace => "")
26
26
  value_to_encode.force_encoding(::Protobuf::Field::BytesField::BYTES_ENCODING)
27
27
 
28
- string_size = ::Protobuf::Field::VarintField.encode(value_to_encode.size)
29
- string_size << value_to_encode
28
+ "#{::Protobuf::Field::VarintField.encode(value_to_encode.size)}#{value_to_encode}"
30
29
  end
31
30
 
32
31
  end
33
32
  end
34
33
  end
35
-
@@ -19,4 +19,3 @@ module Protobuf
19
19
  end
20
20
  end
21
21
  end
22
-