protobuffy 3.6.0 → 4.0.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
@@ -1,122 +1,204 @@
|
|
1
|
-
require
|
1
|
+
require "set"
|
2
2
|
|
3
3
|
module Protobuf
|
4
4
|
class Message
|
5
5
|
module Fields
|
6
6
|
|
7
|
-
|
8
|
-
other.extend(::Protobuf::Deprecator)
|
9
|
-
other.deprecate_class_method(:get_ext_field_by_name, :get_extension_field)
|
10
|
-
other.deprecate_class_method(:get_ext_field_by_tag, :get_extension_field)
|
11
|
-
other.deprecate_class_method(:get_field_by_name, :get_field)
|
12
|
-
other.deprecate_class_method(:get_field_by_tag, :get_field)
|
13
|
-
end
|
7
|
+
ACCESSOR_SUFFIXES = ["", "=", "!", "?"].freeze
|
14
8
|
|
15
|
-
|
16
|
-
|
17
|
-
|
9
|
+
def self.extended(other)
|
10
|
+
other.extend(ClassMethods)
|
11
|
+
::Protobuf.deprecator.define_deprecated_methods(
|
12
|
+
other.singleton_class,
|
13
|
+
:get_ext_field_by_name => :get_extension_field,
|
14
|
+
:get_ext_field_by_tag => :get_extension_field,
|
15
|
+
:get_field_by_name => :get_field,
|
16
|
+
:get_field_by_tag => :get_field
|
17
|
+
)
|
18
|
+
end
|
19
|
+
|
20
|
+
module ClassMethods
|
21
|
+
def inherited(subclass)
|
22
|
+
inherit_fields!(subclass)
|
23
|
+
end
|
18
24
|
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
define_field(:optional, type_class, name, tag, options)
|
23
|
-
end
|
25
|
+
##
|
26
|
+
# Field Definition Methods
|
27
|
+
#
|
24
28
|
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
29
|
+
# Define an optional field.
|
30
|
+
#
|
31
|
+
def optional(type_class, name, tag, options = {})
|
32
|
+
define_field(:optional, type_class, name, tag, options)
|
33
|
+
end
|
30
34
|
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
35
|
+
# Define a repeated field.
|
36
|
+
#
|
37
|
+
def repeated(type_class, name, tag, options = {})
|
38
|
+
define_field(:repeated, type_class, name, tag, options)
|
39
|
+
end
|
36
40
|
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
41
|
+
# Define a required field.
|
42
|
+
#
|
43
|
+
def required(type_class, name, tag, options = {})
|
44
|
+
define_field(:required, type_class, name, tag, options)
|
45
|
+
end
|
42
46
|
|
43
|
-
|
44
|
-
|
45
|
-
|
47
|
+
# Define an extension range.
|
48
|
+
#
|
49
|
+
def extensions(range)
|
50
|
+
extension_ranges << range
|
51
|
+
end
|
46
52
|
|
47
|
-
|
48
|
-
|
49
|
-
|
53
|
+
##
|
54
|
+
# Field Access Methods
|
55
|
+
#
|
56
|
+
def all_fields
|
57
|
+
@all_fields ||= field_store.values.uniq.sort_by(&:tag)
|
58
|
+
end
|
50
59
|
|
51
|
-
|
52
|
-
|
53
|
-
|
60
|
+
def extension_fields
|
61
|
+
@extension_fields ||= all_fields.select(&:extension?)
|
62
|
+
end
|
54
63
|
|
55
|
-
|
56
|
-
|
57
|
-
|
64
|
+
def extension_ranges
|
65
|
+
@extension_ranges ||= []
|
66
|
+
end
|
58
67
|
|
59
|
-
|
60
|
-
|
61
|
-
|
68
|
+
def extension_tag?(tag)
|
69
|
+
tag.respond_to?(:to_i) && get_extension_field(tag).present?
|
70
|
+
end
|
62
71
|
|
63
|
-
|
64
|
-
|
65
|
-
|
72
|
+
def field_store
|
73
|
+
@field_store ||= {}
|
74
|
+
end
|
66
75
|
|
67
|
-
|
68
|
-
|
69
|
-
|
76
|
+
def fields
|
77
|
+
@fields ||= all_fields.reject(&:extension?)
|
78
|
+
end
|
70
79
|
|
71
|
-
|
72
|
-
|
73
|
-
|
80
|
+
def field_tag?(tag, allow_extension = false)
|
81
|
+
tag.respond_to?(:to_i) && get_field(tag, allow_extension).present?
|
82
|
+
end
|
74
83
|
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
end
|
84
|
+
def get_extension_field(name_or_tag)
|
85
|
+
field = field_store[name_or_tag]
|
86
|
+
field if field.try(:extension?) { false }
|
87
|
+
end
|
80
88
|
|
81
|
-
|
82
|
-
|
83
|
-
field = field_store[name_or_tag]
|
89
|
+
def get_field(name_or_tag, allow_extension = false)
|
90
|
+
field = field_store[name_or_tag]
|
84
91
|
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
92
|
+
if field && (allow_extension || !field.extension?)
|
93
|
+
field
|
94
|
+
else
|
95
|
+
nil
|
96
|
+
end
|
89
97
|
end
|
90
|
-
end
|
91
98
|
|
92
|
-
|
93
|
-
|
94
|
-
|
99
|
+
def define_field(rule, type_class, fully_qualified_field_name, tag, options)
|
100
|
+
raise_if_tag_collision(tag, fully_qualified_field_name)
|
101
|
+
raise_if_name_collision(fully_qualified_field_name)
|
102
|
+
|
103
|
+
# Determine appropirate accessor for fields depending on name collisions via extensions:
|
104
|
+
|
105
|
+
# Case 1: Base field = "string_field" and no extensions of the same name
|
106
|
+
# Result:
|
107
|
+
# message.string_field #=> @values["string_field"]
|
108
|
+
# message[:string_field] #=> @values["string_field"]
|
109
|
+
# message['string_field'] #=> @values["string_field"]
|
110
|
+
|
111
|
+
# Case 2: Base field = "string_field" and extension 1 = ".my_package.string_field", extension N = ".package_N.string_field"...
|
112
|
+
# Result:
|
113
|
+
# message.string_field #=> @values["string_field"]
|
114
|
+
# message[:string_field] #=> @values["string_field"]
|
115
|
+
# message['string_field'] #=> @values["string_field"]
|
116
|
+
# message[:'.my_package.string_field'] #=> @values[".my_package.string_field"]
|
117
|
+
# message['.my_package.string_field'] #=> @values[".my_package.string_field"]
|
118
|
+
|
119
|
+
# Case 3: No base field, extension 1 = ".my_package.string_field", extension 2 = ".other_package.string_field", extension N...
|
120
|
+
# Result:
|
121
|
+
# message.string_field #=> raise NoMethodError (no simple accessor allowed)
|
122
|
+
# message[:string_field] #=> raise NoMethodError (no simple accessor allowed)
|
123
|
+
# message['string_field'] #=> raise NoMethodError (no simple accessor allowed)
|
124
|
+
# message[:'.my_package.string_field'] #=> @values[".my_package.string_field"]
|
125
|
+
# message['.my_package.string_field'] #=> @values[".my_package.string_field"]
|
126
|
+
# message[:'.other_package.string_field'] #=> @values[".other_package.string_field"]
|
127
|
+
# message['.other_package.string_field'] #=> @values[".other_package.string_field"]
|
128
|
+
|
129
|
+
# Case 4: No base field, extension = ".my_package.string_field", no other extensions
|
130
|
+
# Result:
|
131
|
+
# message.string_field #=> @values[".my_package.string_field"]
|
132
|
+
# message[:string_field] #=> @values[".my_package.string_field"]
|
133
|
+
# message['string_field'] #=> @values[".my_package.string_field"]
|
134
|
+
# message[:'.my_package.string_field'] #=> @values[".my_package.string_field"]
|
135
|
+
# message[:'.my_package.string_field'] #=> @values[".my_package.string_field"]
|
136
|
+
|
137
|
+
simple_name =
|
138
|
+
if options[:extension]
|
139
|
+
base_name = fully_qualified_field_name.to_s.split('.').last.to_sym
|
140
|
+
if field_store[base_name]
|
141
|
+
# Case 3
|
142
|
+
if field_store[base_name].extension?
|
143
|
+
remove_existing_accessors(base_name)
|
144
|
+
end
|
145
|
+
nil
|
146
|
+
# Case 4
|
147
|
+
else
|
148
|
+
base_name
|
149
|
+
end
|
150
|
+
else
|
151
|
+
# Case 1
|
152
|
+
fully_qualified_field_name
|
153
|
+
end
|
154
|
+
|
155
|
+
field = ::Protobuf::Field.build(self, rule, type_class, fully_qualified_field_name,
|
156
|
+
tag, simple_name, options)
|
157
|
+
field_store[tag] = field
|
158
|
+
field_store[fully_qualified_field_name.to_sym] = field
|
159
|
+
field_store[fully_qualified_field_name.to_s] = field
|
160
|
+
if simple_name && simple_name != fully_qualified_field_name
|
161
|
+
field_store[simple_name.to_sym] = field
|
162
|
+
field_store[simple_name.to_s] = field
|
163
|
+
end
|
164
|
+
# defining a new field for the message will cause cached @all_fields, @extension_fields,
|
165
|
+
# and @fields to be incorrect; reset them
|
166
|
+
@all_fields = @extension_fields = @fields = nil
|
167
|
+
end
|
95
168
|
|
96
|
-
|
97
|
-
|
98
|
-
|
169
|
+
def remove_existing_accessors(accessor)
|
170
|
+
field_store.delete(accessor.to_sym).try(:fully_qualified_name_only!)
|
171
|
+
field_store.delete(accessor.to_s)
|
172
|
+
ACCESSOR_SUFFIXES.each do |modifier|
|
173
|
+
begin
|
174
|
+
remove_method("#{accessor}#{modifier}")
|
175
|
+
# rubocop: disable Lint/HandleExceptions
|
176
|
+
rescue NameError
|
177
|
+
# Do not remove the method
|
178
|
+
end
|
179
|
+
end
|
180
|
+
end
|
99
181
|
|
100
|
-
|
101
|
-
|
102
|
-
|
182
|
+
def raise_if_tag_collision(tag, field_name)
|
183
|
+
if get_field(tag, true)
|
184
|
+
fail TagCollisionError, %(Field number #{tag} has already been used in "#{name}" by field "#{field_name}".)
|
103
185
|
end
|
104
|
-
|
105
|
-
end
|
186
|
+
end
|
106
187
|
|
107
|
-
|
108
|
-
|
109
|
-
|
188
|
+
def raise_if_name_collision(field_name)
|
189
|
+
if get_field(field_name, true)
|
190
|
+
fail DuplicateFieldNameError, %(Field name #{field_name} has already been used in "#{name}".)
|
191
|
+
end
|
110
192
|
end
|
111
|
-
end
|
112
193
|
|
113
|
-
|
114
|
-
|
115
|
-
|
194
|
+
def inherit_fields!(subclass)
|
195
|
+
instance_variables.each do |iv|
|
196
|
+
subclass.instance_variable_set(iv, instance_variable_get(iv))
|
197
|
+
end
|
116
198
|
end
|
117
|
-
|
199
|
+
private :inherit_fields!
|
118
200
|
|
201
|
+
end
|
119
202
|
end
|
120
203
|
end
|
121
204
|
end
|
122
|
-
|
@@ -8,12 +8,16 @@ module Protobuf
|
|
8
8
|
|
9
9
|
module ClassMethods
|
10
10
|
def decode(bytes)
|
11
|
-
|
11
|
+
new.decode(bytes)
|
12
|
+
end
|
13
|
+
|
14
|
+
def decode_from(stream)
|
15
|
+
new.decode_from(stream)
|
12
16
|
end
|
13
17
|
|
14
18
|
# Create a new object with the given values and return the encoded bytes.
|
15
19
|
def encode(fields = {})
|
16
|
-
|
20
|
+
new(fields).encode
|
17
21
|
end
|
18
22
|
end
|
19
23
|
|
@@ -44,8 +48,10 @@ module Protobuf
|
|
44
48
|
# Encode this message
|
45
49
|
#
|
46
50
|
def encode
|
47
|
-
stream = ::StringIO.new
|
48
|
-
|
51
|
+
stream = ::StringIO.new
|
52
|
+
stream.set_encoding(::Protobuf::Field::BytesField::BYTES_ENCODING)
|
53
|
+
encode_to(stream)
|
54
|
+
stream.string
|
49
55
|
end
|
50
56
|
|
51
57
|
# Encode this message to the given stream.
|
@@ -57,22 +63,18 @@ module Protobuf
|
|
57
63
|
##
|
58
64
|
# Instance Aliases
|
59
65
|
#
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
66
|
+
alias :parse_from_string decode
|
67
|
+
alias :deserialize decode
|
68
|
+
alias :parse_from decode_from
|
69
|
+
alias :deserialize_from decode_from
|
70
|
+
alias :to_s encode
|
71
|
+
alias :bytes encode
|
72
|
+
alias :serialize encode
|
73
|
+
alias :serialize_to_string encode
|
74
|
+
alias :serialize_to encode_to
|
69
75
|
|
70
76
|
private
|
71
77
|
|
72
|
-
def field_must_be_serialized?(field)
|
73
|
-
field.required? || ! @values[field.name].nil?
|
74
|
-
end
|
75
|
-
|
76
78
|
def set_field_bytes(tag, bytes)
|
77
79
|
field = self.class.get_field(tag, true)
|
78
80
|
field.set(self, bytes) if field
|
@@ -81,4 +83,3 @@ module Protobuf
|
|
81
83
|
end
|
82
84
|
end
|
83
85
|
end
|
84
|
-
|
data/lib/protobuf/optionable.rb
CHANGED
@@ -1,17 +1,37 @@
|
|
1
|
-
require 'active_support/concern'
|
2
|
-
|
3
1
|
module Protobuf
|
4
2
|
module Optionable
|
5
|
-
extend ::ActiveSupport::Concern
|
6
|
-
|
7
3
|
module ClassMethods
|
8
4
|
def get_option(name)
|
9
|
-
|
5
|
+
name = name.to_s
|
6
|
+
option = optionable_descriptor_class.get_field(name, true)
|
7
|
+
fail ArgumentError, "invalid option=#{name}" unless option
|
8
|
+
unless option.fully_qualified_name.to_s == name
|
9
|
+
# Eventually we'll deprecate the use of simple names of fields completely, but for now make sure people
|
10
|
+
# are accessing options correctly. We allow simple names in other places for backwards compatibility.
|
11
|
+
fail ArgumentError, "must access option using its fully qualified name: #{option.fully_qualified_name.inspect}"
|
12
|
+
end
|
13
|
+
value =
|
14
|
+
if @_optionable_options.try(:key?, name)
|
15
|
+
@_optionable_options[name]
|
16
|
+
else
|
17
|
+
option.default_value
|
18
|
+
end
|
19
|
+
if option.type_class < ::Protobuf::Message
|
20
|
+
option.type_class.new(value)
|
21
|
+
else
|
22
|
+
value
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
def get_option!(name)
|
27
|
+
get_option(name) if @_optionable_options.try(:key?, name.to_s)
|
10
28
|
end
|
11
29
|
|
30
|
+
private
|
31
|
+
|
12
32
|
def set_option(name, value = true)
|
13
33
|
@_optionable_options ||= {}
|
14
|
-
@_optionable_options[name] = value
|
34
|
+
@_optionable_options[name.to_s] = value
|
15
35
|
end
|
16
36
|
end
|
17
37
|
|
@@ -19,5 +39,32 @@ module Protobuf
|
|
19
39
|
self.class.get_option(name)
|
20
40
|
end
|
21
41
|
|
42
|
+
def get_option!(name)
|
43
|
+
self.class.get_option!(name)
|
44
|
+
end
|
45
|
+
|
46
|
+
def self.inject(base_class, extend_class = true, &block)
|
47
|
+
unless block_given?
|
48
|
+
fail ArgumentError, 'missing option class block (e.g: ::Google::Protobuf::MessageOptions)'
|
49
|
+
end
|
50
|
+
if extend_class
|
51
|
+
# Check if optionable_descriptor_class is already defined and short circuit if so.
|
52
|
+
# File options are injected per module, and since a module can be defined more than once,
|
53
|
+
# we will get a warning if we try to define optionable_descriptor_class twice.
|
54
|
+
if base_class.respond_to?(:optionable_descriptor_class)
|
55
|
+
# Don't define optionable_descriptor_class twice
|
56
|
+
return if base_class.optionable_descriptor_class == block.call
|
57
|
+
|
58
|
+
fail 'A class is being defined with two different descriptor classes, something is very wrong'
|
59
|
+
end
|
60
|
+
|
61
|
+
base_class.extend(ClassMethods)
|
62
|
+
base_class.__send__(:include, self)
|
63
|
+
base_class.define_singleton_method(:optionable_descriptor_class, block)
|
64
|
+
else
|
65
|
+
base_class.__send__(:include, ClassMethods)
|
66
|
+
base_class.module_eval { define_method(:optionable_descriptor_class, block) }
|
67
|
+
end
|
68
|
+
end
|
22
69
|
end
|
23
70
|
end
|
data/lib/protobuf/rpc/buffer.rb
CHANGED
@@ -4,12 +4,12 @@ module Protobuf
|
|
4
4
|
|
5
5
|
attr_accessor :mode, :data, :size
|
6
6
|
|
7
|
-
MODES = [:read, :write]
|
7
|
+
MODES = [:read, :write].freeze
|
8
8
|
|
9
9
|
# constantize this so we don't re-initialize the regex every time we need it
|
10
10
|
SIZE_REGEX = /^\d+-/
|
11
11
|
|
12
|
-
def initialize(mode
|
12
|
+
def initialize(mode = :read)
|
13
13
|
@flush = false
|
14
14
|
@data = ""
|
15
15
|
@size = 0
|
@@ -17,18 +17,19 @@ module Protobuf
|
|
17
17
|
end
|
18
18
|
|
19
19
|
def mode=(mode)
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
20
|
+
@mode =
|
21
|
+
if MODES.include?(mode)
|
22
|
+
mode
|
23
|
+
else
|
24
|
+
:read
|
25
|
+
end
|
25
26
|
end
|
26
27
|
|
27
|
-
def write(force_mode=true)
|
28
|
-
if force_mode
|
29
|
-
mode = :write
|
30
|
-
elsif
|
31
|
-
|
28
|
+
def write(force_mode = true)
|
29
|
+
if force_mode && reading?
|
30
|
+
self.mode = :write
|
31
|
+
elsif !force_mode && reading?
|
32
|
+
fail 'You chose to write the buffer when in read mode'
|
32
33
|
end
|
33
34
|
|
34
35
|
@size = @data.length
|
@@ -43,7 +44,7 @@ module Protobuf
|
|
43
44
|
end
|
44
45
|
end
|
45
46
|
|
46
|
-
def set_data(data)
|
47
|
+
def set_data(data) # rubocop:disable Style/AccessorMethodName
|
47
48
|
@data = data.to_s
|
48
49
|
@size = @data.size
|
49
50
|
end
|
@@ -60,19 +61,17 @@ module Protobuf
|
|
60
61
|
@flush
|
61
62
|
end
|
62
63
|
|
63
|
-
def get_data_size
|
64
|
+
def get_data_size # rubocop:disable Style/AccessorMethodName
|
64
65
|
if @size == 0 || @data.match(SIZE_REGEX)
|
65
66
|
sliced_size = @data.slice!(SIZE_REGEX)
|
66
|
-
@size = sliced_size.
|
67
|
+
@size = sliced_size.delete('-').to_i unless sliced_size.nil?
|
67
68
|
end
|
68
69
|
end
|
69
70
|
|
70
|
-
|
71
|
+
private
|
71
72
|
|
72
73
|
def check_for_flush
|
73
|
-
if !@size.nil? && @data.length == @size
|
74
|
-
@flush = true
|
75
|
-
end
|
74
|
+
@flush = true if !@size.nil? && @data.length == @size
|
76
75
|
end
|
77
76
|
end
|
78
77
|
end
|