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
@@ -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