riakrest 0.1.2 → 0.1.5

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,30 +1,45 @@
1
1
  module RiakRest
2
- # JiakResource provides a resource-oriented wrapper for Jiak interaction.
2
+ # JiakResource provides an abstraction to the Jiak interaction provided by
3
+ # the Core Client classes of RiakRest. JiakResource is built on top of Core
4
+ # Client and does not provide any functionality not possible through Core
5
+ # Client. However, JiakResource does provide a much simplier Jiak interaction
6
+ # interface.
3
7
  #
4
8
  # ===Example
5
9
  # require 'riakrest'
6
10
  # include RiakRest
7
11
  #
8
- # class People
12
+ # class Person
9
13
  # include JiakResource
10
14
  # server 'http://localhost:8002/jiak'
11
- # jattr_accessor :name, :age
15
+ # attr_accessor :name, :age
12
16
  # auto_manage
13
17
  # end
14
18
  #
15
- # remy = People.new(:name => 'Remy',:age => 10) # (auto-post)
19
+ # remy = Person.new(:name => 'Remy',:age => 10) # (auto-post)
16
20
  # remy.age = 11 # (auto-update)
17
21
  #
18
- # callie = People.new(:name => 'Callie', :age => 13)
22
+ # callie = Person.new(:name => 'Callie', :age => 13)
19
23
  # remy.link(callie,'sister')
20
24
  #
21
- # sisters = remy.query(People,'sister')
25
+ # sisters = remy.query([Person,'sister'])
22
26
  # sisters[0].eql?(callie) # => true
23
27
  #
24
28
  # remy.delete
25
29
  # callie.delete
26
30
 
27
31
  module JiakResource
32
+
33
+ # :stopdoc:
34
+ PUT_PARAMS = [:writes,:durable_writes,:reads,:copy,:read]
35
+ GET_PARAMS = [:reads,:read]
36
+ DELETE_PARAMS = [:deletes]
37
+
38
+ PUT_PARAMS.freeze
39
+ GET_PARAMS.freeze
40
+ DELETE_PARAMS.freeze
41
+ # :startdoc:
42
+
28
43
  # ----------------------------------------------------------------------
29
44
  # Class methods
30
45
  # ----------------------------------------------------------------------
@@ -57,34 +72,34 @@ module RiakRest
57
72
  end
58
73
 
59
74
  # :call-seq:
60
- # jattr_reader :f1,...,:fn
75
+ # attr_reader :f1,...,:fn
61
76
  #
62
77
  # Add read accessible fields.
63
- def jattr_reader(*fields)
78
+ def attr_reader(*fields)
64
79
  check_fields(fields)
65
80
  added_fields = jiak.data.readable(*fields)
66
81
  added_fields.each do |field|
67
82
  class_eval <<-EOM
68
83
  def #{field}
69
- @jiak.data.#{field}
84
+ @jiak.object.data.#{field}
70
85
  end
71
86
  EOM
72
87
  end
73
88
  nil
74
89
  end
75
- alias :jattr :jattr_reader
90
+ alias :attr :attr_reader
76
91
 
77
92
  # :call-seq:
78
- # jattr_writer :f1,...,:fn
93
+ # attr_writer :f1,...,:fn
79
94
  #
80
95
  # Add write accessible fields.
81
- def jattr_writer(*fields)
96
+ def attr_writer(*fields)
82
97
  check_fields(fields)
83
98
  added_fields = jiak.data.writable(*fields)
84
99
  added_fields.each do |field|
85
100
  class_eval <<-EOM
86
101
  def #{field}=(val)
87
- @jiak.data.#{field} = val
102
+ @jiak.object.data.#{field} = val
88
103
  self.class.do_auto_update(self)
89
104
  end
90
105
  EOM
@@ -93,12 +108,12 @@ module RiakRest
93
108
  end
94
109
 
95
110
  # :call-seq:
