tripod 0.7.1 → 0.7.3

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/README.md CHANGED
@@ -33,7 +33,7 @@ ActiveModel-style Ruby ORM for RDF Linked Data. Works with SPARQL 1.1 HTTP endpo
33
33
  graph_uri 'http://example.com/people'
34
34
 
35
35
  field :name, 'http://example.com/name'
36
- field :knows, 'http://example.com/knows', :multivalued => true
36
+ field :knows, 'http://example.com/knows', :multivalued => true, :is_uri => true
37
37
  field :aliases, 'http://example.com/alias', :multivalued => true
38
38
  field :age, 'http://example.com/age', :datatype => RDF::XSD.integer
39
39
  field :important_dates, 'http://example.com/importantdates', :datatype => RDF::XSD.date, :multivalued => true
@@ -107,10 +107,14 @@ Tripod doesn't supply a database. You need to install one. I recommend [Fuseki](
107
107
 
108
108
  Resource.all #=> returns a criteria object to return resources in the database (as no rdf_type or graph_uri specified at class level)
109
109
 
110
- Person.all.resources #=> returns all the actual resources for the criteria object, as an array
110
+ Person.all.resources #=> returns all the actual resources for the criteria object, as an array-like object
111
+
112
+ Person.all.resources(:return_graph) #=> returns the actual resources, but without returning the graph_uri in the select (helps avoid pagination issues). Note: doesn't set the graph uri on the instantiated resources.
111
113
 
112
114
  Person.first #=> returns the first person (by crafting a sparql query under the covers that only returns 1 result)
113
115
 
116
+ Person.first(:return_graph) # as with resources, doesn't return / set the graph_uri.
117
+
114
118
  Person.count #=> returns the count of all people (by crafting a count query under the covers that only returns a count)
115
119
 
116
120
  # note that you need to use ?uri as the variable for the subject.
@@ -18,7 +18,7 @@ module Tripod::Attributes
18
18
  # @param [ String ] name The name of the field for which to get the value.
19
19
  # @param [ Field ] field An optional Field object
20
20
  #
21
- # @return RDF:Term or array of them, depending on whether the field is multivalued or not
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
23
  field ||= self.fields[name]
24
24
  raise Tripod::Errors::FieldNotPresent.new unless field
@@ -8,26 +8,38 @@ module Tripod
8
8
 
9
9
  # Execute the query and return a +ResourceCollection+ of all hydrated resources
10
10
  # +ResourceCollection+ is an +Enumerable+, Array-like object.
11
- # options:
12
- # :return_graph (default true) # indicates whether to return the graph as one of the variables.
11
+ #
12
+ # @option options [ String ] return_graph Indicates whether to return the graph as one of the variables.
13
13
  def resources(opts={})
14
14
  Tripod::ResourceCollection.new(
15
- resources_from_sparql(build_select_query(opts))
15
+ self.resource_class._resources_from_sparql(build_select_query(opts)),
16
+ # pass in the criteria that was used to generate this collection, as well as whether the user specified return graph
17
+ :return_graph => (opts.has_key?(:return_graph) ? opts[:return_graph] : true),
18
+ :criteria => self
16
19
  )
17
20
  end
18
21
 
22
+ # run a query to get the raw serialisation of the results of this criteria object.
23
+ #
24
+ # @option options [ String ] return_graph Indicates whether to return the graph as one of the variables.
25
+ # @option options [ String ] accept_header The accept header to use for serializing (defaults to application/n-triples)
26
+ def serialize(opts={})
27
+ select_sparql = build_select_query(:return_graph => opts[:return_graph])
28
+ self.resource_class._raw_describe_select_results(select_sparql, :accept_header => opts[:accept_header]) # note that this method defaults to using application/n-triples.
29
+ end
30
+
19
31
  # Execute the query and return the first result as a hydrated resource
