protobuffy 3.6.0 → 4.0.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 (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
-