protobuf 2.2.5-java

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 (256) hide show
  1. data/.gitignore +17 -0
  2. data/.travis.yml +9 -0
  3. data/.yardopts +5 -0
  4. data/Gemfile +3 -0
  5. data/README.md +316 -0
  6. data/Rakefile +29 -0
  7. data/UPGRADING.md +60 -0
  8. data/bin/rpc_server +5 -0
  9. data/bin/rprotoc +62 -0
  10. data/examples/addressbook.pb.rb +55 -0
  11. data/examples/addressbook.proto +24 -0
  12. data/examples/reading_a_message.rb +32 -0
  13. data/examples/writing_a_message.rb +46 -0
  14. data/ext/protobuf-2.4.1/src/google/protobuf/compiler/code_generator.h +142 -0
  15. data/ext/protobuf-2.4.1/src/google/protobuf/compiler/command_line_interface.h +318 -0
  16. data/ext/protobuf-2.4.1/src/google/protobuf/compiler/cpp/cpp_enum.h +99 -0
  17. data/ext/protobuf-2.4.1/src/google/protobuf/compiler/cpp/cpp_enum_field.h +103 -0
  18. data/ext/protobuf-2.4.1/src/google/protobuf/compiler/cpp/cpp_extension.h +85 -0
  19. data/ext/protobuf-2.4.1/src/google/protobuf/compiler/cpp/cpp_field.h +167 -0
  20. data/ext/protobuf-2.4.1/src/google/protobuf/compiler/cpp/cpp_file.h +98 -0
  21. data/ext/protobuf-2.4.1/src/google/protobuf/compiler/cpp/cpp_generator.h +72 -0
  22. data/ext/protobuf-2.4.1/src/google/protobuf/compiler/cpp/cpp_helpers.h +159 -0
  23. data/ext/protobuf-2.4.1/src/google/protobuf/compiler/cpp/cpp_message.h +170 -0
  24. data/ext/protobuf-2.4.1/src/google/protobuf/compiler/cpp/cpp_message_field.h +102 -0
  25. data/ext/protobuf-2.4.1/src/google/protobuf/compiler/cpp/cpp_primitive_field.h +103 -0
  26. data/ext/protobuf-2.4.1/src/google/protobuf/compiler/cpp/cpp_service.h +118 -0
  27. data/ext/protobuf-2.4.1/src/google/protobuf/compiler/cpp/cpp_string_field.h +104 -0
  28. data/ext/protobuf-2.4.1/src/google/protobuf/compiler/cpp/cpp_test_bad_identifiers.pb.h +2721 -0
  29. data/ext/protobuf-2.4.1/src/google/protobuf/compiler/importer.h +303 -0
  30. data/ext/protobuf-2.4.1/src/google/protobuf/compiler/java/java_enum.h +84 -0
  31. data/ext/protobuf-2.4.1/src/google/protobuf/compiler/java/java_enum_field.h +121 -0
  32. data/ext/protobuf-2.4.1/src/google/protobuf/compiler/java/java_extension.h +77 -0
  33. data/ext/protobuf-2.4.1/src/google/protobuf/compiler/java/java_field.h +108 -0
  34. data/ext/protobuf-2.4.1/src/google/protobuf/compiler/java/java_file.h +101 -0
  35. data/ext/protobuf-2.4.1/src/google/protobuf/compiler/java/java_generator.h +72 -0
  36. data/ext/protobuf-2.4.1/src/google/protobuf/compiler/java/java_helpers.h +213 -0
  37. data/ext/protobuf-2.4.1/src/google/protobuf/compiler/java/java_message.h +109 -0
  38. data/ext/protobuf-2.4.1/src/google/protobuf/compiler/java/java_message_field.h +134 -0
  39. data/ext/protobuf-2.4.1/src/google/protobuf/compiler/java/java_primitive_field.h +121 -0
  40. data/ext/protobuf-2.4.1/src/google/protobuf/compiler/java/java_service.h +113 -0
  41. data/ext/protobuf-2.4.1/src/google/protobuf/compiler/java/java_string_field.h +120 -0
  42. data/ext/protobuf-2.4.1/src/google/protobuf/compiler/mock_code_generator.h +113 -0
  43. data/ext/protobuf-2.4.1/src/google/protobuf/compiler/package_info.h +64 -0
  44. data/ext/protobuf-2.4.1/src/google/protobuf/compiler/parser.h +434 -0
  45. data/ext/protobuf-2.4.1/src/google/protobuf/compiler/plugin.h +73 -0
  46. data/ext/protobuf-2.4.1/src/google/protobuf/compiler/plugin.pb.h +790 -0
  47. data/ext/protobuf-2.4.1/src/google/protobuf/compiler/python/python_generator.h +156 -0
  48. data/ext/protobuf-2.4.1/src/google/protobuf/compiler/subprocess.h +108 -0
  49. data/ext/protobuf-2.4.1/src/google/protobuf/compiler/zip_writer.h +93 -0
  50. data/ext/protobuf-2.4.1/src/google/protobuf/descriptor.h +1367 -0
  51. data/ext/protobuf-2.4.1/src/google/protobuf/descriptor.pb.h +5223 -0
  52. data/ext/protobuf-2.4.1/src/google/protobuf/descriptor_database.h +366 -0
  53. data/ext/protobuf-2.4.1/src/google/protobuf/dynamic_message.h +136 -0
  54. data/ext/protobuf-2.4.1/src/google/protobuf/extension_set.h +904 -0
  55. data/ext/protobuf-2.4.1/src/google/protobuf/generated_message_reflection.h +424 -0
  56. data/ext/protobuf-2.4.1/src/google/protobuf/generated_message_util.h +82 -0
  57. data/ext/protobuf-2.4.1/src/google/protobuf/io/coded_stream.h +1102 -0
  58. data/ext/protobuf-2.4.1/src/google/protobuf/io/coded_stream_inl.h +64 -0
  59. data/ext/protobuf-2.4.1/src/google/protobuf/io/gzip_stream.h +207 -0
  60. data/ext/protobuf-2.4.1/src/google/protobuf/io/package_info.h +54 -0
  61. data/ext/protobuf-2.4.1/src/google/protobuf/io/printer.h +136 -0
  62. data/ext/protobuf-2.4.1/src/google/protobuf/io/tokenizer.h +313 -0
  63. data/ext/protobuf-2.4.1/src/google/protobuf/io/zero_copy_stream.h +238 -0
  64. data/ext/protobuf-2.4.1/src/google/protobuf/io/zero_copy_stream_impl.h +357 -0
  65. data/ext/protobuf-2.4.1/src/google/protobuf/io/zero_copy_stream_impl_lite.h +340 -0
  66. data/ext/protobuf-2.4.1/src/google/protobuf/message.h +692 -0
  67. data/ext/protobuf-2.4.1/src/google/protobuf/message_lite.h +239 -0
  68. data/ext/protobuf-2.4.1/src/google/protobuf/package_info.h +64 -0
  69. data/ext/protobuf-2.4.1/src/google/protobuf/reflection_ops.h +80 -0
  70. data/ext/protobuf-2.4.1/src/google/protobuf/repeated_field.h +1295 -0
  71. data/ext/protobuf-2.4.1/src/google/protobuf/service.h +291 -0
  72. data/ext/protobuf-2.4.1/src/google/protobuf/stubs/common.h +1211 -0
  73. data/ext/protobuf-2.4.1/src/google/protobuf/stubs/hash.h +220 -0
  74. data/ext/protobuf-2.4.1/src/google/protobuf/stubs/map-util.h +119 -0
  75. data/ext/protobuf-2.4.1/src/google/protobuf/stubs/once.h +123 -0
  76. data/ext/protobuf-2.4.1/src/google/protobuf/stubs/stl_util-inl.h +121 -0
  77. data/ext/protobuf-2.4.1/src/google/protobuf/stubs/strutil.h +457 -0
  78. data/ext/protobuf-2.4.1/src/google/protobuf/stubs/substitute.h +170 -0
  79. data/ext/protobuf-2.4.1/src/google/protobuf/test_util.h +174 -0
  80. data/ext/protobuf-2.4.1/src/google/protobuf/test_util_lite.h +101 -0
  81. data/ext/protobuf-2.4.1/src/google/protobuf/testing/file.h +83 -0
  82. data/ext/protobuf-2.4.1/src/google/protobuf/testing/googletest.h +98 -0
  83. data/ext/protobuf-2.4.1/src/google/protobuf/text_format.h +285 -0
  84. data/ext/protobuf-2.4.1/src/google/protobuf/unittest.pb.h +11915 -0
  85. data/ext/protobuf-2.4.1/src/google/protobuf/unittest_custom_options.pb.h +2895 -0
  86. data/ext/protobuf-2.4.1/src/google/protobuf/unittest_embed_optimize_for.pb.h +211 -0
  87. data/ext/protobuf-2.4.1/src/google/protobuf/unittest_empty.pb.h +56 -0
  88. data/ext/protobuf-2.4.1/src/google/protobuf/unittest_import.pb.h +188 -0
  89. data/ext/protobuf-2.4.1/src/google/protobuf/unittest_import_lite.pb.h +151 -0
  90. data/ext/protobuf-2.4.1/src/google/protobuf/unittest_lite.pb.h +4752 -0
  91. data/ext/protobuf-2.4.1/src/google/protobuf/unittest_lite_imports_nonlite.pb.h +150 -0
  92. data/ext/protobuf-2.4.1/src/google/protobuf/unittest_mset.pb.h +816 -0
  93. data/ext/protobuf-2.4.1/src/google/protobuf/unittest_no_generic_services.pb.h +197 -0
  94. data/ext/protobuf-2.4.1/src/google/protobuf/unittest_optimize_for.pb.h +403 -0
  95. data/ext/protobuf-2.4.1/src/google/protobuf/unknown_field_set.h +268 -0
  96. data/ext/protobuf-2.4.1/src/google/protobuf/wire_format.h +304 -0
  97. data/ext/protobuf-2.4.1/src/google/protobuf/wire_format_lite.h +620 -0
  98. data/ext/protobuf-2.4.1/src/google/protobuf/wire_format_lite_inl.h +774 -0
  99. data/ext/ruby_generator/Makefile +10 -0
  100. data/ext/ruby_generator/RubyGenerator.cpp +450 -0
  101. data/ext/ruby_generator/RubyGenerator.h +199 -0
  102. data/ext/ruby_generator/extconf.rb +36 -0
  103. data/ext/ruby_generator/protoc-ruby +0 -0
  104. data/lib/protobuf/cli.rb +188 -0
  105. data/lib/protobuf/enum.rb +58 -0
  106. data/lib/protobuf/enum_value.rb +59 -0
  107. data/lib/protobuf/evented.rb +22 -0
  108. data/lib/protobuf/exceptions.rb +11 -0
  109. data/lib/protobuf/ext/eventmachine.rb +14 -0
  110. data/lib/protobuf/field/base_field.rb +240 -0
  111. data/lib/protobuf/field/bool_field.rb +36 -0
  112. data/lib/protobuf/field/bytes_field.rb +38 -0
  113. data/lib/protobuf/field/double_field.rb +19 -0
  114. data/lib/protobuf/field/enum_field.rb +50 -0
  115. data/lib/protobuf/field/extension_fields.rb +32 -0
  116. data/lib/protobuf/field/field_array.rb +65 -0
  117. data/lib/protobuf/field/fixed32_field.rb +19 -0
  118. data/lib/protobuf/field/fixed64_field.rb +22 -0
  119. data/lib/protobuf/field/float_field.rb +31 -0
  120. data/lib/protobuf/field/int32_field.rb +12 -0
  121. data/lib/protobuf/field/int64_field.rb +12 -0
  122. data/lib/protobuf/field/integer_field.rb +19 -0
  123. data/lib/protobuf/field/message_field.rb +53 -0
  124. data/lib/protobuf/field/sfixed32_field.rb +21 -0
  125. data/lib/protobuf/field/sfixed64_field.rb +24 -0
  126. data/lib/protobuf/field/signed_integer_field.rb +23 -0
  127. data/lib/protobuf/field/sint32_field.rb +12 -0
  128. data/lib/protobuf/field/sint64_field.rb +12 -0
  129. data/lib/protobuf/field/string_field.rb +14 -0
  130. data/lib/protobuf/field/uint32_field.rb +12 -0
  131. data/lib/protobuf/field/uint64_field.rb +12 -0
  132. data/lib/protobuf/field/varint_field.rb +61 -0
  133. data/lib/protobuf/field.rb +57 -0
  134. data/lib/protobuf/logger.rb +86 -0
  135. data/lib/protobuf/message/decoder.rb +83 -0
  136. data/lib/protobuf/message/encoder.rb +48 -0
  137. data/lib/protobuf/message/extend.rb +8 -0
  138. data/lib/protobuf/message/message.rb +1 -0
  139. data/lib/protobuf/message.rb +320 -0
  140. data/lib/protobuf/rpc/buffer.rb +79 -0
  141. data/lib/protobuf/rpc/client.rb +166 -0
  142. data/lib/protobuf/rpc/connector.rb +19 -0
  143. data/lib/protobuf/rpc/connectors/base.rb +38 -0
  144. data/lib/protobuf/rpc/connectors/common.rb +156 -0
  145. data/lib/protobuf/rpc/connectors/em_client.rb +84 -0
  146. data/lib/protobuf/rpc/connectors/eventmachine.rb +87 -0
  147. data/lib/protobuf/rpc/connectors/socket.rb +73 -0
  148. data/lib/protobuf/rpc/connectors/zmq.rb +69 -0
  149. data/lib/protobuf/rpc/error/client_error.rb +31 -0
  150. data/lib/protobuf/rpc/error/server_error.rb +43 -0
  151. data/lib/protobuf/rpc/error.rb +25 -0
  152. data/lib/protobuf/rpc/rpc.pb.rb +118 -0
  153. data/lib/protobuf/rpc/server.rb +89 -0
  154. data/lib/protobuf/rpc/servers/evented/server.rb +41 -0
  155. data/lib/protobuf/rpc/servers/evented_runner.rb +21 -0
  156. data/lib/protobuf/rpc/servers/socket/server.rb +111 -0
  157. data/lib/protobuf/rpc/servers/socket/worker.rb +66 -0
  158. data/lib/protobuf/rpc/servers/socket_runner.rb +27 -0
  159. data/lib/protobuf/rpc/servers/zmq/broker.rb +87 -0
  160. data/lib/protobuf/rpc/servers/zmq/server.rb +50 -0
  161. data/lib/protobuf/rpc/servers/zmq/util.rb +27 -0
  162. data/lib/protobuf/rpc/servers/zmq/worker.rb +60 -0
  163. data/lib/protobuf/rpc/servers/zmq_runner.rb +25 -0
  164. data/lib/protobuf/rpc/service.rb +173 -0
  165. data/lib/protobuf/rpc/service_dispatcher.rb +130 -0
  166. data/lib/protobuf/rpc/service_filters.rb +267 -0
  167. data/lib/protobuf/rpc/stat.rb +83 -0
  168. data/lib/protobuf/socket.rb +22 -0
  169. data/lib/protobuf/version.rb +4 -0
  170. data/lib/protobuf/wire_type.rb +10 -0
  171. data/lib/protobuf/zmq.rb +21 -0
  172. data/lib/protobuf.rb +86 -0
  173. data/proto/rpc.pb.rb +48 -0
  174. data/proto/rpc.proto +73 -0
  175. data/protobuf.gemspec +44 -0
  176. data/spec/benchmark/tasks.rb +179 -0
  177. data/spec/functional/embedded_service_spec.rb +7 -0
  178. data/spec/functional/evented_server_spec.rb +64 -0
  179. data/spec/functional/socket_server_spec.rb +58 -0
  180. data/spec/functional/zmq_server_spec.rb +58 -0
  181. data/spec/lib/protobuf/cli_spec.rb +212 -0
  182. data/spec/lib/protobuf/enum_spec.rb +98 -0
  183. data/spec/lib/protobuf/enum_value_spec.rb +15 -0
  184. data/spec/lib/protobuf/logger_spec.rb +131 -0
  185. data/spec/lib/protobuf/message/encoder_spec.rb +19 -0
  186. data/spec/lib/protobuf/message_spec.rb +209 -0
  187. data/spec/lib/protobuf/rpc/client_spec.rb +158 -0
  188. data/spec/lib/protobuf/rpc/connector_spec.rb +32 -0
  189. data/spec/lib/protobuf/rpc/connectors/base_spec.rb +50 -0
  190. data/spec/lib/protobuf/rpc/connectors/common_spec.rb +128 -0
  191. data/spec/lib/protobuf/rpc/connectors/socket_spec.rb +36 -0
  192. data/spec/lib/protobuf/rpc/connectors/zmq_spec.rb +22 -0
  193. data/spec/lib/protobuf/rpc/servers/evented_server_spec.rb +18 -0
  194. data/spec/lib/protobuf/rpc/servers/socket_server_spec.rb +43 -0
  195. data/spec/lib/protobuf/rpc/servers/zmq/broker_spec.rb +35 -0
  196. data/spec/lib/protobuf/rpc/servers/zmq/server_spec.rb +41 -0
  197. data/spec/lib/protobuf/rpc/servers/zmq/util_spec.rb +45 -0
  198. data/spec/lib/protobuf/rpc/servers/zmq/worker_spec.rb +44 -0
  199. data/spec/lib/protobuf/rpc/service_dispatcher_spec.rb +116 -0
  200. data/spec/lib/protobuf/rpc/service_filters_spec.rb +451 -0
  201. data/spec/lib/protobuf/rpc/service_spec.rb +165 -0
  202. data/spec/lib/protobuf_spec.rb +62 -0
  203. data/spec/spec_helper.rb +51 -0
  204. data/spec/support/all.rb +6 -0
  205. data/spec/support/server.rb +101 -0
  206. data/spec/support/test/enum.pb.rb +34 -0
  207. data/spec/support/test/enum.proto +12 -0
  208. data/spec/support/test/resource.pb.rb +58 -0
  209. data/spec/support/test/resource.proto +31 -0
  210. data/spec/support/test/resource_service.rb +14 -0
  211. data/spec/support/test_app_file.rb +2 -0
  212. data/spec/support/tolerance_matcher.rb +40 -0
  213. data/test/data/data.bin +3 -0
  214. data/test/data/data_source.py +14 -0
  215. data/test/data/types.bin +0 -0
  216. data/test/data/types_source.py +22 -0
  217. data/test/data/unk.png +0 -0
  218. data/test/proto/addressbook.pb.rb +66 -0
  219. data/test/proto/addressbook.proto +33 -0
  220. data/test/proto/addressbook_base.pb.rb +58 -0
  221. data/test/proto/addressbook_base.proto +26 -0
  222. data/test/proto/addressbook_ext.pb.rb +20 -0
  223. data/test/proto/addressbook_ext.proto +6 -0
  224. data/test/proto/collision.pb.rb +17 -0
  225. data/test/proto/collision.proto +5 -0
  226. data/test/proto/ext_collision.pb.rb +24 -0
  227. data/test/proto/ext_collision.proto +8 -0
  228. data/test/proto/ext_range.pb.rb +22 -0
  229. data/test/proto/ext_range.proto +7 -0
  230. data/test/proto/float_default.proto +10 -0
  231. data/test/proto/lowercase.pb.rb +30 -0
  232. data/test/proto/lowercase.proto +9 -0
  233. data/test/proto/merge.pb.rb +39 -0
  234. data/test/proto/merge.proto +15 -0
  235. data/test/proto/nested.pb.rb +30 -0
  236. data/test/proto/nested.proto +9 -0
  237. data/test/proto/optional_field.pb.rb +35 -0
  238. data/test/proto/optional_field.proto +12 -0
  239. data/test/proto/packed.pb.rb +22 -0
  240. data/test/proto/packed.proto +6 -0
  241. data/test/proto/rpc.proto +6 -0
  242. data/test/proto/types.pb.rb +84 -0
  243. data/test/proto/types.proto +37 -0
  244. data/test/test_addressbook.rb +56 -0
  245. data/test/test_enum_value.rb +41 -0
  246. data/test/test_extension.rb +36 -0
  247. data/test/test_lowercase.rb +11 -0
  248. data/test/test_message.rb +128 -0
  249. data/test/test_optional_field.rb +103 -0
  250. data/test/test_packed_field.rb +40 -0
  251. data/test/test_parse.rb +15 -0
  252. data/test/test_repeated_types.rb +132 -0
  253. data/test/test_serialize.rb +61 -0
  254. data/test/test_standard_message.rb +96 -0
  255. data/test/test_types.rb +226 -0
  256. metadata +461 -0
