protobuffy 3.6.0 → 4.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (209) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +1 -0
  3. data/.rubocop.yml +67 -0
  4. data/.rubocop_todo.yml +145 -0
  5. data/.travis.yml +25 -5
  6. data/CHANGES.md +55 -0
  7. data/CONTRIBUTING.md +1 -1
  8. data/LICENSE.txt +17 -9
  9. data/README.md +13 -12
  10. data/Rakefile +15 -11
  11. data/bin/protoc-gen-ruby +8 -3
  12. data/bin/rpc_server +1 -0
  13. data/examples/lib/example/reverse-client.rb +2 -2
  14. data/install-protobuf.sh +28 -0
  15. data/lib/protobuf.rb +57 -53
  16. data/lib/protobuf/cli.rb +94 -74
  17. data/lib/protobuf/code_generator.rb +60 -9
  18. data/lib/protobuf/decoder.rb +19 -65
  19. data/lib/protobuf/deprecation.rb +117 -0
  20. data/lib/protobuf/descriptors/google/protobuf/compiler/plugin.pb.rb +11 -1
  21. data/lib/protobuf/descriptors/google/protobuf/descriptor.pb.rb +55 -3
  22. data/lib/protobuf/encoder.rb +13 -53
  23. data/lib/protobuf/enum.rb +58 -63
  24. data/lib/protobuf/field.rb +4 -4
  25. data/lib/protobuf/field/base_field.rb +101 -173
  26. data/lib/protobuf/field/bool_field.rb +17 -11
  27. data/lib/protobuf/field/bytes_field.rb +21 -35
  28. data/lib/protobuf/field/double_field.rb +0 -1
  29. data/lib/protobuf/field/enum_field.rb +23 -22
  30. data/lib/protobuf/field/field_array.rb +5 -4
  31. data/lib/protobuf/field/fixed32_field.rb +1 -1
  32. data/lib/protobuf/field/fixed64_field.rb +0 -1
  33. data/lib/protobuf/field/float_field.rb +4 -1
  34. data/lib/protobuf/field/int32_field.rb +0 -1
  35. data/lib/protobuf/field/int64_field.rb +0 -1
  36. data/lib/protobuf/field/integer_field.rb +0 -1
  37. data/lib/protobuf/field/message_field.rb +13 -28
  38. data/lib/protobuf/field/sfixed32_field.rb +0 -1
  39. data/lib/protobuf/field/sfixed64_field.rb +0 -1
  40. data/lib/protobuf/field/signed_integer_field.rb +0 -1
  41. data/lib/protobuf/field/sint32_field.rb +0 -1
  42. data/lib/protobuf/field/sint64_field.rb +0 -1
  43. data/lib/protobuf/field/string_field.rb +2 -4
  44. data/lib/protobuf/field/uint32_field.rb +0 -1
  45. data/lib/protobuf/field/uint64_field.rb +0 -1
  46. data/lib/protobuf/field/varint_field.rb +30 -13
  47. data/lib/protobuf/generators/base.rb +30 -16
  48. data/lib/protobuf/generators/enum_generator.rb +6 -9
  49. data/lib/protobuf/generators/extension_generator.rb +1 -2
  50. data/lib/protobuf/generators/field_generator.rb +25 -13
  51. data/lib/protobuf/generators/file_generator.rb +157 -35
  52. data/lib/protobuf/generators/group_generator.rb +22 -17
  53. data/lib/protobuf/generators/message_generator.rb +13 -14
  54. data/lib/protobuf/generators/option_generator.rb +17 -0
  55. data/lib/protobuf/generators/printable.rb +12 -13
  56. data/lib/protobuf/generators/service_generator.rb +2 -3
  57. data/lib/protobuf/http.rb +2 -2
  58. data/lib/protobuf/lifecycle.rb +20 -33
  59. data/lib/protobuf/logging.rb +39 -0
  60. data/lib/protobuf/message.rb +114 -47
  61. data/lib/protobuf/message/fields.rb +170 -88
  62. data/lib/protobuf/message/serialization.rb +19 -18
  63. data/lib/protobuf/optionable.rb +53 -6
  64. data/lib/protobuf/rpc/buffer.rb +18 -19
  65. data/lib/protobuf/rpc/client.rb +22 -50
  66. data/lib/protobuf/rpc/connectors/base.rb +177 -12
  67. data/lib/protobuf/rpc/connectors/http.rb +14 -9
  68. data/lib/protobuf/rpc/connectors/ping.rb +89 -0
  69. data/lib/protobuf/rpc/connectors/socket.rb +13 -8
  70. data/lib/protobuf/rpc/connectors/zmq.rb +178 -73
  71. data/lib/protobuf/rpc/dynamic_discovery.pb.rb +4 -1
  72. data/lib/protobuf/rpc/env.rb +12 -12
  73. data/lib/protobuf/rpc/error.rb +3 -3
  74. data/lib/protobuf/rpc/error/client_error.rb +4 -4
  75. data/lib/protobuf/rpc/error/server_error.rb +9 -9
  76. data/lib/protobuf/rpc/middleware/exception_handler.rb +6 -2
  77. data/lib/protobuf/rpc/middleware/logger.rb +8 -4
  78. data/lib/protobuf/rpc/middleware/request_decoder.rb +17 -21
  79. data/lib/protobuf/rpc/middleware/response_encoder.rb +22 -27
  80. data/lib/protobuf/rpc/middleware/statsd.rb +3 -3
  81. data/lib/protobuf/rpc/rpc.pb.rb +4 -1
  82. data/lib/protobuf/rpc/server.rb +1 -1
  83. data/lib/protobuf/rpc/servers/http/server.rb +19 -17
  84. data/lib/protobuf/rpc/servers/socket/server.rb +78 -70
  85. data/lib/protobuf/rpc/servers/socket/worker.rb +4 -4
  86. data/lib/protobuf/rpc/servers/socket_runner.rb +27 -15
  87. data/lib/protobuf/rpc/servers/zmq/broker.rb +70 -31
  88. data/lib/protobuf/rpc/servers/zmq/server.rb +55 -47
  89. data/lib/protobuf/rpc/servers/zmq/util.rb +14 -13
  90. data/lib/protobuf/rpc/servers/zmq/worker.rb +16 -16
  91. data/lib/protobuf/rpc/servers/zmq_runner.rb +26 -7
  92. data/lib/protobuf/rpc/service.rb +21 -27
  93. data/lib/protobuf/rpc/service_directory.rb +43 -27
  94. data/lib/protobuf/rpc/service_dispatcher.rb +9 -10
  95. data/lib/protobuf/rpc/service_filters.rb +32 -55
  96. data/lib/protobuf/rpc/stat.rb +4 -8
  97. data/lib/protobuf/socket.rb +1 -2
  98. data/lib/protobuf/tasks/compile.rake +3 -4
  99. data/lib/protobuf/varint.rb +9 -0
  100. data/lib/protobuf/varint_pure.rb +13 -0
  101. data/lib/protobuf/version.rb +1 -1
  102. data/lib/protobuf/zmq.rb +2 -2
  103. data/proto/google/protobuf/descriptor.proto +190 -31
  104. data/protobuffy.gemspec +30 -17
  105. data/spec/benchmark/tasks.rb +27 -19
  106. data/spec/bin/protoc-gen-ruby_spec.rb +11 -6
  107. data/spec/encoding/all_types_spec.rb +96 -84
  108. data/spec/encoding/extreme_values_spec.rb +0 -0
  109. data/spec/functional/class_inheritance_spec.rb +52 -0
  110. data/spec/functional/code_generator_spec.rb +38 -0
  111. data/spec/functional/socket_server_spec.rb +15 -15
  112. data/spec/functional/zmq_server_spec.rb +29 -27
  113. data/spec/lib/protobuf/cli_spec.rb +82 -67
  114. data/spec/lib/protobuf/code_generator_spec.rb +37 -10
  115. data/spec/lib/protobuf/enum_spec.rb +77 -46
  116. data/spec/lib/protobuf/field/bool_field_spec.rb +91 -0
  117. data/spec/lib/protobuf/field/double_field_spec.rb +9 -0
  118. data/spec/lib/protobuf/field/enum_field_spec.rb +26 -0
  119. data/spec/lib/protobuf/field/field_array_spec.rb +69 -0
  120. data/spec/lib/protobuf/field/fixed32_field_spec.rb +7 -0
  121. data/spec/lib/protobuf/field/fixed64_field_spec.rb +7 -0
  122. data/spec/lib/protobuf/field/float_field_spec.rb +90 -0
  123. data/spec/lib/protobuf/field/int32_field_spec.rb +114 -1
  124. data/spec/lib/protobuf/field/int64_field_spec.rb +7 -0
  125. data/spec/lib/protobuf/field/message_field_spec.rb +132 -0
  126. data/spec/lib/protobuf/field/sfixed32_field_spec.rb +9 -0
  127. data/spec/lib/protobuf/field/sfixed64_field_spec.rb +9 -0
  128. data/spec/lib/protobuf/field/sint32_field_spec.rb +9 -0
  129. data/spec/lib/protobuf/field/sint64_field_spec.rb +9 -0
  130. data/spec/lib/protobuf/field/string_field_spec.rb +44 -11
  131. data/spec/lib/protobuf/field/uint32_field_spec.rb +7 -0
  132. data/spec/lib/protobuf/field/uint64_field_spec.rb +7 -0
  133. data/spec/lib/protobuf/field_spec.rb +4 -6
  134. data/spec/lib/protobuf/generators/base_spec.rb +80 -13
  135. data/spec/lib/protobuf/generators/enum_generator_spec.rb +35 -21
  136. data/spec/lib/protobuf/generators/extension_generator_spec.rb +12 -13
  137. data/spec/lib/protobuf/generators/field_generator_spec.rb +73 -21
  138. data/spec/lib/protobuf/generators/file_generator_spec.rb +89 -6
  139. data/spec/lib/protobuf/generators/service_generator_spec.rb +25 -13
  140. data/spec/lib/protobuf/lifecycle_spec.rb +25 -20
  141. data/spec/lib/protobuf/message_spec.rb +578 -79
  142. data/spec/lib/protobuf/optionable_spec.rb +202 -26
  143. data/spec/lib/protobuf/rpc/client_spec.rb +16 -16
  144. data/spec/lib/protobuf/rpc/connectors/base_spec.rb +167 -13
  145. data/spec/lib/protobuf/rpc/connectors/connector_spec.rb +4 -5
  146. data/spec/lib/protobuf/rpc/connectors/http_spec.rb +13 -11
  147. data/spec/lib/protobuf/rpc/connectors/ping_spec.rb +69 -0
  148. data/spec/lib/protobuf/rpc/connectors/socket_spec.rb +6 -7
  149. data/spec/lib/protobuf/rpc/connectors/zmq_spec.rb +35 -52
  150. data/spec/lib/protobuf/rpc/middleware/exception_handler_spec.rb +10 -10
  151. data/spec/lib/protobuf/rpc/middleware/logger_spec.rb +11 -11
  152. data/spec/lib/protobuf/rpc/middleware/request_decoder_spec.rb +23 -23
  153. data/spec/lib/protobuf/rpc/middleware/response_encoder_spec.rb +11 -11
  154. data/spec/lib/protobuf/rpc/middleware/statsd_spec.rb +6 -6
  155. data/spec/lib/protobuf/rpc/servers/http/server_spec.rb +47 -44
  156. data/spec/lib/protobuf/rpc/servers/socket_server_spec.rb +6 -6
  157. data/spec/lib/protobuf/rpc/servers/zmq/server_spec.rb +12 -10
  158. data/spec/lib/protobuf/rpc/servers/zmq/util_spec.rb +11 -11
  159. data/spec/lib/protobuf/rpc/servers/zmq/worker_spec.rb +7 -7
  160. data/spec/lib/protobuf/rpc/service_directory_spec.rb +47 -49
  161. data/spec/lib/protobuf/rpc/service_dispatcher_spec.rb +8 -25
  162. data/spec/lib/protobuf/rpc/service_filters_spec.rb +102 -69
  163. data/spec/lib/protobuf/rpc/service_spec.rb +37 -36
  164. data/spec/lib/protobuf/rpc/stat_spec.rb +7 -9
  165. data/spec/lib/protobuf/varint_spec.rb +29 -0
  166. data/spec/lib/protobuf_spec.rb +55 -28
  167. data/spec/spec_helper.rb +12 -27
  168. data/spec/support/all.rb +0 -1
  169. data/spec/support/packed_field.rb +4 -3
  170. data/spec/support/{test → protos}/all_types.data.bin +0 -0
  171. data/spec/support/{test → protos}/all_types.data.txt +0 -0
  172. data/spec/support/{test → protos}/enum.pb.rb +8 -4
  173. data/spec/support/{test → protos}/enum.proto +4 -1
  174. data/spec/support/{test → protos}/extreme_values.data.bin +0 -0
  175. data/spec/support/protos/google_unittest.bin +0 -0
  176. data/spec/support/protos/google_unittest.pb.rb +798 -0
  177. data/spec/support/{test → protos}/google_unittest.proto +237 -66
  178. data/spec/support/protos/google_unittest_custom_options.bin +0 -0
  179. data/spec/support/protos/google_unittest_custom_options.pb.rb +268 -0
  180. data/spec/support/protos/google_unittest_custom_options.proto +424 -0
  181. data/spec/support/protos/google_unittest_import.pb.rb +55 -0
  182. data/spec/support/{test → protos}/google_unittest_import.proto +19 -10
  183. data/spec/support/protos/google_unittest_import_public.pb.rb +31 -0
  184. data/spec/support/{test → protos}/google_unittest_import_public.proto +8 -5
  185. data/spec/support/{test → protos}/multi_field_extensions.pb.rb +5 -2
  186. data/spec/support/{test → protos}/multi_field_extensions.proto +2 -0
  187. data/spec/support/{test → protos}/resource.pb.rb +47 -11
  188. data/spec/support/{test → protos}/resource.proto +24 -1
  189. data/spec/support/resource_service.rb +23 -0
  190. data/spec/support/server.rb +32 -61
  191. metadata +119 -59
  192. data/lib/protobuf/deprecator.rb +0 -42
  193. data/lib/protobuf/logger.rb +0 -93
  194. data/lib/protobuf/rpc/connector.rb +0 -21
  195. data/lib/protobuf/rpc/connectors/common.rb +0 -172
  196. data/spec/data/data.bin +0 -3
  197. data/spec/data/types.bin +0 -0
  198. data/spec/lib/protobuf/logger_spec.rb +0 -145
  199. data/spec/lib/protobuf/rpc/connector_spec.rb +0 -26
  200. data/spec/lib/protobuf/rpc/connectors/common_spec.rb +0 -170
  201. data/spec/support/test/defaults.pb.rb +0 -25
  202. data/spec/support/test/defaults.proto +0 -9
  203. data/spec/support/test/extended.pb.rb +0 -22
  204. data/spec/support/test/extended.proto +0 -10
  205. data/spec/support/test/google_unittest.pb.rb +0 -543
  206. data/spec/support/test/google_unittest_import.pb.rb +0 -37
  207. data/spec/support/test/google_unittest_import_public.pb.rb +0 -8
  208. data/spec/support/test/resource_service.rb +0 -26
  209. data/spec/support/tolerance_matcher.rb +0 -40
