active-triples 0.2.3 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/lib/active_triples.rb +15 -9
- data/lib/active_triples/list.rb +10 -9
- data/lib/active_triples/nested_attributes.rb +2 -2
- data/lib/active_triples/node_config.rb +2 -1
- data/lib/active_triples/properties.rb +44 -58
- data/lib/active_triples/property_builder.rb +53 -0
- data/lib/active_triples/reflection.rb +30 -0
- data/lib/active_triples/resource.rb +23 -18
- data/lib/active_triples/term.rb +14 -10
- data/lib/active_triples/version.rb +1 -1
- data/spec/active_triples/configurable_spec.rb +2 -1
- data/spec/active_triples/list_spec.rb +5 -5
- data/spec/active_triples/nested_attributes_spec.rb +3 -3
- data/spec/active_triples/properties_spec.rb +9 -7
- data/spec/active_triples/resource_spec.rb +24 -5
- data/spec/active_triples/term_spec.rb +5 -2
- 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: 6fe9b5e7c31b1ebd51f2c529d354c27ff5a50461
|
4
|
+
data.tar.gz: 96039e8d7e41040748705955d064101fce40f236
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6c2474afde1a6b48790bed08a67caf0e413f8339cfa5993f0ef6bcb277cf642c21bc5d0f2e1ce830f735766d704ca35cd6bacc3076a1645d52f96f28ba44cd7a
|
7
|
+
data.tar.gz: abbe7fd8978112727f975413aa4cb5bb9a20cfc443c4e2f128d4469010391f20bc79e3466575e68153413b1db7763c7be1aa7f633ed6c75796e3213ac460af37
|
data/lib/active_triples.rb
CHANGED
@@ -1,16 +1,22 @@
|
|
1
1
|
require 'rdf'
|
2
2
|
require 'active_triples/version'
|
3
|
+
require 'active_support'
|
3
4
|
|
4
5
|
module ActiveTriples
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
6
|
+
extend ActiveSupport::Autoload
|
7
|
+
eager_autoload do
|
8
|
+
autoload :Resource
|
9
|
+
autoload :List
|
10
|
+
autoload :Term
|
11
|
+
autoload :Indexing
|
12
|
+
autoload :Configurable
|
13
|
+
autoload :Properties
|
14
|
+
autoload :PropertyBuilder
|
15
|
+
autoload :Reflection
|
16
|
+
autoload :Repositories
|
17
|
+
autoload :NodeConfig
|
18
|
+
autoload :NestedAttributes
|
19
|
+
end
|
14
20
|
|
15
21
|
def self.class_from_string(class_name, container_class=Kernel)
|
16
22
|
container_class = container_class.name if container_class.is_a? Module
|
data/lib/active_triples/list.rb
CHANGED
@@ -8,7 +8,8 @@ module ActiveTriples
|
|
8
8
|
class List < RDF::List
|
9
9
|
include ActiveTriples::NestedAttributes
|
10
10
|
extend Configurable
|
11
|
-
|
11
|
+
include Properties
|
12
|
+
include Reflection
|
12
13
|
|
13
14
|
delegate :rdf_subject, :mark_for_destruction, :marked_for_destruction?, :set_value, :get_values, :parent, :type, :dump, :attributes=, to: :resource
|
14
15
|
alias_method :to_ary, :to_a
|
@@ -30,10 +31,6 @@ module ActiveTriples
|
|
30
31
|
@graph = ListResource.new(subject) << graph unless graph.kind_of? Resource
|
31
32
|
graph << parent if parent
|
32
33
|
graph.list = self
|
33
|
-
graph.singleton_class.properties = self.class.properties
|
34
|
-
graph.singleton_class.properties.keys.each do |property|
|
35
|
-
graph.singleton_class.send(:register_property, property)
|
36
|
-
end
|
37
34
|
graph.reload
|
38
35
|
end
|
39
36
|
|
@@ -107,11 +104,15 @@ module ActiveTriples
|
|
107
104
|
@list ||= list
|
108
105
|
end
|
109
106
|
|
107
|
+
def reflections
|
108
|
+
@list.class
|
109
|
+
end
|
110
|
+
|
110
111
|
def attributes=(values)
|
111
112
|
raise ArgumentError, "values must be a Hash, you provided #{values.class}" unless values.kind_of? Hash
|
112
113
|
values.with_indifferent_access.each do |key, value|
|
113
|
-
if
|
114
|
-
klass =
|
114
|
+
if reflections.properties.keys.map { |k| "#{k}_attributes" }.include?(key)
|
115
|
+
klass = reflections.reflect_on_property(key[0..-12])['class_name']
|
115
116
|
klass = ActiveTriples.class_from_string(klass, final_parent.class) if klass.is_a? String
|
116
117
|
value.is_a?(Hash) ? attributes_hash_to_list(values[key], klass) : attributes_to_list(value, klass)
|
117
118
|
values.delete key
|
@@ -159,9 +160,9 @@ module ActiveTriples
|
|
159
160
|
when Array then RDF::List.new(nil, graph, value)
|
160
161
|
else value
|
161
162
|
end
|
162
|
-
|
163
|
+
|
163
164
|
if subject == RDF.nil
|
164
|
-
@subject = RDF::Node.new
|
165
|
+
@subject = RDF::Node.new
|
165
166
|
@graph = ListResource.new(subject)
|
166
167
|
@graph.type = RDF.List
|
167
168
|
end
|
@@ -50,7 +50,7 @@ module ActiveTriples
|
|
50
50
|
|
51
51
|
attributes_collection.each do |attributes|
|
52
52
|
attributes = attributes.with_indifferent_access
|
53
|
-
|
53
|
+
|
54
54
|
if attributes['id'] && existing_record = association.detect { |record| record.rdf_subject.to_s == attributes['id'].to_s }
|
55
55
|
if !call_reject_if(association_name, attributes)
|
56
56
|
assign_to_or_mark_for_destruction(existing_record, attributes, options[:allow_destroy])
|
@@ -83,7 +83,7 @@ module ActiveTriples
|
|
83
83
|
def has_destroy_flag?(hash)
|
84
84
|
["1", "true"].include?(hash['_destroy'].to_s)
|
85
85
|
end
|
86
|
-
|
86
|
+
|
87
87
|
module ClassMethods
|
88
88
|
def accepts_nested_attributes_for *attr_names
|
89
89
|
options = { :allow_destroy => false, :update_only => false }
|
@@ -6,8 +6,9 @@ module ActiveTriples
|
|
6
6
|
self.term = term
|
7
7
|
self.predicate = predicate
|
8
8
|
self.class_name = args.delete(:class_name)
|
9
|
-
self.multivalue = args.delete(:multivalue) { true }
|
9
|
+
self.multivalue = args.delete(:multivalue) { true }
|
10
10
|
raise ArgumentError, "Invalid arguments for Rdf Node configuration: #{args} on #{predicate}" unless args.empty?
|
11
|
+
yield(self) if block_given?
|
11
12
|
end
|
12
13
|
|
13
14
|
def [](value)
|
@@ -11,73 +11,59 @@ module ActiveTriples
|
|
11
11
|
# property :title, predicate: RDF::DC.title, class_name: ResourceClass
|
12
12
|
#
|
13
13
|
module Properties
|
14
|
-
|
14
|
+
extend ActiveSupport::Concern
|
15
15
|
|
16
|
-
|
17
|
-
|
18
|
-
# @param [Symbol] name of the property (and its accessor methods)
|
19
|
-
# @param [Hash] opts for this property, must include a :predicate
|
20
|
-
# @yield [index] index sets solr behaviors for the property
|
21
|
-
def property(name, opts={}, &block)
|
22
|
-
self.config[name] = NodeConfig.new(name, opts[:predicate], opts.except(:predicate)).tap do |config|
|
23
|
-
config.with_index(&block) if block_given?
|
24
|
-
end
|
25
|
-
behaviors = config[name].behaviors.flatten if config[name].behaviors and not config[name].behaviors.empty?
|
26
|
-
register_property(name)
|
16
|
+
included do
|
17
|
+
initialize_generated_modules
|
27
18
|
end
|
28
19
|
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
# @return [ActiveSupport::HashWithIndifferentAccess{String => ActiveTriples::NodeConfig}]
|
34
|
-
def config
|
35
|
-
@config ||= if superclass.respond_to? :config
|
36
|
-
superclass.config.dup
|
37
|
-
else
|
38
|
-
{}.with_indifferent_access
|
20
|
+
module ClassMethods
|
21
|
+
def inherited(child_class) #:nodoc:
|
22
|
+
child_class.initialize_generated_modules
|
23
|
+
super
|
39
24
|
end
|
40
|
-
end
|
41
|
-
|
42
|
-
alias_method :properties, :config
|
43
|
-
alias_method :properties=, :config=
|
44
25
|
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
#
|
49
|
-
# @param term [#to_sym, RDF::Resource] a property name to predicate
|
50
|
-
#
|
51
|
-
# @return [ActiveTriples::NodeConfig]
|
52
|
-
def config_for_term_or_uri(term)
|
53
|
-
return config[term.to_sym] unless term.kind_of? RDF::Resource
|
54
|
-
config.each { |k, v| return v if v.predicate == term.to_uri }
|
55
|
-
end
|
26
|
+
def initialize_generated_modules # :nodoc:
|
27
|
+
generated_property_methods
|
28
|
+
end
|
56
29
|
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
end
|
30
|
+
def generated_property_methods
|
31
|
+
@generated_property_methods ||= begin
|
32
|
+
mod = const_set(:GeneratedPropertyMethods, Module.new)
|
33
|
+
include mod
|
34
|
+
mod
|
35
|
+
end
|
36
|
+
end
|
65
37
|
|
66
|
-
|
38
|
+
##
|
39
|
+
# Registers properties for Resource-like classes
|
40
|
+
# @param [Symbol] name of the property (and its accessor methods)
|
41
|
+
# @param [Hash] opts for this property, must include a :predicate
|
42
|
+
# @yield [index] index sets solr behaviors for the property
|
43
|
+
def property(name, opts={}, &block)
|
44
|
+
reflection = PropertyBuilder.build(self, name, opts, &block)
|
45
|
+
Reflection.add_reflection self, name, reflection
|
46
|
+
end
|
67
47
|
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
48
|
+
##
|
49
|
+
# Given a property name or a predicate, return the configuration
|
50
|
+
# for the matching property.
|
51
|
+
#
|
52
|
+
# @param term [#to_sym, RDF::Resource] a property name to predicate
|
53
|
+
#
|
54
|
+
# @return [ActiveTriples::NodeConfig]
|
55
|
+
def config_for_term_or_uri(term)
|
56
|
+
return config[term.to_sym] unless term.kind_of? RDF::Resource
|
57
|
+
config.each_value { |v| return v if v.predicate == term.to_uri }
|
78
58
|
end
|
79
|
-
|
80
|
-
|
59
|
+
|
60
|
+
##
|
61
|
+
# List the property names registered to the class.
|
62
|
+
#
|
63
|
+
# @return [Array<Symbol>] list of the symbolized names of registered
|
64
|
+
# properties
|
65
|
+
def fields
|
66
|
+
properties.keys.map(&:to_sym)
|
81
67
|
end
|
82
68
|
end
|
83
69
|
end
|
@@ -0,0 +1,53 @@
|
|
1
|
+
module ActiveTriples
|
2
|
+
class PropertyBuilder
|
3
|
+
|
4
|
+
attr_reader :name, :options
|
5
|
+
|
6
|
+
def initialize(name, options, &block)
|
7
|
+
@name = name
|
8
|
+
@options = options
|
9
|
+
end
|
10
|
+
|
11
|
+
def self.create_builder(name, options, &block)
|
12
|
+
raise ArgumentError, "property names must be a Symbol" unless name.kind_of?(Symbol)
|
13
|
+
|
14
|
+
new(name, options, &block)
|
15
|
+
end
|
16
|
+
|
17
|
+
def self.build(model, name, options, &block)
|
18
|
+
builder = create_builder name, options, &block
|
19
|
+
reflection = builder.build(&block)
|
20
|
+
define_accessors model, reflection
|
21
|
+
reflection
|
22
|
+
end
|
23
|
+
|
24
|
+
def self.define_accessors(model, reflection)
|
25
|
+
mixin = model.generated_property_methods
|
26
|
+
name = reflection.term
|
27
|
+
define_readers(mixin, name)
|
28
|
+
define_writers(mixin, name)
|
29
|
+
end
|
30
|
+
|
31
|
+
def self.define_readers(mixin, name)
|
32
|
+
mixin.class_eval <<-CODE, __FILE__, __LINE__ + 1
|
33
|
+
def #{name}(*args)
|
34
|
+
get_values(:#{name})
|
35
|
+
end
|
36
|
+
CODE
|
37
|
+
end
|
38
|
+
|
39
|
+
def self.define_writers(mixin, name)
|
40
|
+
mixin.class_eval <<-CODE, __FILE__, __LINE__ + 1
|
41
|
+
def #{name}=(value)
|
42
|
+
set_value(:#{name}, value)
|
43
|
+
end
|
44
|
+
CODE
|
45
|
+
end
|
46
|
+
|
47
|
+
def build(&block)
|
48
|
+
NodeConfig.new(name, options[:predicate], options.except(:predicate)) do |config|
|
49
|
+
config.with_index(&block) if block_given?
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
require 'active_support/core_ext/class'
|
2
|
+
|
3
|
+
module ActiveTriples
|
4
|
+
module Reflection
|
5
|
+
extend ActiveSupport::Concern
|
6
|
+
|
7
|
+
included do
|
8
|
+
class_attribute :_active_triples_config
|
9
|
+
self._active_triples_config = {}
|
10
|
+
end
|
11
|
+
|
12
|
+
def self.add_reflection(model, name, reflection)
|
13
|
+
model._active_triples_config = model._active_triples_config.merge(name.to_s => reflection)
|
14
|
+
end
|
15
|
+
|
16
|
+
module ClassMethods
|
17
|
+
def reflect_on_property(term)
|
18
|
+
_active_triples_config[term.to_s]
|
19
|
+
end
|
20
|
+
|
21
|
+
def properties
|
22
|
+
_active_triples_config
|
23
|
+
end
|
24
|
+
|
25
|
+
def properties=(val)
|
26
|
+
self._active_triples_config = val
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -22,7 +22,7 @@ module ActiveTriples
|
|
22
22
|
class Resource < RDF::Graph
|
23
23
|
@@type_registry
|
24
24
|
extend Configurable
|
25
|
-
|
25
|
+
include Properties
|
26
26
|
extend Deprecation
|
27
27
|
extend ActiveModel::Naming
|
28
28
|
extend ActiveModel::Translation
|
@@ -31,6 +31,7 @@ module ActiveTriples
|
|
31
31
|
include ActiveModel::Serialization
|
32
32
|
include ActiveModel::Serializers::JSON
|
33
33
|
include NestedAttributes
|
34
|
+
include Reflection
|
34
35
|
attr_accessor :parent
|
35
36
|
|
36
37
|
class << self
|
@@ -116,14 +117,18 @@ module ActiveTriples
|
|
116
117
|
hash
|
117
118
|
end
|
118
119
|
|
120
|
+
def reflections
|
121
|
+
self.class
|
122
|
+
end
|
123
|
+
|
119
124
|
def attributes=(values)
|
120
125
|
raise ArgumentError, "values must be a Hash, you provided #{values.class}" unless values.kind_of? Hash
|
121
126
|
values = values.with_indifferent_access
|
122
127
|
set_subject!(values.delete(:id)) if values.has_key?(:id) and node?
|
123
128
|
values.each do |key, value|
|
124
|
-
if
|
129
|
+
if reflections.reflect_on_property(key)
|
125
130
|
set_value(rdf_subject, key, value)
|
126
|
-
elsif
|
131
|
+
elsif nested_attributes_options.keys.map { |k| "#{k}_attributes" }.include?(key)
|
127
132
|
send("#{key}=".to_sym, value)
|
128
133
|
else
|
129
134
|
raise ArgumentError, "No association found for name `#{key}'. Has it been defined yet?"
|
@@ -143,7 +148,7 @@ module ActiveTriples
|
|
143
148
|
# @return [String]
|
144
149
|
def dump(*args)
|
145
150
|
if args.first == :jsonld and respond_to?(:jsonld_context)
|
146
|
-
args << {} unless args.last.is_a?(Hash)
|
151
|
+
args << {} unless args.last.is_a?(Hash)
|
147
152
|
args.last[:context] ||= jsonld_context
|
148
153
|
end
|
149
154
|
super
|
@@ -206,16 +211,16 @@ module ActiveTriples
|
|
206
211
|
end
|
207
212
|
|
208
213
|
##
|
209
|
-
# Load data from the #rdf_subject URI. Retrieved data will be
|
214
|
+
# Load data from the #rdf_subject URI. Retrieved data will be
|
210
215
|
# parsed into the Resource's graph from available RDF::Readers
|
211
|
-
# and available from property accessors if if predicates are
|
216
|
+
# and available from property accessors if if predicates are
|
212
217
|
# registered.
|
213
|
-
#
|
218
|
+
#
|
214
219
|
# osu = ActiveTriples::Resource.new('http://dbpedia.org/resource/Oregon_State_University')
|
215
220
|
# osu.fetch
|
216
221
|
# osu.rdf_label.first
|
217
222
|
# # => "Oregon State University"
|
218
|
-
#
|
223
|
+
#
|
219
224
|
# @return [ActiveTriples::Resource] self
|
220
225
|
def fetch
|
221
226
|
load(rdf_subject)
|
@@ -405,23 +410,23 @@ module ActiveTriples
|
|
405
410
|
end
|
406
411
|
|
407
412
|
private
|
408
|
-
|
413
|
+
|
409
414
|
##
|
410
415
|
# Returns the properties registered and their configurations.
|
411
416
|
#
|
412
417
|
# @return [ActiveSupport::HashWithIndifferentAccess{String => ActiveTriples::NodeConfig}]
|
413
418
|
def properties
|
414
|
-
|
419
|
+
_active_triples_config
|
415
420
|
end
|
416
421
|
|
417
422
|
##
|
418
423
|
# List of RDF predicates registered as properties on the object.
|
419
424
|
#
|
420
425
|
# @return [Array<RDF::URI>]
|
421
|
-
def registered_predicates
|
426
|
+
def registered_predicates
|
422
427
|
properties.values.map { |config| config.predicate }
|
423
428
|
end
|
424
|
-
|
429
|
+
|
425
430
|
##
|
426
431
|
# List of RDF predicates used in the Resource's triples, but not
|
427
432
|
# mapped to any property or accessor methods.
|
@@ -434,12 +439,12 @@ module ActiveTriples
|
|
434
439
|
end
|
435
440
|
|
436
441
|
##
|
437
|
-
# Given a predicate which has been registered to a property,
|
442
|
+
# Given a predicate which has been registered to a property,
|
438
443
|
# returns the name of the matching property.
|
439
444
|
#
|
440
445
|
# @param predicate [RDF::URI]
|
441
446
|
#
|
442
|
-
# @return [String, nil] the name of the property mapped to the
|
447
|
+
# @return [String, nil] the name of the property mapped to the
|
443
448
|
# predicate provided
|
444
449
|
def property_for_predicate(predicate)
|
445
450
|
properties.each do |property, values|
|
@@ -463,7 +468,7 @@ module ActiveTriples
|
|
463
468
|
# @return [RDF::Repository, ActiveTriples::Resource] the target
|
464
469
|
# repository
|
465
470
|
def repository
|
466
|
-
@repository ||=
|
471
|
+
@repository ||=
|
467
472
|
if self.class.repository == :parent
|
468
473
|
final_parent
|
469
474
|
else
|
@@ -476,16 +481,16 @@ module ActiveTriples
|
|
476
481
|
# an RDF term. If a String is given, first tries to interpret it
|
477
482
|
# as a valid URI, then tries to append it to base_uri. Finally,
|
478
483
|
# raises an error if no valid term can be built.
|
479
|
-
#
|
484
|
+
#
|
480
485
|
# The argument must be an RDF::Node, an object that responds to
|
481
486
|
# #to_uri, a String that represents a valid URI, or a String that
|
482
487
|
# appends to the Resource's base_uri to create a valid URI.
|
483
488
|
#
|
484
|
-
# @TODO: URI.scheme_list is naive and incomplete. Find a better
|
489
|
+
# @TODO: URI.scheme_list is naive and incomplete. Find a better
|
485
490
|
# way to check for an existing scheme.
|
486
491
|
#
|
487
492
|
# @param uri_or_str [RDF::Resource, String]
|
488
|
-
#
|
493
|
+
#
|
489
494
|
# @return [RDF::Resource] A term
|
490
495
|
# @raise [RuntimeError] no valid RDF term could be built
|
491
496
|
def get_uri(uri_or_str)
|
data/lib/active_triples/term.rb
CHANGED
@@ -4,11 +4,13 @@ module ActiveTriples
|
|
4
4
|
class Term
|
5
5
|
|
6
6
|
attr_accessor :parent, :value_arguments, :node_cache
|
7
|
+
attr_reader :reflections
|
7
8
|
|
8
9
|
delegate *(Array.public_instance_methods - [:send, :__send__, :__id__, :class, :object_id] + [:as_json]), :to => :result
|
9
10
|
|
10
|
-
def initialize(
|
11
|
-
self.parent =
|
11
|
+
def initialize(parent_resource, value_arguments)
|
12
|
+
self.parent = parent_resource
|
13
|
+
@reflections = parent_resource.reflections
|
12
14
|
self.value_arguments = value_arguments
|
13
15
|
end
|
14
16
|
|
@@ -18,8 +20,10 @@ module ActiveTriples
|
|
18
20
|
|
19
21
|
def result
|
20
22
|
result = parent.query(:subject => rdf_subject, :predicate => predicate)
|
21
|
-
.
|
22
|
-
|
23
|
+
.each_with_object([]) do |x, collector|
|
24
|
+
converted_object = convert_object(x.object)
|
25
|
+
collector << converted_object unless converted_object.nil?
|
26
|
+
end
|
23
27
|
return result if !property_config || property_config[:multivalue]
|
24
28
|
result.first
|
25
29
|
end
|
@@ -42,9 +46,9 @@ module ActiveTriples
|
|
42
46
|
end
|
43
47
|
|
44
48
|
def build(attributes={})
|
45
|
-
new_subject = attributes.
|
49
|
+
new_subject = attributes.fetch('id') { RDF::Node.new }
|
46
50
|
make_node(new_subject).tap do |node|
|
47
|
-
node.attributes = attributes
|
51
|
+
node.attributes = attributes.except('id')
|
48
52
|
if parent.kind_of? List::ListResource
|
49
53
|
parent.list << node
|
50
54
|
elsif node.kind_of? RDF::List
|
@@ -73,8 +77,8 @@ module ActiveTriples
|
|
73
77
|
alias_method :push, :<<
|
74
78
|
|
75
79
|
def property_config
|
76
|
-
return type_property if (property == RDF.type || property.to_s == "type") && !
|
77
|
-
|
80
|
+
return type_property if (property == RDF.type || property.to_s == "type") && (!reflections.kind_of?(Resource) || !reflections.reflect_on_property(property))
|
81
|
+
reflections.reflect_on_property(property)
|
78
82
|
end
|
79
83
|
|
80
84
|
def type_property
|
@@ -113,7 +117,7 @@ module ActiveTriples
|
|
113
117
|
return
|
114
118
|
end
|
115
119
|
val = val.to_uri if val.respond_to? :to_uri
|
116
|
-
raise
|
120
|
+
raise "value must be an RDF URI, Node, Literal, or a valid datatype. See RDF::Literal.\n\tYou provided #{val.inspect}" unless
|
117
121
|
val.kind_of? RDF::Value or val.kind_of? RDF::Literal
|
118
122
|
parent.insert [rdf_subject, predicate, val]
|
119
123
|
end
|
@@ -144,7 +148,7 @@ module ActiveTriples
|
|
144
148
|
def convert_object(value)
|
145
149
|
case value
|
146
150
|
when RDF::Literal
|
147
|
-
value.object
|
151
|
+
value.object
|
148
152
|
when RDF::Resource
|
149
153
|
make_node(value)
|
150
154
|
else
|
@@ -29,7 +29,8 @@ describe ActiveTriples::Configurable do
|
|
29
29
|
|
30
30
|
describe '#rdf_type' do
|
31
31
|
it "should set the type the old way" do
|
32
|
-
DummyConfigurable.
|
32
|
+
expect(DummyConfigurable).to receive(:configure).with(type: RDF::RDFS.Class).and_call_original
|
33
|
+
expect(Deprecation).to receive(:warn)
|
33
34
|
DummyConfigurable.rdf_type(RDF::RDFS.Class)
|
34
35
|
expect(DummyConfigurable.type).to eq RDF::RDFS.Class
|
35
36
|
end
|
@@ -5,7 +5,7 @@ require 'linkeddata'
|
|
5
5
|
describe ActiveTriples::List do
|
6
6
|
|
7
7
|
subject { ActiveTriples::List.new }
|
8
|
-
|
8
|
+
|
9
9
|
context 'when empty' do
|
10
10
|
it 'has subject of RDF.nil' do
|
11
11
|
expect(subject.subject).to eq RDF.nil
|
@@ -43,7 +43,7 @@ describe ActiveTriples::List do
|
|
43
43
|
it 'has correct number of elements' do
|
44
44
|
expect(subject.length).to eq 3
|
45
45
|
end
|
46
|
-
|
46
|
+
|
47
47
|
context 'after clear' do
|
48
48
|
before do
|
49
49
|
subject.clear
|
@@ -247,7 +247,7 @@ END
|
|
247
247
|
expect(doc.xpath('//mads:ComplexSubject/mads:elementList/*[position() = 2]/mads:elementValue', ns).map(&:text)).to eq ["Relations with Mexican Americans"]
|
248
248
|
expect(doc.xpath('//mads:ComplexSubject/mads:elementList/*[position() = 3]/@rdf:about', ns).map(&:value)).to eq ["http://library.ucsd.edu/ark:/20775/bbXXXXXXX4"]
|
249
249
|
expect(doc.xpath('//mads:ComplexSubject/mads:elementList/*[position() = 4]/mads:elementValue', ns).map(&:text)).to eq ["1900s"]
|
250
|
-
expect(RDF::List.new(list.rdf_subject, subject
|
250
|
+
expect(RDF::List.new(list.rdf_subject, subject)).to be_valid
|
251
251
|
end
|
252
252
|
|
253
253
|
it "should be a valid list" do
|
@@ -255,9 +255,9 @@ END
|
|
255
255
|
# TODO this is a workaround for https://github.com/projecthydra/active_fedora/issues/444
|
256
256
|
# remove the following line when #444 is closed.
|
257
257
|
list.resource.persist!
|
258
|
-
expect(RDF::List.new(list.rdf_subject, subject
|
258
|
+
expect(RDF::List.new(list.rdf_subject, subject)).to be_valid
|
259
259
|
end
|
260
|
-
end
|
260
|
+
end
|
261
261
|
end
|
262
262
|
end
|
263
263
|
end
|
@@ -85,7 +85,7 @@ describe "nesting attribute behavior" do
|
|
85
85
|
personalName_attributes: [
|
86
86
|
{
|
87
87
|
id: 'http://library.ucsd.edu/ark:20775/jefferson',
|
88
|
-
elementList_attributes: [{
|
88
|
+
elementList_attributes: [{
|
89
89
|
fullNameElement: "Jefferson, Thomas",
|
90
90
|
dateNameElement: "1743-1826"
|
91
91
|
}]
|
@@ -123,12 +123,12 @@ describe "nesting attribute behavior" do
|
|
123
123
|
expect(subject.personalName.first.elementList.first.fullNameElement).to eq ["Jefferson, Thomas"]
|
124
124
|
expect(subject.personalName.first.elementList.first.dateNameElement).to eq ["1743-1826"]
|
125
125
|
end
|
126
|
-
|
126
|
+
|
127
127
|
it 'should build nodes with ids' do
|
128
128
|
expect(subject.topic[0].elementList.first[0].rdf_subject).to eq 'http://library.ucsd.edu/ark:/20775/bb3333333x'
|
129
129
|
expect(subject.personalName.first.rdf_subject).to eq 'http://library.ucsd.edu/ark:20775/jefferson'
|
130
130
|
end
|
131
|
-
|
131
|
+
|
132
132
|
it 'should fail when writing to a non-predicate' do
|
133
133
|
attributes = { topic_attributes: { '0' => { elementList_attributes: [{ topicElement_attributes: [{ fake_predicate:"Cosmology" }] }]}}}
|
134
134
|
expect{ subject.attributes = attributes }.to raise_error ArgumentError
|
@@ -2,7 +2,8 @@ require "spec_helper"
|
|
2
2
|
describe ActiveTriples::Properties do
|
3
3
|
before do
|
4
4
|
class DummyProperties
|
5
|
-
|
5
|
+
include ActiveTriples::Reflection
|
6
|
+
include ActiveTriples::Properties
|
6
7
|
end
|
7
8
|
end
|
8
9
|
|
@@ -13,29 +14,29 @@ describe ActiveTriples::Properties do
|
|
13
14
|
describe '#property' do
|
14
15
|
it 'should set a property' do
|
15
16
|
DummyProperties.property :title, :predicate => RDF::DC.title
|
16
|
-
expect(DummyProperties.
|
17
|
+
expect(DummyProperties.reflect_on_property(:title)).to be_kind_of ActiveTriples::NodeConfig
|
17
18
|
end
|
18
19
|
|
19
20
|
it 'should set index behaviors' do
|
20
21
|
DummyProperties.property :title, :predicate => RDF::DC.title do |index|
|
21
22
|
index.as :facetable, :searchable
|
22
23
|
end
|
23
|
-
expect(DummyProperties.
|
24
|
+
expect(DummyProperties.reflect_on_property(:title)[:behaviors]).to eq [:facetable, :searchable]
|
24
25
|
end
|
25
26
|
|
26
27
|
it 'should set class name' do
|
27
28
|
DummyProperties.property :title, :predicate => RDF::DC.title, :class_name => RDF::Literal
|
28
|
-
expect(DummyProperties.
|
29
|
+
expect(DummyProperties.reflect_on_property(:title)[:class_name]).to eq RDF::Literal
|
29
30
|
end
|
30
31
|
|
31
32
|
it "should constantize string class names" do
|
32
33
|
DummyProperties.property :title, :predicate => RDF::DC.title, :class_name => "RDF::Literal"
|
33
|
-
expect(DummyProperties.
|
34
|
+
expect(DummyProperties.reflect_on_property(:title)[:class_name]).to eq RDF::Literal
|
34
35
|
end
|
35
36
|
|
36
37
|
it "should keep strings which it can't constantize as strings" do
|
37
38
|
DummyProperties.property :title, :predicate => RDF::DC.title, :class_name => "FakeClassName"
|
38
|
-
expect(DummyProperties.
|
39
|
+
expect(DummyProperties.reflect_on_property(:title)[:class_name]).to eq "FakeClassName"
|
39
40
|
end
|
40
41
|
end
|
41
42
|
|
@@ -52,7 +53,8 @@ describe ActiveTriples::Properties do
|
|
52
53
|
end
|
53
54
|
|
54
55
|
it 'should carry properties from superclass' do
|
55
|
-
expect(DummySubClass.
|
56
|
+
expect(DummySubClass.reflect_on_property(:title)).to be_kind_of ActiveTriples::NodeConfig
|
57
|
+
expect(DummySubClass.reflect_on_property(:source)).to be_kind_of ActiveTriples::NodeConfig
|
56
58
|
end
|
57
59
|
end
|
58
60
|
end
|
@@ -202,7 +202,7 @@ describe ActiveTriples::Resource do
|
|
202
202
|
end
|
203
203
|
end
|
204
204
|
end
|
205
|
-
|
205
|
+
|
206
206
|
describe 'class_name' do
|
207
207
|
it 'should raise an error when not a class or string' do
|
208
208
|
DummyResource.property :relation, :predicate => RDF::DC.relation, :class_name => RDF::URI('http://example.org')
|
@@ -210,14 +210,33 @@ describe ActiveTriples::Resource do
|
|
210
210
|
d.relation = RDF::DC.type
|
211
211
|
expect { d.relation.first }.to raise_error "class_name for relation is a RDF::URI; must be a class"
|
212
212
|
end
|
213
|
-
|
213
|
+
|
214
214
|
it 'should return nil when none is given' do
|
215
|
-
expect(DummyResource.
|
215
|
+
expect(DummyResource.reflect_on_property('title')[:class_name]).to be_nil
|
216
216
|
end
|
217
|
+
|
217
218
|
end
|
218
|
-
|
219
|
+
|
220
|
+
context 'property configuration' do
|
221
|
+
it 'preserves previous #properties[] API but prefers #reflect_on_property' do
|
222
|
+
expect(DummyResource.reflect_on_property('title')).to eq(DummyResource.properties.fetch('title'))
|
223
|
+
end
|
224
|
+
|
225
|
+
it 'uses hash access on #properties to retrieve the configuration' do
|
226
|
+
expect(DummyResource.properties['title']).to be_a(ActiveTriples::NodeConfig)
|
227
|
+
end
|
228
|
+
|
229
|
+
it 'stores the properties configuration as a hash' do
|
230
|
+
expect(DummyResource.properties).to be_a(Hash)
|
231
|
+
end
|
232
|
+
|
233
|
+
it "uses reflection to retrieve a property's configuration" do
|
234
|
+
expect(DummyResource.reflect_on_property('title')).to be_a(ActiveTriples::NodeConfig)
|
235
|
+
end
|
236
|
+
end
|
237
|
+
|
219
238
|
describe 'attributes' do
|
220
|
-
before do
|
239
|
+
before do
|
221
240
|
subject.license = license
|
222
241
|
subject.title = 'moomi'
|
223
242
|
end
|
@@ -4,7 +4,10 @@ require 'rdf/isomorphic'
|
|
4
4
|
describe ActiveTriples::Term do
|
5
5
|
|
6
6
|
describe "#rdf_subject" do
|
7
|
-
|
7
|
+
let(:parent_resource) { double("parent resource", reflections: {}) }
|
8
|
+
|
9
|
+
subject { described_class.new(parent_resource, double("value args") ) }
|
10
|
+
|
8
11
|
context "when term has 0 value arguments" do
|
9
12
|
before { subject.value_arguments = double(length: 0) }
|
10
13
|
it "should raise an error" do
|
@@ -35,7 +38,7 @@ describe ActiveTriples::Term do
|
|
35
38
|
end
|
36
39
|
|
37
40
|
describe "#valid_datatype?" do
|
38
|
-
subject { described_class.new(
|
41
|
+
subject { described_class.new(double("parent", reflections: []), "value" ) }
|
39
42
|
before { allow(subject.parent).to receive(:rdf_subject) { "parent subject" } }
|
40
43
|
context "the value is not a Resource" do
|
41
44
|
it "should be true if value is a String" do
|
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.
|
4
|
+
version: 0.3.0
|
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-10-02 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rdf
|
@@ -189,6 +189,8 @@ files:
|
|
189
189
|
- lib/active_triples/nested_attributes.rb
|
190
190
|
- lib/active_triples/node_config.rb
|
191
191
|
- lib/active_triples/properties.rb
|
192
|
+
- lib/active_triples/property_builder.rb
|
193
|
+
- lib/active_triples/reflection.rb
|
192
194
|
- lib/active_triples/repositories.rb
|
193
195
|
- lib/active_triples/resource.rb
|
194
196
|
- lib/active_triples/term.rb
|