riakrest 0.0.3 → 0.0.4

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/History.txt CHANGED
@@ -1,27 +1,34 @@
1
+ === 0.0.4 2009-11-10
2
+ * Mods
3
+ * Fixed bug when running ruby 1.8
4
+ * Changed client_store option for returning object to :return => :object
5
+ * Added check to eql? and == that both objects are either local or not.
6
+ * Refactored local? method to jiak_object.
7
+
1
8
  === 0.0.3 2009-11-03
2
9
 
3
10
  * Mods:
4
- - Switched to jeweler for managing gem
5
- - Allow passing an array for specifying schema fields/masks
6
- - Added convenience accessors to rsrc.jiak
7
- - Allow setting proxy on core client
11
+ * Switched to jeweler for managing gem
12
+ * Allow passing an array for specifying schema fields/masks
13
+ * Added convenience accessors to rsrc.jiak
14
+ * Allow setting proxy on core client
8
15
 
9
16
  Clean-up:
10
- - More examples futzing.
17
+ * More examples futzing.
11
18
 
12
19
  === 0.0.2 2009-10-30
13
20
 
14
21
  * Mods:
15
- - Fixed corner case for auto_post false / auto_update true.
16
- - Explicitly reserve jiak field in user data classes.
17
- - Changed walk to query. Kept walk as an alias.
22
+ * Fixed corner case for auto_post false / auto_update true.
23
+ * Explicitly reserve jiak field in user data classes.
24
+ * Changed walk to query. Kept walk as an alias.
18
25
 
19
26
  * Clean-up:
20
- - DRY'd some code
21
- - Examples
27
+ * DRY'd some code
28
+ * Examples
22
29
 
23
30
 
24
31
  === 0.0.1 2009-10-20
25
32
 
26
33
  * Initial release:
27
- - To github, anyway. git log shows the prior activity.
34
+ * To github, anyway. git log shows the prior activity.
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.0.3
1
+ 0.0.4
@@ -10,11 +10,11 @@ client.set_schema(bucket)
10
10
  remy = client.store(JiakObject.new(:bucket => bucket,
11
11
  :data => Person.new(:name => "remy",
12
12
  :age => 10)),
13
- :object => true)
13
+ :return => :object)
14
14
  callie = client.store(JiakObject.new(:bucket => bucket,
15
15
  :data => Person.new(:name => "Callie",
16
16
  :age => 12)),
17
- :object => true)
17
+ :return => :object)
18
18
 
19
19
  puts client.get(bucket,remy.key).data.name # => "remy"
20
20
 
@@ -13,14 +13,14 @@ class Person
13
13
  auto_update true
14
14
  end
15
15
 
16
- remy = Person.new(:name => 'remy',:age => 10) # (auto-post)
17
- puts remy.name # => "remy" (auto-update)
16
+ remy = Person.new(:name => 'Remy',:age => 10) # (auto-post)
17
+ puts remy.name # => "Remy"
18
18
 
19
- puts Person.get('remy').name # => "remy" (from Jiak server)
20
- puts Person.get('remy').age # => 10 (from Jiak server)
19
+ puts Person.get('Remy').name # => "Remy" (from Jiak server)
20
+ puts Person.get('Remy').age # => 10 (from Jiak server)
21
21
 
22
22
  remy.age = 11 # (auto-update)
23
- puts Person.get('remy').age # => 11 (from Jiak server)
23
+ puts Person.get('Remy').age # => 11 (from Jiak server)
24
24
 
25
25
  callie = Person.new(:name => 'Callie', :age => 13)
26
26
  remy.link(callie,'sister')
