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,380 @@
1
+ require 'active_support/core_ext/hash/slice'
2
+ require 'protobuf/field/field_array'
3
+ require 'protobuf/field/field_hash'
4
+ require 'protobuf/field/base_field_object_definitions'
5
+
6
+ module Protobuf
7
+ module Field
8
+ class BaseField
9
+ include ::Protobuf::Logging
10
+ ::Protobuf::Optionable.inject(self, false) { ::Google::Protobuf::FieldOptions }
11
+
12
+ ##
13
+ # Constants
14
+ #
15
+ OBJECT_MODULE = ::Protobuf::Field::BaseFieldObjectDefinitions
16
+ PACKED_TYPES = [
17
+ ::Protobuf::WireType::VARINT,
18
+ ::Protobuf::WireType::FIXED32,
19
+ ::Protobuf::WireType::FIXED64,
20
+ ].freeze
21
+
22
+ ##
23
+ # Attributes
24
+ #
25
+ attr_reader :default_value, :message_class, :name, :fully_qualified_name, :options, :rule, :tag, :type_class
26
+
27
+ ##
28
+ # Class Methods
29
+ #
30
+
31
+ def self.default
32
+ nil
33
+ end
34
+
35
+ ##
36
+ # Constructor
37
+ #
38
+
39
+ def initialize(message_class, rule, type_class, fully_qualified_name, tag, simple_name, options)
40
+ @message_class = message_class
41
+ @name = simple_name || fully_qualified_name
42
+ @fully_qualified_name = fully_qualified_name
43
+ @rule = rule
44
+ @tag = tag
45
+ @type_class = type_class
46
+ # Populate the option hash with all the original default field options, for backwards compatibility.
47
+ # However, both default and custom options should ideally be accessed through the Optionable .{get,get!}_option functions.
48
+ @options = options.slice(:ctype, :packed, :deprecated, :lazy, :jstype, :weak, :uninterpreted_option, :default, :extension)
49
+ options.each do |option_name, value|
50
+ set_option(option_name, value)
51
+ end
52
+
53
+ @extension = options.key?(:extension)
54
+ @deprecated = options.key?(:deprecated)
55
+ @required = rule == :required
56
+ @repeated = rule == :repeated
57
+ @optional = rule == :optional
58
+ @packed = @repeated && options.key?(:packed)
59
+
60
+ validate_packed_field if packed?
61
+ define_accessor(simple_name, fully_qualified_name) if simple_name
62
+ set_repeated_message!
63
+ set_map!
64
+ @value_from_values = nil
65
+ @value_from_values_for_serialization = nil
66
+ @field_predicate = nil
67
+ @field_and_present_predicate = nil
68
+ @set_field = nil
69
+ @set_method = nil
70
+ @to_message_hash = nil
71
+ @to_message_hash_string_keys = nil
72
+ @encode_to_stream = nil
73
+
74
+ define_value_from_values!
75
+ define_value_from_values_for_serialization!
76
+ define_field_predicate!
77
+ define_field_and_present_predicate!
78
+ define_set_field!
79
+ define_set_method!
80
+ define_to_message_hash!
81
+ define_encode_to_stream!
82
+ set_default_value!
83
+ end
84
+
85
+ ##
86
+ # Public Instance Methods
87
+ #
88
+
89
+ def acceptable?(_value)
90
+ true
91
+ end
92
+
93
+ def coerce!(value)
94
+ value
95
+ end
96
+
97
+ def decode(_bytes)
98
+ fail NotImplementedError, "#{self.class.name}##{__method__}"
99
+ end
100
+
101
+ def default
102
+ options[:default]
103
+ end
104
+
105
+ def set_default_value!
106
+ @default_value ||= if optional? || required?
107
+ typed_default_value
108
+ elsif map?
109
+ ::Protobuf::Field::FieldHash.new(self).freeze
110
+ elsif repeated?
111
+ ::Protobuf::Field::FieldArray.new(self).freeze
112
+ else
113
+ fail "Unknown field label -- something went very wrong"
114
+ end
115
+ end
116
+
117
+ def define_encode_to_stream!
118
+ @encode_to_stream = if repeated? && packed?
119
+ OBJECT_MODULE::RepeatedPackedEncodeToStream.new(self)
120
+ elsif repeated?
121
+ OBJECT_MODULE::RepeatedNotPackedEncodeToStream.new(self)
122
+ elsif message? || type_class == ::Protobuf::Field::BytesField
123
+ OBJECT_MODULE::BytesEncodeToStream.new(self)
124
+ elsif type_class == ::Protobuf::Field::StringField
125
+ OBJECT_MODULE::StringEncodeToStream.new(self)
126
+ else
127
+ OBJECT_MODULE::BaseEncodeToStream.new(self)
128
+ end
129
+ end
130
+
131
+ def encode_to_stream(value, stream)
132
+ @encode_to_stream.call(value, stream)
133
+ end
134
+
135
+ def define_field_predicate!
136
+ @field_predicate = if repeated?
137
+ OBJECT_MODULE::RepeatedFieldPredicate.new(self)
138
+ else
139
+ OBJECT_MODULE::BaseFieldPredicate.new(self)
140
+ end
141
+ end
142
+
143
+ def field?(values)
144
+ @field_predicate.call(values)
145
+ end
146
+
147
+ def define_field_and_present_predicate!
148
+ @field_and_present_predicate = if !repeated? && type_class == ::Protobuf::Field::BoolField # boolean present check
149
+ OBJECT_MODULE::BoolFieldAndPresentPredicate.new(self)
150
+ else
151
+ OBJECT_MODULE::BaseFieldAndPresentPredicate.new(self)
152
+ end
153
+ end
154
+
155
+ def field_and_present?(values)
156
+ @field_and_present_predicate.call(values)
157
+ end
158
+
159
+ def define_value_from_values!
160
+ @value_from_values = if map?
161
+ OBJECT_MODULE::MapValueFromValues.new(self)
162
+ elsif repeated?
163
+ OBJECT_MODULE::RepeatedFieldValueFromValues.new(self)
164
+ elsif type_class == ::Protobuf::Field::BoolField # boolean present check
165
+ OBJECT_MODULE::BoolFieldValueFromValues.new(self)
166
+ else
167
+ OBJECT_MODULE::BaseFieldValueFromValues.new(self)
168
+ end
169
+ end
170
+
171
+ def value_from_values(values)
172
+ @value_from_values.call(values)
173
+ end
174
+
175
+ def define_value_from_values_for_serialization!
176
+ @value_from_values_for_serialization = if map?
177
+ OBJECT_MODULE::MapValueFromValuesForSerialization.new(self)
178
+ elsif repeated?
179
+ OBJECT_MODULE::RepeatedFieldValueFromValuesForSerialization.new(self)
180
+ elsif type_class == ::Protobuf::Field::BoolField # boolean present check
181
+ OBJECT_MODULE::BoolFieldValueFromValuesForSerialization.new(self)
182
+ else
183
+ OBJECT_MODULE::BaseFieldValueFromValuesForSerialization.new(self)
184
+ end
185
+ end
186
+
187
+ def value_from_values_for_serialization(values)
188
+ @value_from_values_for_serialization.call(values)
189
+ end
190
+
191
+ def define_set_field!
192
+ @set_field = if map? && required?
193
+ OBJECT_MODULE::RequiredMapSetField.new(self)
194
+ elsif repeated? && required?
195
+ OBJECT_MODULE::RequiredRepeatedSetField.new(self)
196
+ elsif type_class == ::Protobuf::Field::StringField && required?
197
+ OBJECT_MODULE::RequiredStringSetField.new(self)
198
+ elsif required?
199
+ OBJECT_MODULE::RequiredBaseSetField.new(self)
200
+ elsif map?
201
+ OBJECT_MODULE::MapSetField.new(self)
202
+ elsif repeated?
203
+ OBJECT_MODULE::RepeatedSetField.new(self)
204
+ elsif type_class == ::Protobuf::Field::StringField
205
+ OBJECT_MODULE::StringSetField.new(self)
206
+ else
207
+ OBJECT_MODULE::BaseSetField.new(self)
208
+ end
209
+ end
210
+
211
+ def set_field(values, value, ignore_nil_for_repeated, message_instance)
212
+ @set_field.call(values, value, ignore_nil_for_repeated, message_instance)
213
+ end
214
+
215
+ def define_to_message_hash!
216
+ if message? || enum? || repeated? || map?
217
+ @to_message_hash = OBJECT_MODULE::ToHashValueToMessageHash.new(self)
218
+ @to_message_hash_string_keys = OBJECT_MODULE::ToHashValueToMessageHashWithStringKey.new(self)
219
+ else
220
+ @to_message_hash = OBJECT_MODULE::BaseToMessageHash.new(self)
221
+ @to_message_hash_string_keys = OBJECT_MODULE::BaseToMessageHashWithStringKey.new(self)
222
+ end
223
+ end
224
+
225
+ def to_message_hash(values, result)
226
+ @to_message_hash.call(values, result)
227
+ end
228
+
229
+ def to_message_hash_with_string_key(values, result)
230
+ @to_message_hash_string_keys.call(values, result)
231
+ end
232
+
233
+ def deprecated?
234
+ @deprecated
235
+ end
236
+
237
+ def encode(_value)
238
+ fail NotImplementedError, "#{self.class.name}##{__method__}"
239
+ end
240
+
241
+ def extension?
242
+ @extension
243
+ end
244
+
245
+ def enum?
246
+ false
247
+ end
248
+
249
+ def message?
250
+ false
251
+ end
252
+
253
+ def set_map!
254
+ set_repeated_message!
255
+ @is_map = repeated_message? && type_class.get_option!(:map_entry)
256
+ end
257
+
258
+ def map?
259
+ @is_map
260
+ end
261
+
262
+ def optional?
263
+ @optional
264
+ end
265
+
266
+ def packed?
267
+ @packed
268
+ end
269
+
270
+ def repeated?
271
+ @repeated
272
+ end
273
+
274
+ def set_repeated_message!
275
+ @repeated_message = repeated? && message?
276
+ end
277
+
278
+ def repeated_message?
279
+ @repeated_message
280
+ end
281
+
282
+ def required?
283
+ @required
284
+ end
285
+
286
+ def define_set_method!
287
+ @set_method = if map?
288
+ OBJECT_MODULE::MapSetMethod.new(self)
289
+ elsif repeated? && packed?
290
+ OBJECT_MODULE::RepeatedPackedSetMethod.new(self)
291
+ elsif repeated?
292
+ OBJECT_MODULE::RepeatedNotPackedSetMethod.new(self)
293
+ else
294
+ OBJECT_MODULE::BaseSetMethod.new(self)
295
+ end
296
+ end
297
+
298
+ def set(message_instance, bytes)
299
+ @set_method.call(message_instance, bytes)
300
+ end
301
+
302
+ def tag_encoded
303
+ @tag_encoded ||= begin
304
+ case
305
+ when repeated? && packed?
306
+ ::Protobuf::Field::VarintField.encode((tag << 3) | ::Protobuf::WireType::LENGTH_DELIMITED)
307
+ else
308
+ ::Protobuf::Field::VarintField.encode((tag << 3) | wire_type)
309
+ end
310
+ end
311
+ end
312
+
313
+ # FIXME: add packed, deprecated, extension options to to_s output
314
+ def to_s
315
+ "#{rule} #{type_class} #{name} = #{tag} #{default ? "[default=#{default.inspect}]" : ''}"
316
+ end
317
+
318
+ ::Protobuf.deprecator.define_deprecated_methods(self, :type => :type_class)
319
+
320
+ def wire_type
321
+ ::Protobuf::WireType::VARINT
322
+ end
323
+
324
+ def fully_qualified_name_only!
325
+ @name = @fully_qualified_name
326
+
327
+ ##
328
+ # Recreate all of the meta methods as they may have used the original `name` value
329
+ #
330
+ define_value_from_values!
331
+ define_value_from_values_for_serialization!
332
+ define_field_predicate!
333
+ define_field_and_present_predicate!
334
+ define_set_field!
335
+ define_set_method!
336
+ define_to_message_hash!
337
+ define_encode_to_stream!
338
+ end
339
+
340
+ private
341
+
342
+ ##
343
+ # Private Instance Methods
344
+ #
345
+
346
+ def define_accessor(simple_field_name, fully_qualified_field_name)
347
+ message_class.class_eval do
348
+ define_method("#{simple_field_name}!") do
349
+ @values[fully_qualified_field_name] if field?(fully_qualified_field_name)
350
+ end
351
+ end
352
+
353
+ message_class.class_eval do
354
+ define_method(simple_field_name) { self[fully_qualified_field_name] }
355
+ define_method("#{simple_field_name}=") { |v| set_field(fully_qualified_field_name, v, false) }
356
+ end
357
+
358
+ return unless deprecated?
359
+
360
+ ::Protobuf.field_deprecator.deprecate_method(message_class, simple_field_name)
361
+ ::Protobuf.field_deprecator.deprecate_method(message_class, "#{simple_field_name}!")
362
+ ::Protobuf.field_deprecator.deprecate_method(message_class, "#{simple_field_name}=")
363
+ end
364
+
365
+ def typed_default_value
366
+ if default.nil?
367
+ self.class.default
368
+ else
369
+ default
370
+ end
371
+ end
372
+
373
+ def validate_packed_field
374
+ if packed? && ! ::Protobuf::Field::BaseField::PACKED_TYPES.include?(wire_type)
375
+ fail "Can't use packed encoding for '#{type_class}' type"
376
+ end
377
+ end
378
+ end
379
+ end
380
+ end
@@ -0,0 +1,504 @@
1
+ module Protobuf
2
+ module Field
3
+ module BaseFieldObjectDefinitions
4
+
5
+ class ToHashValueToMessageHashWithStringKey
6
+ def initialize(selph)
7
+ @selph = selph
8
+ @name = selph.name.to_s
9
+ end
10
+
11
+ def call(values, result)
12
+ result[@name] = @selph.value_from_values(values).to_hash_value
13
+ end
14
+ end
15
+
16
+ class BaseToMessageHashWithStringKey
17
+ def initialize(selph)
18
+ @selph = selph
19
+ @name = selph.name.to_s
20
+ end
21
+
22
+ def call(values, result)
23
+ result[@name] = @selph.value_from_values(values)
24
+ end
25
+ end
26
+
27
+ class ToHashValueToMessageHash
28
+ def initialize(selph)
29
+ @selph = selph
30
+ @name = selph.name.to_sym
31
+ end
32
+
33
+ def call(values, result)
34
+ result[@name] = @selph.value_from_values(values).to_hash_value
35
+ end
36
+ end
37
+
38
+ class BaseToMessageHash
39
+ def initialize(selph)
40
+ @selph = selph
41
+ @name = selph.name.to_sym
42
+ end
43
+
44
+ def call(values, result)
45
+ result[@name] = @selph.value_from_values(values)
46
+ end
47
+ end
48
+
49
+ class RepeatedPackedEncodeToStream
50
+ def initialize(selph)
51
+ @selph = selph
52
+ @tag_encoded = selph.tag_encoded
53
+ end
54
+
55
+ def call(value, stream)
56
+ packed_value = value.map { |val| @selph.encode(val) }.join
57
+ stream << @tag_encoded << "#{::Protobuf::Field::VarintField.encode(packed_value.size)}#{packed_value}"
58
+ end
59
+ end
60
+
61
+ class BytesEncodeToStream
62
+ def initialize(selph)
63
+ @selph = selph
64
+ @tag_encoded = selph.tag_encoded
65
+ end
66
+
67
+ def call(value, stream)
68
+ value = value.encode if value.is_a?(::Protobuf::Message)
69
+ byte_size = ::Protobuf::Field::VarintField.encode(value.bytesize)
70
+
71
+ stream << @tag_encoded << byte_size << value
72
+ end
73
+ end
74
+
75
+ class StringEncodeToStream
76
+ def initialize(selph)
77
+ @selph = selph
78
+ @tag_encoded = selph.tag_encoded
79
+ end
80
+
81
+ def call(value, stream)
82
+ new_value = "" + value
83
+ if new_value.encoding != ::Protobuf::Field::StringField::ENCODING
84
+ new_value.encode!(::Protobuf::Field::StringField::ENCODING, :invalid => :replace, :undef => :replace, :replace => "")
85
+ end
86
+
87
+ stream << @tag_encoded << ::Protobuf::Field::VarintField.encode(new_value.bytesize) << new_value
88
+ end
89
+ end
90
+
91
+ class BaseEncodeToStream
92
+ def initialize(selph)
93
+ @selph = selph
94
+ @tag_encoded = selph.tag_encoded
95
+ end
96
+
97
+ def call(value, stream)
98
+ stream << @tag_encoded << @selph.encode(value)
99
+ end
100
+ end
101
+
102
+ class RepeatedNotPackedEncodeToStream
103
+ def initialize(selph)
104
+ @selph = selph
105
+ @tag_encoded = selph.tag_encoded
106
+ end
107
+
108
+ def call(value, stream)
109
+ value.each do |val|
110
+ stream << @tag_encoded << @selph.encode(val)
111
+ end
112
+ end
113
+ end
114
+
115
+ class BaseSetMethod
116
+ def initialize(selph)
117
+ @selph = selph
118
+ @name = selph.name
119
+ end
120
+
121
+ def call(message_instance, bytes)
122
+ message_instance.set_field(@name, @selph.decode(bytes), true, @selph)
123
+ end
124
+ end
125
+
126
+ class MapSetMethod
127
+ def initialize(selph)
128
+ @selph = selph
129
+ @name = selph.name
130
+ end
131
+
132
+ def call(message_instance, bytes)
133
+ hash = message_instance[@name]
134
+ entry = @selph.decode(bytes)
135
+ # decoded value could be nil for an
136
+ # enum value that is not recognized
137
+ hash[entry.key] = entry.value unless entry.value.nil?
138
+ hash[entry.key]
139
+ end
140
+ end
141
+
142
+ class RepeatedNotPackedSetMethod
143
+ def initialize(selph)
144
+ @selph = selph
145
+ @name = selph.name
146
+ end
147
+
148
+ def call(message_instance, bytes)
149
+ message_instance[@name] << @selph.decode(bytes)
150
+ end
151
+ end
152
+
153
+ class RepeatedPackedSetMethod
154
+ def initialize(selph)
155
+ @selph = selph
156
+ @name = selph.name
157
+ @wire_type = selph.wire_type
158
+ end
159
+
160
+ def call(message_instance, bytes)
161
+ array = message_instance[@name]
162
+ stream = ::StringIO.new(bytes)
163
+
164
+ if @wire_type == ::Protobuf::WireType::VARINT
165
+ array << @selph.decode(Varint.decode(stream)) until stream.eof?
166
+ elsif @wire_type == ::Protobuf::WireType::FIXED64
167
+ array << @selph.decode(stream.read(8)) until stream.eof?
168
+ elsif @wire_type == ::Protobuf::WireType::FIXED32
169
+ array << @selph.decode(stream.read(4)) until stream.eof?
170
+ end
171
+ end
172
+ end
173
+
174
+ class RequiredMapSetField
175
+ def initialize(selph)
176
+ @selph = selph
177
+ @tag = selph.tag
178
+ @fully_qualified_name = selph.fully_qualified_name
179
+ end
180
+
181
+ def call(values, value, _ignore_nil_for_repeated, message_instance)
182
+ unless value.is_a?(Hash)
183
+ fail TypeError, <<-TYPE_ERROR
184
+ Expected map value
185
+ Got '#{value.class}' for map protobuf field #{@selph.name}
186
+ TYPE_ERROR
187
+ end
188
+
189
+ if value.empty?
190
+ values.delete(@fully_qualified_name)
191
+ message_instance._protobuf_message_unset_required_field_tags << @tag
192
+ else
193
+ message_instance._protobuf_message_unset_required_field_tags.delete(@tag)
194
+ values[@fully_qualified_name] ||= ::Protobuf::Field::FieldHash.new(@selph)
195
+ values[@fully_qualified_name].replace(value)
196
+ end
197
+ end
198
+ end
199
+
200
+ class MapSetField
201
+ def initialize(selph)
202
+ @selph = selph
203
+ @tag = selph.tag
204
+ @fully_qualified_name = selph.fully_qualified_name
205
+ end
206
+
207
+ def call(values, value, _ignore_nil_for_repeated, _message_instance)
208
+ unless value.is_a?(Hash)
209
+ fail TypeError, <<-TYPE_ERROR
210
+ Expected map value
211
+ Got '#{value.class}' for map protobuf field #{@selph.name}
212
+ TYPE_ERROR
213
+ end
214
+
215
+ if value.empty?
216
+ values.delete(@fully_qualified_name)
217
+ else
218
+ values[@fully_qualified_name] ||= ::Protobuf::Field::FieldHash.new(@selph)
219
+ values[@fully_qualified_name].replace(value)
220
+ end
221
+ end
222
+ end
223
+
224
+ class RequiredRepeatedSetField
225
+ def initialize(selph)
226
+ @selph = selph
227
+ @tag = selph.tag
228
+ @fully_qualified_name = selph.fully_qualified_name
229
+ end
230
+
231
+ def call(values, value, ignore_nil_for_repeated, message_instance)
232
+ if value.nil? && ignore_nil_for_repeated
233
+ ::Protobuf.deprecator.deprecation_warning("['#{@fully_qualified_name}']=nil", "use an empty array instead of nil")
234
+ return
235
+ end
236
+
237
+ unless value.is_a?(Array)
238
+ fail TypeError, <<-TYPE_ERROR
239
+ Expected repeated value of type '#{@selph.type_class}'
240
+ Got '#{value.class}' for repeated protobuf field #{@selph.name}
241
+ TYPE_ERROR
242
+ end
243
+
244
+ value = value.compact
245
+
246
+ if value.empty?
247
+ values.delete(@fully_qualified_name)
248
+ message_instance._protobuf_message_unset_required_field_tags << @tag
249
+ else
250
+ message_instance._protobuf_message_unset_required_field_tags.delete(@tag)
251
+ values[@fully_qualified_name] ||= ::Protobuf::Field::FieldArray.new(@selph)
252
+ values[@fully_qualified_name].replace(value)
253
+ end
254
+ end
255
+ end
256
+
257
+ class RepeatedSetField
258
+ def initialize(selph)
259
+ @selph = selph
260
+ @tag = selph.tag
261
+ @fully_qualified_name = selph.fully_qualified_name
262
+ end
263
+
264
+ def call(values, value, ignore_nil_for_repeated, _message_instance)
265
+ if value.nil? && ignore_nil_for_repeated
266
+ ::Protobuf.deprecator.deprecation_warning("['#{@fully_qualified_name}']=nil", "use an empty array instead of nil")
267
+ return
268
+ end
269
+
270
+ unless value.is_a?(Array)
271
+ fail TypeError, <<-TYPE_ERROR
272
+ Expected repeated value of type '#{@selph.type_class}'
273
+ Got '#{value.class}' for repeated protobuf field #{@selph.name}
274
+ TYPE_ERROR
275
+ end
276
+
277
+ value = value.compact
278
+
279
+ if value.empty?
280
+ values.delete(@fully_qualified_name)
281
+ else
282
+ values[@fully_qualified_name] ||= ::Protobuf::Field::FieldArray.new(@selph)
283
+ values[@fully_qualified_name].replace(value)
284
+ end
285
+ end
286
+ end
287
+
288
+ class RequiredStringSetField
289
+ def initialize(selph)
290
+ @selph = selph
291
+ @tag = selph.tag
292
+ @fully_qualified_name = selph.fully_qualified_name
293
+ end
294
+
295
+ def call(values, value, _ignore_nil_for_repeated, message_instance)
296
+ if value
297
+ message_instance._protobuf_message_unset_required_field_tags.delete(@tag)
298
+ values[@fully_qualified_name] = if value.is_a?(String)
299
+ value
300
+ else
301
+ @selph.coerce!(value)
302
+ end
303
+ else
304
+ values.delete(@fully_qualified_name)
305
+ message_instance._protobuf_message_unset_required_field_tags << @tag
306
+ end
307
+ end
308
+ end
309
+
310
+ class StringSetField
311
+ def initialize(selph)
312
+ @selph = selph
313
+ @tag = selph.tag
314
+ @fully_qualified_name = selph.fully_qualified_name
315
+ end
316
+
317
+ def call(values, value, _ignore_nil_for_repeated, _message_instance)
318
+ if value
319
+ values[@fully_qualified_name] = if value.is_a?(String)
320
+ value
321
+ else
322
+ @selph.coerce!(value)
323
+ end
324
+ else
325
+ values.delete(@fully_qualified_name)
326
+ end
327
+ end
328
+ end
329
+
330
+ class RequiredBaseSetField
331
+ def initialize(selph)
332
+ @selph = selph
333
+ @tag = selph.tag
334
+ @fully_qualified_name = selph.fully_qualified_name
335
+ end
336
+
337
+ def call(values, value, _ignore_nil_for_repeated, message_instance)
338
+ if value.nil?
339
+ values.delete(@fully_qualified_name)
340
+ message_instance._protobuf_message_unset_required_field_tags << @tag
341
+ else
342
+ message_instance._protobuf_message_unset_required_field_tags.delete(@tag)
343
+ values[@fully_qualified_name] = @selph.coerce!(value)
344
+ end
345
+ end
346
+ end
347
+
348
+ class BaseSetField
349
+ def initialize(selph)
350
+ @selph = selph
351
+ @tag = selph.tag
352
+ @fully_qualified_name = selph.fully_qualified_name
353
+ end
354
+
355
+ def call(values, value, _ignore_nil_for_repeated, _message_instance)
356
+ if value.nil?
357
+ values.delete(@fully_qualified_name)
358
+ else
359
+ values[@fully_qualified_name] = @selph.coerce!(value)
360
+ end
361
+ end
362
+ end
363
+
364
+ class BaseFieldAndPresentPredicate
365
+ def initialize(selph)
366
+ @fully_qualified_name = selph.fully_qualified_name
367
+ end
368
+
369
+ def call(values)
370
+ values[@fully_qualified_name].present?
371
+ end
372
+ end
373
+
374
+ class BoolFieldAndPresentPredicate
375
+ BOOL_VALUES = [true, false].freeze
376
+
377
+ def initialize(selph)
378
+ @fully_qualified_name = selph.fully_qualified_name
379
+ end
380
+
381
+ def call(values)
382
+ BOOL_VALUES.include?(values[@fully_qualified_name])
383
+ end
384
+ end
385
+
386
+ class BaseFieldPredicate
387
+ def initialize(selph)
388
+ @fully_qualified_name = selph.fully_qualified_name
389
+ end
390
+
391
+ def call(values)
392
+ values.key?(@fully_qualified_name)
393
+ end
394
+ end
395
+
396
+ class RepeatedFieldPredicate
397
+ def initialize(selph)
398
+ @fully_qualified_name = selph.fully_qualified_name
399
+ end
400
+
401
+ def call(values)
402
+ values.key?(@fully_qualified_name) &&
403
+ values[@fully_qualified_name].present?
404
+ end
405
+ end
406
+
407
+ class BoolFieldValueFromValues
408
+ def initialize(selph)
409
+ @selph = selph
410
+ @fully_qualified_name = selph.fully_qualified_name
411
+ end
412
+
413
+ def call(values)
414
+ values.fetch(@fully_qualified_name) { @selph.default_value }
415
+ end
416
+ end
417
+
418
+ class BoolFieldValueFromValuesForSerialization
419
+ def initialize(selph)
420
+ @selph = selph
421
+ @fully_qualified_name = selph.fully_qualified_name
422
+ end
423
+
424
+ def call(values)
425
+ values.fetch(@fully_qualified_name) { @selph.default_value }
426
+ end
427
+ end
428
+
429
+ class BaseFieldValueFromValues
430
+ def initialize(selph)
431
+ @selph = selph
432
+ @fully_qualified_name = selph.fully_qualified_name
433
+ end
434
+
435
+ def call(values)
436
+ values[@fully_qualified_name] || @selph.default_value
437
+ end
438
+ end
439
+
440
+ class BaseFieldValueFromValuesForSerialization
441
+ def initialize(selph)
442
+ @selph = selph
443
+ @fully_qualified_name = selph.fully_qualified_name
444
+ end
445
+
446
+ def call(values)
447
+ values[@fully_qualified_name] || @selph.default_value
448
+ end
449
+ end
450
+
451
+ class MapValueFromValues
452
+ def initialize(selph)
453
+ @selph = selph
454
+ @fully_qualified_name = selph.fully_qualified_name
455
+ end
456
+
457
+ def call(values)
458
+ values[@fully_qualified_name] ||= ::Protobuf::Field::FieldHash.new(@selph)
459
+ end
460
+ end
461
+
462
+ class MapValueFromValuesForSerialization
463
+ def initialize(selph)
464
+ @selph = selph
465
+ @fully_qualified_name = selph.fully_qualified_name
466
+ @type_class = selph.type_class
467
+ end
468
+
469
+ def call(values)
470
+ value = values[@fully_qualified_name] ||= ::Protobuf::Field::FieldHash.new(@selph)
471
+
472
+ array = []
473
+ value.each do |k, v|
474
+ array << @type_class.new(:key => k, :value => v)
475
+ end
476
+
477
+ array
478
+ end
479
+ end
480
+
481
+ class RepeatedFieldValueFromValues
482
+ def initialize(selph)
483
+ @selph = selph
484
+ @fully_qualified_name = selph.fully_qualified_name
485
+ end
486
+
487
+ def call(values)
488
+ values[@fully_qualified_name] ||= ::Protobuf::Field::FieldArray.new(@selph)
489
+ end
490
+ end
491
+
492
+ class RepeatedFieldValueFromValuesForSerialization
493
+ def initialize(selph)
494
+ @selph = selph
495
+ @fully_qualified_name = selph.fully_qualified_name
496
+ end
497
+
498
+ def call(values)
499
+ values[@fully_qualified_name] ||= ::Protobuf::Field::FieldArray.new(@selph)
500
+ end
501
+ end
502
+ end
503
+ end
504
+ end