tripod 0.0.10 → 0.2

Sign up to get free protection for your applications and to get access to all the features.
@@ -18,8 +18,8 @@ describe Tripod::Finders do
18
18
  stmt.object = RDF::URI.new('http://bill')
19
19
  stmts << stmt
20
20
 
21
- r = Person.new(@ric_uri, 'http://people')
22
- r.hydrate!(stmts)
21
+ r = Person.new(@ric_uri)
22
+ r.hydrate!(:graph => stmts)
23
23
  r.save
24
24
  r
25
25
  end
@@ -32,8 +32,8 @@ describe Tripod::Finders do
32
32
  stmt.predicate = RDF::URI.new('http://name')
33
33
  stmt.object = "bill"
34
34
  stmts << stmt
35
- b = Person.new(@bill_uri, 'http://people')
36
- b.hydrate!(stmts)
35
+ b = Person.new(@bill_uri)
36
+ b.hydrate!(:graph => stmts)
37
37
  b.save
38
38
  b
39
39
  end
@@ -41,38 +41,33 @@ describe Tripod::Finders do
41
41
  describe '.find' do
42
42
 
43
43
  context 'when record exists' do
44
-
45
- it 'does not error' do
46
- r = Person.find(ric.uri)
47
- end
44
+ let(:person) { Person.find(ric.uri) }
48
45
 
49
46
  it 'hydrates and return an object' do
50
- r = Person.find(ric.uri)
51
- r['http://name'].should == [RDF::Literal.new("ric")]
52
- r['http://knows'].should == [RDF::URI.new('http://bill')]
47
+ person.name.should == "ric"
48
+ person.knows.should == [RDF::URI('http://bill')]
53
49
  end
54
50
 
55
51
  it 'sets the graph on the instantiated object' do
56
- r = Person.find(ric.uri)
57
- r.graph_uri.should_not be_nil
58
- r.graph_uri.should == RDF::URI("http://people")
52
+ person.graph_uri.should_not be_nil
53
+ person.graph_uri.should == RDF::URI("http://graph")
59
54
  end
60
55
 
61
56
  it "returns a non-new record" do
62
- r = Person.find(ric.uri)
63
- r.new_record?.should be_false
57
+ person.new_record?.should be_false
64
58
  end
65
59
 
66
60
  end
67
61
 
68
62
  context 'when record does not exist' do
69
63
  it 'raises not found' do
70
- lambda { Person.find('http://nonexistant') }.should raise_error(Tripod::Errors::ResourceNotFound)
64
+ lambda { Person.find('http://nonexistent') }.should raise_error(Tripod::Errors::ResourceNotFound)
71
65
  end
72
66
  end
73
67
 
68
+ context 'with a given graph URI' do
74
69
 
75
-
70
+ end
76
71
  end
77
72
 
78
73
  describe '.where' do
@@ -90,7 +85,7 @@ describe Tripod::Finders do
90
85
  res.last.should == bill
91
86
 
92
87
  res.first.name.should == "ric"
93
- res.first['http://knows'].should == [RDF::URI.new("http://bill")]
88
+ res.first.knows.should == [RDF::URI.new("http://bill")]
94
89
  end
95
90
 
96
91
  it 'uses the uri and graph variables if supplied' do
@@ -4,14 +4,15 @@ describe Tripod::Persistence do
4
4
 
5
5
  let(:unsaved_person) do
6
6
  @unsaved_uri = @uri = 'http://uri'
7
- @graph1 = RDF::Graph.new
7
+ @graph_uri = 'http://graph'
8
+ @graph1 = RDF::Graph.new(@graph_uri)
8
9
  stmt = RDF::Statement.new
9
10
  stmt.subject = RDF::URI.new(@uri)
10
11
  stmt.predicate = RDF::URI.new('http://pred')
11
12
  stmt.object = RDF::URI.new('http://obj')
12
13
  @graph1 << stmt
13
14
  p = Person.new(@uri, 'http://graph')
14
- p.hydrate!(@graph1)
15
+ p.hydrate!(:graph => @graph1)
15
16
  p
16
17
  end
17
18
 
@@ -24,65 +25,38 @@ describe Tripod::Persistence do
24
25
  stmt.object = RDF::URI.new('http://obj2')
25
26
  @graph2 << stmt
26
27
  p = Person.new(@uri2, 'http://graph')
27
- p.hydrate!(@graph2)
28
+ p.hydrate!(:graph => @graph2)
28
29
  p.save
29
30
  p
30
31
  end
31
32
 
32
33
 
33
- describe "#save" do
34
+ describe ".save" do
35
+ it 'saves the contents to the db' do
36
+ unsaved_person.save.should be_true
34
37
 
