tripod 0.0.1 → 0.0.2
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +1 -0
- data/Gemfile +4 -0
- data/LICENSE +1 -1
- data/README.md +5 -1
- data/Rakefile +13 -0
- data/lib/tripod.rb +72 -1
- data/lib/tripod/attributes.rb +80 -0
- data/lib/tripod/components.rb +23 -0
- data/lib/tripod/errors.rb +4 -0
- data/lib/tripod/errors/resource_not_found.rb +8 -0
- data/lib/tripod/errors/uri_not_set.rb +9 -0
- data/lib/tripod/errors/validations.rb +18 -0
- data/lib/tripod/fields.rb +7 -0
- data/lib/tripod/finders.rb +44 -0
- data/lib/tripod/persistence.rb +68 -0
- data/lib/tripod/repository.rb +43 -0
- data/lib/tripod/resource.rb +110 -0
- data/lib/tripod/sparql_client.rb +101 -0
- data/lib/tripod/state.rb +47 -0
- data/lib/tripod/version.rb +1 -1
- data/spec/app/models/person.rb +5 -0
- data/spec/spec_helper.rb +35 -0
- data/spec/tripod/attributes_spec.rb +103 -0
- data/spec/tripod/finders_spec.rb +71 -0
- data/spec/tripod/persistence_spec.rb +103 -0
- data/spec/tripod/repository_spec.rb +60 -0
- data/spec/tripod/resource_spec.rb +63 -0
- data/spec/tripod/state_spec.rb +93 -0
- data/tripod.gemspec +11 -0
- metadata +112 -6
@@ -0,0 +1,103 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
describe Tripod::Persistence do
|
4
|
+
|
5
|
+
let(:unsaved_person) do
|
6
|
+
@unsaved_uri = @uri = 'http://uri'
|
7
|
+
@graph1 = RDF::Graph.new
|
8
|
+
stmt = RDF::Statement.new
|
9
|
+
stmt.subject = RDF::URI.new(@uri)
|
10
|
+
stmt.predicate = RDF::URI.new('http://pred')
|
11
|
+
stmt.object = RDF::URI.new('http://obj')
|
12
|
+
@graph1 << stmt
|
13
|
+
p = Person.new(@uri, 'http://graph')
|
14
|
+
p.hydrate!(@graph1)
|
15
|
+
p
|
16
|
+
end
|
17
|
+
|
18
|
+
let(:saved_person) do
|
19
|
+
@saved_uri = @uri2 = 'http://uri2'
|
20
|
+
@graph2 = RDF::Graph.new
|
21
|
+
stmt = RDF::Statement.new
|
22
|
+
stmt.subject = RDF::URI.new(@uri2)
|
23
|
+
stmt.predicate = RDF::URI.new('http://pred2')
|
24
|
+
stmt.object = RDF::URI.new('http://obj2')
|
25
|
+
@graph2 << stmt
|
26
|
+
p = Person.new(@uri2, 'http://graph')
|
27
|
+
p.hydrate!(@graph2)
|
28
|
+
p.save
|
29
|
+
p
|
30
|
+
end
|
31
|
+
|
32
|
+
describe "#save" do
|
33
|
+
|
34
|
+
context 'graph not set' do
|
35
|
+
it 'should not succeed' do
|
36
|
+
unsaved_person.graph_uri = nil
|
37
|
+
unsaved_person.save.should be_false
|
38
|
+
unsaved_person.should_not be_valid
|
39
|
+
unsaved_person.errors.should_not be_empty
|
40
|
+
unsaved_person.errors[:graph_uri].length.should ==1
|
41
|
+
unsaved_person.errors[:graph_uri].should == ["can't be blank"]
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
context 'uri not set' do
|
46
|
+
it 'should not succeed' do
|
47
|
+
unsaved_person.uri = nil
|
48
|
+
unsaved_person.save.should be_false
|
49
|
+
unsaved_person.should_not be_valid
|
50
|
+
unsaved_person.errors.should_not be_empty
|
51
|
+
unsaved_person.errors[:uri].length.should ==1
|
52
|
+
unsaved_person.errors[:uri].should == ["can't be blank"]
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
context 'graph and uri set' do
|
57
|
+
|
58
|
+
it 'saves the contents to the db' do
|
59
|
+
unsaved_person.save.should be_true
|
60
|
+
|
61
|
+
# try reading the data back out.
|
62
|
+
p2 = Person.new(@uri)
|
63
|
+
p2.hydrate!
|
64
|
+
repo_statements = p2.repository.statements
|
65
|
+
repo_statements.count.should == 1
|
66
|
+
repo_statements.first.subject.should == RDF::URI.new(@uri)
|
67
|
+
repo_statements.first.predicate.should == RDF::URI.new('http://pred')
|
68
|
+
repo_statements.first.object.should == RDF::URI.new('http://obj')
|
69
|
+
end
|
70
|
+
|
71
|
+
it 'should leave other people untouched' do
|
72
|
+
# save the unsaved person
|
73
|
+
unsaved_person.save.should be_true
|
74
|
+
|
75
|
+
# read the saved person back out the db, and check he's untouched.
|
76
|
+
p2 = Person.new(saved_person.uri)
|
77
|
+
p2.hydrate!
|
78
|
+
p2.repository.dump(:ntriples).should == saved_person.repository.dump(:ntriples)
|
79
|
+
end
|
80
|
+
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
describe "#destroy" do
|
85
|
+
|
86
|
+
it 'removes all triples from the db' do
|
87
|
+
saved_person.destroy.should be_true
|
88
|
+
|
89
|
+
# re-load it back into memory
|
90
|
+
p2 = Person.new(@saved_uri)
|
91
|
+
p2.hydrate!
|
92
|
+
p2.repository.should be_empty # nothing there any more!
|
93
|
+
end
|
94
|
+
|
95
|
+
end
|
96
|
+
|
97
|
+
describe "#save!" do
|
98
|
+
it 'throws an exception if save fails' do
|
99
|
+
unsaved_person.uri = nil
|
100
|
+
lambda {unsaved_person.save!}.should raise_error(Tripod::Errors::Validations)
|
101
|
+
end
|
102
|
+
end
|
103
|
+
end
|
@@ -0,0 +1,60 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
describe Tripod::Repository do
|
4
|
+
|
5
|
+
describe "#hydrate" do
|
6
|
+
|
7
|
+
context 'no uri set' do
|
8
|
+
let(:person) do
|
9
|
+
Person.new
|
10
|
+
end
|
11
|
+
|
12
|
+
it 'rasies a UriNotSet error' do
|
13
|
+
lambda { person.hydrate! }.should raise_error(Tripod::Errors::UriNotSet)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
context 'uri set' do
|
18
|
+
|
19
|
+
before do
|
20
|
+
@uri = 'http://foobar'
|
21
|
+
@graph = RDF::Graph.new
|
22
|
+
@stmt = RDF::Statement.new
|
23
|
+
@stmt.subject = RDF::URI.new(@uri)
|
24
|
+
@stmt.predicate = RDF::URI.new('http://pred')
|
25
|
+
@stmt.object = RDF::URI.new('http://obj')
|
26
|
+
@graph << @stmt
|
27
|
+
@graph_nt = @graph.dump(:ntriples)
|
28
|
+
end
|
29
|
+
|
30
|
+
let(:person) do
|
31
|
+
Person.new(@uri)
|
32
|
+
end
|
33
|
+
|
34
|
+
context 'no graph passed' do
|
35
|
+
it 'populates the repository with a graph of triples from the db' do
|
36
|
+
Tripod::SparqlClient::Query.should_receive(:describe).with("DESCRIBE <#{@uri}>").and_return(@graph_nt)
|
37
|
+
person.hydrate!
|
38
|
+
person.repository.should_not be_empty
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
context 'graph passed' do
|
43
|
+
it 'populates the repository with the graph of triples passed in, ingoring triples not about this resource' do
|
44
|
+
|
45
|
+
@graph << RDF::Statement.new( 'http://anotherresource', 'http://pred', 'http://obj')
|
46
|
+
@graph.statements.count.should ==2
|
47
|
+
|
48
|
+
person.hydrate!(@graph)
|
49
|
+
person.repository.should_not be_empty
|
50
|
+
person.repository.statements.count.should == 1 # not the extra one.
|
51
|
+
person.repository.statements.first.should == @stmt
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
end
|
56
|
+
|
57
|
+
end
|
58
|
+
|
59
|
+
|
60
|
+
end
|
@@ -0,0 +1,63 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
describe Tripod::Resource do
|
4
|
+
|
5
|
+
describe "#initialize" do
|
6
|
+
|
7
|
+
let(:person) do
|
8
|
+
Person.new()
|
9
|
+
end
|
10
|
+
|
11
|
+
it "initialises an empty repo" do
|
12
|
+
person.repository.class.should == RDF::Repository
|
13
|
+
person.repository.should be_empty
|
14
|
+
end
|
15
|
+
|
16
|
+
context 'uri passed in' do
|
17
|
+
|
18
|
+
context 'graph passed in' do
|
19
|
+
let(:person) do
|
20
|
+
Person.new('http://foobar', 'http://graph')
|
21
|
+
end
|
22
|
+
|
23
|
+
it 'sets the uri instance variable' do
|
24
|
+
person.uri.should == RDF::URI.new('http://foobar')
|
25
|
+
end
|
26
|
+
|
27
|
+
it 'sets the graph_uri instance variable' do
|
28
|
+
person.graph_uri.should == RDF::URI.new('http://graph')
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
context 'no graph passed in' do
|
33
|
+
let(:person) do
|
34
|
+
Person.new('http://foobar')
|
35
|
+
end
|
36
|
+
|
37
|
+
it 'sets the uri instance variable' do
|
38
|
+
person.uri.should == RDF::URI.new('http://foobar')
|
39
|
+
end
|
40
|
+
|
41
|
+
it 'doesn\'t set the graph_uri instance variable' do
|
42
|
+
person.graph_uri.should be_nil
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
end
|
47
|
+
|
48
|
+
context 'no uri or graph passed in' do
|
49
|
+
|
50
|
+
let(:person) do
|
51
|
+
Person.new
|
52
|
+
end
|
53
|
+
|
54
|
+
it 'uri and graph should be nil' do
|
55
|
+
person.uri.should be_nil
|
56
|
+
person.graph_uri.should be_nil
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
end
|
61
|
+
|
62
|
+
|
63
|
+
end
|
@@ -0,0 +1,93 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
describe Tripod::State do
|
4
|
+
|
5
|
+
describe "#new_record?" do
|
6
|
+
|
7
|
+
context "when calling new on the resource" do
|
8
|
+
|
9
|
+
let(:person) do
|
10
|
+
Person.new
|
11
|
+
end
|
12
|
+
|
13
|
+
it "returns true" do
|
14
|
+
person.should be_a_new_record
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
context "when the object has been saved" do
|
19
|
+
|
20
|
+
let(:person) do
|
21
|
+
p = Person.new('http://uri', 'http://graph')
|
22
|
+
p.save
|
23
|
+
p
|
24
|
+
end
|
25
|
+
|
26
|
+
it "returns false" do
|
27
|
+
person.should_not be_a_new_record
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
describe "#persisted?" do
|
33
|
+
|
34
|
+
let(:person) do
|
35
|
+
Person.new('http://uri', 'http://graph')
|
36
|
+
end
|
37
|
+
|
38
|
+
it "delegates to new_record?" do
|
39
|
+
person.should_not be_persisted
|
40
|
+
end
|
41
|
+
|
42
|
+
context "when the object has been destroyed" do
|
43
|
+
before do
|
44
|
+
person.save.should == true # check it worked
|
45
|
+
person.destroy
|
46
|
+
end
|
47
|
+
|
48
|
+
it "returns false" do
|
49
|
+
person.should_not be_persisted
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
describe "destroyed?" do
|
55
|
+
|
56
|
+
let(:person) do
|
57
|
+
Person.new
|
58
|
+
end
|
59
|
+
|
60
|
+
context "when destroyed is true" do
|
61
|
+
|
62
|
+
before do
|
63
|
+
person.destroyed = true
|
64
|
+
end
|
65
|
+
|
66
|
+
it "returns true" do
|
67
|
+
person.should be_destroyed
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
context "when destroyed is false" do
|
72
|
+
|
73
|
+
before do
|
74
|
+
person.destroyed = false
|
75
|
+
end
|
76
|
+
|
77
|
+
it "returns true" do
|
78
|
+
person.should_not be_destroyed
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
context "when destroyed is nil" do
|
83
|
+
|
84
|
+
before do
|
85
|
+
person.destroyed = nil
|
86
|
+
end
|
87
|
+
|
88
|
+
it "returns false" do
|
89
|
+
person.should_not be_destroyed
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|
93
|
+
end
|
data/tripod.gemspec
CHANGED
@@ -14,4 +14,15 @@ Gem::Specification.new do |gem|
|
|
14
14
|
gem.name = "tripod"
|
15
15
|
gem.require_paths = ["lib"]
|
16
16
|
gem.version = Tripod::VERSION
|
17
|
+
|
18
|
+
gem.required_rubygems_version = ">= 1.3.6"
|
19
|
+
gem.rubyforge_project = "tripod"
|
20
|
+
|
21
|
+
gem.add_dependency "rest-client"
|
22
|
+
gem.add_dependency "activemodel", "~> 3.1"
|
23
|
+
gem.add_dependency "equivalent-xml"
|
24
|
+
gem.add_dependency "rdf", "~> 0.3"
|
25
|
+
gem.add_dependency "rdf-rdfxml"
|
26
|
+
gem.add_dependency "rdf-n3"
|
27
|
+
gem.add_dependency "rdf-json"
|
17
28
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: tripod
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.2
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,8 +9,85 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-08-
|
13
|
-
dependencies:
|
12
|
+
date: 2012-08-27 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: rest-client
|
16
|
+
requirement: &70292958584520 !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '0'
|
22
|
+
type: :runtime
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: *70292958584520
|
25
|
+
- !ruby/object:Gem::Dependency
|
26
|
+
name: activemodel
|
27
|
+
requirement: &70292958583980 !ruby/object:Gem::Requirement
|
28
|
+
none: false
|
29
|
+
requirements:
|
30
|
+
- - ~>
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: '3.1'
|
33
|
+
type: :runtime
|
34
|
+
prerelease: false
|
35
|
+
version_requirements: *70292958583980
|
36
|
+
- !ruby/object:Gem::Dependency
|
37
|
+
name: equivalent-xml
|
38
|
+
requirement: &70292958583560 !ruby/object:Gem::Requirement
|
39
|
+
none: false
|
40
|
+
requirements:
|
41
|
+
- - ! '>='
|
42
|
+
- !ruby/object:Gem::Version
|
43
|
+
version: '0'
|
44
|
+
type: :runtime
|
45
|
+
prerelease: false
|
46
|
+
version_requirements: *70292958583560
|
47
|
+
- !ruby/object:Gem::Dependency
|
48
|
+
name: rdf
|
49
|
+
requirement: &70292958583020 !ruby/object:Gem::Requirement
|
50
|
+
none: false
|
51
|
+
requirements:
|
52
|
+
- - ~>
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0.3'
|
55
|
+
type: :runtime
|
56
|
+
prerelease: false
|
57
|
+
version_requirements: *70292958583020
|
58
|
+
- !ruby/object:Gem::Dependency
|
59
|
+
name: rdf-rdfxml
|
60
|
+
requirement: &70292958582600 !ruby/object:Gem::Requirement
|
61
|
+
none: false
|
62
|
+
requirements:
|
63
|
+
- - ! '>='
|
64
|
+
- !ruby/object:Gem::Version
|
65
|
+
version: '0'
|
66
|
+
type: :runtime
|
67
|
+
prerelease: false
|
68
|
+
version_requirements: *70292958582600
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: rdf-n3
|
71
|
+
requirement: &70292958582140 !ruby/object:Gem::Requirement
|
72
|
+
none: false
|
73
|
+
requirements:
|
74
|
+
- - ! '>='
|
75
|
+
- !ruby/object:Gem::Version
|
76
|
+
version: '0'
|
77
|
+
type: :runtime
|
78
|
+
prerelease: false
|
79
|
+
version_requirements: *70292958582140
|
80
|
+
- !ruby/object:Gem::Dependency
|
81
|
+
name: rdf-json
|
82
|
+
requirement: &70292958581720 !ruby/object:Gem::Requirement
|
83
|
+
none: false
|
84
|
+
requirements:
|
85
|
+
- - ! '>='
|
86
|
+
- !ruby/object:Gem::Version
|
87
|
+
version: '0'
|
88
|
+
type: :runtime
|
89
|
+
prerelease: false
|
90
|
+
version_requirements: *70292958581720
|
14
91
|
description: RDF ruby ORM
|
15
92
|
email:
|
16
93
|
- ric@swirrl.com
|
@@ -24,7 +101,28 @@ files:
|
|
24
101
|
- README.md
|
25
102
|
- Rakefile
|
26
103
|
- lib/tripod.rb
|
104
|
+
- lib/tripod/attributes.rb
|
105
|
+
- lib/tripod/components.rb
|
106
|
+
- lib/tripod/errors.rb
|
107
|
+
- lib/tripod/errors/resource_not_found.rb
|
108
|
+
- lib/tripod/errors/uri_not_set.rb
|
109
|
+
- lib/tripod/errors/validations.rb
|
110
|
+
- lib/tripod/fields.rb
|
111
|
+
- lib/tripod/finders.rb
|
112
|
+
- lib/tripod/persistence.rb
|
113
|
+
- lib/tripod/repository.rb
|
114
|
+
- lib/tripod/resource.rb
|
115
|
+
- lib/tripod/sparql_client.rb
|
116
|
+
- lib/tripod/state.rb
|
27
117
|
- lib/tripod/version.rb
|
118
|
+
- spec/app/models/person.rb
|
119
|
+
- spec/spec_helper.rb
|
120
|
+
- spec/tripod/attributes_spec.rb
|
121
|
+
- spec/tripod/finders_spec.rb
|
122
|
+
- spec/tripod/persistence_spec.rb
|
123
|
+
- spec/tripod/repository_spec.rb
|
124
|
+
- spec/tripod/resource_spec.rb
|
125
|
+
- spec/tripod/state_spec.rb
|
28
126
|
- tripod.gemspec
|
29
127
|
homepage: ''
|
30
128
|
licenses: []
|
@@ -43,12 +141,20 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
43
141
|
requirements:
|
44
142
|
- - ! '>='
|
45
143
|
- !ruby/object:Gem::Version
|
46
|
-
version:
|
144
|
+
version: 1.3.6
|
47
145
|
requirements: []
|
48
|
-
rubyforge_project:
|
146
|
+
rubyforge_project: tripod
|
49
147
|
rubygems_version: 1.8.15
|
50
148
|
signing_key:
|
51
149
|
specification_version: 3
|
52
150
|
summary: Active Model style RDF ORM
|
53
|
-
test_files:
|
151
|
+
test_files:
|
152
|
+
- spec/app/models/person.rb
|
153
|
+
- spec/spec_helper.rb
|
154
|
+
- spec/tripod/attributes_spec.rb
|
155
|
+
- spec/tripod/finders_spec.rb
|
156
|
+
- spec/tripod/persistence_spec.rb
|
157
|
+
- spec/tripod/repository_spec.rb
|
158
|
+
- spec/tripod/resource_spec.rb
|
159
|
+
- spec/tripod/state_spec.rb
|
54
160
|
has_rdoc:
|