@@ -8,8 +8,8 @@ module Protobuf
8
8
  class PbError < StandardError
9
9
  attr_reader :error_type
10
10
 
11
- def initialize(message='An unknown RpcError occurred', error_type='RPC_ERROR')
12
- @error_type = error_type.is_a?(String) ? Socketrpc::ErrorReason.const_get(error_type) : error_type
11
+ def initialize(message = 'An unknown RpcError occurred', error_type = 'RPC_ERROR')
12
+ @error_type = error_type.is_a?(String) ? ::Protobuf::Socketrpc::ErrorReason.const_get(error_type) : error_type
13
13
  super message
14
14
  end
15
15
 
@@ -18,7 +18,7 @@ module Protobuf
18
18
  end
19
19
 
20
20
  def to_response
21
- Socketrpc::Response.new(:error => message, :error_reason => error_type)
21
+ ::Protobuf::Socketrpc::Response.new(:error => message, :error_reason => error_type)
22
22
  end
23
23
  end
24
24
  end
@@ -4,25 +4,25 @@ module Protobuf
4
4
  module Rpc
5
5
 
6
6
  class InvalidRequestProto < PbError
7
- def initialize(message='Invalid request type given')
7
+ def initialize(message = 'Invalid request type given')
8
8
  super message, 'INVALID_REQUEST_PROTO'
