protobuf 2.0.0.rc2 → 2.0.0.rc3
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.
- data/.gitignore +1 -0
- data/ext/ruby_generator/Makefile +10 -0
- data/ext/ruby_generator/RubyGenerator.cpp +85 -70
- data/ext/ruby_generator/RubyGenerator.h +23 -4
- data/lib/protobuf.rb +33 -26
- data/lib/protobuf/cli.rb +18 -13
- data/lib/protobuf/enum.rb +39 -34
- data/lib/protobuf/enum_value.rb +29 -0
- data/lib/protobuf/field/base_field.rb +34 -5
- data/lib/protobuf/field/enum_field.rb +6 -14
- data/lib/protobuf/field/extension_fields.rb +13 -5
- data/lib/protobuf/field/field_array.rb +17 -7
- data/lib/protobuf/field/varint_field.rb +4 -6
- data/lib/protobuf/message.rb +44 -148
- data/lib/protobuf/rpc/server.rb +2 -2
- data/lib/protobuf/version.rb +1 -1
- data/spec/benchmark/tasks.rb +7 -8
- data/spec/functional/evented_server_spec.rb +9 -9
- data/spec/functional/socket_server_spec.rb +8 -8
- data/spec/functional/zmq_server_spec.rb +8 -8
- data/spec/lib/protobuf/cli_spec.rb +30 -11
- data/spec/lib/protobuf/enum_spec.rb +90 -0
- data/spec/lib/protobuf/enum_value_spec.rb +13 -0
- data/spec/lib/protobuf/message/encoder_spec.rb +1 -1
- data/spec/lib/protobuf/message_spec.rb +50 -0
- data/spec/lib/protobuf/rpc/client_spec.rb +23 -23
- data/spec/lib/protobuf/rpc/servers/evented_server_spec.rb +1 -1
- data/spec/lib/protobuf/rpc/servers/socket_server_spec.rb +1 -1
- data/spec/lib/protobuf/rpc/service_spec.rb +18 -18
- data/spec/lib/protobuf_spec.rb +62 -0
- data/spec/spec_helper.rb +12 -1
- data/spec/support/all.rb +0 -1
- data/spec/support/server.rb +1 -1
- data/spec/support/test/enum.pb.rb +32 -0
- data/spec/support/test/enum.proto +12 -0
- data/spec/support/test/resource.pb.rb +52 -0
- data/spec/{proto/test.proto → support/test/resource.proto} +2 -2
- data/spec/support/test/resource_service.rb +14 -0
- metadata +51 -48
- data/ext/Makefile +0 -11
- data/spec/lib/protobuf/message/enum_spec.rb +0 -13
- data/spec/lib/protobuf/message/message_spec.rb +0 -67
- data/spec/proto/test.pb.rb +0 -54
- data/spec/proto/test_service.rb +0 -30
- data/spec/proto/test_service_impl.rb +0 -18
- data/spec/support/silent_constants.rb +0 -44
data/lib/protobuf/rpc/server.rb
CHANGED
@@ -20,7 +20,7 @@ module Protobuf
|
|
20
20
|
|
21
21
|
# Call the service method
|
22
22
|
log_debug { "[#{log_signature}] Dispatching client request to service" }
|
23
|
-
::GC.disable if ::Protobuf.gc_pause_server_request
|
23
|
+
::GC.disable if ::Protobuf.gc_pause_server_request?
|
24
24
|
invoke_rpc_method
|
25
25
|
rescue => error
|
26
26
|
# Ensure we're handling any errors that try to slip out the back door
|
@@ -133,7 +133,7 @@ module Protobuf
|
|
133
133
|
@stats.log_stats
|
134
134
|
@did_respond = true
|
135
135
|
ensure
|
136
|
-
::GC.enable if ::Protobuf.gc_pause_server_request
|
136
|
+
::GC.enable if ::Protobuf.gc_pause_server_request?
|
137
137
|
end
|
138
138
|
end
|
139
139
|
end
|
data/lib/protobuf/version.rb
CHANGED
data/spec/benchmark/tasks.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
require 'benchmark'
|
2
2
|
require 'support/all'
|
3
|
-
require '
|
3
|
+
require 'support/test/resource_service'
|
4
4
|
require 'perftools'
|
5
5
|
|
6
6
|
# Including a way to turn on debug logger for spec runs
|
@@ -11,7 +11,6 @@ if ENV["DEBUG"]
|
|
11
11
|
end
|
12
12
|
|
13
13
|
namespace :benchmark do
|
14
|
-
include SilentConstants
|
15
14
|
|
16
15
|
def benchmark_wrapper(global_bench = nil)
|
17
16
|
if global_bench
|
@@ -28,7 +27,7 @@ namespace :benchmark do
|
|
28
27
|
|
29
28
|
EventMachine.fiber_run do
|
30
29
|
StubServer.new do |server|
|
31
|
-
client =
|
30
|
+
client = ::Test::ResourceService.client(:async => false)
|
32
31
|
|
33
32
|
benchmark_wrapper(global_bench) do |bench|
|
34
33
|
bench.report("ES / EC") do
|
@@ -46,7 +45,7 @@ namespace :benchmark do
|
|
46
45
|
|
47
46
|
EventMachine.fiber_run do
|
48
47
|
StubServer.new(:server => Protobuf::Rpc::Socket::Server, :port => 9399) do |server|
|
49
|
-
client =
|
48
|
+
client = ::Test::ResourceService.client(:async => false, :port => 9399)
|
50
49
|
|
51
50
|
benchmark_wrapper(global_bench) do |bench|
|
52
51
|
bench.report("SS / EC") do
|
@@ -65,7 +64,7 @@ namespace :benchmark do
|
|
65
64
|
EM.stop if EM.reactor_running?
|
66
65
|
|
67
66
|
StubServer.new(:server => Protobuf::Rpc::Socket::Server, :port => 9399) do |server|
|
68
|
-
client =
|
67
|
+
client = ::Test::ResourceService.client(:async => false, :port => 9399)
|
69
68
|
|
70
69
|
benchmark_wrapper(global_bench) do |bench|
|
71
70
|
bench.report("SS / SC") do
|
@@ -83,7 +82,7 @@ namespace :benchmark do
|
|
83
82
|
Thread.pass until EM.reactor_running?
|
84
83
|
|
85
84
|
StubServer.new(:port => 9399) do |server|
|
86
|
-
client =
|
85
|
+
client = ::Test::ResourceService.client(:async => false, :port => 9399)
|
87
86
|
|
88
87
|
benchmark_wrapper(global_bench) do |bench|
|
89
88
|
bench.report("ES / SC") do
|
@@ -100,7 +99,7 @@ namespace :benchmark do
|
|
100
99
|
load "protobuf/zmq.rb"
|
101
100
|
::Protobuf::Rpc::Connector.connector_for_client(true)
|
102
101
|
StubServer.new(:port => 9399, :server => Protobuf::Rpc::Zmq::Server) do |server|
|
103
|
-
client =
|
102
|
+
client = ::Test::ResourceService.client(:async => false, :port => 9399)
|
104
103
|
|
105
104
|
benchmark_wrapper(global_bench) do |bench|
|
106
105
|
bench.report("ZS / ZC") do
|
@@ -132,7 +131,7 @@ namespace :benchmark do
|
|
132
131
|
args.with_defaults(:number => 1000, :profile_output => "/tmp/profiler_new_#{Time.now.to_i}")
|
133
132
|
create_params = { :name => "The name that we set", :date_created => Time.now.to_i, :status => 2 }
|
134
133
|
::PerfTools::CpuProfiler.start(args[:profile_output]) do
|
135
|
-
args[:number].to_i.times {
|
134
|
+
args[:number].to_i.times { Test::Resource.new(create_params) }
|
136
135
|
end
|
137
136
|
|
138
137
|
puts args[:profile_output]
|
@@ -1,23 +1,23 @@
|
|
1
1
|
require 'spec_helper'
|
2
|
-
require 'spec/
|
2
|
+
require 'spec/support/test/resource_service'
|
3
3
|
|
4
4
|
describe 'Functional EventMachine Client' do
|
5
5
|
before(:each) do
|
6
6
|
load 'protobuf/evented.rb'
|
7
7
|
::Protobuf::Rpc::Connector.connector_for_client(true)
|
8
|
-
::
|
8
|
+
::Test::ResourceService.configure(::Test::ResourceService::DEFAULT_LOCATION)
|
9
9
|
end
|
10
10
|
|
11
11
|
it 'runs fine when required fields are set' do
|
12
12
|
expect {
|
13
13
|
EventMachine.fiber_run do
|
14
14
|
StubServer.new do |server|
|
15
|
-
client = ::
|
15
|
+
client = ::Test::ResourceService.client(:async => false, :timeout => 5)
|
16
16
|
|
17
17
|
client.find(:name => 'Test Name', :active => true) do |c|
|
18
18
|
c.on_success do |succ|
|
19
19
|
succ.name.should eq("Test Name")
|
20
|
-
succ.status.should eq(::
|
20
|
+
succ.status.should eq(::Test::StatusType::ENABLED)
|
21
21
|
end
|
22
22
|
|
23
23
|
c.on_failure do |err|
|
@@ -34,8 +34,8 @@ describe 'Functional EventMachine Client' do
|
|
34
34
|
error = nil
|
35
35
|
EventMachine.fiber_run do
|
36
36
|
StubServer.new do |server|
|
37
|
-
request = ::
|
38
|
-
client = ::
|
37
|
+
request = ::Test::ResourceFindRequest.new(:active => true)
|
38
|
+
client = ::Test::ResourceService.client(:async => false)
|
39
39
|
|
40
40
|
client.find(request) do |c|
|
41
41
|
c.on_success { raise "shouldn't pass"}
|
@@ -44,15 +44,15 @@ describe 'Functional EventMachine Client' do
|
|
44
44
|
end
|
45
45
|
EM.stop
|
46
46
|
end
|
47
|
-
error.message.should =~ /ResourceFindRequest.*fields.*improperly set
|
47
|
+
error.message.should =~ /ResourceFindRequest.*fields.*improperly set/
|
48
48
|
end
|
49
49
|
|
50
50
|
it 'calls the on_failure callback when the request type is wrong' do
|
51
51
|
error = nil
|
52
52
|
EventMachine.fiber_run do
|
53
53
|
StubServer.new do |server|
|
54
|
-
request = ::
|
55
|
-
client = ::
|
54
|
+
request = ::Test::Resource.new(:name => 'Test Name')
|
55
|
+
client = ::Test::ResourceService.client(:async => false)
|
56
56
|
|
57
57
|
client.find(request) do |c|
|
58
58
|
c.on_success { raise "shouldn't pass"}
|
@@ -1,5 +1,5 @@
|
|
1
1
|
require 'spec_helper'
|
2
|
-
require 'spec/
|
2
|
+
require 'spec/support/test/resource_service'
|
3
3
|
|
4
4
|
describe 'Functional Socket Client' do
|
5
5
|
before(:all) do
|
@@ -18,12 +18,12 @@ describe 'Functional Socket Client' do
|
|
18
18
|
|
19
19
|
it 'runs fine when required fields are set' do
|
20
20
|
expect {
|
21
|
-
client = ::
|
21
|
+
client = ::Test::ResourceService.client(:async => false)
|
22
22
|
|
23
23
|
client.find(:name => 'Test Name', :active => true) do |c|
|
24
24
|
c.on_success do |succ|
|
25
25
|
succ.name.should eq("Test Name")
|
26
|
-
succ.status.should eq(::
|
26
|
+
succ.status.should eq(::Test::StatusType::ENABLED)
|
27
27
|
end
|
28
28
|
|
29
29
|
c.on_failure do |err|
|
@@ -35,20 +35,20 @@ describe 'Functional Socket Client' do
|
|
35
35
|
|
36
36
|
it 'calls the on_failure callback when a message is malformed' do
|
37
37
|
error = nil
|
38
|
-
request = ::
|
39
|
-
client = ::
|
38
|
+
request = ::Test::ResourceFindRequest.new(:active => true)
|
39
|
+
client = ::Test::ResourceService.client(:async => false)
|
40
40
|
|
41
41
|
client.find(request) do |c|
|
42
42
|
c.on_success { raise "shouldn't pass"}
|
43
43
|
c.on_failure {|e| error = e}
|
44
44
|
end
|
45
|
-
error.message.should =~ /ResourceFindRequest.*fields.*improperly set
|
45
|
+
error.message.should =~ /ResourceFindRequest.*fields.*improperly set/
|
46
46
|
end
|
47
47
|
|
48
48
|
it 'calls the on_failure callback when the request type is wrong' do
|
49
49
|
error = nil
|
50
|
-
request = ::
|
51
|
-
client = ::
|
50
|
+
request = ::Test::Resource.new(:name => 'Test Name')
|
51
|
+
client = ::Test::ResourceService.client(:async => false)
|
52
52
|
|
53
53
|
client.find(request) do |c|
|
54
54
|
c.on_success { raise "shouldn't pass"}
|
@@ -1,5 +1,5 @@
|
|
1
1
|
require 'spec_helper'
|
2
|
-
require 'spec/
|
2
|
+
require 'spec/support/test/resource_service'
|
3
3
|
|
4
4
|
describe 'Functional ZMQ Client' do
|
5
5
|
before(:all) do
|
@@ -18,12 +18,12 @@ describe 'Functional ZMQ Client' do
|
|
18
18
|
|
19
19
|
it 'runs fine when required fields are set' do
|
20
20
|
expect {
|
21
|
-
client = ::
|
21
|
+
client = ::Test::ResourceService.client(:async => false)
|
22
22
|
|
23
23
|
client.find(:name => 'Test Name', :active => true) do |c|
|
24
24
|
c.on_success do |succ|
|
25
25
|
succ.name.should eq("Test Name")
|
26
|
-
succ.status.should eq(::
|
26
|
+
succ.status.should eq(::Test::StatusType::ENABLED)
|
27
27
|
end
|
28
28
|
|
29
29
|
c.on_failure do |err|
|
@@ -35,20 +35,20 @@ describe 'Functional ZMQ Client' do
|
|
35
35
|
|
36
36
|
it 'calls the on_failure callback when a message is malformed' do
|
37
37
|
error = nil
|
38
|
-
request = ::
|
39
|
-
client = ::
|
38
|
+
request = ::Test::ResourceFindRequest.new(:active => true)
|
39
|
+
client = ::Test::ResourceService.client(:async => false)
|
40
40
|
|
41
41
|
client.find(request) do |c|
|
42
42
|
c.on_success { raise "shouldn't pass"}
|
43
43
|
c.on_failure {|e| error = e}
|
44
44
|
end
|
45
|
-
error.message.should =~ /ResourceFindRequest.*fields.*improperly set
|
45
|
+
error.message.should =~ /ResourceFindRequest.*fields.*improperly set/
|
46
46
|
end
|
47
47
|
|
48
48
|
it 'calls the on_failure callback when the request type is wrong' do
|
49
49
|
error = nil
|
50
|
-
request = ::
|
51
|
-
client = ::
|
50
|
+
request = ::Test::Resource.new(:name => 'Test Name')
|
51
|
+
client = ::Test::ResourceService.client(:async => false)
|
52
52
|
|
53
53
|
client.find(request) do |c|
|
54
54
|
c.on_success { raise "shouldn't pass"}
|
@@ -92,8 +92,7 @@ describe ::Protobuf::CLI do
|
|
92
92
|
|
93
93
|
it 'sets both request and serialization pausing to false' do
|
94
94
|
described_class.start(args)
|
95
|
-
::Protobuf.gc_pause_server_request
|
96
|
-
::Protobuf.gc_pause_server_serialization.should be_false
|
95
|
+
::Protobuf.gc_pause_server_request?.should be_false
|
97
96
|
end
|
98
97
|
end
|
99
98
|
|
@@ -102,18 +101,38 @@ describe ::Protobuf::CLI do
|
|
102
101
|
|
103
102
|
it 'sets the configuration option to GC pause server request' do
|
104
103
|
described_class.start(args)
|
105
|
-
::Protobuf.gc_pause_server_request
|
104
|
+
::Protobuf.gc_pause_server_request?.should be_true
|
106
105
|
end
|
107
106
|
end
|
107
|
+
end
|
108
108
|
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
109
|
+
context 'deprecation options' do
|
110
|
+
context 'when not given' do
|
111
|
+
let(:test_args) { [] }
|
112
|
+
|
113
|
+
it 'sets the deprecation warning flag to its default value' do
|
114
|
+
described_class.start(args)
|
115
|
+
::Protobuf.print_deprecation_warnings?.should be_true
|
116
|
+
end
|
117
|
+
end
|
118
|
+
|
119
|
+
context 'when enabled' do
|
120
|
+
let(:test_args) { [ '--print_deprecation_warnings' ] }
|
121
|
+
|
122
|
+
it 'sets the deprecation warning flag to true' do
|
123
|
+
described_class.start(args)
|
124
|
+
::Protobuf.print_deprecation_warnings?.should be_true
|
125
|
+
end
|
126
|
+
end
|
127
|
+
|
128
|
+
context 'when disabled' do
|
129
|
+
let(:test_args) { [ '--no-print_deprecation_warnings' ] }
|
130
|
+
|
131
|
+
it 'sets the deprecation warning flag to false' do
|
132
|
+
described_class.start(args)
|
133
|
+
::Protobuf.print_deprecation_warnings?.should be_false
|
134
|
+
end
|
135
|
+
end
|
117
136
|
end
|
118
137
|
|
119
138
|
context 'run modes' do
|
@@ -0,0 +1,90 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Protobuf::Enum do
|
4
|
+
let(:name) { :THREE }
|
5
|
+
let(:tag) { 3 }
|
6
|
+
|
7
|
+
before(:all) do
|
8
|
+
Test::EnumTestType.define(name, tag)
|
9
|
+
end
|
10
|
+
|
11
|
+
describe '.define' do
|
12
|
+
it 'defines a constant enum value on the parent class' do
|
13
|
+
Test::EnumTestType.constants.should include(name)
|
14
|
+
Test::EnumTestType::THREE.should be_a(Protobuf::EnumValue)
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
describe '.fetch' do
|
19
|
+
context 'when value is an EnumValue' do
|
20
|
+
it 'responds with that object' do
|
21
|
+
Test::EnumTestType.fetch(Test::EnumTestType::THREE).should eq Test::EnumTestType::THREE
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
context 'when value can be coerced to a symbol' do
|
26
|
+
it 'fetches based on the symbol name value' do
|
27
|
+
Test::EnumTestType.fetch("ONE").should eq Test::EnumTestType::ONE
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
context 'when value can be coerced to an integer' do
|
32
|
+
it 'fetches based on the integer tag value' do
|
33
|
+
Test::EnumTestType.fetch(3.0).should eq Test::EnumTestType::THREE
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
context 'when value is not an applicable type' do
|
38
|
+
it 'returns a nil' do
|
39
|
+
Test::EnumTestType.fetch(Test::Resource.new).should be_nil
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
describe '.enum_by_value' do
|
45
|
+
it 'gets the EnumValue corresponding to the given value (tag)' do
|
46
|
+
Test::EnumTestType.enum_by_value(tag).should eq Test::EnumTestType::THREE
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
describe '.name_by_value' do
|
51
|
+
it 'gets the name of the enum corresponding to the given value (tag)' do
|
52
|
+
Test::EnumTestType.name_by_value(tag).should eq name
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
describe '.valid_tag?' do
|
57
|
+
context 'when tag is defined' do
|
58
|
+
specify { Test::EnumTestType.valid_tag?(tag).should be_true }
|
59
|
+
end
|
60
|
+
|
61
|
+
context 'when tag is not defined' do
|
62
|
+
specify { Test::EnumTestType.valid_tag?(300).should be_false }
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
describe '.value_by_name' do
|
67
|
+
it 'gets the EnumValue corresponding to the given name' do
|
68
|
+
Test::EnumTestType.value_by_name(name).should eq Test::EnumTestType::THREE
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
describe '.values' do
|
73
|
+
it 'provides a hash of defined EnumValues' do
|
74
|
+
Test::EnumTestType.values.should eq({
|
75
|
+
:ONE => Test::EnumTestType::ONE,
|
76
|
+
:TWO => Test::EnumTestType::TWO,
|
77
|
+
:THREE => Test::EnumTestType::THREE
|
78
|
+
})
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
context 'when coercing from enum' do
|
83
|
+
subject { Test::StatusType::PENDING }
|
84
|
+
it { should eq(0) }
|
85
|
+
end
|
86
|
+
|
87
|
+
context 'when coercing from integer' do
|
88
|
+
specify { 0.should eq(Test::StatusType::PENDING) }
|
89
|
+
end
|
90
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Protobuf::EnumValue do
|
4
|
+
|
5
|
+
subject { Test::EnumTestType::ONE }
|
6
|
+
its(:parent_class) { should eq Test::EnumTestType }
|
7
|
+
its(:name) { should eq :ONE }
|
8
|
+
its(:value) { should eq 1 }
|
9
|
+
its(:to_hash_value) { should eq 1 }
|
10
|
+
its(:to_s) { should eq "ONE" }
|
11
|
+
its(:inspect) { should eq '#<Protobuf::EnumValue Test::EnumTestType::ONE=1>' }
|
12
|
+
|
13
|
+
end
|
@@ -7,7 +7,7 @@ end
|
|
7
7
|
describe Protobuf::Encoder do
|
8
8
|
describe '#encode' do
|
9
9
|
context "when there's no value for a required field" do
|
10
|
-
let(:message) { ::
|
10
|
+
let(:message) { ::Test::Resource.new }
|
11
11
|
let(:stream) { StringIO.new }
|
12
12
|
it "raises a 'message not initialized' error" do
|
13
13
|
expect {
|
@@ -0,0 +1,50 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Protobuf::Message do
|
4
|
+
|
5
|
+
describe '#to_hash' do
|
6
|
+
context 'generating values for an ENUM field' do
|
7
|
+
it 'converts the enum to its tag representation' do
|
8
|
+
hash = Test::EnumTestMessage.new(:non_default_enum => :TWO).to_hash
|
9
|
+
hash.should eq({ :non_default_enum => 2 })
|
10
|
+
end
|
11
|
+
|
12
|
+
it 'does not populate default values' do
|
13
|
+
hash = Test::EnumTestMessage.new.to_hash
|
14
|
+
hash.should eq(Hash.new)
|
15
|
+
end
|
16
|
+
|
17
|
+
it 'converts repeated enum fields to an array of the tags' do
|
18
|
+
hash = Test::EnumTestMessage.new(:repeated_enums => [ :ONE, :TWO, :TWO, :ONE ]).to_hash
|
19
|
+
hash.should eq({ :repeated_enums => [ 1, 2, 2, 1 ] })
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
context 'generating values for a Message field' do
|
24
|
+
it 'recursively hashes field messages' do
|
25
|
+
hash = Test::Nested.new({ :resource => { :name => 'Nested' } }).to_hash
|
26
|
+
hash.should eq({ :resource => { :name => 'Nested' } })
|
27
|
+
end
|
28
|
+
|
29
|
+
it 'recursively hashes a repeated set of messages' do
|
30
|
+
proto = Test::Nested.new(:multiple_resources => [
|
31
|
+
Test::Resource.new(:name => 'Resource 1'),
|
32
|
+
Test::Resource.new(:name => 'Resource 2')
|
33
|
+
])
|
34
|
+
|
35
|
+
proto.to_hash.should eq({ :multiple_resources => [ { :name => 'Resource 1' },
|
36
|
+
{ :name => 'Resource 2' } ] })
|
37
|
+
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
describe '#to_json' do
|
43
|
+
subject do
|
44
|
+
::Test::ResourceFindRequest.new({ :name => 'Test Name', :active => false })
|
45
|
+
end
|
46
|
+
|
47
|
+
its(:to_json) { should eq '{"name":"Test Name","active":false}' }
|
48
|
+
end
|
49
|
+
|
50
|
+
end
|