96
- # jattr_accessor :f1,...,:fn
111
+ # attr_accessor :f1,...,:fn
97
112
  #
98
113
  # Add read/write accessible fields.
99
- def jattr_accessor(*fields)
100
- jattr_reader *fields
101
- jattr_writer *fields
114
+ def attr_accessor(*fields)
115
+ attr_reader *fields
116
+ attr_writer *fields
102
117
  end
103
118
 
104
119
  def check_fields(fields)
@@ -127,7 +142,7 @@ module RiakRest
127
142
  # =====Valid options
128
143
  # <code>:reads</code>:: Minimum number of responding nodes for successful reads.
129
144
  # <code>:writes</code>:: Minimum number of responding nodes for successful writes. Writes can be buffered for performance.
130
- # <code>:durable_writes</code>:: Minimum number of resonding nodes that must perform a durable write to the persistence layer.
145
+ # <code>:durable_writes</code>:: Minimum number of responding nodes that must perform a durable write to a persistence layer.
131
146
  # <code>:deletes</code>:: Minimum number of responding nodes for successful delete.
132
147
  #
133
148
  # The configuration of a Riak cluster includes server setting for
@@ -258,14 +273,11 @@ module RiakRest
258
273
  # <code>:durable_writes</code>
259
274
  # <code>:reads</code>
260
275
  #
261
- # If any of the request parameters <code>:writes, :durable_writes,
262
- # :reads</code> are not set, each first defaults to the value set for the
263
- # JiakResource class, then to the value set on the Riak cluster. In
264
- # general the values set on the Riak cluster should suffice.
276
+ # See JiakResource#params for description of options.
265
277
  def put(resource,opts={})
278
+ check_opts(opts,PUT_PARAMS,JiakResourceException)
266
279
  opts[:return] = :object
267
280
  resource.jiak.object = jiak.client.store(resource.jiak.object,opts)
268
- resource.jiak_convenience
269
281
  resource
270
282
  end
271
283
 
@@ -303,11 +315,12 @@ module RiakRest
303
315
  # Get a JiakResource on the Jiak server by the specified key.
304
316
  #
305
317
  # =====Valid options:
306
- # <code>:reads</code> --- See JiakResource#new
318
+ # <code>:reads</code> --- See JiakResource#params
307
319
  #
308
320
  # Raise JiakResourceNotFound if no resource exists on the Jiak server for
309
321
  # the key.
310
322
  def get(key,opts={})
323
+ check_opts(opts,GET_PARAMS,JiakResourceException)
311
324
  new(jiak.client.get(jiak.bucket,key,opts))
312
325
  end
313
326
 
@@ -317,10 +330,10 @@ module RiakRest
317
330
  # Updates a JiakResource with the data on the Jiak server. The current
318
331
  # data of the JiakResource is overwritten, so use with caution.
319
332
  #
320
- # See JiakResource#put for options.
333
+ # See JiakResource#get for options.
321
334
  def refresh(resource,opts={})
322
- resource.jiak.object = get(resource.jiak.key,opts).jiak.object
323
- resource.jiak_convenience
335
+ check_opts(opts,GET_PARAMS,JiakResourceException)
336
+ resource.jiak.object = get(resource.jiak.object.key,opts).jiak.object
324
337
  end
325
338
 
326
339
  # :call-seq:
@@ -330,8 +343,9 @@ module RiakRest
330
343
  # key.
331
344
  #
332
345
  # =====Valid options:
333
- # <code>:deletes</code> --- See JiakResource#new
346
+ # <code>:deletes</code> --- See JiakResource#params
334
347
  def delete(resource,opts={})
348
+ check_opts(opts,DELETE_PARAMS,JiakResourceException)
335
349
  jiak.client.delete(jiak.bucket,resource.jiak.object.key,opts)
336
350
  end
337
351
 
@@ -392,38 +406,46 @@ module RiakRest
392
406
  end
393
407
 
394
408
  # :call-seq:
