tripod 0.9.11 → 0.10.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: df9c2c92e357b7825de2a0e0553a165f642e3f1a
4
- data.tar.gz: 488f952481dd46680238d0d332217091e1763d85
3
+ metadata.gz: cc6eabb51253efb188e06ee368e07a0a889e3879
4
+ data.tar.gz: c714ca5b1320c2fd26669951cc318b0c89a27cb6
5
5
  SHA512:
6
- metadata.gz: 1c6e1c3dbdd4522b1e2a8d812478de1681761f712ce6c4272d2688faa63fe3a2d8c725e77ef0c58bf51abb9c66ae55339bb75b0d3ccb2b5f1129ab26d465e333
7
- data.tar.gz: 3addfc697fcc94c825453570e008e91f8729d61ce2dc0488f1a03220934a92f64ccfcebb232052179e778ec06d6556b2de0723bf343ab4de106264683b01f798
6
+ metadata.gz: 2adbfe9b6a9bcb9dae25e1550c06db0d249dc99ce9e00cf27b6923402f4fddc9eb8f0da52a75f69e115a64950c1b0efdeb4e4bb3925182de78ea6263048bd2e3
7
+ data.tar.gz: 0485201ce47c65d4db7470f4c5ffe3603aa545cd730cbd154de1293ff736f36eab86ec5c1c90752fada3acfb0e86350ef6c1419a4c3c7374305704df24b692fe
@@ -20,8 +20,7 @@ module Tripod::Attributes
20
20
  #
21
21
  # @return Native Ruby object (e.g. String, DateTime) or array of them, depending on whether the field is multivalued or not
22
22
  def read_attribute(name, field=nil)
23
- field ||= self.fields[name]
24
- raise Tripod::Errors::FieldNotPresent.new unless field
23
+ field ||= self.class.get_field(name)
25
24
 
26
25
  attr_values = read_predicate(field.predicate)
27
26
 
@@ -88,4 +87,4 @@ module Tripod::Attributes
88
87
  value
89
88
  end
90
89
  end
91
- end
90
+ end
@@ -41,9 +41,16 @@ module Tripod
41
41
  # Note: the subject being returned by the query must be identified by ?uri
42
42
  # e.g. my_criteria.where("?uri a <http://my-type>")
43
43
  #
44
- # TODO: make it also take a hash?
45
- def where(sparql_snippet)
46
- where_clauses << sparql_snippet
44
+ def where(filter)
45
+ if filter.is_a?(String) # we gotta Sparql snippet
46
+ where_clauses << filter
47
+ elsif filter.is_a?(Hash)
48
+ filter.each_pair do |key, value|
49
+ field = resource_class.get_field(key)
50
+ value = RDF::Literal.new(value) unless value.respond_to?(:to_base)
51
+ where_clauses << "?uri <#{ field.predicate }> #{ value.to_base }"
52
+ end
53
+ end
47
54
  self
48
55
  end
49
56
 
data/lib/tripod/fields.rb CHANGED
@@ -41,6 +41,18 @@ module Tripod::Fields
41
41
  add_field(name, predicate, options)
42
42
  end
43
43
 
44
+ # Return the field object on a +Resource+ associated with the given name.
45
+ #
46
+ # @example Get the field.
47
+ # Person.get_field(:name)
48
+ #
49
+ # @param [ Symbol ] name The name of the field.
50
+ def get_field(name)
51
+ field = self.fields[name]
52
+ raise Tripod::Errors::FieldNotPresent.new unless field
53
+ field
54
+ end
55
+
44
56
  protected
45
57
 
46
58
  # Define a field attribute for the +Resource+.
@@ -153,4 +165,4 @@ module Tripod::Fields
153
165
  Tripod::Fields::Standard.new(name, predicate, options)
154
166
  end
155
167
  end
156
- end
168
+ end
@@ -109,7 +109,7 @@ module Tripod::Finders
109
109
  uris_sparql_str = uris.map{ |u| "<#{u.to_s}>" }.join(" ")
110
110
 
111
111
  # Do a big describe statement, and read the results into an in-memory repo
112
- ntriples_string = Tripod::SparqlClient::Query.query("DESCRIBE #{uris_sparql_str}", "application/n-triples")
112
+ ntriples_string = Tripod::SparqlClient::Query.query("CONSTRUCT { ?s ?p ?o } WHERE { ?s ?p ?o . VALUES ?s { #{uris_sparql_str} } }", "application/n-triples")
113
113
  graph = _rdf_graph_from_ntriples_string(ntriples_string, graph)
