active_fedora-crosswalks 0.0.2 → 0.0.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +8 -8
- data/lib/active_fedora/crosswalks/accessors/generic_accessor.rb +17 -0
- data/lib/active_fedora/crosswalks/accessors/om_accessor.rb +2 -0
- data/lib/active_fedora/crosswalks/accessors/rels_ext_accessor.rb +2 -0
- data/lib/active_fedora/crosswalks/crosswalker.rb +37 -10
- data/lib/active_fedora/crosswalks/version.rb +1 -1
- data/spec/lib/active_fedora/crosswalks/crosswalkable_spec.rb +97 -5
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
---
|
2
2
|
!binary "U0hBMQ==":
|
3
3
|
metadata.gz: !binary |-
|
4
|
-
|
4
|
+
MTZjYjFiNmFjMjlhNTQxMWE0YmQ2ZWVmY2EzY2Y3NTRkYjY1MTNlOQ==
|
5
5
|
data.tar.gz: !binary |-
|
6
|
-
|
6
|
+
YTg3MzIzMzcyN2I4OTIwY2E1NWMzZDAyMjAxZTQ3MWI1OWY4Yjc5MQ==
|
7
7
|
!binary "U0hBNTEy":
|
8
8
|
metadata.gz: !binary |-
|
9
|
-
|
10
|
-
|
11
|
-
|
9
|
+
NDMxMDhkZDI4NWRkNDIzMDg2NWE1MTc3NTViNzM0OGVhZTkwY2ViYjY2YzY5
|
10
|
+
ZDE4NWNjM2VhM2I5OTYzMzAxZGZkNGYwMGQxYjU5OGIyYzkyM2RjNDI5ZmNl
|
11
|
+
ZDkxN2Y0MWVlODdhNDNjNTNmMTk1YTQyNmRiNzJkODIzZTJmOTY=
|
12
12
|
data.tar.gz: !binary |-
|
13
|
-
|
14
|
-
|
15
|
-
|
13
|
+
MzNiOGQ1Y2JiMzgwMWZiMmIyMTIwYzk3OGU3Y2E2NGEwZWFhYjc3OWQ5NjQ1
|
14
|
+
MGQyMzk4MzFkNWRjZmE1MjljNzRhMTc5YzZjNGYwM2UzODlmYjJkZGE3MzFm
|
15
|
+
NzkwNDhjNjE4OTRmNDkwNmNmN2RhODAxOGZlNGFkODQxZDE5YTE=
|
@@ -6,9 +6,11 @@ module ActiveFedora
|
|
6
6
|
def self.new(datastream, field)
|
7
7
|
if self.to_s.include?("GenericAccessor")
|
8
8
|
if datastream.kind_of?(ActiveFedora::RelsExtDatastream)
|
9
|
+
puts "Returning a rels accessor"
|
9
10
|
return RelsExtAccessor.new(datastream, field)
|
10
11
|
end
|
11
12
|
if datastream.kind_of?(ActiveFedora::OmDatastream)
|
13
|
+
puts "Returning an OM Accessor"
|
12
14
|
return OmAccessor.new(datastream, field)
|
13
15
|
end
|
14
16
|
end
|
@@ -27,10 +29,25 @@ module ActiveFedora
|
|
27
29
|
def get_value
|
28
30
|
FieldProxy.new(Array.wrap(datastream.send(field.to_s)), self, field)
|
29
31
|
end
|
32
|
+
def original_get_value
|
33
|
+
if datastream.respond_to?("unstubbed_#{self.field}")
|
34
|
+
FieldProxy.new(Array.wrap(datastream.send("unstubbed_#{self.field}")), self, field)
|
35
|
+
else
|
36
|
+
get_value
|
37
|
+
end
|
38
|
+
end
|
30
39
|
def set_value(*args)
|
31
40
|
value = args.last
|
32
41
|
datastream.send("#{field.to_s}=",value)
|
33
42
|
end
|
43
|
+
def original_set_value(*args)
|
44
|
+
value = args.last
|
45
|
+
if datastream.respond_to?("unstubbed_#{self.field}=")
|
46
|
+
datastream.send("unstubbed_#{self.field}=",value)
|
47
|
+
else
|
48
|
+
set_value(value)
|
49
|
+
end
|
50
|
+
end
|
34
51
|
end
|
35
52
|
end
|
36
53
|
end
|
@@ -4,8 +4,13 @@ module ActiveFedora
|
|
4
4
|
include ActiveModel::Validations
|
5
5
|
validates :parent, :field, :to, :presence => true
|
6
6
|
validate :parent_has_datastream
|
7
|
-
attr_accessor :parent, :datastream, :target_datastream, :field, :to
|
7
|
+
attr_accessor :parent, :datastream, :target_datastream, :field, :to, :transform, :reverse_transform
|
8
8
|
def initialize(args)
|
9
|
+
@transform = args.delete(:transform)
|
10
|
+
@reverse_transform = args.delete(:reverse_transform)
|
11
|
+
unless transform && reverse_transform || (!transform && !reverse_transform)
|
12
|
+
raise "If a transform is provided, then a reverse transform must be as well."
|
13
|
+
end
|
9
14
|
@datastream = args.delete(:datastream)
|
10
15
|
@parent = @datastream.digital_object if @datastream
|
11
16
|
@field = args.delete(:field)
|
@@ -26,6 +31,7 @@ module ActiveFedora
|
|
26
31
|
datastream.crosswalk_fields << field
|
27
32
|
create_reader
|
28
33
|
create_writer
|
34
|
+
sync_values
|
29
35
|
end
|
30
36
|
|
31
37
|
def source_accessor
|
@@ -36,28 +42,49 @@ module ActiveFedora
|
|
36
42
|
@target_accessor ||= Accessors::GenericAccessor.new(target_datastream, to)
|
37
43
|
end
|
38
44
|
|
45
|
+
def sync_values(opts={})
|
46
|
+
current_source_values = Array.wrap(source_accessor.original_get_value)
|
47
|
+
current_target_values = perform_transform(Array.wrap(target_accessor.original_get_value))
|
48
|
+
combined = current_source_values | current_target_values
|
49
|
+
combined = current_source_values if opts[:force_target]
|
50
|
+
source_accessor.original_set_value(combined)
|
51
|
+
target_accessor.original_set_value(perform_reverse_transform(combined))
|
52
|
+
end
|
53
|
+
|
39
54
|
protected
|
40
55
|
|
56
|
+
def perform_transform(values)
|
57
|
+
values.map!{|x| transform.call(x)} if transform
|
58
|
+
return values
|
59
|
+
end
|
60
|
+
|
61
|
+
def perform_reverse_transform(values)
|
62
|
+
values.map!{|x| reverse_transform.call(x)} if reverse_transform
|
63
|
+
return values
|
64
|
+
end
|
65
|
+
|
41
66
|
def create_reader
|
42
67
|
object, method, expected_args = source_accessor.get_reader
|
43
68
|
crosswalker = self
|
69
|
+
object.singleton_class.class_eval do
|
70
|
+
alias_method "unstubbed_#{method}".to_sym, method.to_sym
|
71
|
+
end
|
44
72
|
object.define_singleton_method(method) do |*args|
|
45
|
-
|
46
|
-
|
47
|
-
end
|
48
|
-
crosswalker.target_accessor.get_value
|
73
|
+
crosswalker.sync_values
|
74
|
+
FieldProxy.new(crosswalker.source_accessor.original_get_value, crosswalker.source_accessor, crosswalker.source_accessor.field)
|
49
75
|
end
|
50
76
|
end
|
51
77
|
|
52
78
|
def create_writer
|
53
79
|
object, method, expected_args = source_accessor.get_writer
|
54
80
|
crosswalker = self
|
81
|
+
object.singleton_class.class_eval do
|
82
|
+
alias_method "unstubbed_#{method}".to_sym, method.to_sym
|
83
|
+
end
|
55
84
|
object.define_singleton_method(method) do |*args|
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
return result
|
60
|
-
end
|
85
|
+
super(*args)
|
86
|
+
crosswalker.sync_values(:force_target => true)
|
87
|
+
FieldProxy.new(crosswalker.source_accessor.get_value, crosswalker.source_accessor, crosswalker.source_accessor.field)
|
61
88
|
end
|
62
89
|
end
|
63
90
|
|
@@ -9,7 +9,7 @@ describe ActiveFedora::Crosswalks::Crosswalkable do
|
|
9
9
|
after(:each) do
|
10
10
|
Object.send(:remove_const, :CrosswalkAsset)
|
11
11
|
end
|
12
|
-
|
12
|
+
describe "crosswalking RDF to RDF" do
|
13
13
|
before(:each) do
|
14
14
|
CrosswalkAsset.has_metadata :name => 'descMetadata', :type => ExampleRdfDatastream
|
15
15
|
CrosswalkAsset.has_metadata :name => 'xwalkMetadata', :type => ExampleRdfDatastream do |ds|
|
@@ -71,7 +71,99 @@ describe ActiveFedora::Crosswalks::Crosswalkable do
|
|
71
71
|
end
|
72
72
|
end
|
73
73
|
end
|
74
|
-
|
74
|
+
describe "transforms" do
|
75
|
+
context "when you pass a transform" do
|
76
|
+
context "but you don't pass a reverse transform" do
|
77
|
+
before(:each) do
|
78
|
+
CrosswalkAsset.has_metadata :name => 'descMetadata', :type => ExampleRdfDatastream
|
79
|
+
CrosswalkAsset.has_metadata :name => 'xwalkMetadata', :type => ExampleRdfDatastream do |ds|
|
80
|
+
ds.crosswalk :field => :title, :to => :other_title, :in => :descMetadata, :transform => Proc.new{|x| "bla_#{x}"}
|
81
|
+
end
|
82
|
+
end
|
83
|
+
it "should raise an error when you try to initialize the object" do
|
84
|
+
expect{asset}.to raise_error
|
85
|
+
end
|
86
|
+
end
|
87
|
+
context "as well as a reverse transform (for RDF)" do
|
88
|
+
before(:each) do
|
89
|
+
CrosswalkAsset.has_metadata :name => 'descMetadata', :type => ExampleRdfDatastream
|
90
|
+
CrosswalkAsset.has_metadata :name => 'xwalkMetadata', :type => ExampleRdfDatastream do |ds|
|
91
|
+
ds.crosswalk :field => :title, :to => :other_title, :in => :descMetadata, :transform => Proc.new{|x| "bla_#{x}"},
|
92
|
+
:reverse_transform => Proc.new{|x| x.split("bla_").last}
|
93
|
+
end
|
94
|
+
end
|
95
|
+
context "when a field is set" do
|
96
|
+
context "on the source datastream" do
|
97
|
+
before(:each) do
|
98
|
+
asset.descMetadata.other_title = "bla"
|
99
|
+
end
|
100
|
+
it "should transform the value" do
|
101
|
+
expect(asset.xwalkMetadata.title).to eq ["bla_bla"]
|
102
|
+
end
|
103
|
+
it "should leave the source datastream correct" do
|
104
|
+
expect(asset.descMetadata.other_title).to eq ["bla"]
|
105
|
+
end
|
106
|
+
end
|
107
|
+
context "on the crosswalked datastream" do
|
108
|
+
before(:each) do
|
109
|
+
asset.xwalkMetadata.title = "bla_bla"
|
110
|
+
end
|
111
|
+
it "should reverse transform the value for the source datastream" do
|
112
|
+
expect(asset.descMetadata.other_title).to eq ["bla"]
|
113
|
+
end
|
114
|
+
it "should leave the crosswalk datastream correct" do
|
115
|
+
expect(asset.xwalkMetadata.title).to eq ["bla_bla"]
|
116
|
+
end
|
117
|
+
end
|
118
|
+
end
|
119
|
+
end
|
120
|
+
context "as well as a reverse transform (for Rels)" do
|
121
|
+
before(:each) do
|
122
|
+
CrosswalkAsset.has_metadata :name => 'xwalkMetadata', :type => ExampleRdfDatastream do |ds|
|
123
|
+
ds.crosswalk :field => :title, :to => :is_member_of_collection, :in => "RELS-EXT", :transform => Proc.new{|x| x.split("info:fedora/").last},
|
124
|
+
:reverse_transform => Proc.new{|x| "info:fedora/#{x}" }
|
125
|
+
end
|
126
|
+
end
|
127
|
+
context "when a field exists prior to crosswalking (previous data in graph)" do
|
128
|
+
before(:each) do
|
129
|
+
asset.xwalkMetadata.set_value(asset.xwalkMetadata.rdf_subject, :title, "test:testing")
|
130
|
+
end
|
131
|
+
it "should maintain that value" do
|
132
|
+
expect(asset.xwalkMetadata.title).to eq ["test:testing"]
|
133
|
+
end
|
134
|
+
it "should perform the transform to rels" do
|
135
|
+
asset.xwalkMetadata.title # Have to call this to perform the crosswalk right now. Calls sync_values.
|
136
|
+
expect(asset.relationships(:is_member_of_collection)).to eq ["info:fedora/test:testing"]
|
137
|
+
end
|
138
|
+
end
|
139
|
+
context "when a field is set" do
|
140
|
+
context "on the source datastream" do
|
141
|
+
before(:each) do
|
142
|
+
asset.add_relationship(:is_member_of_collection, "info:fedora/test:test")
|
143
|
+
end
|
144
|
+
it "should transform the value" do
|
145
|
+
expect(asset.xwalkMetadata.title).to eq ["test:test"]
|
146
|
+
end
|
147
|
+
it "should leave the source datastream correct" do
|
148
|
+
expect(asset.relationships(:is_member_of_collection)).to eq ["info:fedora/test:test"]
|
149
|
+
end
|
150
|
+
end
|
151
|
+
context "on the crosswalked datastream" do
|
152
|
+
before(:each) do
|
153
|
+
asset.xwalkMetadata.title = "test:test"
|
154
|
+
end
|
155
|
+
it "should reverse transform the value for the source datastream" do
|
156
|
+
expect(asset.relationships(:is_member_of_collection)).to eq ["info:fedora/test:test"]
|
157
|
+
end
|
158
|
+
it "should leave the crosswalk datastream correct" do
|
159
|
+
expect(asset.xwalkMetadata.title).to eq ["test:test"]
|
160
|
+
end
|
161
|
+
end
|
162
|
+
end
|
163
|
+
end
|
164
|
+
end
|
165
|
+
end
|
166
|
+
describe "crosswalking RDF to RELS-EXT" do
|
75
167
|
before(:each) do
|
76
168
|
CrosswalkAsset.has_metadata :name => 'xwalkMetadata', :type => ExampleRdfDatastream do |ds|
|
77
169
|
ds.crosswalk :field => :title, :to => :is_member_of_collection, :in => "RELS-EXT"
|
@@ -122,7 +214,7 @@ describe ActiveFedora::Crosswalks::Crosswalkable do
|
|
122
214
|
end
|
123
215
|
end
|
124
216
|
end
|
125
|
-
|
217
|
+
describe "crosswalking RDF to OM" do
|
126
218
|
before(:each) do
|
127
219
|
CrosswalkAsset.has_metadata :name => 'descMetadata', :type => DummyOmDatastream
|
128
220
|
CrosswalkAsset.has_metadata :name => 'xwalkMetadata', :type => ExampleRdfDatastream do |ds|
|
@@ -162,12 +254,12 @@ describe ActiveFedora::Crosswalks::Crosswalkable do
|
|
162
254
|
asset.xwalkMetadata.title << "test"
|
163
255
|
end
|
164
256
|
it "should add the metadata to the source field" do
|
165
|
-
expect(asset.descMetadata.name.family_name).to eq ["Horn", "
|
257
|
+
expect(asset.descMetadata.name.family_name).to eq ["Horn", "Caesar", "test"]
|
166
258
|
end
|
167
259
|
end
|
168
260
|
end
|
169
261
|
end
|
170
|
-
|
262
|
+
describe "crosswalking OM to RDF" do
|
171
263
|
before(:each) do
|
172
264
|
CrosswalkAsset.has_metadata :name => 'descMetadata', :type => ExampleRdfDatastream
|
173
265
|
CrosswalkAsset.has_metadata :name => 'xwalkMetadata', :type => DummyOmDatastream do |ds|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: active_fedora-crosswalks
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Trey Terrell
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2013-10-
|
11
|
+
date: 2013-10-09 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|