395
- # JiakResource.query(from,*steps)
409
+ # JiakResource.query(from,steps,opts={})
396
410
  #
397
411
  # Retrieves an array of JiakResource objects by starting with the links
398
- # in the <code>from</code> JiakResource and doing the query steps. The
399
- # steps are a series of query links designated by a JiakResource and a
400
- # string tag, or a JiakResource, a string tag and a string
401
- # accumulator. The type of JiakResource returned in the array is
402
- # determined by the JiakResource designated in the last step.
412
+ # in the <code>from</code> JiakResource and performing the query
413
+ # steps. Steps is an array holding a series of query links designated by
414
+ # JiakResource,tag pairs. The type of JiakResources returned by the query
415
+ # is determined by the JiakResource class designated in the last step.
416
+ #
417
+ # Note: Although Jiak supports accumulating intermediate link step
418
+ # results, since RiakRest auto-inflates returned data intermediate
419
+ # accumulation is not supported. The most common usage, however, is to
420
+ # only accumulate the last step as supported by RiakRest.
403
421
  #
404
422
  # ====Usage
405
423
  # <code>
406
- # JiakResource.query(resource,Child,'child')
407
- # JiakResource.query(resource,Parent,'odd',Child,'normal')
424
+ # JiakResource.query(resource,[Child,'child'])
425
+ # JiakResource.query(resource,[Parent,'odd',Child,'normal'])
408
426
  # </code>
409
- def query(from,*steps)
410
- links = []
411
- until steps.empty?
412
- begin
413
- klass,tag = steps.shift(2)
414
- last_klass = klass
415
- acc = steps[0].is_a?(String) ? steps.shift : nil
416
- links << QueryLink.new(klass.jiak.group,tag,acc)
417
- rescue
418
- raise(JiakResourceException,
419
- "each step should be Klass,tag or Klass,tag,acc")
427
+ def query(from,steps,opts={})
428
+ check_opts(opts,GET_PARAMS,JiakResourceException)
429
+ begin
430
+ links = []
431
+ klass = nil
432
+ steps.each_slice(2) do |pair|
433
+ klass = pair[0]
434
+ links << QueryLink.new(klass.jiak.bucket.name,pair[1],nil)
420
435
  end
436
+ data_class = klass.jiak.bucket.data_class
437
+ if(klass.include?(JiakResourcePOV))
438
+ opts[:read] = klass.jiak.read_mask
439
+ end
440
+ jiak.client.walk(from.jiak.object.bucket,
441
+ from.jiak.object.key,
442
+ links,
443
+ data_class,
444
+ opts).map {|jobj| klass.new(jobj)}
445
+ # rescue
446
+ # raise(JiakResourceException,
447
+ # "each step should be JiakResource,tag pair")
421
448
  end
422
- links = links[0] if links.size == 1
423
- jiak.client.walk(from.jiak.object.bucket, from.jiak.object.key, links,
424
- last_klass.jiak.bucket.data_class).map do |jobj|
425
- last_klass.new(jobj)
426
- end
427
449
  end
428
450
  alias :walk :query
429
451
 
@@ -483,7 +505,7 @@ module RiakRest
483
505
  # with the JiakResource.
484
506
  def initialize(*args)
485
507
  # First form is used by JiakResource.get and JiakResource.query
486
- @jiak = Struct.new(:object,:bucket,:key,:data,:links,:auto_update).new
508
+ @jiak = Struct.new(:object,:auto_update).new
487
509
  if(args.size == 1 && args[0].is_a?(JiakObject))
488
510
  @jiak.object = args[0]
489
511
  else
@@ -498,16 +520,6 @@ module RiakRest
498
520
  self.class.post(self)
499
521
  end
500
522
  end
501
- jiak_convenience
502
- end
503
-
504
- # Public method as a by-product of implementation. No harm done in calling
505
- # this method, as it will just repeat assignments already done.
506
- def jiak_convenience # :nodoc:
507
- @jiak.bucket = @jiak.object.bucket
508
- @jiak.key = @jiak.object.key
509
- @jiak.data = @jiak.object.data
510
- @jiak.links = @jiak.object.links
511
523
  end
