dor-services 6.0.0 → 6.0.1
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/dor-services.rb +7 -6
- data/lib/dor/certificate_authenticated_rest_resource_factory.rb +2 -1
- data/lib/dor/config.rb +38 -37
- data/lib/dor/datastreams/administrative_metadata_ds.rb +98 -98
- data/lib/dor/datastreams/content_metadata_ds.rb +26 -17
- data/lib/dor/datastreams/datastream_spec_solrizer.rb +4 -2
- data/lib/dor/datastreams/default_object_rights_ds.rb +10 -7
- data/lib/dor/datastreams/desc_metadata_ds.rb +6 -6
- data/lib/dor/datastreams/embargo_metadata_ds.rb +94 -94
- data/lib/dor/datastreams/events_ds.rb +55 -54
- data/lib/dor/datastreams/geo_metadata_ds.rb +7 -6
- data/lib/dor/datastreams/identity_metadata_ds.rb +128 -125
- data/lib/dor/datastreams/provenance_metadata_ds.rb +3 -1
- data/lib/dor/datastreams/rights_metadata_ds.rb +4 -4
- data/lib/dor/datastreams/role_metadata_ds.rb +42 -42
- data/lib/dor/datastreams/simple_dublin_core_ds.rb +45 -43
- data/lib/dor/datastreams/technical_metadata_ds.rb +3 -1
- data/lib/dor/datastreams/version_metadata_ds.rb +12 -5
- data/lib/dor/datastreams/workflow_definition_ds.rb +74 -73
- data/lib/dor/datastreams/workflow_ds.rb +12 -7
- data/lib/dor/exceptions.rb +2 -0
- data/lib/dor/indexers/data_indexer.rb +16 -0
- data/lib/dor/indexers/describable_indexer.rb +2 -0
- data/lib/dor/indexers/editable_indexer.rb +2 -0
- data/lib/dor/indexers/identifiable_indexer.rb +23 -8
- data/lib/dor/indexers/processable_indexer.rb +2 -0
- data/lib/dor/indexers/releasable_indexer.rb +2 -0
- data/lib/dor/models/abstract.rb +2 -0
- data/lib/dor/models/admin_policy_object.rb +2 -0
- data/lib/dor/models/agreement.rb +2 -0
- data/lib/dor/models/collection.rb +3 -0
- data/lib/dor/models/concerns/assembleable.rb +2 -0
- data/lib/dor/models/concerns/contentable.rb +5 -2
- data/lib/dor/models/concerns/describable.rb +7 -2
- data/lib/dor/models/concerns/editable.rb +28 -21
- data/lib/dor/models/concerns/embargoable.rb +4 -0
- data/lib/dor/models/concerns/eventable.rb +2 -0
- data/lib/dor/models/concerns/geoable.rb +2 -0
- data/lib/dor/models/concerns/governable.rb +7 -2
- data/lib/dor/models/concerns/identifiable.rb +33 -34
- data/lib/dor/models/concerns/itemizable.rb +4 -1
- data/lib/dor/models/concerns/preservable.rb +2 -0
- data/lib/dor/models/concerns/processable.rb +15 -9
- data/lib/dor/models/concerns/publishable.rb +9 -4
- data/lib/dor/models/concerns/releaseable.rb +21 -11
- data/lib/dor/models/concerns/rightsable.rb +2 -0
- data/lib/dor/models/concerns/shelvable.rb +6 -2
- data/lib/dor/models/concerns/versionable.rb +8 -4
- data/lib/dor/models/item.rb +2 -0
- data/lib/dor/models/set.rb +2 -0
- data/lib/dor/models/workflow_object.rb +5 -1
- data/lib/dor/rest_resource_factory.rb +2 -0
- data/lib/dor/services/cleanup_reset_service.rb +2 -1
- data/lib/dor/services/cleanup_service.rb +2 -1
- data/lib/dor/services/digital_stacks_service.rb +3 -1
- data/lib/dor/services/indexing_service.rb +3 -1
- data/lib/dor/services/merge_service.rb +6 -4
- data/lib/dor/services/metadata_handlers/catalog_handler.rb +2 -0
- data/lib/dor/services/metadata_service.rb +4 -4
- data/lib/dor/services/public_desc_metadata_service.rb +16 -8
- data/lib/dor/services/public_xml_service.rb +7 -4
- data/lib/dor/services/registration_service.rb +25 -20
- data/lib/dor/services/reset_workspace_service.rb +4 -4
- data/lib/dor/services/sdr_ingest_service.rb +4 -2
- data/lib/dor/services/search_service.rb +8 -9
- data/lib/dor/services/suri_service.rb +3 -2
- data/lib/dor/services/technical_metadata_service.rb +15 -9
- data/lib/dor/services/thumbnail_service.rb +14 -10
- data/lib/dor/utils/hydrus_shims.rb +2 -0
- data/lib/dor/utils/ng_tidy.rb +3 -7
- data/lib/dor/utils/predicate_patch.rb +2 -0
- data/lib/dor/utils/sdr_client.rb +3 -0
- data/lib/dor/utils/solr_doc_helper.rb +4 -2
- data/lib/dor/version.rb +3 -1
- data/lib/dor/workflow/document.rb +113 -108
- data/lib/dor/workflow/process.rb +90 -87
- data/lib/tasks/rdoc.rake +4 -3
- metadata +4 -4
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Dor
|
2
4
|
class Collection < Dor::Set
|
3
5
|
include Releaseable
|
@@ -5,6 +7,7 @@ module Dor
|
|
5
7
|
has_object_type 'collection'
|
6
8
|
|
7
9
|
self.resource_indexer = CompositeIndexer.new(
|
10
|
+
DataIndexer,
|
8
11
|
DescribableIndexer,
|
9
12
|
IdentifiableIndexer,
|
10
13
|
ProcessableIndexer,
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Dor
|
2
4
|
module Contentable
|
3
5
|
extend ActiveSupport::Concern
|
@@ -7,6 +9,7 @@ module Dor
|
|
7
9
|
xml = datastreams['contentMetadata'].ng_xml
|
8
10
|
# make sure the resource exists
|
9
11
|
raise 'resource doesnt exist.' if xml.search('//resource[@id=\'' + resource + '\']').length == 0
|
12
|
+
|
10
13
|
sftp = Net::SFTP.start(Config.content.content_server, Config.content.content_user, :auth_methods => ['publickey'])
|
11
14
|
druid_tools = DruidTools::Druid.new(pid, Config.content.content_base_dir)
|
12
15
|
location = druid_tools.path(file_name)
|
@@ -15,7 +18,7 @@ module Dor
|
|
15
18
|
sha1 = Digest::SHA1.file(file.path).hexdigest
|
16
19
|
size = File.size?(file.path)
|
17
20
|
# update contentmd
|
18
|
-
file_hash = {:name => file_name, :md5 => md5, :publish => publish, :shelve => shelve, :preserve => preserve, :size => size.to_s, :sha1 => sha1, :mime_type => mime_type}
|
21
|
+
file_hash = { :name => file_name, :md5 => md5, :publish => publish, :shelve => shelve, :preserve => preserve, :size => size.to_s, :sha1 => sha1, :mime_type => mime_type }
|
19
22
|
begin
|
20
23
|
sftp.stat!(location.gsub(file_name, ''))
|
21
24
|
begin
|
@@ -49,7 +52,7 @@ module Dor
|
|
49
52
|
sha1 = Digest::SHA1.file(file.path).hexdigest
|
50
53
|
size = File.size?(file.path)
|
51
54
|
# update contentmd
|
52
|
-
file_hash = {:name => file_name, :md5 => md5, :size => size.to_s, :sha1 => sha1}
|
55
|
+
file_hash = { :name => file_name, :md5 => md5, :size => size.to_s, :sha1 => sha1 }
|
53
56
|
begin
|
54
57
|
sftp.stat!(location)
|
55
58
|
sftp.upload!(file.path, location)
|
@@ -1,10 +1,12 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Dor
|
2
4
|
module Describable
|
3
5
|
extend ActiveSupport::Concern
|
4
6
|
|
5
7
|
MODS_TO_DC_XSLT = Nokogiri::XSLT(File.new(File.expand_path(File.dirname(__FILE__) + "/mods2dc.xslt")))
|
6
|
-
XMLNS_OAI_DC = 'http://www.openarchives.org/OAI/2.0/oai_dc/'
|
7
|
-
XMLNS_DC = 'http://purl.org/dc/elements/1.1/'
|
8
|
+
XMLNS_OAI_DC = 'http://www.openarchives.org/OAI/2.0/oai_dc/'
|
9
|
+
XMLNS_DC = 'http://purl.org/dc/elements/1.1/'
|
8
10
|
|
9
11
|
class CrosswalkError < Exception; end
|
10
12
|
|
@@ -35,6 +37,7 @@ module Dor
|
|
35
37
|
def build_descMetadata_datastream(ds)
|
36
38
|
content = fetch_descMetadata_datastream
|
37
39
|
return nil if content.nil?
|
40
|
+
|
38
41
|
ds.dsLabel = 'Descriptive Metadata'
|
39
42
|
ds.ng_xml = Nokogiri::XML(content)
|
40
43
|
ds.ng_xml.normalize_text!
|
@@ -56,6 +59,7 @@ module Dor
|
|
56
59
|
dc_doc.xpath('/oai_dc:dc/*[count(text()) = 0]', oai_dc: XMLNS_OAI_DC).remove # Remove empty nodes
|
57
60
|
raise CrosswalkError, "Dor::Item#generate_dublin_core produced incorrect xml (no root):\n#{dc_doc.to_xml}" if dc_doc.root.nil?
|
58
61
|
raise CrosswalkError, "Dor::Item#generate_dublin_core produced incorrect xml (no children):\n#{dc_doc.to_xml}" if dc_doc.root.children.size == 0
|
62
|
+
|
59
63
|
dc_doc
|
60
64
|
end
|
61
65
|
|
@@ -70,6 +74,7 @@ module Dor
|
|
70
74
|
unless force || descMetadata.new?
|
71
75
|
raise 'Cannot proceed, there is already content in the descriptive metadata datastream: ' + descMetadata.content.to_s
|
72
76
|
end
|
77
|
+
|
73
78
|
label = self.label
|
74
79
|
builder = Nokogiri::XML::Builder.new { |xml|
|
75
80
|
xml.mods(Dor::DescMetadataDS::MODS_HEADER_CONFIG) {
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Dor
|
2
4
|
## This is basically used just by APOs. Arguably "editable" is the wrong name.
|
3
5
|
module Editable
|
@@ -18,29 +20,29 @@ module Dor
|
|
18
20
|
# TODO: need some way to do versioning. for instance, what happens when a new version of an existing license comes
|
19
21
|
# out, since it will presumably use the same license code, but a different title and URI?
|
20
22
|
CREATIVE_COMMONS_USE_LICENSES = {
|
21
|
-
'by' =>
|
22
|
-
|
23
|
-
'by-sa' =>
|
24
|
-
|
25
|
-
'by_sa' =>
|
26
|
-
|
27
|
-
|
28
|
-
'by-nd' =>
|
29
|
-
|
30
|
-
'by-nc' =>
|
31
|
-
|
23
|
+
'by' => { :human_readable => 'Attribution 3.0 Unported',
|
24
|
+
:uri => 'https://creativecommons.org/licenses/by/3.0/' },
|
25
|
+
'by-sa' => { :human_readable => 'Attribution Share Alike 3.0 Unported',
|
26
|
+
:uri => 'https://creativecommons.org/licenses/by-sa/3.0/' },
|
27
|
+
'by_sa' => { :human_readable => 'Attribution Share Alike 3.0 Unported',
|
28
|
+
:uri => 'https://creativecommons.org/licenses/by-sa/3.0/',
|
29
|
+
:deprecation_warning => 'license code "by_sa" was a typo in argo, prefer "by-sa"' },
|
30
|
+
'by-nd' => { :human_readable => 'Attribution No Derivatives 3.0 Unported',
|
31
|
+
:uri => 'https://creativecommons.org/licenses/by-nd/3.0/' },
|
32
|
+
'by-nc' => { :human_readable => 'Attribution Non-Commercial 3.0 Unported',
|
33
|
+
:uri => 'https://creativecommons.org/licenses/by-nc/3.0/' },
|
32
34
|
'by-nc-sa' => { :human_readable => 'Attribution Non-Commercial Share Alike 3.0 Unported',
|
33
35
|
:uri => 'https://creativecommons.org/licenses/by-nc-sa/3.0/' },
|
34
36
|
'by-nc-nd' => { :human_readable => 'Attribution Non-Commercial, No Derivatives 3.0 Unported',
|
35
37
|
:uri => 'https://creativecommons.org/licenses/by-nc-nd/3.0/' },
|
36
|
-
'pdm' =>
|
37
|
-
|
38
|
+
'pdm' => { :human_readable => 'Public Domain Mark 1.0',
|
39
|
+
:uri => 'https://creativecommons.org/publicdomain/mark/1.0/' }
|
38
40
|
}.freeze
|
39
41
|
OPEN_DATA_COMMONS_USE_LICENSES = {
|
40
|
-
'pddl' =>
|
41
|
-
|
42
|
-
'odc-by' =>
|
43
|
-
|
42
|
+
'pddl' => { :human_readable => 'Open Data Commons Public Domain Dedication and License 1.0',
|
43
|
+
:uri => 'http://opendatacommons.org/licenses/pddl/1.0/' },
|
44
|
+
'odc-by' => { :human_readable => 'Open Data Commons Attribution License 1.0',
|
45
|
+
:uri => 'http://opendatacommons.org/licenses/by/1.0/' },
|
44
46
|
'odc-odbl' => { :human_readable => 'Open Data Commons Open Database License 1.0',
|
45
47
|
:uri => 'http://opendatacommons.org/licenses/odbl/1.0/' }
|
46
48
|
}.freeze
|
@@ -87,7 +89,7 @@ module Dor
|
|
87
89
|
end
|
88
90
|
|
89
91
|
def mods_title=(val)
|
90
|
-
descMetadata.update_values({[:title_info, :main_title] => val})
|
92
|
+
descMetadata.update_values({ [:title_info, :main_title] => val })
|
91
93
|
end
|
92
94
|
|
93
95
|
# get all collections listed for this APO, used during registration
|
@@ -139,7 +141,7 @@ module Dor
|
|
139
141
|
administrativeMetadata.ng_xml_will_change!
|
140
142
|
administrativeMetadata.add_child_node(administrativeMetadata, :descMetadata)
|
141
143
|
end
|
142
|
-
administrativeMetadata.update_values({[:descMetadata, :source] => val})
|
144
|
+
administrativeMetadata.update_values({ [:descMetadata, :source] => val })
|
143
145
|
end
|
144
146
|
|
145
147
|
def use_statement
|
@@ -177,18 +179,21 @@ module Dor
|
|
177
179
|
def use_license
|
178
180
|
return creative_commons_license unless creative_commons_license.blank?
|
179
181
|
return open_data_commons_license unless open_data_commons_license.blank?
|
182
|
+
|
180
183
|
nil
|
181
184
|
end
|
182
185
|
|
183
186
|
def use_license_uri
|
184
187
|
return defaultObjectRights.creative_commons.uri.first unless defaultObjectRights.creative_commons.uri.blank?
|
185
188
|
return defaultObjectRights.open_data_commons.uri.first unless defaultObjectRights.open_data_commons.uri.blank?
|
189
|
+
|
186
190
|
nil
|
187
191
|
end
|
188
192
|
|
189
193
|
def use_license_human
|
190
194
|
return creative_commons_license_human unless creative_commons_license_human.blank?
|
191
195
|
return open_data_commons_license_human unless open_data_commons_license_human.blank?
|
196
|
+
|
192
197
|
nil
|
193
198
|
end
|
194
199
|
|
@@ -293,7 +298,7 @@ module Dor
|
|
293
298
|
administrativeMetadata.ng_xml_will_change!
|
294
299
|
administrativeMetadata.add_child_node(administrativeMetadata.ng_xml.root, :metadata_format)
|
295
300
|
end
|
296
|
-
administrativeMetadata.update_values({[:metadata_format] => format})
|
301
|
+
administrativeMetadata.update_values({ [:metadata_format] => format })
|
297
302
|
end
|
298
303
|
|
299
304
|
def desc_metadata_source
|
@@ -306,7 +311,7 @@ module Dor
|
|
306
311
|
administrativeMetadata.ng_xml_will_change!
|
307
312
|
administrativeMetadata.add_child_node(administrativeMetadata.ng_xml.root, :metadata_source)
|
308
313
|
end
|
309
|
-
administrativeMetadata.update_values({[:metadata_source] => format})
|
314
|
+
administrativeMetadata.update_values({ [:metadata_source] => format })
|
310
315
|
end
|
311
316
|
|
312
317
|
# List of default workflows, used to provide choices at registration
|
@@ -319,6 +324,7 @@ module Dor
|
|
319
324
|
# @param wf [String] the name of the workflow, ex. 'digitizationWF'
|
320
325
|
def default_workflow=(wf)
|
321
326
|
fail ArgumentError, 'Must have a valid workflow for default' if wf.blank?
|
327
|
+
|
322
328
|
xml = administrativeMetadata.ng_xml
|
323
329
|
administrativeMetadata.ng_xml_will_change!
|
324
330
|
nodes = xml.search('//registration/workflow')
|
@@ -343,6 +349,7 @@ module Dor
|
|
343
349
|
|
344
350
|
def agreement=(val)
|
345
351
|
fail ArgumentError, 'agreement must have a valid druid' if val.blank?
|
352
|
+
|
346
353
|
self.agreement_object = Dor.find val.to_s, :cast => true
|
347
354
|
end
|
348
355
|
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Dor
|
2
4
|
module Embargoable
|
3
5
|
extend ActiveSupport::Concern
|
@@ -68,6 +70,7 @@ module Dor
|
|
68
70
|
if new_date.past?
|
69
71
|
raise ArgumentError, 'You cannot set the embargo date to a past date.'
|
70
72
|
end
|
73
|
+
|
71
74
|
updated = false
|
72
75
|
rightsMetadata.ng_xml.search('//embargoReleaseDate').each do |node|
|
73
76
|
node.content = new_date.beginning_of_day.utc.xmlschema
|
@@ -76,6 +79,7 @@ module Dor
|
|
76
79
|
rightsMetadata.ng_xml_will_change!
|
77
80
|
rightsMetadata.save
|
78
81
|
raise 'No release date in rights metadata, cannot proceed!' unless updated
|
82
|
+
|
79
83
|
embargoMetadata.ng_xml.xpath('//releaseDate').each do |node|
|
80
84
|
node.content = new_date.beginning_of_day.utc.xmlschema
|
81
85
|
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Dor
|
2
4
|
module Governable
|
3
5
|
extend ActiveSupport::Concern
|
@@ -16,13 +18,14 @@ module Dor
|
|
16
18
|
# and APO, or if the APO does not have a default_lane
|
17
19
|
# @return [String] the lane id
|
18
20
|
def default_workflow_lane
|
19
|
-
return 'default' if admin_policy_object.nil?
|
21
|
+
return 'default' if admin_policy_object.nil? # TODO: log warning?
|
20
22
|
|
21
23
|
admin_md = admin_policy_object.datastreams['administrativeMetadata']
|
22
24
|
return 'default' unless admin_md.respond_to?(:default_workflow_lane) # Some APOs don't have this datastream
|
23
25
|
|
24
26
|
lane = admin_md.default_workflow_lane
|
25
27
|
return 'default' if lane.blank?
|
28
|
+
|
26
29
|
lane
|
27
30
|
end
|
28
31
|
|
@@ -81,8 +84,10 @@ module Dor
|
|
81
84
|
def rights
|
82
85
|
return nil unless self.respond_to? :rightsMetadata
|
83
86
|
return nil if rightsMetadata.nil?
|
87
|
+
|
84
88
|
xml = rightsMetadata.ng_xml
|
85
|
-
return nil if xml.search('//rightsMetadata').length != 1
|
89
|
+
return nil if xml.search('//rightsMetadata').length != 1 # ORLY?
|
90
|
+
|
86
91
|
if xml.search('//rightsMetadata/access[@type=\'read\']/machine/group').length == 1
|
87
92
|
'Stanford'
|
88
93
|
elsif xml.search('//rightsMetadata/access[@type=\'read\']/machine/world').length == 1
|
@@ -1,10 +1,12 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Dor
|
2
4
|
module Identifiable
|
3
5
|
extend ActiveSupport::Concern
|
4
6
|
|
5
7
|
# ids for previous and current catkeys
|
6
|
-
CATKEY_TYPE_ID = 'catkey'
|
7
|
-
PREVIOUS_CATKEY_TYPE_ID = 'previous_catkey'
|
8
|
+
CATKEY_TYPE_ID = 'catkey'
|
9
|
+
PREVIOUS_CATKEY_TYPE_ID = 'previous_catkey'
|
8
10
|
|
9
11
|
included do
|
10
12
|
has_metadata :name => 'DC', :type => SimpleDublinCoreDs, :label => 'Dublin Core Record for self object'
|
@@ -22,6 +24,7 @@ module Dor
|
|
22
24
|
# than the default Fedora sequence
|
23
25
|
def assign_pid(_obj)
|
24
26
|
return Dor::SuriService.mint_id if Dor::Config.suri.mint_ids
|
27
|
+
|
25
28
|
super
|
26
29
|
end
|
27
30
|
end
|
@@ -33,7 +36,7 @@ module Dor
|
|
33
36
|
|
34
37
|
# helper method to get just the content type tag
|
35
38
|
def content_type_tag
|
36
|
-
content_tag = tags.select {|tag| tag.include?('Process : Content Type')}
|
39
|
+
content_tag = tags.select { |tag| tag.include?('Process : Content Type') }
|
37
40
|
content_tag.size == 1 ? content_tag[0].split(':').last.strip : ''
|
38
41
|
end
|
39
42
|
|
@@ -62,7 +65,6 @@ module Dor
|
|
62
65
|
# @param [String] catkey the new source identifier
|
63
66
|
# @return [String] same value, as per Ruby assignment convention
|
64
67
|
def catkey=(val)
|
65
|
-
|
66
68
|
if val != catkey && !catkey.blank? # if there was already a catkey in the record, store that in the "previous" spot (assuming there is no change)
|
67
69
|
identityMetadata.add_otherId("#{PREVIOUS_CATKEY_TYPE_ID}:#{catkey}")
|
68
70
|
end
|
@@ -70,9 +72,9 @@ module Dor
|
|
70
72
|
if val.blank? # if we are setting the catkey to blank, remove the node from XML
|
71
73
|
remove_other_Id(CATKEY_TYPE_ID)
|
72
74
|
elsif catkey.blank? # if there is no current catkey, then add it
|
73
|
-
add_other_Id(CATKEY_TYPE_ID,val)
|
74
|
-
|
75
|
-
update_other_Id(CATKEY_TYPE_ID,val)
|
75
|
+
add_other_Id(CATKEY_TYPE_ID, val)
|
76
|
+
else # if there is a current catkey, update the current catkey to the new value
|
77
|
+
update_other_Id(CATKEY_TYPE_ID, val)
|
76
78
|
end
|
77
79
|
|
78
80
|
val
|
@@ -88,29 +90,30 @@ module Dor
|
|
88
90
|
if identityMetadata.otherId(type).length > 0
|
89
91
|
raise 'There is an existing entry for ' + type + ', consider using update_other_Id().'
|
90
92
|
end
|
93
|
+
|
91
94
|
identityMetadata.add_otherId(type + ':' + val)
|
92
95
|
end
|
93
96
|
|
94
97
|
def update_other_Id(type, new_val, val = nil)
|
95
98
|
identityMetadata.ng_xml.search('//otherId[@name=\'' + type + '\']')
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
99
|
+
.select { |node| val.nil? || node.content == val }
|
100
|
+
.each { identityMetadata.ng_xml_will_change! }
|
101
|
+
.each { |node| node.content = new_val }
|
102
|
+
.any?
|
100
103
|
end
|
101
104
|
|
102
105
|
def remove_other_Id(type, val = nil)
|
103
106
|
identityMetadata.ng_xml.search('//otherId[@name=\'' + type + '\']')
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
107
|
+
.select { |node| val.nil? || node.content == val }
|
108
|
+
.each { identityMetadata.ng_xml_will_change! }
|
109
|
+
.each(&:remove)
|
110
|
+
.any?
|
108
111
|
end
|
109
112
|
|
110
113
|
# turns a tag string into an array with one element per tag part.
|
111
114
|
# split on ":", disregard leading and trailing whitespace on tokens.
|
112
115
|
def split_tag_to_arr(tag_str)
|
113
|
-
tag_str.split(':').map {|str| str.strip}
|
116
|
+
tag_str.split(':').map { |str| str.strip }
|
114
117
|
end
|
115
118
|
|
116
119
|
# turn a tag array back into a tag string with a standard format
|
@@ -136,6 +139,7 @@ module Dor
|
|
136
139
|
if dupe_existing_tag
|
137
140
|
raise "An existing tag (#{dupe_existing_tag}) is the same, consider using update_tag?"
|
138
141
|
end
|
142
|
+
|
139
143
|
normalized_tag
|
140
144
|
end
|
141
145
|
|
@@ -147,9 +151,10 @@ module Dor
|
|
147
151
|
if tag_arr.length < 2
|
148
152
|
raise ArgumentError, "Invalid tag structure: tag '#{tag_str}' must have at least 2 elements"
|
149
153
|
end
|
150
|
-
if tag_arr.detect {|str| str.empty?}
|
154
|
+
if tag_arr.detect { |str| str.empty? }
|
151
155
|
raise ArgumentError, "Invalid tag structure: tag '#{tag_str}' contains empty elements"
|
152
156
|
end
|
157
|
+
|
153
158
|
tag_arr
|
154
159
|
end
|
155
160
|
|
@@ -164,25 +169,19 @@ module Dor
|
|
164
169
|
def remove_tag(tag)
|
165
170
|
normtag = normalize_tag(tag)
|
166
171
|
identityMetadata.ng_xml.search('//tag')
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
172
|
+
.select { |node| normalize_tag(node.content) == normtag }
|
173
|
+
.each { identityMetadata.ng_xml_will_change! }
|
174
|
+
.each(&:remove)
|
175
|
+
.any?
|
171
176
|
end
|
172
177
|
|
173
178
|
def update_tag(old_tag, new_tag)
|
174
179
|
normtag = normalize_tag(old_tag)
|
175
180
|
identityMetadata.ng_xml.search('//tag')
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
end
|
181
|
-
|
182
|
-
def get_related_obj_display_title(related_obj, default_title)
|
183
|
-
return default_title unless related_obj
|
184
|
-
|
185
|
-
related_obj.full_title || default_title
|
181
|
+
.select { |node| normalize_tag(node.content) == normtag }
|
182
|
+
.each { identityMetadata.ng_xml_will_change! }
|
183
|
+
.each { |node| node.content = normalize_tag(new_tag) }
|
184
|
+
.any?
|
186
185
|
end
|
187
186
|
|
188
187
|
# a regex that can be used to identify the last part of a druid (e.g. oo000oo0001)
|
@@ -199,9 +198,9 @@ module Dor
|
|
199
198
|
|
200
199
|
# Since purl does not use the druid: prefix but much of dor does, use this function to strip the druid: if needed
|
201
200
|
# @return [String] the druid sans the druid: or if there was no druid: prefix, the entire string you passed
|
202
|
-
def remove_druid_prefix(druid=id)
|
203
|
-
result=druid.match(/#{pid_regex}/)
|
204
|
-
result.nil? ? druid : result[0]
|
201
|
+
def remove_druid_prefix(druid = id)
|
202
|
+
result = druid.match(/#{pid_regex}/)
|
203
|
+
result.nil? ? druid : result[0] # if no matches, return the string passed in, otherwise return the match
|
205
204
|
end
|
206
205
|
|
207
206
|
# Override ActiveFedora::Core#adapt_to_cmodel (used with associations, among other places) to
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'fileutils'
|
2
4
|
require 'uri'
|
3
5
|
|
@@ -9,13 +11,14 @@ module Dor
|
|
9
11
|
has_metadata :name => 'contentMetadata', :type => Dor::ContentMetadataDS, :label => 'Content Metadata', :control_group => 'M'
|
10
12
|
end
|
11
13
|
|
12
|
-
DIFF_FILENAME = 'cm_inv_diff'
|
14
|
+
DIFF_FILENAME = 'cm_inv_diff'
|
13
15
|
|
14
16
|
# Deletes all cm_inv_diff files in the workspace for the Item
|
15
17
|
def clear_diff_cache
|
16
18
|
if Dor::Config.stacks.local_workspace_root.nil?
|
17
19
|
raise ArgumentError, 'Missing Dor::Config.stacks.local_workspace_root'
|
18
20
|
end
|
21
|
+
|
19
22
|
druid = DruidTools::Druid.new(pid, Dor::Config.stacks.local_workspace_root)
|
20
23
|
diff_pattern = File.join(druid.temp_dir, DIFF_FILENAME + '.*')
|
21
24
|
FileUtils.rm_f Dir.glob(diff_pattern)
|