riakrest 0.1.5 → 0.1.6
Sign up to get free protection for your applications and to get access to all the features.
- data/History.txt +4 -0
- data/VERSION +1 -1
- data/examples/jiak_client.data.rb +62 -0
- data/examples/jiak_resource_data.rb +29 -0
- data/lib/riakrest/core/jiak_client.rb +41 -24
- data/lib/riakrest/core/jiak_data.rb +30 -51
- data/lib/riakrest/resource/jiak_resource.rb +15 -1
- data/spec/core/jiak_client_spec.rb +66 -17
- data/spec/resource/jiak_resource_spec.rb +25 -0
- metadata +6 -2
data/History.txt
CHANGED
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.1.
|
1
|
+
0.1.6
|
@@ -0,0 +1,62 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/example_helper.rb'
|
2
|
+
require 'date'
|
3
|
+
|
4
|
+
# JiakData class with a couple of attributes, one of which requires conversion
|
5
|
+
class DateData
|
6
|
+
include JiakData
|
7
|
+
attr_accessor :name, :date
|
8
|
+
convert :date => lambda{|value| Date.parse(value)}
|
9
|
+
end
|
10
|
+
|
11
|
+
client = JiakClient.new(SERVER_URI)
|
12
|
+
bucket = JiakBucket.new('date data',DateData)
|
13
|
+
|
14
|
+
# Leap data date is a Data object
|
15
|
+
leap_2008 = DateData.new(:name => "Leap 2008",
|
16
|
+
:date => Date.new(2008,02,29))
|
17
|
+
leap_obj = client.store(JiakObject.new(:bucket => bucket,
|
18
|
+
:data => leap_2008),
|
19
|
+
:return => :object)
|
20
|
+
puts leap_obj.data.date.inspect # => #<Date: 2008-02-29 (etc.)>
|
21
|
+
|
22
|
+
# Clean-up stored object
|
23
|
+
client.delete(bucket,leap_obj.key)
|
24
|
+
|
25
|
+
|
26
|
+
# It is also possible to use Ruby JSON processing to achieve a similar result;
|
27
|
+
# however, this is not optimal as the stored Riak data value contains
|
28
|
+
# Ruby-secific information which may be undesirable to non-Ruby consumers of
|
29
|
+
# that data.
|
30
|
+
|
31
|
+
# Instrument the Ruby Date class for round-trip JSON processing.
|
32
|
+
class Date
|
33
|
+
def to_json(*args)
|
34
|
+
{ 'json_class' => self.class.name,
|
35
|
+
'date' => to_s
|
36
|
+
}.to_json(*args)
|
37
|
+
end
|
38
|
+
def self.json_create(hash)
|
39
|
+
parse(hash['date'])
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
class DateData2
|
44
|
+
include JiakData
|
45
|
+
attr_accessor :name, :date
|
46
|
+
end
|
47
|
+
|
48
|
+
bucket = JiakBucket.new('date data',DateData2)
|
49
|
+
|
50
|
+
leap_2012 = DateData2.new(:name => "Leap 2012",
|
51
|
+
:date => Date.new(2012,02,29))
|
52
|
+
leap_obj = client.store(JiakObject.new(:bucket => bucket,
|
53
|
+
:data => leap_2012),
|
54
|
+
:return => :object)
|
55
|
+
puts leap_obj.data.date.inspect # => #<Date: 2012-02-29 (etc.)>
|
56
|
+
|
57
|
+
# JSON payload:
|
58
|
+
# leap_2008 : {"name":"leap","date":"2008-02-29"}
|
59
|
+
# leap_2012 : {"name":"leap","date":{"json_class":"Date","date":"2012-02-29"}}
|
60
|
+
|
61
|
+
# Clean-up stored object
|
62
|
+
client.delete(bucket,leap_obj.key)
|
@@ -0,0 +1,29 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/example_helper.rb'
|
2
|
+
require 'date'
|
3
|
+
|
4
|
+
# JiakResource with a couple of attributes, one of which requires conversion
|
5
|
+
class Person
|
6
|
+
include JiakResource
|
7
|
+
server SERVER_URI
|
8
|
+
attr_accessor :name, :birthdate
|
9
|
+
convert :birthdate => lambda{|value| Date.parse(value)}
|
10
|
+
keygen {name.downcase}
|
11
|
+
|
12
|
+
def age
|
13
|
+
now = DateTime.now
|
14
|
+
age = now.year - birthdate.year
|
15
|
+
age -= 1 if(now.yday < birthdate.yday)
|
16
|
+
age
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
# Create and post resource, showing birthdate is a Date before and after post.
|
21
|
+
remy = Person.new(:name => 'Remy',:birthdate => Date.new(1999,06,26))
|
22
|
+
puts remy.birthdate.inspect # => #<Date: 1999-06-26 (etc.)>
|
23
|
+
puts remy.age # => current age
|
24
|
+
remy.post
|
25
|
+
puts remy.birthdate.inspect # => #<Date: 1999-06-26 (etc.)>
|
26
|
+
puts remy.age # => current age
|
27
|
+
|
28
|
+
remy.delete
|
29
|
+
|
@@ -105,7 +105,7 @@ module RiakRest
|
|
105
105
|
# <code>delete</code> requests take precendence over the setting maintained
|
106
106
|
# by a JiakClient. Any request parameter not set in JiakClient or on an
|
107
107
|
# individual request will default to the values set in the Riak cluster.
|
108
|
-
#
|
108
|
+
#
|
109
109
|
def initialize(uri, opts={})
|
110
110
|
check_opts(opts,CLIENT_PARAMS,JiakClientException)
|
111
111
|
self.server = uri
|
@@ -263,7 +263,7 @@ module RiakRest
|
|
263
263
|
def store(jobj,opts={})
|
264
264
|
check_opts(opts,STORE_PARAMS,JiakClientException)
|
265
265
|
req_params = {
|
266
|
-
WRITES => opts[:writes] || @params[:writes],
|
266
|
+
WRITES => opts[:writes] || @params[:writes],
|
267
267
|
DURABLE_WRITES => opts[:durable_writes] || @params[:durable_writes],
|
268
268
|
COPY => opts[:copy]
|
269
269
|
}
|
@@ -292,7 +292,7 @@ module RiakRest
|
|
292
292
|
else
|
293
293
|
resp = RestClient.put(uri,payload,headers)
|
294
294
|
end
|
295
|
-
|
295
|
+
|
296
296
|
if(req_params[RETURN_BODY])
|
297
297
|
JiakObject.jiak_create(JSON.parse(resp),jobj.bucket.data_class)
|
298
298
|
elsif(key_empty)
|
@@ -301,12 +301,14 @@ module RiakRest
|
|
301
301
|
jobj.key
|
302
302
|
end
|
303
303
|
rescue RestClient::ExceptionWithResponse => err
|
304
|
-
fail_with_response("
|
304
|
+
JiakClient.fail_with_response("store", err)
|
305
305
|
rescue RestClient::Exception => err
|
306
|
-
fail_with_message("
|
306
|
+
JiakClient.fail_with_message("store", err)
|
307
|
+
rescue Errno::ECONNREFUSED => err
|
308
|
+
JiakClient.fail_connection("store", err)
|
307
309
|
end
|
308
310
|
end
|
309
|
-
|
311
|
+
|
310
312
|
# :call-seq:
|
311
313
|
# get(bucket,key,opts={}) -> JiakObject
|
312
314
|
#
|
@@ -348,9 +350,11 @@ module RiakRest
|
|
348
350
|
rescue RestClient::ResourceNotFound => err
|
349
351
|
raise JiakResourceNotFound, "failed get: #{err.message}"
|
350
352
|
rescue RestClient::ExceptionWithResponse => err
|
351
|
-
fail_with_response("get", err)
|
353
|
+
JiakClient.fail_with_response("get", err)
|
352
354
|
rescue RestClient::Exception => err
|
353
|
-
fail_with_message("get",err)
|
355
|
+
JiakClient.fail_with_message("get",err)
|
356
|
+
rescue Errno::ECONNREFUSED => err
|
357
|
+
JiakClient.fail_connection("get", err)
|
354
358
|
end
|
355
359
|
end
|
356
360
|
|
@@ -372,9 +376,11 @@ module RiakRest
|
|
372
376
|
RestClient.delete(uri,:accept => APP_JSON)
|
373
377
|
true
|
374
378
|
rescue RestClient::ExceptionWithResponse => err
|
375
|
-
fail_with_response("delete", err)
|
379
|
+
JiakClient.fail_with_response("delete", err)
|
376
380
|
rescue RestClient::Exception => err
|
377
|
-
fail_with_message("delete", err)
|
381
|
+
JiakClient.fail_with_message("delete", err)
|
382
|
+
rescue Errno::ECONNREFUSED => err
|
383
|
+
JiakClient.fail_connection("delete", err)
|
378
384
|
end
|
379
385
|
end
|
380
386
|
|
@@ -389,8 +395,8 @@ module RiakRest
|
|
389
395
|
true
|
390
396
|
rescue RestClient::ResourceNotFound
|
391
397
|
false
|
392
|
-
rescue
|
393
|
-
|
398
|
+
rescue Errno::ECONNREFUSED => err
|
399
|
+
JiakClient.fail_connection("exist?", err)
|
394
400
|
end
|
395
401
|
end
|
396
402
|
|
@@ -425,9 +431,11 @@ module RiakRest
|
|
425
431
|
JiakObject.jiak_create(jiak,data_class)
|
426
432
|
end
|
427
433
|
rescue RestClient::ExceptionWithResponse => err
|
428
|
-
fail_with_response("
|
434
|
+
JiakClient.fail_with_response("walk", err)
|
429
435
|
rescue RestClient::Exception => err
|
430
|
-
fail_with_message("
|
436
|
+
JiakClient.fail_with_message("walk", err)
|
437
|
+
rescue Errno::ECONNREFUSED => err
|
438
|
+
JiakClient.fail_connection("walk", err)
|
431
439
|
end
|
432
440
|
end
|
433
441
|
|
@@ -438,7 +446,7 @@ module RiakRest
|
|
438
446
|
def ==(other)
|
439
447
|
(@server == other.server) rescue false
|
440
448
|
end
|
441
|
-
|
449
|
+
|
442
450
|
# :call-seq:
|
443
451
|
# eql?(other) -> true or false
|
444
452
|
#
|
@@ -453,6 +461,8 @@ module RiakRest
|
|
453
461
|
@server.hash
|
454
462
|
end
|
455
463
|
|
464
|
+
# :stopdoc:
|
465
|
+
|
456
466
|
# Build the URI for accessing the Jiak server.
|
457
467
|
def jiak_uri(bucket,key="")
|
458
468
|
bucket_name = bucket.is_a?(JiakBucket) ? bucket.name : bucket
|
@@ -472,7 +482,7 @@ module RiakRest
|
|
472
482
|
qstring
|
473
483
|
end
|
474
484
|
private :jiak_qstring
|
475
|
-
|
485
|
+
|
476
486
|
# Get either the schema or keys for the bucket.
|
477
487
|
def bucket_info(bucket,info)
|
478
488
|
ignore = (info == SCHEMA) ? KEYS : SCHEMA
|
@@ -480,23 +490,30 @@ module RiakRest
|
|
480
490
|
uri = jiak_uri(bucket,"") << jiak_qstring({ignore => false})
|
481
491
|
JSON.parse(RestClient.get(uri, :accept => APP_JSON))[info]
|
482
492
|
rescue RestClient::ExceptionWithResponse => err
|
483
|
-
fail_with_response("
|
493
|
+
JiakClient.fail_with_response("info", err)
|
484
494
|
rescue RestClient::Exception => err
|
485
|
-
fail_with_message("
|
495
|
+
JiakClient.fail_with_message("info", err)
|
496
|
+
rescue Errno::ECONNREFUSED => err
|
497
|
+
JiakClient.fail_connection("info", err)
|
486
498
|
end
|
487
499
|
end
|
488
500
|
private :bucket_info
|
489
501
|
|
490
|
-
def fail_with_response(action,err)
|
491
|
-
raise(
|
492
|
-
|
502
|
+
def self.fail_with_response(action,err)
|
503
|
+
raise(JiakResourceException,
|
504
|
+
"failed #{action}: HTTP code #{err.http_code}: #{err.http_body}")
|
493
505
|
end
|
494
|
-
private :fail_with_response
|
495
506
|
|
496
|
-
def fail_with_message(action,err)
|
507
|
+
def self.fail_with_message(action,err)
|
497
508
|
raise JiakResourceException, "failed #{action}: #{err.message}"
|
498
509
|
end
|
499
|
-
|
510
|
+
|
511
|
+
def self.fail_connection(action,err)
|
512
|
+
raise(JiakClientException,
|
513
|
+
"failed #{action}: Connection refused for server #{@server}")
|
514
|
+
end
|
515
|
+
|
516
|
+
# :startdoc:
|
500
517
|
|
501
518
|
end
|
502
519
|
|
@@ -47,9 +47,9 @@ module RiakRest
|
|
47
47
|
# ----------------------------------------------------------------------
|
48
48
|
# Class methods
|
49
49
|
# ----------------------------------------------------------------------
|
50
|
-
|
50
|
+
|
51
51
|
# Class methods for use in creating a user-defined JiakData. The methods
|
52
|
-
# <code>allow, require, readable, writable</code> delegate to JiakSchema.
|
52
|
+
# <code>allow, require, readable, writable</code> delegate to JiakSchema.
|
53
53
|
# See JiakSchema for discussion on the use of schemas in Riak.
|
54
54
|
module ClassMethods
|
55
55
|
|
@@ -148,7 +148,7 @@ module RiakRest
|
|
148
148
|
added_fields = @schema.send(method,*fields)
|
149
149
|
added_allowed = @schema.allowed_fields - prev_allowed
|
150
150
|
# added_allowed.each {|field| attr_accessor field}
|
151
|
-
added_allowed.each do |field|
|
151
|
+
added_allowed.each do |field|
|
152
152
|
class_eval <<-EOH
|
153
153
|
def #{field}
|
154
154
|
@#{field}
|
@@ -161,7 +161,7 @@ module RiakRest
|
|
161
161
|
added_fields
|
162
162
|
end
|
163
163
|
private :expand_schema
|
164
|
-
|
164
|
+
|
165
165
|
# :call-seq:
|
166
166
|
# JiakData.schema -> JiakSchema
|
167
167
|
#
|
@@ -173,7 +173,7 @@ module RiakRest
|
|
173
173
|
# :call-seq:
|
174
174
|
# JiakData.keygen(&block) -> nil
|
175
175
|
#
|
176
|
-
#
|
176
|
+
# Specify the key generation for an instance of the created JiakData
|
177
177
|
# class. Key generation will call the specified block in the scope of the
|
178
178
|
# current instance.
|
179
179
|
def keygen(&block)
|
@@ -181,26 +181,33 @@ module RiakRest
|
|
181
181
|
end
|
182
182
|
|
183
183
|
# :call-seq:
|
184
|
-
#
|
185
|
-
#
|
186
|
-
# Create an instance of user-defined data object from the fields read
|
187
|
-
# by Jiak. These fields are determined by the read mask of the
|
188
|
-
# structured Jiak interaction. See JiakSchema for read mask discussion.
|
184
|
+
# JiakData.convert(hash) -> nil
|
189
185
|
#
|
190
|
-
#
|
191
|
-
#
|
192
|
-
#
|
193
|
-
#
|
186
|
+
# Specify a hash of optional Procs for converting the data values stored
|
187
|
+
# in Riak during the process of inflating returned Riak data into Ruby
|
188
|
+
# objects. The hash values should be Procs used to convert the data
|
189
|
+
# attribute specified by the hash key. The Procs must accept one
|
190
|
+
# argument, the data value actually stored in Riak. The converted result
|
191
|
+
# will be the actual value of the data field inside the inflated Ruby
|
192
|
+
# object.
|
194
193
|
#
|
195
194
|
# ====Example
|
196
|
-
#
|
197
|
-
#
|
198
|
-
#
|
199
|
-
#
|
200
|
-
#
|
201
|
-
|
202
|
-
|
203
|
-
|
195
|
+
# def PersonData
|
196
|
+
# include JiakData
|
197
|
+
# attr_accessor :name, :birthdate
|
198
|
+
# convert :birthdate => lambda {|val| Date.parse(val)}
|
199
|
+
# end
|
200
|
+
def convert(hash)
|
201
|
+
@converter ||= {}
|
202
|
+
hash.each {|k,blk| @converter[k.to_s] = blk}
|
203
|
+
end
|
204
|
+
|
205
|
+
# Use optional converters to convert returned data values before passing
|
206
|
+
# to the JiakData constructor.
|
207
|
+
def jiak_create(jiak) # :nodoc:
|
208
|
+
unless(@converter.nil?)
|
209
|
+
@converter.each {|k,blk| jiak[k] = blk.call(jiak[k])}
|
210
|
+
end
|
204
211
|
new(jiak)
|
205
212
|
end
|
206
213
|
|
@@ -235,7 +242,7 @@ module RiakRest
|
|
235
242
|
end
|
236
243
|
end
|
237
244
|
end
|
238
|
-
|
245
|
+
|
239
246
|
# ----------------------------------------------------------------------
|
240
247
|
# Instance methods
|
241
248
|
# ----------------------------------------------------------------------
|
@@ -244,34 +251,6 @@ module RiakRest
|
|
244
251
|
hash.each {|k,v| instance_variable_set("@#{k}", v)}
|
245
252
|
end
|
246
253
|
|
247
|
-
# :call-seq:
|
248
|
-
# to_jiak -> hash
|
249
|
-
#
|
250
|
-
# Provide a hash structure of the data to write to Jiak. The fields for
|
251
|
-
# this structure should come from the JiakData write mask. See JiakSchema
|
252
|
-
# for shema discussion.
|
253
|
-
#
|
254
|
-
# User-defined data classes must either override this method explicitly or
|
255
|
-
# use the <code>attr_*</code> methods which implicitly provide an implicit
|
256
|
-
# override. The method is automatically called to marshall data to
|
257
|
-
# Jiak. You do not call this method explicitly.
|
258
|
-
|
259
|
-
# Data classes that do not used the attr_* methods to specify attributes
|
260
|
-
# must override this method.
|
261
|
-
#
|
262
|
-
# ====Example
|
263
|
-
# def to_jiak
|
264
|
-
# { :writable_f1 => @writable_f1,
|
265
|
-
# :writable_f2 => @writable_f2
|
266
|
-
# }
|
267
|
-
# end
|
268
|
-
def to_jiak
|
269
|
-
self.class.schema.write_mask.inject({}) do |build,field|
|
270
|
-
build[field] = send("#{field}")
|
271
|
-
build
|
272
|
-
end
|
273
|
-
end
|
274
|
-
|
275
254
|
# :call-seq:
|
276
255
|
# keygen -> string
|
277
256
|
#
|
@@ -125,7 +125,7 @@ module RiakRest
|
|
125
125
|
private :check_fields
|
126
126
|
|
127
127
|
# :call-seq:
|
128
|
-
# keygen(&block)
|
128
|
+
# JiakResource.keygen(&block)
|
129
129
|
#
|
130
130
|
# Specify the block for generating keys for a JiakResource instance.
|
131
131
|
def keygen(&block)
|
@@ -134,6 +134,20 @@ module RiakRest
|
|
134
134
|
EOS
|
135
135
|
end
|
136
136
|
|
137
|
+
# :call-seq:
|
138
|
+
# JiakResource.convert(hash)
|
139
|
+
#
|
140
|
+
# Specify a hash of optional Procs for converting the data values stored
|
141
|
+
# in Riak during the process of inflating returned Riak data into
|
142
|
+
# JiakResource objects. The hash values should be Procs used to convert
|
143
|
+
# the data attribute specified by the hash key. The Procs must accept one
|
144
|
+
# argument, the data value actually stored in Riak. The converted result
|
145
|
+
# will be the actual value of the data field inside the inflated
|
146
|
+
# JiakResource.
|
147
|
+
def convert(hash)
|
148
|
+
jiak.data.convert(hash)
|
149
|
+
end
|
150
|
+
|
137
151
|
# :call-seq:
|
138
152
|
# JiakResource.params(opts={}) -> hash
|
139
153
|
#
|
@@ -2,12 +2,23 @@ require File.dirname(__FILE__) + '/../spec_helper.rb'
|
|
2
2
|
|
3
3
|
class FooBarBaz # :nodoc:
|
4
4
|
include JiakData
|
5
|
-
|
6
5
|
attr_accessor :foo, :bar
|
7
6
|
require :foo
|
8
7
|
allow :baz
|
9
8
|
end
|
10
9
|
|
10
|
+
require 'date'
|
11
|
+
class DateData
|
12
|
+
include JiakData
|
13
|
+
attr_accessor :name, :date
|
14
|
+
convert :date => lambda { |v| Date.parse(v) }
|
15
|
+
end
|
16
|
+
|
17
|
+
class PersonData
|
18
|
+
include JiakData
|
19
|
+
attr_accessor :name
|
20
|
+
end
|
21
|
+
|
11
22
|
describe "JiakClient" do
|
12
23
|
before do
|
13
24
|
@base_uri = SERVER_URI
|
@@ -67,7 +78,7 @@ describe "JiakClient" do
|
|
67
78
|
|
68
79
|
no_no = lambda {JiakClient::KEYS << 'a'}
|
69
80
|
no_no.should raise_error(StandardError,/frozen/)
|
70
|
-
|
81
|
+
|
71
82
|
no_no = lambda {JiakClient::SCHEMA << 'a'}
|
72
83
|
no_no.should raise_error(StandardError,/frozen/)
|
73
84
|
end
|
@@ -97,7 +108,7 @@ describe "JiakClient" do
|
|
97
108
|
client.proxy.should eql 'proxy_uri'
|
98
109
|
client.params.should have_exactly(4).items
|
99
110
|
@params.each {|k,v| client.params[k].should == @params[k]}
|
100
|
-
|
111
|
+
|
101
112
|
@opts.delete(:proxy)
|
102
113
|
@opts.delete(:writes)
|
103
114
|
client = JiakClient.new(@base_uri,@opts)
|
@@ -126,13 +137,41 @@ describe "JiakClient" do
|
|
126
137
|
|
127
138
|
bad_opts = lambda {@client.set_params(:junk => 'junk')}
|
128
139
|
bad_opts.should raise_error(JiakClientException,/option/)
|
129
|
-
|
140
|
+
|
130
141
|
@params[:junk] = 'junk'
|
131
142
|
bad_opts = lambda {@client.params = @params}
|
132
143
|
bad_opts.should raise_error(JiakClientException,/option/)
|
133
144
|
end
|
134
145
|
end
|
135
146
|
|
147
|
+
describe "JiakClient connection" do
|
148
|
+
before do
|
149
|
+
@client = JiakClient.new("http://localhost:9999/jiak/")
|
150
|
+
@data = FooBarBaz.new(:foo => 'Foo',:bar => 'Bar')
|
151
|
+
@bucket = JiakBucket.new('actions_bucket',FooBarBaz)
|
152
|
+
end
|
153
|
+
|
154
|
+
it "should report refused errors" do
|
155
|
+
client = JiakClient.new("http://localhost:9999/jiak/")
|
156
|
+
data = FooBarBaz.new(:foo => 'Foo',:bar => 'Bar')
|
157
|
+
bucket = JiakBucket.new('actions_bucket',FooBarBaz)
|
158
|
+
key = 'key'
|
159
|
+
jobj = JiakObject.new(:bucket => bucket, :key => key, :data => data)
|
160
|
+
qlink = QueryLink.new(bucket,'tag',nil)
|
161
|
+
|
162
|
+
[lambda {client.keys(bucket)},
|
163
|
+
lambda {client.schema(bucket)},
|
164
|
+
lambda {client.store(jobj)},
|
165
|
+
lambda {client.get(bucket,key)},
|
166
|
+
lambda {client.exist?(bucket,key)},
|
167
|
+
lambda {client.delete(bucket,key)},
|
168
|
+
lambda {client.walk(bucket,'tag',qlink,FooBarBaz)}
|
169
|
+
].each do |bad_req|
|
170
|
+
bad_req.should raise_error(JiakClientException,/Connection refused/)
|
171
|
+
end
|
172
|
+
end
|
173
|
+
end
|
174
|
+
|
136
175
|
describe "JiakClient URI handling" do
|
137
176
|
before do
|
138
177
|
@base_uri = SERVER_URI
|
@@ -174,7 +213,7 @@ describe "JiakClient processing" do
|
|
174
213
|
|
175
214
|
it "should set and fetch a bucket schema" do
|
176
215
|
schema = @client.schema(@bucket)
|
177
|
-
|
216
|
+
|
178
217
|
['allowed_fields',
|
179
218
|
'required_fields',
|
180
219
|
'read_mask',
|
@@ -188,7 +227,7 @@ describe "JiakClient processing" do
|
|
188
227
|
it "should update an existing bucket schema" do
|
189
228
|
FooBarBazBuz = JiakDataFields.create(:foo,:bar,:baz,:buz)
|
190
229
|
@client.set_schema(JiakBucket.new(@bucket_name,FooBarBazBuz))
|
191
|
-
|
230
|
+
|
192
231
|
resp_schema = @client.schema(@bucket)
|
193
232
|
resp_schema.allowed_fields.should include :buz
|
194
233
|
resp_schema.required_fields.should be_empty
|
@@ -263,7 +302,7 @@ describe "JiakClient processing" do
|
|
263
302
|
jobj.local?.should be true
|
264
303
|
resp.local?.should be false
|
265
304
|
end
|
266
|
-
|
305
|
+
|
267
306
|
it "should handle odd key values" do
|
268
307
|
key = '$ p @ c #'
|
269
308
|
jobj = JiakObject.new(:bucket => @bucket, :key => key, :data => @data)
|
@@ -276,7 +315,7 @@ describe "JiakClient processing" do
|
|
276
315
|
it "should check for resource existence" do
|
277
316
|
jobj = JiakObject.new(:bucket => @bucket, :data => @data)
|
278
317
|
key = @client.store(jobj)
|
279
|
-
|
318
|
+
|
280
319
|
@client.exist?(@bucket,key).should be true
|
281
320
|
@client.exist?(@bucket,'nope').should be false
|
282
321
|
end
|
@@ -297,10 +336,25 @@ describe "JiakClient processing" do
|
|
297
336
|
fetched.should be_a JiakObject
|
298
337
|
end
|
299
338
|
|
339
|
+
it "should optionally convert data values" do
|
340
|
+
bucket = JiakBucket.new('date data',DateData)
|
341
|
+
name = 'leap'
|
342
|
+
date = Date.new(2004,02,29)
|
343
|
+
jobj = JiakObject.new(:bucket => bucket,
|
344
|
+
:data => DateData.new(:name => name,
|
345
|
+
:date => date))
|
346
|
+
jobj.data.name.should eql name
|
347
|
+
jobj.data.date.should eql date
|
348
|
+
|
349
|
+
jobj = @client.store(jobj, :return => :object)
|
350
|
+
jobj.data.name.should eql name
|
351
|
+
jobj.data.date.should eql date
|
352
|
+
end
|
353
|
+
|
300
354
|
it "should accept write and read parameters" do
|
301
355
|
key = 'fetch_key_wr'
|
302
356
|
jobj = JiakObject.new(:bucket => @bucket, :key => key, :data => @data)
|
303
|
-
jobj = @client.store(jobj,
|
357
|
+
jobj = @client.store(jobj,
|
304
358
|
:writes => 3, :reads => 3,
|
305
359
|
:return => :object)
|
306
360
|
|
@@ -318,7 +372,7 @@ describe "JiakClient processing" do
|
|
318
372
|
jobj =
|
319
373
|
@client.store(JiakObject.new(:bucket => @bucket, :data => @data),
|
320
374
|
{:return => :object})
|
321
|
-
|
375
|
+
|
322
376
|
jobj.data.should eql @data
|
323
377
|
[:vclock,:vtag,:lastmod].each do |field|
|
324
378
|
jobj.riak.should include field
|
@@ -328,7 +382,7 @@ describe "JiakClient processing" do
|
|
328
382
|
|
329
383
|
updated_data = FooBarBaz.new(:foo => 'new val')
|
330
384
|
jobj.data = updated_data
|
331
|
-
updated_object =
|
385
|
+
updated_object =
|
332
386
|
@client.store(jobj,{:return => :object})
|
333
387
|
updated_data = updated_object.data
|
334
388
|
updated_data.should_not eql @data
|
@@ -353,11 +407,6 @@ describe "JiakClient processing" do
|
|
353
407
|
|
354
408
|
end
|
355
409
|
|
356
|
-
class PersonData
|
357
|
-
include JiakData
|
358
|
-
attr_accessor :name
|
359
|
-
end
|
360
|
-
|
361
410
|
describe "JiakClient links" do
|
362
411
|
before do
|
363
412
|
@base_uri = SERVER_URI
|
@@ -440,7 +489,7 @@ describe "JiakClient links" do
|
|
440
489
|
child.links.should include p_link
|
441
490
|
end
|
442
491
|
end
|
443
|
-
|
492
|
+
|
444
493
|
# p's should include links to their c's
|
445
494
|
c_link = QueryLink.new(@c_bucket,'child',nil)
|
446
495
|
parent_children.each do |p_name,children|
|
@@ -318,6 +318,31 @@ describe "JiakResource class auto-update" do
|
|
318
318
|
|
319
319
|
end
|
320
320
|
|
321
|
+
describe "JiakResource data conversion" do
|
322
|
+
require 'date'
|
323
|
+
class DogDate # :nodoc:
|
324
|
+
include JiakResource
|
325
|
+
server SERVER_URI
|
326
|
+
group 'dogs'
|
327
|
+
attr_accessor :name, :birthdate
|
328
|
+
convert :birthdate => lambda{|value| Date.parse(value)}
|
329
|
+
keygen { name }
|
330
|
+
auto_manage
|
331
|
+
end
|
332
|
+
|
333
|
+
it "should convert date data into a Date" do
|
334
|
+
name = 'Adelaide'
|
335
|
+
date = Date.new(1993,10,8)
|
336
|
+
|
337
|
+
addie = DogDate.new(:name => name, :birthdate => date)
|
338
|
+
addie.name.should eql name
|
339
|
+
addie.birthdate.should eql date
|
340
|
+
|
341
|
+
addie.delete
|
342
|
+
end
|
343
|
+
|
344
|
+
end
|
345
|
+
|
321
346
|
describe "JiakResource simple" do
|
322
347
|
class Dog # :nodoc:
|
323
348
|
include JiakResource
|
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.1.
|
4
|
+
version: 0.1.6
|
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-12-
|
12
|
+
date: 2009-12-16 00:00:00 -08:00
|
13
13
|
default_executable:
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
@@ -96,6 +96,8 @@ files:
|
|
96
96
|
- examples/buoy.rb
|
97
97
|
- examples/buoy_pov.rb
|
98
98
|
- examples/example_helper.rb
|
99
|
+
- examples/jiak_client.data.rb
|
100
|
+
- examples/jiak_resource_data.rb
|
99
101
|
- examples/linked_resources.rb
|
100
102
|
- lib/riakrest.rb
|
101
103
|
- lib/riakrest/core/exceptions.rb
|
@@ -167,4 +169,6 @@ test_files:
|
|
167
169
|
- examples/buoy.rb
|
168
170
|
- examples/buoy_pov.rb
|
169
171
|
- examples/example_helper.rb
|
172
|
+
- examples/jiak_client.data.rb
|
173
|
+
- examples/jiak_resource_data.rb
|
170
174
|
- examples/linked_resources.rb
|