512
524
 
513
525
  # :call-seq:
@@ -545,7 +557,6 @@ module RiakRest
545
557
  # for options.
546
558
  def put(opts={})
547
559
  @jiak.object = (self.class.put(self,opts)).jiak.object
548
- jiak_convenience
549
560
  self
550
561
  end
551
562
 
@@ -557,7 +568,6 @@ module RiakRest
557
568
  # options.
558
569
  def post(opts={})
559
570
  @jiak.object = (self.class.post(self,opts)).jiak.object
560
- jiak_convenience
561
571
  self
562
572
  end
563
573
 
@@ -569,7 +579,6 @@ module RiakRest
569
579
  # options.
570
580
  def update(opts={})
571
581
  @jiak.object = (self.class.update(self,opts)).jiak.object
572
- jiak_convenience
573
582
  self
574
583
  end
575
584
  alias :push :update
@@ -632,21 +641,26 @@ module RiakRest
632
641
  end
633
642
 
634
643
  # :call-seq:
635
- # query(*steps) -> array
644
+ # query(steps) -> array
636
645
  #
637
646
  # Performs a Jiak query starting at this resource. See
638
647
  # JiakResource#ClassMethods#query for description.
639
648
  #
640
649
  # ====Usage
641
650
  # <code>
642
- # query(Child,'child')
643
- # query(Parent,'odd',Child,'normal')
651
+ # query([Child,'child'])
652
+ # query([Parent,'odd',Child,'normal'])
644
653
  # </code>
645
- def query(*steps)
646
- self.class.query(self,*steps)
654
+ def query(steps,opts={})
655
+ self.class.query(self,steps)
647
656
  end
648
657
  alias :walk :query
649
658
 
659
+ # CxINC
660
+ def pov(pov)
661
+ pov.get(@jiak.object.key)
662
+ end
663
+
650
664
  # :call-seq:
651
665
  # jiak_resource == other -> true or false
652
666
  #