@@ -0,0 +1,36 @@
1
+ require 'riakrest'
2
+ include RiakRest
3
+
4
+ DogData = JiakDataHash.create(:name,:age,:breeds)
5
+
6
+ # client = JiakClient.new("http://localhost:8002/jiak",:proxy=>"http://localhost:8888")
7
+ client = JiakClient.new("http://localhost:8002/jiak")
8
+ bucket = JiakBucket.new("dogs", DogData)
9
+ chili = JiakObject.new(:bucket => bucket,
10
+ :key => 'chili',
11
+ :data => DogData.new(:name => "Chili",
12
+ :age => 6,
13
+ :breeds => ["heeler","akita"]))
14
+ client.set_schema(bucket)
15
+ client.store(chili)
16
+ chili = client.get(bucket,'chili')
17
+
18
+ DogData.readable(:name,:breeds)
19
+ DogData.writable(:name,:age)
20
+ client.set_schema(bucket)
21
+ chili = client.get(bucket,'chili')
22
+ diego = JiakObject.new(:bucket => bucket,
23
+ :key => "diego",
24
+ :data => DogData.new(:name => "Diego",
25
+ :age => 7))
26
+ client.store(diego)
27
+
28
+ addie = JiakObject.new(:bucket => bucket,
29
+ :key => "addie",
30
+ :data => DogData.new(:name => "Adelaide",
31
+ :age => 14,
32
+ :breeds => ["heeler"]))
33
+ client.store(addie)
34
+
35
+
36
+ addie = client.get(bucket,'addie')
@@ -0,0 +1,51 @@
1
+ require 'riakrest'
2
+ include RiakRest
3
+
4
+ DogData = JiakDataHash.create(:name,:age,:breeds)
5
+ # client = JiakClient.new("http://localhost:8002/jiak",:proxy=>"http://localhost:8888")
6
+ client = JiakClient.new("http://localhost:8002/jiak")
7
+ bucket = JiakBucket.new("dogs", DogData)
8
+
9
+ chili = JiakObject.new(:bucket => bucket,
10
+ :key => 'chili',
11
+ :data => DogData.new(:name => "Chili",
12
+ :age => 6,
13
+ :breeds => ["heeler","akita"]))
14
+ client.store(chili)
15
+
16
+ diego = JiakObject.new(:bucket => bucket,
17
+ :data => DogData.new(:name => "Diego",
18
+ :age => 7,
19
+ :breeds => ["pure mutt"]))
20
+ key = client.store(diego)
21
+
22
+ chili = client.get(bucket,'chili')
23
+ diego = client.get(bucket,key)
24
+
25
+ addie = JiakObject.new(:bucket => bucket,
26
+ :key => 'addie',
27
+ :data => DogData.new(:name => "Adelaide",
28
+ :age => 14,
29
+ :breeds => ["heeler"]))
30
+ client.store(addie) # Store addie
31
+ addie.data.age = 15 # Whoops, fix her age
32
+ client.store(addie) # Store that update
33
+ db_addie = client.get(bucket,'addie') # Get what we stored
34
+ puts db_addie.data.age # => 14 !?? Not 15??
35
+
36
+ strass = JiakObject.new(:bucket => bucket,
37
+ :key => 'strass',
38
+ :data => DogData.new(:name => "Cauchy Euler Weierstrass",
39
+ :age => 5,
40
+ :breeds => ["schnauzer","mutt"]))
41
+ strass = client.store(strass,:return => :object)
42
+ strass.data.age = 6
43
+ client.store(strass)
44
+ db_strass = client.get(bucket,'strass')
45
+ puts db_strass.data.age # => 6 Yeah!
46
+
47
+
48
+
49
+ # Clean-up
50
+ client.keys(bucket).each {|key| client.delete(bucket,key)}
51
+
@@ -30,6 +30,7 @@ module RiakRest
30
30
  # Raise JiakClientException if server or proxy (if exists) URI are not strings.
31
31
  #
32
32
  def initialize(uri='http://127.0.0.1:8002/jiak/', opts={})
33
+ check_opts(opts,[:proxy],JiakClientException)
33
34
  server(uri)
34
35
  proxy(opts[:proxy]) if(opts[:proxy])
35
36
  end
@@ -78,7 +79,6 @@ module RiakRest
78
79
  resp = RestClient.put(jiak_uri(bucket),
79
80
  bucket.schema.to_jiak,
80
81
  :content_type => APP_JSON,
81
- :data_type => JSON_DATA,
82
82
  :accept => APP_JSON)
83
83
  end
84
84
 
@@ -113,7 +113,7 @@ module RiakRest
113
113
  # stored JiakObject depending on the option <code>key</code>. The object
