riakpb 0.1.0

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.
@@ -0,0 +1,73 @@
1
+ module Riak
2
+ module Util
3
+ module MessageCode
4
+ ERROR_RESPONSE = 0
5
+
6
+ PING_REQUEST = 1
7
+ PING_RESPONSE = 2
8
+
9
+ GET_CLIENT_ID_REQUEST = 3
10
+ GET_CLIENT_ID_RESPONSE = 4
11
+
12
+ SET_CLIENT_ID_REQUEST = 5
13
+ SET_CLIENT_ID_RESPONSE = 6
14
+
15
+ GET_SERVER_INFO_REQUEST = 7
16
+ GET_SERVER_INFO_RESPONSE = 8
17
+
18
+ GET_REQUEST = 9
19
+ GET_RESPONSE = 10
20
+
21
+ PUT_REQUEST = 11
22
+ PUT_RESPONSE = 12
23
+
24
+ DEL_REQUEST = 13
25
+ DEL_RESPONSE = 14
26
+
27
+ LIST_BUCKETS_REQUEST = 15
28
+ LIST_BUCKETS_RESPONSE = 16
29
+
30
+ LIST_KEYS_REQUEST = 17
31
+ LIST_KEYS_RESPONSE = 18
32
+
33
+ GET_BUCKET_REQUEST = 19
34
+ GET_BUCKET_RESPONSE = 20
35
+
36
+ SET_BUCKET_REQUEST = 21
37
+ SET_BUCKET_RESPONSE = 22
38
+
39
+ MAP_REDUCE_REQUEST = 23
40
+ MAP_REDUCE_RESPONSE = 24
41
+
42
+ MC_RESPONSE_FOR = {
43
+ PING_REQUEST => PING_RESPONSE,
44
+ GET_CLIENT_ID_REQUEST => GET_CLIENT_ID_RESPONSE,
45
+ SET_CLIENT_ID_REQUEST => SET_CLIENT_ID_RESPONSE,
46
+ GET_SERVER_INFO_REQUEST => GET_SERVER_INFO_RESPONSE,
47
+ GET_REQUEST => GET_RESPONSE,
48
+ PUT_REQUEST => PUT_RESPONSE,
49
+ DEL_REQUEST => DEL_RESPONSE,
50
+ LIST_BUCKETS_REQUEST => LIST_BUCKETS_RESPONSE,
51
+ LIST_KEYS_REQUEST => LIST_KEYS_RESPONSE,
52
+ GET_BUCKET_REQUEST => GET_BUCKET_RESPONSE,
53
+ SET_BUCKET_REQUEST => SET_BUCKET_RESPONSE,
54
+ MAP_REDUCE_REQUEST => MAP_REDUCE_RESPONSE
55
+ }
56
+
57
+ RESPONSE_CLASS_FOR = {
58
+ PING_REQUEST => nil,
59
+ GET_CLIENT_ID_REQUEST => Riak::RpbGetClientIdResp,
60
+ SET_CLIENT_ID_REQUEST => nil,
61
+ GET_SERVER_INFO_REQUEST => Riak::RpbGetServerInfoResp,
62
+ GET_REQUEST => Riak::RpbGetResp,
63
+ PUT_REQUEST => Riak::RpbPutResp,
64
+ DEL_REQUEST => nil,
65
+ LIST_BUCKETS_REQUEST => Riak::RpbListBucketsResp,
66
+ LIST_KEYS_REQUEST => Riak::RpbListKeysResp,
67
+ GET_BUCKET_REQUEST => Riak::RpbGetBucketResp,
68
+ SET_BUCKET_REQUEST => nil,
69
+ MAP_REDUCE_REQUEST => Riak::RpbMapRedResp
70
+ }
71
+ end
72
+ end
73
+ end
@@ -0,0 +1,16 @@
1
+ require 'riak'
2
+
3
+ module Riak
4
+ module Util
5
+ module Translation
6
+ def i18n_scope
7
+ :riak
8
+ end
9
+
10
+ def t(message, options={})
11
+ I18n.t("#{i18n_scope}.#{message}", options)
12
+ end
13
+ end
14
+ end
15
+ end
16
+
data/lib/riak.rb ADDED
@@ -0,0 +1,34 @@
1
+ $:.unshift(File.dirname(__FILE__)) unless
2
+ $:.include?(File.dirname(__FILE__)) || $:.include?(File.expand_path(File.dirname(__FILE__)))
3
+
4
+ require 'active_support/json'
5
+ require 'active_support/core_ext'
6
+ require 'active_support/core_ext/hash'
7
+ require 'yaml'
8
+ require 'base64'
9
+ require 'riak/client_pb'
10
+
11
+ module Riak
12
+ VERSION = '0.1.0'
13
+
14
+ # Domain objects
15
+ autoload :I18n, 'riak/i18n'
16
+ autoload :Client, 'riak/client'
17
+ autoload :Key, 'riak/key'
18
+ autoload :RiakContent, 'riak/riak_content'
19
+ autoload :Bucket, 'riak/bucket'
20
+ autoload :MapReduce, 'riak/map_reduce'
21
+
22
+ # Exceptions
23
+ autoload :FailedRequest, "riak/failed_request"
24
+ autoload :FailedExchange, "riak/failed_exchange"
25
+ autoload :SiblingError, "riak/sibling_error"
26
+
27
+ # Mixins
28
+ module Util
29
+ autoload :Translation, 'riak/util/translation'
30
+ autoload :MessageCode, 'riak/util/message_code'
31
+ autoload :Encode, 'riak/util/encode'
32
+ autoload :Decode, 'riak/util/decode'
33
+ end
34
+ end
data/script/console ADDED
@@ -0,0 +1,10 @@
1
+ #!/usr/bin/env ruby
2
+ # File: script/console
3
+ irb = RUBY_PLATFORM =~ /(:?mswin|mingw)/ ? 'irb.bat' : 'irb'
4
+
5
+ libs = " -r irb/completion"
6
+ # Perhaps use a console_lib to store any extra methods I may want available in the cosole
7
+ # libs << " -r #{File.dirname(__FILE__) + '/../lib/console_lib/console_logger.rb'}"
8
+ libs << " -r #{File.dirname(__FILE__) + '/../lib/riak.rb'}"
9
+ puts "Loading riak gem"
10
+ exec "#{irb} #{libs} --simple-prompt"
data/script/destroy ADDED
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env ruby
2
+ APP_ROOT = File.expand_path(File.join(File.dirname(__FILE__), '..'))
3
+
4
+ begin
5
+ require 'rubigen'
6
+ rescue LoadError
7
+ require 'rubygems'
8
+ require 'rubigen'
9
+ end
10
+ require 'rubigen/scripts/destroy'
11
+
12
+ ARGV.shift if ['--help', '-h'].include?(ARGV[0])
13
+ RubiGen::Base.use_component_sources! [:rubygems, :newgem, :newgem_theme, :test_unit]
14
+ RubiGen::Scripts::Destroy.new.run(ARGV)
data/script/generate ADDED
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env ruby
2
+ APP_ROOT = File.expand_path(File.join(File.dirname(__FILE__), '..'))
3
+
4
+ begin
5
+ require 'rubigen'
6
+ rescue LoadError
7
+ require 'rubygems'
8
+ require 'rubigen'
9
+ end
10
+ require 'rubigen/scripts/generate'
11
+
12
+ ARGV.shift if ['--help', '-h'].include?(ARGV[0])
13
+ RubiGen::Base.use_component_sources! [:rubygems, :newgem, :newgem_theme, :test_unit]
14
+ RubiGen::Scripts::Generate.new.run(ARGV)
@@ -0,0 +1,118 @@
1
+ # Copyright 2010 Sean Cribbs, Sonian Inc., and Basho Technologies, Inc.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+ require File.expand_path("../spec_helper", File.dirname(__FILE__))
15
+
16
+ describe Riak::Bucket do
17
+ describe "when directly initializing" do
18
+ before :each do
19
+ @client = Riak::Client.new
20
+ end
21
+
22
+ it "should default with the client and name, and empty n_val or allow_mult" do
23
+ bucket = Riak::Bucket.new(@client, "test")
24
+ bucket.client.should == @client
25
+ bucket.name.should == "test"
26
+ bucket.n_val.should == nil
27
+ bucket.allow_mult.should == nil
28
+ end
29
+
30
+ it "should correctly accept an n_val" do
31
+ bucket = Riak::Bucket.new(@client, "test")
32
+ bucket.n_val = 5
33
+ bucket.n_val.should be_kind_of(Fixnum)
34
+ lambda { bucket.n_val="5" }.should raise_error(ArgumentError)
35
+ end
36
+
37
+ it "should correctly accept an allow_mult" do
38
+ bucket = Riak::Bucket.new(@client, "test")
39
+ bucket.allow_mult = true
40
+ bucket.allow_mult.should be_kind_of(TrueClass)
41
+ bucket.allow_mult = false
42
+ bucket.allow_mult.should be_kind_of(FalseClass)
43
+ lambda { bucket.allow_mult="no" }.should raise_error(ArgumentError)
44
+ end
45
+ end # describe "when directly initializing"
46
+
47
+ describe "when initialized from the Client" do
48
+ before :each do
49
+ @client = Riak::Client.new
50
+ @client.rpc.stub!(:request).and_return(nil)
51
+ end
52
+
53
+ it "should have set the properties" do
54
+ @client.rpc.stub!(:request).with(
55
+ Riak::Util::MessageCode::GET_BUCKET_REQUEST,
56
+ Riak::RpbGetBucketReq.new(:bucket => "goog")
57
+ ).and_return(
58
+ Riak::RpbGetBucketResp.new(
59
+ { :props => {
60
+ :allow_mult => false,
61
+ :n_val => 3
62
+ }
63
+ }
64
+ ))
65
+ bucket = @client["goog"]
66
+ bucket.should be_kind_of(Riak::Bucket)
67
+ bucket.client.should == @client
68
+ bucket.name.should == "goog"
69
+ bucket.n_val.should == 3
70
+ bucket.allow_mult.should == false
71
+ end
72
+ end # describe "when initialized from the Client"
73
+
74
+ describe "key retrieval" do
75
+ before :each do
76
+ @client = Riak::Client.new
77
+ @client.rpc.stub!(:request).with(
78
+ Riak::Util::MessageCode::GET_BUCKET_REQUEST,
79
+ Riak::RpbGetBucketReq.new(:bucket => "goog")
80
+ ).and_return(
81
+ Riak::RpbGetBucketResp.new(
82
+ { :props => {
83
+ :allow_mult => false,
84
+ :n_val => 3
85
+ }
86
+ }
87
+ ))
88
+ @bucket = @client["goog"]
89
+ end
90
+
91
+ it "should list the keys within the bucket" do
92
+ @client.rpc.stub!(:request).with(
93
+ Riak::Util::MessageCode::LIST_KEYS_REQUEST,
94
+ Riak::RpbListKeysReq.new(:bucket => "goog")
95
+ ).and_return(
96
+ Riak::RpbListKeysResp.new(
97
+ { :keys => ["2010-04-12", "2008-01-10", "2006-06-06"],
98
+ :done => true
99
+ }
100
+ ))
101
+ @bucket.keys.should be_kind_of(Protobuf::Field::FieldArray)
102
+ end
103
+
104
+ it "should return a key, when requested" do
105
+ @client.rpc.stub!(:request).with(
106
+ Riak::Util::MessageCode::GET_REQUEST,
107
+ Riak::RpbGetReq.new(:bucket => "goog", :key => "2010-04-12", :r => nil)
108
+ ).and_return(
109
+ Riak::RpbGetResp.new(
110
+ { :content => [],
111
+ :vclock => ""
112
+ }
113
+ ))
114
+ @bucket["2010-04-12"].should be_kind_of(Riak::Key)
115
+ end
116
+ end # describe "key retrieval"
117
+
118
+ end # Riak::Client
@@ -0,0 +1,212 @@
1
+ # Copyright 2010 Sean Cribbs, Sonian Inc., and Basho Technologies, Inc.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+ require File.expand_path("../spec_helper", File.dirname(__FILE__))
15
+
16
+ describe Riak::Client do
17
+ describe "when initializing" do
18
+ it "should default to the local interface on port 8087" do
19
+ client = Riak::Client.new
20
+ client.host.should == "127.0.0.1"
21
+ client.port.should == 8087
22
+ end
23
+
24
+ it "should accept a host" do
25
+ client = Riak::Client.new :host => "riak.basho.com"
26
+ client.host.should == "riak.basho.com"
27
+ end
28
+
29
+ it "should accept a port" do
30
+ client = Riak::Client.new :port => 9000
31
+ client.port.should == 9000
32
+ end
33
+ end
34
+
35
+ describe "reconfiguring" do
36
+ before :each do
37
+ @client = Riak::Client.new
38
+ end
39
+
40
+ describe "setting the host" do
41
+ it "should allow setting the host" do
42
+ @client.should respond_to(:host=)
43
+ @client.host = "riak.basho.com"
44
+ @client.host.should == "riak.basho.com"
45
+ end
46
+
47
+ it "should require the host to be an IP or hostname" do
48
+ [238472384972, "", "riak.basho-.com"].each do |invalid|
49
+ lambda { @client.host = invalid }.should raise_error(ArgumentError)
50
+ end
51
+ ["127.0.0.1", "10.0.100.5", "localhost", "otherhost.local", "riak.basho.com"].each do |valid|
52
+ lambda { @client.host = valid }.should_not raise_error
53
+ end
54
+ end
55
+ end # describe "setting the host"
56
+
57
+ describe "setting the port" do
58
+ it "should allow setting the port" do
59
+ @client.should respond_to(:port=)
60
+ @client.port = 9000
61
+ @client.port.should == 9000
62
+ end
63
+
64
+ it "should require the port to be a valid number" do
65
+ [-1,65536,"foo"].each do |invalid|
66
+ lambda { @client.port = invalid }.should raise_error(ArgumentError)
67
+ end
68
+ [0,1,65535,8098].each do |valid|
69
+ lambda { @client.port = valid }.should_not raise_error
70
+ end
71
+ end
72
+ end # describe "setting the port"
73
+
74
+ describe "setting the client id" do
75
+ it "should accept a string unmodified" do
76
+ @client.client_id = "foo"
77
+ @client.client_id.should == "foo"
78
+ end
79
+
80
+ it "should base64-encode an integer" do
81
+ @client.client_id = 1
82
+ @client.client_id.should == "AAAAAQ=="
83
+ end
84
+
85
+ it "should reject an integer equal to the maximum client id" do
86
+ lambda { @client.client_id = Riak::Client::MAX_CLIENT_ID }.should raise_error(ArgumentError)
87
+ end
88
+
89
+ it "should reject an integer larger than the maximum client id" do
90
+ lambda { @client.client_id = Riak::Client::MAX_CLIENT_ID + 1 }.should raise_error(ArgumentError)
91
+ end
92
+ end # describe "setting the client id"
93
+ end # describe "reconfiguring"
94
+
95
+ describe "sending and receiving protocol buffers" do
96
+ before :each do
97
+ @client = Riak::Client.new
98
+ @client.rpc.stub!(:status).and_return(true)
99
+ @client.rpc.stub!(:request).and_return(nil)
100
+ end
101
+
102
+ describe "basic communication with riak node" do
103
+ it "should send a ping request and return true" do
104
+ @client.rpc.stub!(:request).with(
105
+ Riak::Util::MessageCode::PING_REQUEST
106
+ ).and_return('')
107
+
108
+ @client.ping?.should == true
109
+ end
110
+
111
+ it "should request the connected riak node's server info and return a Hash" do
112
+ # test length or content? Need to look at what are considered acceptable values
113
+ @client.rpc.stub!(:request).with(
114
+ Riak::Util::MessageCode::GET_SERVER_INFO_REQUEST
115
+ ).and_return(Riak::RpbGetServerInfoResp.new(
116
+ { :node => "riak@127.0.0.1",
117
+ :server_version => "0.10.1"
118
+ }
119
+ ))
120
+
121
+ @client.info[:node].should be_kind_of(String)
122
+ @client.info[:server_version].should be_kind_of(String)
123
+ end
124
+ end # describe "basic communication with riak node"
125
+
126
+ describe "bucket operations: retrieval (get) and send (set)" do
127
+
128
+ describe "bucket retrieval (get)" do
129
+ it "should send a request to list available bucket names and return a Protobuf::Field::FieldArray" do
130
+ @client.rpc.stub!(:request).with(
131
+ Riak::Util::MessageCode::LIST_BUCKETS_REQUEST
132
+ ).and_return(
133
+ Riak::RpbListBucketsResp.new(
134
+ { :buckets => ["goog"] }
135
+ ))
136
+
137
+ @client.buckets.should be_kind_of(Protobuf::Field::FieldArray)
138
+ end
139
+
140
+ it "should send a request with the bucket name and return a Riak::Bucket" do
141
+ @client.rpc.stub!(:request).with(
142
+ Riak::Util::MessageCode::GET_BUCKET_REQUEST,
143
+ Riak::RpbGetBucketReq.new(:bucket => "goog")
144
+ ).and_return(
145
+ Riak::RpbGetBucketResp.new(
146
+ { :props => {
147
+ :allow_mult => false,
148
+ :n_val => 3
149
+ }
150
+ }
151
+ ))
152
+
153
+ @client.bucket("goog").should be_kind_of(Riak::Bucket)
154
+ end
155
+
156
+ it "should send a request to list keys within a bucket and return a Protobuf::Field::FieldArray" do
157
+ @client.rpc.stub!(:request).with(
158
+ Riak::Util::MessageCode::LIST_KEYS_REQUEST,
159
+ Riak::RpbListKeysReq.new(:bucket => "goog")
160
+ ).and_return(
161
+ Riak::RpbListKeysResp.new(
162
+ { :keys => ["2010-04-12", "2008-01-10", "2006-06-06"],
163
+ :done => true
164
+ }
165
+ ))
166
+ @client.keys_in("goog").should be_kind_of(Protobuf::Field::FieldArray)
167
+ end
168
+ end # describe "bucket retrieval (get)"
169
+
170
+ describe "bucket sending (set)" do
171
+ end # describe "bucket sending (set)"
172
+ end # describe "bucket operations and retrieval"
173
+
174
+ describe "key operations: retrieval (get), send (put) and delete (del)" do
175
+ before :each do
176
+ @client.rpc.stub!(:request).with(
177
+ Riak::Util::MessageCode::GET_REQUEST,
178
+ Riak::RpbGetReq.new(:bucket => "goog", :key => "2010-04-12", :r => nil)
179
+ ).and_return(
180
+ Riak::RpbGetResp.new(
181
+ { :content => [],
182
+ :vclock => ""
183
+ }
184
+ ))
185
+ end
186
+
187
+ it "should send a request for a bucket/key pair and return a Riak::RpbGetResp" do
188
+ @client.get_request("goog", "2010-04-12").should be_kind_of(Riak::RpbGetResp)
189
+ end
190
+
191
+ it "should have a vclock attribute within Riak::RpbGetResp of that is a String" do
192
+ @client.get_request("goog", "2010-04-12").vclock.should be_kind_of(String)
193
+ end
194
+ end # describe "key operations and retrieval"
195
+
196
+ describe "key operations and retrieval" do
197
+ before :each do
198
+ @client.rpc.stub!(:request).with(
199
+ Riak::Util::MessageCode::GET_REQUEST,
200
+ Riak::RpbGetReq.new(:bucket => "goog", :key => "2010-04-12", :r => nil)
201
+ ).and_return(
202
+ Riak::RpbGetResp.new(
203
+ { :content => [],
204
+ :vclock => ""
205
+ }
206
+ ))
207
+ end
208
+
209
+
210
+ end # describe "key operations and retrieval"
211
+ end # describe "basic communication with riak node"
212
+ end # Riak::Client
@@ -0,0 +1,54 @@
1
+ require File.expand_path("../spec_helper", File.dirname(__FILE__))
2
+
3
+ describe Riak::Key do
4
+ describe "when directly initializing" do
5
+ before :each do
6
+ @client = Riak::Client.new
7
+ @client.rpc.stub!(:request).with(
8
+ Riak::Util::MessageCode::GET_BUCKET_REQUEST,
9
+ Riak::RpbGetBucketReq.new(:bucket => "goog")
10
+ ).and_return(
11
+ Riak::RpbGetBucketResp.new(
12
+ { :props => {
13
+ :allow_mult => false,
14
+ :n_val => 3
15
+ }
16
+ }
17
+ ))
18
+ @bucket = @client["goog"]
19
+ end
20
+
21
+ it "should default with the bucket and name, and an empty vclock" do
22
+ key = Riak::Key.new(@bucket, "test")
23
+ key.bucket.should == @bucket
24
+ key.name.should == "test"
25
+ key.vclock.should == nil
26
+ key.content.should be_kind_of(Riak::RiakContent)
27
+ end
28
+
29
+ it "should serialize into a Key Protocol Buffer (RpbPutReq)" do
30
+ @client.rpc.stub!(:request).with(
31
+ Riak::Util::MessageCode::GET_REQUEST,
32
+ Riak::RpbGetReq.new(:bucket => "goog", :key => "2010-04-12", :r => nil)
33
+ ).and_return(
34
+ Riak::RpbGetResp.new(
35
+ { :content => [Riak::RpbContent.new(:value => "Test")],
36
+ :vclock => "k\xCEa```\xCC`\xCA\x05R,\xACL\xF7^e0%2\xE6\xB12\xC4s\xE6\x1D\xE5\xCB\x02\x00"
37
+ }
38
+ ))
39
+ key = @bucket["2010-04-12"] # Riak::Key.new(@bucket, "test")
40
+ pb_put = key.to_pb_put
41
+ pb_put.should be_kind_of(Riak::RpbPutReq)
42
+ pb_put.vclock.should == "k\xCEa```\xCC`\xCA\x05R,\xACL\xF7^e0%2\xE6\xB12\xC4s\xE6\x1D\xE5\xCB\x02\x00"
43
+ end
44
+
45
+ it "should serialize into a Link Protocol Buffer (RpbLink)" do
46
+ key = Riak::Key.new(@bucket, "test")
47
+ pb_link = key.to_pb_link
48
+ pb_link.should be_kind_of(Riak::RpbLink)
49
+ pb_link.bucket.should == "goog"
50
+ pb_link.key.should == "test"
51
+ end
52
+ end # describe "when directly initializing"
53
+ end # Riak::Key
54
+
@@ -0,0 +1,4 @@
1
+ require File.expand_path("../spec_helper", File.dirname(__FILE__))
2
+
3
+ describe Riak::MapReduce do
4
+ end
@@ -0,0 +1,88 @@
1
+ # Copyright 2010 Sean Cribbs, Sonian Inc., and Basho Technologies, Inc.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+ require File.expand_path("../spec_helper", File.dirname(__FILE__))
15
+
16
+ describe Riak::RiakContent do
17
+ describe "when directly initializing" do
18
+ before :each do
19
+ @client = Riak::Client.new
20
+ @client.rpc.stub!(:request).with(
21
+ Riak::Util::MessageCode::GET_BUCKET_REQUEST,
22
+ Riak::RpbGetBucketReq.new(:bucket => "goog")
23
+ ).and_return(
24
+ Riak::RpbGetBucketResp.new(
25
+ { :props => {
26
+ :allow_mult => false,
27
+ :n_val => 3
28
+ }
29
+ }
30
+ ))
31
+ @bucket = @client["goog"]
32
+ @key = Riak::Key.new(@bucket, "test")
33
+ end
34
+
35
+ it "should default with nil attributes and links/usermeta as instances of Set/Hash" do
36
+ rcontent = Riak::RiakContent.new(@key)
37
+ rcontent.key.should == @key
38
+ rcontent.value.should == nil
39
+ rcontent.content_type.should == nil
40
+ rcontent.charset.should == nil
41
+ rcontent.content_encoding.should == nil
42
+ rcontent.vtag.should == nil
43
+ rcontent.links.should be_kind_of(Hash)
44
+ rcontent.last_mod.should == nil
45
+ rcontent.last_mod_usecs.should == nil
46
+ rcontent.usermeta.should be_kind_of(Hash)
47
+ end
48
+
49
+ it "should allow you to set the Key, after initialization" do
50
+ rcontent = Riak::RiakContent.new(@key)
51
+ rcontent.key = @key
52
+ rcontent.key.should == @key
53
+ end
54
+
55
+ it "should accept a Key as an argument to new, tying it back to an owner" do
56
+ rcontent = Riak::RiakContent.new(@key)
57
+ rcontent.key.should == @key
58
+ end
59
+
60
+ it "should serialize into a corresponding Protocol Buffer (RpbContent)" do
61
+ rcontent = Riak::RiakContent.new(@key, :value => "Test")
62
+ rcontent.to_pb.should be_kind_of(Riak::RpbContent)
63
+ end
64
+
65
+ it "should load a Riak::RpbContent instance, returning a matching self, RiakContent" do
66
+ rcontent = Riak::RiakContent.new(@key)
67
+ rpb_content = Riak::RpbContent.new
68
+ rpb_content.value = "{\"Date\":\"2010-04-12\",\"Open\":567.35,\"High\":574.00,\"Low\":566.22,\"Close\":572.73,\"Volume\":2352400,\"Adj. Close\":572.73}"
69
+ rpb_content.content_type = "application/json"
70
+ rpb_content.vtag = "4DNB6Vt0zLl5VJ6P2xx9dc"
71
+ rpb_content.last_mod = 1274645855
72
+ rpb_content.last_mod_usecs = 968694
73
+
74
+ rcontent.load(rpb_content)
75
+ rcontent.key.should == @key
76
+ rcontent.value.should == {"Date" => "2010-04-12".to_date,"Open" => 567.35,"High" => 574.00,"Low" => 566.22,"Close" => 572.73,"Volume" => 2352400,"Adj. Close" => 572.73}
77
+ rcontent.content_type.should == "application/json"
78
+ rcontent.charset.should == nil
79
+ rcontent.content_encoding.should == nil
80
+ rcontent.vtag.should == "4DNB6Vt0zLl5VJ6P2xx9dc"
81
+ rcontent.links.should be_kind_of(Hash)
82
+ rcontent.last_mod.should == 1274645855
83
+ rcontent.last_mod_usecs.should == 968694
84
+ rcontent.usermeta.should be_kind_of(Hash)
85
+ end
86
+
87
+ end # describe "when directly initializing"
88
+ end # Riak::RiakContent
@@ -0,0 +1,17 @@
1
+ # Copyright 2010 Sean Cribbs, Sonian Inc., and Basho Technologies, Inc.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+ require File.expand_path("../spec_helper", File.dirname(__FILE__))
15
+
16
+ describe Riak::Client::Rpc do
17
+ end # Riak::Client::Rpc