35
- context 'graph not set' do
36
- it 'should not succeed' do
37
- unsaved_person.graph_uri = nil
38
- unsaved_person.save.should be_false
39
- unsaved_person.should_not be_valid
40
- unsaved_person.errors.should_not be_empty
41
- unsaved_person.errors[:graph_uri].length.should ==1
42
- unsaved_person.errors[:graph_uri].should == ["can't be blank"]
43
- end
44
- end
45
-
46
- context 'uri not set' do
47
- it 'should not succeed' do
48
- unsaved_person.uri = nil
49
- unsaved_person.save.should be_false
50
- unsaved_person.should_not be_valid
51
- unsaved_person.errors.should_not be_empty
52
- unsaved_person.errors[:uri].length.should ==1
53
- unsaved_person.errors[:uri].should == ["can't be blank"]
54
- end
38
+ # try reading the data back out.
39
+ p2 = Person.new(@uri)
40
+ p2.hydrate!
41
+ repo_statements = p2.repository.statements
42
+ repo_statements.count.should == 1
43
+ repo_statements.first.subject.should == RDF::URI.new(@uri)
44
+ repo_statements.first.predicate.should == RDF::URI.new('http://pred')
45
+ repo_statements.first.object.should == RDF::URI.new('http://obj')
55
46
  end
56
47
 
57
- context 'graph and uri set' do
58
-
59
- it 'saves the contents to the db' do
60
- unsaved_person.save.should be_true
61
-
62
- # try reading the data back out.
63
- p2 = Person.new(@uri)
64
- p2.hydrate!
65
- repo_statements = p2.repository.statements
66
- repo_statements.count.should == 1
67
- repo_statements.first.subject.should == RDF::URI.new(@uri)
68
- repo_statements.first.predicate.should == RDF::URI.new('http://pred')
69
- repo_statements.first.object.should == RDF::URI.new('http://obj')
70
- end
71
-
72
- it 'should leave other people untouched' do
73
- # save the unsaved person
74
- unsaved_person.save.should be_true
75
-
76
- # read the saved person back out the db, and check he's untouched.
77
- p2 = Person.new(saved_person.uri)
78
- p2.hydrate!
79
- p2.repository.dump(:ntriples).should == saved_person.repository.dump(:ntriples)
80
- end
48
+ it 'should leave other people untouched' do
49
+ # save the unsaved person
50
+ unsaved_person.save.should be_true
81
51
 
52
+ # read the saved person back out the db, and check he's untouched.
53
+ p2 = Person.new(saved_person.uri)
54
+ p2.hydrate!
55
+ p2.repository.dump(:ntriples).should == saved_person.repository.dump(:ntriples)
82
56
  end
83
57
  end
84
58
 
85
- describe "#destroy" do
59
+ describe ".destroy" do
86
60
 
87
61
  it 'removes all triples from the db' do
88
62
  saved_person.destroy.should be_true
@@ -95,42 +69,72 @@ describe Tripod::Persistence do
95
69
 
96
70
  end
97
71
 
98
- describe "#save!" do
72
+ describe ".save!" do
99
73
  it 'throws an exception if save fails' do
100
- unsaved_person.uri = nil
74
+ unsaved_person.stub(:graph_uri).and_return(nil) # force a failure
101
75
  lambda {unsaved_person.save!}.should raise_error(Tripod::Errors::Validations)
102
76
  end
103
77
  end
104
78
 
79
+ describe '.update_attribute' do
80
+ let (:person) { Person.new('http://newperson') }
81
+ before { person.stub(:save) }
82
+
83
+ it 'should write the attribute' do
84
+ person.update_attribute(:name, 'Bob')
85
+ person.name.should == 'Bob'
86
+ end
87
+
88
+ it 'should save the record' do
89
+ person.should_receive(:save)
90
+ person.update_attribute(:name, 'Bob')
91
+ end
92
+ end
93
+
94
+ describe '.update_attributes' do
95
+ let (:person) { Person.new('http://newperson') }
96
+ before { person.stub(:save) }
97
+
98
+ it 'should assign the attributes' do
99
+ person.update_attributes(:name => 'Bob')
100
+ person.name.should == 'Bob'
101
+ end
102
+
103
+ it 'should save the record' do
104
+ person.should_receive(:save)
105
+ person.update_attributes(:name => 'Bob')
106
+ end
107
+ end
108
+
105
109
  describe "transactions" do
106
110
 
107
- it "only save on commit" do
111
+ it "only saves on commit" do
108
112
 