20
- # options:
21
- # :return_graph (default true) # indicates whether to return the graph as one of the variables.
32
+ #
33
+ # @option options [ String ] return_graph Indicates whether to return the graph as one of the variables.
22
34
  def first(opts={})
23
35
  sq = Tripod::SparqlQuery.new(build_select_query(opts))
24
36
  first_sparql = sq.as_first_query_str
25
- resources_from_sparql(first_sparql).first
37
+ self.resource_class._resources_from_sparql(first_sparql).first
26
38
  end
27
39
 
28
40
  # Return how many records the current criteria would return
29
- # options:
30
- # :return_graph (default true) # indicates whether to return the graph as one of the variables.
41
+ #
42
+ # @option options [ String ] return_graph Indicates whether to return the graph as one of the variables.
31
43
  def count(opts={})
32
44
  sq = Tripod::SparqlQuery.new(build_select_query(opts))
33
45
  count_sparql = sq.as_count_query_str
@@ -41,17 +53,15 @@ module Tripod
41
53
 
42
54
  private
43
55
 
44
- def resources_from_sparql(sparql)
45
- uris_and_graphs = self.resource_class._select_uris_and_graphs(sparql)
46
- self.resource_class._create_and_hydrate_resources(uris_and_graphs)
47
- end
48
-
49
- # options:
50
- # :return_graph (default true) # indicates whether to return the graph as one of the variables.
56
+ # @option options [ String ] return_graph Indicates whether to return the graph as one of the variables.
51
57
  def build_select_query(opts={})
52
58
 
59
+ Tripod.logger.debug("TRIPOD: building select query for criteria...")
60
+
53
61
  return_graph = opts.has_key?(:return_graph) ? opts[:return_graph] : true
54
62
 
63
+ Tripod.logger.debug("TRIPOD: with return_graph: #{return_graph.inspect}")
64
+
55
65
  select_query = "SELECT DISTINCT ?uri "
56
66
 
57
67
  if return_graph
data/lib/tripod/fields.rb CHANGED
@@ -17,7 +17,16 @@ module Tripod::Fields
17
17
  # added as an instance method to the Resource.
18
18
  #
19
19
  # @example Define a field.
20
- # field :name, :predicate => 'http://name'
20
+ # field :name, 'http://example.com/name'
21
+ #
22
+ # @example Define a field of a specific RDF type
23
+ # field :modified_at, 'http://example.com/modified_at', datatype: RDF::XSD.DateTime
24
+ #
25
+ # @example Define a multi-valued field (can be combined with other options)
26
+ # field :tags, 'http://example.com/tag', multivalued: true
27
+ #
28
+ # @example Define a field containing a URI to another RDF resource
29
+ # field :knows, 'http://example.com/knows', is_uri: true
21
30
  #
22
31
  # @param [ Symbol ] name The name of the field.
23
32
  # @param [ String, RDF::URI ] predicate The predicate for the field.
@@ -62,8 +62,7 @@ module Tripod::Finders
62
62
  #
63
63
  # @return [ Array ] An array of hydrated resources of this class's type.
64
64
  def find_by_sparql(sparql_query, opts={})
65
- uris_and_graphs = _select_uris_and_graphs(sparql_query, opts)
66
- _create_and_hydrate_resources(uris_and_graphs)
65
+ _create_and_hydrate_resources_from_sparql(sparql_query, opts)
67
66
  end
68
67
 
69
68
  # execute a where clause on this resource.
@@ -95,30 +94,86 @@ module Tripod::Finders
95
94
  uris_sparql_str = uris.map{ |u| "<#{u.to_s}>" }.join(" ")
96
95
 
97
96
  # Do a big describe statement, and read the results into an in-memory repo
98
- triples_string = Tripod::SparqlClient::Query.query("DESCRIBE #{uris_sparql_str}", "application/n-triples")
97
+ ntriples_string = Tripod::SparqlClient::Query.query("DESCRIBE #{uris_sparql_str}", "application/n-triples")
98
+ graph = _rdf_graph_from_ntriples_string(ntriples_string, graph)
99
+ end
99
100
 
