protobuffy 3.6.0 → 4.0.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 (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
@@ -2,6 +2,7 @@ require 'protobuf/generators/enum_generator'
2
2
  require 'protobuf/generators/extension_generator'
3
3
  require 'protobuf/generators/field_generator'
4
4
  require 'protobuf/generators/message_generator'
5
+ require 'protobuf/generators/option_generator'
5
6
  require 'protobuf/generators/service_generator'
6
7
 
7
8
  module Protobuf
@@ -18,10 +19,14 @@ module Protobuf
18
19
  @comments = {}
19
20
  @handlers = {}
20
21
  @indent_level = indent_level
21
- @order = [ :enum, :message_declaration, :message, :extended_message, :service ]
22
+ @order = [:enum, :message_declaration, :options, :message, :extended_message, :service]
22
23
  init_printer(indent_level)
23
24
  end
24
25
 
26
+ def add_options(option_descriptor)
27
+ @groups[:options] << OptionGenerator.new(option_descriptor, indent_level)
28
+ end
29
+
25
30
  def add_enums(enum_descriptors, options)
26
31
  enum_descriptors.each do |enum_descriptor|
27
32
  @groups[:enum] << EnumGenerator.new(enum_descriptor, indent_level, options)
@@ -32,8 +37,9 @@ module Protobuf
32
37
  @comments[type] = message
33
38
  end
34
39
 
35
- def add_extended_messages(extended_messages)
40
+ def add_extended_messages(extended_messages, skip_empty_fields = true)
36
41
  extended_messages.each do |message_type, field_descriptors|
42
+ next if skip_empty_fields && field_descriptors.empty?
37
43
  @groups[:extended_message] << ExtensionGenerator.new(message_type, field_descriptors, indent_level)
38
44
  end
39
45
  end
@@ -80,25 +86,25 @@ module Protobuf
80
86
  def compile
81
87
  @order.each do |type|
82
88
  items = @groups[type]
83
- if items.count > 0
84
- item_handler = @handlers[type]
89
+ next if items.empty?
85
90
 
86
- item_header = @headers[type]
87
- header(item_header) if item_header
91
+ item_handler = @handlers[type]
88
92
 
89
- item_comment = @comments[type]
90
- comment(item_comment) if item_comment
93
+ item_header = @headers[type]
94
+ header(item_header) if item_header
91
95
 
92
- items.each do |item|
93
- if item_handler
94
- puts item_handler.call(item)
95
- else
96
- print item.to_s
97
- end
98
- end
96
+ item_comment = @comments[type]
97
+ comment(item_comment) if item_comment
99
98
 
100
- puts if type == :message_declaration
99
+ items.each do |item|
100
+ if item_handler
101
+ puts item_handler.call(item)
102
+ else
103
+ print item.to_s
104
+ end
101
105
  end
106
+
107
+ puts if type == :message_declaration || type == :options
102
108
  end
103
109
  end
104
110
 
@@ -110,4 +116,3 @@ module Protobuf
110
116
  end
111
117
  end
112
118
  end
113
-
@@ -23,7 +23,7 @@ module Protobuf
23
23
 
24
24
  def compile_declaration
25
25
  run_once(:compile_declaration) do
26
- if is_printable?
26
+ if printable?
27
27
  print_class(descriptor.name, :message) do
28
28
  group = GroupGenerator.new(current_indent)
29
29
  group.add_enums(descriptor.enum_type, :namespace => type_namespace)
@@ -38,7 +38,7 @@ module Protobuf
38
38
 
39
39
  def compile_message
40
40
  run_once(:compile_message) do
41
- if is_printable?
41
+ if printable?
42
42
  print_class(descriptor.name, nil) do
43
43
  group = GroupGenerator.new(current_indent)
44
44
  group.add_messages(descriptor.nested_type, :extension_fields => @extension_fields, :namespace => type_namespace)
@@ -52,7 +52,7 @@ module Protobuf
52
52
 
53
53
  group.add_extension_fields(message_extension_fields)
54
54
 
55
- group.order = [ :message, :field, :extension_range, :extension_field ]
55
+ group.order = [:message, :field, :extension_range, :extension_field]
56
56
  print group.to_s
57
57
  end
58
58
  end
@@ -61,31 +61,31 @@ module Protobuf
61
61
 
62
62
  private
63
63
 
64
- def has_extensions?
65
- ! message_extension_fields.empty?
64
+ def extensions?
65
+ !message_extension_fields.empty?
66
66
  end
67
67
 
68
- def has_fields?
68
+ def fields?
69
69
  descriptor.field.count > 0
70
70
  end
71
71
 
72
- def has_nested_enums?
72
+ def nested_enums?
73
73
  descriptor.enum_type.count > 0
74
74
  end
75
75
 
76
- def has_nested_messages?
76
+ def nested_messages?
77
77
  descriptor.nested_type.count > 0
78
78
  end
79
79
 
80
- def has_nested_types?
81
- has_nested_enums? || has_nested_messages?
80
+ def nested_types?
81
+ nested_enums? || nested_messages?
82
82
  end
83
83
 
84
- def is_printable?
84
+ def printable?
85
85
  if @only_declarations
86
- has_nested_types?
86
+ nested_types?
87
87
  else
88
- has_fields? || has_nested_messages? || has_extensions?
88
+ fields? || nested_messages? || extensions?
89
89
  end
90
90
  end
91
91
 
@@ -96,4 +96,3 @@ module Protobuf
96
96
  end
97
97
  end
98
98
  end
99
-
@@ -0,0 +1,17 @@
1
+ require 'protobuf/generators/base'
2
+
3
+ module Protobuf
4
+ module Generators
5
+ class OptionGenerator < Base
6
+ def compile
7
+ run_once(:compile) do
8
+ descriptor.each_field.map do |field, value|
9
+ next unless descriptor.field?(field.name)
10
+ serialized_value = serialize_value(value)
11
+ puts "set_option #{field.fully_qualified_name.inspect}, #{serialized_value}"
12
+ end
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
@@ -11,9 +11,13 @@ module Protobuf
11
11
  #
12
12
  def init_printer(indent_level)
13
13
  @io = ::StringIO.new
14
- @_indent_level = indent_level.to_i || 0
14
+ self.current_indent = indent_level.to_i
15
15
  end
16
16
 
17
+ protected
18
+
19
+ attr_accessor :current_indent
20
+
17
21
  private
18
22
 
19
23
  # Print a one-line comment.
@@ -22,10 +26,6 @@ module Protobuf
22
26
  puts "# #{message}"
23
27
  end
24
28
 
25
- def current_indent
26
- @_indent_level
27
- end
28
-
29
29
  # Print a "header" comment.
30
30
  #
31
31
  # header("Lorem ipsum dolor")
@@ -43,7 +43,7 @@ module Protobuf
43
43
  # (after the block is finished).
44
44
  #
45
45
  def indent
46
- @_indent_level += 1
46
+ self.current_indent += 1
47
47
  yield
48
48
  outdent
49
49
  end
@@ -61,14 +61,14 @@ module Protobuf
61
61
  #
62
62
  def modulize(name)
63
63
  name = name.gsub(/\./, '::')
64
- name = name.gsub(/(^(?:::)?[a-z]|::[a-z])/) { |match| match.upcase }
64
+ name = name.gsub(/(^(?:::)?[a-z]|::[a-z])/, &:upcase)
65
65
  name
66
66
  end
67
67
 
68
68
  # Decrease the indent level. Cannot be negative.
69
69
  #
70
70
  def outdent
71
- @_indent_level -= 1 unless @_indent_level == 0
71
+ self.current_indent -= 1 unless current_indent.zero?
72
72
  end
73
73
 
74
74
  # Return the parent class for a given type.
@@ -84,7 +84,7 @@ module Protobuf
84
84
  when :service then
85
85
  PARENT_CLASS_SERVICE
86
86
  else
87
- raise "Unknown parent class type #{type}: #{caller[0..5].join("\n")}"
87
+ fail "Unknown parent class type #{type}: #{caller[0..5].join("\n")}"
88
88
  end
89
89
  end
90
90
 
@@ -93,14 +93,14 @@ module Protobuf
93
93
  # If a block is given, call the block from within an indent block.
94
94
  # Otherwise, end the block on the same line.
95
95
  #
96
- def print_block(name, parent_klass, type, &block)
96
+ def print_block(name, parent_klass, type)
97
97
  name = modulize(name)
98
98
  block_def = "#{type} #{name}"
99
99
  block_def += " < #{parent_class(parent_klass)}" if parent_klass
100
100
 
101
101
  if block_given?
102
102
  puts block_def
103
- indent { block.call }
103
+ indent { yield }
104
104
  puts "end"
105
105
  puts
106
106
  else
@@ -136,7 +136,7 @@ module Protobuf
136
136
  #
137
137
  def puts(message = nil)
138
138
  if message
139
- @io.puts((" " * @_indent_level) + message)
139
+ @io.puts((" " * current_indent) + message)
140
140
  else
141
141
  @io.puts
142
142
  end
@@ -158,4 +158,3 @@ module Protobuf
158
158
  end
159
159
  end
160
160
  end
161
-
@@ -15,13 +15,12 @@ module Protobuf
15
15
  end
16
16
 
17
17
  def build_method(method_descriptor)
18
- name = method_descriptor.name
19
18
  request_klass = modulize(method_descriptor.input_type)
20
19
  response_klass = modulize(method_descriptor.output_type)
21
- return "rpc :#{name.underscore}, #{request_klass}, #{response_klass}"
20
+ name = ENV.key?('PB_USE_RAW_RPC_NAMES') ? method_descriptor.name : method_descriptor.name.underscore
21
+ "rpc :#{name}, #{request_klass}, #{response_klass}"
22
22
  end
23
23
 
24
24
  end
25
25
  end
26
26
  end
27
-
data/lib/protobuf/http.rb CHANGED
@@ -14,7 +14,7 @@
14
14
  # gem 'protobuf', :require => 'protobuf/http'
15
15
  #
16
16
  require 'protobuf'
17
- Protobuf.connector_type = :http
18
-
19
17
  require 'protobuf/rpc/servers/http/server'
20
18
  require 'protobuf/rpc/connectors/http'
19
+
20
+ ::Protobuf.connector_type_class = ::Protobuf::Rpc::Connectors::Http
@@ -1,46 +1,33 @@
1
1
  module Protobuf
2
2
  class Lifecycle
3
- include ::Protobuf::Logger::LogMethods
4
-
5
- def self.register(event_name, &blk)
6
- raise "Lifecycle register must have a block" unless block_given?
7
- event_name = normalized_event_name(event_name)
3
+ class << self
4
+ def register(event_name)
5
+ fail "Lifecycle register must have a block" unless block_given?
6
+ event_name = normalized_event_name(event_name)
8
7
 
9
- if ::Protobuf.print_deprecation_warnings?
10
- $stderr.puts <<-ERROR
11
- [DEPRECATED] ::Protobuf::Lifecycle has been deprecated and will be removed in a future version.
12
- Use ::ActiveSupport::Notifications.subscribe('#{event_name}')
13
- ERROR
8
+ ::ActiveSupport::Notifications.subscribe(event_name) do |_name, _start, _finish, _id, args|
9
+ yield(*args)
10
+ end
14
11
  end
12
+ alias :on register
15
13
 
16
- ::ActiveSupport::Notifications.subscribe(event_name) do |name, start, finish, id, args|
17
- blk.call(*args)
18
- end
19
- end
14
+ def trigger(event_name, *args)
15
+ event_name = normalized_event_name(event_name)
20
16
 
21
- def self.trigger( event_name, *args )
22
- if ::Protobuf.print_deprecation_warnings?
23
- $stderr.puts <<-ERROR
24
- [DEPRECATED] ::Protobuf::Lifecycle has been deprecated and will be removed in a future version.
25
- Use ::ActiveSupport::Notifications.instrument(...)
26
- ERROR
17
+ ::ActiveSupport::Notifications.instrument(event_name, args)
27
18
  end
28
19
 
29
- event_name = normalized_event_name( event_name )
20
+ replacement = ::ActiveSupport::Notifications
30
21
 
31
- ::ActiveSupport::Notifications.instrument(event_name, args)
32
- end
22
+ ::Protobuf.deprecator.deprecate_methods(
23
+ self,
24
+ :register => "#{replacement}.#{replacement.method(:subscribe).name}".to_sym,
25
+ :trigger => "#{replacement}.#{replacement.method(:instrument).name}".to_sym
26
+ )
33
27
 
34
- def self.normalized_event_name(event_name)
35
- return "#{event_name}".downcase
36
- end
37
-
38
- class << self
39
- attr_accessor :lifecycle_events
40
-
41
- alias_method :on, :register
28
+ def normalized_event_name(event_name)
29
+ event_name.to_s.downcase
30
+ end
42
31
  end
43
-
44
- @lifecycle_events ||= {}
45
32
  end
46
33
  end
@@ -0,0 +1,39 @@
1
+ require 'logger'
2
+
3
+ module Protobuf
4
+ module Logging
5
+ def self.initialize_logger(log_target = $stdout, log_level = ::Logger::INFO)
6
+ @logger = Logger.new(log_target)
7
+ @logger.level = log_level
8
+ @logger
9
+ end
10
+
11
+ def self.logger
12
+ defined?(@logger) ? @logger : initialize_logger
13
+ end
14
+
15
+ class << self
16
+ attr_writer :logger
17
+ end
18
+
19
+ def logger
20
+ ::Protobuf::Logging.logger
21
+ end
22
+
23
+ def log_exception(ex)
24
+ logger.error { ex.message }
25
+ logger.error { ex.backtrace[0..5].join("\n") }
26
+ logger.debug { ex.backtrace.join("\n") }
27
+ end
28
+
29
+ def log_signature
30
+ @_log_signature ||= "[#{self.class == Class ? name : self.class.name}]"
31
+ end
32
+
33
+ def sign_message(message)
34
+ "#{log_signature} #{message}"
35
+ end
36
+ end
37
+ end
38
+
39
+ # Inspired by [mperham](https://github.com/mperham/sidekiq)
@@ -1,9 +1,17 @@
1
- require 'protobuf/field'
2
- require 'protobuf/enum'
3
- require 'protobuf/exceptions'
4
1
  require 'protobuf/message/fields'
5
2
  require 'protobuf/message/serialization'
6
3
 
4
+ # Under MRI, this optimizes proto decoding by around 15% in tests.
5
+ # When unavailable, we fall to pure Ruby.
6
+ # rubocop:disable Lint/HandleExceptions
7
+ begin
8
+ require 'varint/varint'
9
+ rescue LoadError
10
+ end
11
+ # rubocop:enable Lint/HandleExceptions
12
+
13
+ require 'protobuf/varint'
14
+
7
15
  module Protobuf
8
16
  class Message
9
17
 
@@ -13,6 +21,7 @@ module Protobuf
13
21
 
14
22
  extend ::Protobuf::Message::Fields
15
23
  include ::Protobuf::Message::Serialization
24
+ ::Protobuf::Optionable.inject(self) { ::Google::Protobuf::MessageOptions }
16
25
 
17
26
  ##
18
27
  # Class Methods
@@ -28,10 +37,11 @@ module Protobuf
28
37
 
29
38
  def initialize(fields = {})
30
39
  @values = {}
31
-
32
- fields.to_hash.each_pair do |name, value|
33
- self[name] = value unless value.nil?
40
+ fields.to_hash.each do |name, value|
41
+ set_field(name, value, true)
34
42
  end
43
+
44
+ yield self if block_given?
35
45
  end
36
46
 
37
47
  ##
@@ -61,54 +71,66 @@ module Protobuf
61
71
  # Iterate over every field, invoking the given block
62
72
  #
63
73
  def each_field
74
+ return to_enum(:each_field) unless block_given?
75
+
64
76
  self.class.all_fields.each do |field|
65
- value = __send__(field.name)
77
+ value = self[field.name]
66
78
  yield(field, value)
67
79
  end
68
80
  end
69
81
 
70
82
  def each_field_for_serialization
71
83
  self.class.all_fields.each do |field|
72
- next unless field_must_be_serialized?(field)
73
-
74
- value = @values[field.name]
75
-
84
+ value = @values[field.fully_qualified_name]
76
85
  if value.nil?
77
- raise ::Protobuf::SerializationError, "Required field #{self.class.name}##{field.name} does not have a value."
78
- else
79
- yield(field, value)
86
+ fail ::Protobuf::SerializationError, "Required field #{self.class.name}##{field.name} does not have a value." if field.required?
87
+ next
80
88
  end
89
+
90
+ yield(field, value)
81
91
  end
82
92
  end
83
93
 
84
- def has_field?(name)
85
- @values.has_key?(name)
94
+ def field?(name)
95
+ field = self.class.get_field(name, true)
96
+ return false if field.nil?
97
+ if field.repeated?
98
+ @values.key?(field.fully_qualified_name) && @values[field.fully_qualified_name].present?
99
+ else
100
+ @values.key?(field.fully_qualified_name)
101
+ end
86
102
  end
103
+ ::Protobuf.deprecator.define_deprecated_methods(self, :has_field? => :field?)
87
104
 
88
105
  def inspect
89
- to_hash.inspect
106
+ attrs = self.class.fields.map do |field|
107
+ [field.name, self[field.name].inspect].join('=')
108
+ end.join(' ')
109
+
110
+ "#<#{self.class} #{attrs}>"
90
111
  end
91
112
 
92
113
  def respond_to_has?(key)
93
- respond_to?(key) && has_field?(key)
114
+ respond_to?(key) && field?(key)
94
115
  end
95
116
 
96
117
  def respond_to_has_and_present?(key)
97
118
  respond_to_has?(key) &&
98
- (__send__(key).present? || [true, false].include?(__send__(key)))
119
+ (self[key].present? || [true, false].include?(self[key]))
99
120
  end
100
121
 
101
122
  # Return a hash-representation of the given fields for this message type.
102
123
  def to_hash
103
- result = Hash.new
124
+ result = {}
104
125
 
105
- @values.keys.each do |field_name|
106
- value = __send__(field_name)
126
+ @values.each_key do |field_name|
127
+ value = self[field_name]
128
+ field = self.class.get_field(field_name, true)
107
129
  hashed_value = value.respond_to?(:to_hash_value) ? value.to_hash_value : value
108
- result.merge!(field_name => hashed_value)
130
+ result[field.name] = hashed_value
109
131
  end
110
132
 
111
- return result
133
+ result
112
134
  end
113
135
 
114
136
  def to_json(options = {})
@@ -119,60 +141,105 @@ module Protobuf
119
141
  self
120
142
  end
121
143
 
122
- def ==(obj)
123
- return false unless obj.is_a?(self.class)
144
+ def ==(other)
145
+ return false unless other.is_a?(self.class)
124
146
  each_field do |field, value|
125
- return false unless value == obj.__send__(field.name)
147
+ return false unless value == other[field.name]
126
148
  end
127
149
  true
128
150
  end
129
151
 
130
152
  def [](name)
131
- if field = self.class.get_field(name, true)
132
- __send__(field.name)
153
+ field = self.class.get_field(name, true)
154
+
155
+ fail ArgumentError, "invalid field name=#{name.inspect}" unless field
156
+
157
+ if field.repeated?
158
+ @values[field.fully_qualified_name] ||= ::Protobuf::Field::FieldArray.new(field)
159
+ elsif @values.key?(field.fully_qualified_name)
160
+ @values[field.fully_qualified_name]
161
+ else
162
+ field.default_value
133
163
  end
134
164
  end
135
165
 
136
166
  def []=(name, value)
137
- if field = self.class.get_field(name, true)
138
- __send__(field.setter_method_name, value)
139
- end
167
+ set_field(name, value, true)
140
168
  end
141
169
 
142
170
  ##
143
171
  # Instance Aliases
144
172
  #
145
- alias_method :to_hash_value, :to_hash
146
- alias_method :to_proto_hash, :to_hash
147
- alias_method :responds_to_has?, :respond_to_has?
148
- alias_method :respond_to_and_has?, :respond_to_has?
149
- alias_method :responds_to_and_has?, :respond_to_has?
150
- alias_method :respond_to_has_present?, :respond_to_has_and_present?
151
- alias_method :respond_to_and_has_present?, :respond_to_has_and_present?
152
- alias_method :respond_to_and_has_and_present?, :respond_to_has_and_present?
153
- alias_method :responds_to_has_present?, :respond_to_has_and_present?
154
- alias_method :responds_to_and_has_present?, :respond_to_has_and_present?
155
- alias_method :responds_to_and_has_and_present?, :respond_to_has_and_present?
173
+ alias :to_hash_value to_hash
174
+ alias :to_proto_hash to_hash
175
+ alias :responds_to_has? respond_to_has?
176
+ alias :respond_to_and_has? respond_to_has?
177
+ alias :responds_to_and_has? respond_to_has?
178
+ alias :respond_to_has_present? respond_to_has_and_present?
179
+ alias :respond_to_and_has_present? respond_to_has_and_present?
180
+ alias :respond_to_and_has_and_present? respond_to_has_and_present?
181
+ alias :responds_to_has_present? respond_to_has_and_present?
182
+ alias :responds_to_and_has_present? respond_to_has_and_present?
183
+ alias :responds_to_and_has_and_present? respond_to_has_and_present?
156
184
 
157
185
  ##
158
186
  # Private Instance Methods
159
187
  #
188
+
160
189
  private
161
190
 
191
+ def set_field(name, value, ignore_nil_for_repeated)
192
+ if (field = self.class.get_field(name, true))
193
+ if field.repeated?
194
+ if value.nil? && ignore_nil_for_repeated
195
+ ::Protobuf.deprecator.deprecation_warning("#{self.class}#[#{name}]=nil", "use an empty array instead of nil")
196
+ return
197
+ end
198
+ unless value.is_a?(Array)
199
+ fail TypeError, <<-TYPE_ERROR
200
+ Expected repeated value of type '#{field.type_class}'
201
+ Got '#{value.class}' for repeated protobuf field #{field.name}
202
+ TYPE_ERROR
203
+ end
204
+
205
+ value = value.compact
206
+
207
+ if value.empty?
208
+ @values.delete(field.fully_qualified_name)
209
+ else
210
+ @values[field.fully_qualified_name] ||= ::Protobuf::Field::FieldArray.new(field)
211
+ @values[field.fully_qualified_name].replace(value)
212
+ end
213
+ else
214
+ if value.nil? # rubocop:disable Style/IfInsideElse
215
+ @values.delete(field.fully_qualified_name)
216
+ elsif field.acceptable?(value)
217
+ @values[field.fully_qualified_name] = field.coerce!(value)
218
+ else
219
+ fail TypeError, "Unacceptable value #{value} for field #{field.name} of type #{field.type_class}"
220
+ end
221
+ end
222
+ else
223
+ unless ::Protobuf.ignore_unknown_fields?
224
+ fail ::Protobuf::FieldNotDefinedError, name
225
+ end
226
+ end
227
+ end
228
+
162
229
  def copy_to(object, method)
163
- duplicate = proc { |obj|
230
+ duplicate = proc do |obj|
164
231
  case obj
165
232
  when Message, String then obj.__send__(method)
166
233
  else obj
167
234
  end
168
- }
235
+ end
169
236
 
170
237
  object.__send__(:initialize)
171
238
  @values.each do |name, value|
172
239
  if value.is_a?(::Protobuf::Field::FieldArray)
173
- object.__send__(name).replace(value.map {|v| duplicate.call(v)})
240
+ object[name].replace(value.map { |v| duplicate.call(v) })
174
241
  else
175
- object.__send__("#{name}=", duplicate.call(value))
242
+ object[name] = duplicate.call(value)
176
243
  end
177
244
  end
178
245
  object