114
114
  # for storage must be JiakObject. Valid options are:
115
115
  #
116
- # <code>:object</code> :: If <code>true</code>, on success return the stored JiakObject (which includes Jiak metadata); otherwise return just the key. Default is <code>false</code>, which returns the key.
116
+ # <code>:return</code> :: If <code>:key</code>, return the key under which the data was stored. If <code>:object</code> return the stored JiakObject (which includes Riak context). Defaults to <code>:key</code>.
117
117
  # <code>:writes</code> :: The number of Riak nodes that must successfully store the data.
118
118
  # <code>:durable_writes</code> :: The number of Riak nodes (<code>< writes</code>) that must successfully store the data in a durable manner.
119
119
  # <code>:reads</code> :: The number of Riak nodes that must successfully read data if a JiakObject is being returned.
@@ -128,20 +128,21 @@ module RiakRest
128
128
  # Raise JiakResourceException on RESTful HTTP errors.
129
129
  #
130
130
  def store(jobj,opts={})
131
+ check_opts(opts,[:return,:reads,:writes,:durable_writes],
132
+ JiakClientException)
131
133
  params = jobj.bucket.params
132
134
  req_params = {
133
135
  WRITES => opts[:writes] || params[:writes],
134
136
  DURABLE_WRITES => opts[:durable_writes] || params[:durable_writes],
135
137
  READS => opts[:reads] || params[:reads]
136
138
  }
137
- req_params[RETURN_BODY] = opts[:object] if opts[:object]
139
+ req_params[RETURN_BODY] = (opts[:return] == :object)
138
140
 
139
141
  begin
140
142
  uri = jiak_uri(jobj.bucket,jobj.key,req_params)
141
143
  payload = jobj.to_jiak
142
144
  headers = {
143
145
  :content_type => APP_JSON,
144
- :data_type => JSON_DATA,
145
146
  :accept => APP_JSON }
146
147
  # Decision tree:
147
148
  # If key empty POST
@@ -201,6 +202,7 @@ module RiakRest
201
202
  unless bucket.is_a?(JiakBucket)
202
203
  raise JiakClientException, "Bucket must be a JiakBucket."
203
204
  end
205
+ check_opts(opts,[:reads],JiakClientException)
204
206
  req_params = {READS => opts[:reads] || bucket.params[:reads]}
205
207
 
206
208
  begin
@@ -229,6 +231,7 @@ module RiakRest
229
231
  # Raise JiakResourceException on RESTful HTTP errors.
230
232
  #
231
233
  def delete(bucket,key,opts={})
234
+ check_opts(opts,[:waits],JiakClientException)
232
235
  begin
233
236
  req_params = {RESPONSE_WAITS => opts[:waits] || bucket.params[:waits]}
234
237
  uri = jiak_uri(bucket,key,req_params)
@@ -27,7 +27,7 @@ module RiakRest
27
27
  # altered and are purposely not described here.
28
28
  def initialize(opts)
29
29
  opts[:links] ||= []
30
- check_opts(opts)
30
+ check_opts(opts,VALID_OPTS,JiakObjectException)
31
31
 
32
32
  @bucket = check_bucket(opts[:bucket])
33
33
  @data = check_data(opts[:data])
@@ -36,7 +36,7 @@ module RiakRest
36
36
 
37
37
  # The Riak context for the object if provided.
38
38
  if opts[:vclock]
39
- @riak = opts.select {|k,v| [:vclock,:vtag,:lastmod].include?(k)}
39
+ @riak = {}.merge(opts)
40
40
  end
41
41
  end
42
42
 
@@ -127,9 +127,20 @@ module RiakRest
127
127
  # :call-seq:
128
128
  # jiak_object.riak = riak
129
129
  #
130
- # Set the Riak context for a JiakObject.
130
+ # Set the Riak context for a JiakObject. This is a public method due to
131
+ # implementation needs, but in general should not be called by library
132
+ # clients.
131
133
  def riak=(riak)