9
9
  end
10
10
  end
11
11
 
12
12
  class BadResponseProto < PbError
13
- def initialize(message='Bad response type from server')
13
+ def initialize(message = 'Bad response type from server')
14
14
  super message, 'BAD_RESPONSE_PROTO'
15
15
  end
16
16
  end
17
17
 
18
18
  class UnkownHost < PbError
19
- def initialize(message='Unknown host or port')
19
+ def initialize(message = 'Unknown host or port')
20
20
  super message, 'UNKNOWN_HOST'
21
21
  end
22
22
  end
23
23
 
24
24
  class IOError < PbError
25
- def initialize(message='IO Error occurred')
25
+ def initialize(message = 'IO Error occurred')
26
26
  super message, 'IO_ERROR'
27
27
  end
28
28
  end
@@ -4,55 +4,55 @@ module Protobuf
4
4
  module Rpc
5
5
 
6
6
  class BadRequestData < PbError
7
- def initialize message='Unable to parse request'
7
+ def initialize(message = 'Unable to parse request')
8
8
  super message, 'BAD_REQUEST_DATA'
9
9
  end
10
10
  end
11
11
 
12
12
  class BadRequestProto < PbError
13
- def initialize message='Request is of wrong type'
13
+ def initialize(message = 'Request is of wrong type')
14
14
  super message, 'BAD_REQUEST_PROTO'