100
- RDF::Reader.for(:ntriples).new(triples_string) do |reader|
101
- reader.each_statement do |statement|
102
- graph << statement
103
- end
104
- end
101
+ graph
102
+ end
105
103
 
106
- end
104
+ # returns a graph of triples which describe results of the sparql passed in.
105
+ #
106
+ # @option options [ String ] uri_variable The name of the uri variable in the query, if not 'uri'
107
+ def describe_select_results(select_sparql, opts={})
108
+ ntriples_string = _raw_describe_select_results(select_sparql, opts) # this defaults to using n-triples
109
+ _rdf_graph_from_ntriples_string(ntriples_string)
110
+ end
107
111
 
112
+ # PRIVATE utility methods (not intended to be used externally)
113
+ ##########################
114
+
115
+ # given a sparql select query, create and hydrate some resources
116
+ #
117
+ # @option options [ String ] uri_variable The name of the uri variable in the query, if not 'uri'
118
+ # @option options [ String ] graph_variable The name of the uri variable in thh query, if not 'graph'
119
+ def _resources_from_sparql(select_sparql, opts={})
120
+ _create_and_hydrate_resources_from_sparql(select_sparql, opts)
121
+ end
122
+
123
+ # given a string of ntriples data, populate an RDF graph.
124
+ # If you pass a graph in, it will add to that one.
125
+ def _rdf_graph_from_ntriples_string(ntriples_string, graph=nil)
126
+ graph ||= RDF::Graph.new
127
+ RDF::Reader.for(:ntriples).new(ntriples_string) do |reader|
128
+ reader.each_statement do |statement|
129
+ graph << statement
130
+ end
131
+ end
108
132
  graph
109
133
  end
110
134
 
111
- # THESE AREN'T INTENDED TO BE PART OF THE PUBLIC API:
135
+ # Given a select query, perform a DESCRIBE query to get a graph of data from which we
136
+ # create and hydrate a collection of resources.
137
+ #
138
+ # @option options [ String ] uri_variable The name of the uri variable in the query, if not 'uri'
139
+ # @option options [ String ] graph_variable The name of the uri variable in the query, if not 'graph'
140
+ def _create_and_hydrate_resources_from_sparql(select_sparql, opts={})
141
+ # TODO: Optimization?: if return_graph option is false, then don't do this next line?
142
+ uris_and_graphs = _select_uris_and_graphs(select_sparql, :uri_variable => opts[:uri_variable], :graph_variable => opts[:graph_variable])
143
+ ntriples_string = _raw_describe_select_results(select_sparql, :uri_variable => opts[:uri_variable]) # this defaults to ntriples
144
+ graph = _rdf_graph_from_ntriples_string(ntriples_string, graph=nil)
145
+ _resources_from_graph(graph, uris_and_graphs)
146
+ end
147
+
148
+ # For a select query, generate a query which DESCRIBES all the results
149
+ #
150
+ # @option options [ String ] uri_variable The name of the uri variable in the query, if not 'uri'
151
+ def _describe_query_for_select(select_sparql, opts={})
152
+ uri_variable = opts[:uri_variable] || "uri"
153
+ "DESCRIBE ?#{uri_variable} WHERE { #{select_sparql} }"
154
+ end
112
155
 
113
- # create and hydrate the resources identified in uris_and_graphs.
114
- # Note: if any of the graphs are not set, those resources can still be constructed, but not persisted back to DB.
115
- def _create_and_hydrate_resources(uris_and_graphs)
156
+ # For a select query, get a raw serialisation of the DESCRIPTION of the resources from the database.
157
+ #
158
+ # @option options [ String ] uri_variable The name of the uri variable in the query, if not 'uri'
159
+ # @option options [ String ] accept_header The http accept header (default application/n-triples)
160
+ def _raw_describe_select_results(select_sparql, opts={})
161
+ accept_header = opts[:accept_header] || "application/n-triples"
162
+ query = _describe_query_for_select(select_sparql, :uri_variable => opts[:uri_variable])
163
+ Tripod::SparqlClient::Query.query(query, accept_header)
164
+ end
116
165
 