@@ -0,0 +1,279 @@
1
+ module RiakRest
2
+
3
+ # JiakResourcePOV provides a restricted interface to existing JiakResource
4
+ # data. This restriction offers two primary benefits: Only explicitly
5
+ # declared fields can be read or written via the POV, thereby protecting
6
+ # other JiakResource fields, and only the POV fields are transported to and
7
+ # from the Jiak server, thereby reducing the HTTP message sizes.
8
+ #
9
+ # ===Example
10
+ # require 'riakrest'
11
+ # include RiakRest
12
+ #
13
+ # class AB
14
+ # include JiakResource
15
+ # server SERVER_URI
16
+ # group "test"
17
+ # attr_accessor :a, :b
18
+ # keygen { "k#{a}" }
19
+ # end
20
+ #
21
+ # class A
22
+ # include JiakResourcePOV
23
+ # resource AB
24
+ # attr_accessor :a
25
+ # end
26
+ #
27
+ # ab = AB.new(:a => 1, :b => 2)
28
+ # ab.post
29
+ #
30
+ # a = ab.pov(A)
31
+ # a.a = 11
32
+ # a.update
33
+ #
34
+ # ab.refresh
35
+ # ab.a # => 11
36
+
37
+ module JiakResourcePOV
38
+
39
+ # ----------------------------------------------------------------------
40
+ # Class methods
41
+ # ----------------------------------------------------------------------
42
+
43
+ # Class methods for creating a user-defined JiakResourcePOV.
44
+ #
45
+ # See JiakResourcePOV for example usage.
46
+ module ClassMethods
47
+
48
+ # :call-seq:
49
+ # JiakResourcePOV.resource(resource)
50
+ #
51
+ # Set the JiakResource to which this JiakResourcePOV is a point-of-view.
52
+ def resource(resource)
53
+ @resource = resource
54
+ @jiak.bucket = JiakBucket.new(@resource.jiak.group,
55
+ JiakDataFields.create)
56
+ end
57
+
58
+ # :call-seq:
59
+ # attr_reader :f1,...,:fn
60
+ #
61
+ # Add read accessible fields.
62
+ def attr_reader(*fields)
63
+ check_fields(fields,@resource.schema.read_mask)
64
+ added_fields = @jiak.bucket.data_class.readable(*fields)
65
+ added_fields.each do |field|
66
+ class_eval <<-EOM
67
+ def #{field}
68
+ @jiak.object.data.#{field}
69
+ end
70
+ EOM
71
+ end
72
+ @jiak.read_mask = @jiak.bucket.data_class.schema.read_mask.join(',')
73
+ nil
74
+ end
75
+
76
+ # :call-seq:
77
+ # attr_writer :f1,...,:fn
78
+ #
79
+ # Add write accessible fields.
80
+ def attr_writer(*fields)
81
+ check_fields(fields,@resource.schema.write_mask)
82
+ added_fields = @jiak.bucket.data_class.writable(*fields)
83
+ added_fields.each do |field|
84
+ class_eval <<-EOM
85
+ def #{field}=(val)
86
+ @jiak.object.data.#{field} = val
87
+ self.class.do_auto_update(self)
88
+ end
89
+ EOM
90
+ end
91
+ nil
92
+ end
93
+
94
+ # :call-seq:
95
+ # attr_accessor :f1,...,:fn
96
+ #
97
+ # Add read/write accessible fields.
98
+ def attr_accessor(*fields)
99
+ attr_reader(*fields)
100
+ attr_writer(*fields)
101
+ end
102
+
103
+ def check_fields(fields,valid)
104
+ invalid = fields.select {|f| !valid.include?(f)}
105
+ unless(invalid.empty?)
106
+ raise(JiakResourcePOVException,"invalid fields: #{invalid.inspect}")
107
+ end
108
+ end
109
+ private :check_fields
110
+
111
+ # :call-seq:
112
+ # JiakResourcePOV.keys -> array
113
+ #
114
+ # Get an array of the current keys for this resource. Since key lists are
115
+ # updated asynchronously on a Riak cluster the returned array can be out
116
+ # of synch immediately after new puts or deletes.
117
+ def keys
118
+ @resource.jiak.client.keys(jiak.bucket)
119
+ end
120
+
121
+ # :call-seq:
122
+ # JiakResourcePOV.get(key,opts={}) -> JiakResourcePOV
123
+ #
124
+ # Get a JiakResourcePOV on the Jiak server by the specified key.
125
+ #
126
+ # =====Valid options:
127
+ # <code>:reads</code> --- See JiakResource#get
128
+ #
129
+ # Raise JiakResourceNotFound if no resource exists on the Jiak server for
130
+ # the key.
131
+ def get(key,opts={})
132
+ opts[:read] = @jiak.read_mask
133
+ new(@resource.jiak.client.get(@jiak.bucket,key,opts))
134
+ end
135
+
136
+ # :call-seq:
137
+ # JiakResourcePOV.update(JiakResourcePOV,opts={}) -> JiakResourcePOV
138
+ #
139
+ # Updates a JiakResourcePOV on the Jiak server.
140
+ #
141
+ # See JiakResource#put for options.
142
+ def update(resource,opts={})
143
+ opts[:copy] = true
144
+ opts[:read] = @jiak.read_mask
145
+ @resource.put(resource,opts)
146
+ end
147
+
148
+ # :call-seq:
149
+ # JiakResourcePOV.refresh(resource,opts={}) -> JiakResourcePOV
150
+ #
151
+ # Updates a JiakResource with the data on the Jiak server. The current
152
+ # data of the JiakResource is overwritten, so use with caution.
153
+ #
154
+ # See JiakResource#refresh for options.
155
+ def refresh(resource,opts={})
156
+ resource.jiak.object = get(resource.jiak.object.key,opts).jiak.object
157
+ end
158
+
159
+ # :call-seq:
160
+ # JiakResourcePOV.exist?(key) -> true or false
161
+ #
162
+ # Determine if a resource exists on the Jiak server for a key.
163
+ def exist?(key)
164
+ @resource.jiak.client.exist?(@jiak.bucket,key)
165
+ end
166
+
167
+ # :call-seq:
168
+ # JiakResourcePOV.do_auto_update(resource) -> JiakResourcePOV or nil
169
+ #
170
+ # Determine if an auto update should be done on the resource and perform
171
+ # an update if so.
172
+ #
173
+ # Public method as a by-product of implementation.
174
+ def do_auto_update(rsrc) # :no-doc:
175
+ if(rsrc.auto_update? ||
176
+ ((rsrc.auto_update? != false) && rsrc.class.auto_update?))
177
+ update(rsrc)
178
+ end
179
+ end
180
+
181
+ end
182
+
183
+ def self.included(including_class) # :nodoc:
184
+ including_class.instance_eval do
185
+ extend ClassMethods
186
+
187
+ def jiak # :nodoc:
188
+ @jiak
189
+ end
190
+
191
+ @jiak = Struct.new(:bucket,:auto_update,:read_mask).new
192
+ @jiak.auto_update = false
193
+ end
194
+ end
195
+
196
+ # ----------------------------------------------------------------------
197
+ # Instance methods
198
+ # ----------------------------------------------------------------------
199
+
200
+ attr_reader :jiak # :nodoc:
201
+
202
+ def initialize(jobj) # :nodoc:
203
+ unless(jobj.is_a?(JiakObject))
204
+ # CxINC
205
+ raise JiakException
206
+ end
207
+ @jiak = Struct.new(:object,:auto_update).new
208
+ @jiak.object = jobj
209
+ @jiak.auto_update = false
210
+ end
211
+ # CxINC
212
+ # private_class_method :new
213
+
214
+ # :call-seq:
215
+ # auto_update(true, false, or nil)
216
+ #
217
+ # See JiakResource#auto_update
218
+ def auto_update=(state)
219
+ unless (state.nil? || state.is_a?(TrueClass) || state.is_a?(FalseClass))
220
+ raise JiakResource, "auto_update must be true, false, or nil"
221
+ end
222
+ @jiak.auto_update = state
223
+ end
224
+
225
+ # :call-seq:
226
+ # auto_update? -> true, false, or nil
227
+ #
228
+ # See JiakResource#auto_update?
229
+ def auto_update?
230
+ @jiak.auto_update
231
+ end
232
+
233
+ # :call-seq:
234
+ # update(opts={}) -> nil
235
+ #
236
+ # Put this resource on the Jiak server. See JiakResource#ClassMethods#put
237
+ # for options.
238
+ def update(opts={})
239
+ @jiak.object = (self.class.update(self,opts)).jiak.object
240
+ self
241
+ end
242
+ alias :push :update
243
+
244
+ # :call-seq:
245
+ # refresh(opts={}) -> nil
246
+ #
247
+ # Get this resource from the Jiak server. The current data of the resource
248
+ # is overwritten, so use with caution. See JiakResource#ClassMethods#get
249
+ # for options.
250
+ def refresh(opts={})
251
+ self.class.refresh(self,opts)
252
+ end
253
+ alias :pull :refresh
254
+
255
+ # :call-seq:
256
+ # jiak_resource == other -> true or false
257
+ #
258
+ # Equality -- Two JiakResourcePOVs are equal if they wrap the same Jiak
259
+ # data.
260
+ def ==(other)
261
+ (@jiak.object == other.jiak.object) rescue false
262
+ end
263
+
264
+ # :call-seq:
265
+ # eql?(other) -> true or false
266
+ #
267
+ # Returns <code>true</code> if <code>other</code> is a JiakResourcePOV
268
+ # representing the same Jiak data.
269
+ def eql?(other)
270
+ other.is_a?(JiakResourcePOV) && @jiak.object.eql?(other.jiak.object)
271
+ end
272
+
273
+ def hash # :nodoc:
274
+ @jiak.object.hash
275
+ end
276
+
277
+
278
+ end
279
+ end
data/lib/riakrest.rb CHANGED
@@ -36,7 +36,7 @@ $:.unshift(dirname) unless
36
36
  # class People