15
15
  end
16
16
  end
17
17
 
18
18
  class ServiceNotFound < PbError
19
- def initialize message='Service class not found'
19
+ def initialize(message = 'Service class not found')
20
20
  super message, 'SERVICE_NOT_FOUND'
21
21
  end
22
22
  end
23
23
 
24
24
  class MethodNotFound < PbError
25
- def initialize message='Service method not found'
25
+ def initialize(message = 'Service method not found')
26
26
  super message, 'METHOD_NOT_FOUND'
27
27
  end
28
28
  end
29
29
 
30
30
  class RpcError < PbError
31
- def initialize message='RPC exception occurred'
31
+ def initialize(message = 'RPC exception occurred')
32
32
  super message, 'RPC_ERROR'
33
33
  end
34
34
  end
35
35
 
36
36
  class RpcFailed < PbError
37
- def initialize message='RPC failed'
37
+ def initialize(message = 'RPC failed')
38
38
  super message, 'RPC_FAILED'
39
39
  end
40
40
  end
41
41
 
42
42
  class UnauthorizedRequest < PbError
43
- def initialize message='The request requires user authentication'
43
+ def initialize(message = 'The request requires user authentication')
44
44
  super message, 'UNAUTHORIZED_REQUEST'
45
45
  end
46
46
  end
