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.
Files changed (204) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +21 -0
  3. data/.rubocop.yml +70 -0
  4. data/.rubocop_todo.yml +145 -0
  5. data/.travis.yml +40 -0
  6. data/.yardopts +5 -0
  7. data/CHANGES.md +344 -0
  8. data/CONTRIBUTING.md +16 -0
  9. data/Gemfile +3 -0
  10. data/LICENSE.txt +22 -0
  11. data/README.md +33 -0
  12. data/Rakefile +64 -0
  13. data/bin/protoc-gen-ruby +22 -0
  14. data/bin/rpc_server +5 -0
  15. data/install-protobuf.sh +28 -0
  16. data/lib/protobuf.rb +129 -0
  17. data/lib/protobuf/cli.rb +257 -0
  18. data/lib/protobuf/code_generator.rb +120 -0
  19. data/lib/protobuf/decoder.rb +28 -0
  20. data/lib/protobuf/deprecation.rb +117 -0
  21. data/lib/protobuf/descriptors.rb +3 -0
  22. data/lib/protobuf/descriptors/google/protobuf/compiler/plugin.pb.rb +62 -0
  23. data/lib/protobuf/descriptors/google/protobuf/descriptor.pb.rb +301 -0
  24. data/lib/protobuf/encoder.rb +11 -0
  25. data/lib/protobuf/enum.rb +365 -0
  26. data/lib/protobuf/exceptions.rb +9 -0
  27. data/lib/protobuf/field.rb +74 -0
  28. data/lib/protobuf/field/base_field.rb +380 -0
  29. data/lib/protobuf/field/base_field_object_definitions.rb +504 -0
  30. data/lib/protobuf/field/bool_field.rb +64 -0
  31. data/lib/protobuf/field/bytes_field.rb +78 -0
  32. data/lib/protobuf/field/double_field.rb +25 -0
  33. data/lib/protobuf/field/enum_field.rb +61 -0
  34. data/lib/protobuf/field/field_array.rb +104 -0
  35. data/lib/protobuf/field/field_hash.rb +122 -0
  36. data/lib/protobuf/field/fixed32_field.rb +25 -0
  37. data/lib/protobuf/field/fixed64_field.rb +28 -0
  38. data/lib/protobuf/field/float_field.rb +43 -0
  39. data/lib/protobuf/field/int32_field.rb +21 -0
  40. data/lib/protobuf/field/int64_field.rb +34 -0
  41. data/lib/protobuf/field/integer_field.rb +23 -0
  42. data/lib/protobuf/field/message_field.rb +51 -0
  43. data/lib/protobuf/field/sfixed32_field.rb +27 -0
  44. data/lib/protobuf/field/sfixed64_field.rb +28 -0
  45. data/lib/protobuf/field/signed_integer_field.rb +29 -0
  46. data/lib/protobuf/field/sint32_field.rb +21 -0
  47. data/lib/protobuf/field/sint64_field.rb +21 -0
  48. data/lib/protobuf/field/string_field.rb +51 -0
  49. data/lib/protobuf/field/uint32_field.rb +21 -0
  50. data/lib/protobuf/field/uint64_field.rb +21 -0
  51. data/lib/protobuf/field/varint_field.rb +77 -0
  52. data/lib/protobuf/generators/base.rb +85 -0
  53. data/lib/protobuf/generators/enum_generator.rb +39 -0
  54. data/lib/protobuf/generators/extension_generator.rb +27 -0
  55. data/lib/protobuf/generators/field_generator.rb +193 -0
  56. data/lib/protobuf/generators/file_generator.rb +262 -0
  57. data/lib/protobuf/generators/group_generator.rb +122 -0
  58. data/lib/protobuf/generators/message_generator.rb +104 -0
  59. data/lib/protobuf/generators/option_generator.rb +17 -0
  60. data/lib/protobuf/generators/printable.rb +160 -0
  61. data/lib/protobuf/generators/service_generator.rb +50 -0
  62. data/lib/protobuf/lifecycle.rb +33 -0
  63. data/lib/protobuf/logging.rb +39 -0
  64. data/lib/protobuf/message.rb +260 -0
  65. data/lib/protobuf/message/fields.rb +233 -0
  66. data/lib/protobuf/message/serialization.rb +85 -0
  67. data/lib/protobuf/optionable.rb +70 -0
  68. data/lib/protobuf/rpc/buffer.rb +78 -0
  69. data/lib/protobuf/rpc/client.rb +140 -0
  70. data/lib/protobuf/rpc/connectors/base.rb +221 -0
  71. data/lib/protobuf/rpc/connectors/ping.rb +89 -0
  72. data/lib/protobuf/rpc/connectors/socket.rb +78 -0
  73. data/lib/protobuf/rpc/connectors/zmq.rb +319 -0
  74. data/lib/protobuf/rpc/dynamic_discovery.pb.rb +50 -0
  75. data/lib/protobuf/rpc/env.rb +60 -0
  76. data/lib/protobuf/rpc/error.rb +28 -0
  77. data/lib/protobuf/rpc/error/client_error.rb +31 -0
  78. data/lib/protobuf/rpc/error/server_error.rb +43 -0
  79. data/lib/protobuf/rpc/middleware.rb +25 -0
  80. data/lib/protobuf/rpc/middleware/exception_handler.rb +40 -0
  81. data/lib/protobuf/rpc/middleware/logger.rb +95 -0
  82. data/lib/protobuf/rpc/middleware/request_decoder.rb +79 -0
  83. data/lib/protobuf/rpc/middleware/response_encoder.rb +83 -0
  84. data/lib/protobuf/rpc/middleware/runner.rb +18 -0
  85. data/lib/protobuf/rpc/rpc.pb.rb +64 -0
  86. data/lib/protobuf/rpc/rpc_method.rb +16 -0
  87. data/lib/protobuf/rpc/server.rb +39 -0
  88. data/lib/protobuf/rpc/servers/socket/server.rb +121 -0
  89. data/lib/protobuf/rpc/servers/socket/worker.rb +56 -0
  90. data/lib/protobuf/rpc/servers/socket_runner.rb +46 -0
  91. data/lib/protobuf/rpc/servers/zmq/broker.rb +194 -0
  92. data/lib/protobuf/rpc/servers/zmq/server.rb +321 -0
  93. data/lib/protobuf/rpc/servers/zmq/util.rb +48 -0
  94. data/lib/protobuf/rpc/servers/zmq/worker.rb +105 -0
  95. data/lib/protobuf/rpc/servers/zmq_runner.rb +70 -0
  96. data/lib/protobuf/rpc/service.rb +172 -0
  97. data/lib/protobuf/rpc/service_directory.rb +261 -0
  98. data/lib/protobuf/rpc/service_dispatcher.rb +45 -0
  99. data/lib/protobuf/rpc/service_filters.rb +250 -0
  100. data/lib/protobuf/rpc/stat.rb +119 -0
  101. data/lib/protobuf/socket.rb +21 -0
  102. data/lib/protobuf/tasks.rb +1 -0
  103. data/lib/protobuf/tasks/compile.rake +80 -0
  104. data/lib/protobuf/varint.rb +20 -0
  105. data/lib/protobuf/varint_pure.rb +31 -0
  106. data/lib/protobuf/version.rb +3 -0
  107. data/lib/protobuf/wire_type.rb +10 -0
  108. data/lib/protobuf/zmq.rb +21 -0
  109. data/profile.html +5103 -0
  110. data/proto/dynamic_discovery.proto +44 -0
  111. data/proto/google/protobuf/compiler/plugin.proto +147 -0
  112. data/proto/google/protobuf/descriptor.proto +779 -0
  113. data/proto/rpc.proto +69 -0
  114. data/protobuf-cucumber.gemspec +57 -0
  115. data/spec/benchmark/tasks.rb +143 -0
  116. data/spec/bin/protoc-gen-ruby_spec.rb +23 -0
  117. data/spec/encoding/all_types_spec.rb +103 -0
  118. data/spec/encoding/extreme_values_spec.rb +0 -0
  119. data/spec/functional/class_inheritance_spec.rb +52 -0
  120. data/spec/functional/code_generator_spec.rb +58 -0
  121. data/spec/functional/socket_server_spec.rb +59 -0
  122. data/spec/functional/zmq_server_spec.rb +105 -0
  123. data/spec/lib/protobuf/cli_spec.rb +317 -0
  124. data/spec/lib/protobuf/code_generator_spec.rb +87 -0
  125. data/spec/lib/protobuf/enum_spec.rb +307 -0
  126. data/spec/lib/protobuf/field/bool_field_spec.rb +91 -0
  127. data/spec/lib/protobuf/field/double_field_spec.rb +9 -0
  128. data/spec/lib/protobuf/field/enum_field_spec.rb +44 -0
  129. data/spec/lib/protobuf/field/field_array_spec.rb +105 -0
  130. data/spec/lib/protobuf/field/field_hash_spec.rb +168 -0
  131. data/spec/lib/protobuf/field/fixed32_field_spec.rb +7 -0
  132. data/spec/lib/protobuf/field/fixed64_field_spec.rb +7 -0
  133. data/spec/lib/protobuf/field/float_field_spec.rb +90 -0
  134. data/spec/lib/protobuf/field/int32_field_spec.rb +120 -0
  135. data/spec/lib/protobuf/field/int64_field_spec.rb +7 -0
  136. data/spec/lib/protobuf/field/message_field_spec.rb +132 -0
  137. data/spec/lib/protobuf/field/sfixed32_field_spec.rb +9 -0
  138. data/spec/lib/protobuf/field/sfixed64_field_spec.rb +9 -0
  139. data/spec/lib/protobuf/field/sint32_field_spec.rb +9 -0
  140. data/spec/lib/protobuf/field/sint64_field_spec.rb +9 -0
  141. data/spec/lib/protobuf/field/string_field_spec.rb +79 -0
  142. data/spec/lib/protobuf/field/uint32_field_spec.rb +7 -0
  143. data/spec/lib/protobuf/field/uint64_field_spec.rb +7 -0
  144. data/spec/lib/protobuf/field_spec.rb +192 -0
  145. data/spec/lib/protobuf/generators/base_spec.rb +154 -0
  146. data/spec/lib/protobuf/generators/enum_generator_spec.rb +82 -0
  147. data/spec/lib/protobuf/generators/extension_generator_spec.rb +42 -0
  148. data/spec/lib/protobuf/generators/field_generator_spec.rb +197 -0
  149. data/spec/lib/protobuf/generators/file_generator_spec.rb +119 -0
  150. data/spec/lib/protobuf/generators/message_generator_spec.rb +0 -0
  151. data/spec/lib/protobuf/generators/service_generator_spec.rb +99 -0
  152. data/spec/lib/protobuf/lifecycle_spec.rb +94 -0
  153. data/spec/lib/protobuf/message_spec.rb +944 -0
  154. data/spec/lib/protobuf/optionable_spec.rb +265 -0
  155. data/spec/lib/protobuf/rpc/client_spec.rb +66 -0
  156. data/spec/lib/protobuf/rpc/connectors/base_spec.rb +226 -0
  157. data/spec/lib/protobuf/rpc/connectors/ping_spec.rb +69 -0
  158. data/spec/lib/protobuf/rpc/connectors/socket_spec.rb +34 -0
  159. data/spec/lib/protobuf/rpc/connectors/zmq_spec.rb +110 -0
  160. data/spec/lib/protobuf/rpc/middleware/exception_handler_spec.rb +62 -0
  161. data/spec/lib/protobuf/rpc/middleware/logger_spec.rb +49 -0
  162. data/spec/lib/protobuf/rpc/middleware/request_decoder_spec.rb +115 -0
  163. data/spec/lib/protobuf/rpc/middleware/response_encoder_spec.rb +91 -0
  164. data/spec/lib/protobuf/rpc/servers/socket_server_spec.rb +38 -0
  165. data/spec/lib/protobuf/rpc/servers/zmq/server_spec.rb +43 -0
  166. data/spec/lib/protobuf/rpc/servers/zmq/util_spec.rb +55 -0
  167. data/spec/lib/protobuf/rpc/servers/zmq/worker_spec.rb +35 -0
  168. data/spec/lib/protobuf/rpc/service_directory_spec.rb +293 -0
  169. data/spec/lib/protobuf/rpc/service_dispatcher_spec.rb +35 -0
  170. data/spec/lib/protobuf/rpc/service_filters_spec.rb +517 -0
  171. data/spec/lib/protobuf/rpc/service_spec.rb +162 -0
  172. data/spec/lib/protobuf/rpc/stat_spec.rb +101 -0
  173. data/spec/lib/protobuf/varint_spec.rb +29 -0
  174. data/spec/lib/protobuf_spec.rb +105 -0
  175. data/spec/spec_helper.rb +42 -0
  176. data/spec/support/all.rb +6 -0
  177. data/spec/support/packed_field.rb +23 -0
  178. data/spec/support/protos/all_types.data.bin +0 -0
  179. data/spec/support/protos/all_types.data.txt +119 -0
  180. data/spec/support/protos/enum.pb.rb +63 -0
  181. data/spec/support/protos/enum.proto +37 -0
  182. data/spec/support/protos/extreme_values.data.bin +0 -0
  183. data/spec/support/protos/google_unittest.bin +0 -0
  184. data/spec/support/protos/google_unittest.pb.rb +798 -0
  185. data/spec/support/protos/google_unittest.proto +884 -0
  186. data/spec/support/protos/google_unittest_custom_options.bin +0 -0
  187. data/spec/support/protos/google_unittest_custom_options.pb.rb +361 -0
  188. data/spec/support/protos/google_unittest_custom_options.proto +424 -0
  189. data/spec/support/protos/google_unittest_import.pb.rb +55 -0
  190. data/spec/support/protos/google_unittest_import.proto +73 -0
  191. data/spec/support/protos/google_unittest_import_public.pb.rb +31 -0
  192. data/spec/support/protos/google_unittest_import_public.proto +41 -0
  193. data/spec/support/protos/map-test.bin +157 -0
  194. data/spec/support/protos/map-test.pb.rb +85 -0
  195. data/spec/support/protos/map-test.proto +68 -0
  196. data/spec/support/protos/multi_field_extensions.pb.rb +59 -0
  197. data/spec/support/protos/multi_field_extensions.proto +35 -0
  198. data/spec/support/protos/resource.pb.rb +172 -0
  199. data/spec/support/protos/resource.proto +137 -0
  200. data/spec/support/resource_service.rb +23 -0
  201. data/spec/support/server.rb +65 -0
  202. data/spec/support/test_app_file.rb +2 -0
  203. data/varint_prof.rb +82 -0
  204. metadata +579 -0
@@ -0,0 +1,11 @@
1
+ module Protobuf
2
+ class Encoder
3
+ def self.encode(message, stream)
4
+ message.each_field_for_serialization do |field, value|
5
+ field.encode_to_stream(value, stream)
6
+ end
7
+
8
+ stream
9
+ end
10
+ end
11
+ end
@@ -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