109
113
  transaction = Tripod::Persistence::Transaction.new
110
114
 
111
115
  unsaved_person.save(transaction: transaction)
112
- saved_person['http://pred2'] = 'blah'
116
+ saved_person.write_predicate('http://pred2', 'blah')
113
117
  saved_person.save(transaction: transaction)
114
118
 
115
119
  # nothing should have changed yet.
116
120
  lambda {Person.find(unsaved_person.uri)}.should raise_error(Tripod::Errors::ResourceNotFound)
117
- Person.find(saved_person.uri)['http://pred2'].first.to_s.should == RDF::URI.new('http://obj2').to_s
121
+ Person.find(saved_person.uri).read_predicate('http://pred2').first.to_s.should == RDF::URI.new('http://obj2').to_s
118
122
 
119
123
  transaction.commit
120
124
 
121
125
  # things should have changed now.
122
126
  lambda {Person.find(unsaved_person.uri)}.should_not raise_error()
123
- Person.find(saved_person.uri)['http://pred2'].first.should == 'blah'
127
+ Person.find(saved_person.uri).read_predicate('http://pred2').first.should == 'blah'
124
128
 
125
129
  end
126
130
 
127
131
  it "silently ignore invalid saves" do
128
132
  transaction = Tripod::Persistence::Transaction.new
129
133
 
130
- unsaved_person.uri = nil
134
+ unsaved_person.stub(:graph_uri).and_return(nil) # force a failure
131
135
  unsaved_person.save(transaction: transaction).should be_false
132
136
 
133
- saved_person['http://pred2'] = 'blah'
137
+ saved_person.write_predicate('http://pred2', 'blah')
134
138
  saved_person.save(transaction: transaction).should be_true
135
139
 
136
140
  transaction.commit
@@ -142,7 +146,7 @@ describe Tripod::Persistence do
142
146
  lambda {Person.find(unsaved_person.uri)}.should raise_error(Tripod::Errors::ResourceNotFound)
143
147
 
144
148
  # saved person SHOULD be updated
145
- Person.find(saved_person.uri)['http://pred2'].first.should == 'blah'
149
+ Person.find(saved_person.uri).read_predicate('http://pred2').first.should == 'blah'
146
150
  end
147
151
 
148
152
  it "can be aborted" do
@@ -0,0 +1,82 @@
1
+ require "spec_helper"
2
+
3
+ describe Tripod::Predicates do
4
+
5
+ before do
6
+ @uri = 'http://ric'
7
+ @graph = RDF::Graph.new('http://graph')
8
+
9
+ stmt = RDF::Statement.new
10
+ stmt.subject = RDF::URI.new(@uri)
11
+ stmt.predicate = RDF::URI.new('http://blog')
12
+ stmt.object = RDF::URI.new('http://blog1')
13
+ @graph << stmt
14
+
15
+ stmt2 = RDF::Statement.new
16
+ stmt2.subject = RDF::URI.new(@uri)
17
+ stmt2.predicate = RDF::URI.new('http://blog')
18
+ stmt2.object = RDF::URI.new('http://blog2')
19
+ @graph << stmt2
20
+
21
+ stmt3 = RDF::Statement.new
22
+ stmt3.subject = RDF::URI.new(@uri)
23
+ stmt3.predicate = RDF::URI.new('http://name')
24
+ stmt3.object = "ric"
25
+ @graph << stmt3
26
+ end
27
+
28
+ let(:person) do
29
+ p = Person.new(@uri)
30
+ p.hydrate!(:graph => @graph)
31
+ p
32
+ end
33
+
34
+ describe "#read_predicate" do
35
+ it 'returns the values where the predicate matches' do
36
+ values = person.read_predicate('http://blog')
37
+ values.length.should == 2
38
+ values.first.should == RDF::URI('http://blog1')
39
+ values[1].should == RDF::URI('http://blog2')
40
+ end
41
+ end
42
+
43
+ describe '#write_predicate' do
44
+
45
+ context 'single term passed' do
46
+ it 'replaces the values where the predicate matches' do
47
+ person.write_predicate('http://name', 'richard')
48
+ person.read_predicate('http://name').should == [RDF::Literal.new('richard')]
49
+ end
50
+ end
51
+
52
+ context 'multiple terms passed' do
53
+ it 'replaces the values where the predicate matches' do
54
+ person.write_predicate('http://name', ['richard', 'ric', 'ricardo'])
55
+ person.read_predicate('http://name').should == [RDF::Literal.new('richard'), RDF::Literal.new('ric'), RDF::Literal.new('ricardo')]
56
+ end
57
+ end
58
+
59
+ end
60
+
61
+ describe '#remove_predicate' do
62
+ it 'remnoves the values where the predicate matches' do
63
+ person.remove_predicate('http://blog')
64
+ person.read_predicate('http://blog').should be_empty
65
+ end
66
+ end
67
+
68
+ describe "#append_to_predicate" do
69
+ it 'appends values to the existing values for the predicate' do
70
+ person.append_to_predicate('http://name', 'rico')
71
+ person.read_predicate('http://name').should == [RDF::Literal.new('ric'), RDF::Literal.new('rico')]
72
+ end
73
+ end
74
+
75
+ describe "#predicates" do
76
+ it "returns a list of unique RDF::URIs for the predicates set on this resource" do
77
+ person.predicates.length.should == 2
78
+ person.predicates.should == [RDF::URI('http://blog'), RDF::URI('http://name')]
79
+ end
80
+ end
81
+
82
+ end
@@ -4,51 +4,78 @@ describe Tripod::Repository do
4
4
 