47
47
 
48
48
  class ForbiddenRequest < PbError
49
- def initialize message='User authentificated but does not have permissions'
49
+ def initialize(message = 'User authentificated but does not have permissions')
50
50
  super message, 'FORBIDDEN_REQUEST'
51
51
  end
52
52
  end
53
53
 
54
54
  class DataNotFound < PbError
55
- def initialize message='Requested data not found'
55
+ def initialize(message = 'Requested data not found')
56
56
  super message, 'DATA_NOT_FOUND'
57
57
  end
58
58
  end
@@ -2,7 +2,7 @@ module Protobuf
2
2
  module Rpc
3
3
  module Middleware
4
4
  class ExceptionHandler
5
- include ::Protobuf::Logger::LogMethods
5
+ include ::Protobuf::Logging
6
6
 
7
7
  attr_reader :app
8
8
 
@@ -11,6 +11,10 @@ module Protobuf
11
11
  end
12
12
 
13
13
  def call(env)
14
+ dup._call(env)
15
+ end
16
+
17
+ def _call(env)
14
18
  app.call(env)
15
19
  rescue => exception
16
20
  log_exception(exception)
@@ -22,7 +26,7 @@ module Protobuf
22
26
  env
23
27
  end
24
28
 
25
- private
29
+ private
26
30
 
27
31
  # Wrap exceptions in a generic Protobuf errors unless they already are
28
32
  #
@@ -8,6 +8,10 @@ module Protobuf
8
8
 
9
9
  # TODO: Figure out how to control when logs are flushed
10
10
  def call(env)
11
+ dup._call(env)
12
+ end
13
+
14
+ def _call(env)
11
15
  instrumenter.start
12
16
  instrumenter.flush(env) # Log request stats
13
17
 
@@ -19,7 +23,7 @@ module Protobuf
19
23
  env
20
24
  end
21
25
 
22
- private
26
+ private
23
27
 
24
28
  def instrumenter
25
29
  @instrumenter ||= Instrumenter.new
@@ -42,7 +46,7 @@ module Protobuf
42
46
  attr_reader :env
43
47
 
44
48
  def flush(env)
45
- Protobuf::Logger.info { to_s(env) }
49
+ ::Protobuf::Logging.logger.info { to_s(env) }
46
50
  end
47
51
 
48
52
  def start
@@ -63,11 +67,11 @@ module Protobuf
63
67
  rpc,
