gearbox 0.1.0 → 0.1.10
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/Gemfile +5 -3
- data/Rakefile +1 -0
- data/VERSION +1 -1
- data/bin/gearbox +9 -0
- data/gearbox.gemspec +134 -0
- data/lib/gearbox.rb +124 -5
- data/lib/gearbox/attribute.rb +128 -0
- data/lib/gearbox/mixins/active_model_implementation.rb +27 -0
- data/lib/gearbox/mixins/resource.rb +20 -4
- data/lib/gearbox/mixins/semantic_accessors.rb +128 -89
- data/lib/gearbox/mixins/subject_methods.rb +88 -0
- data/lib/gearbox/rdf_collection.rb +22 -8
- data/lib/gearbox/types.rb +9 -8
- data/lib/gearbox/vocabulary.rb +149 -0
- data/lib/pry_utilities.rb +71 -0
- data/scratch/4s.rb +335 -0
- data/scratch/DEVELOPMENT_NOTES.md +85 -0
- data/scratch/actionable.md +34 -0
- data/scratch/ccrdf.html-rdfa.nq +100 -0
- data/scratch/foo.rb +17 -0
- data/scratch/index.rdf +7932 -0
- data/scratch/j2.rb +10 -0
- data/scratch/junk.rb +16 -0
- data/scratch/out.rb +67 -0
- data/spec/gearbox/attribute_spec.rb +455 -0
- data/spec/gearbox/mixins/active_model_implementation_spec.rb +18 -0
- data/spec/gearbox/mixins/ad_hoc_properties_spec.rb +44 -44
- data/spec/gearbox/mixins/resource_spec.rb +47 -8
- data/spec/gearbox/mixins/semantic_accessors_spec.rb +72 -43
- data/spec/gearbox/mixins/subject_methods_spec.rb +126 -0
- data/spec/gearbox/rdf_collection_spec.rb +28 -2
- data/spec/gearbox_spec.rb +6 -2
- data/spec/spec_helper.rb +1 -0
- metadata +150 -42
- data/Gemfile.lock +0 -138
- data/lib/examples/audience.rb +0 -24
- data/lib/examples/person.rb +0 -29
- data/lib/examples/reference.rb +0 -38
- data/lib/examples/theme.rb +0 -8
- data/spec/examples/audience_spec.rb +0 -28
- data/spec/examples/person_spec.rb +0 -45
- data/spec/examples/reference_spec.rb +0 -43
- data/spec/examples/theme_spec.rb +0 -137
data/Gemfile
CHANGED
@@ -1,8 +1,10 @@
|
|
1
1
|
source 'http://rubygems.org'
|
2
2
|
|
3
3
|
gem 'linkeddata'
|
4
|
-
gem '
|
5
|
-
gem '
|
4
|
+
gem 'sparql'
|
5
|
+
gem 'equivalent-xml'
|
6
|
+
gem 'activemodel'
|
7
|
+
gem "pry"
|
6
8
|
|
7
9
|
if RUBY_PLATFORM =~ /darwin/i
|
8
10
|
gem 'autotest-fsevent'
|
@@ -18,4 +20,4 @@ group :development do
|
|
18
20
|
gem 'guard-markdown'
|
19
21
|
gem "ruby-debug19"
|
20
22
|
gem 'guard-minitest', :git => 'git://github.com/aspiers/guard-minitest.git'
|
21
|
-
end
|
23
|
+
end
|
data/Rakefile
CHANGED
@@ -21,6 +21,7 @@ Jeweler::Tasks.new do |gem|
|
|
21
21
|
gem.description = %Q{A SPARQL-driven modeling toolset for semantic models.}
|
22
22
|
gem.email = "davidlamontrichards@gmail.com"
|
23
23
|
gem.authors = ["David Richards"]
|
24
|
+
gem.executables = %w(gearbox)
|
24
25
|
# dependencies defined in Gemfile
|
25
26
|
end
|
26
27
|
Jeweler::RubygemsDotOrgTasks.new
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.1.
|
1
|
+
0.1.10
|
data/bin/gearbox
ADDED
@@ -0,0 +1,9 @@
|
|
1
|
+
#!/usr/bin/env ruby -wKU
|
2
|
+
require 'yaml'
|
3
|
+
|
4
|
+
version = File.read(File.join(File.dirname(__FILE__), %w(.. VERSION)))
|
5
|
+
gearbox = File.join(File.dirname(__FILE__), %w(.. lib gearbox))
|
6
|
+
utilities = File.join(File.dirname(__FILE__), %w(.. lib pry_utilities))
|
7
|
+
libs = " -r #{gearbox} -r #{utilities}"
|
8
|
+
puts "Loading Gearbox version: #{version}"
|
9
|
+
exec "pry #{libs}"
|
data/gearbox.gemspec
ADDED
@@ -0,0 +1,134 @@
|
|
1
|
+
# Generated by jeweler
|
2
|
+
# DO NOT EDIT THIS FILE DIRECTLY
|
3
|
+
# Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
|
4
|
+
# -*- encoding: utf-8 -*-
|
5
|
+
|
6
|
+
Gem::Specification.new do |s|
|
7
|
+
s.name = "gearbox"
|
8
|
+
s.version = "0.1.10"
|
9
|
+
|
10
|
+
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
|
+
s.authors = ["David Richards"]
|
12
|
+
s.date = "2012-04-03"
|
13
|
+
s.description = "A SPARQL-driven modeling toolset for semantic models."
|
14
|
+
s.email = "davidlamontrichards@gmail.com"
|
15
|
+
s.executables = ["gearbox"]
|
16
|
+
s.extra_rdoc_files = [
|
17
|
+
"LICENSE.txt",
|
18
|
+
"README.html",
|
19
|
+
"README.md"
|
20
|
+
]
|
21
|
+
s.files = [
|
22
|
+
".document",
|
23
|
+
"Gemfile",
|
24
|
+
"Guardfile",
|
25
|
+
"LICENSE.txt",
|
26
|
+
"README.html",
|
27
|
+
"README.md",
|
28
|
+
"Rakefile",
|
29
|
+
"VERSION",
|
30
|
+
"bin/gearbox",
|
31
|
+
"gearbox.gemspec",
|
32
|
+
"lib/gearbox.rb",
|
33
|
+
"lib/gearbox/attribute.rb",
|
34
|
+
"lib/gearbox/attribute_collection.rb",
|
35
|
+
"lib/gearbox/mixins/active_model_implementation.rb",
|
36
|
+
"lib/gearbox/mixins/ad_hoc_properties.rb",
|
37
|
+
"lib/gearbox/mixins/resource.rb",
|
38
|
+
"lib/gearbox/mixins/semantic_accessors.rb",
|
39
|
+
"lib/gearbox/mixins/subject_methods.rb",
|
40
|
+
"lib/gearbox/rdf_collection.rb",
|
41
|
+
"lib/gearbox/type.rb",
|
42
|
+
"lib/gearbox/types.rb",
|
43
|
+
"lib/gearbox/types/any.rb",
|
44
|
+
"lib/gearbox/types/boolean.rb",
|
45
|
+
"lib/gearbox/types/date.rb",
|
46
|
+
"lib/gearbox/types/decimal.rb",
|
47
|
+
"lib/gearbox/types/float.rb",
|
48
|
+
"lib/gearbox/types/integer.rb",
|
49
|
+
"lib/gearbox/types/native.rb",
|
50
|
+
"lib/gearbox/types/string.rb",
|
51
|
+
"lib/gearbox/types/uri.rb",
|
52
|
+
"lib/gearbox/vocabulary.rb",
|
53
|
+
"lib/pry_utilities.rb",
|
54
|
+
"scratch/4s.rb",
|
55
|
+
"scratch/DEVELOPMENT_NOTES.md",
|
56
|
+
"scratch/actionable.md",
|
57
|
+
"scratch/ccrdf.html-rdfa.nq",
|
58
|
+
"scratch/foo.rb",
|
59
|
+
"scratch/index.rdf",
|
60
|
+
"scratch/j2.rb",
|
61
|
+
"scratch/junk.rb",
|
62
|
+
"scratch/out.rb",
|
63
|
+
"spec/gearbox/attribute_collection_spec.rb",
|
64
|
+
"spec/gearbox/attribute_spec.rb",
|
65
|
+
"spec/gearbox/mixins/active_model_implementation_spec.rb",
|
66
|
+
"spec/gearbox/mixins/ad_hoc_properties_spec.rb",
|
67
|
+
"spec/gearbox/mixins/resource_spec.rb",
|
68
|
+
"spec/gearbox/mixins/semantic_accessors_spec.rb",
|
69
|
+
"spec/gearbox/mixins/subject_methods_spec.rb",
|
70
|
+
"spec/gearbox/rdf_collection_spec.rb",
|
71
|
+
"spec/gearbox_spec.rb",
|
72
|
+
"spec/spec_helper.rb"
|
73
|
+
]
|
74
|
+
s.homepage = "http://github.com/davidrichards/gearbox"
|
75
|
+
s.licenses = ["MIT"]
|
76
|
+
s.require_paths = ["lib"]
|
77
|
+
s.rubygems_version = "1.8.18"
|
78
|
+
s.summary = "Flexible semantic models."
|
79
|
+
|
80
|
+
if s.respond_to? :specification_version then
|
81
|
+
s.specification_version = 3
|
82
|
+
|
83
|
+
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
84
|
+
s.add_runtime_dependency(%q<linkeddata>, [">= 0"])
|
85
|
+
s.add_runtime_dependency(%q<sparql>, [">= 0"])
|
86
|
+
s.add_runtime_dependency(%q<equivalent-xml>, [">= 0"])
|
87
|
+
s.add_runtime_dependency(%q<activemodel>, [">= 0"])
|
88
|
+
s.add_runtime_dependency(%q<pry>, [">= 0"])
|
89
|
+
s.add_runtime_dependency(%q<autotest-fsevent>, [">= 0"])
|
90
|
+
s.add_runtime_dependency(%q<autotest-growl>, [">= 0"])
|
91
|
+
s.add_development_dependency(%q<minitest>, [">= 0"])
|
92
|
+
s.add_development_dependency(%q<yard>, ["~> 0.6.0"])
|
93
|
+
s.add_development_dependency(%q<bundler>, [">= 0"])
|
94
|
+
s.add_development_dependency(%q<jeweler>, ["~> 1.6.4"])
|
95
|
+
s.add_development_dependency(%q<simplecov>, [">= 0"])
|
96
|
+
s.add_development_dependency(%q<guard-markdown>, [">= 0"])
|
97
|
+
s.add_development_dependency(%q<ruby-debug19>, [">= 0"])
|
98
|
+
s.add_development_dependency(%q<guard-minitest>, [">= 0"])
|
99
|
+
else
|
100
|
+
s.add_dependency(%q<linkeddata>, [">= 0"])
|
101
|
+
s.add_dependency(%q<sparql>, [">= 0"])
|
102
|
+
s.add_dependency(%q<equivalent-xml>, [">= 0"])
|
103
|
+
s.add_dependency(%q<activemodel>, [">= 0"])
|
104
|
+
s.add_dependency(%q<pry>, [">= 0"])
|
105
|
+
s.add_dependency(%q<autotest-fsevent>, [">= 0"])
|
106
|
+
s.add_dependency(%q<autotest-growl>, [">= 0"])
|
107
|
+
s.add_dependency(%q<minitest>, [">= 0"])
|
108
|
+
s.add_dependency(%q<yard>, ["~> 0.6.0"])
|
109
|
+
s.add_dependency(%q<bundler>, [">= 0"])
|
110
|
+
s.add_dependency(%q<jeweler>, ["~> 1.6.4"])
|
111
|
+
s.add_dependency(%q<simplecov>, [">= 0"])
|
112
|
+
s.add_dependency(%q<guard-markdown>, [">= 0"])
|
113
|
+
s.add_dependency(%q<ruby-debug19>, [">= 0"])
|
114
|
+
s.add_dependency(%q<guard-minitest>, [">= 0"])
|
115
|
+
end
|
116
|
+
else
|
117
|
+
s.add_dependency(%q<linkeddata>, [">= 0"])
|
118
|
+
s.add_dependency(%q<sparql>, [">= 0"])
|
119
|
+
s.add_dependency(%q<equivalent-xml>, [">= 0"])
|
120
|
+
s.add_dependency(%q<activemodel>, [">= 0"])
|
121
|
+
s.add_dependency(%q<pry>, [">= 0"])
|
122
|
+
s.add_dependency(%q<autotest-fsevent>, [">= 0"])
|
123
|
+
s.add_dependency(%q<autotest-growl>, [">= 0"])
|
124
|
+
s.add_dependency(%q<minitest>, [">= 0"])
|
125
|
+
s.add_dependency(%q<yard>, ["~> 0.6.0"])
|
126
|
+
s.add_dependency(%q<bundler>, [">= 0"])
|
127
|
+
s.add_dependency(%q<jeweler>, ["~> 1.6.4"])
|
128
|
+
s.add_dependency(%q<simplecov>, [">= 0"])
|
129
|
+
s.add_dependency(%q<guard-markdown>, [">= 0"])
|
130
|
+
s.add_dependency(%q<ruby-debug19>, [">= 0"])
|
131
|
+
s.add_dependency(%q<guard-minitest>, [">= 0"])
|
132
|
+
end
|
133
|
+
end
|
134
|
+
|
data/lib/gearbox.rb
CHANGED
@@ -1,12 +1,112 @@
|
|
1
1
|
# ================
|
2
2
|
# = Dependencies =
|
3
3
|
# ================
|
4
|
-
require 'uuid'
|
5
4
|
require 'linkeddata'
|
6
5
|
require 'ostruct'
|
6
|
+
require 'active_model'
|
7
7
|
|
8
8
|
module Gearbox
|
9
9
|
|
10
|
+
# =======================
|
11
|
+
# = Settings from Spira =
|
12
|
+
# =======================
|
13
|
+
##
|
14
|
+
# The list of repositories available for Gearbox resources
|
15
|
+
#
|
16
|
+
# @see http://rdf.rubyforge.org/RDF/Repository.html
|
17
|
+
# @return [Hash{Symbol => RDF::Repository}]
|
18
|
+
# @private
|
19
|
+
def repositories
|
20
|
+
settings[:repositories] ||= {}
|
21
|
+
end
|
22
|
+
module_function :repositories
|
23
|
+
|
24
|
+
##
|
25
|
+
# The list of all property types available for Gearbox resources
|
26
|
+
#
|
27
|
+
# @see Gearbox::Types
|
28
|
+
# @return [Hash{Symbol => Gearbox::Type}]
|
29
|
+
def types
|
30
|
+
settings[:types] ||= {}
|
31
|
+
end
|
32
|
+
module_function :types
|
33
|
+
|
34
|
+
##
|
35
|
+
# A thread-local hash for storing settings. Used by Resource classes.
|
36
|
+
#
|
37
|
+
# @see Gearbox::Resource
|
38
|
+
# @see Gearbox.repositories
|
39
|
+
# @see Gearbox.types
|
40
|
+
def settings
|
41
|
+
Thread.current[:gearbox] ||= {}
|
42
|
+
end
|
43
|
+
module_function :settings
|
44
|
+
|
45
|
+
##
|
46
|
+
# Add a repository to Gearbox's list of repositories.
|
47
|
+
#
|
48
|
+
# @overload add_repository(name, repo)
|
49
|
+
# @param [Symbol] name The name of this repository
|
50
|
+
# @param [RDF::Repository] repo An RDF::Repository
|
51
|
+
# @overload add_repository(name, klass, *args)
|
52
|
+
# @param [Symbol] name The name of this repository
|
53
|
+
# @param [RDF::Repository, Class] repo A Class that inherits from RDF::Repository
|
54
|
+
# @param [*Object] The list of arguments to instantiate the class
|
55
|
+
# @example Adding an ntriples file as a repository
|
56
|
+
# Gearbox.add_repository(:default, RDF::Repository.load('http://datagraph.org/jhacker/foaf.nt'))
|
57
|
+
# @example Adding an empty repository to be instantiated on use
|
58
|
+
# Gearbox.add_repository(:default, RDF::Repository)
|
59
|
+
# @return [Void]
|
60
|
+
# @see RDF::Repository
|
61
|
+
def add_repository(name, klass, *args)
|
62
|
+
repositories[name] = case klass
|
63
|
+
when Class
|
64
|
+
promise { klass.new(*args) }
|
65
|
+
else
|
66
|
+
klass
|
67
|
+
end
|
68
|
+
if (name == :default) && settings[:repositories][name].nil?
|
69
|
+
warn "WARNING: Adding nil default repository"
|
70
|
+
end
|
71
|
+
end
|
72
|
+
alias_method :add_repository!, :add_repository
|
73
|
+
module_function :add_repository, :add_repository!
|
74
|
+
|
75
|
+
##
|
76
|
+
# The RDF::Repository for the named repository
|
77
|
+
#
|
78
|
+
# @param [Symbol] name The name of the repository
|
79
|
+
# @return [RDF::Repository]
|
80
|
+
# @see RDF::Repository
|
81
|
+
def repository(name)
|
82
|
+
repositories[name]
|
83
|
+
end
|
84
|
+
module_function :repository
|
85
|
+
|
86
|
+
##
|
87
|
+
# Clear all repositories from Gearbox's knowledge. Use it if you want, but
|
88
|
+
# it's really here for testing.
|
89
|
+
#
|
90
|
+
# @return [Void]
|
91
|
+
# @private
|
92
|
+
def clear_repositories!
|
93
|
+
settings[:repositories] = {}
|
94
|
+
end
|
95
|
+
module_function :clear_repositories!
|
96
|
+
|
97
|
+
##
|
98
|
+
# Alias a property type to another. This allows a range of options to be
|
99
|
+
# specified for a property type which all reference one Gearbox::Type
|
100
|
+
#
|
101
|
+
# @param [Any] new The new symbol or reference
|
102
|
+
# @param [Any] original The type the new symbol should refer to
|
103
|
+
# @return [Void]
|
104
|
+
# @private
|
105
|
+
def type_alias(new, original)
|
106
|
+
types[new] = original
|
107
|
+
end
|
108
|
+
module_function :type_alias
|
109
|
+
|
10
110
|
# ========================
|
11
111
|
# = Helper Utility: path =
|
12
112
|
# ========================
|
@@ -20,21 +120,40 @@ module Gearbox
|
|
20
120
|
# =======================
|
21
121
|
# = Loading the Library =
|
22
122
|
# =======================
|
123
|
+
require path('type')
|
124
|
+
require path('types')
|
125
|
+
autoload :Attribute, path('attribute')
|
23
126
|
autoload :AttributeCollection, path('attribute_collection')
|
24
127
|
autoload :RDFCollection, path('rdf_collection')
|
25
128
|
|
26
129
|
autoload :AdHocProperties, path('mixins/ad_hoc_properties')
|
130
|
+
autoload :ActiveModelImplementation, path('mixins/active_model_implementation')
|
131
|
+
autoload :AttributeMethods, path('mixins/attribute_methods')
|
27
132
|
autoload :Resource, path('mixins/resource')
|
28
133
|
autoload :SemanticAccessors, path('mixins/semantic_accessors')
|
134
|
+
autoload :SubjectMethods, path('mixins/subject_methods')
|
29
135
|
|
136
|
+
end
|
137
|
+
|
138
|
+
module Example
|
139
|
+
# ========================
|
140
|
+
# = Helper Utility: path =
|
141
|
+
# ========================
|
142
|
+
# @private
|
143
|
+
def path(path)
|
144
|
+
File.expand_path("../examples/#{path}", __FILE__)
|
145
|
+
end
|
146
|
+
private :path
|
147
|
+
module_function :path
|
148
|
+
|
30
149
|
# ============
|
31
150
|
# = Examples =
|
32
151
|
# ============
|
33
152
|
|
34
153
|
# Will separate these after things get to a solid 0.1 state.
|
35
|
-
autoload :Audience, path('
|
36
|
-
autoload :Person, path('
|
37
|
-
autoload :Reference, path('
|
38
|
-
autoload :Theme, path('
|
154
|
+
autoload :Audience, path('audience')
|
155
|
+
autoload :Person, path('person')
|
156
|
+
autoload :Reference, path('reference')
|
157
|
+
autoload :Theme, path('theme')
|
39
158
|
|
40
159
|
end
|
@@ -0,0 +1,128 @@
|
|
1
|
+
module Gearbox
|
2
|
+
|
3
|
+
class Attribute
|
4
|
+
|
5
|
+
# Options to figure out: more index options, routing, triple pattern
|
6
|
+
attr_accessor :predicate, :reverse, :index, :name, :repository, :value, :language, :datatype
|
7
|
+
attr_reader :subject_decorator
|
8
|
+
|
9
|
+
def initialize(opts={})
|
10
|
+
set(opts.delete(:value) || :_value_not_set)
|
11
|
+
assert_defaults
|
12
|
+
extract_from_statement(opts) if opts.has_key?(:statement)
|
13
|
+
assert_options(opts)
|
14
|
+
end
|
15
|
+
|
16
|
+
def subject_decorator=(value=nil, &block)
|
17
|
+
@subject_decorator = block_given? ? block : value
|
18
|
+
end
|
19
|
+
|
20
|
+
# TODO: I'm a little quesy about the relationship between the model class, the model, and the attribute.
|
21
|
+
# I'm going to have to rebuild the model DSL and see how this stuff gets built.
|
22
|
+
def subject
|
23
|
+
return nil unless subject_decorator
|
24
|
+
if subject_decorator.respond_to?(:call)
|
25
|
+
subject_decorator.call()
|
26
|
+
elsif respond_to?(subject_decorator)
|
27
|
+
self.send(subject_decorator)
|
28
|
+
else
|
29
|
+
nil
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
def to_value
|
34
|
+
# Skipping the serialization steps for a moment.
|
35
|
+
@value
|
36
|
+
end
|
37
|
+
alias :get :to_value
|
38
|
+
|
39
|
+
def literal(opts={:value => :_value_not_set})
|
40
|
+
value = opts.delete(:value)
|
41
|
+
value = to_value if value == :_value_not_set
|
42
|
+
opts = {:language => self.language, :datatype => self.datatype}.merge(opts)
|
43
|
+
value = case opts[:datatype]
|
44
|
+
when :boolean
|
45
|
+
RDF::Literal::Boolean.new(value)
|
46
|
+
when :date
|
47
|
+
RDF::Literal::Date.new(value)
|
48
|
+
when :date_time
|
49
|
+
RDF::Literal::DateTime.new(value)
|
50
|
+
when :decimal
|
51
|
+
RDF::Literal::Decimal.new(value)
|
52
|
+
when :double
|
53
|
+
RDF::Literal::Double.new(value)
|
54
|
+
when :time
|
55
|
+
RDF::Literal::Time.new(value)
|
56
|
+
when :token
|
57
|
+
RDF::Literal::Token.new(value)
|
58
|
+
when :xml
|
59
|
+
RDF::Literal::XML.new(value)
|
60
|
+
else
|
61
|
+
value
|
62
|
+
end
|
63
|
+
|
64
|
+
RDF::Literal.new(value, opts)
|
65
|
+
end
|
66
|
+
|
67
|
+
def set(value=:_value_not_set, opts={})
|
68
|
+
opts = {:value => value}.merge(opts)
|
69
|
+
@value = literal(opts).object
|
70
|
+
end
|
71
|
+
|
72
|
+
def to_rdf(model, opts={})
|
73
|
+
opts[:value] = :_value_not_set unless opts.has_key?(:value)
|
74
|
+
opts = {
|
75
|
+
:reverse => self.reverse,
|
76
|
+
:predicate => self.predicate,
|
77
|
+
:value => self.literal(opts)
|
78
|
+
}.merge(opts)
|
79
|
+
|
80
|
+
subject = self.subject
|
81
|
+
subject ||= model.subject
|
82
|
+
subject = RDF::URI.new(subject)
|
83
|
+
predicate = opts[:predicate]
|
84
|
+
object = opts[:value]
|
85
|
+
|
86
|
+
return opts[:reverse] ? RDF::Statement(object, predicate, subject)
|
87
|
+
: RDF::Statement(subject, predicate, object)
|
88
|
+
end
|
89
|
+
|
90
|
+
private
|
91
|
+
|
92
|
+
def assert_defaults
|
93
|
+
self.index = false
|
94
|
+
self.reverse = false
|
95
|
+
end
|
96
|
+
|
97
|
+
def assert_options(opts)
|
98
|
+
opts.each do |accessor, value|
|
99
|
+
send("#{accessor}=", value) if respond_to?("#{accessor}=")
|
100
|
+
end
|
101
|
+
end
|
102
|
+
|
103
|
+
def extract_from_statement(opts)
|
104
|
+
statement = opts[:statement]
|
105
|
+
object = statement.object
|
106
|
+
|
107
|
+
self.reverse = can_infer_reverse_from_model?(opts[:model], object)
|
108
|
+
object = statement.subject if self.reverse
|
109
|
+
|
110
|
+
self.predicate = statement.predicate
|
111
|
+
self.set extract_from_literal(object)
|
112
|
+
end
|
113
|
+
|
114
|
+
def extract_from_literal(literal)
|
115
|
+
return literal unless literal.is_a?(RDF::Literal)
|
116
|
+
self.language = literal.language
|
117
|
+
self.datatype = literal.datatype
|
118
|
+
literal.object
|
119
|
+
end
|
120
|
+
|
121
|
+
def can_infer_reverse_from_model?(model, object)
|
122
|
+
return false unless model
|
123
|
+
model.subject.to_s == object.to_s
|
124
|
+
end
|
125
|
+
end
|
126
|
+
|
127
|
+
end
|
128
|
+
|