117
- graph = describe_uris(uris_and_graphs.keys) #uses the resource_class on the criteria object
166
+ # given a graph of data, and a hash of uris=>graphs, create and hydrate some resources.
167
+ # Note: if any of the graphs are not set in the hash,
168
+ # those resources can still be constructed, but not persisted back to DB.
169
+ def _resources_from_graph(graph, uris_and_graphs)
118
170
  repo = add_data_to_repository(graph)
119
-
120
171
  resources = []
121
172
 
173
+ # TODO: ? if uris_and_graphs not passed in, we could get the
174
+ # uris from the graph, and just not create the resoruces with a graph
175
+ # (but they won't be persistable).
176
+
122
177
  uris_and_graphs.each_pair do |u,g|
123
178
 
124
179
  # instantiate a new resource
@@ -139,7 +194,6 @@ module Tripod::Finders
139
194
  resources
140
195
  end
141
196
 
142
-
143
197
  # based on the query passed in, build a hash of uris->graphs
144
198
  # @param [ String] sparql. The sparql query
145
199
  # @param [ Hash ] opts. A hash of options.
@@ -34,12 +34,7 @@ module Tripod::Repository
34
34
  end
35
35
  else
36
36
 
37
- graph_selector = self.graph_uri.present? ? "<#{graph_uri.to_s}>" : "?g"
38
-
39
- triples = Tripod::SparqlClient::Query.query(
40
- "CONSTRUCT {<#{uri}> ?p ?o} WHERE { GRAPH #{graph_selector} { <#{uri}> ?p ?o } }",
41
- "application/n-triples"
42
- )
37
+ triples = retrieve_triples_from_database
43
38
 
44
39
  @repository = RDF::Repository.new
45
40
  RDF::Reader.for(:ntriples).new(triples) do |reader|
@@ -60,6 +55,14 @@ module Tripod::Repository
60
55
  g
61
56
  end
62
57
 
58
+ def retrieve_triples_from_database(accept_header="application/n-triples")
59
+ graph_selector = self.graph_uri.present? ? "<#{graph_uri.to_s}>" : "?g"
60
+ Tripod::SparqlClient::Query.query(
61
+ "CONSTRUCT {<#{uri}> ?p ?o} WHERE { GRAPH #{graph_selector} { <#{uri}> ?p ?o } }",
62
+ accept_header
63
+ )
64
+ end
65
+
63
66
  # returns a graph of triples from the underlying repository where this resource's uri is the subject.
64
67
  def get_triples_for_this_resource
65
68
  triples_graph = RDF::Graph.new
@@ -8,9 +8,15 @@ module Tripod
8
8
  include Enumerable
9
9
 
10
10
  attr_reader :resources
11
+ attr_reader :criteria # the criteria used to generate this collection
11
12
 
12
- def initialize(resources)
13
+ # options:
14
+ # :criteria - the criteria used to create this collection
15
+ # :return_graph - whether the original query returned the graphs or not.
16
+ def initialize(resources, opts={})
13
17
  @resources = resources
18
+ @criteria = opts[:criteria]
19
+ @return_graph = opts[:return_graph]
14
20
  end
15
21
 
16
22
  def length
@@ -37,27 +43,57 @@ module Tripod
37
43
 
38
44
  # for n-triples we can just concatenate them
39
45
  def to_nt
40
- nt = ""
41
- resources.each do |resource|
42
- nt += resource.to_nt
46
+ time_serialization('nt') do
47
+ if @criteria
48
+ @criteria.serialize(:return_graph => @return_graph, :accept_header => "application/n-triples")
49
+ else
50
+ # for n-triples we can just concatenate them
51
+ nt = ""
52
+ resources.each do |resource|
53
+ nt += resource.to_nt
54
+ end
55
+ nt
56
+ end
43
57
  end