64
68
  sizes,
65
69
  elapsed_time,
66
- @end_time.try(:iso8601)
70
+ @end_time.try(:iso8601),
67
71
  ].compact.join(' - ')
68
72
  end
69
73
 
70
- private
74
+ private
71
75
 
72
76
  def elapsed_time
73
77
  (@start_time && @end_time ? "#{(@end_time - @start_time).round(4)}s" : nil)
@@ -2,7 +2,7 @@ module Protobuf
2
2
  module Rpc
3
3
  module Middleware
4
4
  class RequestDecoder
5
- include ::Protobuf::Logger::LogMethods
5
+ include ::Protobuf::Logging
6
6
 
7
7
  attr_reader :app, :env
8
8
 
@@ -11,8 +11,13 @@ module Protobuf
11
11
  end
12
12
 
13
13
  def call(env)
14
+ dup._call(env)
15
+ end
16
+
17
+ def _call(env)
14
18
  @env = env
15
19
 
20
+ logger.debug { sign_message("Decoding request: #{env.encoded_request}") }
16
21
  env.service_name = service_name
17
22
  env.method_name = method_name
18
23
  env.request = request
@@ -30,38 +35,29 @@ module Protobuf
30
35
  env.log_signature || super
31
36
  end
32
37
 
33
- private
38
+ private
34
39
 
35
40
  def method_name
36
- @method_name ||= begin
37
- method_name = request_wrapper.method_name.underscore.to_sym
38
-
39
- unless service.rpc_method?(method_name)
40
- raise MethodNotFound.new("#{service.name}##{method_name} is not a defined RPC method.")
41
- end
41
+ return @method_name unless @method_name.nil?
42
42
 
43
- method_name
44
- end
43
+ @method_name = request_wrapper.method_name.underscore.to_sym
44
+ fail MethodNotFound, "#{service.name}##{@method_name} is not a defined RPC method." unless service.rpc_method?(@method_name)
45
+ @method_name
45
46
  end
46
47
 
47
48
  def request
48
- @request ||= begin
49
- data = request_wrapper.request_proto
50
- rpc_method.request_type.decode(data)
51
- end
49
+ fail if request_wrapper.request_proto.blank?
50
+ @request ||= rpc_method.request_type.decode(request_wrapper.request_proto)
52
51
  rescue => exception
53
- raise BadRequestData.new("Unable to decode request: #{exception.message}")
52
+ raise BadRequestData, "Unable to decode request: #{exception.message}"
54
53
  end
55
54
 
56
55
  # Decode the incoming request object into our expected request object
57
56
  #
58
57
  def request_wrapper
59
- @request_wrapper ||= begin
60
- log_debug { sign_message("Decoding request: #{env.encoded_request}") }
61
- Socketrpc::Request.decode(env.encoded_request)
62
- end
58
+ @request_wrapper ||= ::Protobuf::Socketrpc::Request.decode(env.encoded_request)
63
59
  rescue => exception
64
- raise BadRequestData.new("Unable to decode request: #{exception.message}")
60
+ raise BadRequestData, "Unable to decode request: #{exception.message}"
65
61
  end
66
62
 
67
63
  def rpc_method
@@ -71,7 +67,7 @@ module Protobuf
71
67
  def service
72
68
  @service ||= service_name.constantize
73
69
  rescue NameError
74
- raise ServiceNotFound.new("Service class #{service_name} is not defined.")
70
+ raise ServiceNotFound, "Service class #{service_name} is not defined."
75
71
  end
76
72
 
77
73
  def service_name
@@ -2,7 +2,7 @@ module Protobuf
2
2
  module Rpc
3
3
  module Middleware
4
4
  class ResponseEncoder
5
- include ::Protobuf::Logger::LogMethods
5
+ include ::Protobuf::Logging
6
6
 
7
7
  attr_reader :app, :env
8
8
 
@@ -11,6 +11,10 @@ module Protobuf
11
11
  end
12
12
 
13
13
  def call(env)
14
+ dup._call(env)
15
+ end
16
+
17
+ def _call(env)
14
18
  @env = app.call(env)
15
19
 
16
20
  env.response = response
@@ -22,12 +26,12 @@ module Protobuf
22
26
  env.log_signature || super
23
27
  end
24
28
 
25
- private
29
+ private
26
30
 
27
31
  # Encode the response wrapper to return to the client
28
32
  #
29
33
  def encoded_response
