prepor-protobuf 3.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.gitignore +21 -0
- data/.rubocop.yml +51 -0
- data/.rubocop_todo.yml +89 -0
- data/.travis.yml +25 -0
- data/.yardopts +5 -0
- data/CHANGES.md +256 -0
- data/CONTRIBUTING.md +16 -0
- data/Gemfile +3 -0
- data/LICENSE.txt +22 -0
- data/README.md +33 -0
- data/Rakefile +64 -0
- data/bin/protoc-gen-ruby +16 -0
- data/bin/rpc_server +5 -0
- data/install-protobuf.sh +28 -0
- data/lib/protobuf.rb +100 -0
- data/lib/protobuf/cli.rb +242 -0
- data/lib/protobuf/code_generator.rb +44 -0
- data/lib/protobuf/decoder.rb +73 -0
- data/lib/protobuf/deprecation.rb +112 -0
- data/lib/protobuf/descriptors.rb +3 -0
- data/lib/protobuf/descriptors/google/protobuf/compiler/plugin.pb.rb +48 -0
- data/lib/protobuf/descriptors/google/protobuf/descriptor.pb.rb +251 -0
- data/lib/protobuf/encoder.rb +67 -0
- data/lib/protobuf/enum.rb +303 -0
- data/lib/protobuf/exceptions.rb +9 -0
- data/lib/protobuf/field.rb +74 -0
- data/lib/protobuf/field/base_field.rb +267 -0
- data/lib/protobuf/field/bool_field.rb +59 -0
- data/lib/protobuf/field/bytes_field.rb +82 -0
- data/lib/protobuf/field/double_field.rb +25 -0
- data/lib/protobuf/field/enum_field.rb +68 -0
- data/lib/protobuf/field/field_array.rb +87 -0
- data/lib/protobuf/field/fixed32_field.rb +25 -0
- data/lib/protobuf/field/fixed64_field.rb +28 -0
- data/lib/protobuf/field/float_field.rb +41 -0
- data/lib/protobuf/field/int32_field.rb +21 -0
- data/lib/protobuf/field/int64_field.rb +21 -0
- data/lib/protobuf/field/integer_field.rb +23 -0
- data/lib/protobuf/field/message_field.rb +65 -0
- data/lib/protobuf/field/sfixed32_field.rb +27 -0
- data/lib/protobuf/field/sfixed64_field.rb +28 -0
- data/lib/protobuf/field/signed_integer_field.rb +29 -0
- data/lib/protobuf/field/sint32_field.rb +21 -0
- data/lib/protobuf/field/sint64_field.rb +21 -0
- data/lib/protobuf/field/string_field.rb +34 -0
- data/lib/protobuf/field/uint32_field.rb +21 -0
- data/lib/protobuf/field/uint64_field.rb +21 -0
- data/lib/protobuf/field/varint_field.rb +73 -0
- data/lib/protobuf/generators/base.rb +70 -0
- data/lib/protobuf/generators/enum_generator.rb +41 -0
- data/lib/protobuf/generators/extension_generator.rb +27 -0
- data/lib/protobuf/generators/field_generator.rb +131 -0
- data/lib/protobuf/generators/file_generator.rb +135 -0
- data/lib/protobuf/generators/group_generator.rb +112 -0
- data/lib/protobuf/generators/message_generator.rb +98 -0
- data/lib/protobuf/generators/printable.rb +160 -0
- data/lib/protobuf/generators/service_generator.rb +26 -0
- data/lib/protobuf/lifecycle.rb +33 -0
- data/lib/protobuf/logging.rb +39 -0
- data/lib/protobuf/message.rb +193 -0
- data/lib/protobuf/message/fields.rb +133 -0
- data/lib/protobuf/message/serialization.rb +89 -0
- data/lib/protobuf/optionable.rb +23 -0
- data/lib/protobuf/rpc/buffer.rb +77 -0
- data/lib/protobuf/rpc/client.rb +168 -0
- data/lib/protobuf/rpc/connector.rb +19 -0
- data/lib/protobuf/rpc/connectors/base.rb +55 -0
- data/lib/protobuf/rpc/connectors/common.rb +176 -0
- data/lib/protobuf/rpc/connectors/socket.rb +73 -0
- data/lib/protobuf/rpc/connectors/zmq.rb +322 -0
- data/lib/protobuf/rpc/dynamic_discovery.pb.rb +49 -0
- data/lib/protobuf/rpc/env.rb +58 -0
- data/lib/protobuf/rpc/error.rb +28 -0
- data/lib/protobuf/rpc/error/client_error.rb +31 -0
- data/lib/protobuf/rpc/error/server_error.rb +43 -0
- data/lib/protobuf/rpc/middleware.rb +25 -0
- data/lib/protobuf/rpc/middleware/exception_handler.rb +36 -0
- data/lib/protobuf/rpc/middleware/logger.rb +91 -0
- data/lib/protobuf/rpc/middleware/request_decoder.rb +83 -0
- data/lib/protobuf/rpc/middleware/response_encoder.rb +88 -0
- data/lib/protobuf/rpc/middleware/runner.rb +18 -0
- data/lib/protobuf/rpc/rpc.pb.rb +55 -0
- data/lib/protobuf/rpc/server.rb +39 -0
- data/lib/protobuf/rpc/servers/socket/server.rb +123 -0
- data/lib/protobuf/rpc/servers/socket/worker.rb +56 -0
- data/lib/protobuf/rpc/servers/socket_runner.rb +40 -0
- data/lib/protobuf/rpc/servers/zmq/broker.rb +193 -0
- data/lib/protobuf/rpc/servers/zmq/server.rb +320 -0
- data/lib/protobuf/rpc/servers/zmq/util.rb +48 -0
- data/lib/protobuf/rpc/servers/zmq/worker.rb +104 -0
- data/lib/protobuf/rpc/servers/zmq_runner.rb +62 -0
- data/lib/protobuf/rpc/service.rb +179 -0
- data/lib/protobuf/rpc/service_directory.rb +253 -0
- data/lib/protobuf/rpc/service_dispatcher.rb +46 -0
- data/lib/protobuf/rpc/service_filters.rb +272 -0
- data/lib/protobuf/rpc/stat.rb +97 -0
- data/lib/protobuf/socket.rb +21 -0
- data/lib/protobuf/tasks.rb +1 -0
- data/lib/protobuf/tasks/compile.rake +61 -0
- data/lib/protobuf/version.rb +3 -0
- data/lib/protobuf/wire_type.rb +10 -0
- data/lib/protobuf/zmq.rb +21 -0
- data/proto/dynamic_discovery.proto +44 -0
- data/proto/google/protobuf/compiler/plugin.proto +147 -0
- data/proto/google/protobuf/descriptor.proto +620 -0
- data/proto/rpc.proto +62 -0
- data/protobuf.gemspec +51 -0
- data/spec/benchmark/tasks.rb +139 -0
- data/spec/bin/protoc-gen-ruby_spec.rb +23 -0
- data/spec/data/data.bin +3 -0
- data/spec/data/types.bin +0 -0
- data/spec/encoding/all_types_spec.rb +105 -0
- data/spec/encoding/extreme_values_spec.rb +0 -0
- data/spec/functional/class_inheritance_spec.rb +52 -0
- data/spec/functional/socket_server_spec.rb +59 -0
- data/spec/functional/zmq_server_spec.rb +105 -0
- data/spec/lib/protobuf/cli_spec.rb +273 -0
- data/spec/lib/protobuf/code_generator_spec.rb +60 -0
- data/spec/lib/protobuf/enum_spec.rb +265 -0
- data/spec/lib/protobuf/field/bool_field_spec.rb +51 -0
- data/spec/lib/protobuf/field/field_array_spec.rb +69 -0
- data/spec/lib/protobuf/field/float_field_spec.rb +55 -0
- data/spec/lib/protobuf/field/int32_field_spec.rb +89 -0
- data/spec/lib/protobuf/field/string_field_spec.rb +45 -0
- data/spec/lib/protobuf/field_spec.rb +191 -0
- data/spec/lib/protobuf/generators/base_spec.rb +84 -0
- data/spec/lib/protobuf/generators/enum_generator_spec.rb +73 -0
- data/spec/lib/protobuf/generators/extension_generator_spec.rb +42 -0
- data/spec/lib/protobuf/generators/field_generator_spec.rb +102 -0
- data/spec/lib/protobuf/generators/file_generator_spec.rb +32 -0
- data/spec/lib/protobuf/generators/message_generator_spec.rb +0 -0
- data/spec/lib/protobuf/generators/service_generator_spec.rb +46 -0
- data/spec/lib/protobuf/lifecycle_spec.rb +94 -0
- data/spec/lib/protobuf/message_spec.rb +526 -0
- data/spec/lib/protobuf/optionable_spec.rb +46 -0
- data/spec/lib/protobuf/rpc/client_spec.rb +66 -0
- data/spec/lib/protobuf/rpc/connector_spec.rb +26 -0
- data/spec/lib/protobuf/rpc/connectors/base_spec.rb +50 -0
- data/spec/lib/protobuf/rpc/connectors/common_spec.rb +170 -0
- data/spec/lib/protobuf/rpc/connectors/socket_spec.rb +36 -0
- data/spec/lib/protobuf/rpc/connectors/zmq_spec.rb +117 -0
- data/spec/lib/protobuf/rpc/middleware/exception_handler_spec.rb +62 -0
- data/spec/lib/protobuf/rpc/middleware/logger_spec.rb +49 -0
- data/spec/lib/protobuf/rpc/middleware/request_decoder_spec.rb +115 -0
- data/spec/lib/protobuf/rpc/middleware/response_encoder_spec.rb +75 -0
- data/spec/lib/protobuf/rpc/servers/socket_server_spec.rb +38 -0
- data/spec/lib/protobuf/rpc/servers/zmq/server_spec.rb +43 -0
- data/spec/lib/protobuf/rpc/servers/zmq/util_spec.rb +55 -0
- data/spec/lib/protobuf/rpc/servers/zmq/worker_spec.rb +35 -0
- data/spec/lib/protobuf/rpc/service_directory_spec.rb +293 -0
- data/spec/lib/protobuf/rpc/service_dispatcher_spec.rb +52 -0
- data/spec/lib/protobuf/rpc/service_filters_spec.rb +517 -0
- data/spec/lib/protobuf/rpc/service_spec.rb +162 -0
- data/spec/lib/protobuf/rpc/stat_spec.rb +68 -0
- data/spec/lib/protobuf_spec.rb +98 -0
- data/spec/spec_helper.rb +44 -0
- data/spec/support/all.rb +6 -0
- data/spec/support/packed_field.rb +22 -0
- data/spec/support/server.rb +64 -0
- data/spec/support/test/all_types.data.bin +0 -0
- data/spec/support/test/all_types.data.txt +119 -0
- data/spec/support/test/defaults.pb.rb +27 -0
- data/spec/support/test/defaults.proto +9 -0
- data/spec/support/test/enum.pb.rb +55 -0
- data/spec/support/test/enum.proto +34 -0
- data/spec/support/test/extended.pb.rb +18 -0
- data/spec/support/test/extended.proto +10 -0
- data/spec/support/test/extreme_values.data.bin +0 -0
- data/spec/support/test/google_unittest.pb.rb +537 -0
- data/spec/support/test/google_unittest.proto +713 -0
- data/spec/support/test/google_unittest_import.pb.rb +39 -0
- data/spec/support/test/google_unittest_import.proto +64 -0
- data/spec/support/test/google_unittest_import_public.pb.rb +10 -0
- data/spec/support/test/google_unittest_import_public.proto +38 -0
- data/spec/support/test/multi_field_extensions.pb.rb +58 -0
- data/spec/support/test/multi_field_extensions.proto +33 -0
- data/spec/support/test/resource.pb.rb +119 -0
- data/spec/support/test/resource.proto +94 -0
- data/spec/support/test/resource_service.rb +23 -0
- data/spec/support/test_app_file.rb +2 -0
- metadata +502 -0
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
require 'protobuf/generators/enum_generator'
|
|
2
|
+
require 'protobuf/generators/extension_generator'
|
|
3
|
+
require 'protobuf/generators/field_generator'
|
|
4
|
+
require 'protobuf/generators/message_generator'
|
|
5
|
+
require 'protobuf/generators/service_generator'
|
|
6
|
+
|
|
7
|
+
module Protobuf
|
|
8
|
+
module Generators
|
|
9
|
+
class GroupGenerator
|
|
10
|
+
include ::Protobuf::Generators::Printable
|
|
11
|
+
|
|
12
|
+
attr_reader :groups, :indent_level
|
|
13
|
+
attr_writer :order
|
|
14
|
+
|
|
15
|
+
def initialize(indent_level = 0)
|
|
16
|
+
@groups = Hash.new { |h, k| h[k] = [] }
|
|
17
|
+
@headers = {}
|
|
18
|
+
@comments = {}
|
|
19
|
+
@handlers = {}
|
|
20
|
+
@indent_level = indent_level
|
|
21
|
+
@order = [:enum, :message_declaration, :message, :extended_message, :service]
|
|
22
|
+
init_printer(indent_level)
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def add_enums(enum_descriptors, options)
|
|
26
|
+
enum_descriptors.each do |enum_descriptor|
|
|
27
|
+
@groups[:enum] << EnumGenerator.new(enum_descriptor, indent_level, options)
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def add_comment(type, message)
|
|
32
|
+
@comments[type] = message
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def add_extended_messages(extended_messages)
|
|
36
|
+
extended_messages.each do |message_type, field_descriptors|
|
|
37
|
+
@groups[:extended_message] << ExtensionGenerator.new(message_type, field_descriptors, indent_level)
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
def add_extension_fields(field_descriptors)
|
|
42
|
+
field_descriptors.each do |field_descriptor|
|
|
43
|
+
@groups[:extension_field] << FieldGenerator.new(field_descriptor, indent_level)
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
def add_extension_ranges(extension_ranges, &item_handler)
|
|
48
|
+
@groups[:extension_range] = extension_ranges
|
|
49
|
+
@handlers[:extension_range] = item_handler
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
def add_header(type, message)
|
|
53
|
+
@headers[type] = message
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
def add_message_declarations(descriptors)
|
|
57
|
+
descriptors.each do |descriptor|
|
|
58
|
+
@groups[:message_declaration] << MessageGenerator.new(descriptor, indent_level, :declaration => true)
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
def add_message_fields(field_descriptors)
|
|
63
|
+
field_descriptors.each do |field_descriptor|
|
|
64
|
+
@groups[:field] << FieldGenerator.new(field_descriptor, indent_level)
|
|
65
|
+
end
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
def add_messages(descriptors, options = {})
|
|
69
|
+
descriptors.each do |descriptor|
|
|
70
|
+
@groups[:message] << MessageGenerator.new(descriptor, indent_level, options)
|
|
71
|
+
end
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
def add_services(service_descriptors)
|
|
75
|
+
service_descriptors.each do |service_descriptor|
|
|
76
|
+
@groups[:service] << ServiceGenerator.new(service_descriptor, indent_level)
|
|
77
|
+
end
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
def compile
|
|
81
|
+
@order.each do |type|
|
|
82
|
+
items = @groups[type]
|
|
83
|
+
next if items.empty?
|
|
84
|
+
|
|
85
|
+
item_handler = @handlers[type]
|
|
86
|
+
|
|
87
|
+
item_header = @headers[type]
|
|
88
|
+
header(item_header) if item_header
|
|
89
|
+
|
|
90
|
+
item_comment = @comments[type]
|
|
91
|
+
comment(item_comment) if item_comment
|
|
92
|
+
|
|
93
|
+
items.each do |item|
|
|
94
|
+
if item_handler
|
|
95
|
+
puts item_handler.call(item)
|
|
96
|
+
else
|
|
97
|
+
print item.to_s
|
|
98
|
+
end
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
puts if type == :message_declaration
|
|
102
|
+
end
|
|
103
|
+
end
|
|
104
|
+
|
|
105
|
+
def to_s
|
|
106
|
+
compile
|
|
107
|
+
print_contents
|
|
108
|
+
end
|
|
109
|
+
|
|
110
|
+
end
|
|
111
|
+
end
|
|
112
|
+
end
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
require 'protobuf/generators/base'
|
|
2
|
+
require 'protobuf/generators/group_generator'
|
|
3
|
+
|
|
4
|
+
module Protobuf
|
|
5
|
+
module Generators
|
|
6
|
+
class MessageGenerator < Base
|
|
7
|
+
|
|
8
|
+
def initialize(descriptor, indent_level, options = {})
|
|
9
|
+
super
|
|
10
|
+
@only_declarations = options.fetch(:declaration) { false }
|
|
11
|
+
@extension_fields = options.fetch(:extension_fields) { {} }
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def compile
|
|
15
|
+
run_once(:compile) do
|
|
16
|
+
if @only_declarations
|
|
17
|
+
compile_declaration
|
|
18
|
+
else
|
|
19
|
+
compile_message
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def compile_declaration
|
|
25
|
+
run_once(:compile_declaration) do
|
|
26
|
+
if printable?
|
|
27
|
+
print_class(descriptor.name, :message) do
|
|
28
|
+
group = GroupGenerator.new(current_indent)
|
|
29
|
+
group.add_enums(descriptor.enum_type, :namespace => type_namespace)
|
|
30
|
+
group.add_message_declarations(descriptor.nested_type)
|
|
31
|
+
print group.to_s
|
|
32
|
+
end
|
|
33
|
+
else
|
|
34
|
+
print_class(descriptor.name, :message)
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
def compile_message
|
|
40
|
+
run_once(:compile_message) do
|
|
41
|
+
if printable?
|
|
42
|
+
print_class(descriptor.name, nil) do
|
|
43
|
+
group = GroupGenerator.new(current_indent)
|
|
44
|
+
group.add_messages(descriptor.nested_type, :extension_fields => @extension_fields, :namespace => type_namespace)
|
|
45
|
+
group.add_message_fields(descriptor.field)
|
|
46
|
+
self.class.validate_tags(fully_qualified_type_namespace, descriptor.field.map(&:number))
|
|
47
|
+
|
|
48
|
+
group.add_comment(:extension_range, 'Extension Fields')
|
|
49
|
+
group.add_extension_ranges(descriptor.extension_range) do |extension_range|
|
|
50
|
+
"extensions #{extension_range.start}...#{extension_range.end}"
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
group.add_extension_fields(message_extension_fields)
|
|
54
|
+
|
|
55
|
+
group.order = [:message, :field, :extension_range, :extension_field]
|
|
56
|
+
print group.to_s
|
|
57
|
+
end
|
|
58
|
+
end
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
private
|
|
63
|
+
|
|
64
|
+
def extensions?
|
|
65
|
+
!message_extension_fields.empty?
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
def fields?
|
|
69
|
+
descriptor.field.count > 0
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
def nested_enums?
|
|
73
|
+
descriptor.enum_type.count > 0
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
def nested_messages?
|
|
77
|
+
descriptor.nested_type.count > 0
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
def nested_types?
|
|
81
|
+
nested_enums? || nested_messages?
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
def printable?
|
|
85
|
+
if @only_declarations
|
|
86
|
+
nested_types?
|
|
87
|
+
else
|
|
88
|
+
fields? || nested_messages? || extensions?
|
|
89
|
+
end
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
def message_extension_fields
|
|
93
|
+
@extension_fields.fetch(fully_qualified_type_namespace) { [] }
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
end
|
|
97
|
+
end
|
|
98
|
+
end
|
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
module Protobuf
|
|
2
|
+
module Generators
|
|
3
|
+
module Printable
|
|
4
|
+
|
|
5
|
+
PARENT_CLASS_MESSAGE = "::Protobuf::Message".freeze
|
|
6
|
+
PARENT_CLASS_ENUM = "::Protobuf::Enum".freeze
|
|
7
|
+
PARENT_CLASS_SERVICE = "::Protobuf::Rpc::Service".freeze
|
|
8
|
+
|
|
9
|
+
# Initialize the printer.
|
|
10
|
+
# Must be called by any class/module that includes the Printable module.
|
|
11
|
+
#
|
|
12
|
+
def init_printer(indent_level)
|
|
13
|
+
@io = ::StringIO.new
|
|
14
|
+
self.current_indent = indent_level.to_i
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
protected
|
|
18
|
+
|
|
19
|
+
attr_accessor :current_indent
|
|
20
|
+
|
|
21
|
+
private
|
|
22
|
+
|
|
23
|
+
# Print a one-line comment.
|
|
24
|
+
#
|
|
25
|
+
def comment(message)
|
|
26
|
+
puts "# #{message}"
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
# Print a "header" comment.
|
|
30
|
+
#
|
|
31
|
+
# header("Lorem ipsum dolor")
|
|
32
|
+
# ##
|
|
33
|
+
# # Lorem ipsum dolor
|
|
34
|
+
# #
|
|
35
|
+
def header(message)
|
|
36
|
+
puts
|
|
37
|
+
puts "##"
|
|
38
|
+
puts "# #{message}"
|
|
39
|
+
puts "#"
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
# Increase the indent level. An outdent will only occur if given a block
|
|
43
|
+
# (after the block is finished).
|
|
44
|
+
#
|
|
45
|
+
def indent
|
|
46
|
+
self.current_indent += 1
|
|
47
|
+
yield
|
|
48
|
+
outdent
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
# Take a string and upcase the first character of each namespace.
|
|
52
|
+
# Due to the nature of varying standards about how class/modules are named
|
|
53
|
+
# (e.g. CamelCase, Underscore_Case, SCREAMING_SNAKE_CASE), we only want
|
|
54
|
+
# to capitalize the first character to ensure ruby will treat the value
|
|
55
|
+
# as a constant. Otherwise we do not attempt to change the
|
|
56
|
+
# token's definition.
|
|
57
|
+
#
|
|
58
|
+
# modulize("foo.bar.Baz") -> "::Foo::Bar::Baz"
|
|
59
|
+
# modulize("foo.bar.baz") -> "::Foo::Bar::Baz"
|
|
60
|
+
# modulize("foo.bar.BAZ") -> "::Foo::Bar::BAZ"
|
|
61
|
+
#
|
|
62
|
+
def modulize(name)
|
|
63
|
+
name = name.gsub(/\./, '::')
|
|
64
|
+
name = name.gsub(/(^(?:::)?[a-z]|::[a-z])/) { |match| match.upcase }
|
|
65
|
+
name
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
# Decrease the indent level. Cannot be negative.
|
|
69
|
+
#
|
|
70
|
+
def outdent
|
|
71
|
+
self.current_indent -= 1 unless current_indent.zero?
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
# Return the parent class for a given type.
|
|
75
|
+
# Valid types are :message, :enum, and :service, otherwise an error
|
|
76
|
+
# will be thrown.
|
|
77
|
+
#
|
|
78
|
+
def parent_class(type)
|
|
79
|
+
case type
|
|
80
|
+
when :message then
|
|
81
|
+
PARENT_CLASS_MESSAGE
|
|
82
|
+
when :enum then
|
|
83
|
+
PARENT_CLASS_ENUM
|
|
84
|
+
when :service then
|
|
85
|
+
PARENT_CLASS_SERVICE
|
|
86
|
+
else
|
|
87
|
+
fail "Unknown parent class type #{type}: #{caller[0..5].join("\n")}"
|
|
88
|
+
end
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
# Print a class or module block, indicated by type.
|
|
92
|
+
# If a class, can be given a parent class to inherit from.
|
|
93
|
+
# If a block is given, call the block from within an indent block.
|
|
94
|
+
# Otherwise, end the block on the same line.
|
|
95
|
+
#
|
|
96
|
+
def print_block(name, parent_klass, type, &block)
|
|
97
|
+
name = modulize(name)
|
|
98
|
+
block_def = "#{type} #{name}"
|
|
99
|
+
block_def += " < #{parent_class(parent_klass)}" if parent_klass
|
|
100
|
+
|
|
101
|
+
if block_given?
|
|
102
|
+
puts block_def
|
|
103
|
+
indent { block.call }
|
|
104
|
+
puts "end"
|
|
105
|
+
puts
|
|
106
|
+
else
|
|
107
|
+
block_def += "; end"
|
|
108
|
+
puts block_def
|
|
109
|
+
end
|
|
110
|
+
end
|
|
111
|
+
|
|
112
|
+
# Use print_block to print a class, with optional parent class
|
|
113
|
+
# to inherit from. Accepts a block for use with print_block.
|
|
114
|
+
#
|
|
115
|
+
def print_class(name, parent_klass, &block)
|
|
116
|
+
print_block(name, parent_klass, :class, &block)
|
|
117
|
+
end
|
|
118
|
+
|
|
119
|
+
# Use print_block to print a module.
|
|
120
|
+
# Accepts a block for use with print_block.
|
|
121
|
+
#
|
|
122
|
+
def print_module(name, &block)
|
|
123
|
+
print_block(name, nil, :module, &block)
|
|
124
|
+
end
|
|
125
|
+
|
|
126
|
+
# Print a file require.
|
|
127
|
+
#
|
|
128
|
+
# print_require('foo/bar/baz') -> "require 'foo/bar/baz'"
|
|
129
|
+
#
|
|
130
|
+
def print_require(file)
|
|
131
|
+
puts "require '#{file}'"
|
|
132
|
+
end
|
|
133
|
+
|
|
134
|
+
# Puts the given message prefixed by the indent level.
|
|
135
|
+
# If no message is given print a newline.
|
|
136
|
+
#
|
|
137
|
+
def puts(message = nil)
|
|
138
|
+
if message
|
|
139
|
+
@io.puts((" " * current_indent) + message)
|
|
140
|
+
else
|
|
141
|
+
@io.puts
|
|
142
|
+
end
|
|
143
|
+
end
|
|
144
|
+
|
|
145
|
+
# Print the given message raw, no indent.
|
|
146
|
+
#
|
|
147
|
+
def print(contents)
|
|
148
|
+
@io.print(contents)
|
|
149
|
+
end
|
|
150
|
+
|
|
151
|
+
# Returns the contents of the underlying StringIO object.
|
|
152
|
+
#
|
|
153
|
+
def print_contents
|
|
154
|
+
@io.rewind
|
|
155
|
+
@io.read
|
|
156
|
+
end
|
|
157
|
+
|
|
158
|
+
end
|
|
159
|
+
end
|
|
160
|
+
end
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
require 'protobuf/generators/base'
|
|
2
|
+
|
|
3
|
+
module Protobuf
|
|
4
|
+
module Generators
|
|
5
|
+
class ServiceGenerator < Base
|
|
6
|
+
|
|
7
|
+
def compile
|
|
8
|
+
run_once(:compile) do
|
|
9
|
+
print_class(descriptor.name, :service) do
|
|
10
|
+
descriptor.method.each do |method_descriptor|
|
|
11
|
+
puts build_method(method_descriptor)
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def build_method(method_descriptor)
|
|
18
|
+
name = method_descriptor.name
|
|
19
|
+
request_klass = modulize(method_descriptor.input_type)
|
|
20
|
+
response_klass = modulize(method_descriptor.output_type)
|
|
21
|
+
"rpc :#{name.underscore}, #{request_klass}, #{response_klass}"
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
end
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
module Protobuf
|
|
2
|
+
class Lifecycle
|
|
3
|
+
class << self
|
|
4
|
+
def register(event_name, &blk)
|
|
5
|
+
fail "Lifecycle register must have a block" unless block_given?
|
|
6
|
+
event_name = normalized_event_name(event_name)
|
|
7
|
+
|
|
8
|
+
::ActiveSupport::Notifications.subscribe(event_name) do |_name, _start, _finish, _id, args|
|
|
9
|
+
blk.call(*args)
|
|
10
|
+
end
|
|
11
|
+
end
|
|
12
|
+
alias_method :on, :register
|
|
13
|
+
|
|
14
|
+
def trigger(event_name, *args)
|
|
15
|
+
event_name = normalized_event_name(event_name)
|
|
16
|
+
|
|
17
|
+
::ActiveSupport::Notifications.instrument(event_name, args)
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
replacement = ::ActiveSupport::Notifications
|
|
21
|
+
|
|
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
|
+
)
|
|
27
|
+
|
|
28
|
+
def normalized_event_name(event_name)
|
|
29
|
+
event_name.to_s.downcase
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
end
|
|
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)
|