active-triples 0.2.2 → 0.2.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.
- checksums.yaml +4 -4
- data/README.md +38 -0
- data/lib/active/triples.rb +1 -0
- data/lib/active_triples/resource.rb +33 -16
- data/lib/active_triples/term.rb +11 -3
- data/lib/active_triples/version.rb +1 -1
- data/spec/active_triples/resource_spec.rb +53 -0
- data/spec/active_triples/term_spec.rb +95 -0
- metadata +4 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a31ce4cccede2e3befa05a4b20dc4894547b219a
|
4
|
+
data.tar.gz: 8c47c1b2ad7a9514298dbae6f290c09313590c6d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: dea13110704ca324e2cce448cd413450e21c0a6837ea269f7be8aa783b5540f85d9a11df04a2a891c1986ed40eb551347b06119547518c7e43c093cc715504c8
|
7
|
+
data.tar.gz: 82fbe1c1025d727d396eb8e3c612b56b209d40bac4bec074cef008afa91c052a58e7b344a38a47b29943d725f273776c83b04070a403abcf53adbdf3a6682372
|
data/README.md
CHANGED
@@ -132,6 +132,44 @@ puts my_thing.dump :ntriples
|
|
132
132
|
Repositories and Persistence
|
133
133
|
-----------------------------
|
134
134
|
|
135
|
+
Resources can persist to various databases and triplestores though integration with [RDF::Repository](http://rubydoc.info/github/ruby-rdf/rdf/RDF/Repository).
|
136
|
+
|
137
|
+
```ruby
|
138
|
+
# Registers in-memory repositories. Other implementations of
|
139
|
+
# RDF::Repository support persistence to (e.g.) triplestores & NoSQL
|
140
|
+
# databases.
|
141
|
+
ActiveTriples::Repositories.add_repository :default, RDF::Repository.new
|
142
|
+
ActiveTriples::Repositories.add_repository :people, RDF::Repository.new
|
143
|
+
|
144
|
+
class Person < ActiveTriples::Resource
|
145
|
+
configure :type => RDF::FOAF.Person, :base_uri => 'http://example.org/people#', :repository => :people
|
146
|
+
property :name, :predicate => RDF::FOAF.name
|
147
|
+
end
|
148
|
+
|
149
|
+
class Thing < ActiveTriples::Resource
|
150
|
+
configure :type => RDF::OWL.Thing, :base_uri => 'http://example.org/things#', :repository => :default
|
151
|
+
property :title, :predicate => RDF::DC.title
|
152
|
+
property :description, :predicate => RDF::DC.description
|
153
|
+
property :creator, :predicate => RDF::DC.creator, :class_name => 'Person'
|
154
|
+
end
|
155
|
+
|
156
|
+
t = Thing.new('1')
|
157
|
+
t.title = 'A Thing'
|
158
|
+
t.creator = Person.new('1')
|
159
|
+
t.persisted? # => false
|
160
|
+
t.creator.first.name = 'Tove'
|
161
|
+
t.persist!
|
162
|
+
|
163
|
+
ActiveTriples::Repositories.repositories[:default].dump :ntriples
|
164
|
+
# => "<http://example.org/things#1> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/2002/07/owl#Thing> .\n<http://example.org/things#1> <http://purl.org/dc/terms/title> \"A Thing\" .\n<http://example.org/things#1> <http://purl.org/dc/terms/creator> <http://example.org/people#1> .\n"
|
165
|
+
|
166
|
+
t.creator.first.persisted? # => false
|
167
|
+
t.creator.first.persist!
|
168
|
+
|
169
|
+
ActiveTriples::Repositories.repositories[:people].dump :ntriples
|
170
|
+
# => "<http://example.org/people#1> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://xmlns.com/foaf/0.1/Person> .\n<http://example.org/people#1> <http://xmlns.com/foaf/0.1/name> \"Tove\" .\n"
|
171
|
+
```
|
172
|
+
|
135
173
|
Contributing
|
136
174
|
-------------
|
137
175
|
|
@@ -0,0 +1 @@
|
|
1
|
+
require 'active_triples'
|
@@ -39,14 +39,14 @@ module ActiveTriples
|
|
39
39
|
end
|
40
40
|
|
41
41
|
##
|
42
|
-
# Adapter for a consistent interface for creating a new Resource
|
43
|
-
# from a URI. Similar functionality should exist in all objects
|
42
|
+
# Adapter for a consistent interface for creating a new Resource
|
43
|
+
# from a URI. Similar functionality should exist in all objects
|
44
44
|
# which can become a Resource.
|
45
45
|
#
|
46
46
|
# @param uri [#to_uri, String]
|
47
47
|
# @param vals values to pass as arguments to ::new
|
48
48
|
#
|
49
|
-
# @return [ActiveTriples::Resource] a Resource with
|
49
|
+
# @return [ActiveTriples::Resource] a Resource with
|
50
50
|
def from_uri(uri,vals=nil)
|
51
51
|
new(uri, vals)
|
52
52
|
end
|
@@ -55,7 +55,7 @@ module ActiveTriples
|
|
55
55
|
##
|
56
56
|
# Specifies whether the object is currently writable.
|
57
57
|
#
|
58
|
-
# @return [true, false]
|
58
|
+
# @return [true, false]
|
59
59
|
def writable?
|
60
60
|
!frozen?
|
61
61
|
end
|
@@ -83,8 +83,8 @@ module ActiveTriples
|
|
83
83
|
##
|
84
84
|
# Returns the current object.
|
85
85
|
#
|
86
|
-
# @deprecated redundant, simply returns self.
|
87
|
-
#
|
86
|
+
# @deprecated redundant, simply returns self.
|
87
|
+
#
|
88
88
|
# @return [self]
|
89
89
|
def graph
|
90
90
|
Deprecation.warn Resource, "graph is redundant & deprecated. It will be removed in ActiveTriples 0.2.0.", caller
|
@@ -130,16 +130,16 @@ module ActiveTriples
|
|
130
130
|
end
|
131
131
|
end
|
132
132
|
end
|
133
|
-
|
133
|
+
|
134
134
|
##
|
135
135
|
# Returns a serialized string representation of self.
|
136
136
|
# Extends the base implementation builds a JSON-LD context if the
|
137
|
-
# specified format is :jsonld and a context is provided by
|
137
|
+
# specified format is :jsonld and a context is provided by
|
138
138
|
# #jsonld_context
|
139
|
-
#
|
139
|
+
#
|
140
140
|
# @see RDF::Enumerable#dump
|
141
141
|
#
|
142
|
-
# @param args [Array<Object>]
|
142
|
+
# @param args [Array<Object>]
|
143
143
|
# @return [String]
|
144
144
|
def dump(*args)
|
145
145
|
if args.first == :jsonld and respond_to?(:jsonld_context)
|
@@ -156,13 +156,13 @@ module ActiveTriples
|
|
156
156
|
@rdf_subject ||= RDF::Node.new
|
157
157
|
end
|
158
158
|
alias_method :to_term, :rdf_subject
|
159
|
-
|
159
|
+
|
160
160
|
##
|
161
161
|
# A string identifier for the resource
|
162
162
|
def id
|
163
163
|
node? ? nil : rdf_subject.to_s
|
164
164
|
end
|
165
|
-
|
165
|
+
|
166
166
|
def node?
|
167
167
|
return true if rdf_subject.kind_of? RDF::Node
|
168
168
|
false
|
@@ -174,7 +174,7 @@ module ActiveTriples
|
|
174
174
|
def base_uri
|
175
175
|
self.class.base_uri
|
176
176
|
end
|
177
|
-
|
177
|
+
|
178
178
|
def type
|
179
179
|
self.get_values(:type).to_a.map{|x| x.rdf_subject}
|
180
180
|
end
|
@@ -270,12 +270,20 @@ module ActiveTriples
|
|
270
270
|
def set_value(*args)
|
271
271
|
# Add support for legacy 3-parameter syntax
|
272
272
|
if args.length > 3 || args.length < 2
|
273
|
-
raise ArgumentError
|
273
|
+
raise ArgumentError, "wrong number of arguments (#{args.length} for 2-3)"
|
274
274
|
end
|
275
275
|
values = args.pop
|
276
276
|
get_term(args).set(values)
|
277
277
|
end
|
278
278
|
|
279
|
+
##
|
280
|
+
# Adds or updates a property with supplied values.
|
281
|
+
#
|
282
|
+
# @note This method will delete existing statements with the correct subject and predicate from the graph
|
283
|
+
def []=(uri_or_term_property, value)
|
284
|
+
self[uri_or_term_property].set(value)
|
285
|
+
end
|
286
|
+
|
279
287
|
##
|
280
288
|
# Returns an array of values belonging to the property
|
281
289
|
# requested. Elements in the array may RdfResource objects or a
|
@@ -291,6 +299,15 @@ module ActiveTriples
|
|
291
299
|
get_term(args)
|
292
300
|
end
|
293
301
|
|
302
|
+
##
|
303
|
+
# Returns an array of values belonging to the property
|
304
|
+
# requested. Elements in the array may RdfResource objects or a
|
305
|
+
# valid datatype.
|
306
|
+
def [](uri_or_term_property)
|
307
|
+
get_term([uri_or_term_property])
|
308
|
+
end
|
309
|
+
|
310
|
+
|
294
311
|
def get_term(args)
|
295
312
|
@term_cache ||= {}
|
296
313
|
term = Term.new(self, args)
|
@@ -311,9 +328,9 @@ module ActiveTriples
|
|
311
328
|
#
|
312
329
|
# @param [#to_uri, #to_s] uri_or_str the uri or string to use
|
313
330
|
def set_subject!(uri_or_str)
|
314
|
-
raise "Refusing update URI when one is already assigned!" unless node?
|
331
|
+
raise "Refusing update URI when one is already assigned!" unless node? or rdf_subject == RDF::URI(nil)
|
315
332
|
# Refusing set uri to an empty string.
|
316
|
-
return false if uri_or_str.nil? or uri_or_str.to_s.empty?
|
333
|
+
return false if uri_or_str.nil? or (uri_or_str.to_s.empty? and not uri_or_str.kind_of? RDF::URI)
|
317
334
|
# raise "Refusing update URI! This object is persisted to a datastream." if persisted?
|
318
335
|
old_subject = rdf_subject
|
319
336
|
@rdf_subject = get_uri(uri_or_str)
|
data/lib/active_triples/term.rb
CHANGED
@@ -1,7 +1,12 @@
|
|
1
|
+
require 'active_support/core_ext/module/delegation'
|
2
|
+
|
1
3
|
module ActiveTriples
|
2
4
|
class Term
|
5
|
+
|
3
6
|
attr_accessor :parent, :value_arguments, :node_cache
|
4
|
-
|
7
|
+
|
8
|
+
delegate *(Array.public_instance_methods - [:send, :__send__, :__id__, :class, :object_id] + [:as_json]), :to => :result
|
9
|
+
|
5
10
|
def initialize(parent, value_arguments)
|
6
11
|
self.parent = parent
|
7
12
|
self.value_arguments = value_arguments
|
@@ -84,7 +89,7 @@ module ActiveTriples
|
|
84
89
|
end
|
85
90
|
|
86
91
|
def rdf_subject
|
87
|
-
raise ArgumentError
|
92
|
+
raise ArgumentError, "wrong number of arguments (#{value_arguments.length} for 1-2)" if value_arguments.length < 1 || value_arguments.length > 2
|
88
93
|
if value_arguments.length > 1
|
89
94
|
value_arguments.first
|
90
95
|
else
|
@@ -129,7 +134,10 @@ module ActiveTriples
|
|
129
134
|
end
|
130
135
|
|
131
136
|
def valid_datatype?(val)
|
132
|
-
|
137
|
+
case val
|
138
|
+
when String, Date, Time, Numeric, Symbol, TrueClass, FalseClass then true
|
139
|
+
else false
|
140
|
+
end
|
133
141
|
end
|
134
142
|
|
135
143
|
# Converts an object to the appropriate class.
|
@@ -64,6 +64,21 @@ describe ActiveTriples::Resource do
|
|
64
64
|
expect{ subject.set_subject! RDF::URI('http://example.org/moomin2') }.to raise_error
|
65
65
|
end
|
66
66
|
end
|
67
|
+
|
68
|
+
context 'with null relative URI subject' do
|
69
|
+
before do
|
70
|
+
subject.set_subject! RDF::URI(nil)
|
71
|
+
end
|
72
|
+
|
73
|
+
it 'should have a subject of <>' do
|
74
|
+
expect(subject.rdf_subject).to eq RDF::URI(nil)
|
75
|
+
end
|
76
|
+
|
77
|
+
it 'should be settable' do
|
78
|
+
subject.set_subject! RDF::URI('http://example.org/moomin')
|
79
|
+
expect(subject.rdf_subject).to eq RDF::URI('http://example.org/moomin')
|
80
|
+
end
|
81
|
+
end
|
67
82
|
end
|
68
83
|
|
69
84
|
describe "#persisted?" do
|
@@ -305,6 +320,24 @@ describe ActiveTriples::Resource do
|
|
305
320
|
expect(subject.query(:subject => RDF::URI("http://opaquenamespace.org/jokes"), :predicate => RDF::DC.title).statements.to_a.length).to eq 1
|
306
321
|
end
|
307
322
|
end
|
323
|
+
describe '#[]=' do
|
324
|
+
it 'should set a value in the graph' do
|
325
|
+
subject[RDF::DC.title] = 'Comet in Moominland'
|
326
|
+
subject.query(:subject => subject.rdf_subject, :predicate => RDF::DC.title).each_statement do |s|
|
327
|
+
expect(s.object.to_s).to eq 'Comet in Moominland'
|
328
|
+
end
|
329
|
+
end
|
330
|
+
|
331
|
+
it 'should set a value in the when given a registered property symbol' do
|
332
|
+
subject[:title] = 'Comet in Moominland'
|
333
|
+
expect(subject.title).to eq ['Comet in Moominland']
|
334
|
+
end
|
335
|
+
|
336
|
+
it "raise an error if the value is not a URI, Node, Literal, RdfResource, or string" do
|
337
|
+
expect { subject[RDF::DC.title] = Object.new }.to raise_error
|
338
|
+
end
|
339
|
+
end
|
340
|
+
|
308
341
|
describe '#get_values' do
|
309
342
|
before do
|
310
343
|
subject.title = ['Comet in Moominland', "Finn Family Moomintroll"]
|
@@ -325,6 +358,26 @@ describe ActiveTriples::Resource do
|
|
325
358
|
end
|
326
359
|
end
|
327
360
|
|
361
|
+
describe '#[]' do
|
362
|
+
before do
|
363
|
+
subject.title = ['Comet in Moominland', "Finn Family Moomintroll"]
|
364
|
+
end
|
365
|
+
|
366
|
+
it 'should return values for a predicate uri' do
|
367
|
+
expect(subject[RDF::DC.title]).to eq ['Comet in Moominland', 'Finn Family Moomintroll']
|
368
|
+
end
|
369
|
+
|
370
|
+
it 'should return values for a registered predicate symbol' do
|
371
|
+
expect(subject[:title]).to eq ['Comet in Moominland', 'Finn Family Moomintroll']
|
372
|
+
end
|
373
|
+
|
374
|
+
it "should return values for other subjects if asked" do
|
375
|
+
expect(subject.get_values(RDF::URI("http://opaquenamespace.org/jokes"),:title)).to eq []
|
376
|
+
subject.set_value(RDF::URI("http://opaquenamespace.org/jokes"), RDF::DC.title, 'Comet in Moominland')
|
377
|
+
expect(subject.get_values(RDF::URI("http://opaquenamespace.org/jokes"),:title)).to eq ["Comet in Moominland"]
|
378
|
+
end
|
379
|
+
end
|
380
|
+
|
328
381
|
describe '#type' do
|
329
382
|
it 'should return the type configured on the parent class' do
|
330
383
|
expect(subject.type).to eq [DummyResource.type]
|
@@ -0,0 +1,95 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'rdf/isomorphic'
|
3
|
+
|
4
|
+
describe ActiveTriples::Term do
|
5
|
+
|
6
|
+
describe "#rdf_subject" do
|
7
|
+
subject { described_class.new( double("parent"), double("value args") ) }
|
8
|
+
context "when term has 0 value arguments" do
|
9
|
+
before { subject.value_arguments = double(length: 0) }
|
10
|
+
it "should raise an error" do
|
11
|
+
expect { subject.rdf_subject }.to raise_error
|
12
|
+
end
|
13
|
+
end
|
14
|
+
context "when term has 1 value argument" do
|
15
|
+
before do
|
16
|
+
allow(subject.parent).to receive(:rdf_subject) { "parent subject" }
|
17
|
+
subject.value_arguments = double(length: 1)
|
18
|
+
end
|
19
|
+
it "should call `rdf_subject' on the parent" do
|
20
|
+
expect(subject.rdf_subject).to eq "parent subject"
|
21
|
+
end
|
22
|
+
end
|
23
|
+
context "when term has 2 value arguments" do
|
24
|
+
before { subject.value_arguments = double(length: 2, first: "first") }
|
25
|
+
it "should return the first value argument" do
|
26
|
+
expect(subject.rdf_subject).to eq "first"
|
27
|
+
end
|
28
|
+
end
|
29
|
+
context "when term has 3 value arguments" do
|
30
|
+
before { subject.value_arguments = double(length: 3) }
|
31
|
+
it "should raise an error" do
|
32
|
+
expect { subject.rdf_subject }.to raise_error
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
describe "#valid_datatype?" do
|
38
|
+
subject { described_class.new( double("parent"), "value" ) }
|
39
|
+
before { allow(subject.parent).to receive(:rdf_subject) { "parent subject" } }
|
40
|
+
context "the value is not a Resource" do
|
41
|
+
it "should be true if value is a String" do
|
42
|
+
expect(subject.send(:valid_datatype?, "foo")).to be true
|
43
|
+
end
|
44
|
+
it "should be true if value is a Symbol" do
|
45
|
+
expect(subject.send(:valid_datatype?, :foo)).to be true
|
46
|
+
end
|
47
|
+
it "should be true if the value is a Numeric" do
|
48
|
+
expect(subject.send(:valid_datatype?, 1)).to be true
|
49
|
+
expect(subject.send(:valid_datatype?, 0.1)).to be true
|
50
|
+
end
|
51
|
+
it "should be true if the value is a Date" do
|
52
|
+
expect(subject.send(:valid_datatype?, Date.today)).to be true
|
53
|
+
end
|
54
|
+
it "should be true if the value is a Time" do
|
55
|
+
expect(subject.send(:valid_datatype?, Time.now)).to be true
|
56
|
+
end
|
57
|
+
it "should be true if the value is a boolean" do
|
58
|
+
expect(subject.send(:valid_datatype?, false)).to be true
|
59
|
+
expect(subject.send(:valid_datatype?, true)).to be true
|
60
|
+
end
|
61
|
+
end
|
62
|
+
context "the value is a Resource" do
|
63
|
+
after { Object.send(:remove_const, :DummyResource) }
|
64
|
+
let(:resource) { DummyResource.new }
|
65
|
+
context "and the resource class does not include RDF::Isomorphic" do
|
66
|
+
before { class DummyResource < ActiveTriples::Resource; end }
|
67
|
+
it "should be false" do
|
68
|
+
expect(subject.send(:valid_datatype?, resource)).to be false
|
69
|
+
end
|
70
|
+
end
|
71
|
+
context "and the resource class includes RDF:Isomorphic" do
|
72
|
+
before do
|
73
|
+
class DummyResource < ActiveTriples::Resource
|
74
|
+
include RDF::Isomorphic
|
75
|
+
end
|
76
|
+
end
|
77
|
+
it "should be false" do
|
78
|
+
expect(subject.send(:valid_datatype?, resource)).to be false
|
79
|
+
end
|
80
|
+
end
|
81
|
+
context "and the resource class includes RDF::Isomorphic and aliases :== to :isomorphic_with?" do
|
82
|
+
before do
|
83
|
+
class DummyResource < ActiveTriples::Resource
|
84
|
+
include RDF::Isomorphic
|
85
|
+
alias_method :==, :isomorphic_with?
|
86
|
+
end
|
87
|
+
end
|
88
|
+
it "should be false" do
|
89
|
+
expect(subject.send(:valid_datatype?, resource)).to be false
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: active-triples
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Tom Johnson
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2014-
|
12
|
+
date: 2014-08-22 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rdf
|
@@ -181,6 +181,7 @@ files:
|
|
181
181
|
- LICENSE
|
182
182
|
- README.md
|
183
183
|
- active-triples.gemspec
|
184
|
+
- lib/active/triples.rb
|
184
185
|
- lib/active_triples.rb
|
185
186
|
- lib/active_triples/configurable.rb
|
186
187
|
- lib/active_triples/indexing.rb
|
@@ -198,6 +199,7 @@ files:
|
|
198
199
|
- spec/active_triples/properties_spec.rb
|
199
200
|
- spec/active_triples/repositories_spec.rb
|
200
201
|
- spec/active_triples/resource_spec.rb
|
202
|
+
- spec/active_triples/term_spec.rb
|
201
203
|
- spec/pragmatic_context_spec.rb
|
202
204
|
- spec/spec_helper.rb
|
203
205
|
- spec/support/active_model_lint.rb
|