114
114
  end
115
115
 
@@ -171,7 +171,18 @@ module Tripod::Finders
171
171
  # @option options [ String ] uri_variable The name of the uri variable in the query, if not 'uri'
172
172
  def _describe_query_for_select(select_sparql, opts={})
173
173
  uri_variable = opts[:uri_variable] || "uri"
174
- "DESCRIBE ?#{uri_variable} WHERE { #{select_sparql} }"
174
+ "
175
+ CONSTRUCT { ?tripod_construct_s ?tripod_construct_p ?tripod_construct_o }
176
+ WHERE {
177
+ ?tripod_construct_s ?tripod_construct_p ?tripod_construct_o .
178
+ {
179
+ SELECT (?#{uri_variable} as ?tripod_construct_s)
180
+ {
181
+ #{select_sparql}
182
+ }
183
+ }
184
+ }
185
+ "
175
186
  end
176
187
 
177
188
  # For a select query, get a raw serialisation of the DESCRIPTION of the resources from the database.
@@ -238,4 +249,4 @@ module Tripod::Finders
238
249
  end
239
250
 
240
251
  end
241
- end
252
+ end
@@ -97,30 +97,4 @@ module Tripod::SparqlClient
97
97
 
98
98
  end
99
99
 
100
- module Data
101
- class DataClient
102
- def self.submit(graph_uri, data, method)
103
- url = "#{Tripod.data_endpoint}?graph=#{graph_uri}"
104
- begin
105
- RestClient::Request.execute(
106
- :method => method,
107
- :url => url,
108
- :timeout => Tripod.timeout_seconds,
109
- :payload => data
110
- )
111
- true
112
- rescue RestClient::BadRequest => e
113
- raise Tripod::Errors::BadDataRequest.new(e.http_body, e)
114
- end
115
- end
116
- end
117
-
118
- def self.append(graph_uri, data)
119
- DataClient.submit(graph_uri, data, :post)
120
- end
121
-
122
- def self.replace(graph_uri, data)
123
- DataClient.submit(graph_uri, data, :put)
124
- end
125
- end
126
100
  end
@@ -1,3 +1,3 @@
1
1
  module Tripod
2
- VERSION = "0.9.11"
2
+ VERSION = "0.10.0"
3
3
  end
data/spec/spec_helper.rb CHANGED
@@ -28,9 +28,13 @@ end
28
28
 
29
29
  # configure any settings for testing...
30
30
  Tripod.configure do |config|
31
- config.update_endpoint = 'http://127.0.0.1:3030/tripod-test/update'
32
- config.query_endpoint = 'http://127.0.0.1:3030/tripod-test/sparql'
33
- config.data_endpoint = 'http://127.0.0.1:3030/tripod-test/data'
31
+ # config.update_endpoint = 'http://127.0.0.1:3030/tripod-test/update'
32
+ # config.query_endpoint = 'http://127.0.0.1:3030/tripod-test/sparql'
33
+ # config.data_endpoint = 'http://127.0.0.1:3030/tripod-test/data'
34
+
35
+ config.update_endpoint = 'http://127.0.0.1:3002/sparql/raw/update'
36
+ config.query_endpoint = 'http://127.0.0.1:3002/sparql/raw'
37
+ #config.data_endpoint = 'http://127.0.0.1:3030/tripod-test/data'
34
38
  end
35
39
 
36
40
  # Autoload every model for the test suite that sits in spec/app/models.
@@ -31,19 +31,40 @@ describe Tripod::Criteria do
31
31
 
32
32
  describe "#where" do
33
33
 
34
- it "should add the sparql snippet to the where clauses" do
35
- resource_criteria.where("blah")
36
- resource_criteria.where_clauses.should == ["?uri ?p ?o", "blah"]
37
- end
34
+ context 'given a string' do
35
+ it "should add the sparql snippet to the where clauses" do
36
+ resource_criteria.where("blah")
37
+ resource_criteria.where_clauses.should == ["?uri ?p ?o", "blah"]
38
+ end
38
39
 
39
- it "should return an instance of Criteria" do
40
- resource_criteria.where("blah").class == Tripod::Criteria
41
- end
40
+ it "should return an instance of Criteria" do
41
+ resource_criteria.where("blah").class == Tripod::Criteria
42
+ end
42
43
 
43
- it "should return an instance of Criteria with the where clauses added" do
44
- resource_criteria.where("blah").where_clauses.should == ["?uri ?p ?o", "blah"]
44
+ it "should return an instance of Criteria with the where clauses added" do
45
+ resource_criteria.where("blah").where_clauses.should == ["?uri ?p ?o", "blah"]
46
+ end
45
47
  end
46
48
 
49
+ context 'given a hash' do
50
+ context 'with a native Ruby value' do
51
+ let(:value) { 'blah' }
52
+
53
+ it 'should construct a sparql snippet with the appropriate predicate, treating the value as a literal' do
54
+ criteria = resource_criteria.where(label: value)
55
+ criteria.where_clauses[1].should == "?uri <#{ RDF::RDFS.label }> \"#{ value }\""
56
+ end
57
+ end
58
+
59
+ context 'with a native RDF value' do
60
+ let(:value) { RDF::URI.new('http://example.com/bob') }
61
+
62
+ it 'should construct a sparql snippet with the appropriate predicate' do
63
+ criteria = resource_criteria.where(label: value)
64
+ criteria.where_clauses[1].should == "?uri <#{ RDF::RDFS.label }> <#{ value.to_s }>"
65
+ end
66
+ end
67
+ end
47
68
  end
48
69
 
49
70
  describe "#extras" do
@@ -114,4 +135,4 @@ describe Tripod::Criteria do
114
135
  end
115
136
  end
116
137
 
117
- end
138
+ end
@@ -39,4 +39,14 @@ describe Tripod::Fields do
39
39
  end
40
40
  end
41
41
  end
42
- end
42
+
43
+ describe '.get_field' do
44
+ it 'should raise an error if the field does not exist' do
45
+ expect { Person.send(:get_field, :shoe_size) }.to raise_error(Tripod::Errors::FieldNotPresent)
46
+ end
47
+
48
+ it 'should return the field for the given name' do
49
+ Person.send(:get_field, :age).name.should == :age
50
+ end
51
+ end
52
+ end
@@ -190,7 +190,7 @@ describe Tripod::Finders do
190
190
  end
191
191
 
192
192
  it 'should return the first resources of this type' do
193
- Person.first.should == ric
193
+ Person.first.should == bill
194
194
  end
195
195
  end
196
196
 
@@ -205,11 +205,12 @@ describe Tripod::Finders do
205
205
  it 'returns an array of resources which match those in the db' do
206
206
  res = Person.find_by_sparql('SELECT ?uri ?graph WHERE { GRAPH ?graph { ?uri ?p ?o } }')
207
207
  res.length.should == 2
208
- res.first.should == ric
209
- res.last.should == bill
208
+ res.first.should == bill
209
+ res.last.should == ric
210
210
 
211
- res.first.name.should == "ric"
212
- res.first.knows.should == [RDF::URI.new("http://example.com/id/bill")]
211
+ r = res.last
212
+ r.name.should == "ric"
213
+ r.knows.should == [RDF::URI.new("http://example.com/id/bill")]
213
214
  end
214
215
 
215
216
  it 'uses the uri and graph variables if supplied' do
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.9.11
4
+ version: 0.10.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ric Roberts
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2014-08-27 00:00:00.000000000 Z
13
+ date: 2014-12-03 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: rest-client
@@ -255,7 +255,6 @@ files:
255
255
  - spec/tripod/repository_spec.rb
256
256
  - spec/tripod/resource_spec.rb
257
257
  - spec/tripod/serialization_spec.rb
258
- - spec/tripod/sparql_client_spec.rb
259
258
  - spec/tripod/sparql_query_spec.rb
260
259
  - spec/tripod/state_spec.rb
261
260
  - spec/tripod/streaming_spec.rb
@@ -280,7 +279,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
280
279
  version: 1.3.6
281
280
  requirements: []
282
281
  rubyforge_project: tripod
283
- rubygems_version: 2.2.0.rc.1
282
+ rubygems_version: 2.2.2
284
283
  signing_key:
285
284
  specification_version: 4
286
285
  summary: Active Model style RDF ORM
@@ -303,7 +302,6 @@ test_files:
303
302
  - spec/tripod/repository_spec.rb
304
303
  - spec/tripod/resource_spec.rb
305
304
  - spec/tripod/serialization_spec.rb
306
- - spec/tripod/sparql_client_spec.rb
307
305
  - spec/tripod/sparql_query_spec.rb
308
306
  - spec/tripod/state_spec.rb
309
307
  - spec/tripod/streaming_spec.rb
@@ -1,128 +0,0 @@
1
- require "spec_helper"
2
-
3
- describe Tripod::SparqlClient do
4
- describe Data do
5
-
6
- let(:data) { 'some-data-goes-here' }
7
-
8
- describe "Query#query" do
9
-
10
- let(:query) { "SELECT * WHERE {?s ?p ?o}" }
11
- let(:bad_query) { "SELECT * WHERE ?s ?p ?o}" }
12
-
13
- before do
14
- p = Person.new('http://example.com/id/garry')
15
- p.name = "garry"
16
- p.save!
17
- p
18
- end
19
-
20
- describe "using Tripod::Streaming to get the data" do
21
- before(:each) do
22
- Tripod::Streaming.stub(get_data: "some data")
23
- end
24
-
25
- example do
26
- Tripod::SparqlClient::Query.query(query, "application/sparql-results+json")
27
-
28
- expect(Tripod::Streaming).to have_received(:get_data).with(
29
- Tripod.query_endpoint,
30
- "query=#{CGI.escape(query)}",
31
- {
32
- accept: "application/sparql-results+json",
33
- timeout_seconds: Tripod.timeout_seconds,
34
- response_limit_bytes: Tripod.response_limit_bytes
35
- }
36
- )
37
- end
38
-
39
- context "with an integer response limit (number of bytes)" do
40
- it "uses the limit" do
41
- Tripod::SparqlClient::Query.query(
42
- query, "application/sparql-results+json", {}, 1024
43
- )
44
-
45
- expect(Tripod::Streaming).to have_received(:get_data).with(
46
- kind_of(String), kind_of(String), hash_including(response_limit_bytes: 1024)
47
- )
48
- end
49
- end
50
-
51
- context "with a :default response limit" do
52
- it "uses the Tripod response limit" do
53
- Tripod::SparqlClient::Query.query(
54
- query, "application/sparql-results+json", {}, :default
55
- )
56
-
57
- expect(Tripod::Streaming).to have_received(:get_data).with(
58
- kind_of(String), kind_of(String), hash_including(:response_limit_bytes)
59
- )
60
- end
61
- end
62
-
63
- context "with a :no_response_limit response limit" do
64
- it "doesn't pass a limit" do
65
- Tripod::SparqlClient::Query.query(
66
- query, "application/sparql-results+json", {}, :no_response_limit
67
- )
68
-
69
- expect(Tripod::Streaming).to have_received(:get_data).with(
70
- kind_of(String), kind_of(String), hash_not_including(:response_limit_bytes)
71
- )
72
- end
73
- end
74
- end
75
-
76
- it "should execute the query and return the format requested" do
77
- JSON.parse(Tripod::SparqlClient::Query.query(query, "application/sparql-results+json"))["results"]["bindings"].length > 0
78
- end
79
-
80
- context "with a bad query" do
81
- it "should raise a bad request error" do
82
- lambda {
83
- Tripod::SparqlClient::Query.query(bad_query, "application/sparql-results+json")
84
- }.should raise_error
85
- end
86
- end
87
- end
88
-
89
- describe "Data#append" do
90
- it "should add the graph uri to the configured data endpoint" do
91
- RestClient::Request.should_receive(:execute).with(hash_including(url: 'http://127.0.0.1:3030/tripod-test/data?graph=http://example.com/foo'))
92
- Tripod::SparqlClient::Data.append('http://example.com/foo', data)
93
- end
94
-
95
- it "should send the data as the payload" do
96
- RestClient::Request.should_receive(:execute).with(hash_including(payload: data))
97
- Tripod::SparqlClient::Data.append('http://example.com/foo', data)
98
- end
99
-
100
- it "should HTTP POST the data" do
101
- RestClient::Request.should_receive(:execute).with(hash_including(method: :post))
102
- Tripod::SparqlClient::Data.append('http://example.com/foo', data)
103
- end
104
-
105
- context "which fails with a 400 error" do
106
- before do
107
- WebMock.enable!
108
- stub_http_request(:post, 'http://127.0.0.1:3030/tripod-test/data?graph=http://example.com/foo').to_return(body: 'Error 400: Trousers missing', status: 400)
109
- end
110
-
111
- it "should raise a 'parse failed' exception" do
112
- lambda { Tripod::SparqlClient::Data.append('http://example.com/foo', data) }.should raise_error(Tripod::Errors::BadDataRequest)
113
- end
114
-
115
- after do
116
- WebMock.disable!
117
- end
118
- end
119
- end
120
-
121
- describe "Data#replace" do
122
- it "should HTTP PUT the data" do
123
- RestClient::Request.should_receive(:execute).with(hash_including(method: :put))
124
- Tripod::SparqlClient::Data.replace('http://example.com/foo', data)
125
- end
126
- end
127
- end
128
- end