44
- nt
45
58
  end
46
59
 
47
60
  def to_json(opts={})
48
- get_graph.dump(:jsonld)
61
+ # most databases don't have a native json-ld implementation.
62
+ time_serialization('json') do
63
+ get_graph.dump(:jsonld)
64
+ end
49
65
  end
50
66
 
51
67
  def to_rdf
52
- get_graph.dump(:rdf)
68
+ time_serialization('rdf') do
69
+ if @criteria
70
+ @criteria.serialize(:return_graph => @return_graph, :accept_header => "application/rdf+xml")
71
+ else
72
+ get_graph.dump(:rdf)
73
+ end
74
+ end
53
75
  end
54
76
 
55
77
  def to_ttl
56
- get_graph.dump(:n3)
78
+ time_serialization('ttl') do
79
+ if @criteria
80
+ @criteria.serialize(:return_graph => @return_graph, :accept_header => "text/turtle")
81
+ else
82
+ get_graph.dump(:n3)
83
+ end
84
+ end
57
85
  end
58
86
 
59
87
  private
60
88
 
89
+ def time_serialization(format)
90
+ start_serializing = Time.now if Tripod.logger.debug?
91
+ result = yield if block_given?
92
+ serializing_duration = Time.now - start_serializing if Tripod.logger.debug?
93
+ Tripod.logger.debug( "TRIPOD: Serializing collection to #{format} took #{serializing_duration} secs" )
94
+ result
95
+ end
96
+
61
97
  def get_graph
62
98
  graph = RDF::Graph.new
63
99
  RDF::Reader.for(:ntriples).new(self.to_nt) do |reader|
@@ -6,17 +6,17 @@ module Tripod::Serialization
6
6
 
7
7
  # Serialises this resource's triples to rdf/xml
8
8
  def to_rdf
9
- get_triples_for_this_resource.dump(:rdfxml)
9
+ retrieve_triples_from_database(accept_header="application/rdf+xml")
10
10
  end
11
11
 
12
12
  # Serialises this resource's triples to turtle
13
13
  def to_ttl
14
- get_triples_for_this_resource.dump(:n3)
14
+ retrieve_triples_from_database(accept_header="text/turtle")
15
15
  end
16
16
 
17
17
  # Serialises this resource's triples to n-triples
18
18
  def to_nt
19
- get_triples_for_this_resource.dump(:ntriples)
19
+ retrieve_triples_from_database(accept_header="application/n-triples")
20
20
  end
21
21
 
22
22
  # Serialises this resource's triples to JSON-LD
@@ -23,15 +23,11 @@ module Tripod::SparqlClient
23
23
 
24
24
  # Hash.to_query from active support core extensions
25
25
  stream_data = -> {
26
- if defined?(Rails)
27
- Rails.logger.debug "TRIPOD: About to run query: #{sparql}"
28
- Rails.logger.debug "TRIPOD: Streaming fron url: #{request_url}"
29
- Rails.logger.debug "TRIPOD: Streaming opts: #{streaming_opts.inspect}"
30
- end
26
+ Tripod.logger.debug "TRIPOD: About to run query: #{sparql}"
27
+ Tripod.logger.debug "TRIPOD: Streaming fron url: #{request_url}"
28
+ Tripod.logger.debug "TRIPOD: Streaming opts: #{streaming_opts.inspect}"
31
29
 
32
- response = Tripod::Streaming.get_data(request_url, streaming_opts)
33
- # Rails.logger.debug "TRIPOD: response: #{response}" if defined?(Rails)
34
- response
30
+ Tripod::Streaming.get_data(request_url, streaming_opts)
35
31
  }
36
32
 
37
33
  if Tripod.cache_store # if a cache store is configured
@@ -22,17 +22,32 @@ module Tripod
22
22
  total_bytes = 0
23
23
  response_string = ""