132
- @riak = check_riak(riak)
134
+ @riak = riak.nil? ? nil : check_opts(riak,VALID_RIAK,JiakObjectException)
135
+ end
136
+
137
+ # :call-seq:
138
+ # local? -> true or false
139
+ #
140
+ # <code>true</code> if a JiakObject is local only, i.e., has not been
141
+ # stored via the Jiak server.
142
+ def local?
143
+ @riak.nil?
133
144
  end
134
145
 
135
146
  # :call-seq:
@@ -141,7 +152,8 @@ module RiakRest
141
152
  (@bucket == other.bucket &&
142
153
  @key == other.key &&
143
154
  @data == other.data &&
144
- @links == other.links
155
+ @links == other.links &&
156
+ @riak.nil? == other.riak.nil?
145
157
  ) rescue false
146
158
  end
147
159
 
@@ -155,22 +167,14 @@ module RiakRest
155
167
  @bucket.eql?(other.bucket) &&
156
168
  @key.eql?(other.key) &&
157
169
  @data.eql?(other.data) &&
158
- @links.eql?(other.links)
170
+ @links.eql?(other.links) &&
171
+ @riak.nil?.eql?(other.riak.nil?)
159
172
  end
160
173
 
161
174
  def hash # :nodoc:
162
175
  @bucket.name.hash + @key.hash + @data.hash + @links.hash + @riak.hash
163
176
  end
164
177
 
165
- def check_opts(opts)
166
- err = opts.select {|k,v| !VALID_OPTS.include?(k)}
167
- unless err.empty?
168
- raise JiakObjectException, "unrecognized options: #{err.keys}"
169
- end
170
- opts
171
- end
172
- private :check_opts
173
-
174
178
  def check_bucket(bucket)
175
179
  unless bucket.is_a?(JiakBucket)
176
180
  raise JiakObjectException, "Bucket must be a JiakBucket."
@@ -217,14 +221,6 @@ module RiakRest
217
221
  end
218
222
  private :check_link
219
223
 
220
- def check_riak(riak)
221
- err = riak.select {|k,v| !VALID_RIAK.include?(k)}
222
- unless err.empty?
223
- raise JiakObjectException, "unrecognized options: #{err.keys}"
224
- end
225
- riak
226
- end
227
-
228
224
  private
229
225
  VALID_RIAK = [:vclock,:vtag,:lastmod]
230
226
  VALID_OPTS = [:bucket,:key,:data,:links] + VALID_RIAK
@@ -274,7 +274,7 @@ module RiakRest
274
274
  # JiakResource class, then to the value set on the Riak cluster. In
275
275
  # general the values set on the Riak cluster should suffice.
276
276
  def put(resource,opts={})
277
- opts[:object] = true
277
+ opts[:return] = :object
278
278
  resource.jiak.object = jiak.server.store(resource.jiak.object,opts)
279
279
  resource.convenient_jiak
280
280
  resource
@@ -633,7 +633,7 @@ module RiakRest
633
633
  # post/put to the Jiak server. This test is used in the guards for class
634
634
  # and instance level post/update methods.
635
635
  def local?
636
- jiak.object.riak.nil?
636
+ jiak.object.local?
637
637
  end
638
638
 
639
639
  # :call-seq:
data/lib/riakrest.rb CHANGED
@@ -136,6 +136,17 @@ $:.unshift(dirname) unless
136
136
  module RiakRest
137
137
  version_file = File.join(File.dirname(__FILE__),"..","VERSION")
138
138
  VERSION = IO.read(version_file).chomp
139
+
140
+ # Convenience method for checking validity of method options. If any of the
141
+ # options in opt are not in valid, raise the exception with the invalid
142
+ # options in the message.
143
+ def check_opts(opts,valid,exception)
144
+ err = opts.select {|k,v| !valid.include?(k)}
145
+ unless err.empty?
146
+ raise exception, "unrecognized options: #{err.keys}"
147
+ end
148
+ opts
149
+ end
139
150
  end
140
151
 
141
152
  require 'riakrest/core/exceptions'
@@ -152,17 +152,21 @@ describe "JiakClient processing" do
152
152
  it "should return a JiakObject at time of storage" do
153
153
  key = 'store_key_2'
