protobuf 2.2.5-java

Sign up to get free protection for your applications and to get access to all the features.
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,188 @@
1
+ require 'thor'
2
+ require 'protobuf/version'
3
+ require 'protobuf/logger'
4
+ require 'protobuf/rpc/servers/evented_runner'
5
+ require 'protobuf/rpc/servers/socket_runner'
6
+ require 'protobuf/rpc/servers/zmq_runner'
7
+
8
+ module Protobuf
9
+ class CLI < ::Thor
10
+ include ::Thor::Actions
11
+
12
+ attr_accessor :runner, :mode, :start_aborted
13
+
14
+ default_task :start
15
+
16
+ desc 'start APP_FILE', 'Run the RPC server in the given mode, preloading the given APP_FILE. This is the default task.'
17
+
18
+ option :host, :type => :string, :default => '127.0.0.1', :aliases => %w(-o), :desc => 'Host to bind.'
19
+ option :port, :type => :numeric, :default => 9399, :aliases => %w(-p), :desc => 'Master Port to bind.'
20
+
21
+ option :backlog, :type => :numeric, :default => 100, :aliases => %w(-b), :desc => 'Backlog for listening socket when using Socket Server.'
22
+ option :threshold, :type => :numeric, :default => 100, :aliases => %w(-t), :desc => 'Multi-threaded Socket Server cleanup threshold.'
23
+ option :threads, :type => :numeric, :default => 5, :aliases => %w(-r), :desc => 'Number of worker threads to run. Only applicable in --zmq mode.'
24
+
25
+ option :log, :type => :string, :aliases => %w(-l), :desc => 'Log file or device. Default is STDOUT.'
26
+ option :level, :type => :numeric, :default => ::Logger::INFO, :aliases => %w(-v), :desc => 'Log level to use, 0-5 (see http://www.ruby-doc.org/stdlib/libdoc/logger/rdoc/)'
27
+
28
+ option :socket, :type => :boolean, :aliases => %w(-s), :desc => 'Socket Mode for server and client connections.'
29
+ option :evented, :type => :boolean, :aliases => %w(-m), :desc => 'Evented Mode for server and client connections (uses EventMachine).'
30
+ option :zmq, :type => :boolean, :aliases => %w(-z), :desc => 'ZeroMQ Socket Mode for server and client connections.'
31
+
32
+ option :debug, :type => :boolean, :default => false, :aliases => %w(-d), :desc => 'Debug Mode. Override log level to DEBUG.'
33
+ option :gc_pause_request, :type => :boolean, :default => false, :desc => 'Enable/Disable GC pause during request.'
34
+ option :print_deprecation_warnings, :type => :boolean, :default => true, :desc => 'Cause use of deprecated fields to be printed or ignored.'
35
+
36
+ def start(app_file)
37
+ debug_say 'Configuring the rpc_server process'
38
+ @start_aborted = false
39
+
40
+ configure_logger
41
+ configure_traps
42
+ configure_server_mode
43
+ require_protobuf!
44
+ configure_gc
45
+ configure_deprecation_warnings
46
+
47
+ run_if_no_abort { require_application!(app_file) }
48
+ run_if_no_abort { configure_process_name(app_file) }
49
+ run_if_no_abort { start_server! }
50
+
51
+ rescue => e
52
+ say_and_exit!('ERROR: RPC Server failed to start.', e)
53
+ end
54
+
55
+ desc 'version', 'Print ruby and protoc versions and exit.'
56
+ def version
57
+ say "Ruby Protobuf v#{::Protobuf::VERSION}, protoc v#{::Protobuf::PROTOC_VERSION}"
58
+ end
59
+
60
+ no_tasks do
61
+
62
+ # Tell protobuf how to handle the printing of deprecated field usage.
63
+ def configure_deprecation_warnings
64
+ ::Protobuf.print_deprecation_warnings = options.print_deprecation_warnings?
65
+ end
66
+
67
+ # If we pause during request we don't need to pause in serialization
68
+ def configure_gc
69
+ debug_say 'Configuring gc'
70
+ ::Protobuf.gc_pause_server_request = options.gc_pause_request?
71
+ end
72
+
73
+ # Setup the protobuf logger.
74
+ def configure_logger
75
+ debug_say 'Configuring logger'
76
+ ::Protobuf::Logger.configure({ :file => options.log || STDOUT,
77
+ :level => options.debug? ? ::Logger::DEBUG : options.level })
78
+
79
+ # Debug output the server options to the log file.
80
+ ::Protobuf::Logger.debug { 'Debugging options:' }
81
+ ::Protobuf::Logger.debug { options.inspect }
82
+ end
83
+
84
+ # Re-write the $0 var to have a nice process name in ps.
85
+ def configure_process_name(app_file)
86
+ debug_say 'Configuring process name'
87
+ $0 = "rpc_server --#{@mode} #{options.host}:#{options.port} #{app_file}"
88
+ end
89
+
90
+ # Configure the mode of the server and the runner class.
91
+ def configure_server_mode
92
+ debug_say 'Configuring runner mode'
93
+ if options.zmq? && ! options.evented? && ! options.socket?
94
+ @mode = :zmq
95
+ @runner = ::Protobuf::Rpc::ZmqRunner
96
+ elsif options.evented? && ! options.zmq? && ! options.socket?
97
+ @mode = :evented
98
+ @runner = ::Protobuf::Rpc::EventedRunner
99
+ else
100
+ say 'WARNING: You have provided multiple mode options. Defaulting to socket mode.', :yellow if multi_mode?
101
+ @mode = :socket
102
+ @runner = ::Protobuf::Rpc::SocketRunner
103
+ end
104
+ end
105
+
106
+ # Configure signal traps.
107
+ # TODO add signal handling for hot-reloading the application.
108
+ def configure_traps
109
+ debug_say 'Configuring traps'
110
+ [:INT, :QUIT, :TERM].each do |signal|
111
+ debug_say "Registering signal trap for #{signal}", :blue
112
+ trap(signal) do
113
+ ::Protobuf::Logger.info { 'RPC Server shutting down...' }
114
+ @start_aborted = true
115
+ @runner.stop
116
+ ::Protobuf::Logger.info { 'Shutdown complete' }
117
+ end
118
+ end
119
+ end
120
+
121
+ # Say something if we're in debug mode.
122
+ def debug_say(message, color = :yellow)
123
+ say(message, color) if options.debug?
124
+ end
125
+
126
+ # Internal helper to determine if the modes are multi-set which is not valid.
127
+ def multi_mode?
128
+ (options.zmq? && (options.evented? || options.socket?)) \
129
+ && (options.evented? && (options.evented? || options.socket?)) \
130
+ && (options.zmq? && (options.evented? || options.socket?)) \
131
+ end
132
+
133
+ # Require the application file given, exiting if the file doesn't exist.
134
+ def require_application!(app_file)
135
+ debug_say 'Requiring app file'
136
+ require app_file
137
+ rescue LoadError => e
138
+ say_and_exit!("Failed to load application file #{app_file}", e)
139
+ end
140
+
141
+ # Loads protobuf in the given mode, exiting if somehow the mode is wrong.
142
+ def require_protobuf!
143
+ require "protobuf/#{@mode}.rb"
144
+ rescue LoadError => e
145
+ puts e.message, *(e.backtrace)
146
+ say_and_exit!("Failed to load protobuf runner #{@mode}", e)
147
+ end
148
+
149
+ def run_if_no_abort
150
+ yield unless @start_aborted
151
+ end
152
+
153
+ def runner_options
154
+ { :host => options.host,
155
+ :port => options.port,
156
+ :backlog => options.backlog,
157
+ :threshold => options.threshold,
158
+ :threads => options.threads }
159
+ end
160
+
161
+ def say_and_exit!(message, exception = nil)
162
+ message = set_color(message, :red) if ::Protobuf::Logger.file == STDOUT
163
+
164
+ ::Protobuf::Logger.error { message }
165
+ if exception
166
+ $stderr.puts "[#{exception.class.name}] #{exception.message}"
167
+ $stderr.puts exception.backtrace.join("\n")
168
+
169
+ ::Protobuf::Logger.error { "[#{exception.class.name}] #{exception.message}" }
170
+ ::Protobuf::Logger.debug { exception.backtrace.join("\n") }
171
+ end
172
+
173
+ exit(1)
174
+ end
175
+
176
+ # Start the runner and log the relevant options.
177
+ def start_server!
178
+ debug_say 'Invoking server start'
179
+ @runner.run(runner_options) do
180
+ Protobuf::Logger.info { "pid #{::Process.pid} -- #{@mode} RPC Server listening at #{options.host}:#{options.port}" }
181
+ end
182
+ end
183
+
184
+ end
185
+
186
+ end
187
+ end
188
+
@@ -0,0 +1,58 @@
1
+ require 'protobuf/enum_value'
2
+
3
+ module Protobuf
4
+ class Enum
5
+
6
+ def self.define(name, value)
7
+ enum_value = ::Protobuf::EnumValue.new(self, name, value)
8
+ const_set(name, enum_value)
9
+ @values ||= {}
10
+ @names ||= []
11
+ @values[name] = enum_value
12
+ @names[value] = name
13
+ end
14
+
15
+ # Fetch the given enum by a variety of type-checking
16
+ # mechanisms. This is useful for the enum field setters
17
+ # as well as repeated enum field construction.
18
+ def self.fetch(value)
19
+ case value
20
+ when ::Protobuf::EnumValue then
21
+ value
22
+ when Numeric then
23
+ enum_by_value(value.to_i)
24
+ when String, Symbol then
25
+ value_by_name(value.to_sym)
26
+ else
27
+ nil
28
+ end
29
+ end
30
+
31
+ def self.enum_by_value(value)
32
+ value_by_name(name_by_value(value))
33
+ end
34
+
35
+ def self.name_by_value(value)
36
+ value.nil? ? nil : @names[value]
37
+ end
38
+
39
+ def self.valid_tag?(tag)
40
+ !! name_by_value(tag)
41
+ end
42
+
43
+ def self.value_by_name(name)
44
+ @values[name]
45
+ end
46
+
47
+ def self.values
48
+ @values
49
+ end
50
+
51
+ ##
52
+ # Class Aliases
53
+ #
54
+ class << self
55
+ alias_method :get_name_by_tag, :name_by_value
56
+ end
57
+ end
58
+ end
@@ -0,0 +1,59 @@
1
+ require 'protobuf/enum'
2
+
3
+ module Protobuf
4
+ class EnumValue
5
+ include Comparable
6
+
7
+ attr_reader :parent_class, :name, :value
8
+
9
+ ##
10
+ # Constructor
11
+ #
12
+ def initialize(parent_class, name, value)
13
+ @parent_class = parent_class
14
+ @name = name
15
+ @value = value
16
+ end
17
+
18
+ ##
19
+ # Public Instance Methods
20
+ #
21
+ def <=>(compared_value)
22
+ case compared_value
23
+ when ::Protobuf::EnumValue then
24
+ value <=> compared_value.value
25
+ when Numeric then
26
+ value <=> compared_value.to_i
27
+ end
28
+ end
29
+
30
+ # Overriding the class so ActiveRecord/Arel visitor will visit the enum as a Fixnum
31
+ def class
32
+ Fixnum
33
+ end
34
+
35
+ def inspect
36
+ "\#<Protobuf::EnumValue #{@parent_class}::#{@name}=#{@value}>"
37
+ end
38
+
39
+ def to_hash_value
40
+ self.to_i
41
+ end
42
+
43
+ def to_i
44
+ @value.to_i
45
+ end
46
+
47
+ def to_s(format = :value_string)
48
+ case format
49
+ when :value_string then
50
+ self.to_i.to_s
51
+ when :name then
52
+ name.to_s
53
+ else
54
+ self.to_i.to_s
55
+ end
56
+ end
57
+ end
58
+ end
59
+
@@ -0,0 +1,22 @@
1
+ ##
2
+ ## Evented Mode
3
+ ##
4
+ #
5
+ # Require this file if you wish to run your server and/or client RPC
6
+ # with the evented handlers via EventMachine.
7
+ #
8
+ # To run with rpc_server specify the switch `evented`:
9
+ #
10
+ # rpc_server --evented myapp.rb
11
+ #
12
+ # To run for client-side only override the require in your Gemfile:
13
+ #
14
+ # gem 'protobuf', :require => 'protobuf/evented'
15
+ #
16
+ require 'protobuf'
17
+ Protobuf.connector_type = :evented
18
+
19
+ require 'eventmachine'
20
+ require 'protobuf/ext/eventmachine'
21
+ require 'protobuf/rpc/servers/evented/server'
22
+ require 'protobuf/rpc/connectors/eventmachine'
@@ -0,0 +1,11 @@
1
+ module Protobuf
2
+
3
+ class Error < StandardError; end
4
+
5
+ class InvalidWireType < Error; end
6
+
7
+ class NotInitializedError < Error; end
8
+
9
+ class TagCollisionError < Error; end
10
+
11
+ end
@@ -0,0 +1,14 @@
1
+ require 'fiber'
2
+
3
+ # Method from em-synchrony
4
+ # https://github.com/igrigorik/em-synchrony
5
+ #
6
+ # A convenience method for wrapping EM.run body within
7
+ # a Ruby Fiber such that async operations can be transparently
8
+ # paused and resumed based on IO scheduling
9
+ module EventMachine
10
+ def self.fiber_run(blk=nil, tail=nil, &block)
11
+ context = Proc.new{ Fiber.new{ (b = blk || block) and b.call }.resume }
12
+ self.run(context, tail)
13
+ end
14
+ end
@@ -0,0 +1,240 @@
1
+ require 'protobuf/wire_type'
2
+ require 'protobuf/field/field_array'
3
+
4
+ module Protobuf
5
+ module Field
6
+ class BaseField
7
+ ##
8
+ # Attributes
9
+ #
10
+ attr_reader :message_class, :rule, :type, :name, :tag, :default, :default_value, :setter_method_name, :getter_method_name
11
+
12
+ ##
13
+ # Class Methods
14
+ #
15
+ def self.default
16
+ nil
17
+ end
18
+
19
+ ##
20
+ # Constructor
21
+ #
22
+ def initialize(message_class, rule, type, name, tag, options)
23
+ @message_class, @rule, @type, @name, @tag = \
24
+ message_class, rule, type, name, tag
25
+
26
+ @getter_method_name = name
27
+ @setter_method_name = "#{name}=".to_sym
28
+ @default = options.delete(:default)
29
+ @extension = options.delete(:extension)
30
+ @packed = repeated? && options.delete(:packed)
31
+ @deprecated = options.delete(:deprecated)
32
+ unless options.empty?
33
+ warn "WARNING: Invalid options: #{options.inspect} (in #{@message_class.name.split('::').last}.#{@name})"
34
+ end
35
+
36
+ if packed? && ! [WireType::VARINT, WireType::FIXED32, WireType::FIXED64].include?(wire_type)
37
+ raise "Can't use packed encoding for `#{@type}' type"
38
+ end
39
+
40
+ @default_value = \
41
+ case @rule
42
+ when :repeated then
43
+ FieldArray.new(self).freeze
44
+ when :required then
45
+ nil
46
+ when :optional then
47
+ typed_default_value
48
+ end
49
+
50
+ define_accessor
51
+ end
52
+
53
+ ##
54
+ # Public Instance Methods
55
+ #
56
+ def acceptable?(value)
57
+ true
58
+ end
59
+
60
+ def enum?
61
+ return @_enum unless @_enum.nil?
62
+ @_enum = (self.class < ::Protobuf::Field::EnumField)
63
+ end
64
+
65
+ def message?
66
+ return @_message unless @_message.nil?
67
+ @_message = (self.class < ::Protobuf::Field::MessageField)
68
+ end
69
+
70
+ def initialized?(message_instance)
71
+ value = message_instance.__send__(getter_method_name)
72
+ case @rule
73
+ when :required then
74
+ ! value.nil? && (! kind_of?(MessageField) || value.initialized?)
75
+ when :repeated then
76
+ value.all? {|msg| ! kind_of?(MessageField) || msg.initialized? }
77
+ when :optional then
78
+ value.nil? || ! kind_of?(MessageField) || value.initialized?
79
+ end
80
+ end
81
+
82
+ # Decode +bytes+ and pass to +message_instance+.
83
+ def set(message_instance, bytes)
84
+ if packed?
85
+ array = message_instance.__send__(getter_method_name)
86
+ method = \
87
+ case wire_type
88
+ when WireType::FIXED32 then :read_fixed32
89
+ when WireType::FIXED64 then :read_fixed64
90
+ when WireType::VARINT then :read_varint
91
+ end
92
+ stream = StringIO.new(bytes)
93
+ until stream.eof?
94
+ array << decode(Decoder.__send__(method, stream))
95
+ end
96
+ else
97
+ value = decode(bytes)
98
+ if repeated?
99
+ message_instance.__send__(getter_method_name) << value
100
+ else
101
+ message_instance.__send__(setter_method_name, value)
102
+ end
103
+ end
104
+ end
105
+
106
+ # Decode +bytes+ and return a field value.
107
+ def decode(bytes)
108
+ raise NotImplementedError, "#{self.class.name}\#decode"
109
+ end
110
+
111
+ # Encode +value+ and return a byte string.
112
+ def encode(value)
113
+ raise NotImplementedError, "#{self.class.name}\#encode"
114
+ end
115
+
116
+ def extension?
117
+ !!@extension
118
+ end
119
+
120
+ # Is this a repeated field?
121
+ def repeated?
122
+ return @_repeated unless @_repeated.nil?
123
+ @_repeated = (@rule == :repeated)
124
+ end
125
+
126
+ # Is this a required field?
127
+ def required?
128
+ return @_required unless @_required.nil?
129
+ @_required = (@rule == :required)
130
+ end
131
+
132
+ # Is this a optional field?
133
+ def optional?
134
+ return @_optional unless @_optional.nil?
135
+ @_optional = (@rule == :optional)
136
+ end
137
+
138
+ # Is this a deprecated field?
139
+ def deprecated?
140
+ !! @deprecated
141
+ end
142
+
143
+ # Is this a packed repeated field?
144
+ def packed?
145
+ !! @packed
146
+ end
147
+
148
+ # Upper limit for this field.
149
+ def max
150
+ self.class.max
151
+ end
152
+
153
+ # Lower limit for this field.
154
+ def min
155
+ self.class.min
156
+ end
157
+
158
+ def to_s
159
+ "#{@rule} #{@type} #{@name} = #{@tag} #{@default ? "[default=#{@default.inspect}]" : ''}"
160
+ end
161
+
162
+ def warn_if_deprecated
163
+ if ::Protobuf.print_deprecation_warnings? && deprecated?
164
+ $stderr.puts("[WARNING] #{@message_class.name}##{@name} field usage is deprecated.")
165
+ end
166
+ end
167
+
168
+ private
169
+
170
+ ##
171
+ # Private Instance Methods
172
+ #
173
+ def define_accessor
174
+ if repeated?
175
+ define_array_getter
176
+ define_array_setter
177
+ else
178
+ define_getter
179
+ define_setter
180
+ end
181
+ end
182
+
183
+ def define_array_getter
184
+ field = self
185
+ @message_class.class_eval do
186
+ define_method(field.getter_method_name) do
187
+ field.warn_if_deprecated
188
+ @values[field.name] ||= ::Protobuf::Field::FieldArray.new(field)
189
+ end
190
+ end
191
+ end
192
+
193
+ def define_array_setter
194
+ field = self
195
+ @message_class.class_eval do
196
+ define_method(field.setter_method_name) do |val|
197
+ field.warn_if_deprecated
198
+ @values[field.name] ||= ::Protobuf::Field::FieldArray.new(field)
199
+ @values[field.name].replace(val)
200
+ end
201
+ end
202
+ end
203
+
204
+ def define_getter
205
+ field = self
206
+ @message_class.class_eval do
207
+ define_method(field.getter_method_name) do
208
+ field.warn_if_deprecated
209
+ @values.fetch(field.name, field.default_value)
210
+ end
211
+ end
212
+ end
213
+
214
+ def define_setter
215
+ field = self
216
+ @message_class.class_eval do
217
+ define_method(field.setter_method_name) do |val|
218
+ field.warn_if_deprecated
219
+ if val.nil?
220
+ @values.delete(field.name)
221
+ elsif field.acceptable?(val)
222
+ @values[field.name] = val
223
+ else
224
+ raise TypeError, "unacceptable value #{val} for type #{field.type}"
225
+ end
226
+ end
227
+ end
228
+ end
229
+
230
+ def typed_default_value
231
+ if @default.nil?
232
+ self.class.default
233
+ else
234
+ @default
235
+ end
236
+ end
237
+
238
+ end
239
+ end
240
+ end
@@ -0,0 +1,36 @@
1
+ require 'protobuf/field/varint_field'
2
+
3
+ module Protobuf
4
+ module Field
5
+ class BoolField < VarintField
6
+ def self.default
7
+ false
8
+ end
9
+
10
+ def acceptable?(val)
11
+ raise TypeError unless [true, false].include?(val)
12
+ true
13
+ end
14
+
15
+ def decode(value)
16
+ value == 1
17
+ end
18
+
19
+ def define_getter
20
+ super
21
+
22
+ field = self
23
+ @message_class.class_eval do
24
+ define_method("#{field.getter_method_name}?") do
25
+ field.warn_if_deprecated
26
+ @values.fetch(field.name, field.default_value)
27
+ end
28
+ end
29
+ end
30
+
31
+ def encode(value)
32
+ [value ? 1 : 0].pack('C')
33
+ end
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,38 @@
1
+ module Protobuf
2
+ module Field
3
+ class BytesField < BaseField
4
+ def self.default
5
+ ''
6
+ end
7
+
8
+ def wire_type
9
+ WireType::LENGTH_DELIMITED
10
+ end
11
+
12
+ def acceptable?(val)
13
+ if val.is_a?(::Protobuf::Message) || val.instance_of?(String)
14
+ return true
15
+ end
16
+
17
+ raise TypeError
18
+ end
19
+
20
+ def decode(bytes)
21
+ bytes.force_encoding(::Protobuf::Message::STRING_ENCODING) if bytes.respond_to?(:force_encoding)
22
+ bytes
23
+ end
24
+
25
+ def encode(value)
26
+ if value.is_a?(::Protobuf::Message)
27
+ value = value.serialize_to_string
28
+ else
29
+ value = value.dup
30
+ value.force_encoding(::Protobuf::Message::STRING_ENCODING) if value.respond_to?(:force_encoding)
31
+ end
32
+
33
+ string_size = VarintField.encode(value.size)
34
+ string_size << value
35
+ end
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,19 @@
1
+ require 'protobuf/field/float_field'
2
+
3
+ module Protobuf
4
+ module Field
5
+ class DoubleField < FloatField
6
+ def wire_type
7
+ WireType::FIXED64
8
+ end
9
+
10
+ def decode(bytes)
11
+ bytes.unpack('E').first
12
+ end
13
+
14
+ def encode(value)
15
+ [value].pack('E')
16
+ end
17
+ end
18
+ end
19
+ end