tripod 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 +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:
|