24
24
 
25
+ request_start_time = Time.now if Tripod.logger.debug?
26
+
25
27
  begin
26
28
  http.request_get(uri.request_uri, 'Accept' => accept) do |res|
27
- Rails.logger.debug "TRIPOD: response code: #{res.code}" if defined?(Rails)
29
+
30
+ response_duration = Time.now - request_start_time if Tripod.logger.debug?
31
+
32
+ Tripod.logger.debug "TRIPOD: received response code: #{res.code} in: #{response_duration} secs"
28
33
  raise Tripod::Errors::BadSparqlRequest.new(res.body) if res.code.to_s != "200"
29
34
 
35
+ stream_start_time = Time.now if Tripod.logger.debug?
36
+
30
37
  res.read_body do |seg|
31
38
  total_bytes += seg.size
32
39
  response_string += seg.to_s
33
40
  # if there's a limit, stop when we reach it
34
41
  raise Tripod::Errors::SparqlResponseTooLarge.new if limit_in_bytes && (total_bytes > limit_in_bytes)
35
42
  end
43
+
44
+ if Tripod.logger.debug?
45
+ stream_duration = Time.now - stream_start_time if
46
+ total_request_time = stream_end_time - request_start_time
47
+ end
48
+
49
+ Tripod.logger.debug "TRIPOD: #{total_bytes} bytes streamed in: #{stream_duration} secs"
50
+ Tripod.logger.debug "TRIPOD: total request time: #{total_request_time} secs"
36
51
  end
37
52
  rescue Timeout::Error => timeout
38
53
  raise Tripod::Errors::Timeout.new
@@ -1,3 +1,3 @@
1
1
  module Tripod
2
- VERSION = "0.7.1"
2
+ VERSION = "0.7.3"
3
3
  end
data/lib/tripod.rb CHANGED
@@ -56,6 +56,10 @@ module Tripod
56
56
 
57
57
  mattr_accessor :cache_store
58
58
 
59
+ mattr_accessor :logger
60
+ @@logger = Logger.new(STDOUT)
61
+ @@logger.level = Logger::WARN
62
+
59
63
  # Use +configure+ to override configuration in an app, (defaults shown)
60
64
  #
61
65
  # Tripod.configure do |config|
@@ -66,6 +70,7 @@ module Tripod
66
70
  # config.cache_store = nil #e.g Tripod::CacheStores::MemcachedCacheStore.new('localhost:11211')
67
71
  # # note: if using memcached, make sure you set the -I (slab size) to big enough to store each result
68
72
  # # and set the -m (total size) to something quite big (or the cache will recycle too often).
73
+ #  config.logger = Logger.new(STDOUT) # you can set this to the Rails.logger in a rails app.
69
74
  # end
70
75
  #
71
76
  def self.configure
@@ -15,32 +15,34 @@ describe Tripod::Serialization do
15
15
  p
16
16
  end
17
17
 
18
- context "where no eager loading has happened" do
19
-
18
+ shared_examples_for "a serialisable resource" do
20
19
  describe "#to_rdf" do
21
- it "should dump the contents of the repository as rdfxml" do
22
- person.to_rdf.should == person.repository.dump(:rdfxml)
20
+ it "should get the data from the database as rdf/xml" do
21
+ person.to_rdf.should == person.retrieve_triples_from_database(accept_header="application/rdf+xml")
23
22
  end
24
23
  end
25
24
 
26
25
  describe "#to_ttl" do
27
- it "should dump the contents of the repository with the n3 serializer" do
28
- person.to_ttl.should == person.repository.dump(:n3)
26
+ it "should get the data from the database as text/turtle" do
27
+ person.to_ttl.should == person.retrieve_triples_from_database(accept_header="text/turtle")
29
28
  end
30
29
  end
31
30
 
32
31
  describe "#to_nt" do
