riakrest 0.0.4 → 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.
- data/History.txt +25 -26
- data/README.rdoc +16 -26
- data/VERSION +1 -1
- data/examples/auto_update_data.rb +16 -21
- data/examples/auto_update_links.rb +17 -21
- data/examples/basic_client.rb +15 -11
- data/examples/basic_resource.rb +14 -18
- data/examples/bucket_schemas.rb +12 -10
- data/examples/linked_resources.rb +23 -26
- data/examples/links_only_pov.rb +25 -25
- data/examples/multiple_pov.rb +16 -14
- data/examples/rest_interaction.rb +5 -5
- data/examples/ruby_json_data.rb +1 -19
- data/lib/riakrest/core/jiak_bucket.rb +18 -50
- data/lib/riakrest/core/jiak_client.rb +147 -79
- data/lib/riakrest/core/jiak_data.rb +179 -164
- data/lib/riakrest/core/jiak_data_fields.rb +69 -0
- data/lib/riakrest/core/jiak_link.rb +6 -8
- data/lib/riakrest/core/jiak_object.rb +15 -13
- data/lib/riakrest/core/jiak_schema.rb +192 -57
- data/lib/riakrest/resource/jiak_resource.rb +118 -170
- data/lib/riakrest.rb +24 -103
- data/spec/core/jiak_bucket_spec.rb +15 -45
- data/spec/core/jiak_client_spec.rb +70 -41
- data/spec/core/jiak_link_spec.rb +2 -2
- data/spec/core/jiak_object_spec.rb +12 -12
- data/spec/core/jiak_schema_spec.rb +122 -18
- data/spec/resource/jiak_resource_spec.rb +115 -148
- metadata +3 -5
- data/lib/riakrest/data/jiak_data_hash.rb +0 -182
- data/spec/data/jiak_data_hash_spec.rb +0 -14
@@ -24,30 +24,20 @@ module RiakRest
|
|
24
24
|
#
|
25
25
|
# Since Jiak interaction is JSON, duplicate fields names within an array are
|
26
26
|
# not meaningful, including a symbol that "equals" a string. Duplicates
|
27
|
-
#
|
27
|
+
# fields are ignored.
|
28
28
|
#
|
29
29
|
# ===Usage
|
30
30
|
# <pre>
|
31
|
-
# schema = JiakSchema.new(
|
32
|
-
#
|
33
|
-
#
|
34
|
-
#
|
31
|
+
# schema = JiakSchema.new([:foo,:bar])
|
32
|
+
# schema.allowed_fields # => [:foo,:bar]
|
33
|
+
# schema.required_fields # => []
|
34
|
+
# schema.read_mask # => [:foo,:bar]
|
35
|
+
# schema.write_mask # => [:foo,:bar]
|
35
36
|
#
|
36
|
-
# schema.
|
37
|
-
#
|
38
|
-
#
|
39
|
-
# schema
|
40
|
-
# :required_fields => [:foo,:bar]})
|
41
|
-
#
|
42
|
-
# schema.read_mask # => [:foo,:bar,:baz]
|
43
|
-
# schema.required_fields # => [:foo,:bar]
|
44
|
-
# schema.required_fields = [:foo,:bar,:baz]
|
45
|
-
# schema.required_fields # => [:foo,:bar,:baz]
|
46
|
-
#
|
47
|
-
#
|
48
|
-
# schema = JiakSchema.new([:foo,:bar,:baz])
|
49
|
-
#
|
50
|
-
# schema.write_mask # => [:foo,:bar,:baz)
|
37
|
+
# schema.write :baz
|
38
|
+
# schema.allowed_fields # => [:foo,:bar,:baz]
|
39
|
+
# schema.read_mask # => [:foo,:bar]
|
40
|
+
# schema.write_mask # => [:foo,:bar,:baz]
|
51
41
|
#
|
52
42
|
# </pre>
|
53
43
|
class JiakSchema
|
@@ -60,16 +50,13 @@ module RiakRest
|
|
60
50
|
# New schema from either a hash or an single-element array.
|
61
51
|
#
|
62
52
|
# ====Hash structure
|
63
|
-
# <em>required</em>
|
64
53
|
# <code>allowed_fields</code>:: Fields that can be stored.
|
65
|
-
# <em>optional</em>
|
66
54
|
# <code>required_fields</code>:: Fields that must be provided on storage.
|
67
55
|
# <code>read_mask</code>:: Fields returned on retrieval.
|
68
56
|
# <code>write_mask</code>:: Fields that can be changed and stored.
|
69
|
-
# The value for key must be an array.
|
70
57
|
#
|
71
58
|
# =====OR
|
72
|
-
# <code>schema</code>: A hash whose value is the above hash structure.
|
59
|
+
# <code>schema</code>: A hash whose value is in the above hash structure.
|
73
60
|
#
|
74
61
|
# Notes
|
75
62
|
# * Keys can either be symbols or strings.
|
@@ -88,7 +75,7 @@ module RiakRest
|
|
88
75
|
# * the method argument is not either a hash or array
|
89
76
|
# * The fields are not either symbols or strings
|
90
77
|
# * The fields elements are not unique
|
91
|
-
def initialize(arg)
|
78
|
+
def initialize(arg=nil)
|
92
79
|
case arg
|
93
80
|
when Hash
|
94
81
|
# Jiak returns a JSON structure with a single key 'schema' whose value
|
@@ -97,51 +84,62 @@ module RiakRest
|
|
97
84
|
opts = arg[:schema] || arg['schema'] || arg
|
98
85
|
|
99
86
|
opts[:allowed_fields] ||= opts['allowed_fields']
|
100
|
-
|
87
|
+
opts[:allowed_fields] = transform_fields("allowed_fields",
|
88
|
+
opts[:allowed_fields])
|
101
89
|
|
102
90
|
# Use required if provided, otherwise set to empty array
|
103
91
|
opts[:required_fields] ||= opts['required_fields'] || []
|
104
|
-
|
92
|
+
opts[:required_fields] = transform_fields("required_fields",
|
93
|
+
opts[:required_fields])
|
105
94
|
|
106
95
|
# Use masks if provided, otherwise set to allowed_fields
|
107
96
|
[:read_mask,:write_mask].each do |key|
|
108
97
|
opts[key] ||= opts[key.to_s] || opts[:allowed_fields]
|
109
|
-
|
98
|
+
opts[key] = transform_fields(key.to_s,opts[key])
|
110
99
|
end
|
111
100
|
when Array
|
112
101
|
# An array arg must be a single-element array of the allowed
|
113
102
|
# fields. Required fields is set to an empty array and the masks are
|
114
103
|
# set to the allowed fields array.
|
115
|
-
|
104
|
+
arg = transform_fields("allowed_fields",arg)
|
116
105
|
opts = {
|
117
106
|
:allowed_fields => arg,
|
118
107
|
:required_fields => [],
|
119
108
|
:read_mask => arg,
|
120
109
|
:write_mask => arg
|
121
110
|
}
|
111
|
+
when nil
|
112
|
+
arr = []
|
113
|
+
opts = {
|
114
|
+
:allowed_fields => arr,
|
115
|
+
:required_fields => arr,
|
116
|
+
:read_mask => arr,
|
117
|
+
:write_mask => arr
|
118
|
+
}
|
122
119
|
else
|
123
120
|
raise JiakSchemaException, "Initialize arg must be either hash or array"
|
124
121
|
end
|
125
122
|
|
126
|
-
@allowed_fields
|
127
|
-
@required_fields = opts[:required_fields]
|
128
|
-
@read_mask
|
129
|
-
@write_mask
|
123
|
+
@allowed_fields = opts[:allowed_fields].dup
|
124
|
+
@required_fields = opts[:required_fields].dup
|
125
|
+
@read_mask = opts[:read_mask].dup
|
126
|
+
@write_mask = opts[:write_mask].dup
|
130
127
|
end
|
131
128
|
|
132
129
|
# call-seq:
|
133
130
|
# JiakSchema.from_json(json) -> JiakSchema
|
134
131
|
#
|
135
|
-
#
|
136
|
-
|
132
|
+
# Called by the Core Client framework when marshalling from Jiak. This
|
133
|
+
# method does not need to be call explicitly.
|
134
|
+
def self.jiak_create(jiak)
|
137
135
|
new(jiak)
|
138
136
|
end
|
139
137
|
|
140
|
-
# call-seq:
|
141
|
-
#
|
138
|
+
# :call-seq:
|
139
|
+
# to_jiak -> JSON
|
142
140
|
#
|
143
|
-
#
|
144
|
-
#
|
141
|
+
# Called by the Core Client framework when marshalling to Jiak. This method
|
142
|
+
# does not need to be call explicitly.
|
145
143
|
def to_jiak
|
146
144
|
{ :schema =>
|
147
145
|
{ :allowed_fields => @allowed_fields,
|
@@ -149,24 +147,43 @@ module RiakRest
|
|
149
147
|
:read_mask => @read_mask,
|
150
148
|
:write_mask => @write_mask
|
151
149
|
}
|
152
|
-
}
|
150
|
+
}
|
153
151
|
end
|
154
152
|
|
153
|
+
# :call-seq:
|
154
|
+
# allowed_fields = array
|
155
|
+
#
|
156
|
+
# Set the allowed fields array. Overrides whatever fields were in the array.
|
157
|
+
# Use JiakSchema#allow to add fields to the array.
|
155
158
|
def allowed_fields=(arr) # :nodoc:
|
156
|
-
|
157
|
-
@allowed_fields = arr
|
159
|
+
@allowed_fields = transform_fields('allowed_fields',arr)
|
158
160
|
end
|
161
|
+
|
162
|
+
# :call-seq:
|
163
|
+
# required_fields = array
|
164
|
+
#
|
165
|
+
# Set the required fields array. Overrides whatever fields were in the
|
166
|
+
# array. Use JiakSchema#require to add fields to the array.
|
159
167
|
def required_fields=(arr) # :nodoc:
|
160
|
-
|
161
|
-
@required_fields = arr
|
168
|
+
@required_fields = transform_fields('required_fields',arr)
|
162
169
|
end
|
170
|
+
|
171
|
+
# :call-seq:
|
172
|
+
# read_mask = array
|
173
|
+
#
|
174
|
+
# Set the read mask array. Overrides whatever fields were in the array.
|
175
|
+
# Use JiakSchema#readable to add fields to the array.
|
163
176
|
def read_mask=(arr) # :nodoc:
|
164
|
-
|
165
|
-
@read_mask = arr
|
177
|
+
@read_mask = transform_fields('read_mask',arr)
|
166
178
|
end
|
179
|
+
|
180
|
+
# :call-seq:
|
181
|
+
# write_mask = array
|
182
|
+
#
|
183
|
+
# Set the write mask array. Overrides whatever fields were in the array.
|
184
|
+
# Use JiakSchema#writable to add fields to the array.
|
167
185
|
def write_mask=(arr) # :nodoc:
|
168
|
-
|
169
|
-
@write_mask = arr
|
186
|
+
@write_mask = transform_fields('write_mask',arr)
|
170
187
|
end
|
171
188
|
|
172
189
|
# :call-seq:
|
@@ -174,9 +191,126 @@ module RiakRest
|
|
174
191
|
#
|
175
192
|
# Set the read and write masks for a JiakSchema.
|
176
193
|
def readwrite=(arr) # :nodoc:
|
177
|
-
|
178
|
-
@read_mask =
|
179
|
-
@write_mask =
|
194
|
+
mask = transform_fields('readwrite',arr)
|
195
|
+
@read_mask = mask
|
196
|
+
@write_mask = mask
|
197
|
+
end
|
198
|
+
|
199
|
+
# :call-seq:
|
200
|
+
# allow(:f1,...,:fn) -> array
|
201
|
+
# allow([:f1,...,:fn]) -> array
|
202
|
+
#
|
203
|
+
# Add to the allowed fields array.
|
204
|
+
#
|
205
|
+
# Returns fields added to allowed fields.
|
206
|
+
def allow(*fields)
|
207
|
+
add_fields(@allowed_fields,"allow",fields)
|
208
|
+
end
|
209
|
+
|
210
|
+
# :call-seq:
|
211
|
+
# require(:f1,...,:fn) -> array
|
212
|
+
# require([:f1,...,:fn]) -> array
|
213
|
+
#
|
214
|
+
# Add fields to the required fields array. Adds the fields to the allowed
|
215
|
+
# fields as well.
|
216
|
+
#
|
217
|
+
# Returns fields added to required_fields.
|
218
|
+
def require(*fields)
|
219
|
+
added_fields = add_fields(@required_fields,"require",fields)
|
220
|
+
readwrite(*fields)
|
221
|
+
added_fields
|
222
|
+
end
|
223
|
+
|
224
|
+
# :call-seq:
|
225
|
+
# readable(:f1,...,:fn) -> array
|
226
|
+
# readable([:f1,...,:fn]) -> array
|
227
|
+
#
|
228
|
+
# Add fields to the read mask array. Adds the fields to the allowed
|
229
|
+
# fields as well.
|
230
|
+
#
|
231
|
+
# Returns fields added to read_mask
|
232
|
+
def readable(*fields)
|
233
|
+
added_fields = add_fields(@read_mask,"readable",fields)
|
234
|
+
allow(*fields)
|
235
|
+
added_fields
|
236
|
+
end
|
237
|
+
|
238
|
+
# :call-seq:
|
239
|
+
# writable(:f1,...,:fn) -> array
|
240
|
+
# writable([:f1,...,:fn]) -> array
|
241
|
+
#
|
242
|
+
# Add fields to the write mask array. Adds the fields to the allowed
|
243
|
+
# fields as well.
|
244
|
+
#
|
245
|
+
# Returns fields added to write_mask
|
246
|
+
def writable(*fields)
|
247
|
+
added_fields = add_fields(@write_mask,"writable",fields)
|
248
|
+
allow(*fields)
|
249
|
+
added_fields
|
250
|
+
end
|
251
|
+
|
252
|
+
# :call-seq:
|
253
|
+
# readwrite(:f1,...,:fn) -> nil
|
254
|
+
# readwrite([:f1,...,:fn]) -> nil
|
255
|
+
#
|
256
|
+
# Add fields to the read and write mask arrays. Adds the fields to the
|
257
|
+
# allowed fields as well.
|
258
|
+
#
|
259
|
+
# Returns nil.
|
260
|
+
def readwrite(*fields)
|
261
|
+
readable(*fields)
|
262
|
+
writable(*fields)
|
263
|
+
allow(*fields)
|
264
|
+
nil
|
265
|
+
end
|
266
|
+
|
267
|
+
# Scrub the fields by changing strings to symbols and removing any dups,
|
268
|
+
# then add new fields to arr and return added fields.
|
269
|
+
def add_fields(arr,descr,fields)
|
270
|
+
fields = fields[0] if(fields.size == 1 && fields[0].is_a?(Array))
|
271
|
+
scrubbed = transform_fields(descr,fields)
|
272
|
+
(scrubbed - arr).each {|f| arr << f}
|
273
|
+
end
|
274
|
+
private :add_fields
|
275
|
+
|
276
|
+
# :call-seq:
|
277
|
+
# allowed_fields -> array
|
278
|
+
#
|
279
|
+
# Return an array of the allowed fields. This array is a copy and cannot
|
280
|
+
# be used to update the allowed_fields array itself. Use JiakSchema#allow
|
281
|
+
# to add fields or JiakSchema#allowed_fields= to set the array.
|
282
|
+
def allowed_fields
|
283
|
+
@allowed_fields.dup
|
284
|
+
end
|
285
|
+
|
286
|
+
# :call-seq:
|
287
|
+
# required_fields -> array
|
288
|
+
#
|
289
|
+
# Return an array of the allowed fields. This array is a copy and cannot
|
290
|
+
# be used to update the required_fields array itself. Use JiakSchema#require
|
291
|
+
# to add fields or JiakSchema#required_fields= to set the array.
|
292
|
+
def required_fields
|
293
|
+
@required_fields.dup
|
294
|
+
end
|
295
|
+
|
296
|
+
# :call-seq:
|
297
|
+
# read_mask -> array
|
298
|
+
#
|
299
|
+
# Returns an array of the allowed fields. This array is a copy and cannot
|
300
|
+
# be used to update the read_mask array itself. Use JiakSchema#readable
|
301
|
+
# to add fields or JiakSchema#read_mask= to set the array.
|
302
|
+
def read_mask
|
303
|
+
@read_mask.dup
|
304
|
+
end
|
305
|
+
|
306
|
+
# :call-seq:
|
307
|
+
# write_mask -> array
|
308
|
+
#
|
309
|
+
# Returns an array of the allowed fields. This array is a copy and cannot
|
310
|
+
# be used to update the write_mask array itself. Use JiakSchema#writable
|
311
|
+
# to add fields or JiakSchema#write_mask= to set the array.
|
312
|
+
def write_mask
|
313
|
+
@write_mask.dup
|
180
314
|
end
|
181
315
|
|
182
316
|
# call-seq:
|
@@ -217,8 +351,8 @@ module RiakRest
|
|
217
351
|
'",write_mask="'+@write_mask.inspect+'"'
|
218
352
|
end
|
219
353
|
|
220
|
-
#
|
221
|
-
def
|
354
|
+
# Check for array of symbol or string elements.
|
355
|
+
def transform_fields(desc,arr)
|
222
356
|
if(arr.eql?("*"))
|
223
357
|
raise(JiakSchemaException,
|
224
358
|
"RiakRest does not support wildcard schemas at this time.")
|
@@ -231,11 +365,12 @@ module RiakRest
|
|
231
365
|
raise JiakSchemaException, "#{desc} must be strings or symbols"
|
232
366
|
end
|
233
367
|
end
|
234
|
-
unless arr.map{|f| f.to_s}.uniq.size == arr.size
|
235
|
-
|
236
|
-
end
|
368
|
+
# unless arr.map{|f| f.to_s}.uniq.size == arr.size
|
369
|
+
# raise JiakSchemaException, "#{desc} must have unique elements."
|
370
|
+
# end
|
371
|
+
arr.map{|f| f.to_sym}.uniq
|
237
372
|
end
|
238
|
-
private :
|
373
|
+
private :transform_fields
|
239
374
|
|
240
375
|
end
|
241
376
|
|