prepor-protobuf 3.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (182) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +21 -0
  3. data/.rubocop.yml +51 -0
  4. data/.rubocop_todo.yml +89 -0
  5. data/.travis.yml +25 -0
  6. data/.yardopts +5 -0
  7. data/CHANGES.md +256 -0
  8. data/CONTRIBUTING.md +16 -0
  9. data/Gemfile +3 -0
  10. data/LICENSE.txt +22 -0
  11. data/README.md +33 -0
  12. data/Rakefile +64 -0
  13. data/bin/protoc-gen-ruby +16 -0
  14. data/bin/rpc_server +5 -0
  15. data/install-protobuf.sh +28 -0
  16. data/lib/protobuf.rb +100 -0
  17. data/lib/protobuf/cli.rb +242 -0
  18. data/lib/protobuf/code_generator.rb +44 -0
  19. data/lib/protobuf/decoder.rb +73 -0
  20. data/lib/protobuf/deprecation.rb +112 -0
  21. data/lib/protobuf/descriptors.rb +3 -0
  22. data/lib/protobuf/descriptors/google/protobuf/compiler/plugin.pb.rb +48 -0
  23. data/lib/protobuf/descriptors/google/protobuf/descriptor.pb.rb +251 -0
  24. data/lib/protobuf/encoder.rb +67 -0
  25. data/lib/protobuf/enum.rb +303 -0
  26. data/lib/protobuf/exceptions.rb +9 -0
  27. data/lib/protobuf/field.rb +74 -0
  28. data/lib/protobuf/field/base_field.rb +267 -0
  29. data/lib/protobuf/field/bool_field.rb +59 -0
  30. data/lib/protobuf/field/bytes_field.rb +82 -0
  31. data/lib/protobuf/field/double_field.rb +25 -0
  32. data/lib/protobuf/field/enum_field.rb +68 -0
  33. data/lib/protobuf/field/field_array.rb +87 -0
  34. data/lib/protobuf/field/fixed32_field.rb +25 -0
  35. data/lib/protobuf/field/fixed64_field.rb +28 -0
  36. data/lib/protobuf/field/float_field.rb +41 -0
  37. data/lib/protobuf/field/int32_field.rb +21 -0
  38. data/lib/protobuf/field/int64_field.rb +21 -0
  39. data/lib/protobuf/field/integer_field.rb +23 -0
  40. data/lib/protobuf/field/message_field.rb +65 -0
  41. data/lib/protobuf/field/sfixed32_field.rb +27 -0
  42. data/lib/protobuf/field/sfixed64_field.rb +28 -0
  43. data/lib/protobuf/field/signed_integer_field.rb +29 -0
  44. data/lib/protobuf/field/sint32_field.rb +21 -0
  45. data/lib/protobuf/field/sint64_field.rb +21 -0
  46. data/lib/protobuf/field/string_field.rb +34 -0
  47. data/lib/protobuf/field/uint32_field.rb +21 -0
  48. data/lib/protobuf/field/uint64_field.rb +21 -0
  49. data/lib/protobuf/field/varint_field.rb +73 -0
  50. data/lib/protobuf/generators/base.rb +70 -0
  51. data/lib/protobuf/generators/enum_generator.rb +41 -0
  52. data/lib/protobuf/generators/extension_generator.rb +27 -0
  53. data/lib/protobuf/generators/field_generator.rb +131 -0
  54. data/lib/protobuf/generators/file_generator.rb +135 -0
  55. data/lib/protobuf/generators/group_generator.rb +112 -0
  56. data/lib/protobuf/generators/message_generator.rb +98 -0
  57. data/lib/protobuf/generators/printable.rb +160 -0
  58. data/lib/protobuf/generators/service_generator.rb +26 -0
  59. data/lib/protobuf/lifecycle.rb +33 -0
  60. data/lib/protobuf/logging.rb +39 -0
  61. data/lib/protobuf/message.rb +193 -0
  62. data/lib/protobuf/message/fields.rb +133 -0
  63. data/lib/protobuf/message/serialization.rb +89 -0
  64. data/lib/protobuf/optionable.rb +23 -0
  65. data/lib/protobuf/rpc/buffer.rb +77 -0
  66. data/lib/protobuf/rpc/client.rb +168 -0
  67. data/lib/protobuf/rpc/connector.rb +19 -0
  68. data/lib/protobuf/rpc/connectors/base.rb +55 -0
  69. data/lib/protobuf/rpc/connectors/common.rb +176 -0
  70. data/lib/protobuf/rpc/connectors/socket.rb +73 -0
  71. data/lib/protobuf/rpc/connectors/zmq.rb +322 -0
  72. data/lib/protobuf/rpc/dynamic_discovery.pb.rb +49 -0
  73. data/lib/protobuf/rpc/env.rb +58 -0
  74. data/lib/protobuf/rpc/error.rb +28 -0
  75. data/lib/protobuf/rpc/error/client_error.rb +31 -0
  76. data/lib/protobuf/rpc/error/server_error.rb +43 -0
  77. data/lib/protobuf/rpc/middleware.rb +25 -0
  78. data/lib/protobuf/rpc/middleware/exception_handler.rb +36 -0
  79. data/lib/protobuf/rpc/middleware/logger.rb +91 -0
  80. data/lib/protobuf/rpc/middleware/request_decoder.rb +83 -0
  81. data/lib/protobuf/rpc/middleware/response_encoder.rb +88 -0
  82. data/lib/protobuf/rpc/middleware/runner.rb +18 -0
  83. data/lib/protobuf/rpc/rpc.pb.rb +55 -0
  84. data/lib/protobuf/rpc/server.rb +39 -0
  85. data/lib/protobuf/rpc/servers/socket/server.rb +123 -0
  86. data/lib/protobuf/rpc/servers/socket/worker.rb +56 -0
  87. data/lib/protobuf/rpc/servers/socket_runner.rb +40 -0
  88. data/lib/protobuf/rpc/servers/zmq/broker.rb +193 -0
  89. data/lib/protobuf/rpc/servers/zmq/server.rb +320 -0
  90. data/lib/protobuf/rpc/servers/zmq/util.rb +48 -0
  91. data/lib/protobuf/rpc/servers/zmq/worker.rb +104 -0
  92. data/lib/protobuf/rpc/servers/zmq_runner.rb +62 -0
  93. data/lib/protobuf/rpc/service.rb +179 -0
  94. data/lib/protobuf/rpc/service_directory.rb +253 -0
  95. data/lib/protobuf/rpc/service_dispatcher.rb +46 -0
  96. data/lib/protobuf/rpc/service_filters.rb +272 -0
  97. data/lib/protobuf/rpc/stat.rb +97 -0
  98. data/lib/protobuf/socket.rb +21 -0
  99. data/lib/protobuf/tasks.rb +1 -0
  100. data/lib/protobuf/tasks/compile.rake +61 -0
  101. data/lib/protobuf/version.rb +3 -0
  102. data/lib/protobuf/wire_type.rb +10 -0
  103. data/lib/protobuf/zmq.rb +21 -0
  104. data/proto/dynamic_discovery.proto +44 -0
  105. data/proto/google/protobuf/compiler/plugin.proto +147 -0
  106. data/proto/google/protobuf/descriptor.proto +620 -0
  107. data/proto/rpc.proto +62 -0
  108. data/protobuf.gemspec +51 -0
  109. data/spec/benchmark/tasks.rb +139 -0
  110. data/spec/bin/protoc-gen-ruby_spec.rb +23 -0
  111. data/spec/data/data.bin +3 -0
  112. data/spec/data/types.bin +0 -0
  113. data/spec/encoding/all_types_spec.rb +105 -0
  114. data/spec/encoding/extreme_values_spec.rb +0 -0
  115. data/spec/functional/class_inheritance_spec.rb +52 -0
  116. data/spec/functional/socket_server_spec.rb +59 -0
  117. data/spec/functional/zmq_server_spec.rb +105 -0
  118. data/spec/lib/protobuf/cli_spec.rb +273 -0
  119. data/spec/lib/protobuf/code_generator_spec.rb +60 -0
  120. data/spec/lib/protobuf/enum_spec.rb +265 -0
  121. data/spec/lib/protobuf/field/bool_field_spec.rb +51 -0
  122. data/spec/lib/protobuf/field/field_array_spec.rb +69 -0
  123. data/spec/lib/protobuf/field/float_field_spec.rb +55 -0
  124. data/spec/lib/protobuf/field/int32_field_spec.rb +89 -0
  125. data/spec/lib/protobuf/field/string_field_spec.rb +45 -0
  126. data/spec/lib/protobuf/field_spec.rb +191 -0
  127. data/spec/lib/protobuf/generators/base_spec.rb +84 -0
  128. data/spec/lib/protobuf/generators/enum_generator_spec.rb +73 -0
  129. data/spec/lib/protobuf/generators/extension_generator_spec.rb +42 -0
  130. data/spec/lib/protobuf/generators/field_generator_spec.rb +102 -0
  131. data/spec/lib/protobuf/generators/file_generator_spec.rb +32 -0
  132. data/spec/lib/protobuf/generators/message_generator_spec.rb +0 -0
  133. data/spec/lib/protobuf/generators/service_generator_spec.rb +46 -0
  134. data/spec/lib/protobuf/lifecycle_spec.rb +94 -0
  135. data/spec/lib/protobuf/message_spec.rb +526 -0
  136. data/spec/lib/protobuf/optionable_spec.rb +46 -0
  137. data/spec/lib/protobuf/rpc/client_spec.rb +66 -0
  138. data/spec/lib/protobuf/rpc/connector_spec.rb +26 -0
  139. data/spec/lib/protobuf/rpc/connectors/base_spec.rb +50 -0
  140. data/spec/lib/protobuf/rpc/connectors/common_spec.rb +170 -0
  141. data/spec/lib/protobuf/rpc/connectors/socket_spec.rb +36 -0
  142. data/spec/lib/protobuf/rpc/connectors/zmq_spec.rb +117 -0
  143. data/spec/lib/protobuf/rpc/middleware/exception_handler_spec.rb +62 -0
  144. data/spec/lib/protobuf/rpc/middleware/logger_spec.rb +49 -0
  145. data/spec/lib/protobuf/rpc/middleware/request_decoder_spec.rb +115 -0
  146. data/spec/lib/protobuf/rpc/middleware/response_encoder_spec.rb +75 -0
  147. data/spec/lib/protobuf/rpc/servers/socket_server_spec.rb +38 -0
  148. data/spec/lib/protobuf/rpc/servers/zmq/server_spec.rb +43 -0
  149. data/spec/lib/protobuf/rpc/servers/zmq/util_spec.rb +55 -0
  150. data/spec/lib/protobuf/rpc/servers/zmq/worker_spec.rb +35 -0
  151. data/spec/lib/protobuf/rpc/service_directory_spec.rb +293 -0
  152. data/spec/lib/protobuf/rpc/service_dispatcher_spec.rb +52 -0
  153. data/spec/lib/protobuf/rpc/service_filters_spec.rb +517 -0
  154. data/spec/lib/protobuf/rpc/service_spec.rb +162 -0
  155. data/spec/lib/protobuf/rpc/stat_spec.rb +68 -0
  156. data/spec/lib/protobuf_spec.rb +98 -0
  157. data/spec/spec_helper.rb +44 -0
  158. data/spec/support/all.rb +6 -0
  159. data/spec/support/packed_field.rb +22 -0
  160. data/spec/support/server.rb +64 -0
  161. data/spec/support/test/all_types.data.bin +0 -0
  162. data/spec/support/test/all_types.data.txt +119 -0
  163. data/spec/support/test/defaults.pb.rb +27 -0
  164. data/spec/support/test/defaults.proto +9 -0
  165. data/spec/support/test/enum.pb.rb +55 -0
  166. data/spec/support/test/enum.proto +34 -0
  167. data/spec/support/test/extended.pb.rb +18 -0
  168. data/spec/support/test/extended.proto +10 -0
  169. data/spec/support/test/extreme_values.data.bin +0 -0
  170. data/spec/support/test/google_unittest.pb.rb +537 -0
  171. data/spec/support/test/google_unittest.proto +713 -0
  172. data/spec/support/test/google_unittest_import.pb.rb +39 -0
  173. data/spec/support/test/google_unittest_import.proto +64 -0
  174. data/spec/support/test/google_unittest_import_public.pb.rb +10 -0
  175. data/spec/support/test/google_unittest_import_public.proto +38 -0
  176. data/spec/support/test/multi_field_extensions.pb.rb +58 -0
  177. data/spec/support/test/multi_field_extensions.proto +33 -0
  178. data/spec/support/test/resource.pb.rb +119 -0
  179. data/spec/support/test/resource.proto +94 -0
  180. data/spec/support/test/resource_service.rb +23 -0
  181. data/spec/support/test_app_file.rb +2 -0
  182. metadata +502 -0