30
- log_debug { sign_message("Encoding response: #{response.inspect}") }
34
+ logger.debug { sign_message("Encoding response: #{response.inspect}") }
31
35
 
32
36
  env.encoded_response = wrapped_response.encode
33
37
  rescue => exception
@@ -35,38 +39,29 @@ module Protobuf
35
39
 
36
40
  # Rescue encoding exceptions, re-wrap them as generic protobuf errors,
37
41
  # and re-raise them
38
- raise PbError.new(exception.message)
42
+ raise PbError, exception.message
39
43
  end
40
44
 
41
45
  # Prod the object to see if we can produce a proto object as a response
42
46
  # candidate. Validate the candidate protos.
43
47
  def response
44
- @response ||= begin
45
- candidate = env.response
46
- case
47
- when candidate.is_a?(Message) then
48
- validate!(candidate)
49
- when candidate.respond_to?(:to_proto) then
50
- validate!(candidate.to_proto)
51
- when candidate.respond_to?(:to_hash) then
52
- env.response_type.new(candidate.to_hash)
53
- when candidate.is_a?(PbError) then
54
- candidate
55
- else
56
- validate!(candidate)
57
- end
58
- end
48
+ return @response unless @response.nil?
49
+
50
+ candidate = env.response
51
+ return @response = validate!(candidate) if candidate.is_a?(Message)
52
+ return @response = validate!(candidate.to_proto) if candidate.respond_to?(:to_proto)
53
+ return @response = env.response_type.new(candidate.to_hash) if candidate.respond_to?(:to_hash)
54
+ return @response = candidate if candidate.is_a?(PbError)
55
+
56
+ @response = validate!(candidate)
59
57
  end
60
58
 
61
59
  # Ensure that the response candidate we've been given is of the type
62
60
  # we expect so that deserialization on the client side works.
63
61
  #
64
62
  def validate!(candidate)
65
- actual = candidate.class
66
- expected = env.response_type
67
-
68
- if expected != actual
69
- raise BadResponseProto.new("Expected response to be of type #{expected.name} but was #{actual.name}")
63
+ if candidate.class != env.response_type
64
+ fail BadResponseProto, "Expected response to be of type #{env.response_type.name} but was #{candidate.class.name}"
70
65
  end
71
66
 
72
67
  candidate
@@ -76,10 +71,10 @@ module Protobuf
76
71
  # it up so that it's in the correct spot in the response wrapper
77
72
  #
78
73
  def wrapped_response
79
- if response.is_a?(Protobuf::Rpc::PbError)
80
- Socketrpc::Response.new(:error => response.message, :error_reason => response.error_type)
74
+ if response.is_a?(::Protobuf::Rpc::PbError)
75
+ ::Protobuf::Socketrpc::Response.new(:error => response.message, :error_reason => response.error_type)
81
76
  else
82
- Socketrpc::Response.new(:response_proto => response.encode)
77
+ ::Protobuf::Socketrpc::Response.new(:response_proto => response.encode)
83
78
  end
84
79
  end
85
80
  end
@@ -4,6 +4,8 @@ module Protobuf
4
4
  module Rpc
5
5
  module Middleware
6
6
  class Statsd
7
+ include ::Protobuf::Logging
8
+
7
9
  def initialize(app)
8
10
  @app = app
9
11
  end
@@ -23,8 +25,6 @@ module Protobuf
23
25
  def statsd_base_path(env)
24
26
  if env.service_name && env.method_name
25
27
  "rpc-server.#{env.service_name}.#{env.method_name}".gsub('::', '.').downcase
26
- else
27
- nil
28
28
  end
29
29
  end
30
30
 
@@ -46,7 +46,7 @@ module Protobuf
46
46
  statsd_client.timing("#{path}.time", end_time - start_time)
47
47
  rescue => e
48
48
  # We insert ourself after Exception handler, so no exceptions allowed!
49
- Protobuf::Logger.warn { "Error with Statsd middleware: #{e.message}" }
49
+ logger.warn { "Error with Statsd middleware: #{e.message}" }
50
50
  end
51
51
  private :record_stats
52
52
  end
@@ -1,10 +1,13 @@
1
+ # encoding: utf-8
2
+
1
3
  ##
2
4
  # This file is auto-generated. DO NOT EDIT!
3
5
  #
4
- require 'protobuf/message'
6
+ require 'protobuf'
5
7
 
6
8
  module Protobuf
7
9
  module Socketrpc