33
- it "should dump the contents of the repository as ntriples" do
34
- person.to_nt.should == person.repository.dump(:ntriples)
32
+ it "should get the data from the database as application/n-triples" do
33
+ person.to_nt.should == person.retrieve_triples_from_database(accept_header="application/n-triples")
35
34
  end
36
35
  end
37
36
 
38
- describe "#to_json" do
39
- it "should dump the contents of the repository as ntriples" do
40
- person.to_json.should == person.repository.dump(:jsonld)
37
+ describe "#to_json" do
38
+ it "should dump the triples for this resource only as json-ld" do
39
+ person.to_json.should == person.get_triples_for_this_resource.dump(:jsonld)
41
40
  end
42
41
  end
42
+ end
43
43
 
44
+ context "where no eager loading has happened" do
45
+ it_should_behave_like "a serialisable resource"
44
46
  end
45
47
 
46
48
  context "where eager loading has happened" do
@@ -50,31 +52,7 @@ describe Tripod::Serialization do
50
52
  person.eager_load_object_triples!
51
53
  end
52
54
 
53
- describe "#to_rdf" do
54
- it "should dump the triples for this resource only as rdfxml" do
55
- person.to_rdf.should == person.get_triples_for_this_resource.dump(:rdfxml)
56
- end
57
- end
58
-
59
- describe "#to_ttl" do
60
- it "should dump the triples for this resource only with the n3 serializer" do
61
- person.to_ttl.should == person.get_triples_for_this_resource.dump(:n3)
62
- end
63
- end
64
-
65
- describe "#to_nt" do
66
- it "should dump the triples for this resource only as ntriples" do
67
- person.to_nt.should == person.get_triples_for_this_resource.dump(:ntriples)
68
- end
69
- end
70
-
71
- describe "#to_json" do
72
- it "should dump the triples for this resource only as ntriples" do
73
- person.to_json.should == person.get_triples_for_this_resource.dump(:jsonld)
74
- end
75
- end
76
-
77
-
55
+ it_should_behave_like "a serialisable resource"
78
56
 
79
57
  end
80
58
 
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.7.1
4
+ version: 0.7.3
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -11,11 +11,11 @@ authors:
11
11
  autorequire:
12
12
  bindir: bin
13
13
  cert_chain: []
14
- date: 2013-03-28 00:00:00.000000000 Z
14
+ date: 2013-03-29 00:00:00.000000000 Z
15
15
  dependencies:
16
16
  - !ruby/object:Gem::Dependency
17
17
  name: rest-client
18
- requirement: &70200922668480 !ruby/object:Gem::Requirement
18
+ requirement: &70297614006920 !ruby/object:Gem::Requirement
19
19
  none: false
20
20
  requirements:
21
21
  - - ! '>='
@@ -23,10 +23,10 @@ dependencies:
23
23
  version: '0'
24
24
  type: :runtime
25
25
  prerelease: false
26
- version_requirements: *70200922668480
26
+ version_requirements: *70297614006920
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: activemodel
29
- requirement: &70200922664960 !ruby/object:Gem::Requirement
29
+ requirement: &70297614004880 !ruby/object:Gem::Requirement
30
30
  none: false
31
31
  requirements:
32
32
  - - ~>
@@ -34,10 +34,10 @@ dependencies:
34
34
  version: '3.2'
35
35
  type: :runtime
36
36
  prerelease: false
37
- version_requirements: *70200922664960
37
+ version_requirements: *70297614004880
38
38
  - !ruby/object:Gem::Dependency
39
39
  name: equivalent-xml
40
- requirement: &70200922663180 !ruby/object:Gem::Requirement
40
+ requirement: &70297614004300 !ruby/object:Gem::Requirement
41
41
  none: false
42
42
  requirements:
43
43
  - - ! '>='
@@ -45,10 +45,10 @@ dependencies:
45
45
  version: '0'
46
46
  type: :runtime
47
47
  prerelease: false
48
- version_requirements: *70200922663180
48
+ version_requirements: *70297614004300
49
49
  - !ruby/object:Gem::Dependency