@@ -0,0 +1,46 @@
1
+ require 'protobuf/logging'
2
+
3
+ module Protobuf
4
+ module Rpc
5
+ class ServiceDispatcher
6
+ include ::Protobuf::Logging
7
+
8
+ attr_reader :env
9
+
10
+ def initialize(_app)
11
+ # End of the line...
12
+ end
13
+
14
+ def call(env)
15
+ @env = env
16
+
17
+ env.response = dispatch_rpc_request
18
+ env
19
+ end
20
+
21
+ def rpc_service
22
+ @rpc_service ||= env.rpc_service.new(env)
23
+ end
24
+
25
+ private
26
+
27
+ # Call the given service method.
28
+ def dispatch_rpc_request
29
+ unless rpc_service.respond_to?(method_name)
30
+ fail MethodNotFound, "#{service_name}##{method_name} is not a publicly defined method."
31
+ end
32
+
33
+ rpc_service.callable_rpc_method(method_name).call
34
+ rpc_service.response
35
+ end
36
+
37
+ def method_name
38
+ env.method_name
39
+ end
40
+
41
+ def service_name
42
+ env.service_name
43
+ end
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,272 @@
1
+ module Protobuf
2
+ module Rpc
3
+ module ServiceFilters
4
+
5
+ def self.included(other)
6
+ other.class_eval do
7
+ extend Protobuf::Rpc::ServiceFilters::ClassMethods
8
+ include Protobuf::Rpc::ServiceFilters::InstanceMethods
9
+ end
10
+ end
11
+
12
+ module ClassMethods
13
+
14
+ [:after, :around, :before].each do |type|
15
+ # Setter DSL method for given filter types.
16
+ #
17
+ define_method "#{type}_filter" do |*args|
18
+ set_filters(type, *args)
19
+ end
20
+ alias_method "#{type}_action", "#{type}_filter"
21
+ end
22
+
23
+ # Filters hash keyed based on filter type (e.g. :before, :after, :around),
24
+ # whose values are Sets.
25
+ #
26
+ def filters
27
+ @filters ||= Hash.new { |h, k| h[k] = [] }
28
+ end
29
+
30
+ # Filters hash keyed based on filter type (e.g. :before, :after, :around),
31
+ # whose values are Sets.
32
+ #
33
+ def rescue_filters
34
+ @rescue_filters ||= {}
35
+ end
36
+
37
+ def rescue_from(*ex_klasses, &block)
38
+ options = ex_klasses.last.is_a?(Hash) ? ex_klasses.pop : {}
39
+ callable = options.delete(:with) { block }
40
+ fail ArgumentError, 'Option :with missing from rescue_from options' if callable.nil?
41
+ ex_klasses.each { |ex_klass| rescue_filters[ex_klass] = callable }
42
+ end
43
+
44
+ private
45
+
46
+ def define_filter(type, filter, options = {})
47
+ return if filter_defined?(type, filter)
48
+ filters[type] << options.merge(:callable => filter)
49
+ remember_filter(type, filter)
50
+ end
51
+
52
+ def defined_filters
53
+ @defined_filters ||= Hash.new { |h, k| h[k] = Set.new }
54
+ end
55
+
56
+ # Check to see if the filter has been defined.
57
+ #
58
+ def filter_defined?(type, filter)
59
+ defined_filters[type].include?(filter)
60
+ end
61
+
62
+ # Remember that we stored the filter.
63
+ #
64
+ def remember_filter(type, filter)
65
+ defined_filters[type] << filter
66
+ end
67
+
68
+ # Takes a list of actually (or potentially) callable objects.
69
+ # TODO: add support for if/unless
70
+ # TODO: add support for only/except sub-filters
71
+ #
72
+ def set_filters(type, *args)
73
+ options = args.last.is_a?(Hash) ? args.pop : {}
74
+ args.each do |filter|
75
+ define_filter(type, filter, options)
76
+ end
77
+ end
78
+
79
+ end
80
+
81
+ module InstanceMethods
82
+
83
+ private
84
+
85
+ # Get back to class filters.
86
+ #
87
+ def filters
88
+ self.class.filters
89
+ end
90
+
91
+ # Predicate which uses the filter options to determine if the filter
92
+ # should be called. Specifically checks the :if, :unless, :only, and :except
93
+ # options for every filter. Each option check is expected to return false
94
+ # if the filter should not be invoked, true if invocation should occur.
95
+ #
96
+ def invoke_filter?(rpc_method, filter)
97
+ invoke_via_only?(rpc_method, filter) &&
98
+ invoke_via_except?(rpc_method, filter) &&
99
+ invoke_via_if?(rpc_method, filter) &&
100
+ invoke_via_unless?(rpc_method, filter)
101
+ end
102
+
103
+ # If the target rpc endpoint method is listed under an :except option,
104
+ # return false to indicate that the filter should not be invoked. Any
105
+ # other target rpc endpoint methods not listed should be invoked.
106
+ # This option is the opposite of :only.
107
+ #
108
+ # Value should be a symbol/string or an array of symbols/strings.
109
+ #
110
+ def invoke_via_except?(rpc_method, filter)
111
+ except = [filter.fetch(:except) { [] }].flatten
112
+ except.empty? || !except.include?(rpc_method)
113
+ end
114
+
115
+ # Invoke the given :if callable (if any) and return its return value.
116
+ # Used by `invoke_filter?` which expects a true/false
117
+ # return value to determine if we should invoke the target filter.
118
+ #
119
+ # Value can either be a symbol/string indicating an instance method to call
120
+ # or an object that responds to `call`.
121
+ #
122
+ def invoke_via_if?(_rpc_method, filter)
123
+ if_check = filter.fetch(:if) { ->(_service) { return true } }
124
+ do_invoke = case
125
+ when if_check.nil? then
126
+ true
127
+ else
128
+ call_or_send(if_check)
129
+ end
130
+
131
+ do_invoke
132
+ end
133
+
134
+ # If the target rpc endpoint method is listed in the :only option,
135
+ # it should be invoked. Any target rpc endpoint methods not listed in this
136
+ # option should not be invoked. This option is the opposite of :except.
137
+ #
138
+ # Value should be a symbol/string or an array of symbols/strings.
139
+ #
140
+ def invoke_via_only?(rpc_method, filter)
141
+ only = [filter.fetch(:only) { [] }].flatten
142
+ only.empty? || only.include?(rpc_method)
143
+ end
144
+
145
+ # Invoke the given :unless callable (if any) and return the opposite
146
+ # of it's return value. Used by `invoke_filter?` which expects a true/false
147
+ # return value to determine if we should invoke the target filter.
148
+ #
149
+ # Value can either be a symbol/string indicating an instance method to call
150
+ # or an object that responds to `call`.
151
+ #
152
+ def invoke_via_unless?(_rpc_method, filter)
153
+ unless_check = filter.fetch(:unless) { ->(_service) { return false } }
154
+ skip_invoke = case
155
+ when unless_check.nil? then
156
+ false
157
+ else
158
+ call_or_send(unless_check)
159
+ end
160
+
161
+ !skip_invoke
162
+ end
163
+
164
+ def rescue_filters
165
+ self.class.rescue_filters
166
+ end
167
+
168
+ # Loop over the unwrapped filters and invoke them. An unwrapped filter
169
+ # is either a before or after filter, not an around filter.
170
+ #
171
+ def run_unwrapped_filters(unwrapped_filters, rpc_method, stop_on_false_return = false)
172
+ unwrapped_filters.each do |filter|
173
+ if invoke_filter?(rpc_method, filter)
174
+ return_value = call_or_send(filter[:callable])
175
+ return false if stop_on_false_return && return_value == false
176
+ end
177
+ end
178
+
179
+ true
180
+ end
181
+
182
+ # Reverse build a chain of around filters. To implement an around chain,
183
+ # simply build a method that yields control when it expects the underlying
184
+ # method to be invoked. If the endpoint should not be run (due to some
185
+ # condition), simply do not yield.
186
+ #
187
+ # Around filters are invoked in the order they are defined, outer to inner,
188
+ # with the inner-most method called being the actual rpc endpoint.
189
+ #
190
+ # Let's say you have a class defined with the following filters:
191
+ #
192
+ # class MyService
193
+ # around_filter :filter1, :filter2, :filter3
194
+ #
195
+ # def my_endpoint
196
+ # # do stuff
197
+ # end
198
+ # end
199
+ #
200
+ # When the my_endpoint method is invoked using Service#callable_rpc_method,
201
+ # It is similar to this call chain:
202
+ #
203
+ # filter1 do
204
+ # filter2 do
205
+ # filter3 do
206
+ # my_endpoint
207
+ # end
208
+ # end
209
+ # end
210
+ #
211
+ def run_around_filters(rpc_method)
212
+ final = -> { __send__(rpc_method) }
213
+ filters[:around].reverse.reduce(final) do |previous, filter|
214
+ if invoke_filter?(rpc_method, filter)
215
+ -> { call_or_send(filter[:callable], &previous) }
216
+ else
217
+ previous
218
+ end
219
+ end.call
220
+ end
221
+
222
+ # Entry method to call each filter type in the appropriate order. This should
223
+ # be used instead of the other run methods directly.
224
+ #
225
+ def run_filters(rpc_method)
226
+ run_rescue_filters do
227
+ continue = run_unwrapped_filters(filters[:before], rpc_method, true)
228
+ if continue
229
+ run_around_filters(rpc_method)
230
+ run_unwrapped_filters(filters[:after], rpc_method)
231
+ end
232
+ end
233
+ end
234
+
235
+ def run_rescue_filters
236
+ if rescue_filters.keys.empty?
237
+ yield
238
+ else
239
+ begin
240
+ yield
241
+ rescue *rescue_filters.keys => ex
242
+ callable = rescue_filters.fetch(ex.class) do
243
+ mapped_klass = rescue_filters.keys.find { |child_klass| ex.class < child_klass }
244
+ rescue_filters[mapped_klass]
245
+ end
246
+
247
+ call_or_send(callable, ex)
248
+ end
249
+ end
250
+ end
251
+
252
+ # Call the object if it is callable, otherwise invoke the method using
253
+ # __send__ assuming that we respond_to it. Return the call's return value.
254
+ #
255
+ def call_or_send(callable, *args, &block)
256
+ return_value = case
257
+ when callable.respond_to?(:call) then
258
+ callable.call(self, *args, &block)
259
+ when respond_to?(callable, true) then
260
+ __send__(callable, *args, &block)
261
+ else
262
+ fail "Object #{callable} is not callable"
263
+ end
264
+
265
+ return_value
266
+ end
267
+
268
+ end
269
+
270
+ end
271
+ end
272
+ end
@@ -0,0 +1,97 @@
1
+ require 'date'
2
+ require 'time'
3
+ require 'protobuf/logging'
4
+
5
+ module Protobuf
6
+ module Rpc
7
+ class Stat
8
+ attr_accessor :mode, :start_time, :end_time, :request_size, :dispatcher
9
+ attr_accessor :response_size, :client, :server, :service, :method_name
10
+
11
+ MODES = [:SERVER, :CLIENT].freeze
12
+
13
+ def initialize(mode = :SERVER)
14
+ @mode = mode
15
+ @request_size = 0
16
+ @response_size = 0
17
+ start
18
+ end
19
+
20
+ attr_writer :client
21
+
22
+ def client
23
+ @client || nil
24
+ end
25
+
26
+ def elapsed_time
27
+ (start_time && end_time ? "#{(end_time - start_time).round(4)}s" : nil)
28
+ end
29
+
30
+ def method_name
31
+ @method_name ||= @dispatcher.try(:service).try(:method_name)
32
+ end
33
+
34
+ def server=(peer)
35
+ @server = { :port => peer[0], :ip => peer[1] }
36
+ end
37
+
38
+ def server
39
+ @server ? "#{@server[:ip]}:#{@server[:port]}" : nil
40
+ end
41
+
42
+ def service
43
+ @service ||= @dispatcher.try(:service).class.name
44
+ end
45
+
46
+ def sizes
47
+ if stopped?
48
+ "#{@request_size}B/#{@response_size}B"
49
+ else
50
+ "#{@request_size}B/-"
51
+ end
52
+ end
53
+
54
+ def start
55
+ @start_time ||= ::Time.now
56
+ end
57
+
58
+ def stop
59
+ start unless @start_time
60
+ @end_time ||= ::Time.now
61
+ end
62
+
63
+ def stopped?
64
+ !end_time.nil?
65
+ end
66
+
67
+ def rpc
68
+ service && method_name ? "#{service}##{method_name}" : nil
69
+ end
70
+
71
+ def server?
72
+ @mode == :SERVER
73
+ end
74
+
75
+ def client?
76
+ @mode == :CLIENT
77
+ end
78
+
79
+ def to_s
80
+ [
81
+ server? ? "[SRV]" : "[CLT]",
82
+ server? ? client : server,
83
+ trace_id,
84
+ rpc,
85
+ sizes,
86
+ elapsed_time,
87
+ @end_time.try(:iso8601),
88
+ ].compact.join(' - ')
89
+ end
90
+
91
+ def trace_id
92
+ ::Thread.current.object_id.to_s(16)
93
+ end
94
+
95
+ end
96
+ end
97
+ end
@@ -0,0 +1,21 @@
1
+ ##
2
+ ## Socket Mode
3
+ ##
4
+ #
5
+ # Require this file if you wish to run your server and/or client RPC
6
+ # with the raw socket handlers. This is the default run mode for bin/rpc_server.
7
+ #
8
+ # To run with rpc_server either omit any mode switches, or explicitly pass `socket`:
9
+ #
10
+ # rpc_server myapp.rb
11
+ # rpc_server --socket myapp.rb
12
+ #
13
+ # To run for client-side only override the require in your Gemfile:
14
+ #
15
+ # gem 'protobuf', :require => 'protobuf/socket'
16
+ #
17
+ require 'protobuf'
18
+ ::Protobuf.connector_type = :socket
19
+
20
+ require 'protobuf/rpc/servers/socket/server'
21
+ require 'protobuf/rpc/connectors/socket'
@@ -0,0 +1 @@
1
+ load 'protobuf/tasks/compile.rake'
@@ -0,0 +1,61 @@
1
+ require 'fileutils'
2
+
3
+ namespace :protobuf do
4
+
5
+ desc 'Clean & Compile the protobuf source to ruby classes. Pass PB_NO_CLEAN=1 if you do not want to force-clean first.'
6
+ task :compile, [:package, :source, :destination, :plugin, :file_extension] do |_tasks, args|
7
+ args.with_defaults(:destination => 'lib')
8
+ args.with_defaults(:source => 'definitions')
9
+ args.with_defaults(:plugin => 'ruby')
10
+ args.with_defaults(:file_extension => '.pb.rb')
11
+
12
+ unless do_not_clean?
13
+ force_clean!
14
+ ::Rake::Task[:clean].invoke(args[:package], args[:destination], args[:file_extension])
15
+ end
16
+
17
+ command = []
18
+ command << "protoc"
19
+ command << "--#{args[:plugin]}_out=#{args[:destination]}"
20
+ command << "-I #{args[:source]}"
21
+ command << "#{args[:source]}/#{args[:package]}/*.proto"
22
+ command << "#{args[:source]}/#{args[:package]}/**/*.proto"
23
+ full_command = command.join(' ')
24
+
25
+ puts full_command
26
+ exec(full_command)
27
+ end
28
+
29
+ desc 'Clean the generated *.pb.rb files from the destination package. Pass PB_FORCE_CLEAN=1 to skip confirmation step.'
30
+ task :clean, [:package, :destination, :file_extension] do |_task, args|
31
+ args.with_defaults(:destination => 'lib')
32
+ args.with_defaults(:file_extension => '.pb.rb')
33
+
34
+ file_extension = args[:file_extension].sub(/\*?\.+/, '')
35
+ files_to_clean = ::File.join(args[:destination], args[:package], '**', "*.#{file_extension}")
36
+
37
+ if force_clean? || permission_to_clean?(files_to_clean)
38
+ ::Dir.glob(files_to_clean).each do |file|
39
+ ::FileUtils.rm(file)
40
+ end
41
+ end
42
+ end
43
+
44
+ def do_not_clean?
45
+ ! ::ENV.key?('PB_NO_CLEAN')
46
+ end
47
+
48
+ def force_clean?
49
+ ::ENV.key?('PB_FORCE_CLEAN')
50
+ end
51
+
52
+ def force_clean!
53
+ ::ENV['PB_FORCE_CLEAN'] = '1'
54
+ end
55
+
56
+ def permission_to_clean?(files_to_clean)
57
+ puts "Do you really want to remove files matching pattern #{files_to_clean}? (y/n)"
58
+ ::STDIN.gets.chomp =~ /y(es)?/i
59
+ end
60
+
61
+ end