5
5
  describe "#hydrate" do
6
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
7
  context 'uri set' do
18
8
 
19
9
  before do
20
10
  @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)
11
+ @uri2 = 'http://bazbar'
12
+ @graph_uri = 'http://graph'
13
+
14
+ p1 = Person.new(@uri, @graph_uri)
15
+ p1.write_predicate('http://pred', RDF::URI.new('http://obj'))
16
+ p1.write_predicate('http://pred2', RDF::URI.new('http://obj2'))
17
+ p1.write_predicate('http://pred3', 'literal')
18
+ p1.save!
28
19
  end
29
20
 
30
21
  let(:person) do
31
- Person.new(@uri)
22
+ Person.new(@uri, @graph_uri)
32
23
  end
33
24
 
34
25
  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
26
+
27
+ context 'no predicate restrictions passed' do
28
+
29
+ it 'populates the repository with a graph of triples from the db' do
30
+ Tripod::SparqlClient::Query.should_receive(:describe).with("DESCRIBE <#{@uri}>").and_call_original
31
+ person.hydrate!
32
+ person.repository.should_not be_empty
33
+ end
34
+
35
+ end
36
+
37
+ context 'single predicate restriction passed' do
38
+ it 'calls the right CONSTRUCT query' do
39
+ Tripod::SparqlClient::Query.should_receive(:construct).with("CONSTRUCT { <http://foobar> ?p ?o } WHERE { <http://foobar> ?p ?o . FILTER (?p = <http://pred>)}").and_call_original
40
+ person.hydrate!(:only => 'http://pred')
41
+ end
42
+
43
+ it 'only populates the right predicates' do
44
+ person.hydrate!(:only => 'http://pred')
45
+ person.predicates.length.should ==1
46
+ person.predicates.should == [RDF::URI('http://pred')]
47
+ end
48
+ end
49
+
50
+ context 'multiple predicate restrictions passed' do
51
+ it 'calls the right CONSTRUCT query' do
52
+ Tripod::SparqlClient::Query.should_receive(:construct).with("CONSTRUCT { <http://foobar> ?p ?o } WHERE { <http://foobar> ?p ?o . FILTER (?p = <http://pred> || ?p = <http://anotherpred>)}").and_call_original
53
+ person.hydrate!(:only => ['http://pred', 'http://anotherpred'])
54
+ end
55
+
56
+ it 'only populates the right predicates' do
57
+ person.hydrate!(:only => ['http://pred2', 'http://pred'])
58
+ person.predicates.length.should == 2
59
+ person.predicates.should == [RDF::URI('http://pred'), RDF::URI('http://pred2')]
60
+ end
39
61
  end
40
62
  end
41
63
 
42
64
  context 'graph passed' do
43
65
  it 'populates the repository with the graph of triples passed in, ingoring triples not about this resource' do
66
+ @graph = RDF::Graph.new
67
+
68
+ person.repository.statements.each do |s|
69
+ @graph << s
70
+ end
44
71
 
45
72
  @graph << RDF::Statement.new( 'http://anotherresource', 'http://pred', 'http://obj')
46
- @graph.statements.count.should ==2
73
+ @graph.statements.count.should ==2 # there'll already be a statement about type in the person.
47
74
 
48
- person.hydrate!(@graph)
75
+ person.hydrate!(:graph => @graph)
49
76
  person.repository.should_not be_empty
50
- person.repository.statements.count.should == 1 # not the extra one.
51
- person.repository.statements.first.should == @stmt
77
+ person.repository.statements.count.should == 1 # not the extra ones
78
+ person.repository.statements.first.should == @graph.statements.first
52
79
  end
53
80
  end
54
81