protobuf 2.8.13 → 3.0.0.rc1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGES.md +84 -5
- data/CONTRIBUTING.md +3 -3
- data/Rakefile +46 -7
- data/lib/protobuf/cli.rb +2 -20
- data/lib/protobuf/decoder.rb +74 -0
- data/lib/protobuf/deprecator.rb +42 -0
- data/lib/protobuf/descriptors/google/protobuf/compiler/plugin.pb.rb +17 -16
- data/lib/protobuf/descriptors/google/protobuf/descriptor.pb.rb +86 -85
- data/lib/protobuf/encoder.rb +62 -0
- data/lib/protobuf/enum.rb +298 -37
- data/lib/protobuf/field/base_field.rb +41 -27
- data/lib/protobuf/field/bool_field.rb +22 -4
- data/lib/protobuf/field/bytes_field.rb +36 -15
- data/lib/protobuf/field/double_field.rb +10 -3
- data/lib/protobuf/field/enum_field.rb +21 -18
- data/lib/protobuf/field/field_array.rb +26 -16
- data/lib/protobuf/field/fixed32_field.rb +10 -4
- data/lib/protobuf/field/fixed64_field.rb +10 -3
- data/lib/protobuf/field/float_field.rb +18 -5
- data/lib/protobuf/field/int32_field.rb +14 -4
- data/lib/protobuf/field/int64_field.rb +14 -4
- data/lib/protobuf/field/integer_field.rb +9 -4
- data/lib/protobuf/field/message_field.rb +16 -7
- data/lib/protobuf/field/sfixed32_field.rb +10 -3
- data/lib/protobuf/field/sfixed64_field.rb +12 -7
- data/lib/protobuf/field/signed_integer_field.rb +7 -0
- data/lib/protobuf/field/sint32_field.rb +14 -4
- data/lib/protobuf/field/sint64_field.rb +14 -4
- data/lib/protobuf/field/string_field.rb +11 -1
- data/lib/protobuf/field/uint32_field.rb +14 -4
- data/lib/protobuf/field/uint64_field.rb +14 -4
- data/lib/protobuf/field/varint_field.rb +11 -9
- data/lib/protobuf/field.rb +42 -25
- data/lib/protobuf/generators/enum_generator.rb +12 -1
- data/lib/protobuf/generators/field_generator.rb +1 -1
- data/lib/protobuf/lifecycle.rb +3 -4
- data/lib/protobuf/message/fields.rb +122 -0
- data/lib/protobuf/message/serialization.rb +84 -0
- data/lib/protobuf/message.rb +21 -221
- data/lib/protobuf/optionable.rb +23 -0
- data/lib/protobuf/rpc/client.rb +2 -4
- data/lib/protobuf/rpc/connector.rb +0 -2
- data/lib/protobuf/rpc/connectors/common.rb +2 -2
- data/lib/protobuf/rpc/dynamic_discovery.pb.rb +14 -16
- data/lib/protobuf/rpc/env.rb +58 -0
- data/lib/protobuf/rpc/error.rb +8 -5
- 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/middleware.rb +25 -0
- data/lib/protobuf/rpc/rpc.pb.rb +15 -16
- data/lib/protobuf/rpc/server.rb +14 -64
- data/lib/protobuf/rpc/servers/socket/server.rb +0 -2
- data/lib/protobuf/rpc/servers/socket/worker.rb +11 -15
- data/lib/protobuf/rpc/servers/zmq/util.rb +4 -1
- data/lib/protobuf/rpc/servers/zmq/worker.rb +5 -13
- data/lib/protobuf/rpc/servers/zmq_runner.rb +1 -1
- data/lib/protobuf/rpc/service.rb +38 -72
- data/lib/protobuf/rpc/service_dispatcher.rb +20 -108
- data/lib/protobuf/version.rb +1 -2
- data/lib/protobuf.rb +5 -13
- data/protobuf.gemspec +5 -5
- data/spec/benchmark/tasks.rb +2 -77
- data/spec/functional/zmq_server_spec.rb +13 -21
- data/spec/lib/protobuf/cli_spec.rb +5 -43
- data/spec/lib/protobuf/enum_spec.rb +194 -61
- data/spec/lib/protobuf/field_spec.rb +194 -0
- data/spec/lib/protobuf/generators/enum_generator_spec.rb +24 -1
- data/spec/lib/protobuf/generators/field_generator_spec.rb +6 -6
- data/spec/lib/protobuf/message_spec.rb +52 -70
- data/spec/lib/protobuf/optionable_spec.rb +46 -0
- data/spec/lib/protobuf/rpc/client_spec.rb +1 -93
- data/spec/lib/protobuf/rpc/connector_spec.rb +1 -7
- data/spec/lib/protobuf/rpc/connectors/zmq_spec.rb +8 -0
- data/spec/lib/protobuf/rpc/middleware/exception_handler_spec.rb +62 -0
- data/spec/lib/protobuf/rpc/middleware/logger_spec.rb +49 -0
- data/spec/lib/protobuf/rpc/middleware/request_decoder_spec.rb +115 -0
- data/spec/lib/protobuf/rpc/middleware/response_encoder_spec.rb +75 -0
- data/spec/lib/protobuf/rpc/servers/socket_server_spec.rb +0 -6
- data/spec/lib/protobuf/rpc/servers/zmq/util_spec.rb +10 -0
- data/spec/lib/protobuf/rpc/service_dispatcher_spec.rb +30 -105
- data/spec/lib/protobuf/rpc/service_filters_spec.rb +4 -4
- data/spec/lib/protobuf/rpc/service_spec.rb +20 -24
- data/spec/lib/protobuf_spec.rb +3 -3
- data/spec/spec_helper.rb +5 -4
- data/spec/support/packed_field.rb +15 -14
- data/spec/support/server.rb +4 -21
- data/spec/support/test/defaults.pb.rb +4 -4
- data/spec/support/test/enum.pb.rb +13 -1
- data/spec/support/test/enum.proto +15 -0
- data/spec/support/test/extended.pb.rb +1 -1
- data/spec/support/test/google_unittest.pb.rb +239 -241
- data/spec/support/test/google_unittest_import.pb.rb +2 -2
- data/spec/support/test/multi_field_extensions.pb.rb +2 -2
- data/spec/support/test/resource.pb.rb +19 -18
- data/spec/support/test/resource.proto +1 -0
- data/spec/support/test/resource_service.rb +5 -0
- metadata +78 -57
- data/bin/rprotoc +0 -8
- data/lib/protobuf/enum_value.rb +0 -85
- data/lib/protobuf/evented.rb +0 -37
- data/lib/protobuf/ext/eventmachine.rb +0 -14
- data/lib/protobuf/field/extension_fields.rb +0 -32
- data/lib/protobuf/message/decoder.rb +0 -72
- data/lib/protobuf/message/message.rb +0 -1
- data/lib/protobuf/rpc/connectors/em_client.rb +0 -84
- data/lib/protobuf/rpc/connectors/eventmachine.rb +0 -87
- data/lib/protobuf/rpc/servers/evented/server.rb +0 -36
- data/lib/protobuf/rpc/servers/evented_runner.rb +0 -31
- data/spec/functional/embedded_service_spec.rb +0 -7
- data/spec/functional/evented_server_spec.rb +0 -64
- data/spec/lib/protobuf/enum_value_spec.rb +0 -29
- data/spec/lib/protobuf/rpc/servers/evented_server_spec.rb +0 -19
data/spec/benchmark/tasks.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
require 'benchmark'
|
2
|
+
require 'protobuf/socket'
|
2
3
|
require 'support/all'
|
3
4
|
require 'support/test/resource_service'
|
4
5
|
|
@@ -28,43 +29,8 @@ namespace :benchmark do
|
|
28
29
|
end
|
29
30
|
end
|
30
31
|
|
31
|
-
def em_client_em_server(number_tests, test_length, global_bench = nil)
|
32
|
-
EM.stop if EM.reactor_running?
|
33
|
-
|
34
|
-
EventMachine.fiber_run do
|
35
|
-
StubServer.new(:server => Protobuf::Rpc::Evented::Server) do |server|
|
36
|
-
benchmark_wrapper(global_bench) do |bench|
|
37
|
-
bench.report("ES / EC") do
|
38
|
-
(1..number_tests.to_i).each { client.find(:name => "Test Name" * test_length.to_i, :active => true) }
|
39
|
-
end
|
40
|
-
end
|
41
|
-
end
|
42
|
-
|
43
|
-
EM.stop
|
44
|
-
end
|
45
|
-
end
|
46
|
-
|
47
|
-
def em_client_sock_server(number_tests, test_length, global_bench = nil)
|
48
|
-
EM.stop if EM.reactor_running?
|
49
|
-
|
50
|
-
EventMachine.fiber_run do
|
51
|
-
StubServer.new(:server => Protobuf::Rpc::Socket::Server, :port => 9399) do |server|
|
52
|
-
client = ::Test::ResourceService.client(:port => 9399)
|
53
|
-
|
54
|
-
benchmark_wrapper(global_bench) do |bench|
|
55
|
-
bench.report("SS / EC") do
|
56
|
-
(1..number_tests.to_i).each { client.find(:name => "Test Name" * test_length.to_i, :active => true) }
|
57
|
-
end
|
58
|
-
end
|
59
|
-
end
|
60
|
-
|
61
|
-
EM.stop
|
62
|
-
end
|
63
|
-
end
|
64
|
-
|
65
32
|
def sock_client_sock_server(number_tests, test_length, global_bench = nil)
|
66
33
|
load "protobuf/socket.rb"
|
67
|
-
EM.stop if EM.reactor_running?
|
68
34
|
|
69
35
|
StubServer.new(:server => Protobuf::Rpc::Socket::Server, :port => 9399) do |server|
|
70
36
|
client = ::Test::ResourceService.client(:port => 9399)
|
@@ -77,26 +43,6 @@ namespace :benchmark do
|
|
77
43
|
end
|
78
44
|
end
|
79
45
|
|
80
|
-
def sock_client_em_server(number_tests, test_length, global_bench = nil)
|
81
|
-
load "protobuf/socket.rb"
|
82
|
-
EM.stop if EM.reactor_running?
|
83
|
-
em_thread = Thread.new { EM.run }
|
84
|
-
Thread.pass until EM.reactor_running?
|
85
|
-
|
86
|
-
StubServer.new(:port => 9399) do |server|
|
87
|
-
client = ::Test::ResourceService.client(:port => 9399)
|
88
|
-
|
89
|
-
benchmark_wrapper(global_bench) do |bench|
|
90
|
-
bench.report("ES / SC") do
|
91
|
-
(1..number_tests.to_i).each { client.find(:name => "Test Name" * test_length.to_i, :active => true) }
|
92
|
-
end
|
93
|
-
end
|
94
|
-
end
|
95
|
-
|
96
|
-
EM.stop
|
97
|
-
Thread.kill(em_thread) if em_thread
|
98
|
-
end
|
99
|
-
|
100
46
|
def zmq_client_zmq_server(number_tests, test_length, global_bench = nil)
|
101
47
|
load "protobuf/zmq.rb"
|
102
48
|
StubServer.new(:port => 9399, :server => Protobuf::Rpc::Zmq::Server) do |server|
|
@@ -149,40 +95,19 @@ namespace :benchmark do
|
|
149
95
|
puts args[:profile_output]
|
150
96
|
end
|
151
97
|
|
152
|
-
desc "benchmark EventMachine client with EventMachine server"
|
153
|
-
task :em_client_em_server, [:number, :length] do |t, args|
|
154
|
-
args.with_defaults(:number => 1000, :length => 100)
|
155
|
-
em_client_em_server(args[:number], args[:length])
|
156
|
-
end
|
157
|
-
|
158
|
-
desc "benchmark EventMachine client with Socket server"
|
159
|
-
task :em_client_sock_server, [:number, :length] do |t, args|
|
160
|
-
args.with_defaults(:number => 1000, :length => 100)
|
161
|
-
em_client_sock_server(args[:number], args[:length])
|
162
|
-
end
|
163
|
-
|
164
98
|
desc "benchmark Socket client with Socket server"
|
165
99
|
task :sock_client_sock_server, [:number, :length] do |t, args|
|
166
100
|
args.with_defaults(:number => 1000, :length => 100)
|
167
101
|
sock_client_sock_server(args[:number], args[:length])
|
168
102
|
end
|
169
103
|
|
170
|
-
desc "benchmark Socket client with EventMachine server"
|
171
|
-
task :sock_client_em_server, [:number, :length] do |t, args|
|
172
|
-
args.with_defaults(:number => 1000, :length => 100)
|
173
|
-
sock_client_em_server(args[:number], args[:length])
|
174
|
-
end
|
175
|
-
|
176
104
|
desc "benchmark server performance"
|
177
105
|
task :servers, [:number, :length] do |t, args|
|
178
106
|
args.with_defaults(:number => 1000, :length => 100)
|
179
107
|
|
180
108
|
Benchmark.bm(10) do |bench|
|
181
|
-
|
182
|
-
# em_client_em_server(args[:number], args[:length], bench)
|
183
|
-
# em_client_sock_server(args[:number], args[:length], bench)
|
109
|
+
zmq_client_zmq_server(args[:number], args[:length], bench)
|
184
110
|
sock_client_sock_server(args[:number], args[:length], bench)
|
185
|
-
# sock_client_em_server(args[:number], args[:length], bench)
|
186
111
|
end
|
187
112
|
end
|
188
113
|
end
|
@@ -4,29 +4,21 @@ require 'spec/support/test/resource_service'
|
|
4
4
|
require 'protobuf/rpc/service_directory'
|
5
5
|
|
6
6
|
describe 'Functional ZMQ Client' do
|
7
|
-
let(:options) {{
|
8
|
-
:host => "127.0.0.1",
|
9
|
-
:port => 9399,
|
10
|
-
:worker_port => 9400,
|
11
|
-
:backlog => 100,
|
12
|
-
:threshold => 100,
|
13
|
-
:threads => 5
|
14
|
-
}}
|
15
|
-
|
16
|
-
let(:server) { ::Protobuf::Rpc::Zmq::Server.new(options) }
|
17
|
-
let!(:server_thread) { Thread.new(server) { |server| server.run } }
|
18
|
-
|
19
7
|
before(:all) do
|
20
8
|
load "protobuf/zmq.rb"
|
9
|
+
@runner = ::Protobuf::Rpc::ZmqRunner.new({ :host => "127.0.0.1",
|
10
|
+
:port => 9399,
|
11
|
+
:worker_port => 9408,
|
12
|
+
:backlog => 100,
|
13
|
+
:threshold => 100,
|
14
|
+
:threads => 5 })
|
15
|
+
@server_thread = Thread.new(@runner) { |runner| runner.run }
|
16
|
+
Thread.pass until @runner.running?
|
21
17
|
end
|
22
18
|
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
after do
|
28
|
-
server.stop
|
29
|
-
server_thread.join
|
19
|
+
after(:all) do
|
20
|
+
@runner.stop
|
21
|
+
@server_thread.join
|
30
22
|
end
|
31
23
|
|
32
24
|
it 'runs fine when required fields are set' do
|
@@ -47,8 +39,8 @@ describe 'Functional ZMQ Client' do
|
|
47
39
|
end
|
48
40
|
|
49
41
|
it 'runs under heavy load' do
|
50
|
-
|
51
|
-
|
42
|
+
10.times do |x|
|
43
|
+
5.times.map do |y|
|
52
44
|
Thread.new do
|
53
45
|
client = ::Test::ResourceService.client
|
54
46
|
|
@@ -7,28 +7,21 @@ describe ::Protobuf::CLI do
|
|
7
7
|
File.expand_path('../../../support/test_app_file.rb', __FILE__)
|
8
8
|
end
|
9
9
|
|
10
|
-
let(:sock_runner) {
|
10
|
+
let(:sock_runner) {
|
11
11
|
runner = double("SocketRunner", :register_signals => nil)
|
12
12
|
runner.stub(:run) { ::ActiveSupport::Notifications.publish( "after_server_bind" ) }
|
13
13
|
runner
|
14
14
|
}
|
15
15
|
|
16
|
-
let(:zmq_runner) {
|
16
|
+
let(:zmq_runner) {
|
17
17
|
runner = double "ZmqRunner", register_signals: nil
|
18
18
|
runner.stub(:run) { ::ActiveSupport::Notifications.publish( "after_server_bind" ) }
|
19
19
|
runner
|
20
20
|
}
|
21
21
|
|
22
|
-
let(:evented_runner) {
|
23
|
-
runner = double "EventedRunner", register_signals: nil
|
24
|
-
runner.stub(:run) { ::Protobuf::Lifecycle.trigger( "after_server_bind" ) }
|
25
|
-
runner
|
26
|
-
}
|
27
|
-
|
28
22
|
before(:each) do
|
29
23
|
::Protobuf::Rpc::SocketRunner.stub(:new) { sock_runner }
|
30
24
|
::Protobuf::Rpc::ZmqRunner.stub(:new) { zmq_runner }
|
31
|
-
::Protobuf::Rpc::EventedRunner.stub(:new) { evented_runner }
|
32
25
|
end
|
33
26
|
|
34
27
|
describe '#start' do
|
@@ -176,7 +169,6 @@ describe ::Protobuf::CLI do
|
|
176
169
|
let(:runner) { ::Protobuf::Rpc::SocketRunner }
|
177
170
|
|
178
171
|
before do
|
179
|
-
::Protobuf::Rpc::EventedRunner.should_not_receive(:new)
|
180
172
|
::Protobuf::Rpc::ZmqRunner.should_not_receive(:new)
|
181
173
|
end
|
182
174
|
|
@@ -185,7 +177,7 @@ describe ::Protobuf::CLI do
|
|
185
177
|
described_class.start(args)
|
186
178
|
end
|
187
179
|
|
188
|
-
it 'is activated by PB_SERVER_TYPE=Socket ENV variable' do
|
180
|
+
it 'is activated by PB_SERVER_TYPE=Socket ENV variable' do
|
189
181
|
ENV['PB_SERVER_TYPE'] = "Socket"
|
190
182
|
runner.should_receive(:new).and_return(sock_runner)
|
191
183
|
described_class.start(args)
|
@@ -198,40 +190,12 @@ describe ::Protobuf::CLI do
|
|
198
190
|
end
|
199
191
|
end
|
200
192
|
|
201
|
-
context 'evented' do
|
202
|
-
let(:test_args) { [ '--evented' ] }
|
203
|
-
let(:runner) { ::Protobuf::Rpc::EventedRunner }
|
204
|
-
|
205
|
-
before do
|
206
|
-
::Protobuf::Rpc::SocketRunner.should_not_receive(:new)
|
207
|
-
::Protobuf::Rpc::ZmqRunner.should_not_receive(:new)
|
208
|
-
end
|
209
|
-
|
210
|
-
it 'is activated by the --evented switch' do
|
211
|
-
runner.should_receive(:new).and_return(evented_runner)
|
212
|
-
described_class.start(args)
|
213
|
-
end
|
214
|
-
|
215
|
-
it 'is activated by PB_SERVER_TYPE=Evented ENV variable' do
|
216
|
-
ENV['PB_SERVER_TYPE'] = "Evented"
|
217
|
-
runner.should_receive(:new).and_return(evented_runner)
|
218
|
-
described_class.start(args)
|
219
|
-
ENV.delete('PB_SERVER_TYPE')
|
220
|
-
end
|
221
|
-
|
222
|
-
it 'configures the connector type to be evented' do
|
223
|
-
load "protobuf/evented.rb"
|
224
|
-
::Protobuf.connector_type.should == :evented
|
225
|
-
end
|
226
|
-
end
|
227
|
-
|
228
193
|
context 'zmq workers only' do
|
229
194
|
let(:test_args) { [ '--workers_only', '--zmq' ] }
|
230
195
|
let(:runner) { ::Protobuf::Rpc::ZmqRunner }
|
231
196
|
|
232
197
|
before do
|
233
198
|
::Protobuf::Rpc::SocketRunner.should_not_receive(:new)
|
234
|
-
::Protobuf::Rpc::EventedRunner.should_not_receive(:new)
|
235
199
|
end
|
236
200
|
|
237
201
|
it 'is activated by the --workers_only switch' do
|
@@ -242,7 +206,7 @@ describe ::Protobuf::CLI do
|
|
242
206
|
described_class.start(args)
|
243
207
|
end
|
244
208
|
|
245
|
-
it 'is activated by PB_WORKERS_ONLY=1 ENV variable' do
|
209
|
+
it 'is activated by PB_WORKERS_ONLY=1 ENV variable' do
|
246
210
|
ENV['PB_WORKERS_ONLY'] = "1"
|
247
211
|
runner.should_receive(:new) do |options|
|
248
212
|
options[:workers_only].should be_true
|
@@ -259,7 +223,6 @@ describe ::Protobuf::CLI do
|
|
259
223
|
|
260
224
|
before do
|
261
225
|
::Protobuf::Rpc::SocketRunner.should_not_receive(:new)
|
262
|
-
::Protobuf::Rpc::EventedRunner.should_not_receive(:new)
|
263
226
|
end
|
264
227
|
|
265
228
|
it 'is activated by the --worker_port switch' do
|
@@ -277,7 +240,6 @@ describe ::Protobuf::CLI do
|
|
277
240
|
|
278
241
|
before do
|
279
242
|
::Protobuf::Rpc::SocketRunner.should_not_receive(:new)
|
280
|
-
::Protobuf::Rpc::EventedRunner.should_not_receive(:new)
|
281
243
|
end
|
282
244
|
|
283
245
|
it 'is activated by the --zmq switch' do
|
@@ -285,7 +247,7 @@ describe ::Protobuf::CLI do
|
|
285
247
|
described_class.start(args)
|
286
248
|
end
|
287
249
|
|
288
|
-
it 'is activated by PB_SERVER_TYPE=Zmq ENV variable' do
|
250
|
+
it 'is activated by PB_SERVER_TYPE=Zmq ENV variable' do
|
289
251
|
ENV['PB_SERVER_TYPE'] = "Zmq"
|
290
252
|
runner.should_receive(:new)
|
291
253
|
described_class.start(args)
|
@@ -1,98 +1,231 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
describe Protobuf::Enum do
|
4
|
-
let(:name) { :THREE }
|
5
|
-
let(:tag) { 3 }
|
6
4
|
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
end
|
5
|
+
describe 'class dsl' do
|
6
|
+
let(:name) { :THREE }
|
7
|
+
let(:tag) { 3 }
|
11
8
|
|
12
|
-
|
13
|
-
|
14
|
-
Test::EnumTestType.
|
15
|
-
Test::EnumTestType::THREE.should be_a(Protobuf::EnumValue)
|
9
|
+
before(:all) do
|
10
|
+
Test::EnumTestType.define(:MINUS_ONE, -1)
|
11
|
+
Test::EnumTestType.define(:THREE, 3)
|
16
12
|
end
|
17
|
-
end
|
18
13
|
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
14
|
+
before(:all) do
|
15
|
+
EnumAliasTest = ::Class.new(::Protobuf::Enum) do
|
16
|
+
set_option :allow_alias
|
17
|
+
define :FOO, 1
|
18
|
+
define :BAR, 1
|
19
|
+
define :BAZ, 2
|
23
20
|
end
|
24
21
|
end
|
25
22
|
|
26
|
-
|
27
|
-
it '
|
28
|
-
Test::EnumTestType.
|
29
|
-
Test::EnumTestType.fetch(:ONE).should eq Test::EnumTestType::ONE
|
23
|
+
describe '.aliases_allowed?' do
|
24
|
+
it 'is false when the option is not set' do
|
25
|
+
expect(Test::EnumTestType.aliases_allowed?).to be_false
|
30
26
|
end
|
31
27
|
end
|
32
28
|
|
33
|
-
|
34
|
-
it '
|
35
|
-
Test::EnumTestType.
|
36
|
-
Test::EnumTestType
|
29
|
+
describe '.define' do
|
30
|
+
it 'defines a constant enum on the parent class' do
|
31
|
+
expect(Test::EnumTestType.constants).to include(name)
|
32
|
+
expect(Test::EnumTestType::THREE).to be_a(Protobuf::Enum)
|
33
|
+
end
|
34
|
+
|
35
|
+
context 'when enum allows aliases' do
|
36
|
+
before(:all) do
|
37
|
+
DefineEnumAlias = ::Class.new(::Protobuf::Enum) do
|
38
|
+
set_option :allow_alias
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
it 'allows defining enums with the same tag number' do
|
43
|
+
expect {
|
44
|
+
DefineEnumAlias.define(:FOO, 1)
|
45
|
+
DefineEnumAlias.define(:BAR, 1)
|
46
|
+
}.not_to raise_error
|
47
|
+
end
|
37
48
|
end
|
38
49
|
end
|
39
50
|
|
40
|
-
|
41
|
-
it '
|
42
|
-
Test::EnumTestType.
|
43
|
-
|
44
|
-
|
51
|
+
describe '.enums' do
|
52
|
+
it 'provides an array of defined Enums' do
|
53
|
+
expect(Test::EnumTestType.enums).to eq([
|
54
|
+
Test::EnumTestType::ONE,
|
55
|
+
Test::EnumTestType::TWO,
|
56
|
+
Test::EnumTestType::MINUS_ONE,
|
57
|
+
Test::EnumTestType::THREE
|
58
|
+
])
|
59
|
+
end
|
60
|
+
|
61
|
+
context 'when enum allows aliases' do
|
62
|
+
it 'treats aliased enums as valid' do
|
63
|
+
expect(EnumAliasTest.enums).to eq([
|
64
|
+
EnumAliasTest::FOO,
|
65
|
+
EnumAliasTest::BAR,
|
66
|
+
EnumAliasTest::BAZ
|
67
|
+
])
|
68
|
+
end
|
45
69
|
end
|
46
70
|
end
|
47
|
-
end
|
48
71
|
|
49
|
-
|
50
|
-
|
51
|
-
|
72
|
+
|
73
|
+
describe '.enums_for_tag' do
|
74
|
+
it 'returns an array of Enums for the given tag, if any' do
|
75
|
+
expect(EnumAliasTest.enums_for_tag(1)).to eq([ EnumAliasTest::FOO, EnumAliasTest::BAR ])
|
76
|
+
expect(EnumAliasTest.enums_for_tag(2)).to eq([ EnumAliasTest::BAZ ])
|
77
|
+
expect(EnumAliasTest.enums_for_tag(3)).to eq([])
|
78
|
+
end
|
52
79
|
end
|
53
|
-
end
|
54
80
|
|
55
|
-
|
56
|
-
|
57
|
-
|
81
|
+
describe '.fetch' do
|
82
|
+
context 'when candidate is an Enum' do
|
83
|
+
it 'responds with the Enum' do
|
84
|
+
expect(Test::EnumTestType.fetch(Test::EnumTestType::THREE)).to eq(Test::EnumTestType::THREE)
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
context 'when candidate can be coerced to a symbol' do
|
89
|
+
it 'fetches based on the symbol name' do
|
90
|
+
expect(Test::EnumTestType.fetch("ONE")).to eq(Test::EnumTestType::ONE)
|
91
|
+
expect(Test::EnumTestType.fetch(:ONE)).to eq(Test::EnumTestType::ONE)
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
context 'when candidate can be coerced to an integer' do
|
96
|
+
it 'fetches based on the integer tag' do
|
97
|
+
expect(Test::EnumTestType.fetch(3.0)).to eq(Test::EnumTestType::THREE)
|
98
|
+
expect(Test::EnumTestType.fetch(3)).to eq(Test::EnumTestType::THREE)
|
99
|
+
end
|
100
|
+
|
101
|
+
context 'when enum allows aliases' do
|
102
|
+
it 'fetches the first defined Enum' do
|
103
|
+
expect(EnumAliasTest.fetch(1)).to eq(EnumAliasTest::FOO)
|
104
|
+
end
|
105
|
+
end
|
106
|
+
end
|
107
|
+
|
108
|
+
context 'when candidate is not an applicable type' do
|
109
|
+
it 'returns a nil' do
|
110
|
+
expect(Test::EnumTestType.fetch(EnumAliasTest::FOO)).to be_nil
|
111
|
+
expect(Test::EnumTestType.fetch(Test::Resource.new)).to be_nil
|
112
|
+
expect(Test::EnumTestType.fetch(nil)).to be_nil
|
113
|
+
expect(Test::EnumTestType.fetch(false)).to be_nil
|
114
|
+
expect(Test::EnumTestType.fetch(-10)).to be_nil
|
115
|
+
end
|
116
|
+
end
|
58
117
|
end
|
59
118
|
|
60
|
-
|
61
|
-
|
119
|
+
describe '.enum_for_tag' do
|
120
|
+
it 'gets the Enum corresponding to the given tag' do
|
121
|
+
expect(Test::EnumTestType.enum_for_tag(tag)).to eq(Test::EnumTestType.const_get(name))
|
122
|
+
expect(Test::EnumTestType.enum_for_tag(-5)).to be_nil
|
123
|
+
end
|
62
124
|
end
|
63
125
|
|
64
|
-
|
65
|
-
it '
|
66
|
-
Test::EnumTestType.
|
126
|
+
describe '.name_for_tag' do
|
127
|
+
it 'get the name of the enum given the enum' do
|
128
|
+
expect(Test::EnumTestType.name_for_tag(::Test::EnumTestType::THREE)).to eq(name)
|
129
|
+
end
|
130
|
+
|
131
|
+
it 'gets the name of the enum corresponding to the given tag' do
|
132
|
+
expect(Test::EnumTestType.name_for_tag(tag)).to eq(name)
|
133
|
+
end
|
134
|
+
|
135
|
+
it 'gets the name when the tag is coercable to an int' do
|
136
|
+
expect(Test::EnumTestType.name_for_tag("3")).to eq(name)
|
137
|
+
end
|
138
|
+
|
139
|
+
it 'returns nil when tag does not correspond to a name' do
|
140
|
+
expect(Test::EnumTestType.name_for_tag(12345)).to be_nil
|
141
|
+
end
|
142
|
+
|
143
|
+
context 'when given name is nil' do
|
144
|
+
it 'returns a nil' do
|
145
|
+
expect(Test::EnumTestType.name_for_tag(nil)).to be_nil
|
146
|
+
end
|
147
|
+
end
|
148
|
+
|
149
|
+
context 'when enum allows aliases' do
|
150
|
+
it 'returns the first defined name for the given tag' do
|
151
|
+
expect(EnumAliasTest.name_for_tag(1)).to eq(:FOO)
|
152
|
+
end
|
153
|
+
end
|
154
|
+
end
|
155
|
+
|
156
|
+
describe '.valid_tag?' do
|
157
|
+
context 'when tag is defined' do
|
158
|
+
specify { expect(Test::EnumTestType.valid_tag?(tag)).to be_true }
|
159
|
+
end
|
160
|
+
|
161
|
+
context 'when tag is not defined' do
|
162
|
+
specify { expect(Test::EnumTestType.valid_tag?(300)).to be_false }
|
163
|
+
end
|
164
|
+
|
165
|
+
context 'is true for aliased enums' do
|
166
|
+
specify { expect(EnumAliasTest.valid_tag?(1)).to be_true }
|
67
167
|
end
|
68
168
|
end
|
69
|
-
end
|
70
169
|
|
71
|
-
|
72
|
-
|
73
|
-
|
170
|
+
describe '.enum_for_name' do
|
171
|
+
it 'gets the Enum corresponding to the given name' do
|
172
|
+
expect(Test::EnumTestType.enum_for_name(name)).to eq(Test::EnumTestType::THREE)
|
173
|
+
end
|
74
174
|
end
|
75
175
|
|
76
|
-
|
77
|
-
|
176
|
+
describe '.values' do
|
177
|
+
it 'provides a hash of defined Enums' do
|
178
|
+
expect(Test::EnumTestType.values).to eq({
|
179
|
+
:MINUS_ONE => Test::EnumTestType::MINUS_ONE,
|
180
|
+
:ONE => Test::EnumTestType::ONE,
|
181
|
+
:TWO => Test::EnumTestType::TWO,
|
182
|
+
:THREE => Test::EnumTestType::THREE
|
183
|
+
})
|
184
|
+
end
|
185
|
+
|
186
|
+
it 'contains aliased Enums' do
|
187
|
+
expect(EnumAliasTest.values).to eq({
|
188
|
+
:FOO => EnumAliasTest::FOO,
|
189
|
+
:BAR => EnumAliasTest::BAR,
|
190
|
+
:BAZ => EnumAliasTest::BAZ
|
191
|
+
})
|
192
|
+
end
|
78
193
|
end
|
79
|
-
end
|
80
194
|
|
81
|
-
|
82
|
-
|
83
|
-
|
195
|
+
describe '.all_tags' do
|
196
|
+
it 'provides a unique array of defined tags' do
|
197
|
+
expect(Test::EnumTestType.all_tags).to include(1, 2, -1, 3)
|
198
|
+
expect(EnumAliasTest.all_tags).to include(1, 2)
|
199
|
+
end
|
84
200
|
end
|
85
201
|
end
|
86
202
|
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
203
|
+
subject { Test::EnumTestType::ONE }
|
204
|
+
its(:class) { should eq(Fixnum) }
|
205
|
+
its(:parent_class) { should eq(Test::EnumTestType) }
|
206
|
+
its(:name) { should eq(:ONE) }
|
207
|
+
its(:tag) { should eq(1) }
|
208
|
+
its(:value) { should eq(1) }
|
209
|
+
its(:to_hash_value) { should eq(1) }
|
210
|
+
its(:to_s) { should eq("1") }
|
211
|
+
its(:inspect) { should eq('#<Protobuf::Enum(Test::EnumTestType)::ONE=1>') }
|
212
|
+
specify { subject.to_s(:tag).should eq("1") }
|
213
|
+
specify { subject.to_s(:name).should eq("ONE") }
|
214
|
+
|
215
|
+
it "can be used as the index to an array" do
|
216
|
+
array = [0, 1, 2, 3]
|
217
|
+
array[::Test::EnumTestType::ONE].should eq(1)
|
218
|
+
end
|
219
|
+
|
220
|
+
describe '#try' do
|
221
|
+
specify { subject.try(:parent_class).should eq(subject.parent_class) }
|
222
|
+
specify { subject.try(:class).should eq(subject.class) }
|
223
|
+
specify { subject.try(:name).should eq(subject.name) }
|
224
|
+
specify { subject.try(:tag).should eq(subject.tag) }
|
225
|
+
specify { subject.try(:value).should eq(subject.value) }
|
226
|
+
specify { subject.try(:to_i).should eq(subject.to_i) }
|
227
|
+
specify { subject.try(:to_int).should eq(subject.to_int) }
|
228
|
+
specify { subject.try { |yielded| yielded.should eq(subject) } }
|
96
229
|
end
|
97
230
|
|
98
231
|
context 'when coercing from enum' do
|
@@ -101,6 +234,6 @@ describe Protobuf::Enum do
|
|
101
234
|
end
|
102
235
|
|
103
236
|
context 'when coercing from integer' do
|
104
|
-
specify { 0.
|
237
|
+
specify { expect(0).to eq(Test::StatusType::PENDING) }
|
105
238
|
end
|
106
239
|
end
|