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.
- checksums.yaml +4 -4
- data/.gitignore +1 -0
- data/.rubocop.yml +67 -0
- data/.rubocop_todo.yml +145 -0
- data/.travis.yml +25 -5
- data/CHANGES.md +55 -0
- data/CONTRIBUTING.md +1 -1
- data/LICENSE.txt +17 -9
- data/README.md +13 -12
- data/Rakefile +15 -11
- data/bin/protoc-gen-ruby +8 -3
- data/bin/rpc_server +1 -0
- data/examples/lib/example/reverse-client.rb +2 -2
- data/install-protobuf.sh +28 -0
- data/lib/protobuf.rb +57 -53
- data/lib/protobuf/cli.rb +94 -74
- data/lib/protobuf/code_generator.rb +60 -9
- data/lib/protobuf/decoder.rb +19 -65
- data/lib/protobuf/deprecation.rb +117 -0
- data/lib/protobuf/descriptors/google/protobuf/compiler/plugin.pb.rb +11 -1
- data/lib/protobuf/descriptors/google/protobuf/descriptor.pb.rb +55 -3
- data/lib/protobuf/encoder.rb +13 -53
- data/lib/protobuf/enum.rb +58 -63
- data/lib/protobuf/field.rb +4 -4
- data/lib/protobuf/field/base_field.rb +101 -173
- data/lib/protobuf/field/bool_field.rb +17 -11
- data/lib/protobuf/field/bytes_field.rb +21 -35
- data/lib/protobuf/field/double_field.rb +0 -1
- data/lib/protobuf/field/enum_field.rb +23 -22
- data/lib/protobuf/field/field_array.rb +5 -4
- data/lib/protobuf/field/fixed32_field.rb +1 -1
- data/lib/protobuf/field/fixed64_field.rb +0 -1
- data/lib/protobuf/field/float_field.rb +4 -1
- data/lib/protobuf/field/int32_field.rb +0 -1
- data/lib/protobuf/field/int64_field.rb +0 -1
- data/lib/protobuf/field/integer_field.rb +0 -1
- data/lib/protobuf/field/message_field.rb +13 -28
- data/lib/protobuf/field/sfixed32_field.rb +0 -1
- data/lib/protobuf/field/sfixed64_field.rb +0 -1
- data/lib/protobuf/field/signed_integer_field.rb +0 -1
- data/lib/protobuf/field/sint32_field.rb +0 -1
- data/lib/protobuf/field/sint64_field.rb +0 -1
- data/lib/protobuf/field/string_field.rb +2 -4
- data/lib/protobuf/field/uint32_field.rb +0 -1
- data/lib/protobuf/field/uint64_field.rb +0 -1
- data/lib/protobuf/field/varint_field.rb +30 -13
- data/lib/protobuf/generators/base.rb +30 -16
- data/lib/protobuf/generators/enum_generator.rb +6 -9
- data/lib/protobuf/generators/extension_generator.rb +1 -2
- data/lib/protobuf/generators/field_generator.rb +25 -13
- data/lib/protobuf/generators/file_generator.rb +157 -35
- data/lib/protobuf/generators/group_generator.rb +22 -17
- data/lib/protobuf/generators/message_generator.rb +13 -14
- data/lib/protobuf/generators/option_generator.rb +17 -0
- data/lib/protobuf/generators/printable.rb +12 -13
- data/lib/protobuf/generators/service_generator.rb +2 -3
- data/lib/protobuf/http.rb +2 -2
- data/lib/protobuf/lifecycle.rb +20 -33
- data/lib/protobuf/logging.rb +39 -0
- data/lib/protobuf/message.rb +114 -47
- data/lib/protobuf/message/fields.rb +170 -88
- data/lib/protobuf/message/serialization.rb +19 -18
- data/lib/protobuf/optionable.rb +53 -6
- data/lib/protobuf/rpc/buffer.rb +18 -19
- data/lib/protobuf/rpc/client.rb +22 -50
- data/lib/protobuf/rpc/connectors/base.rb +177 -12
- data/lib/protobuf/rpc/connectors/http.rb +14 -9
- data/lib/protobuf/rpc/connectors/ping.rb +89 -0
- data/lib/protobuf/rpc/connectors/socket.rb +13 -8
- data/lib/protobuf/rpc/connectors/zmq.rb +178 -73
- data/lib/protobuf/rpc/dynamic_discovery.pb.rb +4 -1
- data/lib/protobuf/rpc/env.rb +12 -12
- data/lib/protobuf/rpc/error.rb +3 -3
- data/lib/protobuf/rpc/error/client_error.rb +4 -4
- data/lib/protobuf/rpc/error/server_error.rb +9 -9
- data/lib/protobuf/rpc/middleware/exception_handler.rb +6 -2
- data/lib/protobuf/rpc/middleware/logger.rb +8 -4
- data/lib/protobuf/rpc/middleware/request_decoder.rb +17 -21
- data/lib/protobuf/rpc/middleware/response_encoder.rb +22 -27
- data/lib/protobuf/rpc/middleware/statsd.rb +3 -3
- data/lib/protobuf/rpc/rpc.pb.rb +4 -1
- data/lib/protobuf/rpc/server.rb +1 -1
- data/lib/protobuf/rpc/servers/http/server.rb +19 -17
- data/lib/protobuf/rpc/servers/socket/server.rb +78 -70
- data/lib/protobuf/rpc/servers/socket/worker.rb +4 -4
- data/lib/protobuf/rpc/servers/socket_runner.rb +27 -15
- data/lib/protobuf/rpc/servers/zmq/broker.rb +70 -31
- data/lib/protobuf/rpc/servers/zmq/server.rb +55 -47
- data/lib/protobuf/rpc/servers/zmq/util.rb +14 -13
- data/lib/protobuf/rpc/servers/zmq/worker.rb +16 -16
- data/lib/protobuf/rpc/servers/zmq_runner.rb +26 -7
- data/lib/protobuf/rpc/service.rb +21 -27
- data/lib/protobuf/rpc/service_directory.rb +43 -27
- data/lib/protobuf/rpc/service_dispatcher.rb +9 -10
- data/lib/protobuf/rpc/service_filters.rb +32 -55
- data/lib/protobuf/rpc/stat.rb +4 -8
- data/lib/protobuf/socket.rb +1 -2
- data/lib/protobuf/tasks/compile.rake +3 -4
- data/lib/protobuf/varint.rb +9 -0
- data/lib/protobuf/varint_pure.rb +13 -0
- data/lib/protobuf/version.rb +1 -1
- data/lib/protobuf/zmq.rb +2 -2
- data/proto/google/protobuf/descriptor.proto +190 -31
- data/protobuffy.gemspec +30 -17
- data/spec/benchmark/tasks.rb +27 -19
- data/spec/bin/protoc-gen-ruby_spec.rb +11 -6
- data/spec/encoding/all_types_spec.rb +96 -84
- data/spec/encoding/extreme_values_spec.rb +0 -0
- data/spec/functional/class_inheritance_spec.rb +52 -0
- data/spec/functional/code_generator_spec.rb +38 -0
- data/spec/functional/socket_server_spec.rb +15 -15
- data/spec/functional/zmq_server_spec.rb +29 -27
- data/spec/lib/protobuf/cli_spec.rb +82 -67
- data/spec/lib/protobuf/code_generator_spec.rb +37 -10
- data/spec/lib/protobuf/enum_spec.rb +77 -46
- data/spec/lib/protobuf/field/bool_field_spec.rb +91 -0
- data/spec/lib/protobuf/field/double_field_spec.rb +9 -0
- data/spec/lib/protobuf/field/enum_field_spec.rb +26 -0
- data/spec/lib/protobuf/field/field_array_spec.rb +69 -0
- data/spec/lib/protobuf/field/fixed32_field_spec.rb +7 -0
- data/spec/lib/protobuf/field/fixed64_field_spec.rb +7 -0
- data/spec/lib/protobuf/field/float_field_spec.rb +90 -0
- data/spec/lib/protobuf/field/int32_field_spec.rb +114 -1
- data/spec/lib/protobuf/field/int64_field_spec.rb +7 -0
- data/spec/lib/protobuf/field/message_field_spec.rb +132 -0
- data/spec/lib/protobuf/field/sfixed32_field_spec.rb +9 -0
- data/spec/lib/protobuf/field/sfixed64_field_spec.rb +9 -0
- data/spec/lib/protobuf/field/sint32_field_spec.rb +9 -0
- data/spec/lib/protobuf/field/sint64_field_spec.rb +9 -0
- data/spec/lib/protobuf/field/string_field_spec.rb +44 -11
- data/spec/lib/protobuf/field/uint32_field_spec.rb +7 -0
- data/spec/lib/protobuf/field/uint64_field_spec.rb +7 -0
- data/spec/lib/protobuf/field_spec.rb +4 -6
- data/spec/lib/protobuf/generators/base_spec.rb +80 -13
- data/spec/lib/protobuf/generators/enum_generator_spec.rb +35 -21
- data/spec/lib/protobuf/generators/extension_generator_spec.rb +12 -13
- data/spec/lib/protobuf/generators/field_generator_spec.rb +73 -21
- data/spec/lib/protobuf/generators/file_generator_spec.rb +89 -6
- data/spec/lib/protobuf/generators/service_generator_spec.rb +25 -13
- data/spec/lib/protobuf/lifecycle_spec.rb +25 -20
- data/spec/lib/protobuf/message_spec.rb +578 -79
- data/spec/lib/protobuf/optionable_spec.rb +202 -26
- data/spec/lib/protobuf/rpc/client_spec.rb +16 -16
- data/spec/lib/protobuf/rpc/connectors/base_spec.rb +167 -13
- data/spec/lib/protobuf/rpc/connectors/connector_spec.rb +4 -5
- data/spec/lib/protobuf/rpc/connectors/http_spec.rb +13 -11
- data/spec/lib/protobuf/rpc/connectors/ping_spec.rb +69 -0
- data/spec/lib/protobuf/rpc/connectors/socket_spec.rb +6 -7
- data/spec/lib/protobuf/rpc/connectors/zmq_spec.rb +35 -52
- data/spec/lib/protobuf/rpc/middleware/exception_handler_spec.rb +10 -10
- data/spec/lib/protobuf/rpc/middleware/logger_spec.rb +11 -11
- data/spec/lib/protobuf/rpc/middleware/request_decoder_spec.rb +23 -23
- data/spec/lib/protobuf/rpc/middleware/response_encoder_spec.rb +11 -11
- data/spec/lib/protobuf/rpc/middleware/statsd_spec.rb +6 -6
- data/spec/lib/protobuf/rpc/servers/http/server_spec.rb +47 -44
- data/spec/lib/protobuf/rpc/servers/socket_server_spec.rb +6 -6
- data/spec/lib/protobuf/rpc/servers/zmq/server_spec.rb +12 -10
- data/spec/lib/protobuf/rpc/servers/zmq/util_spec.rb +11 -11
- data/spec/lib/protobuf/rpc/servers/zmq/worker_spec.rb +7 -7
- data/spec/lib/protobuf/rpc/service_directory_spec.rb +47 -49
- data/spec/lib/protobuf/rpc/service_dispatcher_spec.rb +8 -25
- data/spec/lib/protobuf/rpc/service_filters_spec.rb +102 -69
- data/spec/lib/protobuf/rpc/service_spec.rb +37 -36
- data/spec/lib/protobuf/rpc/stat_spec.rb +7 -9
- data/spec/lib/protobuf/varint_spec.rb +29 -0
- data/spec/lib/protobuf_spec.rb +55 -28
- data/spec/spec_helper.rb +12 -27
- data/spec/support/all.rb +0 -1
- data/spec/support/packed_field.rb +4 -3
- data/spec/support/{test → protos}/all_types.data.bin +0 -0
- data/spec/support/{test → protos}/all_types.data.txt +0 -0
- data/spec/support/{test → protos}/enum.pb.rb +8 -4
- data/spec/support/{test → protos}/enum.proto +4 -1
- data/spec/support/{test → protos}/extreme_values.data.bin +0 -0
- data/spec/support/protos/google_unittest.bin +0 -0
- data/spec/support/protos/google_unittest.pb.rb +798 -0
- data/spec/support/{test → protos}/google_unittest.proto +237 -66
- data/spec/support/protos/google_unittest_custom_options.bin +0 -0
- data/spec/support/protos/google_unittest_custom_options.pb.rb +268 -0
- data/spec/support/protos/google_unittest_custom_options.proto +424 -0
- data/spec/support/protos/google_unittest_import.pb.rb +55 -0
- data/spec/support/{test → protos}/google_unittest_import.proto +19 -10
- data/spec/support/protos/google_unittest_import_public.pb.rb +31 -0
- data/spec/support/{test → protos}/google_unittest_import_public.proto +8 -5
- data/spec/support/{test → protos}/multi_field_extensions.pb.rb +5 -2
- data/spec/support/{test → protos}/multi_field_extensions.proto +2 -0
- data/spec/support/{test → protos}/resource.pb.rb +47 -11
- data/spec/support/{test → protos}/resource.proto +24 -1
- data/spec/support/resource_service.rb +23 -0
- data/spec/support/server.rb +32 -61
- metadata +119 -59
- data/lib/protobuf/deprecator.rb +0 -42
- data/lib/protobuf/logger.rb +0 -93
- data/lib/protobuf/rpc/connector.rb +0 -21
- data/lib/protobuf/rpc/connectors/common.rb +0 -172
- data/spec/data/data.bin +0 -3
- data/spec/data/types.bin +0 -0
- data/spec/lib/protobuf/logger_spec.rb +0 -145
- data/spec/lib/protobuf/rpc/connector_spec.rb +0 -26
- data/spec/lib/protobuf/rpc/connectors/common_spec.rb +0 -170
- data/spec/support/test/defaults.pb.rb +0 -25
- data/spec/support/test/defaults.proto +0 -9
- data/spec/support/test/extended.pb.rb +0 -22
- data/spec/support/test/extended.proto +0 -10
- data/spec/support/test/google_unittest.pb.rb +0 -543
- data/spec/support/test/google_unittest_import.pb.rb +0 -37
- data/spec/support/test/google_unittest_import_public.pb.rb +0 -8
- data/spec/support/test/resource_service.rb +0 -26
- 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
|
-
|
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
|
-
|
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
|
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
|
-
|
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 =
|
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.
|
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 =
|
37
|
-
|
38
|
-
|
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
|
-
|
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
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
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
|
-
|
@@ -1,57 +1,58 @@
|
|
1
|
-
require 'protobuf/field/
|
1
|
+
require 'protobuf/field/integer_field'
|
2
2
|
|
3
3
|
module Protobuf
|
4
4
|
module Field
|
5
|
-
class EnumField <
|
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
|
-
!
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
@@ -9,11 +9,7 @@ module Protobuf
|
|
9
9
|
#
|
10
10
|
|
11
11
|
def acceptable?(val)
|
12
|
-
|
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
|
-
|
33
|
+
def coerce!(value)
|
34
|
+
return nil if value.nil?
|
38
35
|
|
39
|
-
|
40
|
-
|
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
|
-
|
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
|
-
|
@@ -8,7 +8,7 @@ module Protobuf
|
|
8
8
|
# Constants
|
9
9
|
#
|
10
10
|
|
11
|
-
ENCODING =
|
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
|
-
|
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
|
-
|