10
+ ::Protobuf::Optionable.inject(self) { ::Google::Protobuf::FileOptions }
8
11
 
9
12
  ##
10
13
  # Enum Classes
@@ -1,5 +1,5 @@
1
1
  require 'protobuf'
2
- require 'protobuf/logger'
2
+ require 'protobuf/logging'
3
3
  require 'protobuf/rpc/rpc.pb'
4
4
  require 'protobuf/rpc/buffer'
5
5
  require 'protobuf/rpc/env'
@@ -8,7 +8,7 @@ module Protobuf
8
8
  module Http
9
9
  class Server
10
10
  include ::Protobuf::Rpc::Server
11
- include ::Protobuf::Logger::LogMethods
11
+ include ::Protobuf::Logging
12
12
 
13
13
  # TODO: more comprehensive mapping?
14
14
  HTTP_STATUSES = {
@@ -24,8 +24,8 @@ module Protobuf
24
24
  Protobuf::Socketrpc::ErrorReason::INVALID_REQUEST_PROTO => 500,
25
25
  Protobuf::Socketrpc::ErrorReason::BAD_RESPONSE_PROTO => 500,
26
26
  Protobuf::Socketrpc::ErrorReason::UNKNOWN_HOST => 500,
27
- Protobuf::Socketrpc::ErrorReason::IO_ERROR => 500
28
- }
27
+ Protobuf::Socketrpc::ErrorReason::IO_ERROR => 500,
28
+ }.freeze
29
29
 
30
30
  def initialize(options = {})
31
31
  @options = options
@@ -36,11 +36,13 @@ module Protobuf
36
36
  end
37
37
 
38
38
  def call(env)
39
- path_components = env['PATH_INFO'].split("/").map{ |x| CGI::unescape(x) }.compact.reject{ |x| x.empty? }
39
+ path_components = env['PATH_INFO'].split("/")
40
+ .map { |x| CGI.unescape(x) }
41
+ .compact.reject(&:empty?)
40
42
  if path_components.length < 2
41
43
  return protobuf_http_response 400,
42
- :error => "Expected path format /CLASS/METHOD",
43
- :reason => Protobuf::Socketrpc::ErrorReason::INVALID_REQUEST_PROTO
44
+ :error => "Expected path format /CLASS/METHOD",
45
+ :reason => Protobuf::Socketrpc::ErrorReason::INVALID_REQUEST_PROTO
44
46
  end
45
47
 
46
48
  service_name = path_components[0..-2].join("::")
@@ -53,26 +55,26 @@ module Protobuf
53
55
  :caller => env['HTTP_X_PROTOBUF_CALLER'] || ''
54
56
  )
55
57
 
56
- encoded_request = rpc_request.encode()
58
+ encoded_request = rpc_request.encode
57
59
 
58
60
  begin
59
61
  encoded_response = handle_request(encoded_request, env)
60
- rescue Exception => e
62
+ rescue StandardError => e
61
63
  return protobuf_http_response 500,
62
- :error => "Handle request failed: #{e.to_s}",
63
- :reason => Protobuf::Socketrpc::ErrorReason::RPC_ERROR
64
+ :error => "Handle request failed: #{e}",
65
+ :reason => Protobuf::Socketrpc::ErrorReason::RPC_ERROR
64
66
  end
65
67
 
66
68
  rpc_response = Protobuf::Socketrpc::Response.decode(encoded_response)
67
69
 
68
- if rpc_response[:error].length > 0
69
- status = HTTP_STATUSES[rpc_response[:error_reason]] or 500
70
+ if rpc_response[:error].present?
71
+ status = HTTP_STATUSES[rpc_response[:error_reason]] || 500
70
72
  return protobuf_http_response status,
71
- :error => rpc_response[:error],
72
- :reason => rpc_response[:error_reason]
73
+ :error => rpc_response[:error],
74
+ :reason => rpc_response[:error_reason]
73
75
  end
74
-
75
- return protobuf_http_response 200, :body => rpc_response['response_proto']
76
+
77
+ protobuf_http_response 200, :body => rpc_response['response_proto']
76
78
  end
77
79
 
78
80
  def protobuf_http_response(status, options)
@@ -93,7 +95,7 @@ module Protobuf
93
95
  end
94
96
 
95
97
  def running?
96
- !!@running
98
+ !!@running # rubocop:disable Style/DoubleNegation
97
99
  end
98
100
 
99
101
  def stop