154
154
  jobj = JiakObject.new(:bucket => @bucket, :key => key, :data => @data)
155
- resp = @client.store(jobj,{:object => true})
155
+ resp = @client.store(jobj,{:return => :object})
156
156
  resp.should be_a JiakObject
157
157
  resp.bucket.should eql @bucket
158
158
  resp.key.should eql key
159
159
  resp.data.should be_a FooBarBaz
160
160
 
161
161
  jobj = JiakObject.new(:bucket => @bucket, :data => @data)
162
- resp = @client.store(jobj,{:object => true})
162
+ jobj.local?.should be true
163
+ resp = @client.store(jobj,{:return => :object})
163
164
  resp.should be_a JiakObject
164
165
  resp.key.should_not be_nil
165
166
  resp.data.should be_a FooBarBaz
167
+
168
+ jobj.local?.should be true
169
+ resp.local?.should be false
166
170
  end
167
171
 
168
172
  it "should handle odd key values" do
@@ -201,7 +205,7 @@ describe "JiakClient processing" do
201
205
  it "should update a previously stored JiakObject" do
202
206
  jobj =
203
207
  @client.store(JiakObject.new(:bucket => @bucket, :data => @data),
204
- {:object => true})
208
+ {:return => :object})
205
209
 
206
210
  jobj.data.should eql @data
207
211
  [:vclock,:vtag,:lastmod].each do |field|
@@ -213,7 +217,7 @@ describe "JiakClient processing" do
213
217
  updated_data = FooBarBaz.new(:foo => 'new val')
214
218
  jobj.data = updated_data
215
219
  updated_object =
216
- @client.store(jobj,{:object => true})
220
+ @client.store(jobj,{:return => :object})
217
221
  updated_data = updated_object.data
218
222
  updated_data.should_not eql @data
219
223
  updated_data.foo.should eql 'new val'
@@ -276,7 +280,7 @@ describe "JiakClient links" do
276
280
  p_obj = JiakObject.new(:bucket => @p_bucket,
277
281
  :key => p_name,
278
282
  :data => p_data)
279
- parent = @client.store(p_obj,:object => true)
283
+ parent = @client.store(p_obj,:return => :object)
280
284
  p_link = JiakLink.new(@p_bucket,parent.key,'parent')
281
285
  c_names.each do |c_name|
282
286
  begin
@@ -286,7 +290,7 @@ describe "JiakClient links" do
286
290
  c_obj = JiakObject.new(:bucket => @c_bucket,
287
291
  :key => c_name,
288
292
  :data => c_data)
289
- child = @client.store(c_obj, :object => true)
293
+ child = @client.store(c_obj, :return => :object)
290
294
  end
291
295
  c_link = JiakLink.new(@c_bucket,child.key,'child')
292
296
  child << p_link
@@ -37,6 +37,7 @@ describe "JiakObject" do
37
37
  @object.should respond_to(:data,:data=)
38
38
  @object.should respond_to(:links,:links=)
39
39
  @object.should respond_to(:riak,:riak=)
40
+ @object.should respond_to(:local?)
40
41
  @object.should respond_to(:<<)
41
42
  @object.should respond_to(:==,:eql?)
42
43
  @object.should respond_to(:to_jiak)
@@ -53,6 +54,7 @@ describe "JiakObject" do
53
54
  jobj = JiakObject.new(:bucket => @bucket, :key => @key, :data => @data)
54
55
  jobj.bucket.should eql @bucket
55
56
  jobj.links.should be_empty
57
+ jobj.local?.should be true
56
58
  end
57
59
 
58
60
  it "should allow nil, missing, blank or empty key" do
@@ -159,6 +161,9 @@ describe "JiakObject" do
159
161
  @object.riak = riak
160
162
  @object.riak.should eql riak
161
163
 
164
+ @object.riak = nil
165
+ @object.riak.should be nil
166
+
162
167
  bad_bucket = lambda {@object.bucket = 'bucket'}
163
168
  bad_bucket.should raise_error(JiakObjectException,/Bucket/)
164
169
 
@@ -4,11 +4,11 @@ describe "JiakResource default" do
4
4
  F1F2 = JiakDataHash.create(:f1,:f2)