37
37
  # include JiakResource
38
38
  # server 'http://localhost:8002/jiak'
39
- # jattr_accessor :name, :age
39
+ # attr_accessor :name, :age
40
40
  # auto_manage
41
41
  # end
42
42
  #
@@ -46,7 +46,7 @@ $:.unshift(dirname) unless
46
46
  # callie = People.new(:name => 'Callie', :age => 13)
47
47
  # remy.link(callie,'sister')
48
48
  #
49
- # sisters = remy.query(People,'sister')
49
+ # sisters = remy.query([People,'sister'])
50
50
  # sisters[0].eql?(callie) # => true
51
51
  #
52
52
  # remy.delete
@@ -88,6 +88,7 @@ require 'riakrest/core/jiak_schema'
88
88
  require 'riakrest/core/query_link'
89
89
 
90
90
  require 'riakrest/resource/jiak_resource'
91
+ require 'riakrest/resource/jiak_resource_pov'
91
92
 
92
93
  # Extend Array with convenience methods for comparing array contents.
93
94
  class Array # :nodoc:
@@ -3,7 +3,7 @@ require File.dirname(__FILE__) + '/../spec_helper.rb'
3
3
  class FooBarBaz # :nodoc:
4
4
  include JiakData
5
5
 
6
- jattr_accessor :foo, :bar
6
+ attr_accessor :foo, :bar
7
7
  require :foo
