protobuffy 3.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.gitignore +21 -0
- data/.travis.yml +12 -0
- data/.yardopts +5 -0
- data/CHANGES.md +261 -0
- data/CONTRIBUTING.md +16 -0
- data/Gemfile +3 -0
- data/LICENSE.txt +14 -0
- data/README.md +58 -0
- data/Rakefile +61 -0
- data/bin/protoc-gen-ruby +17 -0
- data/bin/rpc_server +4 -0
- data/examples/bin/reverse-client-http +4 -0
- data/examples/bin/reverse-client-socket +4 -0
- data/examples/bin/reverse-client-zmq +4 -0
- data/examples/config.ru +6 -0
- data/examples/definitions/example/reverse.proto +12 -0
- data/examples/lib/example/reverse-client.rb +23 -0
- data/examples/lib/example/reverse-service.rb +9 -0
- data/examples/lib/example/reverse.pb.rb +36 -0
- data/lib/protobuf.rb +106 -0
- data/lib/protobuf/cli.rb +249 -0
- data/lib/protobuf/code_generator.rb +41 -0
- data/lib/protobuf/decoder.rb +74 -0
- data/lib/protobuf/deprecator.rb +42 -0
- data/lib/protobuf/descriptors.rb +3 -0
- data/lib/protobuf/descriptors/google/protobuf/compiler/plugin.pb.rb +52 -0
- data/lib/protobuf/descriptors/google/protobuf/descriptor.pb.rb +249 -0
- data/lib/protobuf/encoder.rb +62 -0
- data/lib/protobuf/enum.rb +319 -0
- data/lib/protobuf/exceptions.rb +9 -0
- data/lib/protobuf/field.rb +74 -0
- data/lib/protobuf/field/base_field.rb +280 -0
- data/lib/protobuf/field/bool_field.rb +53 -0
- data/lib/protobuf/field/bytes_field.rb +81 -0
- data/lib/protobuf/field/double_field.rb +26 -0
- data/lib/protobuf/field/enum_field.rb +57 -0
- data/lib/protobuf/field/field_array.rb +86 -0
- data/lib/protobuf/field/fixed32_field.rb +25 -0
- data/lib/protobuf/field/fixed64_field.rb +29 -0
- data/lib/protobuf/field/float_field.rb +38 -0
- data/lib/protobuf/field/int32_field.rb +22 -0
- data/lib/protobuf/field/int64_field.rb +22 -0
- data/lib/protobuf/field/integer_field.rb +24 -0
- data/lib/protobuf/field/message_field.rb +66 -0
- data/lib/protobuf/field/sfixed32_field.rb +28 -0
- data/lib/protobuf/field/sfixed64_field.rb +29 -0
- data/lib/protobuf/field/signed_integer_field.rb +30 -0
- data/lib/protobuf/field/sint32_field.rb +22 -0
- data/lib/protobuf/field/sint64_field.rb +22 -0
- data/lib/protobuf/field/string_field.rb +35 -0
- data/lib/protobuf/field/uint32_field.rb +22 -0
- data/lib/protobuf/field/uint64_field.rb +22 -0
- data/lib/protobuf/field/varint_field.rb +68 -0
- data/lib/protobuf/generators/base.rb +71 -0
- data/lib/protobuf/generators/enum_generator.rb +42 -0
- data/lib/protobuf/generators/extension_generator.rb +28 -0
- data/lib/protobuf/generators/field_generator.rb +132 -0
- data/lib/protobuf/generators/file_generator.rb +140 -0
- data/lib/protobuf/generators/group_generator.rb +113 -0
- data/lib/protobuf/generators/message_generator.rb +99 -0
- data/lib/protobuf/generators/printable.rb +161 -0
- data/lib/protobuf/generators/service_generator.rb +27 -0
- data/lib/protobuf/http.rb +20 -0
- data/lib/protobuf/lifecycle.rb +46 -0
- data/lib/protobuf/logger.rb +86 -0
- data/lib/protobuf/message.rb +182 -0
- data/lib/protobuf/message/fields.rb +122 -0
- data/lib/protobuf/message/serialization.rb +84 -0
- data/lib/protobuf/optionable.rb +23 -0
- data/lib/protobuf/rpc/buffer.rb +79 -0
- data/lib/protobuf/rpc/client.rb +168 -0
- data/lib/protobuf/rpc/connector.rb +21 -0
- data/lib/protobuf/rpc/connectors/base.rb +54 -0
- data/lib/protobuf/rpc/connectors/common.rb +172 -0
- data/lib/protobuf/rpc/connectors/http.rb +90 -0
- data/lib/protobuf/rpc/connectors/socket.rb +73 -0
- data/lib/protobuf/rpc/connectors/zmq.rb +205 -0
- data/lib/protobuf/rpc/dynamic_discovery.pb.rb +47 -0
- data/lib/protobuf/rpc/env.rb +58 -0
- data/lib/protobuf/rpc/error.rb +28 -0
- data/lib/protobuf/rpc/error/client_error.rb +31 -0
- data/lib/protobuf/rpc/error/server_error.rb +43 -0
- data/lib/protobuf/rpc/middleware.rb +25 -0
- data/lib/protobuf/rpc/middleware/exception_handler.rb +36 -0
- data/lib/protobuf/rpc/middleware/logger.rb +91 -0
- data/lib/protobuf/rpc/middleware/request_decoder.rb +83 -0
- data/lib/protobuf/rpc/middleware/response_encoder.rb +88 -0
- data/lib/protobuf/rpc/middleware/runner.rb +18 -0
- data/lib/protobuf/rpc/rpc.pb.rb +53 -0
- data/lib/protobuf/rpc/server.rb +39 -0
- data/lib/protobuf/rpc/servers/http/server.rb +101 -0
- data/lib/protobuf/rpc/servers/http_runner.rb +34 -0
- data/lib/protobuf/rpc/servers/socket/server.rb +113 -0
- data/lib/protobuf/rpc/servers/socket/worker.rb +56 -0
- data/lib/protobuf/rpc/servers/socket_runner.rb +34 -0
- data/lib/protobuf/rpc/servers/zmq/broker.rb +155 -0
- data/lib/protobuf/rpc/servers/zmq/server.rb +313 -0
- data/lib/protobuf/rpc/servers/zmq/util.rb +47 -0
- data/lib/protobuf/rpc/servers/zmq/worker.rb +105 -0
- data/lib/protobuf/rpc/servers/zmq_runner.rb +51 -0
- data/lib/protobuf/rpc/service.rb +179 -0
- data/lib/protobuf/rpc/service_directory.rb +245 -0
- data/lib/protobuf/rpc/service_dispatcher.rb +46 -0
- data/lib/protobuf/rpc/service_filters.rb +273 -0
- data/lib/protobuf/rpc/stat.rb +148 -0
- data/lib/protobuf/socket.rb +22 -0
- data/lib/protobuf/tasks.rb +1 -0
- data/lib/protobuf/tasks/compile.rake +61 -0
- data/lib/protobuf/version.rb +3 -0
- data/lib/protobuf/wire_type.rb +10 -0
- data/lib/protobuf/zmq.rb +21 -0
- data/proto/dynamic_discovery.proto +44 -0
- data/proto/google/protobuf/compiler/plugin.proto +147 -0
- data/proto/google/protobuf/descriptor.proto +620 -0
- data/proto/rpc.proto +62 -0
- data/protobuffy.gemspec +37 -0
- data/spec/benchmark/tasks.rb +113 -0
- data/spec/bin/protoc-gen-ruby_spec.rb +18 -0
- data/spec/data/data.bin +3 -0
- data/spec/data/types.bin +0 -0
- data/spec/encoding/all_types_spec.rb +91 -0
- data/spec/encoding/extreme_values_spec.rb +0 -0
- data/spec/functional/socket_server_spec.rb +59 -0
- data/spec/functional/zmq_server_spec.rb +103 -0
- data/spec/lib/protobuf/cli_spec.rb +267 -0
- data/spec/lib/protobuf/code_generator_spec.rb +60 -0
- data/spec/lib/protobuf/enum_spec.rb +239 -0
- data/spec/lib/protobuf/field/int32_field_spec.rb +7 -0
- data/spec/lib/protobuf/field/string_field_spec.rb +46 -0
- data/spec/lib/protobuf/field_spec.rb +194 -0
- data/spec/lib/protobuf/generators/base_spec.rb +87 -0
- data/spec/lib/protobuf/generators/enum_generator_spec.rb +68 -0
- data/spec/lib/protobuf/generators/extension_generator_spec.rb +43 -0
- data/spec/lib/protobuf/generators/field_generator_spec.rb +99 -0
- data/spec/lib/protobuf/generators/file_generator_spec.rb +29 -0
- data/spec/lib/protobuf/generators/message_generator_spec.rb +0 -0
- data/spec/lib/protobuf/generators/service_generator_spec.rb +43 -0
- data/spec/lib/protobuf/lifecycle_spec.rb +89 -0
- data/spec/lib/protobuf/logger_spec.rb +136 -0
- data/spec/lib/protobuf/message_spec.rb +368 -0
- data/spec/lib/protobuf/optionable_spec.rb +46 -0
- data/spec/lib/protobuf/rpc/client_spec.rb +66 -0
- data/spec/lib/protobuf/rpc/connector_spec.rb +26 -0
- data/spec/lib/protobuf/rpc/connectors/base_spec.rb +50 -0
- data/spec/lib/protobuf/rpc/connectors/common_spec.rb +170 -0
- data/spec/lib/protobuf/rpc/connectors/connector_spec.rb +13 -0
- data/spec/lib/protobuf/rpc/connectors/http_spec.rb +61 -0
- data/spec/lib/protobuf/rpc/connectors/socket_spec.rb +24 -0
- data/spec/lib/protobuf/rpc/connectors/zmq_spec.rb +129 -0
- data/spec/lib/protobuf/rpc/middleware/exception_handler_spec.rb +62 -0
- data/spec/lib/protobuf/rpc/middleware/logger_spec.rb +49 -0
- data/spec/lib/protobuf/rpc/middleware/request_decoder_spec.rb +115 -0
- data/spec/lib/protobuf/rpc/middleware/response_encoder_spec.rb +75 -0
- data/spec/lib/protobuf/rpc/servers/http/server_spec.rb +104 -0
- data/spec/lib/protobuf/rpc/servers/socket_server_spec.rb +38 -0
- data/spec/lib/protobuf/rpc/servers/zmq/server_spec.rb +41 -0
- data/spec/lib/protobuf/rpc/servers/zmq/util_spec.rb +55 -0
- data/spec/lib/protobuf/rpc/servers/zmq/worker_spec.rb +35 -0
- data/spec/lib/protobuf/rpc/service_directory_spec.rb +295 -0
- data/spec/lib/protobuf/rpc/service_dispatcher_spec.rb +52 -0
- data/spec/lib/protobuf/rpc/service_filters_spec.rb +484 -0
- data/spec/lib/protobuf/rpc/service_spec.rb +161 -0
- data/spec/lib/protobuf/rpc/stat_spec.rb +151 -0
- data/spec/lib/protobuf_spec.rb +78 -0
- data/spec/spec_helper.rb +57 -0
- data/spec/support/all.rb +7 -0
- data/spec/support/packed_field.rb +22 -0
- data/spec/support/server.rb +94 -0
- data/spec/support/test/all_types.data.bin +0 -0
- data/spec/support/test/all_types.data.txt +119 -0
- data/spec/support/test/defaults.pb.rb +25 -0
- data/spec/support/test/defaults.proto +9 -0
- data/spec/support/test/enum.pb.rb +59 -0
- data/spec/support/test/enum.proto +34 -0
- data/spec/support/test/extended.pb.rb +22 -0
- data/spec/support/test/extended.proto +10 -0
- data/spec/support/test/extreme_values.data.bin +0 -0
- data/spec/support/test/google_unittest.pb.rb +543 -0
- data/spec/support/test/google_unittest.proto +713 -0
- data/spec/support/test/google_unittest_import.pb.rb +37 -0
- data/spec/support/test/google_unittest_import.proto +64 -0
- data/spec/support/test/google_unittest_import_public.pb.rb +8 -0
- data/spec/support/test/google_unittest_import_public.proto +38 -0
- data/spec/support/test/multi_field_extensions.pb.rb +56 -0
- data/spec/support/test/multi_field_extensions.proto +33 -0
- data/spec/support/test/resource.pb.rb +117 -0
- data/spec/support/test/resource.proto +94 -0
- data/spec/support/test/resource_service.rb +26 -0
- data/spec/support/test_app_file.rb +2 -0
- data/spec/support/tolerance_matcher.rb +40 -0
- metadata +367 -0
@@ -0,0 +1,62 @@
|
|
1
|
+
module Protobuf
|
2
|
+
class Encoder
|
3
|
+
|
4
|
+
def self.encode(stream, message)
|
5
|
+
new(stream, message).encode
|
6
|
+
end
|
7
|
+
|
8
|
+
attr_reader :message, :stream
|
9
|
+
|
10
|
+
def initialize(message, stream)
|
11
|
+
unless message.respond_to?(:each_field_for_serialization)
|
12
|
+
raise ArgumentError, "Message instance must respond to :each_field_for_serialization"
|
13
|
+
end
|
14
|
+
|
15
|
+
@message = message
|
16
|
+
@stream = stream
|
17
|
+
end
|
18
|
+
|
19
|
+
def encode
|
20
|
+
message.each_field_for_serialization do |field, value|
|
21
|
+
encode_field(field, value)
|
22
|
+
end
|
23
|
+
|
24
|
+
stream
|
25
|
+
end
|
26
|
+
|
27
|
+
private
|
28
|
+
|
29
|
+
def encode_field(field, value)
|
30
|
+
if field.repeated?
|
31
|
+
encode_repeated_field(field, value)
|
32
|
+
else
|
33
|
+
write_pair(field, value)
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
def encode_packed_field(field, value)
|
38
|
+
key = (field.tag << 3) | ::Protobuf::WireType::LENGTH_DELIMITED
|
39
|
+
packed_value = value.map { |val| field.encode(val) }.join
|
40
|
+
stream << ::Protobuf::Field::VarintField.encode(key)
|
41
|
+
stream << ::Protobuf::Field::VarintField.encode(packed_value.size)
|
42
|
+
stream << packed_value
|
43
|
+
end
|
44
|
+
|
45
|
+
def encode_repeated_field(field, value)
|
46
|
+
if field.packed?
|
47
|
+
encode_packed_field(field, value)
|
48
|
+
else
|
49
|
+
value.each { |val| write_pair(field, val) }
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
# Encode key and value, and write to +stream+.
|
54
|
+
def write_pair(field, value)
|
55
|
+
key = (field.tag << 3) | field.wire_type
|
56
|
+
stream << ::Protobuf::Field::VarintField.encode(key)
|
57
|
+
stream << field.encode(value)
|
58
|
+
end
|
59
|
+
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
@@ -0,0 +1,319 @@
|
|
1
|
+
require 'delegate'
|
2
|
+
require 'protobuf/optionable'
|
3
|
+
require 'protobuf/deprecator'
|
4
|
+
|
5
|
+
##
|
6
|
+
# Adding extension to Numeric until
|
7
|
+
# we can get people to stop calling #value
|
8
|
+
# on Enum instances.
|
9
|
+
#
|
10
|
+
class Numeric
|
11
|
+
unless method_defined?(:value)
|
12
|
+
def value
|
13
|
+
$stderr.puts <<-DEPRECATION
|
14
|
+
[DEPRECATED] Enum#value is deprecated and will be removed in the next release.
|
15
|
+
Use Enum#to_i instead.
|
16
|
+
DEPRECATION
|
17
|
+
self
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
module Protobuf
|
23
|
+
class Enum < SimpleDelegator
|
24
|
+
|
25
|
+
##
|
26
|
+
# Deprecations
|
27
|
+
#
|
28
|
+
|
29
|
+
extend ::Protobuf::Deprecator
|
30
|
+
|
31
|
+
# Public: Allows setting Options on the Enum class.
|
32
|
+
include ::Protobuf::Optionable
|
33
|
+
|
34
|
+
def self.aliases_allowed?
|
35
|
+
self.get_option(:allow_alias)
|
36
|
+
end
|
37
|
+
|
38
|
+
# Public: Get all integer tags defined by this enum.
|
39
|
+
#
|
40
|
+
# Examples
|
41
|
+
#
|
42
|
+
# class StateMachine < ::Protobuf::Enum
|
43
|
+
# set_option :allow_alias
|
44
|
+
# define :ON, 1
|
45
|
+
# define :STARTED, 1
|
46
|
+
# define :OFF, 2
|
47
|
+
# end
|
48
|
+
#
|
49
|
+
# StateMachine.all_tags #=> [ 1, 2 ]
|
50
|
+
#
|
51
|
+
# Returns an array of unique integers.
|
52
|
+
#
|
53
|
+
def self.all_tags
|
54
|
+
@all_tags ||= self.enums.map(&:to_i).uniq
|
55
|
+
end
|
56
|
+
|
57
|
+
# Internal: DSL method to create a new Enum. The given name will
|
58
|
+
# become a constant for this Enum pointing to the new instance.
|
59
|
+
#
|
60
|
+
# Examples
|
61
|
+
#
|
62
|
+
# class StateMachine < ::Protobuf::Enum
|
63
|
+
# define :ON, 1
|
64
|
+
# define :OFF, 2
|
65
|
+
# end
|
66
|
+
#
|
67
|
+
# StateMachine::ON #=> #<StateMachine::ON=1>
|
68
|
+
# StateMachine::OFF #=> #<StateMachine::OFF=2>
|
69
|
+
#
|
70
|
+
# Returns nothing.
|
71
|
+
#
|
72
|
+
def self.define(name, tag)
|
73
|
+
enum = self.new(self, name, tag)
|
74
|
+
@enums ||= []
|
75
|
+
@enums << enum
|
76
|
+
const_set(name, enum)
|
77
|
+
end
|
78
|
+
|
79
|
+
# Public: All defined enums.
|
80
|
+
#
|
81
|
+
def self.enums
|
82
|
+
@enums
|
83
|
+
end
|
84
|
+
|
85
|
+
# Public: Get an array of Enum objects with the given tag.
|
86
|
+
#
|
87
|
+
# tag - An object that responds to to_i.
|
88
|
+
#
|
89
|
+
# Examples
|
90
|
+
#
|
91
|
+
# class StateMachine < ::Protobuf::Enum
|
92
|
+
# set_option :allow_alias
|
93
|
+
# define :ON, 1
|
94
|
+
# define :STARTED, 1
|
95
|
+
# define :OFF, 2
|
96
|
+
# end
|
97
|
+
#
|
98
|
+
# StateMachine.enums_for_tag(1) #=> [ #<StateMachine::ON=1>, #<StateMachine::STARTED=1> ]
|
99
|
+
# StateMachine.enums_for_tag(2) #=> [ #<StateMachine::OFF=2> ]
|
100
|
+
#
|
101
|
+
# Returns an array with zero or more Enum objects or nil.
|
102
|
+
#
|
103
|
+
def self.enums_for_tag(tag)
|
104
|
+
self.enums.select { |enum|
|
105
|
+
enum.to_i == tag.to_i
|
106
|
+
}
|
107
|
+
end
|
108
|
+
|
109
|
+
# Public: Get the Enum associated with the given name.
|
110
|
+
#
|
111
|
+
# name - A string-like object. Case-sensitive.
|
112
|
+
#
|
113
|
+
# Example
|
114
|
+
#
|
115
|
+
# class StateMachine < ::Protobuf::Enum
|
116
|
+
# define :ON, 1
|
117
|
+
# define :OFF, 2
|
118
|
+
# end
|
119
|
+
#
|
120
|
+
# StateMachine.enum_for_name(:ON) # => #<StateMachine::ON=1>
|
121
|
+
# StateMachine.enum_for_name("ON") # => #<StateMachine::ON=1>
|
122
|
+
# StateMachine.enum_for_name(:on) # => nil
|
123
|
+
# StateMachine.enum_for_name(:FOO) # => nil
|
124
|
+
#
|
125
|
+
# Returns the Enum object with the given name or nil.
|
126
|
+
#
|
127
|
+
def self.enum_for_name(name)
|
128
|
+
self.const_get(name)
|
129
|
+
rescue ::NameError
|
130
|
+
nil
|
131
|
+
end
|
132
|
+
|
133
|
+
# Public: Get the Enum object corresponding to the given tag.
|
134
|
+
#
|
135
|
+
# tag - An object that responds to to_i.
|
136
|
+
#
|
137
|
+
# Returns an Enum object or nil. If the tag corresponds to multiple
|
138
|
+
# Enums, the first enum defined will be returned.
|
139
|
+
#
|
140
|
+
def self.enum_for_tag(tag)
|
141
|
+
self.enums_for_tag(tag).first
|
142
|
+
end
|
143
|
+
|
144
|
+
# Public: Get an Enum by a variety of type-checking mechanisms.
|
145
|
+
#
|
146
|
+
# candidate - An Enum, Numeric, String, or Symbol object.
|
147
|
+
#
|
148
|
+
# Example
|
149
|
+
#
|
150
|
+
# class StateMachine < ::Protobuf::Enum
|
151
|
+
# set_option :allow_alias
|
152
|
+
# define :ON, 1
|
153
|
+
# define :STARTED, 1
|
154
|
+
# define :OFF, 2
|
155
|
+
# end
|
156
|
+
#
|
157
|
+
# StateMachine.fetch(StateMachine::ON) # => #<StateMachine::ON=1>
|
158
|
+
# StateMachine.fetch(:ON) # => #<StateMachine::ON=1>
|
159
|
+
# StateMachine.fetch("STARTED") # => #<StateMachine::STARTED=1>
|
160
|
+
# StateMachine.fetch(1) # => [ #<StateMachine::ON=1>, #<StateMachine::STARTED=1> ]
|
161
|
+
#
|
162
|
+
# Returns an Enum object or nil.
|
163
|
+
#
|
164
|
+
def self.fetch(candidate)
|
165
|
+
case candidate
|
166
|
+
when self then
|
167
|
+
candidate
|
168
|
+
when ::Numeric then
|
169
|
+
enum_for_tag(candidate.to_i)
|
170
|
+
when ::String, ::Symbol then
|
171
|
+
enum_for_name(candidate)
|
172
|
+
else
|
173
|
+
nil
|
174
|
+
end
|
175
|
+
end
|
176
|
+
|
177
|
+
# Public: Get the Symbol name associated with the given number.
|
178
|
+
#
|
179
|
+
# number - An object that responds to to_i.
|
180
|
+
#
|
181
|
+
# Examples
|
182
|
+
#
|
183
|
+
# # Without aliases
|
184
|
+
# class StateMachine < ::Protobuf::Enum
|
185
|
+
# define :ON, 1
|
186
|
+
# define :OFF, 2
|
187
|
+
# end
|
188
|
+
#
|
189
|
+
# StateMachine.name_for_tag(1) # => :ON
|
190
|
+
# StateMachine.name_for_tag(2) # => :OFF
|
191
|
+
# StateMachine.name_for_tag(3) # => nil
|
192
|
+
#
|
193
|
+
# # With aliases
|
194
|
+
# class StateMachine < ::Protobuf::Enum
|
195
|
+
# set_option :allow_alias
|
196
|
+
# define :STARTED, 1
|
197
|
+
# define :ON, 1
|
198
|
+
# define :OFF, 2
|
199
|
+
# end
|
200
|
+
#
|
201
|
+
# StateMachine.name_for_tag(1) # => :STARTED
|
202
|
+
# StateMachine.name_for_tag(2) # => :OFF
|
203
|
+
#
|
204
|
+
# Returns the symbol name of the enum constant given it's associated tag or nil.
|
205
|
+
# If the given tag has multiple names associated (due to allow_alias)
|
206
|
+
# the first defined name will be returned.
|
207
|
+
#
|
208
|
+
def self.name_for_tag(tag)
|
209
|
+
self.enum_for_tag(tag).try(:name)
|
210
|
+
end
|
211
|
+
|
212
|
+
# Public: Check if the given tag is defined by this Enum.
|
213
|
+
#
|
214
|
+
# number - An object that responds to to_i.
|
215
|
+
#
|
216
|
+
# Returns a boolean.
|
217
|
+
#
|
218
|
+
def self.valid_tag?(tag)
|
219
|
+
tag.respond_to?(:to_i) && self.all_tags.include?(tag.to_i)
|
220
|
+
end
|
221
|
+
|
222
|
+
# Public: [DEPRECATED] Return a hash of Enum objects keyed
|
223
|
+
# by their :name.
|
224
|
+
#
|
225
|
+
def self.values
|
226
|
+
self.warn_deprecated(:values, :enums)
|
227
|
+
|
228
|
+
@values ||= begin
|
229
|
+
self.enums.inject({}) do |hash, enum|
|
230
|
+
hash[enum.name] = enum
|
231
|
+
hash
|
232
|
+
end
|
233
|
+
end
|
234
|
+
end
|
235
|
+
|
236
|
+
##
|
237
|
+
# Class Deprecations
|
238
|
+
#
|
239
|
+
|
240
|
+
deprecate_class_method :enum_by_value, :enum_for_tag
|
241
|
+
deprecate_class_method :name_by_value, :name_for_tag
|
242
|
+
deprecate_class_method :get_name_by_tag, :name_for_tag
|
243
|
+
deprecate_class_method :value_by_name, :enum_for_name
|
244
|
+
|
245
|
+
|
246
|
+
##
|
247
|
+
# Attributes
|
248
|
+
#
|
249
|
+
|
250
|
+
attr_reader :parent_class, :name, :tag
|
251
|
+
|
252
|
+
##
|
253
|
+
# Instance Methods
|
254
|
+
#
|
255
|
+
|
256
|
+
def initialize(parent_class, name, tag)
|
257
|
+
@parent_class = parent_class
|
258
|
+
@name = name
|
259
|
+
@tag = tag
|
260
|
+
super(@tag)
|
261
|
+
end
|
262
|
+
|
263
|
+
# Overriding the class so ActiveRecord/Arel visitor will visit the enum as a Fixnum
|
264
|
+
#
|
265
|
+
def class
|
266
|
+
Fixnum
|
267
|
+
end
|
268
|
+
|
269
|
+
def inspect
|
270
|
+
"\#<Protobuf::Enum(#{parent_class})::#{name}=#{tag}>"
|
271
|
+
end
|
272
|
+
|
273
|
+
def to_i
|
274
|
+
tag
|
275
|
+
end
|
276
|
+
|
277
|
+
def to_int
|
278
|
+
tag.to_int
|
279
|
+
end
|
280
|
+
|
281
|
+
def to_s(format = :tag)
|
282
|
+
case format
|
283
|
+
when :tag then
|
284
|
+
self.to_i.to_s
|
285
|
+
when :name then
|
286
|
+
name.to_s
|
287
|
+
else
|
288
|
+
self.to_i.to_s
|
289
|
+
end
|
290
|
+
end
|
291
|
+
|
292
|
+
# Re-implement `try` in order to fix the problem where
|
293
|
+
# the underlying fixnum doesn't respond to all methods (e.g. name or tag).
|
294
|
+
# If we respond to the first argument, `__send__` the args. Otherwise,
|
295
|
+
# delegate the `try` call to the underlying vlaue fixnum.
|
296
|
+
#
|
297
|
+
def try(*args, &block)
|
298
|
+
case
|
299
|
+
when args.empty? && block_given?
|
300
|
+
yield self
|
301
|
+
when respond_to?(args.first)
|
302
|
+
__send__(*args, &block)
|
303
|
+
else
|
304
|
+
@tag.try(*args, &block)
|
305
|
+
end
|
306
|
+
end
|
307
|
+
|
308
|
+
def value
|
309
|
+
parent_class.warn_deprecated(:value, :to_i)
|
310
|
+
to_i
|
311
|
+
end
|
312
|
+
|
313
|
+
##
|
314
|
+
# Instance Aliases
|
315
|
+
#
|
316
|
+
alias_method :to_hash_value, :to_i
|
317
|
+
end
|
318
|
+
end
|
319
|
+
|
@@ -0,0 +1,9 @@
|
|
1
|
+
module Protobuf
|
2
|
+
class Error < StandardError; end
|
3
|
+
class InvalidWireType < Error; end
|
4
|
+
class NotInitializedError < Error; end
|
5
|
+
class TagCollisionError < Error; end
|
6
|
+
class SerializationError < Error; end
|
7
|
+
class FieldNotDefinedError < Error; end
|
8
|
+
class DuplicateFieldNameError < Error; end
|
9
|
+
end
|
@@ -0,0 +1,74 @@
|
|
1
|
+
require 'protobuf/field/base_field'
|
2
|
+
require 'protobuf/field/bytes_field'
|
3
|
+
require 'protobuf/field/float_field'
|
4
|
+
require 'protobuf/field/message_field'
|
5
|
+
require 'protobuf/field/varint_field'
|
6
|
+
require 'protobuf/field/string_field'
|
7
|
+
require 'protobuf/field/double_field'
|
8
|
+
require 'protobuf/field/enum_field'
|
9
|
+
require 'protobuf/field/integer_field'
|
10
|
+
require 'protobuf/field/signed_integer_field'
|
11
|
+
require 'protobuf/field/uint32_field'
|
12
|
+
require 'protobuf/field/uint64_field'
|
13
|
+
require 'protobuf/field/int32_field'
|
14
|
+
require 'protobuf/field/int64_field'
|
15
|
+
require 'protobuf/field/sint32_field'
|
16
|
+
require 'protobuf/field/sint64_field'
|
17
|
+
require 'protobuf/field/bool_field'
|
18
|
+
require 'protobuf/field/sfixed32_field'
|
19
|
+
require 'protobuf/field/sfixed64_field'
|
20
|
+
require 'protobuf/field/fixed32_field'
|
21
|
+
require 'protobuf/field/fixed64_field'
|
22
|
+
|
23
|
+
module Protobuf
|
24
|
+
module Field
|
25
|
+
|
26
|
+
PRIMITIVE_FIELD_MAP = {
|
27
|
+
:double => ::Protobuf::Field::DoubleField,
|
28
|
+
:float => ::Protobuf::Field::FloatField,
|
29
|
+
:int32 => ::Protobuf::Field::Int32Field,
|
30
|
+
:int64 => ::Protobuf::Field::Int64Field,
|
31
|
+
:uint32 => ::Protobuf::Field::Uint32Field,
|
32
|
+
:uint64 => ::Protobuf::Field::Uint64Field,
|
33
|
+
:sint32 => ::Protobuf::Field::Sint32Field,
|
34
|
+
:sint64 => ::Protobuf::Field::Sint64Field,
|
35
|
+
:fixed32 => ::Protobuf::Field::Fixed32Field,
|
36
|
+
:fixed64 => ::Protobuf::Field::Fixed64Field,
|
37
|
+
:sfixed32 => ::Protobuf::Field::Sfixed32Field,
|
38
|
+
:sfixed64 => ::Protobuf::Field::Sfixed64Field,
|
39
|
+
:string => ::Protobuf::Field::StringField,
|
40
|
+
:bytes => ::Protobuf::Field::BytesField,
|
41
|
+
:bool => ::Protobuf::Field::BoolField
|
42
|
+
}.freeze
|
43
|
+
|
44
|
+
def self.build(message_class, rule, type, name, tag, options = {})
|
45
|
+
field_class(type).new(message_class, rule, field_type(type), name, tag, options)
|
46
|
+
end
|
47
|
+
|
48
|
+
# Returns the field class for primitives,
|
49
|
+
# EnumField for types that inherit from Protobuf::Enum,
|
50
|
+
# and MessageField for types that inherit from Protobuf::Message.
|
51
|
+
#
|
52
|
+
def self.field_class(type)
|
53
|
+
if PRIMITIVE_FIELD_MAP.key?(type)
|
54
|
+
PRIMITIVE_FIELD_MAP[type]
|
55
|
+
elsif type < ::Protobuf::Enum
|
56
|
+
EnumField
|
57
|
+
elsif type < ::Protobuf::Message
|
58
|
+
MessageField
|
59
|
+
elsif type < ::Protobuf::Field::BaseField
|
60
|
+
type
|
61
|
+
else
|
62
|
+
raise ArgumentError, "Invalid field type #{type}"
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
# Returns the mapped type for primitives,
|
67
|
+
# otherwise the given type is returned.
|
68
|
+
#
|
69
|
+
def self.field_type(type)
|
70
|
+
PRIMITIVE_FIELD_MAP.fetch(type) { type }
|
71
|
+
end
|
72
|
+
|
73
|
+
end
|
74
|
+
end
|