5
5
  class Rsrc # :nodoc:
6
6
  include JiakResource
7
- server 'http://localhost:8002/jiak/'
8
- group 'group'
9
- data_class F1F2
7
+ server 'http://localhost:8002/jiak/'
8
+ group 'group'
9
+ data_class F1F2
10
+ point_of_view
10
11
  end
11
- Rsrc.pov
12
12
 
13
13
  before do
14
14
  @server = 'http://localhost:8002/jiak/'
@@ -111,11 +111,11 @@ describe "JiakResource default class-level auto-post/auto-update" do
111
111
  PersonData.keygen :name
112
112
  class Person # :nodoc:
113
113
  include JiakResource
114
- server 'http://localhost:8002/jiak'
115
- group 'people'
116
- data_class PersonData
114
+ server 'http://localhost:8002/jiak'
115
+ group 'people'
116
+ data_class PersonData
117
+ point_of_view
117
118
  end
118
- Person.pov
119
119
 
120
120
  before do
121
121
  @name = 'p default'
@@ -162,11 +162,11 @@ describe "JiakResource class auto-post" do
162
162
  PersonData.keygen :name
163
163
  class Person # :nodoc:
164
164
  include JiakResource
165
- server 'http://localhost:8002/jiak'
166
- group 'people'
167
- data_class PersonData
165
+ server 'http://localhost:8002/jiak'
166
+ group 'people'
167
+ data_class PersonData
168
+ point_of_view
168
169
  end
169
- Person.pov
170
170
 
171
171
  before do
172
172
  @name = 'p auto-post'
@@ -242,13 +242,13 @@ describe "JiakResource class auto-update" do
242
242
  DogData.keygen :name
243
243
  class Dog # :nodoc:
244
244
  include JiakResource
245
- server 'http://localhost:8002/jiak'
246
- group 'dogs'
247
- data_class DogData
248
- auto_post true
249
- auto_update true
245
+ server 'http://localhost:8002/jiak'
246
+ group 'dogs'
247
+ data_class DogData
248
+ point_of_view
249
+ auto_post true
250
+ auto_update true
250
251
  end
251
- Dog.pov
252
252
 
253
253
  before do
254
254
  @pname = 'p auto-update'
@@ -339,13 +339,13 @@ describe "JiakResource simple" do
339
339
  DogData.keygen :name
340
340
  class Dog # :nodoc:
341
341
  include JiakResource
342
- server 'http://localhost:8002/jiak'
343
- group 'dogs'
344
- data_class DogData
345
- auto_post true
346
- auto_update true
342
+ server 'http://localhost:8002/jiak'
343
+ group 'dogs'
344
+ data_class DogData
345
+ point_of_view
346
+ auto_post true
347
+ auto_update true
347
348
  end
348
- Dog.pov
349
349
 
350
350
  before do
351
351
  @pname = 'p'
@@ -404,11 +404,11 @@ describe "JiakResource complex" do
404
404
  class Parent # :nodoc:
405
405
  include JiakResource
406
406
 
407
- server 'http://localhost:8002/jiak'
408
- group 'parents'
409
- data_class PersonData
407
+ server 'http://localhost:8002/jiak'
408
+ group 'parents'
409
+ data_class PersonData
410
+ point_of_view
410
411
  end
411
- Parent.pov
412
412
 
413
413
  Child = Parent.copy(:group => 'children')
414
414
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: riakrest
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.3
4
+ version: 0.0.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Paul Rogers
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2009-11-03 00:00:00 -08:00
12
+ date: 2009-11-10 00:00:00 -08:00
13
13
  default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
@@ -133,7 +133,9 @@ test_files:
133
133
  - examples/auto_update_links.rb
134
134
  - examples/basic_client.rb
135
135
  - examples/basic_resource.rb
136
+ - examples/bucket_schemas.rb
136
137
  - examples/linked_resources.rb
137
138
  - examples/links_only_pov.rb
138
139
  - examples/multiple_pov.rb
140
+ - examples/rest_interaction.rb
139
141
  - examples/ruby_json_data.rb