@@ -0,0 +1,50 @@
1
+ require 'protobuf/field/varint_field'
2
+
3
+ module Protobuf
4
+ module Field
5
+ class EnumField < VarintField
6
+ def acceptable?(val)
7
+ case val
8
+ when Symbol then
9
+ raise TypeError unless @type.const_defined?(val)
10
+ when EnumValue then
11
+ raise TypeError if val.parent_class != @type
12
+ else
13
+ raise TypeError unless @type.valid_tag?(val)
14
+ end
15
+ true
16
+ end
17
+
18
+ def encode(value)
19
+ super(value.to_i)
20
+ end
21
+
22
+ private
23
+
24
+ def typed_default_value
25
+ if @default.is_a?(Symbol)
26
+ @type.const_get(@default)
27
+ else
28
+ self.class.default
29
+ end
30
+ end
31
+
32
+ def define_setter
33
+ field = self
34
+ @message_class.class_eval do
35
+ define_method("#{field.name}=") do |value|
36
+ orig_value = value
37
+ if value.nil?
38
+ @values.delete(field.name)
39
+ else
40
+ value = field.type.fetch(value)
41
+ raise TypeError, "Invalid ENUM value: #{orig_value.inspect} for #{field.name}" unless value
42
+
43
+ @values[field.name] = value
44
+ end
45
+ end
46
+ end
47
+ end
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,32 @@
1
+ module Protobuf
2
+ module Field
3
+ class ExtensionFields < Array
4
+ ##
5
+ # Constructor
6
+ #
7
+ def initialize
8
+ @ranges = []
9
+ end
10
+
11
+ ##
12
+ # Public Instance Methods
13
+ #
14
+
15
+ # Append a range to the list of ranges.
16
+ def add_range(range = (0..-1))
17
+ @ranges << range
18
+ end
19
+
20
+ # Set value at tag location, if tag is in a valid range.
21
+ def []=(key, value)
22
+ raise RangeError, "#{key} is not in #{@ranges.join(', ')}" unless include_tag?(key)
23
+ super
24
+ end
25
+
26
+ # Check if the given tag exists in any of the defined ranges.
27
+ def include_tag?(tag)
28
+ @ranges.any? { |range| range.include?(tag) }
29
+ end
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,65 @@
1
+ module Protobuf
2
+ module Field
3
+ class FieldArray < Array
4
+ ##
5
+ # Constructor
6
+ #
7
+ def initialize(field)
8
+ @field = field
9
+ end
10
+
11
+ ##
12
+ # Public Instance Methods
13
+ #
14
+ def []=(nth, val)
15
+ super(nth, normalize(val))
16
+ end
17
+
18
+ def <<(val)
19
+ super(normalize(val))
20
+ end
21
+
22
+ def push(val)
23
+ super(normalize(val))
24
+ end
25
+
26
+ def unshift(val)
27
+ super(normalize(val))
28
+ end
29
+
30
+ def replace(val)
31
+ raise TypeError unless val.is_a?(Array)
32
+ val = val.map { |v| normalize(v)}
33
+ super(val)
34
+ end
35
+
36
+ # Return a hash-representation of the given values for this field type.
37
+ # The value in this case would be an array.
38
+ def to_hash_value
39
+ self.map do |value|
40
+ value.respond_to?(:to_hash_value) ? value.to_hash_value : value
41
+ end
42
+ end
43
+
44
+ def to_s
45
+ "[#{@field.name}]"
46
+ end
47
+
48
+ private
49
+
50
+ ##
51
+ # Private Instance Methods
52
+ #
53
+ def normalize(value)
54
+ raise TypeError unless @field.acceptable?(value)
55
+ if @field.is_a?(::Protobuf::Field::EnumField)
56
+ @field.type.fetch(value)
57
+ elsif @field.is_a?(::Protobuf::Field::MessageField) && value.respond_to?(:to_hash)
58
+ @field.type.new(value.to_hash)
59
+ else
60
+ value
61
+ end
62
+ end
63
+ end
64
+ end
65
+ end
@@ -0,0 +1,19 @@
1
+ require 'protobuf/field/uint32_field.rb'
2
+
3
+ module Protobuf
4
+ module Field
5
+ class Fixed32Field < Uint32Field
6
+ def wire_type
7
+ ::Protobuf::WireType::FIXED32
8
+ end
9
+
10
+ def decode(bytes)
11
+ bytes.unpack('V').first
12
+ end
13
+
14
+ def encode(value)
15
+ [value].pack('V')
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,22 @@
1
+ require 'protobuf/field/uint64_field'
2
+
3
+ module Protobuf
4
+ module Field
5
+ class Fixed64Field < Uint64Field
6
+ def wire_type
7
+ ::Protobuf::WireType::FIXED64
8
+ end
9
+
10
+ def decode(bytes)
11
+ # we don't use 'Q' for pack/unpack. 'Q' is machine-dependent.
12
+ values = bytes.unpack('VV')
13
+ values[0] + (values[1] << 32)
14
+ end
15
+
16
+ def encode(value)
17
+ # we don't use 'Q' for pack/unpack. 'Q' is machine-dependent.
18
+ [value & 0xffff_ffff, value >> 32].pack('VV')
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,31 @@
1
+ require 'protobuf/field/base_field'
2
+
3
+ module Protobuf
4
+ module Field
5
+ class FloatField < BaseField
6
+ def self.default; 0.0; end
7
+ def self.max; 1.0/0; end
8
+ def self.min; -1.0/0; end
9
+ def max; 1.0/0; end
10
+ def min; -1.0/0; end
11
+
12
+ def wire_type
13
+ WireType::FIXED32
14
+ end
15
+
16
+ def decode(bytes)
17
+ bytes.unpack('e').first
18
+ end
19
+
20
+ def encode(value)
21
+ [value].pack('e')
22
+ end
23
+
24
+ def acceptable?(val)
25
+ raise TypeError, val.class.name unless val.is_a?(Numeric)
26
+ raise RangeError if val < min || max < val
27
+ true
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,12 @@
1
+ require 'protobuf/field/integer_field'
2
+
3
+ module Protobuf
4
+ module Field
5
+ class Int32Field < IntegerField
6
+ def self.max; INT32_MAX; end
7
+ def self.min; INT32_MIN; end
8
+ def max; INT32_MAX; end
9
+ def min; INT32_MIN; end
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,12 @@
1
+ require 'protobuf/field/integer_field'
2
+
3
+ module Protobuf
4
+ module Field
5
+ class Int64Field < IntegerField
6
+ def self.max; INT64_MAX; end
7
+ def self.min; INT64_MIN; end
8
+ def max; INT64_MAX; end
9
+ def min; INT64_MIN; end
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,19 @@
1
+ require 'protobuf/field/varint_field'
2
+
3
+ module Protobuf
4
+ module Field
5
+ class IntegerField < VarintField
6
+
7
+ def encode(value)
8
+ # original Google's library uses 64bits integer for negative value
9
+ VarintField.encode(value & 0xffff_ffff_ffff_ffff)
10
+ end
11
+
12
+ def decode(value)
13
+ value -= 0x1_0000_0000_0000_0000 if (value & 0x8000_0000_0000_0000).nonzero?
14
+ value
15
+ end
16
+
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,53 @@
1
+ require 'protobuf/field/base_field'
2
+
3
+ module Protobuf
4
+ module Field
5
+ class MessageField < BaseField
6
+ RAISE_TYPE = lambda { |field, val| raise TypeError, "Expected value of type '#{field.type}', but got '#{val.class}'" }
7
+
8
+ ##
9
+ # Public Instance Methods
10
+ #
11
+ def acceptable?(val)
12
+ RAISE_TYPE.call(self, val) unless val.instance_of?(type) || val.respond_to?(:to_hash)
13
+ true
14
+ end
15
+
16
+ def decode(bytes)
17
+ message = type.new
18
+ message.parse_from_string(bytes)
19
+ message
20
+ end
21
+
22
+ def encode(value)
23
+ bytes = value.serialize_to_string
24
+ result = VarintField.encode(bytes.size)
25
+ result << bytes
26
+ end
27
+
28
+ def wire_type
29
+ ::Protobuf::WireType::LENGTH_DELIMITED
30
+ end
31
+
32
+ private
33
+
34
+ def define_setter
35
+ field = self
36
+ @message_class.class_eval do
37
+ define_method("#{field.name}=") do |val|
38
+ case
39
+ when val.nil? then
40
+ @values.delete(field.name)
41
+ when val.is_a?(field.type) then
42
+ @values[field.name] = val
43
+ when val.respond_to?(:to_hash) then
44
+ @values[field.name] = field.type.new(val.to_hash)
45
+ else
46
+ RAISE_TYPE.call(field, val)
47
+ end
48
+ end
49
+ end
50
+ end
51
+ end
52
+ end
53
+ end
@@ -0,0 +1,21 @@
1
+ require 'protobuf/field/int32_field'
2
+
3
+ module Protobuf
4
+ module Field
5
+ class Sfixed32Field < Int32Field
6
+ def wire_type
7
+ ::Protobuf::WireType::FIXED32
8
+ end
9
+
10
+ def decode(bytes)
11
+ value = bytes.unpack('V').first
12
+ value -= 0x1_0000_0000 if (value & 0x8000_0000).nonzero?
13
+ value
14
+ end
15
+
16
+ def encode(value)
17
+ [value].pack('V')
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,24 @@
1
+ require 'protobuf/field/int64_field'
2
+
3
+ module Protobuf
4
+ module Field
5
+ class Sfixed64Field < Int64Field
6
+ def wire_type
7
+ ::Protobuf::WireType::FIXED64
8
+ end
9
+
10
+ def decode(bytes)
11
+ # we don't use 'Q' for pack/unpack. 'Q' is machine-dependent.
12
+ values = bytes.unpack('VV')
13
+ value = values[0] + (values[1] << 32)
14
+ value -= 0x1_0000_0000_0000_0000 if (value & 0x8000_0000_0000_0000).nonzero?
15
+ value
16
+ end
17
+
18
+ def encode(value)
19
+ # we don't use 'Q' for pack/unpack. 'Q' is machine-dependent.
20
+ [value & 0xffff_ffff, value >> 32].pack('VV')
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,23 @@
1
+ require 'protobuf/field/varint_field'
2
+
3
+ module Protobuf
4
+ module Field
5
+ class SignedIntegerField < VarintField
6
+ def decode(value)
7
+ if (value & 1).zero?
8
+ value >> 1 # positive value
9
+ else
10
+ ~value >> 1 # negative value
11
+ end
12
+ end
13
+
14
+ def encode(value)
15
+ if value >= 0
16
+ VarintField.encode(value << 1)
17
+ else
18
+ VarintField.encode(~(value << 1))
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,12 @@
1
+ require 'protobuf/field/signed_integer_field'
2
+
3
+ module Protobuf
4
+ module Field
5
+ class Sint32Field < SignedIntegerField
6
+ def self.max; INT32_MAX; end
7
+ def self.min; INT32_MIN; end
8
+ def max; INT32_MAX; end
9
+ def min; INT32_MIN; end
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,12 @@
1
+ require 'protobuf/field/signed_integer_field'
2
+
3
+ module Protobuf
4
+ module Field
5
+ class Sint64Field < SignedIntegerField
6
+ def self.max; INT64_MAX; end
7
+ def self.min; INT64_MIN; end
8
+ def max; INT64_MAX; end
9
+ def min; INT64_MIN; end
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,14 @@
1
+ require 'protobuf/field/bytes_field'
2
+
3
+ module Protobuf
4
+ module Field
5
+ class StringField < BytesField
6
+ ENCODING = 'UTF-8'.freeze
7
+
8
+ def decode(bytes)
9
+ bytes.force_encoding(::Protobuf::Field::StringField::ENCODING) if bytes.respond_to?(:force_encoding)
10
+ bytes
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,12 @@
1
+ require 'protobuf/field/varint_field'
2
+
3
+ module Protobuf
4
+ module Field
5
+ class Uint32Field < VarintField
6
+ def self.max; UINT32_MAX; end
7
+ def self.min; 0; end
8
+ def max; UINT32_MAX; end
9
+ def min; 0; end
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,12 @@
1
+ require 'protobuf/field/varint_field'
2
+
3
+ module Protobuf
4
+ module Field
5
+ class Uint64Field < VarintField
6
+ def self.max; UINT64_MAX; end
7
+ def self.min; 0; end
8
+ def max; UINT64_MAX; end
9
+ def min; 0; end
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,61 @@
1
+ require 'protobuf/field/base_field'
2
+
3
+ module Protobuf
4
+ module Field
5
+ class VarintField < BaseField
6
+ INT32_MAX = 2**31 - 1
7
+ INT32_MIN = -2**31
8
+ INT64_MAX = 2**63 - 1
9
+ INT64_MIN = -2**63
10
+ UINT32_MAX = 2**32 - 1
11
+ UINT64_MAX = 2**64 - 1
12
+
13
+ ##
14
+ # Class Methods
15
+ #
16
+ def self.default
17
+ 0
18
+ end
19
+
20
+ def self.decode(bytes)
21
+ value = 0
22
+ bytes.each_with_index do |byte, index|
23
+ value |= byte << (7 * index)
24
+ end
25
+ value
26
+ end
27
+
28
+ def self.encode(value)
29
+ return [value].pack('C') if value < 128
30
+
31
+ bytes = []
32
+ until value == 0
33
+ bytes << (0x80 | (value & 0x7f))
34
+ value >>= 7
35
+ end
36
+ bytes[-1] &= 0x7f
37
+ bytes.pack('C*')
38
+ end
39
+
40
+ ##
41
+ # Public Instance Methods
42
+ #
43
+ def acceptable?(val)
44
+ (val > min || val < max) rescue false
45
+ end
46
+
47
+ def decode(value)
48
+ value
49
+ end
50
+
51
+ def encode(value)
52
+ self.class.encode(value)
53
+ end
54
+
55
+ def wire_type
56
+ ::Protobuf::WireType::VARINT
57
+ end
58
+
59
+ end
60
+ end
61
+ end
@@ -0,0 +1,57 @@
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
+ require 'protobuf/field/extension_fields'
23
+
24
+ module Protobuf
25
+ module Field
26
+ PREDEFINED_TYPES = [
27
+ ::Protobuf::Field::DoubleField,
28
+ ::Protobuf::Field::FloatField,
29
+ ::Protobuf::Field::Int32Field,
30
+ ::Protobuf::Field::Int64Field,
31
+ ::Protobuf::Field::Uint32Field,
32
+ ::Protobuf::Field::Uint64Field,
33
+ ::Protobuf::Field::Sint32Field,
34
+ ::Protobuf::Field::Sint64Field,
35
+ ::Protobuf::Field::Fixed32Field,
36
+ ::Protobuf::Field::Fixed64Field,
37
+ ::Protobuf::Field::Sfixed32Field,
38
+ ::Protobuf::Field::Sfixed64Field,
39
+ ::Protobuf::Field::StringField,
40
+ ::Protobuf::Field::BytesField,
41
+ ::Protobuf::Field::BoolField
42
+ ].freeze
43
+
44
+ def self.build(message_class, rule, type, name, tag, options = {})
45
+ field_class = type_message_or_enum(type)
46
+ field_class.new(message_class, rule, type, name, tag, options)
47
+ end
48
+
49
+ def self.type_message_or_enum(defined_type)
50
+ return defined_type if ::Protobuf::Field::PREDEFINED_TYPES.include?(defined_type)
51
+ return EnumField if defined_type < Enum
52
+ return MessageField if defined_type < Message
53
+ raise "lost in the wilderness #{defined_type}"
54
+ end
55
+
56
+ end
57
+ end
@@ -0,0 +1,86 @@
1
+ require 'logger'
2
+
3
+ module Protobuf
4
+ class Logger < ::Logger
5
+
6
+ class << self
7
+ attr_accessor :file, :level
8
+
9
+ # Stub out the log methods for Protobuf::Logger as singleton methods
10
+ [:debug, :info, :warn, :error, :fatal, :any, :add, :log].each do |m|
11
+ define_method(m) do |*params, &block|
12
+ instance && instance.__send__(m, *params, &block)
13
+ end
14
+ end
15
+ end
16
+
17
+ # One-line file/level configuration
18
+ def self.configure(options)
19
+ self.file = options.fetch(:file, false)
20
+ self.level = options.fetch(:level, false)
21
+ end
22
+
23
+ # Use to reset the instance
24
+ def self.reset_device!
25
+ self.file = self.level = @__instance = nil
26
+ end
27
+
28
+ # Singleton instance
29
+ def self.instance
30
+ @__instance ||= begin
31
+ log = nil
32
+
33
+ if @file && @level
34
+ log = new(self.file)
35
+ log.level = self.level
36
+ end
37
+
38
+ log
39
+ end
40
+ end
41
+
42
+ #
43
+ # LogMethods module for log method including, e.g.:
44
+ #
45
+ # class MyClass
46
+ # include Protobuf::Logger::LogMethods
47
+ # ...
48
+ # end
49
+ #
50
+ # Produce a module to allow "include" in other classes to avoid
51
+ # cluttering the namespace of the including class with the other methods defined above
52
+ #
53
+ module LogMethods
54
+ [:debug, :info, :warn, :error, :fatal, :any, :add, :log].each do |m|
55
+ define_method("log_#{m}") do |*params, &block|
56
+ params.map! { |message| sign_message(message) }
57
+ ::Protobuf::Logger.__send__(m, *params, &block)
58
+ end
59
+ end
60
+
61
+ # When included, also extend the LogMethods module for class access.
62
+ def self.included(base)
63
+ base.extend(LogMethods)
64
+ end
65
+
66
+ # We often want to log an exception, so let's make that a core
67
+ # concern of the logger.
68
+ #
69
+ def log_exception(ex)
70
+ log_error { ex.message }
71
+ log_error { ex.backtrace[0..5].join("\n") }
72
+ log_debug { ex.backtrace.join("\n") }
73
+ end
74
+
75
+ def log_signature
76
+ @_log_signature ||= "[#{self.class == Class ? self.name : self.class.name}]"
77
+ end
78
+
79
+ def sign_message(message)
80
+ "#{log_signature} #{message}"
81
+ end
82
+
83
+ end
84
+
85
+ end
86
+ end