protobuf 3.7.0.pre2 → 3.7.0.pre3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.rubocop.yml +6 -1
- data/.rubocop_todo.yml +7 -1
- data/.travis.yml +8 -1
- data/CHANGES.md +25 -1
- data/bin/protoc-gen-ruby +2 -2
- data/lib/protobuf/cli.rb +29 -17
- data/lib/protobuf/code_generator.rb +49 -1
- data/lib/protobuf/descriptors/google/protobuf/compiler/plugin.pb.rb +9 -1
- data/lib/protobuf/descriptors/google/protobuf/descriptor.pb.rb +14 -1
- data/lib/protobuf/encoder.rb +2 -2
- data/lib/protobuf/enum.rb +3 -3
- data/lib/protobuf/field/base_field.rb +27 -19
- data/lib/protobuf/field/bool_field.rb +10 -8
- data/lib/protobuf/field/bytes_field.rb +14 -6
- data/lib/protobuf/field/float_field.rb +2 -0
- data/lib/protobuf/field/string_field.rb +10 -0
- data/lib/protobuf/field/varint_field.rb +12 -2
- data/lib/protobuf/generators/base.rb +29 -14
- data/lib/protobuf/generators/enum_generator.rb +4 -7
- data/lib/protobuf/generators/field_generator.rb +17 -4
- data/lib/protobuf/generators/file_generator.rb +121 -10
- data/lib/protobuf/generators/group_generator.rb +9 -3
- data/lib/protobuf/generators/message_generator.rb +8 -2
- data/lib/protobuf/generators/option_generator.rb +17 -0
- data/lib/protobuf/generators/printable.rb +2 -2
- data/lib/protobuf/generators/service_generator.rb +27 -3
- data/lib/protobuf/lifecycle.rb +1 -1
- data/lib/protobuf/message/fields.rb +13 -15
- data/lib/protobuf/message/serialization.rb +9 -9
- data/lib/protobuf/message.rb +23 -29
- data/lib/protobuf/optionable.rb +10 -10
- data/lib/protobuf/rpc/buffer.rb +7 -6
- data/lib/protobuf/rpc/client.rb +2 -30
- data/lib/protobuf/rpc/connectors/base.rb +168 -6
- data/lib/protobuf/rpc/connectors/ping.rb +2 -2
- data/lib/protobuf/rpc/connectors/socket.rb +6 -1
- data/lib/protobuf/rpc/connectors/zmq.rb +1 -2
- data/lib/protobuf/rpc/dynamic_discovery.pb.rb +2 -1
- data/lib/protobuf/rpc/error.rb +2 -2
- data/lib/protobuf/rpc/middleware/exception_handler.rb +4 -0
- data/lib/protobuf/rpc/middleware/logger.rb +4 -0
- data/lib/protobuf/rpc/middleware/request_decoder.rb +11 -16
- data/lib/protobuf/rpc/middleware/response_encoder.rb +18 -23
- data/lib/protobuf/rpc/rpc.pb.rb +2 -1
- data/lib/protobuf/rpc/rpc_method.rb +16 -0
- data/lib/protobuf/rpc/servers/socket/server.rb +4 -4
- data/lib/protobuf/rpc/servers/socket_runner.rb +8 -0
- data/lib/protobuf/rpc/servers/zmq/broker.rb +7 -6
- data/lib/protobuf/rpc/servers/zmq/server.rb +8 -7
- data/lib/protobuf/rpc/servers/zmq/util.rb +6 -6
- data/lib/protobuf/rpc/servers/zmq/worker.rb +7 -6
- data/lib/protobuf/rpc/servers/zmq_runner.rb +8 -0
- data/lib/protobuf/rpc/service.rb +6 -15
- data/lib/protobuf/rpc/service_directory.rb +1 -1
- data/lib/protobuf/rpc/service_dispatcher.rb +5 -6
- data/lib/protobuf/rpc/service_filters.rb +8 -30
- data/lib/protobuf/socket.rb +2 -2
- data/lib/protobuf/version.rb +1 -1
- data/lib/protobuf/zmq.rb +2 -2
- data/lib/protobuf.rb +12 -27
- data/protobuf.gemspec +5 -3
- data/spec/benchmark/tasks.rb +1 -0
- data/spec/functional/code_generator_spec.rb +38 -0
- data/spec/lib/protobuf/cli_spec.rb +19 -10
- data/spec/lib/protobuf/code_generator_spec.rb +28 -0
- data/spec/lib/protobuf/enum_spec.rb +6 -2
- data/spec/lib/protobuf/field/bool_field_spec.rb +4 -0
- data/spec/lib/protobuf/field/double_field_spec.rb +9 -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 +5 -1
- data/spec/lib/protobuf/field/int64_field_spec.rb +7 -0
- data/spec/lib/protobuf/field/message_field_spec.rb +53 -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/uint32_field_spec.rb +7 -0
- data/spec/lib/protobuf/field/uint64_field_spec.rb +7 -0
- data/spec/lib/protobuf/generators/base_spec.rb +69 -1
- data/spec/lib/protobuf/generators/enum_generator_spec.rb +1 -1
- data/spec/lib/protobuf/generators/field_generator_spec.rb +58 -0
- data/spec/lib/protobuf/generators/file_generator_spec.rb +47 -0
- data/spec/lib/protobuf/generators/service_generator_spec.rb +58 -14
- data/spec/lib/protobuf/message_spec.rb +2 -2
- data/spec/lib/protobuf/optionable_spec.rb +96 -0
- data/spec/lib/protobuf/rpc/connectors/base_spec.rb +151 -0
- data/spec/lib/protobuf/rpc/connectors/ping_spec.rb +3 -3
- data/spec/lib/protobuf/rpc/connectors/socket_spec.rb +0 -2
- data/spec/lib/protobuf/rpc/middleware/logger_spec.rb +2 -2
- data/spec/lib/protobuf/rpc/middleware/request_decoder_spec.rb +4 -4
- data/spec/lib/protobuf/rpc/middleware/response_encoder_spec.rb +2 -2
- data/spec/lib/protobuf/rpc/service_dispatcher_spec.rb +1 -18
- data/spec/lib/protobuf/rpc/service_filters_spec.rb +2 -2
- data/spec/lib/protobuf/varint_spec.rb +1 -1
- data/spec/lib/protobuf_spec.rb +13 -16
- data/spec/support/packed_field.rb +3 -2
- data/spec/support/protos/enum.pb.rb +2 -1
- data/spec/support/protos/enum.proto +1 -0
- data/spec/support/protos/google_unittest.pb.rb +69 -58
- 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 +8 -0
- data/spec/support/protos/google_unittest_import_public.pb.rb +6 -0
- data/spec/support/protos/resource.pb.rb +54 -2
- data/spec/support/protos/resource.proto +42 -2
- data/spec/support/server.rb +1 -1
- metadata +39 -16
- data/lib/protobuf/rpc/connector.rb +0 -19
- data/lib/protobuf/rpc/connectors/common.rb +0 -176
- data/spec/lib/protobuf/rpc/connector_spec.rb +0 -26
- data/spec/lib/protobuf/rpc/connectors/common_spec.rb +0 -170
@@ -16,7 +16,7 @@ module Protobuf
|
|
16
16
|
:broadcast_beacons => false,
|
17
17
|
:broadcast_busy => false,
|
18
18
|
:zmq_inproc => true,
|
19
|
-
}
|
19
|
+
}.freeze
|
20
20
|
|
21
21
|
attr_accessor :options, :workers
|
22
22
|
attr_reader :zmq_context
|
@@ -117,7 +117,7 @@ module Protobuf
|
|
117
117
|
def frontend_ip
|
118
118
|
@frontend_ip ||= resolve_ip(options[:host])
|
119
119
|
end
|
120
|
-
|
120
|
+
alias :backend_ip frontend_ip
|
121
121
|
|
122
122
|
def frontend_port
|
123
123
|
options[:port]
|
@@ -217,11 +217,12 @@ module Protobuf
|
|
217
217
|
end
|
218
218
|
|
219
219
|
def timeout
|
220
|
-
|
221
|
-
@timeout
|
222
|
-
|
223
|
-
|
224
|
-
|
220
|
+
@timeout =
|
221
|
+
if @timeout.nil?
|
222
|
+
0
|
223
|
+
else
|
224
|
+
[minimum_timeout, maintenance_timeout].max
|
225
|
+
end
|
225
226
|
end
|
226
227
|
|
227
228
|
def total_workers
|
@@ -4,12 +4,12 @@ module Protobuf
|
|
4
4
|
module Rpc
|
5
5
|
module Zmq
|
6
6
|
|
7
|
-
ADDRESS_MATCH = /\A\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\z
|
8
|
-
WORKER_READY_MESSAGE = "\1"
|
9
|
-
CHECK_AVAILABLE_MESSAGE = "\3"
|
10
|
-
NO_WORKERS_AVAILABLE = "\4"
|
11
|
-
WORKERS_AVAILABLE = "\5"
|
12
|
-
EMPTY_STRING = ""
|
7
|
+
ADDRESS_MATCH = /\A\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\z/
|
8
|
+
WORKER_READY_MESSAGE = "\1".freeze
|
9
|
+
CHECK_AVAILABLE_MESSAGE = "\3".freeze
|
10
|
+
NO_WORKERS_AVAILABLE = "\4".freeze
|
11
|
+
WORKERS_AVAILABLE = "\5".freeze
|
12
|
+
EMPTY_STRING = "".freeze
|
13
13
|
|
14
14
|
module Util
|
15
15
|
include ::Protobuf::Logging
|
@@ -47,7 +47,7 @@ module Protobuf
|
|
47
47
|
loop do
|
48
48
|
rc = poller.poll(500)
|
49
49
|
|
50
|
-
if rc == 0 && !running?
|
50
|
+
if rc == 0 && !running? # rubocop:disable Style/GuardClause
|
51
51
|
break # The server was shutdown and no requests are pending
|
52
52
|
elsif rc == -1
|
53
53
|
break # Something went wrong
|
@@ -68,11 +68,12 @@ module Protobuf
|
|
68
68
|
private
|
69
69
|
|
70
70
|
def init_zmq_context
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
71
|
+
@zmq_context =
|
72
|
+
if inproc?
|
73
|
+
@server.zmq_context
|
74
|
+
else
|
75
|
+
ZMQ::Context.new
|
76
|
+
end
|
76
77
|
end
|
77
78
|
|
78
79
|
def init_backend_socket
|
data/lib/protobuf/rpc/service.rb
CHANGED
@@ -2,13 +2,12 @@ require 'protobuf/logging'
|
|
2
2
|
require 'protobuf/message'
|
3
3
|
require 'protobuf/rpc/client'
|
4
4
|
require 'protobuf/rpc/error'
|
5
|
+
require 'protobuf/rpc/rpc_method'
|
5
6
|
require 'protobuf/rpc/service_filters'
|
6
7
|
|
7
8
|
module Protobuf
|
8
9
|
module Rpc
|
9
10
|
# Object to encapsulate the request/response types for a given service method
|
10
|
-
#
|
11
|
-
RpcMethod = Struct.new("RpcMethod", :method, :request_type, :response_type)
|
12
11
|
|
13
12
|
class Service
|
14
13
|
include ::Protobuf::Logging
|
@@ -103,8 +102,8 @@ module Protobuf
|
|
103
102
|
# This methods is only used by the generated service definitions
|
104
103
|
# and not useful for user code.
|
105
104
|
#
|
106
|
-
def self.rpc(method, request_type, response_type)
|
107
|
-
rpcs[method] = RpcMethod.new(method, request_type, response_type)
|
105
|
+
def self.rpc(method, request_type, response_type, &options_block)
|
106
|
+
rpcs[method] = RpcMethod.new(method, request_type, response_type, &options_block)
|
108
107
|
end
|
109
108
|
|
110
109
|
# Hash containing the set of methods defined via `rpc`.
|
@@ -119,16 +118,8 @@ module Protobuf
|
|
119
118
|
rpcs.key?(name)
|
120
119
|
end
|
121
120
|
|
122
|
-
|
123
|
-
|
124
|
-
#
|
125
|
-
# Get a callable object that will be used by the dispatcher
|
126
|
-
# to invoke the specified rpc method. Facilitates callback dispatch.
|
127
|
-
# The returned lambda is expected to be called at a later time (which
|
128
|
-
# is why we wrap the method call).
|
129
|
-
#
|
130
|
-
def callable_rpc_method(method_name)
|
131
|
-
-> { run_filters(method_name) }
|
121
|
+
def call(method_name)
|
122
|
+
run_filters(method_name)
|
132
123
|
end
|
133
124
|
|
134
125
|
# Response object for this rpc cycle. Not assignable.
|
@@ -162,7 +153,7 @@ module Protobuf
|
|
162
153
|
def respond_with(candidate)
|
163
154
|
@response = candidate
|
164
155
|
end
|
165
|
-
|
156
|
+
alias :return_from_whence_you_came respond_with
|
166
157
|
|
167
158
|
def response_type
|
168
159
|
@response_type ||= env.response_type
|
@@ -12,6 +12,10 @@ module Protobuf
|
|
12
12
|
end
|
13
13
|
|
14
14
|
def call(env)
|
15
|
+
dup._call(env)
|
16
|
+
end
|
17
|
+
|
18
|
+
def _call(env)
|
15
19
|
@env = env
|
16
20
|
|
17
21
|
env.response = dispatch_rpc_request
|
@@ -24,13 +28,8 @@ module Protobuf
|
|
24
28
|
|
25
29
|
private
|
26
30
|
|
27
|
-
# Call the given service method.
|
28
31
|
def dispatch_rpc_request
|
29
|
-
|
30
|
-
fail MethodNotFound, "#{service_name}##{method_name} is not a publicly defined method."
|
31
|
-
end
|
32
|
-
|
33
|
-
rpc_service.callable_rpc_method(method_name).call
|
32
|
+
rpc_service.call(method_name)
|
34
33
|
rpc_service.response
|
35
34
|
end
|
36
35
|
|
@@ -120,15 +120,9 @@ module Protobuf
|
|
120
120
|
# or an object that responds to `call`.
|
121
121
|
#
|
122
122
|
def invoke_via_if?(_rpc_method, filter)
|
123
|
-
if_check = filter.fetch(:if
|
124
|
-
|
125
|
-
|
126
|
-
true
|
127
|
-
else
|
128
|
-
call_or_send(if_check)
|
129
|
-
end
|
130
|
-
|
131
|
-
do_invoke
|
123
|
+
if_check = filter.fetch(:if, nil)
|
124
|
+
return true if if_check.nil?
|
125
|
+
call_or_send(if_check)
|
132
126
|
end
|
133
127
|
|
134
128
|
# If the target rpc endpoint method is listed in the :only option,
|
@@ -150,15 +144,9 @@ module Protobuf
|
|
150
144
|
# or an object that responds to `call`.
|
151
145
|
#
|
152
146
|
def invoke_via_unless?(_rpc_method, filter)
|
153
|
-
unless_check = filter.fetch(:unless
|
154
|
-
|
155
|
-
|
156
|
-
false
|
157
|
-
else
|
158
|
-
call_or_send(unless_check)
|
159
|
-
end
|
160
|
-
|
161
|
-
!skip_invoke
|
147
|
+
unless_check = filter.fetch(:unless, nil)
|
148
|
+
return true if unless_check.nil?
|
149
|
+
!call_or_send(unless_check)
|
162
150
|
end
|
163
151
|
|
164
152
|
def rescue_filters
|
@@ -253,20 +241,10 @@ module Protobuf
|
|
253
241
|
# __send__ assuming that we respond_to it. Return the call's return value.
|
254
242
|
#
|
255
243
|
def call_or_send(callable, *args, &block)
|
256
|
-
|
257
|
-
|
258
|
-
callable.call(self, *args, &block)
|
259
|
-
when respond_to?(callable, true)
|
260
|
-
__send__(callable, *args, &block)
|
261
|
-
else
|
262
|
-
fail "Object #{callable} is not callable"
|
263
|
-
end
|
264
|
-
|
265
|
-
return_value
|
244
|
+
return callable.call(self, *args, &block) if callable.respond_to?(:call)
|
245
|
+
__send__(callable, *args, &block)
|
266
246
|
end
|
267
|
-
|
268
247
|
end
|
269
|
-
|
270
248
|
end
|
271
249
|
end
|
272
250
|
end
|
data/lib/protobuf/socket.rb
CHANGED
@@ -15,7 +15,7 @@
|
|
15
15
|
# gem 'protobuf', :require => 'protobuf/socket'
|
16
16
|
#
|
17
17
|
require 'protobuf'
|
18
|
-
::Protobuf.connector_type = :socket
|
19
|
-
|
20
18
|
require 'protobuf/rpc/servers/socket/server'
|
21
19
|
require 'protobuf/rpc/connectors/socket'
|
20
|
+
|
21
|
+
::Protobuf.connector_type_class = ::Protobuf::Rpc::Connectors::Socket
|
data/lib/protobuf/version.rb
CHANGED
data/lib/protobuf/zmq.rb
CHANGED
@@ -14,8 +14,8 @@
|
|
14
14
|
# gem 'protobuf', :require => 'protobuf/zmq'
|
15
15
|
#
|
16
16
|
require 'protobuf'
|
17
|
-
Protobuf.connector_type = :zmq
|
18
|
-
|
19
17
|
require 'ffi-rzmq'
|
20
18
|
require 'protobuf/rpc/servers/zmq/server'
|
21
19
|
require 'protobuf/rpc/connectors/zmq'
|
20
|
+
|
21
|
+
Protobuf.connector_type_class = ::Protobuf::Rpc::Connectors::Zmq
|
data/lib/protobuf.rb
CHANGED
@@ -30,12 +30,6 @@ require 'protobuf/descriptors'
|
|
30
30
|
|
31
31
|
module Protobuf
|
32
32
|
|
33
|
-
# See Protobuf#connector_type documentation.
|
34
|
-
CONNECTORS = [:socket, :zmq].freeze
|
35
|
-
|
36
|
-
# Default is Socket as it has no external dependencies.
|
37
|
-
DEFAULT_CONNECTOR = :socket
|
38
|
-
|
39
33
|
class << self
|
40
34
|
# Client Host
|
41
35
|
#
|
@@ -49,19 +43,12 @@ module Protobuf
|
|
49
43
|
@client_host ||= Socket.gethostname
|
50
44
|
end
|
51
45
|
|
52
|
-
|
53
|
-
|
54
|
-
# Default: socket
|
55
|
-
#
|
56
|
-
# Symbol value which denotes the type of connector to use
|
57
|
-
# during client requests to an RPC server.
|
58
|
-
def self.connector_type
|
59
|
-
@connector_type ||= DEFAULT_CONNECTOR
|
46
|
+
def self.connector_type_class
|
47
|
+
@connector_type_class ||= ::Protobuf::Rpc::Connectors::Socket
|
60
48
|
end
|
61
49
|
|
62
|
-
def self.
|
63
|
-
|
64
|
-
@connector_type = type
|
50
|
+
def self.connector_type_class=(type_class)
|
51
|
+
@connector_type_class = type_class
|
65
52
|
end
|
66
53
|
|
67
54
|
# GC Pause during server requests
|
@@ -101,17 +88,15 @@ unless ENV.key?('PB_NO_NETWORKING')
|
|
101
88
|
require 'protobuf/rpc/service'
|
102
89
|
|
103
90
|
env_connector_type = ENV.fetch('PB_CLIENT_TYPE') do
|
104
|
-
|
105
|
-
end
|
91
|
+
:socket
|
92
|
+
end
|
106
93
|
|
107
|
-
|
108
|
-
|
94
|
+
symbolized_connector_type = env_connector_type.to_s.downcase.strip.to_sym
|
95
|
+
if [:zmq, :socket].include?(symbolized_connector_type)
|
96
|
+
require "protobuf/#{symbolized_connector_type}"
|
109
97
|
else
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
WARN
|
114
|
-
|
115
|
-
require "protobuf/#{::Protobuf::DEFAULT_CONNECTOR}"
|
98
|
+
require "#{env_connector_type}" # rubocop:disable Style/UnneededInterpolation
|
99
|
+
classified = env_connector_type.classify
|
100
|
+
::Protobuf.connector_type_class = classified.constantize
|
116
101
|
end
|
117
102
|
end
|
data/protobuf.gemspec
CHANGED
@@ -19,15 +19,17 @@ require "protobuf/version"
|
|
19
19
|
s.executables = `git ls-files -- bin/*`.split("\n").map { |f| File.basename(f) }
|
20
20
|
s.require_paths = ["lib"]
|
21
21
|
|
22
|
-
|
22
|
+
# Hack, as Rails 5 requires Ruby version >= 2.2.2.
|
23
|
+
active_support_max_version = "< 5" if Gem::Version.new(RUBY_VERSION) < Gem::Version.new("2.2.2")
|
24
|
+
s.add_dependency "activesupport", '>= 3.2', active_support_max_version
|
23
25
|
s.add_dependency 'middleware'
|
24
26
|
s.add_dependency 'thor'
|
25
27
|
s.add_dependency 'thread_safe'
|
26
28
|
|
27
29
|
s.add_development_dependency 'ffi-rzmq'
|
28
|
-
s.add_development_dependency 'rake'
|
30
|
+
s.add_development_dependency 'rake', '< 11.0' # Rake 11.0.1 removes the last_comment method which rspec-core (< 3.4.4) uses
|
29
31
|
s.add_development_dependency 'rspec', '>= 3.0'
|
30
|
-
s.add_development_dependency "rubocop", "~> 0.
|
32
|
+
s.add_development_dependency "rubocop", "~> 0.38.0"
|
31
33
|
s.add_development_dependency "parser", "2.3.0.6" # Locked this down since 2.3.0.7 causes issues. https://github.com/bbatsov/rubocop/pull/2984
|
32
34
|
s.add_development_dependency 'simplecov'
|
33
35
|
s.add_development_dependency 'timecop'
|
data/spec/benchmark/tasks.rb
CHANGED
@@ -0,0 +1,38 @@
|
|
1
|
+
# encoding: binary
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
require 'protobuf/code_generator'
|
5
|
+
|
6
|
+
RSpec.describe 'code generation' do
|
7
|
+
it "generates code for google's unittest.proto" do
|
8
|
+
bytes = IO.read(PROTOS_PATH.join('google_unittest.bin'), :mode => 'rb')
|
9
|
+
|
10
|
+
expected_files =
|
11
|
+
["google_unittest_import_public.pb.rb", "google_unittest_import.pb.rb", "google_unittest.pb.rb"]
|
12
|
+
|
13
|
+
expected_file_descriptors = expected_files.map do |file_name|
|
14
|
+
file_content = File.open(PROTOS_PATH.join(file_name), "r:UTF-8", &:read)
|
15
|
+
::Google::Protobuf::Compiler::CodeGeneratorResponse::File.new(
|
16
|
+
:name => "protos/" + file_name, :content => file_content)
|
17
|
+
end
|
18
|
+
|
19
|
+
expected_output =
|
20
|
+
::Google::Protobuf::Compiler::CodeGeneratorResponse.encode(:file => expected_file_descriptors)
|
21
|
+
|
22
|
+
code_generator = ::Protobuf::CodeGenerator.new(bytes)
|
23
|
+
code_generator.eval_unknown_extensions!
|
24
|
+
expect(code_generator.response_bytes).to eq(expected_output)
|
25
|
+
end
|
26
|
+
|
27
|
+
it "generates code (including service stubs) with custom field and method options" do
|
28
|
+
expected_unittest_custom_options =
|
29
|
+
File.open(PROTOS_PATH.join('google_unittest_custom_options.pb.rb'), "r:UTF-8", &:read)
|
30
|
+
|
31
|
+
bytes = IO.read(PROTOS_PATH.join('google_unittest_custom_options.bin'), :mode => 'rb')
|
32
|
+
code_generator = ::Protobuf::CodeGenerator.new(bytes)
|
33
|
+
code_generator.eval_unknown_extensions!
|
34
|
+
response = ::Google::Protobuf::Compiler::CodeGeneratorResponse.decode(code_generator.response_bytes)
|
35
|
+
expect(response.file.find { |f| f.name == 'protos/google_unittest_custom_options.pb.rb' }.content)
|
36
|
+
.to eq(expected_unittest_custom_options)
|
37
|
+
end
|
38
|
+
end
|
@@ -170,6 +170,25 @@ RSpec.describe ::Protobuf::CLI do
|
|
170
170
|
|
171
171
|
context 'run modes' do
|
172
172
|
|
173
|
+
context "extension" do
|
174
|
+
let(:runner) { ::Protobuf::Rpc::Servers::SocketRunner }
|
175
|
+
|
176
|
+
it "loads the runner specified by PB_SERVER_TYPE" do
|
177
|
+
ENV['PB_SERVER_TYPE'] = "protobuf/rpc/servers/socket_runner"
|
178
|
+
expect(runner).to receive(:new).and_return(sock_runner)
|
179
|
+
described_class.start(args)
|
180
|
+
ENV.delete('PB_SERVER_TYPE')
|
181
|
+
end
|
182
|
+
|
183
|
+
context "without extension loaded" do
|
184
|
+
it "will throw a LoadError when extension is not loaded" do
|
185
|
+
ENV['PB_SERVER_TYPE'] = "socket_to_load"
|
186
|
+
expect { described_class.start(args) }.to raise_error(LoadError, /socket_to_load/)
|
187
|
+
ENV.delete("PB_SERVER_TYPE")
|
188
|
+
end
|
189
|
+
end
|
190
|
+
end
|
191
|
+
|
173
192
|
context 'socket' do
|
174
193
|
let(:test_args) { ['--socket'] }
|
175
194
|
let(:runner) { ::Protobuf::Rpc::SocketRunner }
|
@@ -189,11 +208,6 @@ RSpec.describe ::Protobuf::CLI do
|
|
189
208
|
described_class.start(args)
|
190
209
|
ENV.delete('PB_SERVER_TYPE')
|
191
210
|
end
|
192
|
-
|
193
|
-
it 'configures the connector type to be socket' do
|
194
|
-
load "protobuf/socket.rb"
|
195
|
-
expect(::Protobuf.connector_type).to eq(:socket)
|
196
|
-
end
|
197
211
|
end
|
198
212
|
|
199
213
|
context 'zmq workers only' do
|
@@ -259,11 +273,6 @@ RSpec.describe ::Protobuf::CLI do
|
|
259
273
|
described_class.start(args)
|
260
274
|
ENV.delete('PB_SERVER_TYPE')
|
261
275
|
end
|
262
|
-
|
263
|
-
it 'configures the connector type to be zmq' do
|
264
|
-
load "protobuf/zmq.rb"
|
265
|
-
expect(::Protobuf.connector_type).to eq(:zmq)
|
266
|
-
end
|
267
276
|
end
|
268
277
|
|
269
278
|
end
|
@@ -37,6 +37,34 @@ RSpec.describe ::Protobuf::CodeGenerator do
|
|
37
37
|
end
|
38
38
|
end
|
39
39
|
|
40
|
+
describe '#eval_unknown_extensions' do
|
41
|
+
let(:input_file) do
|
42
|
+
DESCRIPTOR::FileDescriptorProto.new(
|
43
|
+
:name => 'test/boom.proto',
|
44
|
+
:package => 'test.pkg.code_generator_spec',
|
45
|
+
:extension => [{
|
46
|
+
:name => 'boom',
|
47
|
+
:number => 20100,
|
48
|
+
:label => Google::Protobuf::FieldDescriptorProto::Label::LABEL_OPTIONAL,
|
49
|
+
:type => Google::Protobuf::FieldDescriptorProto::Type::TYPE_STRING,
|
50
|
+
:extendee => '.google.protobuf.FieldOptions',
|
51
|
+
}],
|
52
|
+
)
|
53
|
+
end
|
54
|
+
let(:request_bytes) { COMPILER::CodeGeneratorRequest.encode(:proto_file => [input_file]) }
|
55
|
+
|
56
|
+
it 'evals files as they are generated' do
|
57
|
+
described_class.new(request_bytes).eval_unknown_extensions!
|
58
|
+
expect(Google::Protobuf::FieldOptions.extension_fields.map(&:fully_qualified_name)).to include(:'.test.pkg.code_generator_spec.boom')
|
59
|
+
expect(Google::Protobuf::FieldOptions.extension_fields.map(&:name)).to include(:boom)
|
60
|
+
added_extension = Google::Protobuf::FieldOptions.extension_fields.detect { |f| f.fully_qualified_name == :'.test.pkg.code_generator_spec.boom' }
|
61
|
+
expect(added_extension.name).to eq(:boom)
|
62
|
+
expect(added_extension.rule).to eq(:optional)
|
63
|
+
expect(added_extension.type_class).to eq(::Protobuf::Field::StringField)
|
64
|
+
expect(added_extension.tag).to eq(20100)
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
40
68
|
context 'class-level printing methods' do
|
41
69
|
describe '.fatal' do
|
42
70
|
it 'raises a CodeGeneratorFatalError error' do
|
@@ -53,11 +53,12 @@ RSpec.describe Protobuf::Enum do
|
|
53
53
|
it 'provides an array of defined Enums' do
|
54
54
|
expect(Test::EnumTestType.enums).to eq(
|
55
55
|
[
|
56
|
+
Test::EnumTestType::ZERO,
|
56
57
|
Test::EnumTestType::ONE,
|
57
58
|
Test::EnumTestType::TWO,
|
58
59
|
Test::EnumTestType::MINUS_ONE,
|
59
60
|
Test::EnumTestType::THREE,
|
60
|
-
]
|
61
|
+
],
|
61
62
|
)
|
62
63
|
end
|
63
64
|
|
@@ -68,7 +69,7 @@ RSpec.describe Protobuf::Enum do
|
|
68
69
|
EnumAliasTest::FOO,
|
69
70
|
EnumAliasTest::BAR,
|
70
71
|
EnumAliasTest::BAZ,
|
71
|
-
]
|
72
|
+
],
|
72
73
|
)
|
73
74
|
end
|
74
75
|
end
|
@@ -76,6 +77,7 @@ RSpec.describe Protobuf::Enum do
|
|
76
77
|
|
77
78
|
describe '.enums_for_tag' do
|
78
79
|
it 'returns an array of Enums for the given tag, if any' do
|
80
|
+
expect(EnumAliasTest.enums_for_tag(nil)).to eq([])
|
79
81
|
expect(EnumAliasTest.enums_for_tag(1)).to eq([EnumAliasTest::FOO, EnumAliasTest::BAR])
|
80
82
|
expect(EnumAliasTest.enums_for_tag(2)).to eq([EnumAliasTest::BAZ])
|
81
83
|
expect(EnumAliasTest.enums_for_tag(3)).to eq([])
|
@@ -124,6 +126,7 @@ RSpec.describe Protobuf::Enum do
|
|
124
126
|
it 'gets the Enum corresponding to the given tag' do
|
125
127
|
expect(Test::EnumTestType.enum_for_tag(tag)).to eq(Test::EnumTestType.const_get(name))
|
126
128
|
expect(Test::EnumTestType.enum_for_tag(-5)).to be_nil
|
129
|
+
expect(Test::EnumTestType.enum_for_tag(nil)).to be_nil
|
127
130
|
end
|
128
131
|
end
|
129
132
|
|
@@ -186,6 +189,7 @@ RSpec.describe Protobuf::Enum do
|
|
186
189
|
it 'provides a hash of defined Enums' do
|
187
190
|
expect(Test::EnumTestType.values).to eq(
|
188
191
|
:MINUS_ONE => Test::EnumTestType::MINUS_ONE,
|
192
|
+
:ZERO => Test::EnumTestType::ZERO,
|
189
193
|
:ONE => Test::EnumTestType::ONE,
|
190
194
|
:TWO => Test::EnumTestType::TWO,
|
191
195
|
:THREE => Test::EnumTestType::THREE,
|
@@ -2,6 +2,10 @@ require 'spec_helper'
|
|
2
2
|
|
3
3
|
RSpec.describe Protobuf::Field::BoolField do
|
4
4
|
|
5
|
+
it_behaves_like :packable_field, described_class do
|
6
|
+
let(:value) { [true, false] }
|
7
|
+
end
|
8
|
+
|
5
9
|
class SomeBoolMessage < ::Protobuf::Message
|
6
10
|
optional :bool, :some_bool, 1
|
7
11
|
required :bool, :required_bool, 2
|
@@ -2,6 +2,10 @@ require 'spec_helper'
|
|
2
2
|
|
3
3
|
RSpec.describe Protobuf::Field::FloatField do
|
4
4
|
|
5
|
+
it_behaves_like :packable_field, described_class do
|
6
|
+
let(:value) { [1.0, 2.0, 3.0] }
|
7
|
+
end
|
8
|
+
|
5
9
|
class SomeFloatMessage < ::Protobuf::Message
|
6
10
|
optional :float, :some_float, 1
|
7
11
|
end
|
@@ -39,7 +43,7 @@ RSpec.describe Protobuf::Field::FloatField do
|
|
39
43
|
let(:value) { "aaaa" }
|
40
44
|
|
41
45
|
it 'throws an error' do
|
42
|
-
expect { subject }.to raise_error(
|
46
|
+
expect { subject }.to raise_error(TypeError)
|
43
47
|
end
|
44
48
|
end
|
45
49
|
|