rof 1.0.7 → 1.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 +9 -7
- data/LICENSE +201 -16
- data/Rakefile +46 -0
- data/bin/csv_to_rof +1 -2
- data/bin/fedora_to_rof +7 -1
- data/bin/jsonld_to_rof +26 -0
- data/bin/osf_to_rof +6 -2
- data/bin/rof +5 -19
- data/lib/rof.rb +2 -6
- data/lib/rof/access.rb +1 -1
- data/lib/rof/cli.rb +104 -67
- data/lib/rof/compare_rof.rb +68 -39
- data/lib/rof/filter.rb +21 -0
- data/lib/rof/filters.rb +38 -0
- data/lib/rof/filters/bendo.rb +15 -17
- data/lib/rof/filters/date_stamp.rb +5 -4
- data/lib/rof/filters/file_to_url.rb +5 -3
- data/lib/rof/filters/label.rb +9 -7
- data/lib/rof/filters/work.rb +7 -5
- data/lib/rof/ingest.rb +5 -0
- data/lib/rof/osf_context.rb +2 -2
- data/lib/rof/rdf_context.rb +2 -0
- data/lib/rof/translator.rb +18 -0
- data/lib/rof/translators.rb +23 -0
- data/lib/rof/{translate_csv.rb → translators/csv_to_rof.rb} +4 -3
- data/lib/rof/translators/fedora_to_rof.rb +244 -0
- data/lib/rof/translators/jsonld_to_rof.rb +112 -0
- data/lib/rof/translators/jsonld_to_rof/accumulator.rb +175 -0
- data/lib/rof/translators/jsonld_to_rof/predicate_handler.rb +223 -0
- data/lib/rof/translators/jsonld_to_rof/predicate_object_handler.rb +125 -0
- data/lib/rof/translators/jsonld_to_rof/statement_handler.rb +91 -0
- data/lib/rof/translators/osf_to_rof.rb +191 -0
- data/lib/rof/utility.rb +44 -1
- data/lib/rof/version.rb +1 -1
- data/rof.gemspec +10 -2
- data/spec/coverage_helper.rb +17 -0
- data/spec/fixtures/for_utility_load_items_from_json_file/multiple_items.json +8 -0
- data/spec/fixtures/for_utility_load_items_from_json_file/parse_error.json +3 -0
- data/spec/fixtures/for_utility_load_items_from_json_file/single_item.json +3 -0
- data/spec/fixtures/jsonld_to_rof/0g354f18610.jsonld +113 -0
- data/spec/fixtures/jsonld_to_rof/0g354f18610.rof +96 -0
- data/spec/fixtures/jsonld_to_rof/2j62s467216.jsonld +113 -0
- data/spec/fixtures/jsonld_to_rof/2j62s467216.rof +93 -0
- data/spec/fixtures/jsonld_to_rof/2v23vt16z2z.jsonld +70 -0
- data/spec/fixtures/jsonld_to_rof/2v23vt16z2z.rof +87 -0
- data/spec/fixtures/jsonld_to_rof/cr56n01253w.jsonld +84 -0
- data/spec/fixtures/jsonld_to_rof/cr56n01253w.rof +95 -0
- data/spec/fixtures/jsonld_to_rof/h989r21069m.jsonld +84 -0
- data/spec/fixtures/jsonld_to_rof/h989r21069m.rof +98 -0
- data/spec/fixtures/jsonld_to_rof/js956d59913.jsonld +79 -0
- data/spec/fixtures/jsonld_to_rof/js956d59913.rof +89 -0
- data/spec/fixtures/jsonld_to_rof/m039k358q5c.jsonld +80 -0
- data/spec/fixtures/jsonld_to_rof/m039k358q5c.rof +64 -0
- data/spec/fixtures/jsonld_to_rof/nk322b9161g.jsonld +89 -0
- data/spec/fixtures/jsonld_to_rof/nk322b9161g.rof +69 -0
- data/spec/fixtures/jsonld_to_rof/p8418k7430d.jsonld +84 -0
- data/spec/fixtures/jsonld_to_rof/p8418k7430d.rof +67 -0
- data/spec/fixtures/jsonld_to_rof/xg94hm53h0c.jsonld +98 -0
- data/spec/fixtures/jsonld_to_rof/xg94hm53h0c.rof +110 -0
- data/spec/fixtures/jsonld_to_rof/zk51vd69n1r.jsonld +94 -0
- data/spec/fixtures/jsonld_to_rof/zk51vd69n1r.rof +121 -0
- data/spec/fixtures/osf/phz6b.tar.gz +0 -0
- data/spec/lib/rof/access_spec.rb +30 -23
- data/spec/lib/rof/cli_spec.rb +83 -60
- data/spec/lib/rof/compare_rof_spec.rb +35 -24
- data/spec/lib/rof/filter_spec.rb +10 -0
- data/spec/lib/rof/filters/bendo_spec.rb +42 -0
- data/spec/lib/rof/filters/date_stamp_spec.rb +9 -5
- data/spec/lib/rof/filters/file_to_url_spec.rb +7 -3
- data/spec/lib/rof/filters/label_spec.rb +121 -77
- data/spec/lib/rof/filters/work_spec.rb +7 -4
- data/spec/lib/rof/filters_spec.rb +14 -0
- data/spec/lib/rof/translator_spec.rb +15 -0
- data/spec/lib/rof/{translate_csv_spec.rb → translators/csv_to_rof_spec.rb} +14 -14
- data/spec/lib/rof/translators/fedora_to_rof_spec.rb +64 -0
- data/spec/lib/rof/translators/jsonld_to_rof/accumulator_spec.rb +121 -0
- data/spec/lib/rof/translators/jsonld_to_rof/predicate_handler_spec.rb +73 -0
- data/spec/lib/rof/translators/jsonld_to_rof/predicate_object_handler_spec.rb +48 -0
- data/spec/lib/rof/translators/jsonld_to_rof/statement_handler_spec.rb +40 -0
- data/spec/lib/rof/translators/jsonld_to_rof_spec.rb +120 -0
- data/spec/lib/rof/{osf_to_rof_spec.rb → translators/osf_to_rof_spec.rb} +55 -25
- data/spec/lib/rof/translators_spec.rb +14 -0
- data/spec/lib/rof/utility_spec.rb +47 -1
- data/spec/spec_helper.rb +1 -1
- data/spec/support/an_rof_filter.rb +10 -0
- metadata +186 -15
- data/lib/rof/get_from_fedora.rb +0 -211
- data/lib/rof/osf_to_rof.rb +0 -123
- data/spec/lib/rof/get_from_fedora_spec.rb +0 -22
data/lib/rof/compare_rof.rb
CHANGED
@@ -3,90 +3,119 @@ require 'rdf/ntriples'
|
|
3
3
|
require 'rdf/rdfxml'
|
4
4
|
require 'rof/rdf_context'
|
5
5
|
require 'rdf/isomorphic'
|
6
|
+
require 'active_support/core_ext/array/wrap'
|
6
7
|
|
7
8
|
module ROF
|
8
9
|
class CompareRof
|
9
10
|
|
10
|
-
#
|
11
|
-
# return
|
12
|
-
def self.fedora_vs_bendo(
|
11
|
+
# Compare two ROF objects; we'll call one fedora_rof and the other bendo_rof
|
12
|
+
# @return 0 if no errors; otherwise there are errors
|
13
|
+
def self.fedora_vs_bendo(fedora_rof, bendo_rof, _output = nil, options = {})
|
14
|
+
new(Array.wrap(fedora_rof)[0], Array.wrap(bendo_rof)[0], options).error_count
|
15
|
+
end
|
13
16
|
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
17
|
+
def initialize(fedora, bendo, options = {})
|
18
|
+
@fedora = Array.wrap(fedora).first
|
19
|
+
@bendo = Array.wrap(bendo).first
|
20
|
+
@skip_rels_ext_context = options.fetch(:skip_rels_ext_context) { false }
|
21
|
+
end
|
22
|
+
attr_reader :fedora, :bendo
|
23
|
+
|
24
|
+
def error_count
|
25
|
+
@error_count = 0
|
26
|
+
@error_count += compare_rights
|
27
|
+
@error_count += compare_rels_ext
|
28
|
+
@error_count += compare_metadata
|
29
|
+
@error_count += compare_everything_else
|
30
|
+
@error_count
|
21
31
|
end
|
22
32
|
|
23
33
|
# do rights comparison
|
24
34
|
# return 0 if the same, >0 if different
|
25
|
-
def
|
35
|
+
def compare_rights
|
26
36
|
|
27
37
|
error_count =0
|
28
38
|
|
29
39
|
# Use same comparison scheme on all rights
|
30
40
|
[ 'read' , 'read-groups', 'edit', 'edit-groups', 'edit-users', 'embargo-date'].each do |attribute|
|
31
|
-
error_count += rights_equal(attribute
|
41
|
+
error_count += rights_equal(attribute)
|
32
42
|
break if error_count != 0
|
33
43
|
end
|
34
44
|
|
35
45
|
error_count
|
36
46
|
end
|
37
47
|
|
38
|
-
|
39
|
-
def self.rights_equal(rights_attr, fedora, bendo)
|
40
|
-
f_rights = fedora.fetch('rights', {}).fetch(rights_attr, [])
|
41
|
-
b_rights = bendo.fetch('rights', {}).fetch(rights_attr, [])
|
48
|
+
private
|
42
49
|
|
43
|
-
|
44
|
-
|
50
|
+
# compare array or element for equivalence
|
51
|
+
def rights_equal(rights_attr)
|
52
|
+
f_rights = Array.wrap(fedora.fetch('rights', {}).fetch(rights_attr, [])).sort
|
53
|
+
b_rights = Array.wrap(bendo.fetch('rights', {}).fetch(rights_attr, [])).sort
|
45
54
|
|
46
55
|
return 0 if f_rights == b_rights
|
47
56
|
1
|
48
57
|
end
|
49
58
|
|
59
|
+
public
|
60
|
+
|
50
61
|
# convert RELS-EXT sections to RDF::graph and compater w/ rdf-isomorphic
|
51
|
-
def
|
62
|
+
def compare_rels_ext
|
52
63
|
error_count = 0
|
53
|
-
|
54
|
-
|
64
|
+
# Because Sipity's RELS-EXT context was out of whack, I need a switch to skip comparing
|
65
|
+
# the @context of the rels-ext document
|
66
|
+
bendo_rdf = jsonld_to_rdf(bendo.fetch('rels-ext', {}), ROF::RelsExtRefContext, @skip_rels_ext_context)
|
67
|
+
fedora_rdf = jsonld_to_rdf(fedora.fetch('rels-ext', {}), ROF::RelsExtRefContext, @skip_rels_ext_context)
|
55
68
|
error_count +=1 if ! bendo_rdf.isomorphic_with? fedora_rdf
|
56
69
|
error_count
|
57
70
|
end
|
58
|
-
|
59
|
-
|
60
|
-
|
71
|
+
|
72
|
+
private
|
73
|
+
|
74
|
+
def jsonld_to_rdf(doc, default_context, skip_context = false)
|
75
|
+
if skip_context
|
76
|
+
doc.delete('@context')
|
77
|
+
else
|
78
|
+
doc["@context"] ||= default_context
|
79
|
+
end
|
61
80
|
RDF::Graph.new << JSON::LD::API.toRdf(doc)
|
62
81
|
end
|
63
82
|
|
83
|
+
public
|
84
|
+
|
64
85
|
# convert metadata sections to RDF::graph and compater w/ rdf-isomorphic
|
65
|
-
def
|
86
|
+
def compare_metadata
|
66
87
|
error_count = 0
|
67
|
-
bendo_rdf = jsonld_to_rdf(bendo
|
68
|
-
fedora_rdf = jsonld_to_rdf(fedora
|
88
|
+
bendo_rdf = jsonld_to_rdf(bendo.fetch('metadata', {}), ROF::RdfContext)
|
89
|
+
fedora_rdf = jsonld_to_rdf(fedora.fetch('metadata', {}), ROF::RdfContext)
|
69
90
|
error_count +=1 if ! bendo_rdf.isomorphic_with? fedora_rdf
|
70
91
|
error_count
|
71
92
|
end
|
72
93
|
|
73
94
|
# compare what remains
|
74
|
-
def
|
95
|
+
def compare_everything_else
|
75
96
|
error_count =0
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
97
|
+
exclude_keys = ['rights', 'rels-ext', 'metadata', 'thumbnail-file']
|
98
|
+
all_keys_to_check = (bendo.keys + fedora.keys - exclude_keys).uniq
|
99
|
+
all_keys_to_check.each do |key|
|
100
|
+
bendo_value = bendo.fetch(key, nil)
|
101
|
+
fedora_value = fedora.fetch(key, nil)
|
102
|
+
# Treat an empty hash and an empty array as equal
|
103
|
+
next if bendo_value.empty? && fedora_value.empty?
|
104
|
+
next if normalize_value(bendo_value) == normalize_value(fedora_value)
|
105
|
+
error_count += 1
|
106
|
+
break
|
107
|
+
end
|
80
108
|
error_count
|
81
109
|
end
|
82
110
|
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
111
|
+
private
|
112
|
+
|
113
|
+
# Because sometimes we have carriage returns and line breaks but we really don't care
|
114
|
+
# @todo Do we care about line breaks?
|
115
|
+
def normalize_value(values)
|
116
|
+
Array.wrap(values).map do |value|
|
117
|
+
value.is_a?(String) ? value.gsub("\n", "") : value
|
118
|
+
end
|
90
119
|
end
|
91
120
|
end
|
92
121
|
end
|
data/lib/rof/filter.rb
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
module ROF
|
2
|
+
# A placeholder implementation for an ROF::Filter.
|
3
|
+
# @see ROF::Filters
|
4
|
+
class Filter
|
5
|
+
# @param [Hash] options - a hash with symbol keys; used to configure the instantiation of the filter
|
6
|
+
def initialize(options = {})
|
7
|
+
end
|
8
|
+
|
9
|
+
# Performs operations on the given obj_list. This can be things like:
|
10
|
+
#
|
11
|
+
# * Adding new keys to the inner Hash
|
12
|
+
# * Converting placeholder values with calculated values (@see ROF::Filters::Label)
|
13
|
+
# * Other changes
|
14
|
+
#
|
15
|
+
# @param [Array<Hash>] obj_list - An Array of Hash objects
|
16
|
+
# @return [Array<Hash>] a changed version of the given
|
17
|
+
def process(obj_list)
|
18
|
+
raise NotImplementedError
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
data/lib/rof/filters.rb
ADDED
@@ -0,0 +1,38 @@
|
|
1
|
+
Dir.glob(File.expand_path('../filters/*.rb', __FILE__)).each do |filename|
|
2
|
+
require filename
|
3
|
+
end
|
4
|
+
|
5
|
+
module ROF
|
6
|
+
# A container class for all ROF filters. What is an ROF filter? @see ROF::Filters.for
|
7
|
+
# @see ROF::Filter for abstract definition
|
8
|
+
module Filters
|
9
|
+
class UnknownFilterError < RuntimeError
|
10
|
+
def initialize(filter_name, available_filters)
|
11
|
+
super(%(Unable to find filter "#{filter_name}". Available filter names are: #{available_filters.inspect}))
|
12
|
+
end
|
13
|
+
end
|
14
|
+
AVAILABLE_FILTERS = {
|
15
|
+
"bendo" => ROF::Filters::Bendo,
|
16
|
+
"datestamp" => ROF::Filters::DateStamp,
|
17
|
+
"file-to-url" => ROF::Filters::FileToUrl,
|
18
|
+
"label" => ROF::Filters::Label,
|
19
|
+
"work" => ROF::Filters::Work,
|
20
|
+
}
|
21
|
+
# @api public
|
22
|
+
#
|
23
|
+
# @param [String] filter_name - the named filter you want to instantiate
|
24
|
+
# @param [Hash] options - a hash (with symbol keys) that is used for configuring the instantiating of the filter
|
25
|
+
# @return [ROF::Filter]
|
26
|
+
# @raise ROF::Filters::UnknownFilterError if the given filter name is not registered
|
27
|
+
# @see ./spec/support/an_rof_filter.rb
|
28
|
+
# @see ROF::Filter
|
29
|
+
def self.for(filter_name, options = {})
|
30
|
+
begin
|
31
|
+
filter = AVAILABLE_FILTERS.fetch(filter_name)
|
32
|
+
rescue KeyError
|
33
|
+
raise UnknownFilterError.new(filter_name, AVAILABLE_FILTERS.keys)
|
34
|
+
end
|
35
|
+
filter.new(options)
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
data/lib/rof/filters/bendo.rb
CHANGED
@@ -1,30 +1,28 @@
|
|
1
|
-
require '
|
2
|
-
|
1
|
+
require 'rof/filter'
|
3
2
|
module ROF
|
4
3
|
module Filters
|
5
4
|
|
6
5
|
# If bendo server is set , add it into datasreams that contain an URl referencing bendo
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
@bendo = bendo
|
6
|
+
class Bendo < ROF::Filter
|
7
|
+
def initialize(options = {})
|
8
|
+
@bendo = options.fetch(:bendo_info)
|
11
9
|
end
|
12
10
|
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
#
|
18
|
-
|
11
|
+
# for *-meta objects containing "URL", sub in bendo string if provided
|
12
|
+
def process(obj_list)
|
13
|
+
# NOTE: This was refactored to short-circuit the loop. A side-effect is that the code
|
14
|
+
# is now returning the same object as was passed in. The previous behavior was that a
|
15
|
+
# new object_list was created via the #map! method.
|
16
|
+
return obj_list unless @bendo
|
17
|
+
key_name_ends_in_meta_regexp = Regexp.new('(.+)-meta')
|
19
18
|
obj_list.map! do |obj|
|
20
|
-
obj.map do |
|
21
|
-
if
|
22
|
-
if obj[
|
23
|
-
obj[
|
19
|
+
obj.map do |key_name, value|
|
20
|
+
if key_name =~ key_name_ends_in_meta_regexp
|
21
|
+
if obj[key_name]["URL"]
|
22
|
+
obj[key_name]["URL"] = obj[key_name]["URL"].sub("bendo:", @bendo)
|
24
23
|
end
|
25
24
|
end
|
26
25
|
end
|
27
|
-
# print object
|
28
26
|
obj
|
29
27
|
end
|
30
28
|
end
|
@@ -1,3 +1,4 @@
|
|
1
|
+
require 'rof/filter'
|
1
2
|
require 'date'
|
2
3
|
|
3
4
|
module ROF
|
@@ -5,9 +6,9 @@ module ROF
|
|
5
6
|
# Set the upload date to be the date given, provided it doesn't already exist.
|
6
7
|
# Also set the date modified to be the date given.
|
7
8
|
# If not given, the date used defaults to the local time on the computer.
|
8
|
-
class DateStamp
|
9
|
-
def initialize(
|
10
|
-
@today =
|
9
|
+
class DateStamp < ROF::Filter
|
10
|
+
def initialize(options = {})
|
11
|
+
@today = options.fetch(:as_of) { Date::today }
|
11
12
|
@today_s = if @today.is_a?(Date)
|
12
13
|
@today.strftime('%FZ')
|
13
14
|
else
|
@@ -15,7 +16,7 @@ module ROF
|
|
15
16
|
end
|
16
17
|
end
|
17
18
|
|
18
|
-
def process(obj_list
|
19
|
+
def process(obj_list)
|
19
20
|
obj_list.map! do |obj|
|
20
21
|
if obj["metadata"].nil?
|
21
22
|
obj["metadata"] = {
|
@@ -1,3 +1,5 @@
|
|
1
|
+
require 'rof/filter'
|
2
|
+
|
1
3
|
module ROF
|
2
4
|
module Filters
|
3
5
|
# Convert any content datastream files into a bendo URL, and alter the rof
|
@@ -5,11 +7,11 @@ module ROF
|
|
5
7
|
# will only exist for items having a bendo-item id set. The URL generated
|
6
8
|
# supposes the file keeps the same relative path the item originally had in
|
7
9
|
# the rof file.
|
8
|
-
class FileToUrl
|
9
|
-
def initialize()
|
10
|
+
class FileToUrl < ROF::Filter
|
11
|
+
def initialize(options = {})
|
10
12
|
end
|
11
13
|
|
12
|
-
def process(obj_list
|
14
|
+
def process(obj_list)
|
13
15
|
obj_list.map! do |obj|
|
14
16
|
bendo_item = obj['bendo-item']
|
15
17
|
content_file = obj['content-file']
|
data/lib/rof/filters/label.rb
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
require 'rof/filter'
|
1
2
|
require 'noids_client'
|
2
3
|
|
3
4
|
module ROF
|
@@ -5,7 +6,7 @@ module ROF
|
|
5
6
|
# Class Label locates in-place labels of the form
|
6
7
|
# "$(label_name)" in the ROF file, assigns each
|
7
8
|
# label a pid, then replaces the label with that pid.
|
8
|
-
class Label
|
9
|
+
class Label < ROF::Filter
|
9
10
|
class MissingLabel < RuntimeError
|
10
11
|
end
|
11
12
|
|
@@ -21,14 +22,15 @@ module ROF
|
|
21
22
|
# Use :id_list to pass in a ruby object responding to #shift and #empty? to generate
|
22
23
|
# ids. This is usually a list, to facilitate testing.
|
23
24
|
#
|
24
|
-
# If prefix is not nil, then "
|
25
|
+
# If prefix is not nil, then "<prefix>:" is prepended to
|
25
26
|
# every identifier.
|
26
|
-
def initialize(
|
27
|
+
def initialize(options = {})
|
28
|
+
prefix = options.fetch(:prefix, nil)
|
27
29
|
@id_list = case
|
28
30
|
when options[:id_list]
|
29
31
|
options[:id_list]
|
30
32
|
when options[:noid_server]
|
31
|
-
NoidsPool.new(options[:noid_server], options
|
33
|
+
NoidsPool.new(options[:noid_server], options.fetch(:pool_name))
|
32
34
|
else
|
33
35
|
raise NoPool
|
34
36
|
end
|
@@ -39,7 +41,7 @@ module ROF
|
|
39
41
|
|
40
42
|
# mutate obj_list by assigning labels and resolving labels where needed
|
41
43
|
# Every fobject will be assigned an pid and a bendo_item
|
42
|
-
def process(obj_list
|
44
|
+
def process(obj_list)
|
43
45
|
labels = {}
|
44
46
|
|
45
47
|
# Use two passes. First assign ids, and then resolve labels
|
@@ -136,8 +138,8 @@ module ROF
|
|
136
138
|
|
137
139
|
# Encapsulates connection to Noids Server
|
138
140
|
class NoidsPool
|
139
|
-
def initialize(
|
140
|
-
@pool = NoidsClient::Connection.new(
|
141
|
+
def initialize(noids_server_url, pool_name)
|
142
|
+
@pool = NoidsClient::Connection.new(noids_server_url).get_pool(pool_name)
|
141
143
|
end
|
142
144
|
|
143
145
|
def shift
|
data/lib/rof/filters/work.rb
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
require 'mime-types'
|
2
|
-
|
2
|
+
require 'rof/filter'
|
3
3
|
module ROF
|
4
4
|
module Filters
|
5
5
|
# Expand objects of type "Work(-(.+))?" into a
|
@@ -8,17 +8,19 @@ module ROF
|
|
8
8
|
# adds a depositor
|
9
9
|
# turns original object into an fobject/$1
|
10
10
|
# and copies the access to each fobject.
|
11
|
-
class Work
|
11
|
+
class Work < ROF::Filter
|
12
12
|
class NoFile < RuntimeError
|
13
13
|
end
|
14
14
|
|
15
|
-
def initialize
|
15
|
+
def initialize(options = {})
|
16
|
+
@file_name = options.fetch(:file_name)
|
16
17
|
@utility = ROF::Utility.new
|
17
18
|
end
|
19
|
+
attr_reader :file_name
|
18
20
|
|
19
21
|
# wade through object list
|
20
|
-
def process(obj_list
|
21
|
-
@utility.set_workdir(
|
22
|
+
def process(obj_list)
|
23
|
+
@utility.set_workdir(file_name)
|
22
24
|
obj_list.map! { |x| process_one_work(x) }
|
23
25
|
obj_list.flatten!
|
24
26
|
end
|
data/lib/rof/ingest.rb
CHANGED
@@ -20,6 +20,11 @@ module ROF
|
|
20
20
|
# Otherwise fedora is a Rubydora::Reporitory object (for now...)
|
21
21
|
# Returns a list of ingested datastreams, if everything is okay.
|
22
22
|
# Otherwise raises an exception depending on the error.
|
23
|
+
# @param [Hash] item - has string based keys
|
24
|
+
# @param [#find_or_initialize, nil] fedora - when nil then we verify that item is in the proper format; otherwise we ingest or update
|
25
|
+
# @param [Array] search_paths
|
26
|
+
# @param [nil, String] bendo - when nil, no attempts to substitute the bendo URL
|
27
|
+
# @return [Array<String>] List of ingested data streams; Implies everything ingested ok.
|
23
28
|
def self.Ingest(item, fedora=nil, search_paths=[], bendo=nil)
|
24
29
|
raise NotFobjectError if item["type"] != "fobject"
|
25
30
|
raise TooManyIdentitiesError if item.key?("id") && item.key?("pid")
|
data/lib/rof/osf_context.rb
CHANGED
@@ -1,5 +1,4 @@
|
|
1
1
|
module ROF
|
2
|
-
|
3
2
|
OsfPrefixList = {
|
4
3
|
'dcterms' => 'http://purl.org/dc/terms/',
|
5
4
|
'osf-model' => 'http://www.dataconservancy.org/osf-business-object-model#'
|
@@ -14,6 +13,7 @@ module ROF
|
|
14
13
|
'hasContributor' => 'http://www.dataconservancy.org/osf-business-object-model#hasContributor',
|
15
14
|
'isBibliographic' => 'http://www.dataconservancy.org/osf-business-object-model#isBibliographic',
|
16
15
|
'hasFullName' => 'http://www.dataconservancy.org/osf-business-object-model#hasFullName',
|
17
|
-
'hasUser' => 'http://www.dataconservancy.org/osf-business-object-model#hasUser'
|
16
|
+
'hasUser' => 'http://www.dataconservancy.org/osf-business-object-model#hasUser',
|
17
|
+
'registeredFrom' => 'http://www.dataconservancy.org/osf-business-object-model#registeredFrom'
|
18
18
|
}.freeze
|
19
19
|
end
|
data/lib/rof/rdf_context.rb
CHANGED
@@ -11,6 +11,7 @@ module ROF
|
|
11
11
|
'rdfs' => 'http://www.w3.org/2000/01/rdf-schema#',
|
12
12
|
'ths' => 'http://id.loc.gov/vocabulary/relators/',
|
13
13
|
'vracore' => 'http://purl.org/vra/',
|
14
|
+
'pav' => 'http://purl.org/pav/',
|
14
15
|
|
15
16
|
'dc:dateSubmitted' => {
|
16
17
|
'@type' => 'http://www.w3.org/2001/XMLSchema#date'
|
@@ -26,6 +27,7 @@ module ROF
|
|
26
27
|
RelsExtRefContext = {
|
27
28
|
'@vocab' => 'info:fedora/fedora-system:def/relations-external#',
|
28
29
|
'fedora-model' => 'info:fedora/fedora-system:def/model#',
|
30
|
+
'pav' => 'http://purl.org/pav/',
|
29
31
|
'hydra' => 'http://projecthydra.org/ns/relations#',
|
30
32
|
'hasModel' => { '@id' => 'fedora-model:hasModel', '@type' => '@id' },
|
31
33
|
'hasEditor' => { '@id' => 'hydra:hasEditor', '@type' => '@id' },
|
@@ -0,0 +1,18 @@
|
|
1
|
+
module ROF
|
2
|
+
# A translator is responsible for converting the input into the given output.
|
3
|
+
# The input and output need not be the same type (e.g. CSV to Hash)
|
4
|
+
#
|
5
|
+
# @todo This is a work in progress; I will be normalizing the .call behavior.
|
6
|
+
#
|
7
|
+
# @see ROF::Translators::CsvToRof
|
8
|
+
# @see ROF::Translators::FedoraToRof
|
9
|
+
# @see ROF::Translators::OsfToRof
|
10
|
+
class Translator
|
11
|
+
# @param [Object] input - the thing that will be processed
|
12
|
+
# @param [Hash] config - a Hash with symbol keys
|
13
|
+
# @return [Hash] often times a Hash that can be serialized into JSON
|
14
|
+
def self.call(input, config = {})
|
15
|
+
raise NotImplementedError
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|