50
50
  name: rdf
51
- requirement: &70200922662000 !ruby/object:Gem::Requirement
51
+ requirement: &70297614003240 !ruby/object:Gem::Requirement
52
52
  none: false
53
53
  requirements:
54
54
  - - ~>
@@ -56,10 +56,10 @@ dependencies:
56
56
  version: '1.0'
57
57
  type: :runtime
58
58
  prerelease: false
59
- version_requirements: *70200922662000
59
+ version_requirements: *70297614003240
60
60
  - !ruby/object:Gem::Dependency
61
61
  name: rdf-rdfxml
62
- requirement: &70200922660520 !ruby/object:Gem::Requirement
62
+ requirement: &70297614002060 !ruby/object:Gem::Requirement
63
63
  none: false
64
64
  requirements:
65
65
  - - ! '>='
@@ -67,10 +67,10 @@ dependencies:
67
67
  version: '0'
68
68
  type: :runtime
69
69
  prerelease: false
70
- version_requirements: *70200922660520
70
+ version_requirements: *70297614002060
71
71
  - !ruby/object:Gem::Dependency
72
72
  name: rdf-n3
73
- requirement: &70200922674900 !ruby/object:Gem::Requirement
73
+ requirement: &70297614019880 !ruby/object:Gem::Requirement
74
74
  none: false
75
75
  requirements:
76
76
  - - ! '>='
@@ -78,10 +78,10 @@ dependencies:
78
78
  version: '0'
79
79
  type: :runtime
80
80
  prerelease: false
81
- version_requirements: *70200922674900
81
+ version_requirements: *70297614019880
82
82
  - !ruby/object:Gem::Dependency
83
83
  name: rdf-json
84
- requirement: &70200922673580 !ruby/object:Gem::Requirement
84
+ requirement: &70297614019140 !ruby/object:Gem::Requirement
85
85
  none: false
86
86
  requirements:
87
87
  - - ! '>='
@@ -89,10 +89,10 @@ dependencies:
89
89
  version: '0'
90
90
  type: :runtime
91
91
  prerelease: false
92
- version_requirements: *70200922673580
92
+ version_requirements: *70297614019140
93
93
  - !ruby/object:Gem::Dependency
94
94
  name: json-ld
95
- requirement: &70200922670740 !ruby/object:Gem::Requirement
95
+ requirement: &70297614017680 !ruby/object:Gem::Requirement
96
96
  none: false
97
97
  requirements:
98
98
  - - ! '>='
@@ -100,10 +100,10 @@ dependencies:
100
100
  version: '0'
101
101
  type: :runtime
102
102
  prerelease: false
103
- version_requirements: *70200922670740
103
+ version_requirements: *70297614017680
104
104
  - !ruby/object:Gem::Dependency
105
105
  name: guid
106
- requirement: &70200922693900 !ruby/object:Gem::Requirement
106
+ requirement: &70297614016520 !ruby/object:Gem::Requirement
107
107
  none: false
108
108
  requirements:
109
109
  - - ! '>='
@@ -111,10 +111,10 @@ dependencies:
111
111
  version: '0'
112
112
  type: :runtime
113
113
  prerelease: false
114
- version_requirements: *70200922693900
114
+ version_requirements: *70297614016520
115
115
  - !ruby/object:Gem::Dependency
116
116
  name: dalli
117
- requirement: &70200922692800 !ruby/object:Gem::Requirement
117
+ requirement: &70297614034920 !ruby/object:Gem::Requirement
118
118
  none: false
119
119
  requirements:
120
120
  - - ~>
@@ -122,7 +122,7 @@ dependencies:
122
122
  version: '2.6'
123
123
  type: :runtime
124
124
  prerelease: false
125
- version_requirements: *70200922692800
125
+ version_requirements: *70297614034920
126
126
  description: RDF ruby ORM
127
127
  email:
128
128
  - ric@swirrl.com