protobuffy 3.1.0

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