protobuf-cucumber 3.10.4
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 +70 -0
- data/.rubocop_todo.yml +145 -0
- data/.travis.yml +40 -0
- data/.yardopts +5 -0
- data/CHANGES.md +344 -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 +22 -0
- data/bin/rpc_server +5 -0
- data/install-protobuf.sh +28 -0
- data/lib/protobuf.rb +129 -0
- data/lib/protobuf/cli.rb +257 -0
- data/lib/protobuf/code_generator.rb +120 -0
- data/lib/protobuf/decoder.rb +28 -0
- data/lib/protobuf/deprecation.rb +117 -0
- data/lib/protobuf/descriptors.rb +3 -0
- data/lib/protobuf/descriptors/google/protobuf/compiler/plugin.pb.rb +62 -0
- data/lib/protobuf/descriptors/google/protobuf/descriptor.pb.rb +301 -0
- data/lib/protobuf/encoder.rb +11 -0
- data/lib/protobuf/enum.rb +365 -0
- data/lib/protobuf/exceptions.rb +9 -0
- data/lib/protobuf/field.rb +74 -0
- data/lib/protobuf/field/base_field.rb +380 -0
- data/lib/protobuf/field/base_field_object_definitions.rb +504 -0
- data/lib/protobuf/field/bool_field.rb +64 -0
- data/lib/protobuf/field/bytes_field.rb +78 -0
- data/lib/protobuf/field/double_field.rb +25 -0
- data/lib/protobuf/field/enum_field.rb +61 -0
- data/lib/protobuf/field/field_array.rb +104 -0
- data/lib/protobuf/field/field_hash.rb +122 -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 +43 -0
- data/lib/protobuf/field/int32_field.rb +21 -0
- data/lib/protobuf/field/int64_field.rb +34 -0
- data/lib/protobuf/field/integer_field.rb +23 -0
- data/lib/protobuf/field/message_field.rb +51 -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 +51 -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 +77 -0
- data/lib/protobuf/generators/base.rb +85 -0
- data/lib/protobuf/generators/enum_generator.rb +39 -0
- data/lib/protobuf/generators/extension_generator.rb +27 -0
- data/lib/protobuf/generators/field_generator.rb +193 -0
- data/lib/protobuf/generators/file_generator.rb +262 -0
- data/lib/protobuf/generators/group_generator.rb +122 -0
- data/lib/protobuf/generators/message_generator.rb +104 -0
- data/lib/protobuf/generators/option_generator.rb +17 -0
- data/lib/protobuf/generators/printable.rb +160 -0
- data/lib/protobuf/generators/service_generator.rb +50 -0
- data/lib/protobuf/lifecycle.rb +33 -0
- data/lib/protobuf/logging.rb +39 -0
- data/lib/protobuf/message.rb +260 -0
- data/lib/protobuf/message/fields.rb +233 -0
- data/lib/protobuf/message/serialization.rb +85 -0
- data/lib/protobuf/optionable.rb +70 -0
- data/lib/protobuf/rpc/buffer.rb +78 -0
- data/lib/protobuf/rpc/client.rb +140 -0
- data/lib/protobuf/rpc/connectors/base.rb +221 -0
- data/lib/protobuf/rpc/connectors/ping.rb +89 -0
- data/lib/protobuf/rpc/connectors/socket.rb +78 -0
- data/lib/protobuf/rpc/connectors/zmq.rb +319 -0
- data/lib/protobuf/rpc/dynamic_discovery.pb.rb +50 -0
- data/lib/protobuf/rpc/env.rb +60 -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 +40 -0
- data/lib/protobuf/rpc/middleware/logger.rb +95 -0
- data/lib/protobuf/rpc/middleware/request_decoder.rb +79 -0
- data/lib/protobuf/rpc/middleware/response_encoder.rb +83 -0
- data/lib/protobuf/rpc/middleware/runner.rb +18 -0
- data/lib/protobuf/rpc/rpc.pb.rb +64 -0
- data/lib/protobuf/rpc/rpc_method.rb +16 -0
- data/lib/protobuf/rpc/server.rb +39 -0
- data/lib/protobuf/rpc/servers/socket/server.rb +121 -0
- data/lib/protobuf/rpc/servers/socket/worker.rb +56 -0
- data/lib/protobuf/rpc/servers/socket_runner.rb +46 -0
- data/lib/protobuf/rpc/servers/zmq/broker.rb +194 -0
- data/lib/protobuf/rpc/servers/zmq/server.rb +321 -0
- data/lib/protobuf/rpc/servers/zmq/util.rb +48 -0
- data/lib/protobuf/rpc/servers/zmq/worker.rb +105 -0
- data/lib/protobuf/rpc/servers/zmq_runner.rb +70 -0
- data/lib/protobuf/rpc/service.rb +172 -0
- data/lib/protobuf/rpc/service_directory.rb +261 -0
- data/lib/protobuf/rpc/service_dispatcher.rb +45 -0
- data/lib/protobuf/rpc/service_filters.rb +250 -0
- data/lib/protobuf/rpc/stat.rb +119 -0
- data/lib/protobuf/socket.rb +21 -0
- data/lib/protobuf/tasks.rb +1 -0
- data/lib/protobuf/tasks/compile.rake +80 -0
- data/lib/protobuf/varint.rb +20 -0
- data/lib/protobuf/varint_pure.rb +31 -0
- data/lib/protobuf/version.rb +3 -0
- data/lib/protobuf/wire_type.rb +10 -0
- data/lib/protobuf/zmq.rb +21 -0
- data/profile.html +5103 -0
- data/proto/dynamic_discovery.proto +44 -0
- data/proto/google/protobuf/compiler/plugin.proto +147 -0
- data/proto/google/protobuf/descriptor.proto +779 -0
- data/proto/rpc.proto +69 -0
- data/protobuf-cucumber.gemspec +57 -0
- data/spec/benchmark/tasks.rb +143 -0
- data/spec/bin/protoc-gen-ruby_spec.rb +23 -0
- data/spec/encoding/all_types_spec.rb +103 -0
- 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 +58 -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 +317 -0
- data/spec/lib/protobuf/code_generator_spec.rb +87 -0
- data/spec/lib/protobuf/enum_spec.rb +307 -0
- 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 +44 -0
- data/spec/lib/protobuf/field/field_array_spec.rb +105 -0
- data/spec/lib/protobuf/field/field_hash_spec.rb +168 -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 +120 -0
- 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 +79 -0
- 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 +192 -0
- data/spec/lib/protobuf/generators/base_spec.rb +154 -0
- data/spec/lib/protobuf/generators/enum_generator_spec.rb +82 -0
- data/spec/lib/protobuf/generators/extension_generator_spec.rb +42 -0
- data/spec/lib/protobuf/generators/field_generator_spec.rb +197 -0
- data/spec/lib/protobuf/generators/file_generator_spec.rb +119 -0
- data/spec/lib/protobuf/generators/message_generator_spec.rb +0 -0
- data/spec/lib/protobuf/generators/service_generator_spec.rb +99 -0
- data/spec/lib/protobuf/lifecycle_spec.rb +94 -0
- data/spec/lib/protobuf/message_spec.rb +944 -0
- data/spec/lib/protobuf/optionable_spec.rb +265 -0
- data/spec/lib/protobuf/rpc/client_spec.rb +66 -0
- data/spec/lib/protobuf/rpc/connectors/base_spec.rb +226 -0
- data/spec/lib/protobuf/rpc/connectors/ping_spec.rb +69 -0
- data/spec/lib/protobuf/rpc/connectors/socket_spec.rb +34 -0
- data/spec/lib/protobuf/rpc/connectors/zmq_spec.rb +110 -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 +91 -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 +35 -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 +101 -0
- data/spec/lib/protobuf/varint_spec.rb +29 -0
- data/spec/lib/protobuf_spec.rb +105 -0
- data/spec/spec_helper.rb +42 -0
- data/spec/support/all.rb +6 -0
- data/spec/support/packed_field.rb +23 -0
- data/spec/support/protos/all_types.data.bin +0 -0
- data/spec/support/protos/all_types.data.txt +119 -0
- data/spec/support/protos/enum.pb.rb +63 -0
- data/spec/support/protos/enum.proto +37 -0
- data/spec/support/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/protos/google_unittest.proto +884 -0
- data/spec/support/protos/google_unittest_custom_options.bin +0 -0
- data/spec/support/protos/google_unittest_custom_options.pb.rb +361 -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/protos/google_unittest_import.proto +73 -0
- data/spec/support/protos/google_unittest_import_public.pb.rb +31 -0
- data/spec/support/protos/google_unittest_import_public.proto +41 -0
- data/spec/support/protos/map-test.bin +157 -0
- data/spec/support/protos/map-test.pb.rb +85 -0
- data/spec/support/protos/map-test.proto +68 -0
- data/spec/support/protos/multi_field_extensions.pb.rb +59 -0
- data/spec/support/protos/multi_field_extensions.proto +35 -0
- data/spec/support/protos/resource.pb.rb +172 -0
- data/spec/support/protos/resource.proto +137 -0
- data/spec/support/resource_service.rb +23 -0
- data/spec/support/server.rb +65 -0
- data/spec/support/test_app_file.rb +2 -0
- data/varint_prof.rb +82 -0
- metadata +579 -0
data/CONTRIBUTING.md
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
# Contributing
|
2
|
+
|
3
|
+
I love accepting issues and pull requests. I only ask for a few guidelines to
|
4
|
+
be followed that will make it much easier for me to solve your issue or get
|
5
|
+
your code merged.
|
6
|
+
|
7
|
+
1. Use GitHub Issues or Pull Requests over sending an email. It's much easier for me to keep track of your issue through GitHub.
|
8
|
+
2. For __compiler issues__, please provide both a gist for the __source definition(s)__ as well as the __generated output__ (if any).
|
9
|
+
3. For __existing issues or functionality__, please use the latest stable branch (currently __`3-5-stable`__) as the base branch for the pull request. This helps us maintain a stable gem release strategy. All commits merged to stable will also be merged down to `master`.
|
10
|
+
4. For __new functionality__, please use __`master`__ as the base branch for the pull request. The `master` branch is used to stage all "next iteration" work.
|
11
|
+
5. Be patient with me as I work on your issue.
|
12
|
+
|
13
|
+
Following these simple guidelines really will help me help you. And really,
|
14
|
+
that's what we're here for. I'm on @localshred on twitter, let's be friends. :)
|
15
|
+
|
16
|
+
## Happy Contributing!
|
data/Gemfile
ADDED
data/LICENSE.txt
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
The MIT License (MIT)
|
2
|
+
|
3
|
+
Copyright (c) 2014 BJ Neilsen
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
7
|
+
in the Software without restriction, including without limitation the rights
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
10
|
+
furnished to do so, subject to the following conditions:
|
11
|
+
|
12
|
+
The above copyright notice and this permission notice shall be included in
|
13
|
+
all copies or substantial portions of the Software.
|
14
|
+
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
21
|
+
THE SOFTWARE.
|
22
|
+
|
data/README.md
ADDED
@@ -0,0 +1,33 @@
|
|
1
|
+
# protobuf
|
2
|
+
|
3
|
+
[](http://badge.fury.io/rb/protobuf)
|
4
|
+
[](https://travis-ci.org/ruby-protobuf/protobuf)
|
5
|
+
[](https://gitter.im/ruby-protobuf/protobuf)
|
6
|
+
[](https://www.omniref.com/ruby/gems/protobuf)
|
7
|
+
|
8
|
+
Protobuf is an implementation of [Google's protocol buffers][google-pb] in ruby, version 2.5.0 is currently supported.
|
9
|
+
|
10
|
+
## Install
|
11
|
+
|
12
|
+
See our [Installation Guide][] on the [wiki][].
|
13
|
+
|
14
|
+
## Usage
|
15
|
+
|
16
|
+
The [wiki][] contains in-depth guides on the various ways to use this gem
|
17
|
+
including [compiling definitions][], [object APIs][], [services][], [clients][], and even
|
18
|
+
an [API roadmap][].
|
19
|
+
|
20
|
+
## Changelog
|
21
|
+
|
22
|
+
See recent changes in the [release notes][] or the [changelog][].
|
23
|
+
|
24
|
+
[google-pb]: http://code.google.com/p/protobuf "Google Protocol Buffers"
|
25
|
+
[wiki]: https://github.com/ruby-protobuf/protobuf/wiki "Wiki home page"
|
26
|
+
[Installation Guide]: https://github.com/ruby-protobuf/protobuf/wiki/Installation "Installation guide"
|
27
|
+
[compiling definitions]: https://github.com/ruby-protobuf/protobuf/wiki/Compiling-Definitions "Compiling guide"
|
28
|
+
[object APIs]: https://github.com/ruby-protobuf/protobuf/wiki/Messages-&-Enums "Message & Enum object APIs guide"
|
29
|
+
[services]: https://github.com/ruby-protobuf/protobuf/wiki/Services "Services object API guide"
|
30
|
+
[clients]: https://github.com/ruby-protobuf/protobuf/wiki/Clients "Client object API guide"
|
31
|
+
[API roadmap]: https://github.com/ruby-protobuf/protobuf/wiki/API-Roadmap "API Roadmap guide"
|
32
|
+
[release notes]: https://github.com/ruby-protobuf/protobuf/releases "Release notes"
|
33
|
+
[changelog]: https://github.com/ruby-protobuf/protobuf/blob/master/CHANGES.md "CHANGES.md"
|
data/Rakefile
ADDED
@@ -0,0 +1,64 @@
|
|
1
|
+
$LOAD_PATH << ::File.expand_path('../', __FILE__)
|
2
|
+
$LOAD_PATH << ::File.expand_path('../spec', __FILE__)
|
3
|
+
|
4
|
+
require 'fileutils'
|
5
|
+
require 'rubygems'
|
6
|
+
require 'rubygems/package_task'
|
7
|
+
require 'bundler/gem_tasks'
|
8
|
+
require 'benchmark/tasks'
|
9
|
+
|
10
|
+
require 'rspec/core/rake_task'
|
11
|
+
require 'rubocop/rake_task'
|
12
|
+
|
13
|
+
RSpec::Core::RakeTask.new(:spec)
|
14
|
+
RuboCop::RakeTask.new
|
15
|
+
|
16
|
+
task :default => ['compile:spec', 'compile:rpc', :spec, :rubocop]
|
17
|
+
|
18
|
+
desc 'Run specs'
|
19
|
+
namespace :compile do
|
20
|
+
|
21
|
+
desc 'Compile spec protos in spec/supprt/ directory'
|
22
|
+
task :spec do
|
23
|
+
proto_path = ::File.expand_path('../spec/support/', __FILE__)
|
24
|
+
proto_files = Dir[File.join(proto_path, '**', '*.proto')]
|
25
|
+
cmd = %(protoc --plugin=./bin/protoc-gen-ruby --ruby_out=#{proto_path} -I #{proto_path} #{proto_files.join(' ')})
|
26
|
+
|
27
|
+
puts cmd
|
28
|
+
system(cmd)
|
29
|
+
end
|
30
|
+
|
31
|
+
desc 'Compile rpc protos in protos/ directory'
|
32
|
+
task :rpc do
|
33
|
+
proto_path = ::File.expand_path('../proto', __FILE__)
|
34
|
+
proto_files = Dir[File.join(proto_path, '**', '*.proto')]
|
35
|
+
output_dir = ::File.expand_path('../tmp/rpc', __FILE__)
|
36
|
+
::FileUtils.mkdir_p(output_dir)
|
37
|
+
|
38
|
+
cmd = %(protoc --plugin=./bin/protoc-gen-ruby --ruby_out=#{output_dir} -I #{proto_path} #{proto_files.join(' ')})
|
39
|
+
|
40
|
+
puts cmd
|
41
|
+
system(cmd)
|
42
|
+
|
43
|
+
files = {
|
44
|
+
'tmp/rpc/dynamic_discovery.pb.rb' => 'lib/protobuf/rpc',
|
45
|
+
'tmp/rpc/rpc.pb.rb' => 'lib/protobuf/rpc',
|
46
|
+
'tmp/rpc/google/protobuf/descriptor.pb.rb' => 'lib/protobuf/descriptors/google/protobuf',
|
47
|
+
'tmp/rpc/google/protobuf/compiler/plugin.pb.rb' => 'lib/protobuf/descriptors/google/protobuf/compiler',
|
48
|
+
}
|
49
|
+
|
50
|
+
files.each_pair do |source_file, destination_dir|
|
51
|
+
source_file = ::File.expand_path("../#{source_file}", __FILE__)
|
52
|
+
destination_dir = ::File.expand_path("../#{destination_dir}", __FILE__)
|
53
|
+
::FileUtils::Verbose.cp(source_file, destination_dir)
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
end
|
58
|
+
|
59
|
+
task :console do
|
60
|
+
require 'pry'
|
61
|
+
require 'protobuf'
|
62
|
+
ARGV.clear
|
63
|
+
::Pry.start
|
64
|
+
end
|
data/bin/protoc-gen-ruby
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
# Before requiring protobuf, ensure that we will not load any
|
4
|
+
# server or client code.
|
5
|
+
#
|
6
|
+
ENV['PB_NO_NETWORKING'] = '1'
|
7
|
+
|
8
|
+
$LOAD_PATH << ::File.expand_path("../../lib", __FILE__)
|
9
|
+
require 'protobuf'
|
10
|
+
require 'protobuf/descriptors'
|
11
|
+
require 'protobuf/code_generator'
|
12
|
+
|
13
|
+
# Ensure that no encoding conversions are done on STDIN and STDOUT since
|
14
|
+
# we are passing binary data back and forth. Otherwise these streams
|
15
|
+
# will be mangled on Windows.
|
16
|
+
STDIN.binmode
|
17
|
+
STDOUT.binmode
|
18
|
+
|
19
|
+
request_bytes = STDIN.read
|
20
|
+
code_generator = ::Protobuf::CodeGenerator.new(request_bytes)
|
21
|
+
code_generator.eval_unknown_extensions!
|
22
|
+
STDOUT.print(code_generator.response_bytes)
|
data/bin/rpc_server
ADDED
data/install-protobuf.sh
ADDED
@@ -0,0 +1,28 @@
|
|
1
|
+
#!/usr/bin/env sh
|
2
|
+
|
3
|
+
set -ex
|
4
|
+
|
5
|
+
gdie() {
|
6
|
+
echo "$@" >&2
|
7
|
+
exit 1
|
8
|
+
}
|
9
|
+
|
10
|
+
test -n "$PROTOBUF_VERSION" || die "PROTOBUF_VERSION env var is undefined"
|
11
|
+
|
12
|
+
case "$PROTOBUF_VERSION" in
|
13
|
+
2*)
|
14
|
+
basename=protobuf-$PROTOBUF_VERSION
|
15
|
+
;;
|
16
|
+
3*)
|
17
|
+
basename=protobuf-cpp-$PROTOBUF_VERSION
|
18
|
+
;;
|
19
|
+
*)
|
20
|
+
die "unknown protobuf version: $PROTOBUF_VERSION"
|
21
|
+
;;
|
22
|
+
esac
|
23
|
+
|
24
|
+
curl -sL https://github.com/google/protobuf/releases/download/v$PROTOBUF_VERSION/$basename.tar.gz | tar zx
|
25
|
+
|
26
|
+
cd protobuf-$PROTOBUF_VERSION
|
27
|
+
|
28
|
+
./configure --prefix=/usr && make -j2 && make install
|
data/lib/protobuf.rb
ADDED
@@ -0,0 +1,129 @@
|
|
1
|
+
require 'base64'
|
2
|
+
require 'logger'
|
3
|
+
require 'pp'
|
4
|
+
require 'socket'
|
5
|
+
require 'stringio'
|
6
|
+
|
7
|
+
require 'active_support/core_ext/object/blank'
|
8
|
+
require 'active_support/core_ext/object/try'
|
9
|
+
require 'active_support/inflector'
|
10
|
+
require 'active_support/json'
|
11
|
+
require 'active_support/notifications'
|
12
|
+
# Under MRI, this optimizes proto decoding by around 15% in tests.
|
13
|
+
# When unavailable, we fall to pure Ruby.
|
14
|
+
# rubocop:disable Lint/HandleExceptions
|
15
|
+
begin
|
16
|
+
require 'varint/varint'
|
17
|
+
rescue LoadError
|
18
|
+
end
|
19
|
+
# rubocop:enable Lint/HandleExceptions
|
20
|
+
# rubocop:disable Lint/HandleExceptions
|
21
|
+
begin
|
22
|
+
require 'protobuf_java_helpers'
|
23
|
+
rescue LoadError
|
24
|
+
end
|
25
|
+
# rubocop:enable Lint/HandleExceptions
|
26
|
+
|
27
|
+
# All top-level run time code requires, ordered by necessity
|
28
|
+
require 'protobuf/wire_type'
|
29
|
+
|
30
|
+
require 'protobuf/varint_pure'
|
31
|
+
require 'protobuf/varint'
|
32
|
+
|
33
|
+
require 'protobuf/exceptions'
|
34
|
+
require 'protobuf/deprecation'
|
35
|
+
require 'protobuf/logging'
|
36
|
+
|
37
|
+
require 'protobuf/encoder'
|
38
|
+
require 'protobuf/decoder'
|
39
|
+
|
40
|
+
require 'protobuf/optionable'
|
41
|
+
require 'protobuf/field'
|
42
|
+
require 'protobuf/enum'
|
43
|
+
require 'protobuf/message'
|
44
|
+
require 'protobuf/descriptors'
|
45
|
+
|
46
|
+
module Protobuf
|
47
|
+
|
48
|
+
class << self
|
49
|
+
# Client Host
|
50
|
+
#
|
51
|
+
# Default: `hostname` of the system
|
52
|
+
#
|
53
|
+
# The name or address of the host to use during client RPC calls.
|
54
|
+
attr_writer :client_host
|
55
|
+
end
|
56
|
+
|
57
|
+
def self.after_server_bind(&block)
|
58
|
+
::ActiveSupport::Notifications.subscribe('after_server_bind') do |*args|
|
59
|
+
block.call(*args)
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
def self.before_server_bind(&block)
|
64
|
+
::ActiveSupport::Notifications.subscribe('before_server_bind') do |*args|
|
65
|
+
block.call(*args)
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
def self.client_host
|
70
|
+
@client_host ||= Socket.gethostname
|
71
|
+
end
|
72
|
+
|
73
|
+
def self.connector_type_class
|
74
|
+
@connector_type_class ||= ::Protobuf::Rpc::Connectors::Socket
|
75
|
+
end
|
76
|
+
|
77
|
+
def self.connector_type_class=(type_class)
|
78
|
+
@connector_type_class = type_class
|
79
|
+
end
|
80
|
+
|
81
|
+
# GC Pause during server requests
|
82
|
+
#
|
83
|
+
# Default: false
|
84
|
+
#
|
85
|
+
# Boolean value to tell the server to disable
|
86
|
+
# the Garbage Collector when handling an rpc request.
|
87
|
+
# Once the request is completed, the GC is enabled again.
|
88
|
+
# This optomization provides a huge boost in speed to rpc requests.
|
89
|
+
def self.gc_pause_server_request?
|
90
|
+
return @gc_pause_server_request unless @gc_pause_server_request.nil?
|
91
|
+
self.gc_pause_server_request = false
|
92
|
+
end
|
93
|
+
|
94
|
+
def self.gc_pause_server_request=(value)
|
95
|
+
@gc_pause_server_request = !!value
|
96
|
+
end
|
97
|
+
|
98
|
+
# Permit unknown field on Message initialization
|
99
|
+
#
|
100
|
+
# Default: true
|
101
|
+
#
|
102
|
+
# Simple boolean to define whether we want to permit unknown fields
|
103
|
+
# on Message intialization; otherwise a ::Protobuf::FieldNotDefinedError is thrown.
|
104
|
+
def self.ignore_unknown_fields?
|
105
|
+
!defined?(@ignore_unknown_fields) || @ignore_unknown_fields
|
106
|
+
end
|
107
|
+
|
108
|
+
def self.ignore_unknown_fields=(value)
|
109
|
+
@ignore_unknown_fields = !!value
|
110
|
+
end
|
111
|
+
end
|
112
|
+
|
113
|
+
unless ENV.key?('PB_NO_NETWORKING')
|
114
|
+
require 'protobuf/rpc/client'
|
115
|
+
require 'protobuf/rpc/service'
|
116
|
+
|
117
|
+
env_connector_type = ENV.fetch('PB_CLIENT_TYPE') do
|
118
|
+
:socket
|
119
|
+
end
|
120
|
+
|
121
|
+
symbolized_connector_type = env_connector_type.to_s.downcase.strip.to_sym
|
122
|
+
if [:zmq, :socket].include?(symbolized_connector_type)
|
123
|
+
require "protobuf/#{symbolized_connector_type}"
|
124
|
+
else
|
125
|
+
require "#{env_connector_type}" # rubocop:disable Style/UnneededInterpolation
|
126
|
+
classified = env_connector_type.classify
|
127
|
+
::Protobuf.connector_type_class = classified.constantize
|
128
|
+
end
|
129
|
+
end
|
data/lib/protobuf/cli.rb
ADDED
@@ -0,0 +1,257 @@
|
|
1
|
+
require 'active_support/core_ext/hash/keys'
|
2
|
+
require 'active_support/inflector'
|
3
|
+
|
4
|
+
require 'thor'
|
5
|
+
require 'protobuf/version'
|
6
|
+
require 'protobuf/logging'
|
7
|
+
require 'protobuf/rpc/servers/socket_runner'
|
8
|
+
require 'protobuf/rpc/servers/zmq_runner'
|
9
|
+
|
10
|
+
module Protobuf
|
11
|
+
class CLI < ::Thor
|
12
|
+
include ::Thor::Actions
|
13
|
+
include ::Protobuf::Logging
|
14
|
+
|
15
|
+
attr_accessor :runner, :mode, :exit_requested
|
16
|
+
|
17
|
+
no_commands do
|
18
|
+
alias_method :exit_requested?, :exit_requested
|
19
|
+
end
|
20
|
+
|
21
|
+
default_task :start
|
22
|
+
|
23
|
+
desc 'start APP_FILE', 'Run the RPC server in the given mode, preloading the given APP_FILE. This is the default task.'
|
24
|
+
|
25
|
+
option :host, :type => :string, :default => '127.0.0.1', :aliases => %w(-o), :desc => 'Host to bind.'
|
26
|
+
option :port, :type => :numeric, :default => 9399, :aliases => %w(-p), :desc => 'Master Port to bind.'
|
27
|
+
|
28
|
+
option :backlog, :type => :numeric, :default => 100, :aliases => %w(-b), :desc => 'Backlog for listening socket when using Socket Server.'
|
29
|
+
option :threshold, :type => :numeric, :default => 100, :aliases => %w(-t), :desc => 'Multi-threaded Socket Server cleanup threshold.'
|
30
|
+
option :threads, :type => :numeric, :default => 5, :aliases => %w(-r), :desc => 'Number of worker threads to run. Only applicable in --zmq mode.'
|
31
|
+
|
32
|
+
option :log, :type => :string, :default => STDOUT, :aliases => %w(-l), :desc => 'Log file or device. Default is STDOUT.'
|
33
|
+
option :level, :type => :numeric, :default => ::Logger::INFO, :aliases => %w(-v), :desc => 'Log level to use, 0-5 (see http://www.ruby-doc.org/stdlib/libdoc/logger/rdoc/)'
|
34
|
+
|
35
|
+
option :socket, :type => :boolean, :aliases => %w(-s), :desc => 'Socket Mode for server and client connections.'
|
36
|
+
option :zmq, :type => :boolean, :aliases => %w(-z), :desc => 'ZeroMQ Socket Mode for server and client connections.'
|
37
|
+
|
38
|
+
option :beacon_interval, :type => :numeric, :desc => 'Broadcast beacons every N seconds. (default: 5)'
|
39
|
+
option :beacon_port, :type => :numeric, :desc => 'Broadcast beacons to this port (default: value of ServiceDirectory.port)'
|
40
|
+
option :broadcast_beacons, :type => :boolean, :desc => 'Broadcast beacons for dynamic discovery (Currently only available with ZeroMQ).'
|
41
|
+
option :broadcast_busy, :type => :boolean, :default => false, :desc => 'Remove busy nodes from cluster when all workers are busy (Currently only available with ZeroMQ).'
|
42
|
+
option :debug, :type => :boolean, :default => false, :aliases => %w(-d), :desc => 'Debug Mode. Override log level to DEBUG.'
|
43
|
+
option :gc_pause_request, :type => :boolean, :default => false, :desc => 'DEPRECATED: Enable/Disable GC pause during request.'
|
44
|
+
option :print_deprecation_warnings, :type => :boolean, :default => nil, :desc => 'Cause use of deprecated fields to be printed or ignored.'
|
45
|
+
option :workers_only, :type => :boolean, :default => false, :desc => "Starts process with only workers (no broker/frontend is started) only relevant for Zmq Server"
|
46
|
+
option :worker_port, :type => :numeric, :default => nil, :desc => "Port for 'backend' where workers connect (defaults to port + 1)"
|
47
|
+
option :zmq_inproc, :type => :boolean, :default => true, :desc => 'Use inproc protocol for zmq Server/Broker/Worker'
|
48
|
+
|
49
|
+
def start(app_file)
|
50
|
+
debug_say('Configuring the rpc_server process')
|
51
|
+
|
52
|
+
configure_logger
|
53
|
+
configure_traps
|
54
|
+
configure_runner_mode
|
55
|
+
create_runner
|
56
|
+
configure_process_name(app_file)
|
57
|
+
configure_gc
|
58
|
+
configure_deprecation_warnings
|
59
|
+
|
60
|
+
require_application(app_file) unless exit_requested?
|
61
|
+
start_server unless exit_requested?
|
62
|
+
rescue => e
|
63
|
+
say_and_exit('ERROR: RPC Server failed to start.', e)
|
64
|
+
end
|
65
|
+
|
66
|
+
desc 'version', 'Print ruby and protoc versions and exit.'
|
67
|
+
def version
|
68
|
+
say("Ruby Protobuf v#{::Protobuf::VERSION}")
|
69
|
+
end
|
70
|
+
|
71
|
+
no_tasks do
|
72
|
+
|
73
|
+
# Tell protobuf how to handle the printing of deprecated field usage.
|
74
|
+
def configure_deprecation_warnings
|
75
|
+
::Protobuf.print_deprecation_warnings =
|
76
|
+
if options.print_deprecation_warnings.nil?
|
77
|
+
!ENV.key?("PB_IGNORE_DEPRECATIONS")
|
78
|
+
else
|
79
|
+
options.print_deprecation_warnings?
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
# If we pause during request we don't need to pause in serialization
|
84
|
+
def configure_gc
|
85
|
+
say "DEPRECATED: The gc_pause_request option is deprecated and will be removed in 4.0." if options.gc_pause_request?
|
86
|
+
|
87
|
+
debug_say('Configuring gc')
|
88
|
+
|
89
|
+
::Protobuf.gc_pause_server_request =
|
90
|
+
if defined?(JRUBY_VERSION)
|
91
|
+
# GC.enable/disable are noop's on Jruby
|
92
|
+
false
|
93
|
+
else
|
94
|
+
options.gc_pause_request?
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
98
|
+
# Setup the protobuf logger.
|
99
|
+
def configure_logger
|
100
|
+
debug_say('Configuring logger')
|
101
|
+
|
102
|
+
log_level = options.debug? ? ::Logger::DEBUG : options.level
|
103
|
+
|
104
|
+
::Protobuf::Logging.initialize_logger(options.log, log_level)
|
105
|
+
|
106
|
+
# Debug output the server options to the log file.
|
107
|
+
logger.debug { 'Debugging options:' }
|
108
|
+
logger.debug { options.inspect }
|
109
|
+
end
|
110
|
+
|
111
|
+
# Re-write the $0 var to have a nice process name in ps.
|
112
|
+
def configure_process_name(app_file)
|
113
|
+
debug_say('Configuring process name')
|
114
|
+
$0 = "rpc_server --#{mode} #{options.host}:#{options.port} #{app_file}"
|
115
|
+
end
|
116
|
+
|
117
|
+
# Configure the mode of the server and the runner class.
|
118
|
+
def configure_runner_mode
|
119
|
+
debug_say('Configuring runner mode')
|
120
|
+
server_type = ENV["PB_SERVER_TYPE"]
|
121
|
+
|
122
|
+
self.mode = if multi_mode?
|
123
|
+
say('WARNING: You have provided multiple mode options. Defaulting to socket mode.', :yellow)
|
124
|
+
:socket
|
125
|
+
elsif options.zmq?
|
126
|
+
:zmq
|
127
|
+
else
|
128
|
+
case server_type
|
129
|
+
when nil, /\Asocket[[:space:]]*\z/i
|
130
|
+
:socket
|
131
|
+
when /\Azmq[[:space:]]*\z/i
|
132
|
+
:zmq
|
133
|
+
else
|
134
|
+
require server_type.to_s
|
135
|
+
server_type
|
136
|
+
end
|
137
|
+
end
|
138
|
+
end
|
139
|
+
|
140
|
+
# Configure signal traps.
|
141
|
+
# TODO: add signal handling for hot-reloading the application.
|
142
|
+
def configure_traps
|
143
|
+
debug_say('Configuring traps')
|
144
|
+
|
145
|
+
exit_signals = [:INT, :TERM]
|
146
|
+
exit_signals << :QUIT unless defined?(JRUBY_VERSION)
|
147
|
+
|
148
|
+
exit_signals.each do |signal|
|
149
|
+
debug_say("Registering trap for exit signal #{signal}", :blue)
|
150
|
+
|
151
|
+
trap(signal) do
|
152
|
+
self.exit_requested = true
|
153
|
+
shutdown_server
|
154
|
+
end
|
155
|
+
end
|
156
|
+
end
|
157
|
+
|
158
|
+
# Create the runner for the configured mode
|
159
|
+
def create_runner
|
160
|
+
debug_say("Creating #{mode} runner")
|
161
|
+
self.runner = case mode
|
162
|
+
when :zmq
|
163
|
+
create_zmq_runner
|
164
|
+
when :socket
|
165
|
+
create_socket_runner
|
166
|
+
else
|
167
|
+
say("Extension runner mode: #{mode}")
|
168
|
+
create_extension_server_runner
|
169
|
+
end
|
170
|
+
end
|
171
|
+
|
172
|
+
# Say something if we're in debug mode.
|
173
|
+
def debug_say(message, color = :yellow)
|
174
|
+
say(message, color) if options.debug?
|
175
|
+
end
|
176
|
+
|
177
|
+
# Internal helper to determine if the modes are multi-set which is not valid.
|
178
|
+
def multi_mode?
|
179
|
+
options.zmq? && options.socket?
|
180
|
+
end
|
181
|
+
|
182
|
+
# Require the application file given, exiting if the file doesn't exist.
|
183
|
+
def require_application(app_file)
|
184
|
+
debug_say('Requiring app file')
|
185
|
+
require app_file
|
186
|
+
rescue LoadError => e
|
187
|
+
say_and_exit("Failed to load application file #{app_file}", e)
|
188
|
+
end
|
189
|
+
|
190
|
+
def runner_options
|
191
|
+
opt = options.to_hash.symbolize_keys
|
192
|
+
|
193
|
+
opt[:workers_only] = (!!ENV['PB_WORKERS_ONLY']) || options.workers_only
|
194
|
+
|
195
|
+
opt
|
196
|
+
end
|
197
|
+
|
198
|
+
def say_and_exit(message, exception = nil)
|
199
|
+
message = set_color(message, :red) if options.log == STDOUT
|
200
|
+
|
201
|
+
logger.error { message }
|
202
|
+
|
203
|
+
if exception
|
204
|
+
$stderr.puts "[#{exception.class.name}] #{exception.message}"
|
205
|
+
$stderr.puts exception.backtrace.join("\n")
|
206
|
+
|
207
|
+
logger.error { "[#{exception.class.name}] #{exception.message}" }
|
208
|
+
logger.debug { exception.backtrace.join("\n") }
|
209
|
+
end
|
210
|
+
|
211
|
+
exit(1)
|
212
|
+
end
|
213
|
+
|
214
|
+
def create_extension_server_runner
|
215
|
+
classified = mode.classify
|
216
|
+
extension_server_class = classified.constantize
|
217
|
+
|
218
|
+
self.runner = extension_server_class.new(runner_options)
|
219
|
+
end
|
220
|
+
|
221
|
+
def create_socket_runner
|
222
|
+
require 'protobuf/socket'
|
223
|
+
|
224
|
+
self.runner = ::Protobuf::Rpc::SocketRunner.new(runner_options)
|
225
|
+
end
|
226
|
+
|
227
|
+
def create_zmq_runner
|
228
|
+
require 'protobuf/zmq'
|
229
|
+
|
230
|
+
self.runner = ::Protobuf::Rpc::ZmqRunner.new(runner_options)
|
231
|
+
end
|
232
|
+
|
233
|
+
def shutdown_server
|
234
|
+
logger.info { 'RPC Server shutting down...' }
|
235
|
+
runner.stop
|
236
|
+
::Protobuf::Rpc::ServiceDirectory.instance.stop
|
237
|
+
end
|
238
|
+
|
239
|
+
# Start the runner and log the relevant options.
|
240
|
+
def start_server
|
241
|
+
debug_say('Running server')
|
242
|
+
|
243
|
+
::ActiveSupport::Notifications.instrument("before_server_bind")
|
244
|
+
|
245
|
+
runner.run do
|
246
|
+
logger.info do
|
247
|
+
"pid #{::Process.pid} -- #{mode} RPC Server listening at #{options.host}:#{options.port}"
|
248
|
+
end
|
249
|
+
|
250
|
+
::ActiveSupport::Notifications.instrument("after_server_bind")
|
251
|
+
end
|
252
|
+
|
253
|
+
logger.info { 'Shutdown complete' }
|
254
|
+
end
|
255
|
+
end
|
256
|
+
end
|
257
|
+
end
|