protobuf-cucumber 3.10.4
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/.rubocop.yml +70 -0
- data/.rubocop_todo.yml +145 -0
- data/.travis.yml +40 -0
- data/.yardopts +5 -0
- data/CHANGES.md +344 -0
- data/CONTRIBUTING.md +16 -0
- data/Gemfile +3 -0
- data/LICENSE.txt +22 -0
- data/README.md +33 -0
- data/Rakefile +64 -0
- data/bin/protoc-gen-ruby +22 -0
- data/bin/rpc_server +5 -0
- data/install-protobuf.sh +28 -0
- data/lib/protobuf.rb +129 -0
- data/lib/protobuf/cli.rb +257 -0
- data/lib/protobuf/code_generator.rb +120 -0
- data/lib/protobuf/decoder.rb +28 -0
- data/lib/protobuf/deprecation.rb +117 -0
- data/lib/protobuf/descriptors.rb +3 -0
- data/lib/protobuf/descriptors/google/protobuf/compiler/plugin.pb.rb +62 -0
- data/lib/protobuf/descriptors/google/protobuf/descriptor.pb.rb +301 -0
- data/lib/protobuf/encoder.rb +11 -0
- data/lib/protobuf/enum.rb +365 -0
- data/lib/protobuf/exceptions.rb +9 -0
- data/lib/protobuf/field.rb +74 -0
- data/lib/protobuf/field/base_field.rb +380 -0
- data/lib/protobuf/field/base_field_object_definitions.rb +504 -0
- data/lib/protobuf/field/bool_field.rb +64 -0
- data/lib/protobuf/field/bytes_field.rb +78 -0
- data/lib/protobuf/field/double_field.rb +25 -0
- data/lib/protobuf/field/enum_field.rb +61 -0
- data/lib/protobuf/field/field_array.rb +104 -0
- data/lib/protobuf/field/field_hash.rb +122 -0
- data/lib/protobuf/field/fixed32_field.rb +25 -0
- data/lib/protobuf/field/fixed64_field.rb +28 -0
- data/lib/protobuf/field/float_field.rb +43 -0
- data/lib/protobuf/field/int32_field.rb +21 -0
- data/lib/protobuf/field/int64_field.rb +34 -0
- data/lib/protobuf/field/integer_field.rb +23 -0
- data/lib/protobuf/field/message_field.rb +51 -0
- data/lib/protobuf/field/sfixed32_field.rb +27 -0
- data/lib/protobuf/field/sfixed64_field.rb +28 -0
- data/lib/protobuf/field/signed_integer_field.rb +29 -0
- data/lib/protobuf/field/sint32_field.rb +21 -0
- data/lib/protobuf/field/sint64_field.rb +21 -0
- data/lib/protobuf/field/string_field.rb +51 -0
- data/lib/protobuf/field/uint32_field.rb +21 -0
- data/lib/protobuf/field/uint64_field.rb +21 -0
- data/lib/protobuf/field/varint_field.rb +77 -0
- data/lib/protobuf/generators/base.rb +85 -0
- data/lib/protobuf/generators/enum_generator.rb +39 -0
- data/lib/protobuf/generators/extension_generator.rb +27 -0
- data/lib/protobuf/generators/field_generator.rb +193 -0
- data/lib/protobuf/generators/file_generator.rb +262 -0
- data/lib/protobuf/generators/group_generator.rb +122 -0
- data/lib/protobuf/generators/message_generator.rb +104 -0
- data/lib/protobuf/generators/option_generator.rb +17 -0
- data/lib/protobuf/generators/printable.rb +160 -0
- data/lib/protobuf/generators/service_generator.rb +50 -0
- data/lib/protobuf/lifecycle.rb +33 -0
- data/lib/protobuf/logging.rb +39 -0
- data/lib/protobuf/message.rb +260 -0
- data/lib/protobuf/message/fields.rb +233 -0
- data/lib/protobuf/message/serialization.rb +85 -0
- data/lib/protobuf/optionable.rb +70 -0
- data/lib/protobuf/rpc/buffer.rb +78 -0
- data/lib/protobuf/rpc/client.rb +140 -0
- data/lib/protobuf/rpc/connectors/base.rb +221 -0
- data/lib/protobuf/rpc/connectors/ping.rb +89 -0
- data/lib/protobuf/rpc/connectors/socket.rb +78 -0
- data/lib/protobuf/rpc/connectors/zmq.rb +319 -0
- data/lib/protobuf/rpc/dynamic_discovery.pb.rb +50 -0
- data/lib/protobuf/rpc/env.rb +60 -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 +40 -0
- data/lib/protobuf/rpc/middleware/logger.rb +95 -0
- data/lib/protobuf/rpc/middleware/request_decoder.rb +79 -0
- data/lib/protobuf/rpc/middleware/response_encoder.rb +83 -0
- data/lib/protobuf/rpc/middleware/runner.rb +18 -0
- data/lib/protobuf/rpc/rpc.pb.rb +64 -0
- data/lib/protobuf/rpc/rpc_method.rb +16 -0
- data/lib/protobuf/rpc/server.rb +39 -0
- data/lib/protobuf/rpc/servers/socket/server.rb +121 -0
- data/lib/protobuf/rpc/servers/socket/worker.rb +56 -0
- data/lib/protobuf/rpc/servers/socket_runner.rb +46 -0
- data/lib/protobuf/rpc/servers/zmq/broker.rb +194 -0
- data/lib/protobuf/rpc/servers/zmq/server.rb +321 -0
- data/lib/protobuf/rpc/servers/zmq/util.rb +48 -0
- data/lib/protobuf/rpc/servers/zmq/worker.rb +105 -0
- data/lib/protobuf/rpc/servers/zmq_runner.rb +70 -0
- data/lib/protobuf/rpc/service.rb +172 -0
- data/lib/protobuf/rpc/service_directory.rb +261 -0
- data/lib/protobuf/rpc/service_dispatcher.rb +45 -0
- data/lib/protobuf/rpc/service_filters.rb +250 -0
- data/lib/protobuf/rpc/stat.rb +119 -0
- data/lib/protobuf/socket.rb +21 -0
- data/lib/protobuf/tasks.rb +1 -0
- data/lib/protobuf/tasks/compile.rake +80 -0
- data/lib/protobuf/varint.rb +20 -0
- data/lib/protobuf/varint_pure.rb +31 -0
- data/lib/protobuf/version.rb +3 -0
- data/lib/protobuf/wire_type.rb +10 -0
- data/lib/protobuf/zmq.rb +21 -0
- data/profile.html +5103 -0
- data/proto/dynamic_discovery.proto +44 -0
- data/proto/google/protobuf/compiler/plugin.proto +147 -0
- data/proto/google/protobuf/descriptor.proto +779 -0
- data/proto/rpc.proto +69 -0
- data/protobuf-cucumber.gemspec +57 -0
- data/spec/benchmark/tasks.rb +143 -0
- data/spec/bin/protoc-gen-ruby_spec.rb +23 -0
- data/spec/encoding/all_types_spec.rb +103 -0
- 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 +58 -0
- data/spec/functional/socket_server_spec.rb +59 -0
- data/spec/functional/zmq_server_spec.rb +105 -0
- data/spec/lib/protobuf/cli_spec.rb +317 -0
- data/spec/lib/protobuf/code_generator_spec.rb +87 -0
- data/spec/lib/protobuf/enum_spec.rb +307 -0
- 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 +44 -0
- data/spec/lib/protobuf/field/field_array_spec.rb +105 -0
- data/spec/lib/protobuf/field/field_hash_spec.rb +168 -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 +120 -0
- 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 +79 -0
- 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 +192 -0
- data/spec/lib/protobuf/generators/base_spec.rb +154 -0
- data/spec/lib/protobuf/generators/enum_generator_spec.rb +82 -0
- data/spec/lib/protobuf/generators/extension_generator_spec.rb +42 -0
- data/spec/lib/protobuf/generators/field_generator_spec.rb +197 -0
- data/spec/lib/protobuf/generators/file_generator_spec.rb +119 -0
- data/spec/lib/protobuf/generators/message_generator_spec.rb +0 -0
- data/spec/lib/protobuf/generators/service_generator_spec.rb +99 -0
- data/spec/lib/protobuf/lifecycle_spec.rb +94 -0
- data/spec/lib/protobuf/message_spec.rb +944 -0
- data/spec/lib/protobuf/optionable_spec.rb +265 -0
- data/spec/lib/protobuf/rpc/client_spec.rb +66 -0
- data/spec/lib/protobuf/rpc/connectors/base_spec.rb +226 -0
- data/spec/lib/protobuf/rpc/connectors/ping_spec.rb +69 -0
- data/spec/lib/protobuf/rpc/connectors/socket_spec.rb +34 -0
- data/spec/lib/protobuf/rpc/connectors/zmq_spec.rb +110 -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 +91 -0
- data/spec/lib/protobuf/rpc/servers/socket_server_spec.rb +38 -0
- data/spec/lib/protobuf/rpc/servers/zmq/server_spec.rb +43 -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 +293 -0
- data/spec/lib/protobuf/rpc/service_dispatcher_spec.rb +35 -0
- data/spec/lib/protobuf/rpc/service_filters_spec.rb +517 -0
- data/spec/lib/protobuf/rpc/service_spec.rb +162 -0
- data/spec/lib/protobuf/rpc/stat_spec.rb +101 -0
- data/spec/lib/protobuf/varint_spec.rb +29 -0
- data/spec/lib/protobuf_spec.rb +105 -0
- data/spec/spec_helper.rb +42 -0
- data/spec/support/all.rb +6 -0
- data/spec/support/packed_field.rb +23 -0
- data/spec/support/protos/all_types.data.bin +0 -0
- data/spec/support/protos/all_types.data.txt +119 -0
- data/spec/support/protos/enum.pb.rb +63 -0
- data/spec/support/protos/enum.proto +37 -0
- data/spec/support/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/protos/google_unittest.proto +884 -0
- data/spec/support/protos/google_unittest_custom_options.bin +0 -0
- data/spec/support/protos/google_unittest_custom_options.pb.rb +361 -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/protos/google_unittest_import.proto +73 -0
- data/spec/support/protos/google_unittest_import_public.pb.rb +31 -0
- data/spec/support/protos/google_unittest_import_public.proto +41 -0
- data/spec/support/protos/map-test.bin +157 -0
- data/spec/support/protos/map-test.pb.rb +85 -0
- data/spec/support/protos/map-test.proto +68 -0
- data/spec/support/protos/multi_field_extensions.pb.rb +59 -0
- data/spec/support/protos/multi_field_extensions.proto +35 -0
- data/spec/support/protos/resource.pb.rb +172 -0
- data/spec/support/protos/resource.proto +137 -0
- data/spec/support/resource_service.rb +23 -0
- data/spec/support/server.rb +65 -0
- data/spec/support/test_app_file.rb +2 -0
- data/varint_prof.rb +82 -0
- metadata +579 -0
@@ -0,0 +1,365 @@
|
|
1
|
+
require 'delegate'
|
2
|
+
|
3
|
+
##
|
4
|
+
# Adding extension to Numeric until
|
5
|
+
# we can get people to stop calling #value
|
6
|
+
# on Enum instances.
|
7
|
+
#
|
8
|
+
::Protobuf.deprecator.define_deprecated_methods(Numeric, :value => :to_int)
|
9
|
+
|
10
|
+
module Protobuf
|
11
|
+
class Enum < SimpleDelegator
|
12
|
+
# Public: Allows setting Options on the Enum class.
|
13
|
+
::Protobuf::Optionable.inject(self) { ::Google::Protobuf::EnumOptions }
|
14
|
+
|
15
|
+
def self.aliases_allowed?
|
16
|
+
get_option(:allow_alias)
|
17
|
+
end
|
18
|
+
|
19
|
+
# Public: Get all integer tags defined by this enum.
|
20
|
+
#
|
21
|
+
# Examples
|
22
|
+
#
|
23
|
+
# class StateMachine < ::Protobuf::Enum
|
24
|
+
# set_option :allow_alias
|
25
|
+
# define :ON, 1
|
26
|
+
# define :STARTED, 1
|
27
|
+
# define :OFF, 2
|
28
|
+
# end
|
29
|
+
#
|
30
|
+
# StateMachine.all_tags #=> [ 1, 2 ]
|
31
|
+
#
|
32
|
+
# Returns an array of unique integers.
|
33
|
+
#
|
34
|
+
def self.all_tags
|
35
|
+
@all_tags ||= enums.map(&:to_i).uniq
|
36
|
+
end
|
37
|
+
|
38
|
+
# Internal: DSL method to create a new Enum. The given name will
|
39
|
+
# become a constant for this Enum pointing to the new instance.
|
40
|
+
#
|
41
|
+
# Examples
|
42
|
+
#
|
43
|
+
# class StateMachine < ::Protobuf::Enum
|
44
|
+
# define :ON, 1
|
45
|
+
# define :OFF, 2
|
46
|
+
# end
|
47
|
+
#
|
48
|
+
# StateMachine::ON #=> #<StateMachine::ON=1>
|
49
|
+
# StateMachine::OFF #=> #<StateMachine::OFF=2>
|
50
|
+
#
|
51
|
+
# Returns nothing.
|
52
|
+
#
|
53
|
+
def self.define(name, tag)
|
54
|
+
enum = new(self, name, tag)
|
55
|
+
@enums ||= []
|
56
|
+
@enums << enum
|
57
|
+
# defining a new field for the enum will cause cached @values and @mapped_enums
|
58
|
+
# to be incorrect; reset them
|
59
|
+
@mapped_enums = @values = nil
|
60
|
+
const_set(name, enum)
|
61
|
+
mapped_enums
|
62
|
+
end
|
63
|
+
|
64
|
+
# Internal: A mapping of enum number -> enums defined
|
65
|
+
# used for speeding up our internal enum methods.
|
66
|
+
def self.mapped_enums
|
67
|
+
@mapped_enums ||= enums.each_with_object({}) do |enum, hash|
|
68
|
+
list = hash[enum.to_i] ||= []
|
69
|
+
list << enum
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
# Public: All defined enums.
|
74
|
+
#
|
75
|
+
class << self
|
76
|
+
attr_reader :enums
|
77
|
+
end
|
78
|
+
|
79
|
+
# Public: Get an array of Enum objects with the given tag.
|
80
|
+
#
|
81
|
+
# tag - An object that responds to to_i.
|
82
|
+
#
|
83
|
+
# Examples
|
84
|
+
#
|
85
|
+
# class StateMachine < ::Protobuf::Enum
|
86
|
+
# set_option :allow_alias
|
87
|
+
# define :ON, 1
|
88
|
+
# define :STARTED, 1
|
89
|
+
# define :OFF, 2
|
90
|
+
# end
|
91
|
+
#
|
92
|
+
# StateMachine.enums_for_tag(1) #=> [ #<StateMachine::ON=1>, #<StateMachine::STARTED=1> ]
|
93
|
+
# StateMachine.enums_for_tag(2) #=> [ #<StateMachine::OFF=2> ]
|
94
|
+
#
|
95
|
+
# Returns an array with zero or more Enum objects or nil.
|
96
|
+
#
|
97
|
+
def self.enums_for_tag(tag)
|
98
|
+
tag && mapped_enums[tag.to_i] || []
|
99
|
+
end
|
100
|
+
|
101
|
+
# Public: Get the Enum associated with the given name.
|
102
|
+
#
|
103
|
+
# name - A string-like object. Case-sensitive.
|
104
|
+
#
|
105
|
+
# Example
|
106
|
+
#
|
107
|
+
# class StateMachine < ::Protobuf::Enum
|
108
|
+
# define :ON, 1
|
109
|
+
# define :OFF, 2
|
110
|
+
# end
|
111
|
+
#
|
112
|
+
# StateMachine.enum_for_name(:ON) # => #<StateMachine::ON=1>
|
113
|
+
# StateMachine.enum_for_name("ON") # => #<StateMachine::ON=1>
|
114
|
+
# StateMachine.enum_for_name(:on) # => nil
|
115
|
+
# StateMachine.enum_for_name(:FOO) # => nil
|
116
|
+
#
|
117
|
+
# Returns the Enum object with the given name or nil.
|
118
|
+
#
|
119
|
+
def self.enum_for_name(name)
|
120
|
+
const_get(name)
|
121
|
+
rescue ::NameError
|
122
|
+
nil
|
123
|
+
end
|
124
|
+
|
125
|
+
# Public: Get the Enum object corresponding to the given tag.
|
126
|
+
#
|
127
|
+
# tag - An object that responds to to_i.
|
128
|
+
#
|
129
|
+
# Returns an Enum object or nil. If the tag corresponds to multiple
|
130
|
+
# Enums, the first enum defined will be returned.
|
131
|
+
#
|
132
|
+
def self.enum_for_tag(tag)
|
133
|
+
tag && (mapped_enums[tag.to_i] || []).first
|
134
|
+
end
|
135
|
+
|
136
|
+
def self.enum_for_tag_integer(tag)
|
137
|
+
(@mapped_enums[tag] || []).first
|
138
|
+
end
|
139
|
+
|
140
|
+
# Public: Get an Enum by a variety of type-checking mechanisms.
|
141
|
+
#
|
142
|
+
# candidate - An Enum, Numeric, String, or Symbol object.
|
143
|
+
#
|
144
|
+
# Example
|
145
|
+
#
|
146
|
+
# class StateMachine < ::Protobuf::Enum
|
147
|
+
# set_option :allow_alias
|
148
|
+
# define :ON, 1
|
149
|
+
# define :STARTED, 1
|
150
|
+
# define :OFF, 2
|
151
|
+
# end
|
152
|
+
#
|
153
|
+
# StateMachine.fetch(StateMachine::ON) # => #<StateMachine::ON=1>
|
154
|
+
# StateMachine.fetch(:ON) # => #<StateMachine::ON=1>
|
155
|
+
# StateMachine.fetch("STARTED") # => #<StateMachine::STARTED=1>
|
156
|
+
# StateMachine.fetch(1) # => [ #<StateMachine::ON=1>, #<StateMachine::STARTED=1> ]
|
157
|
+
#
|
158
|
+
# Returns an Enum object or nil.
|
159
|
+
#
|
160
|
+
def self.fetch(candidate)
|
161
|
+
return enum_for_tag_integer(candidate) if candidate.is_a?(::Integer)
|
162
|
+
|
163
|
+
case candidate
|
164
|
+
when self
|
165
|
+
candidate
|
166
|
+
when ::Numeric
|
167
|
+
enum_for_tag(candidate.to_i)
|
168
|
+
when ::String, ::Symbol
|
169
|
+
enum_for_name(candidate)
|
170
|
+
else
|
171
|
+
nil
|
172
|
+
end
|
173
|
+
end
|
174
|
+
|
175
|
+
# Public: Get the Symbol name associated with the given number.
|
176
|
+
#
|
177
|
+
# number - An object that responds to to_i.
|
178
|
+
#
|
179
|
+
# Examples
|
180
|
+
#
|
181
|
+
# # Without aliases
|
182
|
+
# class StateMachine < ::Protobuf::Enum
|
183
|
+
# define :ON, 1
|
184
|
+
# define :OFF, 2
|
185
|
+
# end
|
186
|
+
#
|
187
|
+
# StateMachine.name_for_tag(1) # => :ON
|
188
|
+
# StateMachine.name_for_tag(2) # => :OFF
|
189
|
+
# StateMachine.name_for_tag(3) # => nil
|
190
|
+
#
|
191
|
+
# # With aliases
|
192
|
+
# class StateMachine < ::Protobuf::Enum
|
193
|
+
# set_option :allow_alias
|
194
|
+
# define :STARTED, 1
|
195
|
+
# define :ON, 1
|
196
|
+
# define :OFF, 2
|
197
|
+
# end
|
198
|
+
#
|
199
|
+
# StateMachine.name_for_tag(1) # => :STARTED
|
200
|
+
# StateMachine.name_for_tag(2) # => :OFF
|
201
|
+
#
|
202
|
+
# Returns the symbol name of the enum constant given it's associated tag or nil.
|
203
|
+
# If the given tag has multiple names associated (due to allow_alias)
|
204
|
+
# the first defined name will be returned.
|
205
|
+
#
|
206
|
+
def self.name_for_tag(tag)
|
207
|
+
enum_for_tag(tag).try(:name)
|
208
|
+
end
|
209
|
+
|
210
|
+
# Public: Check if the given tag is defined by this Enum.
|
211
|
+
#
|
212
|
+
# number - An object that responds to to_i.
|
213
|
+
#
|
214
|
+
# Returns a boolean.
|
215
|
+
#
|
216
|
+
def self.valid_tag?(tag)
|
217
|
+
tag.respond_to?(:to_i) && mapped_enums.key?(tag.to_i)
|
218
|
+
end
|
219
|
+
|
220
|
+
# Public: [DEPRECATED] Return a hash of Enum objects keyed
|
221
|
+
# by their :name.
|
222
|
+
#
|
223
|
+
def self.values
|
224
|
+
@values ||= enums.each_with_object({}) do |enum, hash|
|
225
|
+
hash[enum.name] = enum
|
226
|
+
end
|
227
|
+
end
|
228
|
+
|
229
|
+
##
|
230
|
+
# Class Deprecations
|
231
|
+
#
|
232
|
+
class << self
|
233
|
+
::Protobuf.deprecator.define_deprecated_methods(
|
234
|
+
self,
|
235
|
+
:enum_by_value => :enum_for_tag,
|
236
|
+
:name_by_value => :name_for_tag,
|
237
|
+
:get_name_by_tag => :name_for_tag,
|
238
|
+
:value_by_name => :enum_for_name,
|
239
|
+
)
|
240
|
+
|
241
|
+
::Protobuf.deprecator.deprecate_methods(self, :values => :enums)
|
242
|
+
end
|
243
|
+
|
244
|
+
##
|
245
|
+
# Attributes
|
246
|
+
#
|
247
|
+
|
248
|
+
private
|
249
|
+
|
250
|
+
attr_writer :parent_class, :name, :tag
|
251
|
+
|
252
|
+
public
|
253
|
+
|
254
|
+
attr_reader :parent_class, :name, :tag
|
255
|
+
|
256
|
+
##
|
257
|
+
# Instance Methods
|
258
|
+
#
|
259
|
+
|
260
|
+
def initialize(parent_class, name, tag)
|
261
|
+
self.parent_class = parent_class
|
262
|
+
self.name = name
|
263
|
+
self.tag = tag
|
264
|
+
super(tag)
|
265
|
+
end
|
266
|
+
|
267
|
+
# Custom equality method since otherwise identical values from different
|
268
|
+
# enums will be considered equal by Integer's equality method (or
|
269
|
+
# Fixnum's on Ruby < 2.4.0).
|
270
|
+
#
|
271
|
+
def ==(other)
|
272
|
+
if other.is_a?(Protobuf::Enum)
|
273
|
+
parent_class == other.parent_class && tag == other.tag
|
274
|
+
elsif tag.class == other.class
|
275
|
+
tag == other
|
276
|
+
else
|
277
|
+
false
|
278
|
+
end
|
279
|
+
end
|
280
|
+
|
281
|
+
# Overriding the class so ActiveRecord/Arel visitor will visit the enum as an
|
282
|
+
# Integer.
|
283
|
+
#
|
284
|
+
def class
|
285
|
+
# This is done for backward compatibility for < 2.4.0. This ensures that
|
286
|
+
# if Ruby version >= 2.4.0, this will return Integer. If below, then will
|
287
|
+
# return Fixnum.
|
288
|
+
#
|
289
|
+
# This prevents the constant deprecation warnings on Fixnum.
|
290
|
+
tag.class
|
291
|
+
end
|
292
|
+
|
293
|
+
# Protobuf::Enum delegates methods to Fixnum, which has a custom hash equality method (`eql?`)
|
294
|
+
# This causes enum values to be equivalent when using `==`, `===`, `equals?`, but not `eql?`**:
|
295
|
+
#
|
296
|
+
# 2.3.7 :002 > ::Test::EnumTestType::ZERO.eql?(::Test::EnumTestType::ZERO)
|
297
|
+
# => false
|
298
|
+
#
|
299
|
+
# However, they are equilvalent to their tag value:
|
300
|
+
#
|
301
|
+
# 2.3.7 :002 > ::Test::EnumTestType::ZERO.eql?(::Test::EnumTestType::ZERO.tag)
|
302
|
+
# => true
|
303
|
+
#
|
304
|
+
# **The implementation changed in Ruby 2.5, so this only affects Ruby versions less than v2.4.
|
305
|
+
#
|
306
|
+
# Use the hash equality implementation from Object#eql?, which is equivalent to == instead.
|
307
|
+
#
|
308
|
+
def eql?(other)
|
309
|
+
self == other
|
310
|
+
end
|
311
|
+
|
312
|
+
def inspect
|
313
|
+
"\#<Protobuf::Enum(#{parent_class})::#{name}=#{tag}>"
|
314
|
+
end
|
315
|
+
|
316
|
+
def to_int
|
317
|
+
tag.to_int
|
318
|
+
end
|
319
|
+
|
320
|
+
# This fixes a reflection bug in JrJackson RubyAnySerializer that does not
|
321
|
+
# render Protobuf enums correctly because to_json is not defined. It takes
|
322
|
+
# any number of arguments to support the JSON gem trying to pass an argument.
|
323
|
+
# NB: This method is required to return a string and not an integer.
|
324
|
+
#
|
325
|
+
def to_json(*)
|
326
|
+
to_s
|
327
|
+
end
|
328
|
+
|
329
|
+
def to_s(format = :tag)
|
330
|
+
case format
|
331
|
+
when :tag
|
332
|
+
to_i.to_s
|
333
|
+
when :name
|
334
|
+
name.to_s
|
335
|
+
else
|
336
|
+
to_i.to_s
|
337
|
+
end
|
338
|
+
end
|
339
|
+
|
340
|
+
# Re-implement `try` in order to fix the problem where
|
341
|
+
# the underlying fixnum doesn't respond to all methods (e.g. name or tag).
|
342
|
+
# If we respond to the first argument, `__send__` the args. Otherwise,
|
343
|
+
# delegate the `try` call to the underlying vlaue fixnum.
|
344
|
+
#
|
345
|
+
def try(*args, &block)
|
346
|
+
case
|
347
|
+
when args.empty? && block_given?
|
348
|
+
yield self
|
349
|
+
when respond_to?(args.first)
|
350
|
+
__send__(*args, &block)
|
351
|
+
else
|
352
|
+
@tag.try(*args, &block)
|
353
|
+
end
|
354
|
+
end
|
355
|
+
|
356
|
+
##
|
357
|
+
# Instance Aliases
|
358
|
+
#
|
359
|
+
alias :to_i tag
|
360
|
+
alias :to_hash_value tag
|
361
|
+
alias :to_json_hash_value tag
|
362
|
+
|
363
|
+
::Protobuf.deprecator.define_deprecated_methods(self, :value => :to_i)
|
364
|
+
end
|
365
|
+
end
|
@@ -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 < StandardError; end
|
7
|
+
class FieldNotDefinedError < StandardError; end
|
8
|
+
class DuplicateFieldNameError < StandardError; 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, simple_name, options = {})
|
45
|
+
field_class(type).new(message_class, rule, field_type(type), name, tag, simple_name, 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
|
+
fail 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
|