protobuf 3.7.0.pre2 → 3.7.0.pre3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.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
|
|