ddr-models 1.11.8 → 1.12.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/app/models/component.rb +1 -0
- data/app/models/item.rb +13 -2
- data/config/initializers/active_fedora_base.rb +9 -5
- data/config/initializers/subscriptions.rb +3 -0
- data/config/locales/groups.en.yml +0 -7
- data/lib/ddr/auth/remote_group_service.rb +2 -11
- data/lib/ddr/datastreams.rb +5 -4
- data/lib/ddr/datastreams/{admin_metadata_datastream.rb → administrative_metadata_datastream.rb} +2 -2
- data/lib/ddr/datastreams/descriptive_metadata_datastream.rb +4 -45
- data/lib/ddr/datastreams/metadata_datastream.rb +44 -0
- data/lib/ddr/datastreams/structural_metadata_datastream.rb +24 -0
- data/lib/ddr/events.rb +2 -2
- data/lib/ddr/events/deletion_event.rb +12 -0
- data/lib/ddr/events/event.rb +0 -15
- data/lib/ddr/events/preservation_event_behavior.rb +4 -2
- data/lib/ddr/index_fields.rb +32 -36
- data/lib/ddr/managers/permanent_id_manager.rb +2 -1
- data/lib/ddr/metadata.rb +0 -3
- data/lib/ddr/models.rb +1 -1
- data/lib/ddr/models/base.rb +4 -0
- data/lib/ddr/models/describable.rb +5 -5
- data/lib/ddr/models/has_admin_metadata.rb +1 -1
- data/lib/ddr/models/has_children.rb +1 -5
- data/lib/ddr/models/has_content.rb +10 -0
- data/lib/ddr/models/has_struct_metadata.rb +57 -0
- data/lib/ddr/models/indexing.rb +0 -10
- data/lib/ddr/models/solr_document.rb +1 -5
- data/lib/ddr/models/version.rb +1 -1
- data/lib/ddr/notifications.rb +2 -1
- data/lib/ddr/utils.rb +2 -2
- data/lib/ddr/vocab.rb +3 -0
- data/lib/ddr/vocab/asset.rb +3 -0
- data/lib/ddr/{metadata → vocab}/duke_terms.rb +2 -2
- data/lib/ddr/{metadata → vocab}/rdf_vocabulary_parser.rb +2 -2
- data/lib/ddr/{metadata → vocab}/sources/duketerms.rdf.xml +0 -0
- data/lib/ddr/{metadata → vocab}/vocabulary.rb +2 -2
- data/spec/dummy/log/development.log +0 -3829
- data/spec/dummy/log/test.log +0 -46079
- data/spec/factories/test_model_factories.rb +0 -57
- data/spec/models/collection_spec.rb +0 -5
- data/spec/models/descriptive_metadata_datastream_spec.rb +20 -4
- data/spec/models/events_spec.rb +8 -0
- data/spec/models/has_struct_metadata_spec.rb +34 -0
- data/spec/models/item_spec.rb +13 -1
- data/spec/support/shared_examples_for_ddr_models.rb +11 -1
- data/spec/support/shared_examples_for_describables.rb +5 -5
- data/spec/support/shared_examples_for_events.rb +4 -40
- metadata +13 -23
- data/lib/ddr/datastreams/content_metadata_datastream.rb +0 -147
- data/lib/ddr/datastreams/preservation_metadata_datastream.rb +0 -13
- data/lib/ddr/events/preservation_event_type.rb +0 -24
- data/lib/ddr/models/has_content_metadata.rb +0 -16
- data/spec/fixtures/contentMetadata.xml +0 -37
- data/spec/models/solr_document_spec.rb +0 -23
- data/spec/services/remote_group_service_spec.rb +0 -16
- data/spec/support/shared_examples_for_event_loggables.rb +0 -3
- data/spec/support/shared_examples_for_has_content_metadata.rb +0 -74
- data/spec/support/shared_examples_for_licensable.rb +0 -15
@@ -14,14 +14,9 @@ class TestChild < TestModel
|
|
14
14
|
belongs_to :parent, property: :is_part_of, class_name: 'TestParent'
|
15
15
|
end
|
16
16
|
|
17
|
-
class TestContentMetadata < TestParent
|
18
|
-
include Ddr::Models::HasContentMetadata
|
19
|
-
end
|
20
|
-
|
21
17
|
class TestModelOmnibus < TestModel
|
22
18
|
include Ddr::Models::Governable
|
23
19
|
include Ddr::Models::HasContent
|
24
|
-
include Ddr::Models::HasContentMetadata
|
25
20
|
include Ddr::Models::HasAttachments
|
26
21
|
has_many :children, property: :is_part_of, class_name: 'TestChild'
|
27
22
|
belongs_to :parent, property: :is_part_of, class_name: 'TestParent'
|
@@ -68,58 +63,6 @@ FactoryGirl.define do
|
|
68
63
|
after(:create) { |c| c.fixity_check! }
|
69
64
|
end
|
70
65
|
end
|
71
|
-
|
72
|
-
factory :test_content_metadata do
|
73
|
-
title [ "DulHydra Test Content Metadata Object" ]
|
74
|
-
sequence(:identifier) { |n| [ "testcontentmetadata%05d" % n ] }
|
75
|
-
|
76
|
-
factory :test_content_metadata_has_children do
|
77
|
-
ignore do
|
78
|
-
child_count 3
|
79
|
-
end
|
80
|
-
after(:create) do |parent, evaluator|
|
81
|
-
FactoryGirl.create_list(:test_child, evaluator.child_count, :parent => parent)
|
82
|
-
child_pids = []
|
83
|
-
parent.children.each do |child|
|
84
|
-
child_pids << child.pid
|
85
|
-
end
|
86
|
-
parent.contentMetadata.content = <<-EOS
|
87
|
-
<mets xmlns="http://www.loc.gov/METS/" xmlns:xlink="http://www.w3.org/1999/xlink">
|
88
|
-
<fileSec>
|
89
|
-
<fileGrp ID="GRP01" USE="Master Image">
|
90
|
-
<file ID="FILE001">
|
91
|
-
<FLocat xlink:href="#{child_pids[2]}/content" LOCTYPE="URL"/>
|
92
|
-
</file>
|
93
|
-
<file ID="FILE002">
|
94
|
-
<FLocat xlink:href="#{child_pids[0]}/content" LOCTYPE="URL"/>
|
95
|
-
</file>
|
96
|
-
</fileGrp>
|
97
|
-
<fileGrp ID="GRP00" USE="Composite PDF">
|
98
|
-
<file ID="FILE000">
|
99
|
-
<FLocat xlink:href="#{child_pids[1]}/content" LOCTYPE="URL"/>
|
100
|
-
</file>
|
101
|
-
</fileGrp>
|
102
|
-
</fileSec>
|
103
|
-
<structMap>
|
104
|
-
<div ID="DIV01" TYPE="image" LABEL="Images">
|
105
|
-
<div ORDER="1">
|
106
|
-
<fptr FILEID="FILE001"/>
|
107
|
-
</div>
|
108
|
-
<div ORDER="2">
|
109
|
-
<fptr FILEID="FILE002"/>
|
110
|
-
</div>
|
111
|
-
</div>
|
112
|
-
<div ID="DIV00" TYPE="pdf" LABEL="PDF">
|
113
|
-
<fptr FILEID="FILE000"/>
|
114
|
-
</div>
|
115
|
-
</structMap>
|
116
|
-
</mets>
|
117
|
-
EOS
|
118
|
-
parent.contentMetadata.mimeType = "application/xml"
|
119
|
-
parent.save!
|
120
|
-
end
|
121
|
-
end
|
122
|
-
end
|
123
66
|
|
124
67
|
factory :test_model_omnibus do
|
125
68
|
title [ "DulHydra Test Omnibus Object" ]
|
@@ -20,11 +20,6 @@ RSpec.describe Collection, :type => :model do
|
|
20
20
|
expect(collection.defaultRights.license.description.first).to eq("License Description")
|
21
21
|
expect(collection.defaultRights.license.url.first).to eq("http://library.duke.edu")
|
22
22
|
end
|
23
|
-
it "should index the terms" do
|
24
|
-
expect(collection.to_solr[Ddr::IndexFields::DEFAULT_LICENSE_TITLE]).to eq("License Title")
|
25
|
-
expect(collection.to_solr[Ddr::IndexFields::DEFAULT_LICENSE_DESCRIPTION]).to eq("License Description")
|
26
|
-
expect(collection.to_solr[Ddr::IndexFields::DEFAULT_LICENSE_URL]).to eq("http://library.duke.edu")
|
27
|
-
end
|
28
23
|
end
|
29
24
|
|
30
25
|
describe "#components_from_solr" do
|
@@ -25,19 +25,19 @@ module Ddr
|
|
25
25
|
context "terminology" do
|
26
26
|
subject { described_class.term_names }
|
27
27
|
it "should have a term for each term name in the RDF::DC vocab" do
|
28
|
-
expect(subject).to include(*Ddr::
|
28
|
+
expect(subject).to include(*Ddr::Vocab::Vocabulary.term_names(RDF::DC))
|
29
29
|
end
|
30
30
|
it "should have a term for each term name in the DukeTerms vocab" do
|
31
|
-
expect(subject).to include(*Ddr::
|
31
|
+
expect(subject).to include(*Ddr::Vocab::Vocabulary.term_names(Ddr::Vocab::DukeTerms))
|
32
32
|
end
|
33
33
|
end
|
34
34
|
context "properties" do
|
35
35
|
subject { described_class.properties.map { |prop| prop[1].predicate } }
|
36
36
|
it "should include all the RDF::DC predicates" do
|
37
|
-
expect(subject).to include(*Ddr::
|
37
|
+
expect(subject).to include(*Ddr::Vocab::Vocabulary.property_terms(RDF::DC))
|
38
38
|
end
|
39
39
|
it "should include all the DukeTerms predicates" do
|
40
|
-
expect(subject).to include(*Ddr::
|
40
|
+
expect(subject).to include(*Ddr::Vocab::Vocabulary.property_terms(Ddr::Vocab::DukeTerms))
|
41
41
|
end
|
42
42
|
end
|
43
43
|
context "raw content" do
|
@@ -77,6 +77,22 @@ module Ddr
|
|
77
77
|
expect(ds.resource).to be_isomorphic_with(RDF::Reader.for(:ntriples).new(content))
|
78
78
|
end
|
79
79
|
end
|
80
|
+
context "using the set_values and add_value methods" do
|
81
|
+
let(:ds) { described_class.new(nil, 'descMetadata') }
|
82
|
+
before { ds.type = "Photograph" }
|
83
|
+
context "#set_values" do
|
84
|
+
it "should set the values of the term to those supplied" do
|
85
|
+
ds.set_values :type, [ "Image", "Still Image" ]
|
86
|
+
expect(ds.type).to eq([ "Image", "Still Image" ])
|
87
|
+
end
|
88
|
+
end
|
89
|
+
context "#add_value" do
|
90
|
+
it "should add the supplied value to those of the term" do
|
91
|
+
ds.add_value :type, "Image"
|
92
|
+
expect(ds.type).to eq([ "Photograph", "Image" ])
|
93
|
+
end
|
94
|
+
end
|
95
|
+
end
|
80
96
|
context "solrization" do
|
81
97
|
let(:ds) { described_class.new(nil, 'descMetadata') }
|
82
98
|
subject { ds.to_solr }
|
data/spec/models/events_spec.rb
CHANGED
@@ -60,5 +60,13 @@ module Ddr
|
|
60
60
|
expect(subject.display_type).to eq "Validation"
|
61
61
|
end
|
62
62
|
end
|
63
|
+
|
64
|
+
RSpec.describe DeletionEvent, type: :model, events: true do
|
65
|
+
it_behaves_like "an event"
|
66
|
+
it_behaves_like "a preservation-related event"
|
67
|
+
it "should have a display type" do
|
68
|
+
expect(subject.display_type).to eq "Deletion"
|
69
|
+
end
|
70
|
+
end
|
63
71
|
end
|
64
72
|
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module Ddr
|
4
|
+
module Models
|
5
|
+
RSpec.describe HasStructMetadata, type: :model do
|
6
|
+
|
7
|
+
context "component" do
|
8
|
+
describe "component creation" do
|
9
|
+
let(:item) { Item.new }
|
10
|
+
let(:comp) { Component.new(identifier: [ "id001" ]) }
|
11
|
+
before do
|
12
|
+
allow(comp).to receive(:parent).and_return(item)
|
13
|
+
allow(comp).to receive(:has_content?).and_return(true)
|
14
|
+
allow(comp).to receive(:content_type).and_return("image/tiff")
|
15
|
+
allow(item).to receive(:children_by_file_use).and_return({})
|
16
|
+
end
|
17
|
+
it "should assign default values for unassigned attributes" do
|
18
|
+
comp.save
|
19
|
+
expect(comp.file_use).to_not be_nil
|
20
|
+
expect(comp.order).to_not be_nil
|
21
|
+
expect(comp.file_group).to_not be_nil
|
22
|
+
end
|
23
|
+
it "should not overwrite assigned attributes" do
|
24
|
+
comp.update_attributes(file_use: 'foo', order: 3, file_group: 'special')
|
25
|
+
expect(comp.file_use).to eq('foo')
|
26
|
+
expect(comp.order).to eq(3)
|
27
|
+
expect(comp.file_group).to eq('special')
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
data/spec/models/item_spec.rb
CHANGED
@@ -2,7 +2,19 @@ require 'spec_helper'
|
|
2
2
|
|
3
3
|
RSpec.describe Item, :type => :model do
|
4
4
|
it_behaves_like "a DDR model"
|
5
|
-
it_behaves_like "an object that has content metadata"
|
6
5
|
it_behaves_like "it has an association", :belongs_to, :parent, :is_member_of_collection, "Collection"
|
7
6
|
it_behaves_like "it has an association", :has_many, :children, :is_part_of, "Component"
|
7
|
+
|
8
|
+
context "has structured children" do
|
9
|
+
let!(:item) { Item.create }
|
10
|
+
let!(:comp1) { Component.create(parent: item, file_use: 'master', order: 2) }
|
11
|
+
let!(:comp2) { Component.create(parent: item, file_use: 'reference', order: 1) }
|
12
|
+
let!(:comp3) { Component.create(parent: item, file_use: 'master', order: 1) }
|
13
|
+
it "should group and order the children" do
|
14
|
+
results = item.children_by_file_use
|
15
|
+
expect(results['master']).to eq([ comp3, comp1 ])
|
16
|
+
expect(results['reference']).to eq([ comp2 ])
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
8
20
|
end
|
@@ -1,8 +1,18 @@
|
|
1
1
|
RSpec.shared_examples "a DDR model" do
|
2
|
+
|
2
3
|
it_behaves_like "a describable object"
|
3
4
|
it_behaves_like "a governable object"
|
4
|
-
it_behaves_like "a licensable object"
|
5
5
|
it_behaves_like "an access controllable object"
|
6
6
|
it_behaves_like "an object that has properties"
|
7
7
|
it_behaves_like "an object that has a display title"
|
8
|
+
|
9
|
+
describe "events" do
|
10
|
+
describe "on deletion with #destroy" do
|
11
|
+
before { subject.save(validate: false) }
|
12
|
+
it "should create a deletion event" do
|
13
|
+
expect { subject.destroy }.to change { Ddr::Events::DeletionEvent.for_object(subject).count }.from(0).to(1)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
8
18
|
end
|
@@ -15,11 +15,11 @@ RSpec.shared_examples "a describable object" do
|
|
15
15
|
end
|
16
16
|
describe "arguments" do
|
17
17
|
it "with fixed results" do
|
18
|
-
expect(object.desc_metadata_terms(:dcterms)).to eq(Ddr::
|
19
|
-
expect(object.desc_metadata_terms(:dcterms)).to match_array Ddr::
|
20
|
-
expect(object.desc_metadata_terms(:duke)).to eq Ddr::
|
21
|
-
expect(object.desc_metadata_terms(:dcterms_elements11)).to eq Ddr::
|
22
|
-
expect(object.desc_metadata_terms(:defined_attributes)).to match_array Ddr::
|
18
|
+
expect(object.desc_metadata_terms(:dcterms)).to eq(Ddr::Vocab::Vocabulary.term_names(RDF::DC11) + (Ddr::Vocab::Vocabulary.term_names(RDF::DC) - Ddr::Vocab::Vocabulary.term_names(RDF::DC11)))
|
19
|
+
expect(object.desc_metadata_terms(:dcterms)).to match_array Ddr::Vocab::Vocabulary.term_names(RDF::DC)
|
20
|
+
expect(object.desc_metadata_terms(:duke)).to eq Ddr::Vocab::Vocabulary.term_names(Ddr::Vocab::DukeTerms)
|
21
|
+
expect(object.desc_metadata_terms(:dcterms_elements11)).to eq Ddr::Vocab::Vocabulary.term_names(RDF::DC11)
|
22
|
+
expect(object.desc_metadata_terms(:defined_attributes)).to match_array Ddr::Vocab::Vocabulary.term_names(RDF::DC11)
|
23
23
|
end
|
24
24
|
context "with variable results" do
|
25
25
|
before do
|
@@ -31,27 +31,12 @@ end
|
|
31
31
|
|
32
32
|
RSpec.shared_examples "an event" do
|
33
33
|
describe "validation" do
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
expect(subject.errors[:pid]).to include "can't be blank"
|
38
|
-
end
|
39
|
-
context "when the object exists" do
|
40
|
-
before { subject.pid = ActiveFedora::Base.create.pid }
|
41
|
-
it "should be valid" do
|
42
|
-
expect(subject).to be_valid
|
43
|
-
end
|
44
|
-
end
|
45
|
-
context "when the object doesn't exist" do
|
46
|
-
before { subject.pid = "test:123" }
|
47
|
-
it "should not be valid" do
|
48
|
-
expect(subject).not_to be_valid
|
49
|
-
expect(subject.errors).to have_key :pid
|
50
|
-
end
|
51
|
-
end
|
34
|
+
it "should require a PID" do
|
35
|
+
expect(subject).not_to be_valid
|
36
|
+
expect(subject.errors[:pid]).to include "can't be blank"
|
52
37
|
end
|
53
38
|
it "should require an event_date_time" do
|
54
|
-
subject.event_date_time
|
39
|
+
allow(subject).to receive(:event_date_time) { nil } # b/c set to default after init
|
55
40
|
expect(subject).not_to be_valid
|
56
41
|
expect(subject.errors[:event_date_time]).to include "can't be blank"
|
57
42
|
end
|
@@ -135,27 +120,6 @@ RSpec.shared_examples "an event" do
|
|
135
120
|
end
|
136
121
|
end
|
137
122
|
|
138
|
-
describe "object existence" do
|
139
|
-
it "should be false if pid is nil" do
|
140
|
-
expect(subject.object_exists?).to be_falsey
|
141
|
-
end
|
142
|
-
it "should be false if pid not found in repository" do
|
143
|
-
subject.pid = "test:123"
|
144
|
-
expect(subject.object_exists?).to be_falsey
|
145
|
-
end
|
146
|
-
it "should be true if object exists in repository" do
|
147
|
-
allow(ActiveFedora::Base).to receive(:find).with("test:123") { mock_object }
|
148
|
-
subject.pid = "test:123"
|
149
|
-
expect(subject.object_exists?).to be_truthy
|
150
|
-
end
|
151
|
-
it "should be true if object instance variable is set" do
|
152
|
-
obj = mock_object(pid: "test:123")
|
153
|
-
allow(obj).to receive(:new_record?) { false }
|
154
|
-
subject.object = obj
|
155
|
-
expect(subject.object_exists?).to be_truthy
|
156
|
-
end
|
157
|
-
end
|
158
|
-
|
159
123
|
describe "event_date_time string representation" do
|
160
124
|
subject { described_class.new(event_date_time: Time.utc(2014, 6, 4, 11, 7, 35)) }
|
161
125
|
it "should conform to the specified format" do
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ddr-models
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.12.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jim Coble
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2015-03-
|
12
|
+
date: 2015-03-03 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rails
|
@@ -323,19 +323,19 @@ files:
|
|
323
323
|
- lib/ddr/auth/superuser.rb
|
324
324
|
- lib/ddr/auth/user.rb
|
325
325
|
- lib/ddr/datastreams.rb
|
326
|
-
- lib/ddr/datastreams/
|
327
|
-
- lib/ddr/datastreams/content_metadata_datastream.rb
|
326
|
+
- lib/ddr/datastreams/administrative_metadata_datastream.rb
|
328
327
|
- lib/ddr/datastreams/datastream_behavior.rb
|
329
328
|
- lib/ddr/datastreams/descriptive_metadata_datastream.rb
|
330
|
-
- lib/ddr/datastreams/
|
329
|
+
- lib/ddr/datastreams/metadata_datastream.rb
|
331
330
|
- lib/ddr/datastreams/properties_datastream.rb
|
331
|
+
- lib/ddr/datastreams/structural_metadata_datastream.rb
|
332
332
|
- lib/ddr/events.rb
|
333
333
|
- lib/ddr/events/creation_event.rb
|
334
|
+
- lib/ddr/events/deletion_event.rb
|
334
335
|
- lib/ddr/events/event.rb
|
335
336
|
- lib/ddr/events/fixity_check_event.rb
|
336
337
|
- lib/ddr/events/ingestion_event.rb
|
337
338
|
- lib/ddr/events/preservation_event_behavior.rb
|
338
|
-
- lib/ddr/events/preservation_event_type.rb
|
339
339
|
- lib/ddr/events/reindex_object_after_save.rb
|
340
340
|
- lib/ddr/events/update_event.rb
|
341
341
|
- lib/ddr/events/validation_event.rb
|
@@ -347,11 +347,7 @@ files:
|
|
347
347
|
- lib/ddr/managers/role_manager.rb
|
348
348
|
- lib/ddr/managers/workflow_manager.rb
|
349
349
|
- lib/ddr/metadata.rb
|
350
|
-
- lib/ddr/metadata/duke_terms.rb
|
351
350
|
- lib/ddr/metadata/premis_event.rb
|
352
|
-
- lib/ddr/metadata/rdf_vocabulary_parser.rb
|
353
|
-
- lib/ddr/metadata/sources/duketerms.rdf.xml
|
354
|
-
- lib/ddr/metadata/vocabulary.rb
|
355
351
|
- lib/ddr/models.rb
|
356
352
|
- lib/ddr/models/access_controllable.rb
|
357
353
|
- lib/ddr/models/base.rb
|
@@ -366,8 +362,8 @@ files:
|
|
366
362
|
- lib/ddr/models/has_attachments.rb
|
367
363
|
- lib/ddr/models/has_children.rb
|
368
364
|
- lib/ddr/models/has_content.rb
|
369
|
-
- lib/ddr/models/has_content_metadata.rb
|
370
365
|
- lib/ddr/models/has_properties.rb
|
366
|
+
- lib/ddr/models/has_struct_metadata.rb
|
371
367
|
- lib/ddr/models/has_thumbnail.rb
|
372
368
|
- lib/ddr/models/indexing.rb
|
373
369
|
- lib/ddr/models/licensable.rb
|
@@ -377,7 +373,11 @@ files:
|
|
377
373
|
- lib/ddr/utils.rb
|
378
374
|
- lib/ddr/vocab.rb
|
379
375
|
- lib/ddr/vocab/asset.rb
|
376
|
+
- lib/ddr/vocab/duke_terms.rb
|
377
|
+
- lib/ddr/vocab/rdf_vocabulary_parser.rb
|
380
378
|
- lib/ddr/vocab/roles.rb
|
379
|
+
- lib/ddr/vocab/sources/duketerms.rdf.xml
|
380
|
+
- lib/ddr/vocab/vocabulary.rb
|
381
381
|
- spec/controllers/application_controller_spec.rb
|
382
382
|
- spec/controllers/users/sessions_controller_spec.rb
|
383
383
|
- spec/dummy/README.rdoc
|
@@ -428,7 +428,6 @@ files:
|
|
428
428
|
- spec/factories/target_factories.rb
|
429
429
|
- spec/factories/test_model_factories.rb
|
430
430
|
- spec/factories/user_factories.rb
|
431
|
-
- spec/fixtures/contentMetadata.xml
|
432
431
|
- spec/fixtures/image1.tiff
|
433
432
|
- spec/fixtures/image2.tiff
|
434
433
|
- spec/fixtures/image3.tiff
|
@@ -446,27 +445,23 @@ files:
|
|
446
445
|
- spec/models/events_spec.rb
|
447
446
|
- spec/models/file_management_spec.rb
|
448
447
|
- spec/models/has_admin_metadata_spec.rb
|
448
|
+
- spec/models/has_struct_metadata_spec.rb
|
449
449
|
- spec/models/item_spec.rb
|
450
|
-
- spec/models/solr_document_spec.rb
|
451
450
|
- spec/models/superuser_spec.rb
|
452
451
|
- spec/models/target_spec.rb
|
453
452
|
- spec/models/user_spec.rb
|
454
453
|
- spec/routing/user_routing_spec.rb
|
455
454
|
- spec/services/group_service_spec.rb
|
456
|
-
- spec/services/remote_group_service_spec.rb
|
457
455
|
- spec/spec_helper.rb
|
458
456
|
- spec/support/shared_examples_for_access_controllables.rb
|
459
457
|
- spec/support/shared_examples_for_associations.rb
|
460
458
|
- spec/support/shared_examples_for_ddr_models.rb
|
461
459
|
- spec/support/shared_examples_for_describables.rb
|
462
|
-
- spec/support/shared_examples_for_event_loggables.rb
|
463
460
|
- spec/support/shared_examples_for_events.rb
|
464
461
|
- spec/support/shared_examples_for_governables.rb
|
465
462
|
- spec/support/shared_examples_for_has_content.rb
|
466
|
-
- spec/support/shared_examples_for_has_content_metadata.rb
|
467
463
|
- spec/support/shared_examples_for_has_properties.rb
|
468
464
|
- spec/support/shared_examples_for_indexing.rb
|
469
|
-
- spec/support/shared_examples_for_licensable.rb
|
470
465
|
homepage: https://github.com/duke-libraries/ddr-models
|
471
466
|
licenses:
|
472
467
|
- BSD-3-Clause
|
@@ -543,7 +538,6 @@ test_files:
|
|
543
538
|
- spec/factories/target_factories.rb
|
544
539
|
- spec/factories/test_model_factories.rb
|
545
540
|
- spec/factories/user_factories.rb
|
546
|
-
- spec/fixtures/contentMetadata.xml
|
547
541
|
- spec/fixtures/image1.tiff
|
548
542
|
- spec/fixtures/image2.tiff
|
549
543
|
- spec/fixtures/image3.tiff
|
@@ -561,24 +555,20 @@ test_files:
|
|
561
555
|
- spec/models/events_spec.rb
|
562
556
|
- spec/models/file_management_spec.rb
|
563
557
|
- spec/models/has_admin_metadata_spec.rb
|
558
|
+
- spec/models/has_struct_metadata_spec.rb
|
564
559
|
- spec/models/item_spec.rb
|
565
|
-
- spec/models/solr_document_spec.rb
|
566
560
|
- spec/models/superuser_spec.rb
|
567
561
|
- spec/models/target_spec.rb
|
568
562
|
- spec/models/user_spec.rb
|
569
563
|
- spec/routing/user_routing_spec.rb
|
570
564
|
- spec/services/group_service_spec.rb
|
571
|
-
- spec/services/remote_group_service_spec.rb
|
572
565
|
- spec/spec_helper.rb
|
573
566
|
- spec/support/shared_examples_for_access_controllables.rb
|
574
567
|
- spec/support/shared_examples_for_associations.rb
|
575
568
|
- spec/support/shared_examples_for_ddr_models.rb
|
576
569
|
- spec/support/shared_examples_for_describables.rb
|
577
|
-
- spec/support/shared_examples_for_event_loggables.rb
|
578
570
|
- spec/support/shared_examples_for_events.rb
|
579
571
|
- spec/support/shared_examples_for_governables.rb
|
580
572
|
- spec/support/shared_examples_for_has_content.rb
|
581
|
-
- spec/support/shared_examples_for_has_content_metadata.rb
|
582
573
|
- spec/support/shared_examples_for_has_properties.rb
|
583
574
|
- spec/support/shared_examples_for_indexing.rb
|
584
|
-
- spec/support/shared_examples_for_licensable.rb
|
@@ -1,147 +0,0 @@
|
|
1
|
-
module Ddr
|
2
|
-
module Datastreams
|
3
|
-
class ContentMetadataDatastream < ActiveFedora::Datastream
|
4
|
-
|
5
|
-
def parse
|
6
|
-
parsed = []
|
7
|
-
cm = Nokogiri::XML(self.content)
|
8
|
-
fileSec_nodes = cm.xpath("//xmlns:fileSec")
|
9
|
-
structMap_nodes = cm.xpath("//xmlns:structMap").sort{ |x,y| sort_nodes(x, y) }
|
10
|
-
structMap_nodes.each do |structMap_node|
|
11
|
-
structMap_hash = {}
|
12
|
-
div_nodes = structMap_node.xpath("xmlns:div").sort{ |x,y| sort_nodes(x,y) }
|
13
|
-
div_array = []
|
14
|
-
div_nodes.each do |div_node|
|
15
|
-
div_array << parse_div(fileSec_nodes, div_node)
|
16
|
-
end
|
17
|
-
structMap_hash["div"] = div_array
|
18
|
-
parsed << structMap_hash
|
19
|
-
end
|
20
|
-
return parsed
|
21
|
-
end
|
22
|
-
|
23
|
-
def to_solr(solr_doc=Hash.new)
|
24
|
-
solr_doc = super(solr_doc)
|
25
|
-
if self.content
|
26
|
-
solr_doc.merge!({Ddr::IndexFields::CONTENT_METADATA_PARSED => parse.to_json})
|
27
|
-
end
|
28
|
-
solr_doc
|
29
|
-
end
|
30
|
-
|
31
|
-
def first_pid
|
32
|
-
find_first_pid(parse.first)
|
33
|
-
end
|
34
|
-
|
35
|
-
private
|
36
|
-
|
37
|
-
def find_first_pid(structure)
|
38
|
-
case
|
39
|
-
when structure.has_key?("div")
|
40
|
-
find_first_pid(structure["div"].first)
|
41
|
-
when structure.has_key?("pids")
|
42
|
-
structure["pids"].first["pid"]
|
43
|
-
end
|
44
|
-
end
|
45
|
-
|
46
|
-
def walk_structure_to_pid(structure)
|
47
|
-
if structure.has_key("div")
|
48
|
-
walk_structure_div(structure["div"])
|
49
|
-
else
|
50
|
-
end
|
51
|
-
|
52
|
-
end
|
53
|
-
|
54
|
-
def parse_div(fileSec_nodes, div_node)
|
55
|
-
div_hash = {}
|
56
|
-
div_hash["label"] = div_node["LABEL"] unless div_node["LABEL"].nil?
|
57
|
-
div_hash["orderlabel"] = div_node["ORDERLABEL"] unless div_node["ORDERLABEL"].nil?
|
58
|
-
div_hash["type"] = div_node["TYPE"] unless div_node["TYPE"].nil?
|
59
|
-
div_subnodes = div_node.xpath("xmlns:div").sort{ |x,y| sort_nodes(x, y) }
|
60
|
-
if div_subnodes.empty?
|
61
|
-
fptr_nodes = div_node.xpath("xmlns:fptr")
|
62
|
-
fptr_array = []
|
63
|
-
fptr_nodes.each do |fptr_node|
|
64
|
-
fptr_hash = {}
|
65
|
-
if !fptr_node["FILEID"].nil?
|
66
|
-
pid = get_pid(fileSec_nodes, fptr_node["FILEID"])
|
67
|
-
file_use = get_use(fileSec_nodes, fptr_node["FILEID"])
|
68
|
-
fptr_hash["pid"] = pid unless pid.nil?
|
69
|
-
fptr_hash["use"] = file_use unless file_use.nil?
|
70
|
-
end
|
71
|
-
fptr_array << fptr_hash
|
72
|
-
end
|
73
|
-
div_hash["pids"] = fptr_array
|
74
|
-
else
|
75
|
-
div_array = []
|
76
|
-
div_subnodes.each do |div_subnode|
|
77
|
-
div_array << parse_div(fileSec_nodes, div_subnode)
|
78
|
-
end
|
79
|
-
div_hash["div"] = div_array
|
80
|
-
end
|
81
|
-
return div_hash
|
82
|
-
end
|
83
|
-
|
84
|
-
def get_use(fileSec_nodes, file_id)
|
85
|
-
file_nodes = fileSec_nodes.xpath("//xmlns:file[@ID='#{file_id}']")
|
86
|
-
file_node =
|
87
|
-
case file_nodes.size
|
88
|
-
when 1
|
89
|
-
file_nodes.first
|
90
|
-
when 0
|
91
|
-
raise "Matching file node not found"
|
92
|
-
else
|
93
|
-
raise "Multiple matching file nodes found"
|
94
|
-
end
|
95
|
-
return find_use(file_node)
|
96
|
-
end
|
97
|
-
|
98
|
-
def find_use(node)
|
99
|
-
file_use = nil
|
100
|
-
if node["USE"].nil?
|
101
|
-
file_use = find_use(node.parent) unless node.name.eql?("fileGrp")
|
102
|
-
else
|
103
|
-
file_use = node["USE"]
|
104
|
-
end
|
105
|
-
return file_use
|
106
|
-
end
|
107
|
-
|
108
|
-
def get_pid(fileSec_nodes, file_id)
|
109
|
-
file_nodes = fileSec_nodes.xpath("//xmlns:file[@ID='#{file_id}']")
|
110
|
-
file_node =
|
111
|
-
case file_nodes.size
|
112
|
-
when 1
|
113
|
-
file_nodes.first
|
114
|
-
when 0
|
115
|
-
raise "Matching file node not found"
|
116
|
-
else
|
117
|
-
raise "Multiple matching file nodes found"
|
118
|
-
end
|
119
|
-
fLocat_nodes = file_node.xpath("xmlns:FLocat")
|
120
|
-
fLocat_node =
|
121
|
-
case fLocat_nodes.size
|
122
|
-
when 1
|
123
|
-
fLocat_nodes.first
|
124
|
-
when 0
|
125
|
-
raise "FLocat node not found"
|
126
|
-
else
|
127
|
-
raise "Multiple FLocat nodes found"
|
128
|
-
end
|
129
|
-
href = fLocat_node["xlink:href"]
|
130
|
-
pid = href.split('/')[0]
|
131
|
-
end
|
132
|
-
|
133
|
-
def sort_nodes(node_1, node_2)
|
134
|
-
if node_1["ORDER"].nil? && node_2["ORDER"].nil?
|
135
|
-
return 0
|
136
|
-
elsif node_1["ORDER"].nil?
|
137
|
-
return 1
|
138
|
-
elsif node_2["ORDER"].nil?
|
139
|
-
return -1
|
140
|
-
else
|
141
|
-
return node_1["ORDER"].to_i <=> node_2["ORDER"].to_i
|
142
|
-
end
|
143
|
-
end
|
144
|
-
|
145
|
-
end
|
146
|
-
end
|
147
|
-
end
|