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,83 @@
1
+ require 'protobuf/wire_type'
2
+ require 'protobuf/exceptions'
3
+
4
+ module Protobuf
5
+
6
+ module Decoder
7
+
8
+ module_function
9
+
10
+ # Read bytes from +stream+ and pass to +message+ object.
11
+ def decode(stream, message)
12
+ until stream.eof?
13
+ tag, wire_type = read_key(stream)
14
+ bytes =
15
+ case wire_type
16
+ when WireType::VARINT then
17
+ read_varint(stream)
18
+ when WireType::FIXED64 then
19
+ read_fixed64(stream)
20
+ when WireType::LENGTH_DELIMITED then
21
+ read_length_delimited(stream)
22
+ when WireType::START_GROUP then
23
+ read_start_group(stream)
24
+ when WireType::END_GROUP then
25
+ read_end_group(stream)
26
+ when WireType::FIXED32 then
27
+ read_fixed32(stream)
28
+ else
29
+ raise InvalidWireType, wire_type
30
+ end
31
+ message.set_field(tag, bytes)
32
+ end
33
+ message
34
+ end
35
+
36
+ # Read key pair (tag and wire-type) from +stream+.
37
+ def read_key(stream)
38
+ bits = read_varint(stream)
39
+ wire_type = bits & 0x07
40
+ tag = bits >> 3
41
+ [tag, wire_type]
42
+ end
43
+
44
+ # Read varint integer value from +stream+.
45
+ def read_varint(stream)
46
+ read_method = stream.respond_to?(:readbyte) ? :readbyte : :readchar
47
+ value = index = 0
48
+ begin
49
+ byte = stream.__send__(read_method)
50
+ value |= (byte & 0x7f) << (7 * index)
51
+ index += 1
52
+ end while (byte & 0x80).nonzero?
53
+ value
54
+ end
55
+
56
+ # Read 32-bit string value from +stream+.
57
+ def read_fixed32(stream)
58
+ stream.read(4)
59
+ end
60
+
61
+ # Read 64-bit string value from +stream+.
62
+ def read_fixed64(stream)
63
+ stream.read(8)
64
+ end
65
+
66
+ # Read length-delimited string value from +stream+.
67
+ def read_length_delimited(stream)
68
+ value_length = read_varint(stream)
69
+ stream.read(value_length)
70
+ end
71
+
72
+ # Not implemented.
73
+ def read_start_group(stream)
74
+ raise NotImplementedError, 'Group is deprecated.'
75
+ end
76
+
77
+ # Not implemented.
78
+ def read_end_group(stream)
79
+ raise NotImplementedError, 'Group is deprecated.'
80
+ end
81
+
82
+ end
83
+ end
@@ -0,0 +1,48 @@
1
+ require 'protobuf/wire_type'
2
+ require 'protobuf/exceptions'
3
+
4
+ module Protobuf
5
+
6
+ module Encoder
7
+
8
+ module_function
9
+
10
+ # Encode +message+ and write to +stream+.
11
+ def encode(stream, message)
12
+ # FIXME make this not as ghetto
13
+ unless message.initialized?
14
+ raise NotInitializedError, "Message #{message.class.name} is not initialized (one or more fields is improperly set): #{JSON.parse(message.to_json)}"
15
+ end
16
+
17
+ message.each_field do |field, value|
18
+ next unless message.has_field?(field.name)
19
+
20
+ if field.repeated?
21
+ if field.packed?
22
+ key = (field.tag << 3) | WireType::LENGTH_DELIMITED
23
+ packed_value = value.map {|val| field.encode(val) }.join
24
+ stream.write(Field::VarintField.encode(key))
25
+ stream.write(Field::VarintField.encode(packed_value.size))
26
+ stream.write(packed_value)
27
+ else
28
+ value.each do |val|
29
+ write_pair(stream, field, val)
30
+ end
31
+ end
32
+ else
33
+ write_pair(stream, field, value)
34
+ end
35
+ end
36
+ end
37
+
38
+ # Encode key and value, and write to +stream+.
39
+ def write_pair(stream, field, value)
40
+ key = (field.tag << 3) | field.wire_type
41
+ key_bytes = Field::VarintField.encode(key)
42
+ stream.write(key_bytes)
43
+ bytes = field.encode(value)
44
+ stream.write(bytes)
45
+ end
46
+
47
+ end
48
+ end
@@ -0,0 +1,8 @@
1
+ require 'protobuf/message/message'
2
+
3
+ module Protobuf
4
+ class Extend < Message
5
+ MIN = -1.0/0
6
+ MAX = 1.0/0
7
+ end
8
+ end
@@ -0,0 +1 @@
1
+ require 'protobuf/message' # Need to get rid of this
@@ -0,0 +1,320 @@
1
+ require 'set'
2
+ require 'protobuf/field'
3
+ require 'protobuf/enum'
4
+ require 'protobuf/message/decoder'
5
+ require 'protobuf/message/encoder'
6
+
7
+ module Protobuf
8
+ class Message
9
+ ##
10
+ # Error Classes
11
+ #
12
+ class FieldNotDefinedError < StandardError; end
13
+
14
+ ##
15
+ # Constants
16
+ #
17
+ STRING_ENCODING = "ASCII-8BIT".freeze
18
+
19
+ ##
20
+ # Class Methods
21
+ #
22
+ def self.all_fields
23
+ @all_fields ||= begin
24
+ all_fields_array = []
25
+ max_fields = fields.size > extension_fields.size ? fields.size : extension_fields.size
26
+ max_fields.times do |field_number|
27
+ all_fields_array << (fields[field_number] || extension_fields[field_number])
28
+ end
29
+ all_fields_array.compact!
30
+ all_fields_array
31
+ end
32
+ end
33
+
34
+ # Define a field. Don't use this method directly.
35
+ def self.define_field(rule, type, fname, tag, options)
36
+ field_array = options[:extension] ? extension_fields : fields
37
+ field_name_hash = options[:extension] ? extension_field_name_to_tag : field_name_to_tag
38
+
39
+ if field_array[tag]
40
+ raise TagCollisionError, %!{Field number #{tag} has already been used in "#{self.name}" by field "#{fname}".!
41
+ end
42
+
43
+ field_definition = Field.build(self, rule, type, fname, tag, options)
44
+ field_name_hash[fname] = tag
45
+ field_array[tag] = field_definition
46
+ end
47
+
48
+ # Reserve field numbers for extensions. Don't use this method directly.
49
+ def self.extensions(range)
50
+ extension_fields.add_range(range)
51
+ end
52
+
53
+ def self.extension_field_name_to_tag
54
+ @extension_fields_by_name ||= {}
55
+ end
56
+
57
+ # An extension field object.
58
+ def self.extension_fields
59
+ @extension_fields ||= ::Protobuf::Field::ExtensionFields.new
60
+ end
61
+
62
+ def self.extension_tag?(tag)
63
+ extension_fields.include_tag?(tag)
64
+ end
65
+
66
+ # A collection of field object.
67
+ def self.fields
68
+ @fields ||= []
69
+ end
70
+
71
+ def self.field_name_to_tag
72
+ @field_name_to_tag ||= {}
73
+ end
74
+
75
+ def self.get_ext_field_by_name(name)
76
+ # Check if the name has been used before, if not then set it to the sym value
77
+ extension_fields[extension_field_name_to_tag[name.to_sym]]
78
+ rescue TypeError, NoMethodError => e
79
+ name = 'nil' if name.nil?
80
+ raise FieldNotDefinedError.new("Field '#{name}' is not defined on message '#{self.name}'")
81
+ end
82
+
83
+ def self.get_ext_field_by_tag(tag)
84
+ extension_fields[tag]
85
+ end
86
+
87
+ # Find a field object by +name+.
88
+ def self.get_field_by_name(name)
89
+ # Check if the name has been used before, if not then set it to the sym value
90
+ fields[field_name_to_tag[name.to_sym]]
91
+ rescue TypeError, NoMethodError => e
92
+ name = 'nil' if name.nil?
93
+ raise FieldNotDefinedError.new("Field '#{name}' is not defined on message '#{self.name}'")
94
+ end
95
+
96
+ # Find a field object by +tag+ number.
97
+ def self.get_field_by_tag(tag)
98
+ fields[tag]
99
+ rescue TypeError => e
100
+ tag = tag.nil? ? 'nil' : tag.to_s
101
+ raise FieldNotDefinedError.new("Tag '#{tag}' does not reference a message field for '#{self.name}'")
102
+ end
103
+
104
+ # Define a optional field. Don't use this method directly.
105
+ def self.optional(type, name, tag, options = {})
106
+ define_field(:optional, type, name, tag, options)
107
+ end
108
+
109
+ # Define a repeated field. Don't use this method directly.
110
+ def self.repeated(type, name, tag, options = {})
111
+ define_field(:repeated, type, name, tag, options)
112
+ end
113
+
114
+ # Define a required field. Don't use this method directly.
115
+ def self.required(type, name, tag, options = {})
116
+ define_field(:required, type, name, tag, options)
117
+ end
118
+
119
+ ##
120
+ # Constructor
121
+ #
122
+ def initialize(values = {})
123
+ @values = {}
124
+ values = values.to_hash
125
+ values.each { |name, val| self[name] = val unless val.nil? }
126
+ end
127
+
128
+ ##
129
+ # Public Instance Methods
130
+ #
131
+ def all_fields
132
+ self.class.all_fields
133
+ end
134
+
135
+ def clear!
136
+ @values.delete_if do |_, value|
137
+ if value.is_a?(Field::FieldArray)
138
+ value.clear
139
+ false
140
+ else
141
+ true
142
+ end
143
+ end
144
+ self
145
+ end
146
+
147
+ def clone
148
+ copy_to(super, :clone)
149
+ end
150
+
151
+ def dup
152
+ copy_to(super, :dup)
153
+ end
154
+
155
+ # Iterate over a field collection.
156
+ # message.each_field do |field_object, value|
157
+ # # do something
158
+ # end
159
+ def each_field
160
+ all_fields.each do |field|
161
+ value = __send__(field.name)
162
+ yield(field, value)
163
+ end
164
+ end
165
+
166
+ # Returns extension fields. See Message#fields method.
167
+ def extension_fields
168
+ self.class.extension_fields
169
+ end
170
+
171
+ def fields
172
+ self.class.fields
173
+ end
174
+
175
+ def get_ext_field_by_name(name) # :nodoc:
176
+ self.class.get_ext_field_by_name(name)
177
+ end
178
+
179
+ def get_ext_field_by_tag(tag) # :nodoc:
180
+ self.class.get_ext_field_by_tag(tag)
181
+ end
182
+
183
+ # Returns field object or +nil+.
184
+ def get_field_by_name(name)
185
+ self.class.get_field_by_name(name)
186
+ end
187
+
188
+ # Returns field object or +nil+.
189
+ def get_field_by_tag(tag)
190
+ self.class.get_field_by_tag(tag)
191
+ end
192
+
193
+ def has_field?(name)
194
+ @values.has_key?(name)
195
+ end
196
+
197
+ def initialized?
198
+ all_fields.all? { |field| field.initialized?(self) }
199
+ end
200
+
201
+ def inspect
202
+ to_hash.inspect
203
+ end
204
+
205
+ def parse_from_string(string)
206
+ parse_from(StringIO.new(string))
207
+ end
208
+
209
+ def parse_from(stream)
210
+ Decoder.decode(stream, self)
211
+ end
212
+
213
+ def respond_to_has?(key)
214
+ self.respond_to?(key) && self.has_field?(key)
215
+ end
216
+
217
+ def respond_to_has_and_present?(key)
218
+ self.respond_to_has?(key) &&
219
+ (self.__send__(key).present? || [true, false].include?(self.__send__(key)))
220
+ end
221
+
222
+ def serialize_to(stream)
223
+ Encoder.encode(stream, self)
224
+ end
225
+
226
+ def serialize_to_string(string='')
227
+ io = StringIO.new(string)
228
+ serialize_to(io)
229
+ result = io.string
230
+ result.force_encoding(::Protobuf::Message::STRING_ENCODING) if result.respond_to?(:force_encoding)
231
+ result
232
+ end
233
+
234
+ def set_field(tag, bytes)
235
+ field = (get_field_by_tag(tag) || get_ext_field_by_tag(tag))
236
+ field.set(self, bytes) if field
237
+ end
238
+
239
+ # Return a hash-representation of the given fields for this message type.
240
+ def to_hash
241
+ result = Hash.new
242
+
243
+ @values.keys.each do |field_name|
244
+ value = __send__(field_name)
245
+ hashed_value = value.respond_to?(:to_hash_value) ? value.to_hash_value : value
246
+ result.merge!(field_name => hashed_value)
247
+ end
248
+
249
+ return result
250
+ end
251
+
252
+ def to_json
253
+ to_hash.to_json
254
+ end
255
+
256
+ def ==(obj)
257
+ return false unless obj.is_a?(self.class)
258
+ each_field do |field, value|
259
+ return false unless value == obj.__send__(field.name)
260
+ end
261
+ true
262
+ end
263
+
264
+ def [](name)
265
+ if field = get_field_by_name(name) || get_ext_field_by_name(name)
266
+ __send__(field.name)
267
+ else
268
+ raise NoMethodError, "No such field: #{name.inspect}"
269
+ end
270
+ end
271
+
272
+ def []=(name, value)
273
+ if field = get_field_by_name(name) || get_ext_field_by_name(name)
274
+ __send__(field.setter_method_name, value)
275
+ else
276
+ raise NoMethodError, "No such field: #{name.inspect}"
277
+ end
278
+ end
279
+
280
+ ##
281
+ # Instance Aliases
282
+ #
283
+ alias_method :to_hash_value, :to_hash
284
+ alias_method :to_s, :serialize_to_string
285
+ alias_method :responds_to_has?, :respond_to_has?
286
+ alias_method :respond_to_and_has?, :respond_to_has?
287
+ alias_method :responds_to_and_has?, :respond_to_has?
288
+ alias_method :respond_to_has_present?, :respond_to_has_and_present?
289
+ alias_method :respond_to_and_has_present?, :respond_to_has_and_present?
290
+ alias_method :respond_to_and_has_and_present?, :respond_to_has_and_present?
291
+ alias_method :responds_to_has_present?, :respond_to_has_and_present?
292
+ alias_method :responds_to_and_has_present?, :respond_to_has_and_present?
293
+ alias_method :responds_to_and_has_and_present?, :respond_to_has_and_present?
294
+
295
+ ##
296
+ # Private Instance Methods
297
+ #
298
+ private
299
+
300
+ def copy_to(object, method)
301
+ duplicate = proc { |obj|
302
+ case obj
303
+ when Message, String then obj.__send__(method)
304
+ else obj
305
+ end
306
+ }
307
+
308
+ object.__send__(:initialize)
309
+ @values.each do |name, value|
310
+ if value.is_a?(Field::FieldArray)
311
+ object.__send__(name).replace(value.map {|v| duplicate.call(v)})
312
+ else
313
+ object.__send__("#{name}=", duplicate.call(value))
314
+ end
315
+ end
316
+ object
317
+ end
318
+
319
+ end
320
+ end
@@ -0,0 +1,79 @@
1
+ module Protobuf
2
+ module Rpc
3
+ class Buffer
4
+
5
+ attr_accessor :mode, :data, :size
6
+
7
+ MODES = [:read, :write]
8
+
9
+ # constantize this so we don't re-initialize the regex every time we need it
10
+ SIZE_REGEX = /^\d+-/
11
+
12
+ def initialize(mode=:read)
13
+ @flush = false
14
+ @data = ""
15
+ @size = 0
16
+ self.mode = mode
17
+ end
18
+
19
+ def mode=(mode)
20
+ if MODES.include?(mode)
21
+ @mode = mode
22
+ else
23
+ @mode = :read
24
+ end
25
+ end
26
+
27
+ def write(force_mode=true)
28
+ if force_mode and reading?
29
+ mode = :write
30
+ elsif not force_mode and reading?
31
+ raise = 'You chose to write the buffer when in read mode'
32
+ end
33
+
34
+ @size = @data.length
35
+ "#{@size}-#{@data}"
36
+ end
37
+
38
+ def <<(data)
39
+ @data << data
40
+ if reading?
41
+ get_data_size
42
+ check_for_flush
43
+ end
44
+ end
45
+
46
+ def set_data(data)
47
+ @data = data.is_a?(::Protobuf::Message) ? data.serialize_to_string : data.to_s
48
+ @size = @data.size
49
+ end
50
+
51
+ def reading?
52
+ mode == :read
53
+ end
54
+
55
+ def writing?
56
+ mode == :write
57
+ end
58
+
59
+ def flushed?
60
+ @flush
61
+ end
62
+
63
+ def get_data_size
64
+ if @size == 0 || @data.match(SIZE_REGEX)
65
+ sliced_size = @data.slice!(SIZE_REGEX)
66
+ @size = sliced_size.gsub('-', '').to_i unless sliced_size.nil?
67
+ end
68
+ end
69
+
70
+ private
71
+
72
+ def check_for_flush
73
+ if !@size.nil? && @data.length == @size
74
+ @flush = true
75
+ end
76
+ end
77
+ end
78
+ end
79
+ end
@@ -0,0 +1,166 @@
1
+ require 'forwardable'
2
+ require 'protobuf'
3
+ require 'protobuf/logger'
4
+ require 'protobuf/rpc/error'
5
+ require 'protobuf/rpc/connector'
6
+
7
+ module Protobuf
8
+ module Rpc
9
+ class Client
10
+ extend Forwardable
11
+ include Protobuf::Logger::LogMethods
12
+
13
+ delegate [:options, :complete_cb, :success_cb, :failure_cb] => :@connector
14
+ attr_reader :connector
15
+
16
+ # Create a new client with default options (defined in ClientConnection)
17
+ # See Service#client for a more convenient way to create a client, as well
18
+ # as Client#method_missing defined below.
19
+ #
20
+ # request = WidgetFindRequest.new
21
+ # client = Client.new({
22
+ # :service => WidgetService,
23
+ # :method => "find",
24
+ # :request_type => "WidgetFindRequest",
25
+ # :response_type => "WidgetList",
26
+ # :request => request
27
+ # })
28
+ #
29
+ def initialize(options = {})
30
+ raise "Invalid client configuration. Service must be defined." if options[:service].nil?
31
+ @connector = Connector.connector_for_client.new(options)
32
+ log_debug { sign_message("Initialized with options: #{options.inspect}") }
33
+ end
34
+
35
+ def log_signature
36
+ @_log_signature ||= "client-#{self.class}"
37
+ end
38
+
39
+ # Set a complete callback on the client to return the object (self).
40
+ #
41
+ # client = Client.new(:service => WidgetService)
42
+ # client.on_complete {|obj| ... }
43
+ #
44
+ def on_complete(&complete_cb)
45
+ @connector.complete_cb = complete_cb
46
+ end
47
+
48
+ def on_complete=(callable)
49
+ if callable != nil && !callable.respond_to?(:call) && callable.arity != 1
50
+ raise "callable must take a single argument and respond to :call"
51
+ end
52
+
53
+ @connector.complete_cb = callable
54
+ end
55
+
56
+ # Set a failure callback on the client to return the
57
+ # error returned by the service, if any. If this callback
58
+ # is called, success_cb will NOT be called.
59
+ #
60
+ # client = Client.new(:service => WidgetService)
61
+ # client.on_failure {|err| ... }
62
+ #
63
+ def on_failure(&failure_cb)
64
+ @connector.failure_cb = failure_cb
65
+ end
66
+
67
+ def on_failure=(callable)
68
+ if callable != nil && !callable.respond_to?(:call) && callable.arity != 1
69
+ raise "Callable must take a single argument and respond to :call"
70
+ end
71
+
72
+ @connector.failure_cb = callable
73
+ end
74
+
75
+ # Set a success callback on the client to return the
76
+ # successful response from the service when it is returned.
77
+ # If this callback is called, failure_cb will NOT be called.
78
+ #
79
+ # client = Client.new(:service => WidgetService)
80
+ # client.on_success {|res| ... }
81
+ #
82
+ def on_success(&success_cb)
83
+ @connector.success_cb = success_cb
84
+ end
85
+
86
+ def on_success=(callable)
87
+ if callable != nil && !callable.respond_to?(:call) && callable.arity != 1
88
+ raise "Callable must take a single argument and respond to :call"
89
+ end
90
+
91
+ @connector.success_cb = callable
92
+ end
93
+
94
+ # Provides a mechanism to call the service method against the client
95
+ # which will automatically setup the service_class and method_name
96
+ # in the wrapper protobuf request.
97
+ #
98
+ # # The :find method is not defined by Client which will trigger method_missing
99
+ # Client.new(:service => WidgetService).find do |c|
100
+ # # This block will be invoked before the request is made
101
+ # # `c` in this case is the client object you created above
102
+ # c.on_success {|res| ... }
103
+ # c.on_failure {|err| ... }
104
+ # end
105
+ #
106
+ def method_missing(method_name, *params)
107
+ service = options[:service]
108
+ unless service.rpc_method?(method_name)
109
+ log_error { sign_message("#{service.name}##{method_name.to_s} not rpc method, passing to super") }
110
+ super(method_name, *params)
111
+ else
112
+ log_debug { sign_message("#{service.name}##{method_name.to_s}") }
113
+ rpc = service.rpcs[method_name.to_sym]
114
+
115
+ options[:request_type] = rpc.request_type
116
+ log_debug { sign_message("Request Type: #{options[:request_type].name}") }
117
+
118
+ options[:response_type] = rpc.response_type
119
+ log_debug { sign_message("Response Type: #{options[:response_type].name}") }
120
+
121
+ options[:method] = method_name.to_s
122
+ options[:request] = params[0].is_a?(Hash) ? options[:request_type].new(params[0]) : params[0]
123
+ log_debug { sign_message("Request Data: #{options[:request].inspect}") }
124
+
125
+ # Call client to setup on_success and on_failure event callbacks
126
+ if block_given?
127
+ log_debug { sign_message("client setup callback given, invoking") }
128
+ yield(self)
129
+ else
130
+ log_debug { sign_message("no block given for callbacks") }
131
+ end
132
+
133
+ send_request
134
+ end
135
+ end
136
+
137
+ # Send the request to the service through eventmachine.
138
+ # This method is usually never called directly
139
+ # but is invoked by method_missing (see docs above).
140
+ #
141
+ # request = WidgetFindRequest.new
142
+ # client = Client.new({
143
+ # :service => WidgetService,
144
+ # :method => "find",
145
+ # :request_type => "WidgetFindRequest",
146
+ # :response_type => "WidgetList",
147
+ # :request => request
148
+ # })
149
+ #
150
+ # client.on_success do |res|
151
+ # res.widgets.each{|w| puts w.inspect }
152
+ # end
153
+ #
154
+ # client.on_failure do |err|
155
+ # puts err.message
156
+ # end
157
+ #
158
+ # client.send_request
159
+ #
160
+ def send_request
161
+ @connector.send_request
162
+ end
163
+
164
+ end
165
+ end
166
+ end