ld4l-open_annotation_rdf 0.1.0 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.travis.yml +10 -6
- data/Gemfile +3 -0
- data/README.md +5 -0
- data/ld4l-open_annotation_rdf.gemspec +4 -8
- data/lib/ld4l/open_annotation_rdf.rb +1 -26
- data/lib/ld4l/open_annotation_rdf/annotation.rb +28 -30
- data/lib/ld4l/open_annotation_rdf/annotation_generic_body.rb +12 -0
- data/lib/ld4l/open_annotation_rdf/comment_annotation.rb +3 -6
- data/lib/ld4l/open_annotation_rdf/comment_body.rb +4 -4
- data/lib/ld4l/open_annotation_rdf/semantic_tag_annotation.rb +3 -6
- data/lib/ld4l/open_annotation_rdf/semantic_tag_body.rb +3 -3
- data/lib/ld4l/open_annotation_rdf/tag_annotation.rb +3 -5
- data/lib/ld4l/open_annotation_rdf/tag_body.rb +7 -7
- data/lib/ld4l/open_annotation_rdf/version.rb +1 -1
- data/spec/ld4l/open_annotation_rdf/annotation_spec.rb +79 -70
- data/spec/ld4l/open_annotation_rdf/comment_annotation_spec.rb +46 -40
- data/spec/ld4l/open_annotation_rdf/comment_body_spec.rb +46 -43
- data/spec/ld4l/open_annotation_rdf/configuration_spec.rb +5 -5
- data/spec/ld4l/open_annotation_rdf/semantic_tag_annotation_spec.rb +46 -42
- data/spec/ld4l/open_annotation_rdf/semantic_tag_body_spec.rb +24 -31
- data/spec/ld4l/open_annotation_rdf/tag_annotation_spec.rb +46 -42
- data/spec/ld4l/open_annotation_rdf/tag_body_spec.rb +28 -35
- data/spec/ld4l/open_annotation_rdf_spec.rb +1 -1
- data/spec/spec_helper.rb +1 -2
- metadata +13 -69
- data/lib/ld4l/open_annotation_rdf/vocab/cnt.rb +0 -6
- data/lib/ld4l/open_annotation_rdf/vocab/dctypes.rb +0 -5
- data/lib/ld4l/open_annotation_rdf/vocab/oa.rb +0 -23
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 4aa0556da41076b2f34c5e42dba07eae18293ab9
|
4
|
+
data.tar.gz: 602276cae0e89de7fb57d8c37ba15b9194d678b2
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4386b653e3aaa928613de1373228e541bb49d0aaee20681561eb367ec9c85e01a5e23616e1fea7d27f7389320b4f01b575dc4c25e431a92d3e66f0979c0eec62
|
7
|
+
data.tar.gz: 6728d645af71a8b61d67a574d413fc2fd2f377060b69bf1f992ed2b0bfe419f880fd4714da1a46c95bff0560a6ffe363906b1cef4ebc8b99c6ad13d7bacaaca0
|
data/.travis.yml
CHANGED
@@ -1,12 +1,16 @@
|
|
1
1
|
language: ruby
|
2
2
|
bundler_args: --without debug
|
3
3
|
script: "bundle exec rspec spec"
|
4
|
+
sudo: false
|
5
|
+
cache: bundler
|
4
6
|
rvm:
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
7
|
+
- 2.1
|
8
|
+
- 2.2.2
|
9
|
+
- 2.2.4
|
10
|
+
- 2.3.1
|
11
|
+
- jruby-9.0.4.0
|
12
|
+
- rbx
|
10
13
|
matrix:
|
11
14
|
allow_failures:
|
12
|
-
- rvm: jruby-
|
15
|
+
- rvm: jruby-9.0.4.0
|
16
|
+
- rvm: rbx
|
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -25,6 +25,11 @@ Or install it yourself as:
|
|
25
25
|
$ gem install ld4l-open_annotation_rdf
|
26
26
|
|
27
27
|
|
28
|
+
## Primary Dependencies
|
29
|
+
|
30
|
+
* [ActiveTriples 0.10.0](https://github.com/ActiveTriples/ActiveTriples/tree/v0.10.0)
|
31
|
+
* [RDF 2.0.2](https://github.com/ruby-rdf/rdf/tree/2.0.2)
|
32
|
+
|
28
33
|
## Usage
|
29
34
|
|
30
35
|
**Caveat:** This gem is part of the LD4L Project and is being used in that context. There is no guarantee that the
|
@@ -13,23 +13,19 @@ Gem::Specification.new do |spec|
|
|
13
13
|
spec.description = %q{LD4L Open Annotation RDF provides tools for modeling a annotations based on the Open Annotation ontology and persisting to a triplestore.}
|
14
14
|
spec.homepage = "https://github.com/ld4l/open_annotation_rdf"
|
15
15
|
spec.license = "APACHE2"
|
16
|
-
spec.required_ruby_version = '>= 1
|
16
|
+
spec.required_ruby_version = '>= 2.1'
|
17
17
|
|
18
18
|
spec.files = `git ls-files -z`.split("\x0")
|
19
19
|
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
20
20
|
|
21
|
-
spec.add_dependency('rdf'
|
22
|
-
|
23
|
-
spec.add_dependency('active-triples', '~> 0.5', '~> 0.6', '~>0.8.2')
|
21
|
+
spec.add_dependency('rdf')
|
22
|
+
spec.add_dependency('active-triples')
|
24
23
|
spec.add_dependency('active_triples-local_name')
|
25
|
-
spec.add_dependency('ld4l-foaf_rdf'
|
24
|
+
spec.add_dependency('ld4l-foaf_rdf')
|
26
25
|
|
27
|
-
spec.add_development_dependency('pry')
|
28
|
-
spec.add_development_dependency('pry-byebug')
|
29
26
|
spec.add_development_dependency('rdoc')
|
30
27
|
spec.add_development_dependency('rspec')
|
31
28
|
spec.add_development_dependency('coveralls')
|
32
|
-
spec.add_development_dependency('guard-rspec')
|
33
29
|
spec.add_development_dependency('webmock')
|
34
30
|
|
35
31
|
spec.extra_rdoc_files = [
|
@@ -4,9 +4,6 @@ require 'active_triples/local_name'
|
|
4
4
|
require 'linkeddata'
|
5
5
|
require 'ld4l/foaf_rdf'
|
6
6
|
require 'ld4l/open_annotation_rdf/version'
|
7
|
-
require 'ld4l/open_annotation_rdf/vocab/oa'
|
8
|
-
require 'ld4l/open_annotation_rdf/vocab/cnt'
|
9
|
-
require 'ld4l/open_annotation_rdf/vocab/dctypes'
|
10
7
|
|
11
8
|
|
12
9
|
module LD4L
|
@@ -29,38 +26,16 @@ module LD4L
|
|
29
26
|
yield(configuration)
|
30
27
|
end
|
31
28
|
|
32
|
-
|
33
|
-
# RDF vocabularies
|
34
|
-
autoload :OA, 'ld4l/open_annotation_rdf/vocab/oa'
|
35
|
-
autoload :CNT, 'ld4l/open_annotation_rdf/vocab/cnt'
|
36
|
-
autoload :DCTYPES, 'ld4l/open_annotation_rdf/vocab/dctypes'
|
37
|
-
|
38
|
-
|
39
29
|
# autoload classes
|
40
30
|
autoload :Configuration, 'ld4l/open_annotation_rdf/configuration'
|
41
31
|
autoload :Annotation, 'ld4l/open_annotation_rdf/annotation'
|
32
|
+
autoload :AnnotationGenericBody, 'ld4l/open_annotation_rdf/annotation_generic_body'
|
42
33
|
autoload :CommentAnnotation, 'ld4l/open_annotation_rdf/comment_annotation'
|
43
34
|
autoload :CommentBody, 'ld4l/open_annotation_rdf/comment_body'
|
44
35
|
autoload :TagAnnotation, 'ld4l/open_annotation_rdf/tag_annotation'
|
45
36
|
autoload :TagBody, 'ld4l/open_annotation_rdf/tag_body'
|
46
37
|
autoload :SemanticTagAnnotation, 'ld4l/open_annotation_rdf/semantic_tag_annotation'
|
47
38
|
autoload :SemanticTagBody, 'ld4l/open_annotation_rdf/semantic_tag_body'
|
48
|
-
|
49
|
-
def self.class_from_string(class_name, container_class=Kernel)
|
50
|
-
container_class = container_class.name if container_class.is_a? Module
|
51
|
-
container_parts = container_class.split('::')
|
52
|
-
(container_parts + class_name.split('::')).flatten.inject(Kernel) do |mod, class_name|
|
53
|
-
if mod == Kernel
|
54
|
-
Object.const_get(class_name)
|
55
|
-
elsif mod.const_defined? class_name.to_sym
|
56
|
-
mod.const_get(class_name)
|
57
|
-
else
|
58
|
-
container_parts.pop
|
59
|
-
class_from_string(class_name, container_parts.join('::'))
|
60
|
-
end
|
61
|
-
end
|
62
|
-
end
|
63
|
-
|
64
39
|
end
|
65
40
|
end
|
66
41
|
|
@@ -7,45 +7,30 @@ module LD4L
|
|
7
7
|
|
8
8
|
@body = nil
|
9
9
|
|
10
|
-
configure :type =>
|
10
|
+
configure :type => RDF::Vocab::OA.Annotation,
|
11
11
|
:base_uri => LD4L::OpenAnnotationRDF.configuration.base_uri,
|
12
12
|
:repository => :default
|
13
13
|
|
14
|
-
property :hasTarget, :predicate =>
|
15
|
-
property :hasBody, :predicate =>
|
16
|
-
property :annotatedBy, :predicate =>
|
17
|
-
property :annotatedAt, :predicate =>
|
18
|
-
property :motivatedBy, :predicate =>
|
14
|
+
property :hasTarget, :predicate => RDF::Vocab::OA.hasTarget # :type => URI
|
15
|
+
property :hasBody, :predicate => RDF::Vocab::OA.hasBody
|
16
|
+
property :annotatedBy, :predicate => RDF::Vocab::OA.annotatedBy, :class_name => LD4L::FoafRDF::Person
|
17
|
+
property :annotatedAt, :predicate => RDF::Vocab::OA.annotatedAt, :cast => false # :type => xsd:dateTime # the time Annotation was created
|
18
|
+
property :motivatedBy, :predicate => RDF::Vocab::OA.motivatedBy, :cast => false # comes from RDF::Vocab::OA ontology
|
19
19
|
|
20
20
|
def self.resume(uri_or_str)
|
21
21
|
# Let ActiveTriples::Resource validate uri_or_str when creating new Annotation
|
22
22
|
a = new(uri_or_str)
|
23
|
+
return nil if a.nil?
|
23
24
|
|
24
|
-
# get motivatedBy
|
25
|
-
m = a.get_values(:motivatedBy)
|
26
|
-
m = m.to_a if Object.const_defined?("ActiveTriples::Relation") && m.kind_of?(ActiveTriples::Relation)
|
27
|
-
|
28
|
-
# TODO: Should m's class be validated? I've seen it be RDF::Vocabulary::Term and RDF::URI. For now, removing the validation.
|
29
|
-
return a unless m.kind_of?(Array) && m.size > 0
|
30
|
-
# return a unless m.kind_of?(Array) && m.size > 0 && (m.first.kind_of?(RDF::Vocabulary::Term) || m.first.kind_of?(RDF::URI)
|
31
|
-
|
32
|
-
# motivatedBy is set
|
33
|
-
m_uri = m.first
|
34
25
|
# currently only support commenting and tagging
|
35
|
-
|
36
|
-
return
|
26
|
+
m = motivated_by a
|
27
|
+
return LD4L::OpenAnnotationRDF::CommentAnnotation.new(uri_or_str) if m.include? RDF::Vocab::OA.commenting
|
37
28
|
|
38
29
|
# Tagging can be TagAnnotation or SemanticTagAnnotation. Only way to tell is by checking type of body.
|
39
|
-
|
40
|
-
|
41
|
-
return
|
42
|
-
|
43
|
-
ta = LD4L::OpenAnnotationRDF::TagAnnotation.new(uri_or_str)
|
44
|
-
tb = ta.getBody
|
45
|
-
return ta if tb.type.include?(RDFVocabularies::OA.Tag)
|
46
|
-
|
47
|
-
# can't match to a known annotation type, so return as generic annotation
|
48
|
-
return a
|
30
|
+
return a unless m.include? RDF::Vocab::OA.tagging
|
31
|
+
b = body_resource a
|
32
|
+
return LD4L::OpenAnnotationRDF::TagAnnotation.new(uri_or_str) if b.type.include? RDF::Vocab::OA.Tag
|
33
|
+
LD4L::OpenAnnotationRDF::SemanticTagAnnotation.new(uri_or_str)
|
49
34
|
end
|
50
35
|
|
51
36
|
##
|
@@ -98,8 +83,8 @@ module LD4L
|
|
98
83
|
repo = ActiveTriples::Repositories.repositories[repository]
|
99
84
|
query = RDF::Query.new({
|
100
85
|
:annotation => {
|
101
|
-
RDF.type =>
|
102
|
-
|
86
|
+
RDF.type => RDF::Vocab::OA.Annotation,
|
87
|
+
RDF::Vocab::OA.hasTarget => target_uri,
|
103
88
|
}
|
104
89
|
})
|
105
90
|
annotations = []
|
@@ -107,6 +92,19 @@ module LD4L
|
|
107
92
|
results.each { |r| annotations << r.to_hash[:annotation] }
|
108
93
|
annotations
|
109
94
|
end
|
95
|
+
|
96
|
+
private
|
97
|
+
def self::motivated_by annotation
|
98
|
+
m = annotation.get_values(:motivatedBy).to_a
|
99
|
+
return nil unless m.kind_of?(Array) && (m.size > 0)
|
100
|
+
m
|
101
|
+
end
|
102
|
+
|
103
|
+
def self::body_resource annotation
|
104
|
+
body_uris = annotation.hasBody
|
105
|
+
return nil if body_uris.nil? || body_uris.size < 1
|
106
|
+
AnnotationGenericBody.new(body_uris.first) # TODO: a full implementation of OA could have multiple bodies
|
107
|
+
end
|
110
108
|
end
|
111
109
|
end
|
112
110
|
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
module LD4L
|
2
|
+
module OpenAnnotationRDF
|
3
|
+
class AnnotationGenericBody < ActiveTriples::Resource
|
4
|
+
|
5
|
+
class << self; attr_reader :localname_prefix end
|
6
|
+
@localname_prefix="a"
|
7
|
+
|
8
|
+
configure :base_uri => LD4L::OpenAnnotationRDF.configuration.base_uri,
|
9
|
+
:repository => :default
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
@@ -4,13 +4,10 @@ module LD4L
|
|
4
4
|
|
5
5
|
@localname_prefix="ca"
|
6
6
|
|
7
|
-
configure :type =>
|
7
|
+
configure :type => RDF::Vocab::OA.Annotation,
|
8
8
|
:base_uri => LD4L::OpenAnnotationRDF.configuration.base_uri,
|
9
9
|
:repository => :default
|
10
10
|
|
11
|
-
property :hasBody, :predicate => RDFVocabularies::OA.hasBody, :class_name => LD4L::OpenAnnotationRDF::CommentBody
|
12
|
-
|
13
|
-
|
14
11
|
##
|
15
12
|
# Create a comment annotation body and set the hasBody property to it.
|
16
13
|
#
|
@@ -53,8 +50,8 @@ module LD4L
|
|
53
50
|
|
54
51
|
# set motivatedBy
|
55
52
|
m = get_values(:motivatedBy)
|
56
|
-
m = m.to_a if Object.const_defined?("
|
57
|
-
set_value(:motivatedBy,
|
53
|
+
m = m.to_a if Object::ActiveTriples.const_defined?("Relation") && m.kind_of?(ActiveTriples::Relation)
|
54
|
+
set_value(:motivatedBy, RDF::Vocab::OA.commenting) unless m.kind_of?(Array) && m.size > 0
|
58
55
|
|
59
56
|
# resume CommentBody if it exists
|
60
57
|
comment_uri = get_values(:hasBody).first
|
@@ -5,18 +5,18 @@ module LD4L
|
|
5
5
|
class << self; attr_reader :localname_prefix end
|
6
6
|
@localname_prefix="cb"
|
7
7
|
|
8
|
-
configure :type =>
|
8
|
+
configure :type => RDF::Vocab::CNT.ContentAsText,
|
9
9
|
:base_uri => LD4L::OpenAnnotationRDF.configuration.base_uri,
|
10
10
|
:repository => :default
|
11
11
|
|
12
|
-
property :content, :predicate =>
|
13
|
-
property :format, :predicate => RDF::DC.format, :cast => false # :type => XSD.string
|
12
|
+
property :content, :predicate => RDF::Vocab::CNT.chars, :cast => false # :type => XSD.string
|
13
|
+
property :format, :predicate => RDF::Vocab::DC.format, :cast => false # :type => XSD.string
|
14
14
|
|
15
15
|
def initialize(*args)
|
16
16
|
super(*args)
|
17
17
|
|
18
18
|
t = get_values(:type)
|
19
|
-
t <<
|
19
|
+
t << RDF::Vocab::DCMIType.Text
|
20
20
|
set_value(:type,t)
|
21
21
|
end
|
22
22
|
end
|
@@ -4,13 +4,10 @@ module LD4L
|
|
4
4
|
|
5
5
|
@localname_prefix = "sta"
|
6
6
|
|
7
|
-
configure :type =>
|
7
|
+
configure :type => RDF::Vocab::OA.Annotation,
|
8
8
|
:base_uri => LD4L::OpenAnnotationRDF.configuration.base_uri,
|
9
9
|
:repository => :default
|
10
10
|
|
11
|
-
property :hasBody, :predicate => RDFVocabularies::OA.hasBody, :class_name => LD4L::OpenAnnotationRDF::SemanticTagBody
|
12
|
-
|
13
|
-
|
14
11
|
# USAGE: Use setTerm to set the hasBody property to be the URI of the controlled vocabulary term that
|
15
12
|
# is the annotation.
|
16
13
|
|
@@ -59,8 +56,8 @@ module LD4L
|
|
59
56
|
|
60
57
|
# set motivatedBy
|
61
58
|
m = get_values(:motivatedBy)
|
62
|
-
m = m.to_a if Object.const_defined?("
|
63
|
-
set_value(:motivatedBy,
|
59
|
+
m = m.to_a if Object::ActiveTriples.const_defined?("Relation") && m.kind_of?(ActiveTriples::Relation)
|
60
|
+
set_value(:motivatedBy, RDF::Vocab::OA.tagging) unless m.kind_of?(Array) && m.size > 0
|
64
61
|
|
65
62
|
# resume SemanticTagBody if it exists
|
66
63
|
term_uri = get_values(:hasBody).first
|
@@ -8,7 +8,7 @@ module LD4L
|
|
8
8
|
# USAGE: When creating a semantic tag body, use the URI of the controlled vocabulary term as the RDF Subject URI
|
9
9
|
# for an instance of this class.
|
10
10
|
|
11
|
-
configure :type =>
|
11
|
+
configure :type => RDF::Vocab::OA.SemanticTag,
|
12
12
|
:base_uri => LD4L::OpenAnnotationRDF.configuration.base_uri,
|
13
13
|
:repository => :default
|
14
14
|
|
@@ -30,8 +30,8 @@ module LD4L
|
|
30
30
|
repo = ActiveTriples::Repositories.repositories[repository]
|
31
31
|
query = RDF::Query.new({
|
32
32
|
:annotation => {
|
33
|
-
RDF.type =>
|
34
|
-
|
33
|
+
RDF.type => RDF::Vocab::OA.Annotation,
|
34
|
+
RDF::Vocab::OA.hasBody => term_uri,
|
35
35
|
}
|
36
36
|
})
|
37
37
|
annotations = []
|
@@ -4,12 +4,10 @@ module LD4L
|
|
4
4
|
|
5
5
|
@localname_prefix="ta"
|
6
6
|
|
7
|
-
configure :type =>
|
7
|
+
configure :type => RDF::Vocab::OA.Annotation,
|
8
8
|
:base_uri => LD4L::OpenAnnotationRDF.configuration.base_uri,
|
9
9
|
:repository => :default
|
10
10
|
|
11
|
-
property :hasBody, :predicate => RDFVocabularies::OA.hasBody, :class_name => LD4L::OpenAnnotationRDF::TagBody
|
12
|
-
|
13
11
|
# TODO: Should a tag be destroyed when the last annotation referencing the tag is destroyed?
|
14
12
|
|
15
13
|
##
|
@@ -102,8 +100,8 @@ module LD4L
|
|
102
100
|
|
103
101
|
# set motivatedBy
|
104
102
|
m = get_values(:motivatedBy)
|
105
|
-
m = m.to_a if Object.const_defined?("
|
106
|
-
set_value(:motivatedBy,
|
103
|
+
m = m.to_a if Object::ActiveTriples.const_defined?("Relation") && m.kind_of?(ActiveTriples::Relation)
|
104
|
+
set_value(:motivatedBy, RDF::Vocab::OA.tagging) unless m.kind_of?(Array) && m.size > 0
|
107
105
|
|
108
106
|
# resume TagBody if it exists
|
109
107
|
tag_uri = get_values(:hasBody).first
|
@@ -5,11 +5,11 @@ module LD4L
|
|
5
5
|
class << self; attr_reader :localname_prefix end
|
6
6
|
@localname_prefix="tb"
|
7
7
|
|
8
|
-
configure :type =>
|
8
|
+
configure :type => RDF::Vocab::OA.Tag,
|
9
9
|
:base_uri => LD4L::OpenAnnotationRDF.configuration.base_uri,
|
10
10
|
:repository => :default
|
11
11
|
|
12
|
-
property :tag, :predicate =>
|
12
|
+
property :tag, :predicate => RDF::Vocab::CNT.chars, :cast => false # :type => XSD.string
|
13
13
|
|
14
14
|
##
|
15
15
|
# Get a list of annotations using the tag value.
|
@@ -31,8 +31,8 @@ module LD4L
|
|
31
31
|
repo = ActiveTriples::Repositories.repositories[repository]
|
32
32
|
query = RDF::Query.new({
|
33
33
|
:annotation => {
|
34
|
-
RDF.type =>
|
35
|
-
|
34
|
+
RDF.type => RDF::Vocab::OA.Annotation,
|
35
|
+
RDF::Vocab::OA.hasBody => tag_uri,
|
36
36
|
}
|
37
37
|
})
|
38
38
|
results = query.execute(repo)
|
@@ -57,8 +57,8 @@ module LD4L
|
|
57
57
|
repo = ActiveTriples::Repositories.repositories[repository]
|
58
58
|
query = RDF::Query.new({
|
59
59
|
:tagbody => {
|
60
|
-
RDF.type =>
|
61
|
-
|
60
|
+
RDF.type => RDF::Vocab::OA.Tag,
|
61
|
+
RDF::Vocab::CNT.chars => tag_value,
|
62
62
|
}
|
63
63
|
})
|
64
64
|
|
@@ -76,7 +76,7 @@ module LD4L
|
|
76
76
|
super(*args)
|
77
77
|
|
78
78
|
t = get_values(:type)
|
79
|
-
t <<
|
79
|
+
t << RDF::Vocab::CNT.ContentAsText
|
80
80
|
set_value(:type,t)
|
81
81
|
end
|
82
82
|
end
|
@@ -2,6 +2,10 @@ require 'spec_helper'
|
|
2
2
|
|
3
3
|
describe 'LD4L::OpenAnnotationRDF::Annotation' do
|
4
4
|
|
5
|
+
after do
|
6
|
+
ActiveTriples::Repositories.repositories[LD4L::OpenAnnotationRDF::CommentAnnotation.repository].clear!
|
7
|
+
end
|
8
|
+
|
5
9
|
subject { LD4L::OpenAnnotationRDF::Annotation.new }
|
6
10
|
|
7
11
|
describe 'rdf_subject' do
|
@@ -21,9 +25,9 @@ describe 'LD4L::OpenAnnotationRDF::Annotation' do
|
|
21
25
|
|
22
26
|
describe 'when changing subject' do
|
23
27
|
before do
|
24
|
-
subject << RDF::Statement.new(subject.rdf_subject, RDF::DC.title, RDF::Literal('Comet in Moominland'))
|
25
|
-
subject << RDF::Statement.new(RDF::URI('http://example.org/moomin_comics'), RDF::DC.isPartOf, subject.rdf_subject)
|
26
|
-
subject << RDF::Statement.new(RDF::URI('http://example.org/moomin_comics'), RDF::DC.relation, 'http://example.org/moomin_land')
|
28
|
+
subject << RDF::Statement.new(subject.rdf_subject, RDF::Vocab::DC.title, RDF::Literal('Comet in Moominland'))
|
29
|
+
subject << RDF::Statement.new(RDF::URI('http://example.org/moomin_comics'), RDF::Vocab::DC.isPartOf, subject.rdf_subject)
|
30
|
+
subject << RDF::Statement.new(RDF::URI('http://example.org/moomin_comics'), RDF::Vocab::DC.relation, 'http://example.org/moomin_land')
|
27
31
|
subject.set_subject! RDF::URI('http://example.org/moomin')
|
28
32
|
end
|
29
33
|
|
@@ -33,15 +37,15 @@ describe 'LD4L::OpenAnnotationRDF::Annotation' do
|
|
33
37
|
end
|
34
38
|
|
35
39
|
it 'should update graph subjects' do
|
36
|
-
expect(subject.has_statement?(RDF::Statement.new(subject.rdf_subject, RDF::DC.title, RDF::Literal('Comet in Moominland')))).to be true
|
40
|
+
expect(subject.has_statement?(RDF::Statement.new(subject.rdf_subject, RDF::Vocab::DC.title, RDF::Literal('Comet in Moominland')))).to be true
|
37
41
|
end
|
38
42
|
|
39
43
|
it 'should update graph objects' do
|
40
|
-
expect(subject.has_statement?(RDF::Statement.new(RDF::URI('http://example.org/moomin_comics'), RDF::DC.isPartOf, subject.rdf_subject))).to be true
|
44
|
+
expect(subject.has_statement?(RDF::Statement.new(RDF::URI('http://example.org/moomin_comics'), RDF::Vocab::DC.isPartOf, subject.rdf_subject))).to be true
|
41
45
|
end
|
42
46
|
|
43
47
|
it 'should leave other uris alone' do
|
44
|
-
expect(subject.has_statement?(RDF::Statement.new(RDF::URI('http://example.org/moomin_comics'), RDF::DC.relation, 'http://example.org/moomin_land'))).to be true
|
48
|
+
expect(subject.has_statement?(RDF::Statement.new(RDF::URI('http://example.org/moomin_comics'), RDF::Vocab::DC.relation, 'http://example.org/moomin_land'))).to be true
|
45
49
|
end
|
46
50
|
end
|
47
51
|
|
@@ -62,8 +66,8 @@ describe 'LD4L::OpenAnnotationRDF::Annotation' do
|
|
62
66
|
# -------------------------------------------------
|
63
67
|
|
64
68
|
describe 'type' do
|
65
|
-
it "should be an
|
66
|
-
expect(subject.type.first.value).to eq
|
69
|
+
it "should be an RDF::Vocab::OA.Annotation" do
|
70
|
+
expect(subject.type.first.value).to eq RDF::Vocab::OA.Annotation.value
|
67
71
|
end
|
68
72
|
end
|
69
73
|
|
@@ -150,14 +154,14 @@ describe 'LD4L::OpenAnnotationRDF::Annotation' do
|
|
150
154
|
end
|
151
155
|
|
152
156
|
it "should be settable" do
|
153
|
-
subject.motivatedBy =
|
154
|
-
expect(subject.motivatedBy.first).to eq
|
157
|
+
subject.motivatedBy = RDF::Vocab::OA.describing
|
158
|
+
expect(subject.motivatedBy.first).to eq RDF::Vocab::OA.describing
|
155
159
|
end
|
156
160
|
|
157
161
|
it "should be changeable" do
|
158
|
-
subject.motivatedBy =
|
159
|
-
subject.motivatedBy =
|
160
|
-
expect(subject.motivatedBy.first).to eq
|
162
|
+
subject.motivatedBy = RDF::Vocab::OA.describing
|
163
|
+
subject.motivatedBy = RDF::Vocab::OA.classifying
|
164
|
+
expect(subject.motivatedBy.first).to eq RDF::Vocab::OA.classifying
|
161
165
|
end
|
162
166
|
end
|
163
167
|
|
@@ -190,12 +194,12 @@ describe 'LD4L::OpenAnnotationRDF::Annotation' do
|
|
190
194
|
expect(a.hasTarget.first.rdf_subject.to_s).to eq "http://example.org/bibref/br3"
|
191
195
|
expect(a.annotatedBy.first).to eq a_person
|
192
196
|
expect(a.annotatedAt.first).to eq a_time
|
193
|
-
expect(a.motivatedBy.first).to eq
|
197
|
+
expect(a.motivatedBy.first).to eq RDF::Vocab::OA.commenting
|
194
198
|
|
195
199
|
b = a.getBody
|
196
200
|
expect(b).to be_a_kind_of(LD4L::OpenAnnotationRDF::CommentBody)
|
197
|
-
expect(b.type).to include
|
198
|
-
expect(b.type).to include
|
201
|
+
expect(b.type).to include RDF::Vocab::DCMIType.Text
|
202
|
+
expect(b.type).to include RDF::Vocab::CNT.ContentAsText
|
199
203
|
expect(b.content).to eq ["This is a comment."]
|
200
204
|
expect(b.format.first).to eq "text/plain"
|
201
205
|
end
|
@@ -216,12 +220,12 @@ describe 'LD4L::OpenAnnotationRDF::Annotation' do
|
|
216
220
|
expect(a.hasTarget.first.rdf_subject.to_s).to eq "http://example.org/bibref/br3"
|
217
221
|
expect(a.annotatedBy.first).to eq a_person
|
218
222
|
expect(a.annotatedAt.first).to eq a_time
|
219
|
-
expect(a.motivatedBy.first).to eq
|
223
|
+
expect(a.motivatedBy.first).to eq RDF::Vocab::OA.tagging
|
220
224
|
|
221
225
|
b = a.getBody
|
222
226
|
expect(b).to be_a_kind_of(LD4L::OpenAnnotationRDF::TagBody)
|
223
|
-
expect(b.type).to include
|
224
|
-
expect(b.type).to include
|
227
|
+
expect(b.type).to include RDF::Vocab::OA.Tag
|
228
|
+
expect(b.type).to include RDF::Vocab::CNT.ContentAsText
|
225
229
|
expect(b.tag).to eq ["good"]
|
226
230
|
end
|
227
231
|
|
@@ -241,11 +245,11 @@ describe 'LD4L::OpenAnnotationRDF::Annotation' do
|
|
241
245
|
expect(a.hasTarget.first.rdf_subject.to_s).to eq "http://example.org/bibref/br3"
|
242
246
|
expect(a.annotatedBy.first).to eq a_person
|
243
247
|
expect(a.annotatedAt.first).to eq a_time
|
244
|
-
expect(a.motivatedBy.first).to eq
|
248
|
+
expect(a.motivatedBy.first).to eq RDF::Vocab::OA.tagging
|
245
249
|
|
246
250
|
b = a.getBody
|
247
251
|
expect(b).to be_a_kind_of(LD4L::OpenAnnotationRDF::SemanticTagBody)
|
248
|
-
expect(b.type).to include
|
252
|
+
expect(b.type).to include RDF::Vocab::OA.SemanticTag
|
249
253
|
expect(b.rdf_subject.to_s).to eq('http://example.org/term/3')
|
250
254
|
end
|
251
255
|
end
|
@@ -274,12 +278,12 @@ describe 'LD4L::OpenAnnotationRDF::Annotation' do
|
|
274
278
|
expect(a.hasTarget.first.rdf_subject.to_s).to eq "http://example.org/bibref/br3"
|
275
279
|
expect(a.annotatedBy.first).to eq a_person
|
276
280
|
expect(a.annotatedAt.first).to eq a_time
|
277
|
-
expect(a.motivatedBy.first).to eq
|
281
|
+
expect(a.motivatedBy.first).to eq RDF::Vocab::OA.commenting
|
278
282
|
|
279
283
|
b = a.getBody
|
280
284
|
expect(b).to be_a_kind_of(LD4L::OpenAnnotationRDF::CommentBody)
|
281
|
-
expect(b.type).to include
|
282
|
-
expect(b.type).to include
|
285
|
+
expect(b.type).to include RDF::Vocab::DCMIType.Text
|
286
|
+
expect(b.type).to include RDF::Vocab::CNT.ContentAsText
|
283
287
|
expect(b.content).to eq ["BLANK NODE COMMENT"]
|
284
288
|
expect(b.format.first).to eq "text/plain"
|
285
289
|
end
|
@@ -306,12 +310,12 @@ describe 'LD4L::OpenAnnotationRDF::Annotation' do
|
|
306
310
|
expect(a.hasTarget.first.rdf_subject.to_s).to eq "http://example.org/bibref/br3"
|
307
311
|
expect(a.annotatedBy.first).to eq a_person
|
308
312
|
expect(a.annotatedAt.first).to eq a_time
|
309
|
-
expect(a.motivatedBy.first).to eq
|
313
|
+
expect(a.motivatedBy.first).to eq RDF::Vocab::OA.tagging
|
310
314
|
|
311
315
|
b = a.getBody
|
312
316
|
expect(b).to be_a_kind_of(LD4L::OpenAnnotationRDF::TagBody)
|
313
|
-
expect(b.type).to include
|
314
|
-
expect(b.type).to include
|
317
|
+
expect(b.type).to include RDF::Vocab::OA.Tag
|
318
|
+
expect(b.type).to include RDF::Vocab::CNT.ContentAsText
|
315
319
|
expect(b.tag).to eq ["BLANK_NODE_TAG"]
|
316
320
|
end
|
317
321
|
|
@@ -337,11 +341,11 @@ describe 'LD4L::OpenAnnotationRDF::Annotation' do
|
|
337
341
|
expect(a.hasTarget.first.rdf_subject.to_s).to eq "http://example.org/bibref/br3"
|
338
342
|
expect(a.annotatedBy.first).to eq a_person
|
339
343
|
expect(a.annotatedAt.first).to eq a_time
|
340
|
-
expect(a.motivatedBy.first).to eq
|
344
|
+
expect(a.motivatedBy.first).to eq RDF::Vocab::OA.tagging
|
341
345
|
|
342
346
|
b = a.getBody
|
343
347
|
expect(b).to be_a_kind_of(LD4L::OpenAnnotationRDF::SemanticTagBody)
|
344
|
-
expect(b.type).to include
|
348
|
+
expect(b.type).to include RDF::Vocab::OA.SemanticTag
|
345
349
|
expect(b.rdf_subject.to_s).to eq('http://example.org/term/3')
|
346
350
|
end
|
347
351
|
end
|
@@ -371,16 +375,17 @@ describe 'LD4L::OpenAnnotationRDF::Annotation' do
|
|
371
375
|
it "populates LD4L::OpenAnnotationRDF::CommentAnnotation properly" do
|
372
376
|
expect(@comment_anno.rdf_subject.to_s).to eq @anno_url
|
373
377
|
expect(@comment_anno).to be_a LD4L::OpenAnnotationRDF::CommentAnnotation
|
374
|
-
expect(@comment_anno.type).to include(
|
375
|
-
expect(@comment_anno.motivatedBy).to include(
|
378
|
+
expect(@comment_anno.type).to include(RDF::Vocab::OA.Annotation)
|
379
|
+
expect(@comment_anno.motivatedBy).to include(RDF::Vocab::OA.commenting)
|
376
380
|
expect(@comment_anno.hasTarget.first.rdf_subject).to eq RDF::URI.new("http://searchworks.stanford.edu/view/666")
|
377
381
|
end
|
378
382
|
it "populates Comment bodies properly" do
|
379
|
-
body = @comment_anno.hasBody.first
|
383
|
+
# body = @comment_anno.hasBody.first
|
384
|
+
body = @comment_anno.getBody
|
380
385
|
expect(body).to be_a LD4L::OpenAnnotationRDF::CommentBody
|
381
386
|
expect(body.content.first).to eq @comment_value
|
382
|
-
expect(body.type).to include(
|
383
|
-
expect(body.type).to include(
|
387
|
+
expect(body.type).to include(RDF::Vocab::CNT.ContentAsText)
|
388
|
+
expect(body.type).to include(RDF::Vocab::DCMIType.Text)
|
384
389
|
end
|
385
390
|
end
|
386
391
|
|
@@ -408,17 +413,18 @@ describe 'LD4L::OpenAnnotationRDF::Annotation' do
|
|
408
413
|
it "populates LD4L::OpenAnnotationRDF::TagAnnotation properly" do
|
409
414
|
expect(@tag_anno.rdf_subject.to_s).to eq @anno_url
|
410
415
|
expect(@tag_anno).to be_a LD4L::OpenAnnotationRDF::TagAnnotation
|
411
|
-
expect(@tag_anno.type).to include(
|
412
|
-
expect(@tag_anno.motivatedBy).to include(
|
416
|
+
expect(@tag_anno.type).to include(RDF::Vocab::OA.Annotation)
|
417
|
+
expect(@tag_anno.motivatedBy).to include(RDF::Vocab::OA.tagging)
|
413
418
|
expect(@tag_anno.hasTarget.first.rdf_subject).to eq RDF::URI.new("http://searchworks.stanford.edu/view/666")
|
414
419
|
end
|
415
420
|
it "populates Tag bodies properly" do
|
416
|
-
body = @tag_anno.hasBody.first
|
421
|
+
# body = @tag_anno.hasBody.first
|
422
|
+
body = @tag_anno.getBody
|
417
423
|
expect(body).to be_a LD4L::OpenAnnotationRDF::TagBody
|
418
424
|
expect(body.tag.first).to eq @tag_value
|
419
|
-
expect(body.type).to include(
|
420
|
-
expect(body.type).to include(
|
421
|
-
expect(body.type).to include(
|
425
|
+
expect(body.type).to include(RDF::Vocab::OA.Tag)
|
426
|
+
expect(body.type).to include(RDF::Vocab::CNT.ContentAsText)
|
427
|
+
expect(body.type).to include(RDF::Vocab::DCMIType.Text)
|
422
428
|
end
|
423
429
|
end
|
424
430
|
|
@@ -440,15 +446,16 @@ describe 'LD4L::OpenAnnotationRDF::Annotation' do
|
|
440
446
|
it "populates LD4L::OpenAnnotationRDF::TagAnnotation properly" do
|
441
447
|
expect(@semantic_tag_anno.rdf_subject.to_s).to eq @anno_url
|
442
448
|
expect(@semantic_tag_anno).to be_a LD4L::OpenAnnotationRDF::SemanticTagAnnotation
|
443
|
-
expect(@semantic_tag_anno.type).to include(
|
444
|
-
expect(@semantic_tag_anno.motivatedBy).to include(
|
449
|
+
expect(@semantic_tag_anno.type).to include(RDF::Vocab::OA.Annotation)
|
450
|
+
expect(@semantic_tag_anno.motivatedBy).to include(RDF::Vocab::OA.tagging)
|
445
451
|
expect(@semantic_tag_anno.hasTarget.first.rdf_subject).to eq RDF::URI.new("http://searchworks.stanford.edu/view/666")
|
446
452
|
end
|
447
453
|
it "populates Tag bodies properly" do
|
448
|
-
body = @semantic_tag_anno.hasBody.first
|
454
|
+
# body = @semantic_tag_anno.hasBody.first
|
455
|
+
body = @semantic_tag_anno.getBody
|
449
456
|
expect(body.rdf_subject.to_s).to eq @term_url
|
450
457
|
expect(body).to be_a LD4L::OpenAnnotationRDF::SemanticTagBody
|
451
|
-
expect(body.type).to include(
|
458
|
+
expect(body.type).to include(RDF::Vocab::OA.SemanticTag)
|
452
459
|
end
|
453
460
|
end
|
454
461
|
end
|
@@ -476,7 +483,7 @@ describe 'LD4L::OpenAnnotationRDF::Annotation' do
|
|
476
483
|
|
477
484
|
context "when it is saved" do
|
478
485
|
before do
|
479
|
-
subject.motivatedBy =
|
486
|
+
subject.motivatedBy = RDF::Vocab::OA.commenting
|
480
487
|
subject.persist!
|
481
488
|
end
|
482
489
|
|
@@ -486,7 +493,7 @@ describe 'LD4L::OpenAnnotationRDF::Annotation' do
|
|
486
493
|
|
487
494
|
context "and then modified" do
|
488
495
|
before do
|
489
|
-
subject.motivatedBy =
|
496
|
+
subject.motivatedBy = RDF::Vocab::OA.tagging
|
490
497
|
end
|
491
498
|
|
492
499
|
it "should return true" do
|
@@ -499,7 +506,7 @@ describe 'LD4L::OpenAnnotationRDF::Annotation' do
|
|
499
506
|
end
|
500
507
|
|
501
508
|
it "should reset the motivatedBy" do
|
502
|
-
expect(subject.motivatedBy.first.to_s).to eq
|
509
|
+
expect(subject.motivatedBy.first.to_s).to eq RDF::Vocab::OA.commenting.to_s
|
503
510
|
end
|
504
511
|
|
505
512
|
it "should be persisted" do
|
@@ -521,7 +528,7 @@ describe 'LD4L::OpenAnnotationRDF::Annotation' do
|
|
521
528
|
# Create inmemory repository
|
522
529
|
@repo = RDF::Repository.new
|
523
530
|
ActiveTriples::Repositories.repositories[:default] = @repo
|
524
|
-
subject.motivatedBy =
|
531
|
+
subject.motivatedBy = RDF::Vocab::OA.commenting
|
525
532
|
result
|
526
533
|
end
|
527
534
|
|
@@ -535,7 +542,7 @@ describe 'LD4L::OpenAnnotationRDF::Annotation' do
|
|
535
542
|
|
536
543
|
it "should delete from the repository" do
|
537
544
|
subject.reload
|
538
|
-
expect(subject.motivatedBy.first.to_s).to eq
|
545
|
+
expect(subject.motivatedBy.first.to_s).to eq RDF::Vocab::OA.commenting.to_s
|
539
546
|
subject.motivatedBy = []
|
540
547
|
expect(subject.motivatedBy).to eq []
|
541
548
|
subject.persist!
|
@@ -549,7 +556,7 @@ describe 'LD4L::OpenAnnotationRDF::Annotation' do
|
|
549
556
|
|
550
557
|
describe '#destroy!' do
|
551
558
|
before do
|
552
|
-
subject << RDF::Statement(RDF::DC.LicenseDocument, RDF::DC.title, 'LICENSE')
|
559
|
+
subject << RDF::Statement(RDF::Vocab::DC.LicenseDocument, RDF::Vocab::DC.title, 'LICENSE')
|
553
560
|
end
|
554
561
|
|
555
562
|
subject { LD4L::OpenAnnotationRDF::Annotation.new('123') }
|
@@ -615,11 +622,11 @@ describe 'LD4L::OpenAnnotationRDF::Annotation' do
|
|
615
622
|
|
616
623
|
context 'with unmodeled data' do
|
617
624
|
before do
|
618
|
-
subject << RDF::Statement(subject.rdf_subject, RDF::DC.contributor, 'Tove Jansson')
|
619
|
-
subject << RDF::Statement(subject.rdf_subject, RDF::DC.relation, RDF::URI('http://example.org/moomi'))
|
625
|
+
subject << RDF::Statement(subject.rdf_subject, RDF::Vocab::DC.contributor, 'Tove Jansson')
|
626
|
+
subject << RDF::Statement(subject.rdf_subject, RDF::Vocab::DC.relation, RDF::URI('http://example.org/moomi'))
|
620
627
|
node = RDF::Node.new
|
621
|
-
subject << RDF::Statement(RDF::URI('http://example.org/moomi'), RDF::DC.relation, node)
|
622
|
-
subject << RDF::Statement(node, RDF::DC.title, 'bnode')
|
628
|
+
subject << RDF::Statement(RDF::URI('http://example.org/moomi'), RDF::Vocab::DC.relation, node)
|
629
|
+
subject << RDF::Statement(node, RDF::Vocab::DC.title, 'bnode')
|
623
630
|
end
|
624
631
|
|
625
632
|
after do
|
@@ -628,21 +635,21 @@ describe 'LD4L::OpenAnnotationRDF::Annotation' do
|
|
628
635
|
end
|
629
636
|
|
630
637
|
it 'should include data with URIs as attribute names' do
|
631
|
-
expect(subject.attributes[RDF::DC.contributor.to_s]).to eq ['Tove Jansson']
|
638
|
+
expect(subject.attributes[RDF::Vocab::DC.contributor.to_s]).to eq ['Tove Jansson']
|
632
639
|
end
|
633
640
|
|
634
641
|
it 'should return generic Resources' do
|
635
|
-
expect(subject.attributes[RDF::DC.relation.to_s].first).to be_a ActiveTriples::Resource
|
642
|
+
expect(subject.attributes[RDF::Vocab::DC.relation.to_s].first).to be_a ActiveTriples::Resource
|
636
643
|
end
|
637
644
|
|
638
645
|
it 'should build deep data for Resources' do
|
639
|
-
expect(subject.attributes[RDF::DC.relation.to_s].first.get_values(RDF::DC.relation).
|
640
|
-
first.get_values(RDF::DC.title)).to eq ['bnode']
|
646
|
+
expect(subject.attributes[RDF::Vocab::DC.relation.to_s].first.get_values(RDF::Vocab::DC.relation).
|
647
|
+
first.get_values(RDF::Vocab::DC.title)).to eq ['bnode']
|
641
648
|
end
|
642
649
|
|
643
650
|
it 'should include deep data in serializable_hash' do
|
644
|
-
expect(subject.serializable_hash[RDF::DC.relation.to_s].first.get_values(RDF::DC.relation).
|
645
|
-
first.get_values(RDF::DC.title)).to eq ['bnode']
|
651
|
+
expect(subject.serializable_hash[RDF::Vocab::DC.relation.to_s].first.get_values(RDF::Vocab::DC.relation).
|
652
|
+
first.get_values(RDF::Vocab::DC.title)).to eq ['bnode']
|
646
653
|
end
|
647
654
|
end
|
648
655
|
|
@@ -719,13 +726,13 @@ describe 'LD4L::OpenAnnotationRDF::Annotation' do
|
|
719
726
|
|
720
727
|
describe 'editing the graph' do
|
721
728
|
it 'should write properties when statements are added' do
|
722
|
-
subject << RDF::Statement.new(subject.rdf_subject,
|
729
|
+
subject << RDF::Statement.new(subject.rdf_subject, RDF::Vocab::OA.motivatedBy, 'commenting')
|
723
730
|
expect(subject.motivatedBy).to include 'commenting'
|
724
731
|
end
|
725
732
|
|
726
733
|
it 'should delete properties when statements are removed' do
|
727
|
-
subject << RDF::Statement.new(subject.rdf_subject,
|
728
|
-
subject.delete RDF::Statement.new(subject.rdf_subject,
|
734
|
+
subject << RDF::Statement.new(subject.rdf_subject, RDF::Vocab::OA.motivatedBy, 'commenting')
|
735
|
+
subject.delete RDF::Statement.new(subject.rdf_subject, RDF::Vocab::OA.motivatedBy, 'commenting')
|
729
736
|
expect(subject.motivatedBy).to eq []
|
730
737
|
end
|
731
738
|
end
|
@@ -734,18 +741,18 @@ describe 'LD4L::OpenAnnotationRDF::Annotation' do
|
|
734
741
|
before do
|
735
742
|
class DummyPerson < ActiveTriples::Resource
|
736
743
|
configure :type => RDF::URI('http://example.org/Person')
|
737
|
-
property :foafname, :predicate => RDF::FOAF.name
|
738
|
-
property :publications, :predicate => RDF::FOAF.publications, :class_name => 'DummyDocument'
|
739
|
-
property :knows, :predicate => RDF::FOAF.knows, :class_name => DummyPerson
|
744
|
+
property :foafname, :predicate => RDF::Vocab::FOAF.name
|
745
|
+
property :publications, :predicate => RDF::Vocab::FOAF.publications, :class_name => 'DummyDocument'
|
746
|
+
property :knows, :predicate => RDF::Vocab::FOAF.knows, :class_name => DummyPerson
|
740
747
|
end
|
741
748
|
|
742
749
|
class DummyDocument < ActiveTriples::Resource
|
743
750
|
configure :type => RDF::URI('http://example.org/Document')
|
744
|
-
property :title, :predicate => RDF::DC.title
|
745
|
-
property :creator, :predicate => RDF::DC.creator, :class_name => 'DummyPerson'
|
751
|
+
property :title, :predicate => RDF::Vocab::DC.title
|
752
|
+
property :creator, :predicate => RDF::Vocab::DC.creator, :class_name => 'DummyPerson'
|
746
753
|
end
|
747
754
|
|
748
|
-
LD4L::OpenAnnotationRDF::Annotation.property :item, :predicate => RDF::DC.relation, :class_name => DummyDocument
|
755
|
+
LD4L::OpenAnnotationRDF::Annotation.property :item, :predicate => RDF::Vocab::DC.relation, :class_name => DummyDocument
|
749
756
|
end
|
750
757
|
|
751
758
|
subject { LD4L::OpenAnnotationRDF::Annotation.new }
|
@@ -800,8 +807,10 @@ END
|
|
800
807
|
document1.creator = [person1, person2]
|
801
808
|
document2.creator = person1
|
802
809
|
person1.knows = person2
|
810
|
+
person2.knows = person1
|
803
811
|
subject.item = [document1]
|
804
|
-
expect(subject.item.first.creator.first.knows.first.foafname)
|
812
|
+
expect(subject.item.first.creator.first.knows.first.foafname)
|
813
|
+
.to satisfy { |names| ['Alice', 'Bob'].include? names.first }
|
805
814
|
end
|
806
815
|
end
|
807
816
|
end
|