protobuf-cucumber 3.10.4

Sign up to get free protection for your applications and to get access to all the features.
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