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.
- checksums.yaml +4 -4
- data/.gitignore +1 -0
- data/.rubocop.yml +67 -0
- data/.rubocop_todo.yml +145 -0
- data/.travis.yml +25 -5
- data/CHANGES.md +55 -0
- data/CONTRIBUTING.md +1 -1
- data/LICENSE.txt +17 -9
- data/README.md +13 -12
- data/Rakefile +15 -11
- data/bin/protoc-gen-ruby +8 -3
- data/bin/rpc_server +1 -0
- data/examples/lib/example/reverse-client.rb +2 -2
- data/install-protobuf.sh +28 -0
- data/lib/protobuf.rb +57 -53
- data/lib/protobuf/cli.rb +94 -74
- data/lib/protobuf/code_generator.rb +60 -9
- data/lib/protobuf/decoder.rb +19 -65
- data/lib/protobuf/deprecation.rb +117 -0
- data/lib/protobuf/descriptors/google/protobuf/compiler/plugin.pb.rb +11 -1
- data/lib/protobuf/descriptors/google/protobuf/descriptor.pb.rb +55 -3
- data/lib/protobuf/encoder.rb +13 -53
- data/lib/protobuf/enum.rb +58 -63
- data/lib/protobuf/field.rb +4 -4
- data/lib/protobuf/field/base_field.rb +101 -173
- data/lib/protobuf/field/bool_field.rb +17 -11
- data/lib/protobuf/field/bytes_field.rb +21 -35
- data/lib/protobuf/field/double_field.rb +0 -1
- data/lib/protobuf/field/enum_field.rb +23 -22
- data/lib/protobuf/field/field_array.rb +5 -4
- data/lib/protobuf/field/fixed32_field.rb +1 -1
- data/lib/protobuf/field/fixed64_field.rb +0 -1
- data/lib/protobuf/field/float_field.rb +4 -1
- data/lib/protobuf/field/int32_field.rb +0 -1
- data/lib/protobuf/field/int64_field.rb +0 -1
- data/lib/protobuf/field/integer_field.rb +0 -1
- data/lib/protobuf/field/message_field.rb +13 -28
- data/lib/protobuf/field/sfixed32_field.rb +0 -1
- data/lib/protobuf/field/sfixed64_field.rb +0 -1
- data/lib/protobuf/field/signed_integer_field.rb +0 -1
- data/lib/protobuf/field/sint32_field.rb +0 -1
- data/lib/protobuf/field/sint64_field.rb +0 -1
- data/lib/protobuf/field/string_field.rb +2 -4
- data/lib/protobuf/field/uint32_field.rb +0 -1
- data/lib/protobuf/field/uint64_field.rb +0 -1
- data/lib/protobuf/field/varint_field.rb +30 -13
- data/lib/protobuf/generators/base.rb +30 -16
- data/lib/protobuf/generators/enum_generator.rb +6 -9
- data/lib/protobuf/generators/extension_generator.rb +1 -2
- data/lib/protobuf/generators/field_generator.rb +25 -13
- data/lib/protobuf/generators/file_generator.rb +157 -35
- data/lib/protobuf/generators/group_generator.rb +22 -17
- data/lib/protobuf/generators/message_generator.rb +13 -14
- data/lib/protobuf/generators/option_generator.rb +17 -0
- data/lib/protobuf/generators/printable.rb +12 -13
- data/lib/protobuf/generators/service_generator.rb +2 -3
- data/lib/protobuf/http.rb +2 -2
- data/lib/protobuf/lifecycle.rb +20 -33
- data/lib/protobuf/logging.rb +39 -0
- data/lib/protobuf/message.rb +114 -47
- data/lib/protobuf/message/fields.rb +170 -88
- data/lib/protobuf/message/serialization.rb +19 -18
- data/lib/protobuf/optionable.rb +53 -6
- data/lib/protobuf/rpc/buffer.rb +18 -19
- data/lib/protobuf/rpc/client.rb +22 -50
- data/lib/protobuf/rpc/connectors/base.rb +177 -12
- data/lib/protobuf/rpc/connectors/http.rb +14 -9
- data/lib/protobuf/rpc/connectors/ping.rb +89 -0
- data/lib/protobuf/rpc/connectors/socket.rb +13 -8
- data/lib/protobuf/rpc/connectors/zmq.rb +178 -73
- data/lib/protobuf/rpc/dynamic_discovery.pb.rb +4 -1
- data/lib/protobuf/rpc/env.rb +12 -12
- data/lib/protobuf/rpc/error.rb +3 -3
- data/lib/protobuf/rpc/error/client_error.rb +4 -4
- data/lib/protobuf/rpc/error/server_error.rb +9 -9
- data/lib/protobuf/rpc/middleware/exception_handler.rb +6 -2
- data/lib/protobuf/rpc/middleware/logger.rb +8 -4
- data/lib/protobuf/rpc/middleware/request_decoder.rb +17 -21
- data/lib/protobuf/rpc/middleware/response_encoder.rb +22 -27
- data/lib/protobuf/rpc/middleware/statsd.rb +3 -3
- data/lib/protobuf/rpc/rpc.pb.rb +4 -1
- data/lib/protobuf/rpc/server.rb +1 -1
- data/lib/protobuf/rpc/servers/http/server.rb +19 -17
- data/lib/protobuf/rpc/servers/socket/server.rb +78 -70
- data/lib/protobuf/rpc/servers/socket/worker.rb +4 -4
- data/lib/protobuf/rpc/servers/socket_runner.rb +27 -15
- data/lib/protobuf/rpc/servers/zmq/broker.rb +70 -31
- data/lib/protobuf/rpc/servers/zmq/server.rb +55 -47
- data/lib/protobuf/rpc/servers/zmq/util.rb +14 -13
- data/lib/protobuf/rpc/servers/zmq/worker.rb +16 -16
- data/lib/protobuf/rpc/servers/zmq_runner.rb +26 -7
- data/lib/protobuf/rpc/service.rb +21 -27
- data/lib/protobuf/rpc/service_directory.rb +43 -27
- data/lib/protobuf/rpc/service_dispatcher.rb +9 -10
- data/lib/protobuf/rpc/service_filters.rb +32 -55
- data/lib/protobuf/rpc/stat.rb +4 -8
- data/lib/protobuf/socket.rb +1 -2
- data/lib/protobuf/tasks/compile.rake +3 -4
- data/lib/protobuf/varint.rb +9 -0
- data/lib/protobuf/varint_pure.rb +13 -0
- data/lib/protobuf/version.rb +1 -1
- data/lib/protobuf/zmq.rb +2 -2
- data/proto/google/protobuf/descriptor.proto +190 -31
- data/protobuffy.gemspec +30 -17
- data/spec/benchmark/tasks.rb +27 -19
- data/spec/bin/protoc-gen-ruby_spec.rb +11 -6
- data/spec/encoding/all_types_spec.rb +96 -84
- data/spec/encoding/extreme_values_spec.rb +0 -0
- data/spec/functional/class_inheritance_spec.rb +52 -0
- data/spec/functional/code_generator_spec.rb +38 -0
- data/spec/functional/socket_server_spec.rb +15 -15
- data/spec/functional/zmq_server_spec.rb +29 -27
- data/spec/lib/protobuf/cli_spec.rb +82 -67
- data/spec/lib/protobuf/code_generator_spec.rb +37 -10
- data/spec/lib/protobuf/enum_spec.rb +77 -46
- data/spec/lib/protobuf/field/bool_field_spec.rb +91 -0
- data/spec/lib/protobuf/field/double_field_spec.rb +9 -0
- data/spec/lib/protobuf/field/enum_field_spec.rb +26 -0
- data/spec/lib/protobuf/field/field_array_spec.rb +69 -0
- data/spec/lib/protobuf/field/fixed32_field_spec.rb +7 -0
- data/spec/lib/protobuf/field/fixed64_field_spec.rb +7 -0
- data/spec/lib/protobuf/field/float_field_spec.rb +90 -0
- data/spec/lib/protobuf/field/int32_field_spec.rb +114 -1
- data/spec/lib/protobuf/field/int64_field_spec.rb +7 -0
- data/spec/lib/protobuf/field/message_field_spec.rb +132 -0
- data/spec/lib/protobuf/field/sfixed32_field_spec.rb +9 -0
- data/spec/lib/protobuf/field/sfixed64_field_spec.rb +9 -0
- data/spec/lib/protobuf/field/sint32_field_spec.rb +9 -0
- data/spec/lib/protobuf/field/sint64_field_spec.rb +9 -0
- data/spec/lib/protobuf/field/string_field_spec.rb +44 -11
- data/spec/lib/protobuf/field/uint32_field_spec.rb +7 -0
- data/spec/lib/protobuf/field/uint64_field_spec.rb +7 -0
- data/spec/lib/protobuf/field_spec.rb +4 -6
- data/spec/lib/protobuf/generators/base_spec.rb +80 -13
- data/spec/lib/protobuf/generators/enum_generator_spec.rb +35 -21
- data/spec/lib/protobuf/generators/extension_generator_spec.rb +12 -13
- data/spec/lib/protobuf/generators/field_generator_spec.rb +73 -21
- data/spec/lib/protobuf/generators/file_generator_spec.rb +89 -6
- data/spec/lib/protobuf/generators/service_generator_spec.rb +25 -13
- data/spec/lib/protobuf/lifecycle_spec.rb +25 -20
- data/spec/lib/protobuf/message_spec.rb +578 -79
- data/spec/lib/protobuf/optionable_spec.rb +202 -26
- data/spec/lib/protobuf/rpc/client_spec.rb +16 -16
- data/spec/lib/protobuf/rpc/connectors/base_spec.rb +167 -13
- data/spec/lib/protobuf/rpc/connectors/connector_spec.rb +4 -5
- data/spec/lib/protobuf/rpc/connectors/http_spec.rb +13 -11
- data/spec/lib/protobuf/rpc/connectors/ping_spec.rb +69 -0
- data/spec/lib/protobuf/rpc/connectors/socket_spec.rb +6 -7
- data/spec/lib/protobuf/rpc/connectors/zmq_spec.rb +35 -52
- data/spec/lib/protobuf/rpc/middleware/exception_handler_spec.rb +10 -10
- data/spec/lib/protobuf/rpc/middleware/logger_spec.rb +11 -11
- data/spec/lib/protobuf/rpc/middleware/request_decoder_spec.rb +23 -23
- data/spec/lib/protobuf/rpc/middleware/response_encoder_spec.rb +11 -11
- data/spec/lib/protobuf/rpc/middleware/statsd_spec.rb +6 -6
- data/spec/lib/protobuf/rpc/servers/http/server_spec.rb +47 -44
- data/spec/lib/protobuf/rpc/servers/socket_server_spec.rb +6 -6
- data/spec/lib/protobuf/rpc/servers/zmq/server_spec.rb +12 -10
- data/spec/lib/protobuf/rpc/servers/zmq/util_spec.rb +11 -11
- data/spec/lib/protobuf/rpc/servers/zmq/worker_spec.rb +7 -7
- data/spec/lib/protobuf/rpc/service_directory_spec.rb +47 -49
- data/spec/lib/protobuf/rpc/service_dispatcher_spec.rb +8 -25
- data/spec/lib/protobuf/rpc/service_filters_spec.rb +102 -69
- data/spec/lib/protobuf/rpc/service_spec.rb +37 -36
- data/spec/lib/protobuf/rpc/stat_spec.rb +7 -9
- data/spec/lib/protobuf/varint_spec.rb +29 -0
- data/spec/lib/protobuf_spec.rb +55 -28
- data/spec/spec_helper.rb +12 -27
- data/spec/support/all.rb +0 -1
- data/spec/support/packed_field.rb +4 -3
- data/spec/support/{test → protos}/all_types.data.bin +0 -0
- data/spec/support/{test → protos}/all_types.data.txt +0 -0
- data/spec/support/{test → protos}/enum.pb.rb +8 -4
- data/spec/support/{test → protos}/enum.proto +4 -1
- data/spec/support/{test → protos}/extreme_values.data.bin +0 -0
- data/spec/support/protos/google_unittest.bin +0 -0
- data/spec/support/protos/google_unittest.pb.rb +798 -0
- data/spec/support/{test → protos}/google_unittest.proto +237 -66
- data/spec/support/protos/google_unittest_custom_options.bin +0 -0
- data/spec/support/protos/google_unittest_custom_options.pb.rb +268 -0
- data/spec/support/protos/google_unittest_custom_options.proto +424 -0
- data/spec/support/protos/google_unittest_import.pb.rb +55 -0
- data/spec/support/{test → protos}/google_unittest_import.proto +19 -10
- data/spec/support/protos/google_unittest_import_public.pb.rb +31 -0
- data/spec/support/{test → protos}/google_unittest_import_public.proto +8 -5
- data/spec/support/{test → protos}/multi_field_extensions.pb.rb +5 -2
- data/spec/support/{test → protos}/multi_field_extensions.proto +2 -0
- data/spec/support/{test → protos}/resource.pb.rb +47 -11
- data/spec/support/{test → protos}/resource.proto +24 -1
- data/spec/support/resource_service.rb +23 -0
- data/spec/support/server.rb +32 -61
- metadata +119 -59
- data/lib/protobuf/deprecator.rb +0 -42
- data/lib/protobuf/logger.rb +0 -93
- data/lib/protobuf/rpc/connector.rb +0 -21
- data/lib/protobuf/rpc/connectors/common.rb +0 -172
- data/spec/data/data.bin +0 -3
- data/spec/data/types.bin +0 -0
- data/spec/lib/protobuf/logger_spec.rb +0 -145
- data/spec/lib/protobuf/rpc/connector_spec.rb +0 -26
- data/spec/lib/protobuf/rpc/connectors/common_spec.rb +0 -170
- data/spec/support/test/defaults.pb.rb +0 -25
- data/spec/support/test/defaults.proto +0 -9
- data/spec/support/test/extended.pb.rb +0 -22
- data/spec/support/test/extended.proto +0 -10
- data/spec/support/test/google_unittest.pb.rb +0 -543
- data/spec/support/test/google_unittest_import.pb.rb +0 -37
- data/spec/support/test/google_unittest_import_public.pb.rb +0 -8
- data/spec/support/test/resource_service.rb +0 -26
- 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 = [
|
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.
|
84
|
-
item_handler = @handlers[type]
|
89
|
+
next if items.empty?
|
85
90
|
|
86
|
-
|
87
|
-
header(item_header) if item_header
|
91
|
+
item_handler = @handlers[type]
|
88
92
|
|
89
|
-
|
90
|
-
|
93
|
+
item_header = @headers[type]
|
94
|
+
header(item_header) if item_header
|
91
95
|
|
92
|
-
|
93
|
-
|
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
|
-
|
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
|
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
|
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 = [
|
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
|
65
|
-
!
|
64
|
+
def extensions?
|
65
|
+
!message_extension_fields.empty?
|
66
66
|
end
|
67
67
|
|
68
|
-
def
|
68
|
+
def fields?
|
69
69
|
descriptor.field.count > 0
|
70
70
|
end
|
71
71
|
|
72
|
-
def
|
72
|
+
def nested_enums?
|
73
73
|
descriptor.enum_type.count > 0
|
74
74
|
end
|
75
75
|
|
76
|
-
def
|
76
|
+
def nested_messages?
|
77
77
|
descriptor.nested_type.count > 0
|
78
78
|
end
|
79
79
|
|
80
|
-
def
|
81
|
-
|
80
|
+
def nested_types?
|
81
|
+
nested_enums? || nested_messages?
|
82
82
|
end
|
83
83
|
|
84
|
-
def
|
84
|
+
def printable?
|
85
85
|
if @only_declarations
|
86
|
-
|
86
|
+
nested_types?
|
87
87
|
else
|
88
|
-
|
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
|
-
|
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
|
-
|
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])
|
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
|
-
|
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
|
-
|
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
|
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 {
|
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((" " *
|
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
|
-
|
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
|
data/lib/protobuf/lifecycle.rb
CHANGED
@@ -1,46 +1,33 @@
|
|
1
1
|
module Protobuf
|
2
2
|
class Lifecycle
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
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
|
-
|
10
|
-
|
11
|
-
|
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
|
-
|
17
|
-
|
18
|
-
end
|
19
|
-
end
|
14
|
+
def trigger(event_name, *args)
|
15
|
+
event_name = normalized_event_name(event_name)
|
20
16
|
|
21
|
-
|
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
|
-
|
20
|
+
replacement = ::ActiveSupport::Notifications
|
30
21
|
|
31
|
-
::
|
32
|
-
|
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
|
-
|
35
|
-
|
36
|
-
|
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)
|
data/lib/protobuf/message.rb
CHANGED
@@ -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
|
-
|
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 =
|
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
|
-
|
73
|
-
|
74
|
-
value = @values[field.name]
|
75
|
-
|
84
|
+
value = @values[field.fully_qualified_name]
|
76
85
|
if value.nil?
|
77
|
-
|
78
|
-
|
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
|
85
|
-
|
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
|
-
|
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) &&
|
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
|
-
(
|
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 =
|
124
|
+
result = {}
|
104
125
|
|
105
|
-
@values.
|
106
|
-
value =
|
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.
|
130
|
+
result[field.name] = hashed_value
|
109
131
|
end
|
110
132
|
|
111
|
-
|
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 ==(
|
123
|
-
return false unless
|
144
|
+
def ==(other)
|
145
|
+
return false unless other.is_a?(self.class)
|
124
146
|
each_field do |field, value|
|
125
|
-
return false unless value ==
|
147
|
+
return false unless value == other[field.name]
|
126
148
|
end
|
127
149
|
true
|
128
150
|
end
|
129
151
|
|
130
152
|
def [](name)
|
131
|
-
|
132
|
-
|
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
|
-
|
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
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
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
|
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
|
240
|
+
object[name].replace(value.map { |v| duplicate.call(v) })
|
174
241
|
else
|
175
|
-
object
|
242
|
+
object[name] = duplicate.call(value)
|
176
243
|
end
|
177
244
|
end
|
178
245
|
object
|