protobuffy 3.1.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/.travis.yml +12 -0
- data/.yardopts +5 -0
- data/CHANGES.md +261 -0
- data/CONTRIBUTING.md +16 -0
- data/Gemfile +3 -0
- data/LICENSE.txt +14 -0
- data/README.md +58 -0
- data/Rakefile +61 -0
- data/bin/protoc-gen-ruby +17 -0
- data/bin/rpc_server +4 -0
- data/examples/bin/reverse-client-http +4 -0
- data/examples/bin/reverse-client-socket +4 -0
- data/examples/bin/reverse-client-zmq +4 -0
- data/examples/config.ru +6 -0
- data/examples/definitions/example/reverse.proto +12 -0
- data/examples/lib/example/reverse-client.rb +23 -0
- data/examples/lib/example/reverse-service.rb +9 -0
- data/examples/lib/example/reverse.pb.rb +36 -0
- data/lib/protobuf.rb +106 -0
- data/lib/protobuf/cli.rb +249 -0
- data/lib/protobuf/code_generator.rb +41 -0
- data/lib/protobuf/decoder.rb +74 -0
- data/lib/protobuf/deprecator.rb +42 -0
- data/lib/protobuf/descriptors.rb +3 -0
- data/lib/protobuf/descriptors/google/protobuf/compiler/plugin.pb.rb +52 -0
- data/lib/protobuf/descriptors/google/protobuf/descriptor.pb.rb +249 -0
- data/lib/protobuf/encoder.rb +62 -0
- data/lib/protobuf/enum.rb +319 -0
- data/lib/protobuf/exceptions.rb +9 -0
- data/lib/protobuf/field.rb +74 -0
- data/lib/protobuf/field/base_field.rb +280 -0
- data/lib/protobuf/field/bool_field.rb +53 -0
- data/lib/protobuf/field/bytes_field.rb +81 -0
- data/lib/protobuf/field/double_field.rb +26 -0
- data/lib/protobuf/field/enum_field.rb +57 -0
- data/lib/protobuf/field/field_array.rb +86 -0
- data/lib/protobuf/field/fixed32_field.rb +25 -0
- data/lib/protobuf/field/fixed64_field.rb +29 -0
- data/lib/protobuf/field/float_field.rb +38 -0
- data/lib/protobuf/field/int32_field.rb +22 -0
- data/lib/protobuf/field/int64_field.rb +22 -0
- data/lib/protobuf/field/integer_field.rb +24 -0
- data/lib/protobuf/field/message_field.rb +66 -0
- data/lib/protobuf/field/sfixed32_field.rb +28 -0
- data/lib/protobuf/field/sfixed64_field.rb +29 -0
- data/lib/protobuf/field/signed_integer_field.rb +30 -0
- data/lib/protobuf/field/sint32_field.rb +22 -0
- data/lib/protobuf/field/sint64_field.rb +22 -0
- data/lib/protobuf/field/string_field.rb +35 -0
- data/lib/protobuf/field/uint32_field.rb +22 -0
- data/lib/protobuf/field/uint64_field.rb +22 -0
- data/lib/protobuf/field/varint_field.rb +68 -0
- data/lib/protobuf/generators/base.rb +71 -0
- data/lib/protobuf/generators/enum_generator.rb +42 -0
- data/lib/protobuf/generators/extension_generator.rb +28 -0
- data/lib/protobuf/generators/field_generator.rb +132 -0
- data/lib/protobuf/generators/file_generator.rb +140 -0
- data/lib/protobuf/generators/group_generator.rb +113 -0
- data/lib/protobuf/generators/message_generator.rb +99 -0
- data/lib/protobuf/generators/printable.rb +161 -0
- data/lib/protobuf/generators/service_generator.rb +27 -0
- data/lib/protobuf/http.rb +20 -0
- data/lib/protobuf/lifecycle.rb +46 -0
- data/lib/protobuf/logger.rb +86 -0
- data/lib/protobuf/message.rb +182 -0
- data/lib/protobuf/message/fields.rb +122 -0
- data/lib/protobuf/message/serialization.rb +84 -0
- data/lib/protobuf/optionable.rb +23 -0
- data/lib/protobuf/rpc/buffer.rb +79 -0
- data/lib/protobuf/rpc/client.rb +168 -0
- data/lib/protobuf/rpc/connector.rb +21 -0
- data/lib/protobuf/rpc/connectors/base.rb +54 -0
- data/lib/protobuf/rpc/connectors/common.rb +172 -0
- data/lib/protobuf/rpc/connectors/http.rb +90 -0
- data/lib/protobuf/rpc/connectors/socket.rb +73 -0
- data/lib/protobuf/rpc/connectors/zmq.rb +205 -0
- data/lib/protobuf/rpc/dynamic_discovery.pb.rb +47 -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 +53 -0
- data/lib/protobuf/rpc/server.rb +39 -0
- data/lib/protobuf/rpc/servers/http/server.rb +101 -0
- data/lib/protobuf/rpc/servers/http_runner.rb +34 -0
- data/lib/protobuf/rpc/servers/socket/server.rb +113 -0
- data/lib/protobuf/rpc/servers/socket/worker.rb +56 -0
- data/lib/protobuf/rpc/servers/socket_runner.rb +34 -0
- data/lib/protobuf/rpc/servers/zmq/broker.rb +155 -0
- data/lib/protobuf/rpc/servers/zmq/server.rb +313 -0
- data/lib/protobuf/rpc/servers/zmq/util.rb +47 -0
- data/lib/protobuf/rpc/servers/zmq/worker.rb +105 -0
- data/lib/protobuf/rpc/servers/zmq_runner.rb +51 -0
- data/lib/protobuf/rpc/service.rb +179 -0
- data/lib/protobuf/rpc/service_directory.rb +245 -0
- data/lib/protobuf/rpc/service_dispatcher.rb +46 -0
- data/lib/protobuf/rpc/service_filters.rb +273 -0
- data/lib/protobuf/rpc/stat.rb +148 -0
- data/lib/protobuf/socket.rb +22 -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/protobuffy.gemspec +37 -0
- data/spec/benchmark/tasks.rb +113 -0
- data/spec/bin/protoc-gen-ruby_spec.rb +18 -0
- data/spec/data/data.bin +3 -0
- data/spec/data/types.bin +0 -0
- data/spec/encoding/all_types_spec.rb +91 -0
- data/spec/encoding/extreme_values_spec.rb +0 -0
- data/spec/functional/socket_server_spec.rb +59 -0
- data/spec/functional/zmq_server_spec.rb +103 -0
- data/spec/lib/protobuf/cli_spec.rb +267 -0
- data/spec/lib/protobuf/code_generator_spec.rb +60 -0
- data/spec/lib/protobuf/enum_spec.rb +239 -0
- data/spec/lib/protobuf/field/int32_field_spec.rb +7 -0
- data/spec/lib/protobuf/field/string_field_spec.rb +46 -0
- data/spec/lib/protobuf/field_spec.rb +194 -0
- data/spec/lib/protobuf/generators/base_spec.rb +87 -0
- data/spec/lib/protobuf/generators/enum_generator_spec.rb +68 -0
- data/spec/lib/protobuf/generators/extension_generator_spec.rb +43 -0
- data/spec/lib/protobuf/generators/field_generator_spec.rb +99 -0
- data/spec/lib/protobuf/generators/file_generator_spec.rb +29 -0
- data/spec/lib/protobuf/generators/message_generator_spec.rb +0 -0
- data/spec/lib/protobuf/generators/service_generator_spec.rb +43 -0
- data/spec/lib/protobuf/lifecycle_spec.rb +89 -0
- data/spec/lib/protobuf/logger_spec.rb +136 -0
- data/spec/lib/protobuf/message_spec.rb +368 -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/connector_spec.rb +13 -0
- data/spec/lib/protobuf/rpc/connectors/http_spec.rb +61 -0
- data/spec/lib/protobuf/rpc/connectors/socket_spec.rb +24 -0
- data/spec/lib/protobuf/rpc/connectors/zmq_spec.rb +129 -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/http/server_spec.rb +104 -0
- data/spec/lib/protobuf/rpc/servers/socket_server_spec.rb +38 -0
- data/spec/lib/protobuf/rpc/servers/zmq/server_spec.rb +41 -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 +295 -0
- data/spec/lib/protobuf/rpc/service_dispatcher_spec.rb +52 -0
- data/spec/lib/protobuf/rpc/service_filters_spec.rb +484 -0
- data/spec/lib/protobuf/rpc/service_spec.rb +161 -0
- data/spec/lib/protobuf/rpc/stat_spec.rb +151 -0
- data/spec/lib/protobuf_spec.rb +78 -0
- data/spec/spec_helper.rb +57 -0
- data/spec/support/all.rb +7 -0
- data/spec/support/packed_field.rb +22 -0
- data/spec/support/server.rb +94 -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 +25 -0
- data/spec/support/test/defaults.proto +9 -0
- data/spec/support/test/enum.pb.rb +59 -0
- data/spec/support/test/enum.proto +34 -0
- data/spec/support/test/extended.pb.rb +22 -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 +543 -0
- data/spec/support/test/google_unittest.proto +713 -0
- data/spec/support/test/google_unittest_import.pb.rb +37 -0
- data/spec/support/test/google_unittest_import.proto +64 -0
- data/spec/support/test/google_unittest_import_public.pb.rb +8 -0
- data/spec/support/test/google_unittest_import_public.proto +38 -0
- data/spec/support/test/multi_field_extensions.pb.rb +56 -0
- data/spec/support/test/multi_field_extensions.proto +33 -0
- data/spec/support/test/resource.pb.rb +117 -0
- data/spec/support/test/resource.proto +94 -0
- data/spec/support/test/resource_service.rb +26 -0
- data/spec/support/test_app_file.rb +2 -0
- data/spec/support/tolerance_matcher.rb +40 -0
- metadata +367 -0
@@ -0,0 +1,113 @@
|
|
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
|
+
if items.count > 0
|
84
|
+
item_handler = @handlers[type]
|
85
|
+
|
86
|
+
item_header = @headers[type]
|
87
|
+
header(item_header) if item_header
|
88
|
+
|
89
|
+
item_comment = @comments[type]
|
90
|
+
comment(item_comment) if item_comment
|
91
|
+
|
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
|
99
|
+
|
100
|
+
puts if type == :message_declaration
|
101
|
+
end
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
105
|
+
def to_s
|
106
|
+
compile
|
107
|
+
print_contents
|
108
|
+
end
|
109
|
+
|
110
|
+
end
|
111
|
+
end
|
112
|
+
end
|
113
|
+
|
@@ -0,0 +1,99 @@
|
|
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 is_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 is_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 has_extensions?
|
65
|
+
! message_extension_fields.empty?
|
66
|
+
end
|
67
|
+
|
68
|
+
def has_fields?
|
69
|
+
descriptor.field.count > 0
|
70
|
+
end
|
71
|
+
|
72
|
+
def has_nested_enums?
|
73
|
+
descriptor.enum_type.count > 0
|
74
|
+
end
|
75
|
+
|
76
|
+
def has_nested_messages?
|
77
|
+
descriptor.nested_type.count > 0
|
78
|
+
end
|
79
|
+
|
80
|
+
def has_nested_types?
|
81
|
+
has_nested_enums? || has_nested_messages?
|
82
|
+
end
|
83
|
+
|
84
|
+
def is_printable?
|
85
|
+
if @only_declarations
|
86
|
+
has_nested_types?
|
87
|
+
else
|
88
|
+
has_fields? || has_nested_messages? || has_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
|
99
|
+
|
@@ -0,0 +1,161 @@
|
|
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
|
+
@_indent_level = indent_level.to_i || 0
|
15
|
+
end
|
16
|
+
|
17
|
+
private
|
18
|
+
|
19
|
+
# Print a one-line comment.
|
20
|
+
#
|
21
|
+
def comment(message)
|
22
|
+
puts "# #{message}"
|
23
|
+
end
|
24
|
+
|
25
|
+
def current_indent
|
26
|
+
@_indent_level
|
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
|
+
@_indent_level += 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
|
+
@_indent_level -= 1 unless @_indent_level == 0
|
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
|
+
raise "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((" " * @_indent_level) + 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
|
161
|
+
|
@@ -0,0 +1,27 @@
|
|
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
|
+
return "rpc :#{name.underscore}, #{request_klass}, #{response_klass}"
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
@@ -0,0 +1,20 @@
|
|
1
|
+
##
|
2
|
+
## HTTP Mode
|
3
|
+
##
|
4
|
+
#
|
5
|
+
# Require this file if you wish to run your server and/or client RPC
|
6
|
+
# with the HTTP handlers.
|
7
|
+
#
|
8
|
+
# To run with rpc_server specify the switch `http`:
|
9
|
+
#
|
10
|
+
# rpc_server --http myapp.rb
|
11
|
+
#
|
12
|
+
# To run for client-side only override the require in your Gemfile:
|
13
|
+
#
|
14
|
+
# gem 'protobuf', :require => 'protobuf/http'
|
15
|
+
#
|
16
|
+
require 'protobuf'
|
17
|
+
Protobuf.connector_type = :http
|
18
|
+
|
19
|
+
require 'protobuf/rpc/servers/http/server'
|
20
|
+
require 'protobuf/rpc/connectors/http'
|
@@ -0,0 +1,46 @@
|
|
1
|
+
module Protobuf
|
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)
|
8
|
+
|
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
|
14
|
+
end
|
15
|
+
|
16
|
+
::ActiveSupport::Notifications.subscribe(event_name) do |name, start, finish, id, args|
|
17
|
+
blk.call(*args)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
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
|
27
|
+
end
|
28
|
+
|
29
|
+
event_name = normalized_event_name( event_name )
|
30
|
+
|
31
|
+
::ActiveSupport::Notifications.instrument(event_name, args)
|
32
|
+
end
|
33
|
+
|
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
|
42
|
+
end
|
43
|
+
|
44
|
+
@lifecycle_events ||= {}
|
45
|
+
end
|
46
|
+
end
|