riakrest 0.0.1 → 0.0.2
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/.gitignore +18 -0
- data/History.txt +4 -1
- data/LICENSE +22 -0
- data/README.rdoc +52 -26
- data/Rakefile +55 -24
- data/VERSION +1 -0
- data/examples/auto_update_data.rb +1 -7
- data/examples/auto_update_links.rb +8 -8
- data/examples/basic_client.rb +8 -10
- data/examples/basic_resource.rb +16 -18
- data/examples/json_data_resource.rb +5 -0
- data/examples/linked_resource.rb +32 -27
- data/examples/links_only.rb +38 -0
- data/lib/riakrest/core/jiak_client.rb +5 -0
- data/lib/riakrest/core/jiak_data.rb +19 -13
- data/lib/riakrest/core/query_link.rb +1 -1
- data/lib/riakrest/resource/jiak_resource.rb +135 -54
- data/lib/riakrest/version.rb +1 -1
- data/lib/riakrest.rb +33 -30
- data/spec/resource/jiak_resource_spec.rb +388 -34
- metadata +56 -29
- data/Manifest.txt +0 -41
- data/PostInstall.txt +0 -2
- data/riakrest.gemspec +0 -38
- data/script/console +0 -10
- data/script/destroy +0 -14
- data/script/generate +0 -14
- data/tasks/rspec.rake +0 -21
data/.gitignore
ADDED
data/History.txt
CHANGED
data/LICENSE
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
(The MIT License)
|
2
|
+
|
3
|
+
Copyright (c) 2009 Paul Rogers, DingoSky
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
6
|
+
a copy of this software and associated documentation files (the
|
7
|
+
"Software"), to deal in the Software without restriction, including
|
8
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
9
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
10
|
+
permit persons to whom the Software is furnished to do so, subject to
|
11
|
+
the following conditions:
|
12
|
+
|
13
|
+
The above copyright notice and this permission notice shall be
|
14
|
+
included in all copies or substantial portions of the Software.
|
15
|
+
|
16
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
17
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
18
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
19
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
20
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
21
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
22
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.rdoc
CHANGED
@@ -1,51 +1,77 @@
|
|
1
|
-
=
|
1
|
+
= RiakRest
|
2
2
|
|
3
3
|
http://github.com/wcpr/riakrest
|
4
4
|
|
5
5
|
== DESCRIPTION:
|
6
6
|
|
7
7
|
RiakRest provides structured, RESTful interaction with a Riak document
|
8
|
-
store.
|
9
|
-
provides two levels of interaction: Core Client and Resource. Core Client
|
10
|
-
interaction works down at the Jiak level and exposes Jiak internals. Resource
|
11
|
-
interaction is an abstraction built on top of the Core Client.
|
8
|
+
store.
|
12
9
|
|
13
|
-
==
|
10
|
+
== RIAK:
|
14
11
|
|
12
|
+
Riak[http://riak.basho.com] is an open-source project developed and maintained
|
13
|
+
by the fine folks at Basho[http://www.basho.com]. It combines a decentralized
|
14
|
+
key-value store, a flexible map/reduce engine, and a friendly HTTP/JSON query
|
15
|
+
interface to provide a database ideally suited for Web applications. RiakRest
|
16
|
+
interacts with the HTTP/JSON query interface, which is called Jiak.
|
15
17
|
|
16
18
|
== SYNOPSIS:
|
17
19
|
|
20
|
+
RiakRest provides structured, RESTful interaction with the HTTP/JSON interface
|
21
|
+
of a Riak[http://riak.basho.com] document data store. RiakRest provides two
|
22
|
+
levels of interaction: Core Client and Resource. Core Client works at the Jiak
|
23
|
+
level and exposes Jiak internals. JiakResource is an abstraction built on top
|
24
|
+
of the Core Client that gives a true RESTful feel.
|
18
25
|
|
19
26
|
== REQUIREMENTS:
|
20
27
|
|
21
|
-
RestClient is used for REST server interaction
|
28
|
+
RestClient is used for REST server interaction
|
29
|
+
|
22
30
|
JSON is used for data exchange.
|
23
31
|
|
32
|
+
Riak[http://riak.basho.com] provides the HTTP/JSON Jiak interface and data
|
33
|
+
store.
|
34
|
+
|
24
35
|
== INSTALL:
|
25
36
|
|
26
37
|
sudo gem install riakrest
|
27
38
|
|
28
|
-
==
|
39
|
+
== EXAMPLE
|
40
|
+
require 'riakrest'
|
41
|
+
include RiakRest
|
42
|
+
|
43
|
+
PersonData = JiakDataHash.create(:name,:age)
|
44
|
+
PersonData.keygen :name
|
45
|
+
|
46
|
+
class Person
|
47
|
+
include JiakResource
|
48
|
+
server 'http://localhost:8002/jiak'
|
49
|
+
group 'people'
|
50
|
+
data_class PersonData
|
51
|
+
auto_post true
|
52
|
+
auto_update true
|
53
|
+
end
|
29
54
|
|
30
|
-
(
|
55
|
+
remy = Person.new(:name => 'remy',:age => 10) # (auto-post)
|
56
|
+
puts remy.name # => "remy" (auto-update)
|
31
57
|
|
32
|
-
|
58
|
+
puts Person.get('remy').name # => "remy" (from Jiak server)
|
59
|
+
puts Person.get('remy').age # => 10 (from Jiak server)
|
33
60
|
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
61
|
+
remy.age = 11 # (auto-update)
|
62
|
+
puts Person.get('remy').age # => 11 (from Jiak server)
|
63
|
+
|
64
|
+
callie = Person.new(:name => 'Callie', :age => 13)
|
65
|
+
remy.link(callie,'sister')
|
66
|
+
|
67
|
+
sisters = remy.query(Person,'sister')
|
68
|
+
puts sisters[0].eql?(callie) # => true
|
69
|
+
|
70
|
+
remy.delete
|
71
|
+
callie.delete
|
72
|
+
|
73
|
+
== LICENSE:
|
41
74
|
|
42
|
-
|
43
|
-
included in all copies or substantial portions of the Software.
|
75
|
+
Copyright (c) 2009 Paul Rogers, DingoSky. See LICENCE for details.
|
44
76
|
|
45
|
-
|
46
|
-
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
47
|
-
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
48
|
-
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
49
|
-
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
50
|
-
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
51
|
-
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
77
|
+
===Go forth and Riak!
|
data/Rakefile
CHANGED
@@ -1,24 +1,55 @@
|
|
1
|
-
require 'rubygems'
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
require '
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
1
|
+
require 'rubygems'
|
2
|
+
require 'rake'
|
3
|
+
|
4
|
+
begin
|
5
|
+
require 'jeweler'
|
6
|
+
rescue LoadError
|
7
|
+
puts "Jeweler (or a dependency) not available. Install it with: sudo gem install jeweler"
|
8
|
+
end
|
9
|
+
|
10
|
+
Jeweler::Tasks.new do |gem|
|
11
|
+
gem.name = "riakrest"
|
12
|
+
gem.summary = %Q{RiakRest provides structured, RESTful interaction with a Riak document store.}
|
13
|
+
gem.description = <<-EOH
|
14
|
+
RiakRest provides structured, RESTful interaction with
|
15
|
+
the HTTP/JSON interface of a Riak[http://riak.basho.com] document data
|
16
|
+
store. RiakRest provides two levels of interaction: Core Client and
|
17
|
+
Resource. Core Client works at the Jiak level and exposes Jiak
|
18
|
+
internals. JiakResource is an abstraction built on top of the Core Client
|
19
|
+
that gives a true RESTful feel.
|
20
|
+
EOH
|
21
|
+
gem.authors = ["Paul Rogers"]
|
22
|
+
gem.email = "paul@dingosky.com"
|
23
|
+
gem.homepage = "http://github.com/wcpr/riakrest"
|
24
|
+
gem.add_dependency('rest-client', '>= 1.0.0')
|
25
|
+
gem.add_development_dependency "rest-client", ">= 1.0.0"
|
26
|
+
gem.add_development_dependency "rspec", ">= 1.2.9"
|
27
|
+
end
|
28
|
+
|
29
|
+
Jeweler::GemcutterTasks.new
|
30
|
+
|
31
|
+
require 'spec/rake/spectask'
|
32
|
+
Spec::Rake::SpecTask.new(:spec) do |spec|
|
33
|
+
spec.libs << 'lib' << 'spec'
|
34
|
+
spec.spec_files = FileList['spec/**/*_spec.rb']
|
35
|
+
end
|
36
|
+
|
37
|
+
Spec::Rake::SpecTask.new(:rcov) do |spec|
|
38
|
+
spec.libs << 'lib' << 'spec'
|
39
|
+
spec.pattern = 'spec/**/*_spec.rb'
|
40
|
+
spec.rcov = true
|
41
|
+
end
|
42
|
+
|
43
|
+
task :test => :check_dependencies
|
44
|
+
|
45
|
+
task :default => :spec
|
46
|
+
|
47
|
+
require 'rake/rdoctask'
|
48
|
+
Rake::RDocTask.new do |rdoc|
|
49
|
+
version = File.exist?('VERSION') ? File.read('VERSION') : ""
|
50
|
+
|
51
|
+
rdoc.rdoc_dir = 'rdoc'
|
52
|
+
rdoc.title = "riakrest #{version}"
|
53
|
+
rdoc.rdoc_files.include('README*')
|
54
|
+
rdoc.rdoc_files.include('lib/**/*.rb')
|
55
|
+
end
|
data/VERSION
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
0.0.2
|
@@ -11,19 +11,14 @@ class Person
|
|
11
11
|
group 'people'
|
12
12
|
data_class PersonData
|
13
13
|
auto_post true
|
14
|
+
auto_update true
|
14
15
|
end
|
15
16
|
|
16
17
|
remy = Person.new(:name => 'remy', :age => 10)
|
17
18
|
puts Person.get('remy').name # => "remy"
|
18
19
|
|
19
20
|
remy.name = "Remy"
|
20
|
-
puts Person.get('remy').name # => "remy"
|
21
|
-
remy.update
|
22
21
|
puts Person.get('remy').name # => "Remy"
|
23
|
-
|
24
|
-
Person.auto_update true
|
25
|
-
|
26
|
-
puts Person.get('remy').age # => 10
|
27
22
|
remy.age = 12
|
28
23
|
puts Person.get('remy').age # => 12
|
29
24
|
|
@@ -45,6 +40,5 @@ remy.age = 10
|
|
45
40
|
puts Person.get('remy').age # => 10
|
46
41
|
|
47
42
|
remy.delete
|
48
|
-
callie.delete
|
49
43
|
|
50
44
|
|
@@ -17,31 +17,31 @@ remy = Person.new(:name => 'remy', :age => 10)
|
|
17
17
|
callie = Person.new(:name => 'Callie', :age => 12)
|
18
18
|
|
19
19
|
remy.link(callie,'sister')
|
20
|
-
puts remy.
|
20
|
+
puts remy.query(Person,'sister').size # => 0
|
21
21
|
remy.update
|
22
|
-
puts remy.
|
22
|
+
puts remy.query(Person,'sister').size # => 1
|
23
23
|
remy.remove_link(callie,'sister')
|
24
24
|
|
25
25
|
Person.auto_update true
|
26
26
|
remy.link(callie,'sibling')
|
27
|
-
puts remy.
|
27
|
+
puts remy.query(Person,'sibling').size # => 1
|
28
28
|
remy.remove_link(callie,'sibling')
|
29
29
|
|
30
30
|
callie.auto_update = false
|
31
31
|
callie.link(remy,'sibling')
|
32
|
-
puts callie.
|
32
|
+
puts callie.query(Person,'sibling').size # => 0
|
33
33
|
callie.update
|
34
|
-
puts callie.
|
34
|
+
puts callie.query(Person,'sibling').size # => 1
|
35
35
|
callie.remove_link(remy,'sibling')
|
36
36
|
|
37
37
|
Person.auto_update false
|
38
38
|
remy.auto_update = true
|
39
39
|
callie.auto_update = nil
|
40
40
|
remy.bi_link(callie,'sisters')
|
41
|
-
puts remy.
|
42
|
-
puts callie.
|
41
|
+
puts remy.query(Person,'sisters').size # => 1
|
42
|
+
puts callie.query(Person,'sisters').size # => 0
|
43
43
|
callie.update
|
44
|
-
puts callie.
|
44
|
+
puts callie.query(Person,'sisters').size # => 1
|
45
45
|
|
46
46
|
remy.delete
|
47
47
|
callie.delete
|
data/examples/basic_client.rb
CHANGED
@@ -11,23 +11,21 @@ remy = client.store(JiakObject.new(:bucket => bucket,
|
|
11
11
|
:data => Person.new(:name => "remy",
|
12
12
|
:age => 10)),
|
13
13
|
:object => true)
|
14
|
-
puts client.get(bucket,remy.key).data.name # => "remy"
|
15
|
-
|
16
|
-
remy.data.name # => "remy"
|
17
|
-
remy.data.name = "Remy"
|
18
|
-
client.store(remy)
|
19
|
-
puts client.get(bucket,remy.key).data.name # => "Remy"
|
20
|
-
|
21
|
-
|
22
14
|
callie = client.store(JiakObject.new(:bucket => bucket,
|
23
15
|
:data => Person.new(:name => "Callie",
|
24
16
|
:age => 12)),
|
25
17
|
:object => true)
|
26
|
-
|
18
|
+
|
19
|
+
puts client.get(bucket,remy.key).data.name # => "remy"
|
20
|
+
|
21
|
+
remy.data.name = "Remy"
|
22
|
+
remy << JiakLink.new(bucket,callie.key,'sister')
|
27
23
|
client.store(remy)
|
28
24
|
|
25
|
+
puts client.get(bucket,remy.key).data.name # => "Remy"
|
26
|
+
|
29
27
|
sisters = client.walk(bucket,remy.key,QueryLink.new(bucket,'sister'),Person)
|
30
|
-
sisters[0].eql?(callie)
|
28
|
+
puts sisters[0].eql?(callie) # => true
|
31
29
|
|
32
30
|
client.delete(bucket,remy.key)
|
33
31
|
client.delete(bucket,callie.key)
|
data/examples/basic_resource.rb
CHANGED
@@ -6,29 +6,27 @@ PersonData.keygen :name
|
|
6
6
|
|
7
7
|
class Person
|
8
8
|
include JiakResource
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
9
|
+
server 'http://localhost:8002/jiak'
|
10
|
+
group 'people'
|
11
|
+
data_class PersonData
|
12
|
+
auto_post true
|
13
|
+
auto_update true
|
14
14
|
end
|
15
15
|
|
16
|
-
remy = Person.new(:name => 'remy'
|
17
|
-
puts
|
16
|
+
remy = Person.new(:name => 'remy',:age => 10) # (auto-post)
|
17
|
+
puts remy.name # => "remy" (auto-update)
|
18
|
+
|
19
|
+
puts Person.get('remy').name # => "remy" (from Jiak server)
|
20
|
+
puts Person.get('remy').age # => 10 (from Jiak server)
|
18
21
|
|
19
|
-
remy.
|
20
|
-
remy.
|
21
|
-
puts remy.name # => "Remy"
|
22
|
-
puts Person.get('remy').name # => "Remy"
|
22
|
+
remy.age = 11 # (auto-update)
|
23
|
+
puts Person.get('remy').age # => 11 (from Jiak server)
|
23
24
|
|
24
|
-
callie = Person.new(:name => 'Callie', :age =>
|
25
|
-
remy.
|
26
|
-
callie.update
|
25
|
+
callie = Person.new(:name => 'Callie', :age => 13)
|
26
|
+
remy.link(callie,'sister')
|
27
27
|
|
28
|
-
sisters = remy.
|
29
|
-
puts sisters[0].eql?(callie)
|
28
|
+
sisters = remy.query(Person,'sister')
|
29
|
+
puts sisters[0].eql?(callie) # => true
|
30
30
|
|
31
31
|
remy.delete
|
32
32
|
callie.delete
|
33
|
-
|
34
|
-
|
data/examples/linked_resource.rb
CHANGED
@@ -10,8 +10,9 @@ class Parent
|
|
10
10
|
server 'http://localhost:8002/jiak'
|
11
11
|
group 'parents'
|
12
12
|
data_class PersonData
|
13
|
+
auto_post true
|
14
|
+
auto_update true
|
13
15
|
end
|
14
|
-
|
15
16
|
Child = Parent.copy(:group => 'children')
|
16
17
|
|
17
18
|
# relationships
|
@@ -31,8 +32,12 @@ child_parents = parent_children.inject({}) do |build, (p,cs)|
|
|
31
32
|
end
|
32
33
|
|
33
34
|
# store data and relationships
|
35
|
+
Parent.auto_post false
|
36
|
+
Parent.auto_update false
|
37
|
+
Child.auto_post false
|
38
|
+
Child.auto_update false
|
34
39
|
parent_children.each do |pname,cnames|
|
35
|
-
p = Parent.new(:name => pname)
|
40
|
+
p = Parent.new(:name => pname).post
|
36
41
|
cnames.each do |cname|
|
37
42
|
begin
|
38
43
|
c = Child.get(cname)
|
@@ -43,57 +48,54 @@ parent_children.each do |pname,cnames|
|
|
43
48
|
c.put
|
44
49
|
p.link(c,'child')
|
45
50
|
end
|
46
|
-
p.
|
51
|
+
p.update
|
47
52
|
end
|
53
|
+
Parent.auto_post true
|
54
|
+
Parent.auto_update true
|
55
|
+
Child.auto_post true
|
56
|
+
Child.auto_update true
|
48
57
|
|
49
58
|
# retrieve parents
|
50
59
|
parents = parent_children.keys.map {|p| Parent.get(p)}
|
51
60
|
p0,p1,p2,p3 = parents
|
52
|
-
p1.name # => 'p1'
|
61
|
+
puts p1.name # => 'p1'
|
53
62
|
|
54
63
|
# retrieve children
|
55
64
|
children = child_parents.keys.map {|c| Child.get(c)}
|
56
65
|
c0,c1,c2,c3 = children
|
57
|
-
c1.name # => 'c1'
|
66
|
+
puts c1.name # => 'c1'
|
58
67
|
|
59
68
|
# retrieve parent children
|
60
|
-
p0c,p1c,p2c,p3c = parents.map {|p| p.
|
61
|
-
p2c[0].name # => 'c2' (not sorted,
|
69
|
+
p0c,p1c,p2c,p3c = parents.map {|p| p.query(Child,'child')}
|
70
|
+
puts p2c[0].name # => 'c2' (not sorted, could be 'c3')
|
62
71
|
|
63
72
|
# retrieve children parents
|
64
|
-
c0p,c1p,c2p,c3p = children.map {|c| c.
|
65
|
-
c3p[0].name # => 'p3'
|
73
|
+
c0p,c1p,c2p,c3p = children.map {|c| c.query(Parent,'parent')}
|
74
|
+
puts c3p[0].name # => 'p3'
|
66
75
|
|
67
76
|
# retrieve children siblings
|
68
77
|
c0s,c1s,c2s,c3s = children.map do |c|
|
69
|
-
c.
|
78
|
+
c.query(Parent,'parent',Child,'child').delete_if{|s| s.eql?(c)}
|
70
79
|
end
|
71
|
-
c3s[0].name # => 'c2'
|
80
|
+
puts c3s[0].name # => 'c2'
|
72
81
|
|
73
82
|
# who is c3's step-sibling's other parent?
|
74
|
-
c3sp = c3.
|
83
|
+
c3sp = c3.query(Parent,'parent',Child,'child',Parent,'parent')
|
75
84
|
c3p.each {|p| c3sp.delete_if{|sp| p.eql?(sp)}}
|
76
|
-
c3sp[0].name # => "p1"
|
85
|
+
puts c3sp[0].name # => "p1"
|
77
86
|
|
78
87
|
# add sibling links
|
79
88
|
children.each do |c|
|
80
|
-
siblings = c.
|
89
|
+
siblings = c.query(Parent,'parent',Child,'child').delete_if{|s| s.eql?(c)}
|
81
90
|
siblings.each {|s| c.link(s,'sibling')}
|
82
91
|
c.update
|
83
92
|
end
|
84
|
-
c1.
|
93
|
+
puts c1.query(Child,'sibling').size # => 2
|
85
94
|
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
95
|
# some folks are odd, and others are normal
|
94
96
|
parent_children.keys.each do |p|
|
95
97
|
parent = Parent.get(p)
|
96
|
-
p_children = parent.
|
98
|
+
p_children = parent.query(Child,'child')
|
97
99
|
p_children.each do |child|
|
98
100
|
child.link(parent, p[1].to_i.odd? ? 'odd' : 'normal')
|
99
101
|
child.update
|
@@ -102,12 +104,15 @@ parent_children.keys.each do |p|
|
|
102
104
|
parent.update
|
103
105
|
end
|
104
106
|
# refresh parents and children variables
|
105
|
-
parents.each {|p| p.
|
106
|
-
children.each {|c| c.
|
107
|
+
parents.each {|p| p.refresh}
|
108
|
+
children.each {|c| c.refresh}
|
107
109
|
|
108
110
|
# do any odd parents have normal children?
|
109
111
|
op = parents.inject([]) do |build,parent|
|
110
|
-
build << parent.
|
112
|
+
build << parent.query(Child,'normal',Parent,'odd')
|
111
113
|
build.flatten.uniq
|
112
114
|
end
|
113
|
-
op[0].name # => 'p1'
|
115
|
+
puts op[0].name # => 'p1'
|
116
|
+
|
117
|
+
parents.each {|p| p.delete}
|
118
|
+
children.each {|c| c.delete}
|
@@ -0,0 +1,38 @@
|
|
1
|
+
require 'riakrest'
|
2
|
+
include RiakRest
|
3
|
+
|
4
|
+
# class with 10 fields
|
5
|
+
class Full
|
6
|
+
include JiakResource
|
7
|
+
server 'http://localhost:8002/jiak'
|
8
|
+
group 'fields'
|
9
|
+
data_class JiakDataHash.create (0...10).map {|n| "f#{n}".to_sym}
|
10
|
+
auto_post true
|
11
|
+
auto_update true
|
12
|
+
end
|
13
|
+
|
14
|
+
# copy of above, but no read/write fields, i.e., only links
|
15
|
+
LinksOnly = JiakDataHash.create Full.schema
|
16
|
+
LinksOnly.readwrite []
|
17
|
+
Links = Full.copy(:data_class => LinksOnly)
|
18
|
+
|
19
|
+
# populate two Full objects with (meaningless) stuff
|
20
|
+
Full.pov
|
21
|
+
full1,full2 =
|
22
|
+
["full1","full2"].map {|o| Full.new(Full.schema.write_mask.inject({}) do |h,f|
|
23
|
+
h[f]="#{o.upcase}-#{f.hash}"
|
24
|
+
h
|
25
|
+
end)}
|
26
|
+
|
27
|
+
Links.pov
|
28
|
+
links1 = Links.get(full1.jiak.key)
|
29
|
+
links1.link(full2,'link')
|
30
|
+
|
31
|
+
Full.pov
|
32
|
+
full2.f1 = "new f1"
|
33
|
+
|
34
|
+
linked = full1.query(Full,'link')[0]
|
35
|
+
puts linked.f1 == full2.f1 # => true
|
36
|
+
|
37
|
+
full1.delete
|
38
|
+
full2.delete
|
@@ -178,6 +178,11 @@ module RiakRest
|
|
178
178
|
begin
|
179
179
|
uri = jiak_uri(bucket,key,req_params)
|
180
180
|
resp = RestClient.get(uri, :accept => APP_JSON)
|
181
|
+
|
182
|
+
# puts
|
183
|
+
# puts "---CxDEBUG---"
|
184
|
+
# puts " #{resp}"
|
185
|
+
|
181
186
|
JiakObject.from_jiak(JSON.parse(resp),bucket.data_class)
|
182
187
|
rescue RestClient::ResourceNotFound => err
|
183
188
|
raise JiakResourceNotFound, "failed get: #{err.message}"
|
@@ -89,19 +89,27 @@ module RiakRest
|
|
89
89
|
|
90
90
|
# :call-seq:
|
91
91
|
# allowed :f1, ..., :fn -> array
|
92
|
+
# allowed [:f1, ..., :fn] -> array
|
92
93
|
#
|
93
94
|
# Fields allowed in Jiak interactions. Returns an array of the allowed
|
94
95
|
# fields.
|
95
96
|
#
|
97
|
+
# The field <code>jiak</code> is reserved for RiakRest.
|
98
|
+
#
|
99
|
+
# Raise JiakDataException if the fields include <code>jiak</code>.
|
96
100
|
def allowed(*fields)
|
97
|
-
|
98
|
-
|
101
|
+
if(fields.include?(:jiak) || fields.include?('jiak'))
|
102
|
+
raise JiakDataException, "jiak field name reserved for RiakRest"
|
103
|
+
end
|
104
|
+
arr_fields = transform_fields(*fields)
|
105
|
+
arr_fields.each {|field| attr_accessor field}
|
99
106
|
@schema = JiakSchema.new(arr_fields)
|
100
107
|
arr_fields
|
101
108
|
end
|
102
109
|
|
103
110
|
# :call-seq:
|
104
111
|
# required :f1, ..., :fn -> array
|
112
|
+
# required [:f1, ..., :fn] -> array
|
105
113
|
#
|
106
114
|
# Fields required during in Jiak interactions. Returns an array of the
|
107
115
|
# required fields.
|
@@ -112,6 +120,7 @@ module RiakRest
|
|
112
120
|
|
113
121
|
# :call-seq:
|
114
122
|
# readable :f1, ..., :fn -> array
|
123
|
+
# readable [:f1, ..., :fn] -> array
|
115
124
|
#
|
116
125
|
# Fields returned by Jiak on retrieval. Returns an array of the fields in
|
117
126
|
# the read mask.
|
@@ -122,6 +131,7 @@ module RiakRest
|
|
122
131
|
|
123
132
|
# :call-seq:
|
124
133
|
# writable :f1, ..., :fn -> arry
|
134
|
+
# writable [:f1, ..., :fn] -> arry
|
125
135
|
#
|
126
136
|
# Fields that can be written during Jiak interaction. Returns an array of
|
127
137
|
# the fields in the write mask.
|
@@ -132,6 +142,7 @@ module RiakRest
|
|
132
142
|
|
133
143
|
# :call-seq:
|
134
144
|
# readwrite :f1, ..., :fn -> array
|
145
|
+
# readwrite [:f1, ..., :fn] -> array
|
135
146
|
#
|
136
147
|
# Set the read and write masks to the same fields. Returns an array of
|
137
148
|
# the fields in the masks.
|
@@ -141,7 +152,7 @@ module RiakRest
|
|
141
152
|
end
|
142
153
|
|
143
154
|
def set_fields(which,*fields)
|
144
|
-
arr_fields =
|
155
|
+
arr_fields = transform_fields(*fields)
|
145
156
|
check_allowed(arr_fields)
|
146
157
|
@schema.send("#{which}=",arr_fields)
|
147
158
|
arr_fields
|
@@ -181,21 +192,16 @@ module RiakRest
|
|
181
192
|
# end
|
182
193
|
# </code>
|
183
194
|
#
|
184
|
-
# Raise JiakDataException if not explicitly defined by user-
|
195
|
+
# Raise JiakDataException if not explicitly defined by user-data class.
|
185
196
|
def jiak_create(json)
|
186
197
|
raise JiakDataException, "#{self} must define jiak_create"
|
187
198
|
end
|
188
199
|
|
189
|
-
def
|
190
|
-
|
191
|
-
|
192
|
-
else
|
193
|
-
array = fields
|
194
|
-
end
|
195
|
-
array.map {|field| field}
|
196
|
-
array
|
200
|
+
def transform_fields(*fields)
|
201
|
+
fields = fields[0] if(fields[0].is_a?(Array))
|
202
|
+
fields.map {|f| f.to_sym}
|
197
203
|
end
|
198
|
-
private :
|
204
|
+
private :transform_fields
|
199
205
|
|
200
206
|
def check_allowed(fields)
|
201
207
|
allowed_fields = @schema.allowed_fields
|