8
8
  allow :baz
9
9
  end
@@ -44,12 +44,27 @@ describe "JiakClient" do
44
44
  no_no = lambda {JiakClient::DELETES << 'a'}
45
45
  no_no.should raise_error(StandardError,/frozen/)
46
46
 
47
- no_no = lambda {JiakClient::VALID_PARAMS << 'a'}
47
+ no_no = lambda {JiakClient::COPY << 'a'}
48
48
  no_no.should raise_error(StandardError,/frozen/)
49
49
 
50
- no_no = lambda {JiakClient::VALID_OPTS << 'a'}
50
+ no_no = lambda {JiakClient::READ << 'a'}
51
51
  no_no.should raise_error(StandardError,/frozen/)
52
-
52
+
53
+ no_no = lambda {JiakClient::CLIENT_PARAMS << 'a'}
54
+ no_no.should raise_error(StandardError,/frozen/)
55
+
56
+ no_no = lambda {JiakClient::STORE_PARAMS << 'a'}
57
+ no_no.should raise_error(StandardError,/frozen/)
58
+
59
+ no_no = lambda {JiakClient::GET_PARAMS << 'a'}
60
+ no_no.should raise_error(StandardError,/frozen/)
61
+
62
+ no_no = lambda {JiakClient::DELETE_PARAMS << 'a'}
63
+ no_no.should raise_error(StandardError,/frozen/)
64
+
65
+ no_no = lambda {JiakClient::WALK_PARAMS << 'a'}
66
+ no_no.should raise_error(StandardError,/frozen/)
67
+
53
68
  no_no = lambda {JiakClient::KEYS << 'a'}
54
69
  no_no.should raise_error(StandardError,/frozen/)
55
70
 
@@ -340,7 +355,7 @@ end
340
355
 
341
356
  class PersonData
342
357
  include JiakData
343
- jattr_accessor :name
358
+ attr_accessor :name
344
359
  end
345
360
 
346
361
  describe "JiakClient links" do